Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Conversation après summon d'un pnj

Par Le Hamster le 12/10/2002 à 23:01:20 (#2325283)

Bon, voilà, j'ai fait un trigger avec le script suivant sur le OnEnter.

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)

Un petit problème d'ordre :
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)

Voilà le script allègé de ce qui me semblent être des complications inutiles, et j'espère corrigé, n'oublie pas de modifier le blueprint comme l'a écrit Jedaï.


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)

Tu dois faire DelayCommand(AssignCommand()); et pas l'inverse, sinon ça ne fonctionnera pas. :)

Par LeProctophantasmiste le 13/10/2002 à 1:39:30 (#2325867)

Tyn, tu m'as perdu là, il me semble que justement
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)

La fonction DelayCommand déclanche un timer en mémoire indépendant de tout objet. En revanche, on ne peut pas assigner la fonction DelayCommand via AssignCommand, car elle n'est pas concidérée comme une action.

Par Jedaï le 13/10/2002 à 2:03:06 (#2325916)

Erreur : AssignCommand comme tout les biduletrucchouetteCommand() d'ailleurs accepte toutes les fonctions n'ayant pas de retour (void), ce que sont d'ailleurs les Actionbidule(). Sinon comment voudrait tu faire AssignCommand(oPC, SetFacing()) par exemple (SetFacing n'est pas une "action", notion qui n'as en fait qu'une existence relative, mieux vaut distinguer les types de retour). :doute:
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)

Je viens de tester ce script qui marche, et qui est probablement plus proche de ce que tu veux faire (à toi de voir Hamster).


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)

Bon ça me trottait dans la tête donc je viens de tester ces deux scripts sur des leviers:


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)

Etonnant :eek:

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)

Merci cher Procto... (Ah vraiment ce nom, je m'y fait pas). Juste une petite question.

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)

Le DestroyObject est exécuté sans ActionDoCommand ou DelayCommand. A moins que le DestroyObject ne soit pas "instantané", et je n'ai jamais remarqué quoi que ce soit de ce genre, à mon avis tu ne devrais pas avoir de problème.

Procto c'est un peu grossier je trouve. Je préfèrerais Monsieur Proco au moins.

JOL Archives 1.0.1
@ JOL / JeuxOnLine