[NWScript] TagBased, comment ça marche ?

Répondre
Partager Rechercher
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 :
Code PHP:

// 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 :
Code PHP:

// à mettre avant la partie "void main()" :
#include "x2_inc_switches"

// à insérer dans la partie "void main()" :
SetModuleSwitch(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTSTRUE); 
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 :
Code PHP:

SetModuleSwitch(MODULE_SWITCH_ENABLE_SEPERATE_ITEM_SCRIPTSTRUE); 

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 :
Code PHP:

// 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 :
Code PHP:

#include "x2_inc_switches"

void main()
{
    
// Je prépare mes variables principales :
    
object oPCoItem;

    
// 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.
__________________
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés