Utiliser les "Area Events".

Gardez à l’esprit que quand vous créez des scripts pour les évènements de la zone (Area events) (ou pour les évènements du modules (Module events)) « l’éxécutant » par défaut de n’importe quelle « commande action » (toutes les commandes commençants par le mot Action) est la zone (area) elle même.
Si vous référez à OBJECT_SELF, vous vous référez à la zone.. Si vous utilisez une commande commençant par Action comme ActionMoveToObjet sans utiliser AssignCommand pour envoyer cette commande à une créature, vous demandez à la zone de bouger (qui, évidemment, ne le peut pas). Gardez ça simplement à l’esprit quand vous codez, comme ça, vous pouvez faire la différence entre dire à la zone de faire quelque chose et dire à quelque chose de faire quelque chose (pas très précis hein ?).

Liste des évènements de la zone "Area Events"

Evènement: OnEnter, déclenché par: quelque chose (pas forcement un PC) qui est entré dans la zone, qu’est ce qui le déclenche? Utiliser GetEnteringObject() pour renvoyer l’objet dans la zone.

Un exemple : Disons que vous voulez fixer une variable "PC_Entered" qui était dans la zone à chaque fois qu’un PC entre dans celle ci (avec l’objet qui est égale à « PC »)…et cela envoie un événement UserDefined à une créature particulière dans la zone avec le tag "HUNTER" (Je pouvais avoir un événement OnUserDefined pour cette créature qui l’envoie chercher le PC). Vous devez pour cela mettre le script suivant dans le OnEnter de la zone :


void main()
{
object oEntering = GetEnteringObject();
object oMonster = GetObjectByTag("HUNTER");
// si l’ojet entrant est un PC
if (GetIsPC(oEntering))
{
// fixer la variable à la valeur du PC
SetLocalObject(OBJECT_SELF, "PC_Entered", oEntering);
// envoyer un UserDefinedEvent numéro 100 au monstre
SignalEvent(oMonster, EventUserDefined(100));
}
}

Evenèment: OnExit, déclenché par: quelqu’un qui a quitté la zone actuelle, qu’est ce qui le déclenche? Utiliser
GetExitingObject().

Un exemple: Reprennons le script ci dessus et fixons la variable "PC_Entered" à OBJECT_INVALID si le PC qui la zone. Vérifions aussi si l’objet sortant est le monstre ci dessus (chassant le PC, sans doute)…et si c’est le cas, demandons lui de revenir dans la grotte (où il y a un waypoint avec le tag "HUNTER_CAVE")


void main()
{
object oExiting = GetExitingObject();
object oMonster = GetObjectByTag("HUNTER");
object oCave = GetObjectByTag("HUNTER_CAVE");
// si l’objet sortant est un PC
if (GetIsPC(oExiting))
{
// fixer la variable de la zone à OBJECT_INVALID
SetLocalObject(OBJECT_SELF, "PC_Entered", OBJECT_INVALID);
}
// Si l’objet sortant est le monstre
if (oExiting == oMonster)
{
//demander lui d’arrêter ce qu’il est en train de faire.
AssignCommand(oMonster, ClearAllActions());
// demandez lui de retourner dans sa caverne.
AssignCommand(oMonster, ActionMoveToObject(oCave));
}
}


Evènement: OnHeartbeat, déclenché par: Rien n’est requit pour déclencher cet évènement... tout script qui est placé ici se déclenchera toutes les 6 secondes. Comme avec les évènements du module, faite attention en plaçant ici un script qui se lancera constamment.

Evènement: OnUserDefined, déclenché par: Il peut seulement être déclenché par quelqu’un utilisant la commande SendSignal pour envoyer un UserDefined event à l’objet « zone » (Habituellement via la commande GetArea ou GetObjectByTag en utilisant les tags de la zone).

__________________
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