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