Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Conversation après summon d'un pnj
Conversation après summon d'un pnj
Par Le Hamster le 12/10/2002 Ã 23:01:20 (#2325283)
Le pnj summoné (Donna) devrait entamer une conversation. Bien sûr, comme c'est bibi mézigue qui a pondu le script, elle veut pas.
C'est quoi que je fais mal ?
void main()
{
object oDonna = GetObjectByTag("Donna");
object oPC = GetFirstPC();
object oWaypoint=GetWaypointByTag("App_Donna2");
location lApparitionBestiole=GetLocation(oWaypoint);
effect eVisual=EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVisual, lApparitionBestiole);
CreateObject(OBJECT_TYPE_CREATURE, "Donna", lApparitionBestiole, FALSE);
DestroyObject(OBJECT_SELF);
ActionDoCommand(DelayCommand(4.0, AssignCommand(oDonna, ActionMoveToObject(oPC))));
AssignCommand(oPC, ClearAllActions());
ActionDoCommand(DelayCommand(5.0, AssignCommand(oDonna, ActionStartConversation(oPC, "conv_donna2"))));
}
C'est tordu, mais j'ai essayé de bidouiller les dernières lignes sans succès ? Peut-être est-il impossible, mais je ne crois pas que le PNJ entame une conversation avec le pj tout seul ?
Merci les aminches, gros bisous.
Par Jedaï le 13/10/2002 à 0:34:36 (#2325631)
tu essaie de récupérer ta Donna dans ta variable oDonna alors que tu ne l'as pas encore créée ! :monstre:
mets ton object oDonna = GetObjectByTag("Donna"); après ton CreateObject(OBJECT_TYPE_CREATURE, "Donna", lApparitionBestiole, FALSE);
, je pense que ça passera mieux !
Sinon, les recommandations d'usage : CreateObject() n'utilise pas le TAG mais bien le BLUEPRINT de l'objet à créer (qui doit donc être dans ta palette, custom en l'ocurrence). Etant donné qu'un blueprint est exclusivement en minuscule et que les scripts sont sensible à la casse (MAJ/min), "Donna" n'est surement pas valable...
Par LeProctophantasmiste le 13/10/2002 Ã 1:25:02 (#2325821)
J'ai supprimé les DelayCommand et autre ActionDoCommand, rien ne t'empêche d'en remettre (enfin presque rien j'y viens dans un instant) mais a priori seul DelayCommand a véritablement un intérêt ici.
Ce qu'il ne faut pas faire c'est détruire un objet avant que les fonctions qu'il doit appeler ne soient executées, donc ici tu as un pbm :
DestroyObject(OBJECT_SELF);
ActionDoCommand(DelayCommand(5.0, AssignCommand(oDonna, ActionStartConversation(oPC, "conv_donna2"))));
ceci ne devrait pas marcher non plus, Ã cause des premiers actionDoCommand et DelayCommand:
ActionDoCommand(DelayCommand(5.0, AssignCommand(oDonna, ActionStartConversation(oPC, "conv_donna2"))));
DestroyObject(OBJECT_SELF);
en revanche ceci devrait marcher:
AssignCommand(oDonna, DelayCommand(4.0, ActionStartConversation(oPC, "conv_donna2")));
DestroyObject(OBJECT_SELF);
Le DelayCommand est effectué sur Donna, pas sur le trigger que nous allons détruire immédiatement après, je crois bien que cela est nécessaire, et que cela marche (j'ai fais ces tests mais un mois au loin de NWN m'a un peu embrouillé les idées).
void main()
{
object oDonna;
object oPC = GetFirstPC();
object oWaypoint=GetWaypointByTag("App_Donna2");
location lApparitionBestiole=GetLocation(oWaypoint);
effect eVisual=EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVisual, lApparitionBestiole);
oDonna = CreateObject(OBJECT_TYPE_CREATURE, "blueprint_de_donna", lApparitionBestiole, FALSE);
AssignCommand(oPC, ClearAllActions());
AssignCommand(oDonna, DelayCommand(4.0, ActionStartConversation(oPC, "conv_donna2")));
DestroyObject(OBJECT_SELF);
}
Par Tyn' le 13/10/2002 Ã 1:30:55 (#2325842)
Par LeProctophantasmiste le 13/10/2002 Ã 1:39:30 (#2325867)
DelayCommand(AssignCommand())
ne marchera pas étant donné que le trigger est détruit et ne sera plus là pour appelé AssignCommand après le délai.
Bn je vais refaire ces tests.
Par Tyn' le 13/10/2002 Ã 1:48:23 (#2325882)
Par Jedaï le 13/10/2002 à 2:03:06 (#2325916)
Par ailleurs je cautionne par contre le fait que DelayCommand ne nécessite pas que l'objet qui l'as appelé existe encore quand la fonction se déclenche. On peut par contre avoir des problèmes quand, dans la commande retardée, on a des fonctions comme GetTag(OBJECT_SELF) ou GetCharacterLevel(OBJECT_SELF), qui essaye de s'appliquer à un objet qui n'existe plus...:rasta:
Par LeProctophantasmiste le 13/10/2002 Ã 2:11:27 (#2325932)
void main()
{
object oPC = GetEnteringObject();
if(GetIsPC(oPC))
{
object oDonna;
object oWaypoint=GetWaypointByTag("App_Donna2");
location lApparitionBestiole=GetLocation(oWaypoint);
effect eVisual=EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVisual, lApparitionBestiole);
oDonna = CreateObject(OBJECT_TYPE_CREATURE, "donna", lApparitionBestiole, FALSE);
AssignCommand(oPC, ClearAllActions());
AssignCommand(oDonna,DelayCommand(4.0, ActionStartConversation(oPC, "conv_donna2")));
DestroyObject(OBJECT_SELF);
}
}
Sinon, si j'intervertis le AssignCommand et le DelayCommand dans l'avant denière ligne j'ai bien l'impression que ça ne marche pas. Vous me direz il est grand temps que je m'éloigne de cet ordinateur.
Par LeProctophantasmiste le 13/10/2002 Ã 2:35:05 (#2325970)
void main()
{
object oPC =GetFirstPC();
DelayCommand(0.1,AssignCommand(oPC,SendMessageToPC(oPC,"Delay/assign-destroy")));
DestroyObject(OBJECT_SELF);
}
void main()
{
object oPC =GetFirstPC();
AssignCommand(oPC,DelayCommand(0.1,SendMessageToPC(oPC,"Assign/Delay-destroy")));
DestroyObject(OBJECT_SELF);
}
pour moi (version 1.24) il n'y a que le deuxième qui envoie le message.
Bonne nuit
Par Tyn' le 13/10/2002 Ã 3:06:00 (#2326027)
La gestion interne de NWN me surprendra toujours :rolleyes:
Désolé d'avoir aïguillé vers une fausse piste, je m'incline :merci:
Merci
Par Le Hamster le 13/10/2002 Ã 19:53:25 (#2329486)
Le script fonctionne parfaitement parce que quand je le teste je sais un peu grosso modo ce qui doit se passer et que je suis le seul PJ du jeu. Mais, que se passerai-t-il donc si par exemple un second PJ entrait dans le trigger AVANT sa destruction. On va avoir droit à un second summon quasi simultané avec le premier, non ?
Une fois Miriandel, m'avait fait un truc avec un espèce de compteur interne au trigger pour que l'action ne se passe qu'une fois, mais comme d'hab, j'ai du foiré un truc au point que plus rien ne se déclenchait. (Ne lui dites pas, il va encore s'énerver après moi ;) )
Bisous.
Par LeProctophantasmiste le 13/10/2002 Ã 23:44:44 (#2330769)
Procto c'est un peu grossier je trouve. Je préfèrerais Monsieur Proco au moins.
JOL Archives 1.0.1
@ JOL / JeuxOnLine