A propos du Enable Tagbase

Répondre
Partager Rechercher
A propos du
MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS

Est ce que lorsque les PJ activeront un objet dont le script ne correspond pas au nom de l'objet, celui-ci continuera de fonctionner ?

Je parle par exemple de mon script précédant qui est utilisé pour plusieurs objets, donc forcément avec des tags différents.
Ca fait un moment que je n'y ai pas touche, pour moi tu as 3 choix.
Soit a la suite des script par defaut x2_mod_def etc... tu rajoutes tes tests sur nom des items (a la fin ou devant ) ce qui est une solution qui marche soit tu crees un script par nom d'item est dedans tu rapels le script que tu veux ex :

tu as ton item it_gem_XXX. Tu crees le script it_gem_XXX qui fera que cela :
Code PHP:

void main()
{
      
ExecuteScript("it_gem"OBJECT_SELF);

et cela fonctionne... (par contre si tu veux recuperer un paramatre de retour je n'ai plus la fonction a appeler a la place du ExecuteScript... dsl suis au taf... mais c'est la fonction qui est appele dans les scripts par defaut x2_mod_def... dans ce cas la il faut pas oublier de renvoyer le retour aussi)

tu peux aussi mettre tout ton code de base en fonction dans un include et creer un script par item qui appel la fonction de ton include (ca marche aussi par contre je pense que ca prendra bien plus de place en terme d'espace disque )

La 2nd solution, cela t'evites d'aller retoucher a chaque fois les scripts par defaut quand tu rajoutes des items, par contre cela a tendance a multiplier les scripts... ensuite si jamais bio relivre les scripts par defaut pour une raison X ou Y t'es tranquil tu les a pas touché ca risque pas d'ecraser ton boulot
Citation :
Publié par Garrath
je n'ai plus la fonction a appeler a la place du ExecuteScript...
ExecuteScriptAndReturnInt, qui nécessite l'include "x2_inc_switches", ainsi que l'utilisation de la fonction SetExecutedScriptReturnValue, à mettre en fin du script lancé, pour déterminer la poursuite ou non du script ayant lancé l'appel.

Le script de base :
Code PHP:

#include "x2_inc_switches"

void main()
{
    
int nReturn ExecuteScriptAndReturnInt("nom_du_scrript",OBJECT_SELF)

    
// Si la commande de retour doit provoquer l'arrêt de ce script
    
if(nReturn==X2_EXECUTE_SCRIPT_END)
    {
        return;
    }
    else
    {
        .... ... .. .
    }

Et le script appelé :
Code PHP:

#include "x2_inc_switches"

void main()
{
    
// Ton script ici :
    
.... ... .. .

    
// puis la commande de retour :
    // - X2_EXECUTE_SCRIPT_END arrêtera le script de base.
    // - X2_EXECUTE_SCRIPT_CONTINUE lui permettra de continuer.
    
SetExecutedScriptReturnValue(X2_EXECUTE_SCRIPT_*);

Merci Deyonara...
Donc la en l'occurence cela ferait sur tout tes scripts de gem...
Code PHP:

#include "x2_inc_switches" 

void main()
{
    
int nReturn ExecuteScriptAndReturnInt("it_gem"OBJECT_SELF);
    
SetExecutedScriptReturnValue(nReturn); 

Tu lances deux fois ExecuteScriptAndReturnInt ? En gros, le script de base appelle-t-il un autre script qui appelle encore un autre script ?

Si c'est le cas, l'architecture de ExecuteScriptAndReturnInt ne le permet pas, me semble-t-il. À moins de lancer la commande sur un objet différent à chaque fois.
oui c'est l'idee...
Tu as un script pour l'objet it_gem_XXX qui est lance normalement et lui tout betement il appel le script it_gem. Pour avoir le meme retour et meme fonctionnement il faut bien sur renvoyer la meme chose.
Techniquement je vois pas pourquoi cela ne marcherait pas. Et pratiquement, il me semble bien l'avoir chez moi pour 2 objets qui ont le meme fonctionnement et il me semble pas avoir eu de pb (maintenant il faut que je verifie si je l'ai totalement fait comme cela ou si j'ai juste utilise un executescript mais bon...). Cela fait super longtemps que j'ai pas touche a mes objets donc ma memoire n'est pas super fraiche...
Lorsque ExecuteScriptAndReturnInt est appelé, une variable "int" se rajoute sur l'objet sur lequel est lancé la commande.

Je pars du principe que si l'objet reçoit la variable X2_EXECUTE_SCRIPT_END, tous les scripts lancés sur cet objet seront abrégés.

Je ne veux pas trop m'avancer non plus, mais disons un script appelant un autre script lui attribuera la commande *_END, et qui lui-même appelle un autre script lui attribuant la commande *_CONTINUE, le tout sur le même objet, va voir plusieurs commandes de retour, sur la même variable locale. Quelle commande sera donc retournée ? et/ou dans quel ordre ?


[Edit : Il se peut fortement que je fasse de la paranoïa, ce n'est pas à exclure non plus]
Ben c'est pas grave vu que là le but est de retourner la meme valeur .
En plus la valeur que tu retournes est utilise dans les script par defaut (les X2_mod_def...) et pas par nos scripts... donc a moins de la gerer dans tes scripts cela ne fait rien du tout. Ce n'est pas un evenement, ni une exception, qui est envoye en retour mais bien une valeur entiere
Oui, en fait j'ai tellement été submergée par le SetUserDefinedItemNumber que j'ai mis ces deux fonctions dans le même panier...

Donc on peut lancer un script qui appèle un autre script retournant une valeur, qui appèle lui-même un autre script retournant une autre valeur, etc etc etc...

[Mode parano : OFF]
En fait quand je modifie un script par défaut, je le sauvegarde sous un nom différent pour mon mod.

Mais pour ma question, j'ai réfléchit, et me suis rendu compte que plusieurs objets pouvaient avoir le meme tag quand ils sont pareil. Et sur le module il y aura fatalement plusieurs objets avec le meme tag.

La question qui me vient en fait, c'est si 2 objets différents sur la palette peuvent avoir le meme tag. Enfin, la question est surtout est-ce gênant ? Et dans ce cas ça résout mon problème, vu que le script prend en compte les différences selon l'objet précis.

Sinon ça sert a quoi d'avoir un retour ?
Citation :
Publié par Morethil
La question qui me vient en fait, c'est si 2 objets différents sur la palette peuvent avoir le meme tag. Enfin, la question est surtout est-ce gênant ?
Ben tout dépend,cela peut être un avantage... même tag pour plusieurs objets différents fait appel à un seul script... après tu peu jouer sur le nom de l'objet ou bien sur une variable stokké sur celui ci pour les différencier rapidement.

J'utilise ce principe pour ma p'tite biblio...
Toujours a propos du Enable Takebase.

J'ai compris le principe, et je vois ce qu'il faut faire dans le OnModuleLoad pour l'activer, mais que faut il changer dans le OnActivItem après ça ? D'autres choses a changer ? Je suis allé voir aussi le "x2_it_exemple" mais je comprend pas tout...

Je met ici mon script actuel :
Code PHP:

#include "x2_inc_switches"
void main()
{
object oUser GetItemActivator();
object oItem GetItemActivated();
string sTag GetTag (oItem);

if (
GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE)
     {
     
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACTIVATE);
     
int nRet ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
     if (
nRet == X2_EXECUTE_SCRIPT_END)
        {
           return;
        }
     }
 
//DMwands
ExecuteScript("dmfi_activate"oUser);

 
//Haume du jugement
 
if (sTag=="it_evilhelm")
    {
    
ExecuteScript ("it_evilhelm"oUser);
    }

//...
//ici une serie d'objet que j'ai definit comme le haume
//...


Deja je me pose la question a propos de la ligne du DM wand. J'ai le vague sentiment que a chaque fois qu'un objet est activé il execute le script "dmfi_activate"... *a peur*
En toutes logiques, si a l'activation de l'item, il ne passe passe dans la partie tag_based, il va effectivement lancer le script du dmfi. Mais seulement s'il ne passe pas dans la partie tag_based.S'il passe dans cette partie, il va tester le retour et si le retour est END il effectue un return, donc il sort de la fonction, donc il ne fera pas le truc du dmfi.

Mais par exemple dans ton code cette partie ne sert a rien :
Code PHP:

//Haume du jugement 
if (sTag=="it_evilhelm"
    { 
    
ExecuteScript ("it_evilhelm"oUser); 
    } 
car vu que le tag est le meme que le nom du fichier script il l'aura lancer dans la partie tag_based.
Oui, en ce moment, vu que le script est dans le OnActivateItem, il ne fera rien d'autre que de lancer le DMFI_wand

Cependant, le but est d'activer le baton avec un script qui lui est propre.

Explication :

Ton baton DMFI a un tag précis, que je nommerai ici "dmfi_wand". Le script qui lui correspondra se nommera donc "dmfi_wand". pas besoin de rajouter quoi que ce soit, les lignes du OnActivateItem feront le reste, et enverront au script l'évènement qui correspondra à l'activation.

Dans OnActivateItem, OnActivateItem, OnEquipItem, OnUnAcquireItem, et OnUnEquipItem :
Code PHP:

#include "x2_inc_switches"

void main()
{
    
// Pour OnAcquireItem :
    
object oItem GetModuleItemAcquired();
    
// Pour OnActivateItem :
    
object oItem GetItemActivated();
    
// Pour OnEquipItem :
    
object oItem GetPCItemLastEquiped();
    
// Pour OnUnAcquireItem :
    
object oItem GetModuleItemLost();
    
// Pour OnUnequipItem :
    
object oItem GetPCItemLastUnequiped();

    if(
GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS)==TRUE)
    {
        
// Pour OnAcquireItem :
        
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACQUIRE);
        
// Pour OnActivateItem :
        
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACTIVATE);
        
// Pour OnEquipItem :
        
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_EQUIP);
        
// Pour OnUnacquireItem :
        
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_UNACQUIRED);
        
// Pour OnUnequipItem :
        
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_UNEQUIP);

        
int nRet ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
        if(
nRet==X2_EXECUTE_SCRIPT_END)
        {
            return;
        }
    }

Comme le script "dmfi_wand" est prévu, grace à ce système, pour réagir différemment selon des évènements différents, je te montre ce à quoi ressemblerait un baton dm "dmfi_wand" dédié à un MD exclusivement :
Code PHP:

#include "x2_inc_switches"

void main()
{
    
// On déclare les variables, pour les items à évènements multiples
    
object oUser,oItem;

    
// On va détecter l'évènement d'item que rapporte la fonction ci-dessous
    
int nEvent GetUserDefinedItemEventNumber();

    
// Si l'évènement correspond à OnAcquireItem :
    
if(nEvent == X2_ITEM_EVENT_ACQUIRE)
    {
        
oItem GetModuleItemAcquired();
        
oUser GetModuleItemAcquiredBy();
        if(!
GetIsDM(oUser))
        {
            
SendMessageToPC(oUser,"Vous ne pouvez pas posséder cet objet.");
            
DestroyObject(oItem);
        }
        
// On déclare ici que le script est terminé, et que le reste du script du
        // OnAcquireItem ne doit pas se poursuivre.
        
SetExecutedScriptReturnValue(X2_EXECUTE_SCRIPT_END);
    }

    
// Si l'évènement correspond à OnActivateItem :
    
else if(nEvent == X2_ITEM_EVENT_ACTIVATE)
    {
        
// oItem n'est pas utilisé dans cet évènement, mais c'est pour montrer
        // que la déclaration correspond à celle utlisée dans OnActivateItem.
        
oItem GetItemActivated();
        
oUser GetItemActivator();
        
AssignCommand(oUser,ActionStartConversation(oUser,"dmfi_dialogue"

        
// On déclare ici que le script est terminé, et que le reste du script du
        // OnActivateItem ne doit pas se poursuivre.
        
SetExecutedScriptReturnValue(X2_EXECUTE_SCRIPT_END);
    }

Je mets ici ce que j'avais dit a notre equipe de dev sur le tag based script
Citation :
Hello

Bon pour eviter d'etre trop emmerder a chaque fois que l'on creera un objet, avec des scripts particuliers qui lui seront attaché, je vais essayer de mettre en place sur le module le Tag Based Scripting.

Pour l'avoir essayer je trouve cela hyper interressant, cela fait qu'au final on a un script unique par objet et que tous les evenements que l'on veut sont geres dedans. C'est clair, propre!

Donc je vais deja commence par creer les differents scripts en fonction des objets deja utilise dans le module puis quand je les aurais fini, je mettrais en place ce qu'il faut, alors je demande dans la mesure du possible aux personnes qui scriptent sur leur partie et qui creent des objets avec des scripts de suivre le modele de ce system.

Voici un lien en anglais de la façon dont ca marche tag based scriting
et sinon voici un squellette de programme
Code PHP:


//:://///////////////////////////////////////////// 
//:: Name 
//:: FileName 
//:: Copyright (c) 2003 Bioware Corp. 
//::////////////////////////////////////////////// 
/* 
    Note that this system only works if 
    the following scripts are set in your 
    module events 

    OnEquip      - x2_mod_def_equ 
    OnUnEquip    - x2_mod_def_unequ 
    OnAcquire    - x2_mod_def_aqu 
    OnUnAcqucire - x2_mod_def_unaqu 
    OnActivate   - x2_mod_def_act 

*/ 
//::////////////////////////////////////////////// 
//:: Created By: 
//:: Created On: 
//::////////////////////////////////////////////// 

// include obligatoire pour que le system marche 
#include "x2_inc_switches" 


void main() 

    
int nEvent GetUserDefinedItemEventNumber();    //Which event triggered this 
    
object oPC
    
object oItem
    
object oSpellOrigin
    
object oSpellTarget
    
location lSpellLocation
    
int iSpell
    
int nRand
    
int nResult X2_EXECUTE_SCRIPT_END

    switch (
nEvent
    { 
        case 
X2_ITEM_EVENT_ONHITCAST
         
// * Ce code est joué quand l'item à la porpriete Pouvoir Unique OnHitCastSpell 
         // * et qu'il touche une cible (pour une arme) ou qu'il est touché (pour une armure) 
         // * Note Cet evenement est joué même sur des creatures non PJ 


            
oItem  =  GetSpellCastItem();           // L'Item qui a produit le lancement de ce script 
            
oPC OBJECT_SELF;                      // Le PJ qui a lance cet evenement 
            
oSpellOrigin OBJECT_SELF ;            // Origine du sort 
            
oSpellTarget GetSpellTargetObject();  // La cible du sort 

         // Code à mettre ici 
            
break; 

        case 
X2_ITEM_EVENT_ACTIVATE
            
// * Ce code est joué quand la propriete Pouvoir Unique de l'objet est utilisée 
          // * Note : evenement lancé que par les PJ 

            
oPC   GetItemActivator();             // Le PJ qui a active l'item 
            
oItem GetItemActivated();             // L'item active (c'est celui dont le tag correspnd au nom du script) 
            
lSpellLocation GetItemActivatedTargetLocation();// La creature cible 


         // Code à mettre ici 

            
break; 

        case 
X2_ITEM_EVENT_EQUIP
          
// * Ce code est lancé lorsque qu'un PJ s'equipe de l'objet 
          // * Note : evenement lancé que par les PJ 

            
oPC GetPCItemLastEquippedBy();        // Le PJ qui s'equippe de l'item 
            
oItem GetPCItemLastEquipped();        // L'item équipé (c'est celui dont le tag correspnd au nom du script) 

         // Code à mettre ici 
          
            
break; 

        case 
X2_ITEM_EVENT_UNEQUIP
         
// * Ce code est lancé lorsque qu'un PJ se deséquipe de l'objet 
          // * Note : evenement lancé que par les PJ 

            
oPC    GetPCItemLastUnequippedBy();   // Le joueur qui se desequipe de l'item 
            
oItem  GetPCItemLastUnequipped();     // L'item 

         // Code à mettre ici 
          
         
break; 

        case 
X2_ITEM_EVENT_ACQUIRE
          
// * Ce code est joué quand l'Item est acquis par un PJ 
          // * Note : evenement lancé que par les PJ 

            
oPC GetModuleItemAcquiredBy();        // PJ qui acquiert l'objet 
            
oItem  GetModuleItemAcquired();       // L'objet acquis 

         // Code à mettre ici 
          
         
break; 

        case 
X2_ITEM_EVENT_UNACQUIRE
          
// * Ce code est joue quand l'item est perdu par un PJ 
          // * Note : evenement lancé que par les PJ 

            
oPC GetModuleItemLostBy();            // PJ qui a perdu l'objet 
            
oItem  GetModuleItemLost();           // objet perdu 

         // Code à mettre ici 
          
            
break; 

       case 
X2_ITEM_EVENT_SPELLCAST_AT
          
//* Ce code est joué quand un PJ ou un DM lance un sort à partir 
          //* du livre de sorts standard sur l'objet 

            
oPC OBJECT_SELF;                      // Le PJ qui a lance le sort 
            
oItem  GetSpellTargetObject();        // L'objet touche par le sort (c'est celui dont le tag correspnd au nom du script) 
            
iSpell GetSpellId();                  // Id du sort lancé 
                                                    // Voir la liste SPELL_* 


         // Code à mettre ici 

            //Changer la ligne suivante de X2_EXECUTE_SCRIPT_CONTINUE à 
            //X2_EXECUTE_SCRIPT_END si vous voulez eviter que le sort fasse des degats 
            //sur l'objet 
            
nResult X2_EXECUTE_SCRIPT_CONTINUE
            break; 
    } 
    
//Positionner la valeur de retout à 
    // * X2_EXECUTE_SCRIPT_CONTINUE - continue le script appelant apres l'execution de ce script 
    // * X2_EXECUTE_SCRIPT_END -    arrete le script appelant apres l'execution de ce script 
    
SetExecutedScriptReturnValue(nResult); 

Alors l'interet du switch, perso je trouve qu'en terme de prog c'est plus propre. Un des avantages c'est que tu es sur de pas avoir X fois le meme choix . Un des desavantage c'est que tu es oblige de declarer tes variables avant le switch (a moins que depuis le 1.64 cela ait changé )
A noter que tu n'est aboslument pas oblige de coder tous les evenements, tu codes que ceux qui t'interressent... Ceux que tu utilises pas tu vires le code ...
Merci pour vos réponse déja, je pense avoir compris le système. Est-ce que le Tagebase_Item est mis en marche par défaut ?

Juste une précision.

Dans mon script précédant (celui que je vous ais montré) j'avais une suite d'objets, dont les gemmes de charge. Au moment du test des gemmes, j'avais mis une activation par GetLeftString(sTag) avec un bout du tag de la gemme. Et cela marchait malgré la ligne du DMFI. Comment cela se fait-il ?

Est-ce que le fait de mettre
Code PHP:

ExecuteScript ("DMFI_activate")

if (
GetTag(oItem) = "MAchin")
{
ExecuteScript("machin")

Fait la meme chose que de mettre
Code PHP:

if (GetTag(oItem) = "MAchin")
{
ExecuteScript("machin")
}

ExecuteScript ("DMFI_activate"
?
Tout betement cela envoye le script du DMFI puis te rendait la main pour faire la suite. Dans le script du DMFI, il ne devait rien trouver a faire. Donc les 2 script que tu donnes doivent faire fonctionnellement la meme chose. Par contre tu perds du temps dans un script a tester plein de truc (dans le dmfi) pour rien.
Moi je ferais un truc du style :
Code PHP:

if (GetTag(oItem) = "MAchin"

    
ExecuteScript("machin");
    return; 


ExecuteScript ("DMFI_activate"); 
Une fois que tu as execute le script qui t'interressait, c'est pas la peine de continuer.
Attention cependant, tout le système Tagbased, est lancé en variable sur le module. Donc OBJECT_SELF sera l'équivalent de "GetModule()" dans ce cas précis, à moins de modifier le support des variables (l'objet sur lequel est lancé SetUserDefinedItemEventNumber()).
Répondre

Connectés sur ce fil

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