En décomposant le nom de ce système, nous pourrons remarquer qu'il s'agit d'un système de scripts, basés sur le Tag d'un objet. Ce système a été créé afin d'utiliser un script unique lorsqu'une interaction avec un item s'est effectuée.
Les événements d'origine seront quand même déclenchés, mais il leur sera indiqué un script à exécuter quand un item sera concerné. Comme par exemple, les événements "OnItemActivated" ou "OnEquipItem" du module.
Les événements à gérer seront donc :
- Lorsqu'un joueur obtient un item ("OnAcquireItem" du module)
- Lorsqu'un joueur équipe un item ("OnPlayerEquipItem" du module)
- Lorsqu'un joueur retire un item équipé ("OnPlayerUnequipItem" du module)
- Lors de l'activation d'un item par un joueur ("OnItemActivated" du module)
- Lorsqu'un joueur abandonne, ou perd un item ("OnUnAcquireItem" du module)
- Lors de l'activation automatique d'un item lors d'une attaque (script "x2_s2_onhitcast")
- Lorsqu'un sort a été lancé sur un item (voir
SpellHook)
Ce système est utilisé par les scripts du module créé par Bioware/Obsidian. Ces scripts portent un nom commençant par "x2_mod_def_". Par exemple, le script exécuté par l'événement "OnAcquireItem" porte le nom "x2_mod_def_aqu".
Dans chacun de ces scripts, est inscrite la suite de commandes suivante, que vous devrez utiliser si vous choisissez d'utiliser vos propres script lors des événements du module :
// Partie à mettre avant le "void main()" :
#include "x2_inc_switches"
// Partie à insérer dans le "void main()" :
// * Generic Item Script Execution Code
// * If MODULE_SWITCH_EXECUTE_TAGBASED_SCRIPTS is set to TRUE on the module,
// * it will execute a script that has the same name as the item's tag
// * inside this script you can manage scripts for all events by checking against
// * GetUserDefinedItemEventNumber(). See x2_it_example.nss
if(GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE)
{
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_******);
int nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
if(nRet == X2_EXECUTE_SCRIPT_END)
{
return;
}
}
Ces lignes de code signifient que le système TagBased sera utilisé, si une variable est inscrite sur le module. Il faudra simplement modifier le script de l'événement "OnModuleLoad", en rajoutant :
// à mettre avant la partie "void main()" :
#include "x2_inc_switches"
// à insérer dans la partie "void main()" :
SetModuleSwitch(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS, TRUE);
A partir de cet instant, vous pourrez créer un script dont le nom sera le Tag de l'item concerné, et dans lequel vous pourrez gérer les différents événements.
Il est également possible de définir un script pour chaque événement concernant un item. Il suffira d'insérer la ligne suivante dans la partie "void main()" du script précédent :
SetModuleSwitch(MODULE_SWITCH_ENABLE_SEPERATE_ITEM_SCRIPTS, TRUE);
Ces scripts utiliseront un suffixe bien précis, composé d'un tiret-bas, et de deux lettres représentant l'événement concerné :
- "OnAcquireItem" : <Tag de l'item>_aq
- "OnPlayerEquipItem" : <Tag de l'item>_eq
- "OnPlayerUnequipItem" : <Tag de l'item>_ue
- "OnItemActivated" : <Tag de l'item>_ac
- "OnUnAcquireItem" : <Tag de l'item>_ua
- Activation quand touché : <Tag de l'item>_hc
- Lors d'un sort lancé : <Tag de l'item>_ci
Enfin, il est possible de définir un préfixe pour organiser plus convenablement vos scripts d'item. Il suffira d'insérer la ligne suivante dans la partie "void main()" du script précédent :
// Je décide que tous mes noms de
// scripts d'item commenceront par "i_" :
SetUserDefinedItemEventPrefix("i_");
En combinant les deux options précédentes, je peux avoir un script d'item par événement dont le nom portera le préfixe de mon choix, et le suffixe défini par le système Bioware/Obsidian. Notez que le plus pratique revient à réunir tous les événements dans le même script d'item. C'est la méthode que je présenterai :
Le script d'item suivant montrera la manière dont les événements sont gérés au sein d'un même script :
#include "x2_inc_switches"
void main()
{
// Je prépare mes variables principales :
object oPC, oItem;
// La fonction suivante me permettra de définir
// quel événement a été déclenché.
int nEvent =GetUserDefinedItemEventNumber();
// S'il s'agit de l'événement "OnAcquireItem" :
if(nEvent == X2_ITEM_EVENT_ACQUIRE)
{
// Mon item sera désigné de la manière suivante :
oItem = GetModuleItemAcquired();
// Et le joueur ayant obtenu l'item :
oPC = GetModuleItemAcquiredBy();
// Il est possible de désigner, si applicable,
// l'ancien possesseur ou la pile d'un item empilable :
object oAncien = GetModuleItemAcquiredFrom();
int nQuantite = GetModuleItemAcquiredStackSize();
}
// S'il s'agit de l'événement "OnPlayerEquipItem" :
else if(nEvent == X2_ITEM_EVENT_EQUIP)
{
// Mon item sera désigné de la manière suivante :
oItem = GetPCItemLastEquipped();
// Et le joueur ayant équipé l'item :
oPC = GetPCItemLastEquippedBy();
}
// S'il s'agit de l'événement "OnPlayerUnequipItem" :
else if(nEvent == X2_ITEM_EVENT_UNEQUIP)
{
// Mon item sera désigné de la manière suivante :
oItem = GetPCItemLastUnequipped();
// Et le joueur ayant retiré l'item équipé :
oPC = GetPCItemLastUnequippedBy();
}
// S'il s'agit de l'événement "OnActivateItem" :
else if(nEvent == X2_ITEM_EVENT_ACTIVATE)
{
// Mon item sera désigné de la manière suivante :
oItem = GetItemActivated();
// Et le joueur ayant activé l'item :
oPC = GetItemActivator();
// Il est possible de désigner, si applicable,
// la localisation ou l'objet ciblé :
location lCible = GetItemActivatedTargetLocation();
object oCible = GetItemActivatedTarget();
}
// S'il s'agit de l'événement "OnUnAcquireItem" :
else if(nEvent == X2_ITEM_EVENT_UNACQUIRE)
{
// Mon item sera désigné de la manière suivante :
oItem = GetModuleItemLost();
// Et le joueur ayant perdu ou abandonné l'item :
oPC = GetModuleItemLostBy();
}
// S'il l'item s'est activé à la suite d'une attaque réussie ou subie :
// (cet "événement" est aussi géré pour les créatures non-joueur)
else if(nEvent == X2_ITEM_EVENT_ONHITCAST)
{
// Mon item sera désigné de la manière suivante :
oItem = GetSpellCastItem();
// Et le joueur/la créature possédant l'item :
oPC = OBJECT_SELF;
// Il est possible de désigner la cible du pouvoir
// (la victime ou l'attaquant)
object oCible = GetSpellTargetObject();
}
// Enfin, si l'item a été la cible d'un sort :
else if (nEvent == X2_ITEM_EVENT_SPELLCAST_AT)
{
// Mon item sera désigné de la manière suivante :
oItem = GetSpellTargetObject();
// Et le joueur possédant l'item :
oPC = OBJECT_SELF;
}
}
Voila voila.