Comment faire pour qu’un NPC entame un dialogue tout
seul ?
OK, avant tout : avant de savoir EXACTEMENT ce que vous allez faire, ne touchez
PAS au script qui est normalement dans OnPerception ("nw_c2_default2").
Laissez le tranquille. Si quelqu’un vous demande de changer quelque chose
dans les scripts OnSpawn et OnUserDefined de votre NPC et que vous n’êtes
pas sur de ce que vous allez faire, ne le faite pas.
Comme mentionné plus haut, l’IA générique est programmée pour permettre
grâce à UserDefinedEvent d’utiliser les évènements sans modifier les script
par défaut.
Utiliser la méthode « OnPerceive » pour commencer une conversation.
1) Allez dans votre script OnSpawn. Sauvez le sous un nouveau nom. Puis, allez
jusqu’à la ligne où il y a marqué 'SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT);'
et activez la (enlevez le '//' double slashes au
début de la ligne). Sauvegardez ce nouveau script.
2) Dans le fichier dialogue du NPC, allez à la toute première ligne, la où commence
le dialogue avec le PC. Si vous voulez juste qu’il commence à parler avec
un PC donné, ajoutez le script suivant dans « Action Taken » :
void main() { SetLocalInt(GetPCSpeaker(), "Dlg_Init_" + GetTag(OBJECT_SELF), TRUE); }
|
Cela fixe la variable qui est utilisé dans le script que nous allons utiliser,
pour qu’il ne lance pas le dialogue plus d’une fois.
3) Maintenant, créez un nouveau script dans OnUserDefined event de votre NPC.
Vous pouvez y mettre le script suivant:
void main() { int nEvent = GetUserDefinedEventNumber(); if (nEvent == 1002) // OnPerceive event { object oPC = GetLastPerceived(); if(GetIsPC(oPC) && GetLocalInt(oPC, "Dlg_Init_" + GetTag(OBJECT_SELF)) == FALSE && !IsInConversation(OBJECT_SELF)) { ClearAllActions(); AssignCommand(oPC, ClearAllActions()); ActionMoveToObject(oPC); ActionStartConversation(oPC); } } }
|
UNE ERREUR POSSIBLE: Maintenant... une raison pourquoi ca ne
marche pas ? Si votre PC commence le jeu dans la ligne de perception du NPC, il
n’y aura pas d’événement OnUserDefined. L’événement a lieu uniquement
si le PC ‘était pas perçu et arrive à portée.
Utiliser la méthode des déclencheurs pour démarrer une conversation.
C’est celle que nous avons utilisé dans la campagne officielle. Elle vous
permet de déterminer à partir de quel point le NPC va courir vers le PC, et aussi
déterminer sur quelle distance le NPC va courir après le PC avant d’abandonner.
Pour l’utiliser, voici ce que vous devez faire :
1) Comment au paragraphe 2 ci dessus, dans le fichier du dialogue du NPC, allez
à la toute première ligne la où le dialogue commence avec le PC. Si vous voulez
seulement démarrer ce dialogue avec n’importe quel PC donné, ajoutez le
script du paragraphe 2 ci dessus dans « Action Taken » :
void main() { SetLocalInt(GetPCSpeaker(), "Dlg_Init_" + GetTag(OBJECT_SELF), TRUE); }
|
2) Allez dans votre toolset. Créez un waypoint à l’endroit ou vous voulez
que le NPC revienne. Mettez lui le tag "WP_RETURN_"
+ le tag du NPC (donc si le NPC s’appelle Fred, le tag sera "WP_RETURN_Fred".
Souvenez vous que le tag différencie les majuscules des minuscules !
3) Pendant ce temps, créez un nouveau déclencheur (trigger) générique et dessinez
un polygone autour du NPC. Quand le PC entrera dans cette zone, le NPC courra
jusqu’à lui pour lui parler. Si le NPC quitte cette zone, il arretera de
lui courir après et retournera au waypoint.
4) Allez dans l’onglet « Script » du déclencheur et ajoutez le script suivant
dans OnEnter :
// C’est le script OnEnter du trigger si vous voulez // que le NPC déclenche le dialogue. // remplacez bien "NPC_TALKER" par le script du NPC void main() { object oNPC = GetObjectByTag("NPC_TALKER"); object oPC = GetEnteringObject(); if(GetIsPC(oPC) && GetLocalInt(oPC,"Dlg_Init_" + GetTag(oNPC)) == FALSE && !IsInConversation(oNPC)) { AssignCommand(oPC,ClearAllActions()); AssignCommand(oNPC,ClearAllActions()); AssignCommand(oNPC,ActionMoveToObject(oPC)); AssignCommand(oNPC,ActionStartConversation(oPC)); } }
|
5) Maintenant, nous voulons éviter que le NPC poursuive le PC sans arrêt. Entrez
le script suivant dans l’emplacement OnExit du déclencheur (trigger):
// Cela va demander au NPC d’arrêter de poursuivre le PC // si il quitte la zone du déclencheir (trigger) // emplacez bien "NPC_TALKER" par le script du NPC. // Vous devez aussi avoir un waypoint avec le tag "WP_RETURN_" + tag du NPC. // Il doit être placé à l’endroit de départ du NPC. void main() { string sTag = "NPC_TALKER"; object oExit = GetExitingObject(); if(GetTag(oExit) == sTag) { AssignCommand(oExit,ClearAllActions()); AssignCommand(oExit,ActionMoveToObject(GetNearestObjectByTag("WP_RETURN_" + sTag))); } }
|
Cette méthode ne tient pas en compte si le PC est visible ou pas…traverser
la zone du déclencheur activera le NPC. Si vous voulez en tenir compte, ajoutez
la ligne suivante juste après « if(GetIsPC(oPC)
&& » dans le script OnEnter GetObjectSeen(oPC,
oNPC) &&
Mais, en multijoueur, le NPC essayera de parler avec chaque PC. Si vous voulez
qu'il courre vers seulement un PC, faites ce qui suit :
1) Dans le script du dialogue, remplacez 'GetPCSpeaker()'
par 'OBJECT_SELF'.
2) Dans le script OnUserDefined (pour la première méthode) ou le OnEnter (pour
la seconde), remplacez « oPC » dans la commande GetLocalInt
par « oNPC ».
__________________
Théranthil, Mage Elfe prêtre de Mystra Membre des GdE
Parti Elmotiste pour un parler jowilien: Ministre
supérieur de la corruption
"Les langues vont toujours bon train. Les pieds ont du mal à suivre."
(les bourses aussi NdT )
Mespert de la porte de Baldur