Scripts et objet

Répondre
Partager Rechercher
Salut !
j'ai un petit problème : lorsque je cré un objet avec l'assistant, je n'ai pas la possibilité de lui associer des script (admeton que je cré une pierre au skin spécial, bah pas moyen d'avoir d'onglet script). Bug de chez moi, ou c'est comme ca pour tous ? Si ca vient pas de moi, comment faire pour pouvoir associer un script à un object ?
En fait tu ne peux pas associer de script à un objet d'inventaire.
Pour lui assigner un pouvoir spécial, il faut tout d'abord lui mettre la propriété "Lancer sort : pouvoir unique" ou "pouvoir unique sur soi uniquement", selon ce que tu souhaite (dans le 1er cas, le PJ pourra choisir sur quoi appliquer le pouvoir).

Le fait de déclencher ce pouvoir spécial aura la conséquence suivante : le script de l'évènement OnActivateItem du module va s'éxécuter, et c'est à l'intérieur de ce script (qui sera donc le même pour tous les objets avec un pouvoir spécial) que tu devra placer le script d'activation de ton objet.

Par exemple, ça pourrait te donner ça pour le script du OnActivateItem :

Code PHP:

void main()
{
   
object oItem GetModuleItemActivated();
   
string sTag GetTag(oItem);

   if(
sTag == "tag_objet1")
   {
        
// script de l'objet 1
   
}
   else if(
sTag == "tag_objet2")
   {
        
// script de l'objet 2
   
}

Il faut aller dans les propriétés du module et aller sur l'évènement OnActivateItem.

C'est ici qu'on lie un script à un objet.
Tu as plusieurs méthodes possible, je vais en citer deux.

La première possibilité consiste à mettre les scripts de l'objet directement dans le OnActivateItem, les uns à la suite des autres. Tu test l'objets par rapport à son TAG pour savoir si le script doit s'exécuter ou non.
Avantage : tu économises des scripts.
Inconvénient : au bout de plusieurs objets, tu arrives à un script boulimique.

Exemple :
Code PHP:

void main(){

// Déclaration des variables

    //Variables objets
    
object oUser GetItemActivator(); // Le personnage qui active l'objet
    
object oItem GetItemActivated(); // L'objet activé
    
object oTarget GetItemActivatedTarget(); // La cible de l'objet activé
    
location lPC GetLocation(oUser);
    
location lTarget GetItemActivatedTargetLocation();
    
string sItemTag GetTag(oItem); // Le TAG de l'objet activé
    
int nAlea// Valeure aléatoire

    // Variables joueurs
    
int nLevel GetHitDice(oUser); // Récupération du niveau de l'utilisateur

///////////////////////////////////////////////////////////////////////////////
// DEBUT Aura de Courage
if ( sItemTag == "PAL_AURACO" )
{
    if(
GetLevelByClass(CLASS_TYPE_PALADINoUser) < 2)
    {
        
SendMessageToPC(oUser,"Vous n'êtes pas assez hardi pour insuffler du courage à vos compagnons.");
        return;
    }
    
location lHere GetItemActivatedTargetLocation();
    
oTarget=GetFirstObjectInShape(SHAPE_SPHERE,3.0,GetLocation(oUser),FALSE,OBJECT_TYPE_CREATURE);
    
effect eVis EffectVisualEffect(VFX_IMP_GOOD_HELP);
    
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eVis,oUser);
    while ( 
GetIsObjectValid(oTarget) )
    {
        if ( (
GetIsFriend(oTarget,oUser)) && (oTarget != oUser ) )
        {
            
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowIncrease(SAVING_THROW_WILL,4,SAVING_THROW_TYPE_FEAR),oTarget,d6(2)*6.0);
            if ( 
GetIsPC(oTarget) )
            
SendMessageToPC(oTarget,"Vous n'êtes pas assez hardi pour insuffler du courage à vos compagnons.");
         }
    
oTarget=GetNextObjectInShape(SHAPE_SPHERE,3.0,GetLocation(oUser),FALSE,OBJECT_TYPE_CREATURE);
    }
}
// FIN Aura de Courage 
Une autre possibilité, tu crées un script par objet. Tu tests l'objet par rapport à son TAG et tu exécute le script correspondant.
Avantage : Le OnActivateItem n'est pas gargantuesque.
Inconvénient : au bout de plusieurs objets, tu arrives à un nombre de script important.

Tu appelles tes script comme ceci:
Code PHP:

void main(){

// Déclaration des variables

    //Variables objets
    
object oUser GetItemActivator(); // Le personnage qui active l'objet
    
object oItem GetItemActivated(); // L'objet activé
    
string sItemTag GetTag(oItem); // Le TAG de l'objet activé

///////////////////////////////////////////////////////////////////////////////
// POUVOIR DU PALADIN //
////////////////////////

// DEBUT Détection du MAL
if(sItemTag=="PAL_DETECTMAL" &&
    
GetLevelByClass(CLASS_TYPE_PALADIN,oUser)>0)
{
    
ExecuteScript("5_pal_detevil",oUser);
    return;
}
// FIN Détection du MAL 
Une variante plus optimisée: tu donnes à ton scripts le même nom que le resref de ton objet. Pourquoi le resref ? Parce qu'il peut arriver que le TAG contienne des caractères qui ne sont pas permis pour un nom de script, des majuscules par exemple.

Le script donne donc quelque chose comme:
Code PHP:

void main(){

// Déclaration des variables

    //Variables objets
    
object oItem GetItemActivated(); // L'objet activé
    
object oTarget GetItemActivatedTarget(); // La cible de l'objet activé
    
string sItemTag GetTag(oItem); // Le TAG de l'objet activé

///////////////////////////////////////////////////////////////////////////////
// SCRIPT GENERIQUE D'ACTIVATION D'OBJET //
///////////////////////////////////////////
string sTag GetResRef(oItem);
ExecuteScript(sTagoTarget); 

En espérant que ça te débroussaille un peu le terrain.
Répondre

Connectés sur ce fil

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