Userdefined Event est votre ami.

Sérieusement. Il n’y a pas du tout de blague la dedans. Il y aura naturellement des utilisateurs qui préfèreront aller plus en profondeur et personnaliser différents scripts pour remplacer l’IA générique…Certain voudront aller plus vite que ça monter leur propre version des fichier de l’IA qui sont inclus. C’est génial, et il n’y a rien de faux à faire ça.

Une des meilleur chose est : vous n’êtes pas obligé de.98% des scripts des créatures de la campagne officielle ont été fait en utilisant UserDefinedEvent. Je me suis assis avec Preston (un de nos scripteurs et un de nos principaux gars derrière l’IA) et j’ai posé une rapide série de choses que je voulais scripter…à propos de ce que chacun était capable de faire en utilisant UserDefinedEvent. Et c’est facile à utiliser.

Faisons une pause une seconde ici et discutons de ce que sont les événements. Fondamentalement une créature a des scripts numérotés (des ensembles d’instructions)…et chaque script est lié à des évènements. Quand un événement a lieu, il dit à la créature de lancer le bon script. Pas d’événement = le script ne marche pas.

Il y a un nombre d’évènements qui sont très souvent mentionnés ici. L’évènement « OnHeartbeat » a lieu toutes les 6 secondes…donc le script lié à cet événement se lance aussi souvent. L’évènement « OnPerceived » a lieu à chaque fois que le NPC perçoit quelque chose…le script correspondant se lance.
Ces scripts peuvent aussi entraîner d’autre événement qui lanceront eux même d’autres scripts…et c’est ici que l’on place le UserDefinedEvent.

Fondamentalement , UserDefinedEvent permet d’accéder aux évènements normaux qu’une créature utilise (OnPerception,OnDeath,etc.) sans déranger l’IA normale ou modifier les scripts déjà existant.


Utiliser UserDefinedEvent
Il y a un script sur chaque créature qui a déjà été souvent mentionné, et c’est un de ceux que vous devriez bien connaître. C’est le script OnSpawn. C’est un événement qui marche seulement quand la créature apparaît la première fois…imaginez que c’est un script d’initialisation.
Le script OnSpawn générique a une série de commandes qui sont inactivées (précédées par « // »)…mais en réalité, sans que l’utilisateur change quelque chose, tout ce long script n’exécute en fait que trois commandes : il dit à la créature de suivre les waypoint qui se réfère spécifiquement à son tag, lui donne son comportement (il répondra aux attaque des autres NPC) et génère un faible montant de trésor générique dans l’inventaire (de l’or… )

Il est écrit pour permettre à l’utilisateur de définir les condition pour accéder à l’IA générique comme il le veut. Tout ce qu’il y a à faire est de repérer le « state flag » que vous voulez utiliser et d’enlever le « // » au début de la commande pour l’activer Puis sauvez le script OnSpawn sous un nom différent et utilisez le à la place de script normal…voilà, le comportement générique a été modifié.

Les « state flags » auquels nous avons besoin de faire attention sont ceux la :


SetSpawnInCondition (NW_FLAG_PERCIEVE_EVENT);
//OPTIONAL BEHAVIOR - Fire User Defined Event 1002
SetSpawnInCondition (NW_FLAG_ATTACK_EVENT);
//OPTIONAL BEHAVIOR - Fire User Defined Event 1005
SetSpawnInCondition (NW_FLAG_DAMAGED_EVENT);
//OPTIONAL BEHAVIOR - Fire User Defined Event 1006
SetSpawnInCondition (NW_FLAG_DISTURBED_EVENT);
//OPTIONAL BEHAVIOR - Fire User Defined Event 1008
SetSpawnInCondition (NW_FLAG_END_COMBAT_ROUND_EVENT);
//OPTIONAL BEHAVIOR - Fire User Defined Event 1003
SetSpawnInCondition (NW_FLAG_ON_DIALOGUE_EVENT);
//OPTIONAL BEHAVIOR - Fire User Defined Event 1004
SetSpawnInCondition (NW_FLAG_DEATH_EVENT);
//OPTIONAL BEHAVIOR - Fire User Defined Event 1007


Et après?
Okay... Vous avez activé les « flags » que vous voulez scriptez et re sauvé la script OnSpawn. Ca vous a pris 2 minutes. Maintenant, comment l’utiliser ?

Chaque créature a une section OnUserDefined dans laquelle vous pouvez mettre un script. Pour toutes les créatures que vous avez faites, elle est complètement vide…c’est la ou nous allons faire notre script. Tout script que vous mettez ici sera lancé à chaque fois qu’un événement que vous avez « activé » (en enlevant le « // » dans le OnSpawn) se produira. Donc, si vous avez activé 'SetSpawnInCondition(NW_FLAG_DISTURBED_EVENT)', alors a chaque fois que l’inventaire de la créature est « perturbé » (quand quelqu’un vole un objet) le script OnUserDefined sera lancé.

Le script OnUserDefined basique ressemblerait à ça :


void main()
{

int nUser = GetUserDefinedEventNumber();
if (nUser == le nombre dans le OnSpawn, de 1001 à 1007)
{
(faire qqch)
}
}


Admettons que je veuille qu’une créature fasse signe au premier PC qu’elle voit. Je vais dans OnSpawn, « j’active » 'SetSpawnInCondition (NW_FLAG_PERCIEVE_EVENT)' et je le re sauvegarde comme un nouveau script.
Puis je crée un script dans OnUserDefined:


// Ce script fera que le NPC salut le PC en l’apercevant
// souvenez vous que si le PC commence le module dans la zone de perception du // NPC, le script ne se lancera pas (la perception n’a pas changée)

void main()
{

int nUser = GetUserDefinedEventNumber();
if (nUser == 1002) // OnPerception event
{
object oCreature = GetLastPerceived();
int nWave = GetLocalInt(OBJECT_SELF, "Wave_Once");
//vérifie que ce soit bien un PC vu la première fois
if (GetLastPerceptionSeen() && GetIsPC(oCreature) && (nWave == 0))
{

// salut qu’une fois
SetLocalInt(OBJECT_SELF, "Wave_Once", 1);
// fixe un temps pour que le NPC puisse re saluer 15 sec plus tard
DelayCommand(15.0, SetLocalInt(OBJECT_SELF, "Wave_Once", 0));
// se tourne face au PC
ActionDoCommand(SetFacingPoint(GetPosition(oCreature)));
// salut
ActionPlayAnimation(ANIMATION_FIREFORGET_GREETING);
SpeakString(
"Hello!");
}
}
}


Et c’est tout. Je peux ajouter d’autres condition comme une distance minimale, voir si le PC est en face de moi…ou lui donner un comportement aussi complexe que je le souhaite…et je n’ai pas à me préoccuper du script qui est déjà dans la case OnPerceive.

__________________
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