Animaux

Répondre
Partager Rechercher
Voila un petit post pour partager un script qui permet de donner des animaux aux PJ :
L'animal est "invoqué" par un objet, ses PV sont stockés dans l'objet lors de la désinvocation, et remis sur l'animal lors de la réinvocation.

Le on Death de la créature invoquée fait disparaitre l'objet si l'animal meurt.

Code PHP:

//::///////////////////////////////////////////////
//:: it_laisse
//:://////////////////////////////////////////////

#include "x2_inc_switches"

void main()
{
...

// * This code runs when the Unique Power property of the item is used
    // * Note that this event fires PCs only
    
else if (nEvent ==  X2_ITEM_EVENT_ACTIVATE)
    {
        
oPC   GetItemActivator();
        
oItem GetItemActivated();

        
//Récupère le Tag/ResRef de l'animal a crée sur l'objet. Tous les objets ont la 
        //meme variable de type : sting - "Animal" - "Tag"
        
string sAnimal GetLocalString(oItem,"Animal");
        
//Int pour voir l'etat d'activation de la laisse.
        
int nActif GetLocalInt(oItem,"Actif");
        
int nNth;
        
//Si activé pour la première fois
        
if(nActif == 0)
            {
            
//On verifie que le PJ n'a pas déja un autre animal invoqué...
            
for(nNth=1nNth<=GetMaxHenchmen(); nNth++)
                {
                
object oSuiv GetHenchman(oPC,nNth);
                
string sTag GetTag(oSuiv);
                
string sLeftTag GetStringLeft(sTag,8);
                
//...en verifiant si les tags des suivants commancent par "ct_dres_"
                
if(sLeftTag == "ct_dres_")
                    {
                    
SendMessageToPC(oPC,
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois");
                    return;
                    }
                }
        
//S'il n'en a pas, on crée l'animal a partir du ResRef récupéré plus haut.
            
location lLoc GetLocation(oPC);
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc);
            
AddHenchman(oPC,oMerc);
            
//Et on marque l'objet comme "en cours d'utilisation"
            
SetLocalInt(oItem,"Actif",2);
            }
        else
        
//Pour les activation suivantes, si l'objet n'est pas en cours d'utilisation
        
if(nActif == 1)
            {
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++)
                {
                
//On verifie qu'il n'y a pas déja un animal dressé dans les suivants
                
object oSuiv GetHenchman(oPC,nNth);
                
string sTag GetTag(oSuiv);
                
string sLeftTag GetStringLeft(sTag,8);
                if(
sLeftTag == "ct_dres_")
                    {
                    
SendMessageToPC(oPC,
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois");
                    return;
                    }
                }
        
//S'il n'y en as pas...
            
location lLoc GetLocation(oPC);
            
//On crée l'animal...
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc);
            
//On récupère ses PV max
            
int nMaxHP GetMaxHitPoints(oMerc);
            
//Et ses PV "actuels" (chargé sur l'objet avec un int)
            
int nHP GetLocalInt(oItem,"HP");
            
//Et on le remet a son niveau de PV "actuels"
            
effect eEff EffectDamage(nMaxHP-nHP);
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeEffoMerc);
            
AddHenchman(oPC,oMerc);
            
//On marque l'objet comme en cours d'activation
            
SetLocalInt(oItem,"Actif",2);
            }
        else
        
//Si l'objet est en cours d'activation
        
if(nActif == 2)
            {
            
//On cherche l'animal parmi les suivants, a partir de son Tag
            
for (nNth=1nNth<=GetMaxHenchmen(); nNth++)
                {
                
object oMerc GetHenchman(oPC,nNth);
                
//Si on le trouve
                
if(GetTag(oMerc) == sAnimal)
                    {
                    
//On marque ses PV actuels sur l'objet
                    
int nHP GetCurrentHitPoints(oMerc);
                    
SetLocalInt(oItem,"HP",nHP);
                    
//Et on le desinvoque
                    
DestroyObject(oMerc);
                    }
                }
            
SetLocalInt(oItem,"Actif",1);
            }
    }

...


Et le OnDeath

Code PHP:

//////////////////////////
// : od_ani_dress
/////////////////////////

void main()
{
object oPC GetMaster();
object oItem GetFirstItemInInventory(oPC);

while(
GetIsObjectValid(oItem))
    {
    if(
GetTag(oItem) == "it_laisse")
        {
        
string sMyTag GetTag(OBJECT_SELF);
        
string sLaisTag GetLocalString(oItem,"Animal");
        
int nActif GetLocalInt(oItem,"Actif");
        if(
nActif == && sMyTag == sLaisTag)
            {
            
DestroyObject(oItem);
            
SendMessageToPC(oPC,
            
"votre animal mort, la laisse ne vous sert plus a rien.");
            return;
            }
        }
    
oItem GetNextItemInInventory(oPC);
    }


Merci bien!
C'est un scripte qui finira surement sur mon module ca
Tout léger tout beau

Je ne l'ai pas lu en détaille.... mais si je possede deux pierres de "chat dressé" , et que j'invoque indiféramment l'un ou l'autre a la connexion, ton getocbjectbytag va t'il prendre le bon?
(c'est du point de détaille hein )
Je comprend pas trop ta question, enfin, surtout de quel endroit tu parles. Mais je pense que oui.
A la mort c'est la "laisse" active qui est détruite. Et on à vérifie qu'elle etait active avec le localInt mis dessus à l'invocation. Comme il ne peux y en avoir qu'une active, ben ce sera la bonne qui sera détruite.
La ou ça peux bugger, c'est si le PJ décide sournoisement de filer sa laisse a un copain le temps que son animal est dehors. Dans ce cas là, l'animal pourrais mourir, et la laisse resterais tout en permettant la réinvoc comme si de rien était.
L'autre petit truc, mais qui se resoud tout simplement, est que si l'invocateur est deco en cours d'invoc, la laisse restera avec l'int "actif" à 2, donc il faudra l'activer 1 fois pour le faire repasser à 1 d'abord (sans effet) puis une autre pour réinvoquer.
Citation :
Publié par Gimli Feln
Y'a-t-il des consigne particulière a respecter ?(ex:les tags des animaux sont ils spéciaux ?)
Ce script est a mettre dans le OnActivateItem du module n'est-ce pas ?
J'utilise le TagBased. Le script se nomme "it_laisse" comme TOUS les objets de type laisse. Qu'ils invoquent un chien ou un serpent. Par contre les ResRef sont différents si tu veux pouvoir les créer à partie de la palette.
D'où le LocalString sur les objets particulier :
string sAnimal = GetLocalString(oItem,"Animal");

Les animaux eux doivent avoir un ResRef et un Tag similaire.
Enfin, pour tous les animaux j'ai mis comme début de Tag (Et ResRef donc) "ct_dres_" qui signifie Créature dressée. par exemple ct_dres_loup ou ct_dres_chien, etc.
Citation :

Les animaux eux doivent avoir un ResRef et un Tag similaire.
Enfin, pour tous les animaux j'ai mis comme début de Tag (Et ResRef donc) "ct_dres_" qui signifie Créature dressée. par exemple ct_dres_loup ou ct_dres_chien, etc.
Ok, pour ça, j'avais compris juste après avoir posté ^^

Donc, si je comprend bien, en créant ce script, tu avais pour but qu'on le modifie a notre manière ?
si c'est le cas alors, j'ai créé le mien il permet d'invoquer un chien lorsque tu active le pouvoir spécial d'une laisse de chien, un chat lorsque tu active le pouvoir spécial d'une laisse de chat et un loup lorsque tu active le pouvoir spécial d'une laisse de loup ...

Code PHP:

/*----------------------------------------------------------------------------*\ 
|                 le script suivant sert a avoir un animal ...                 | 
|    attention, c'est un animal de compagnie pas de combat !     | 
\*----------------------------------------------------------------------------*/ 
 
void main ()
{    
if(
GetTag(oItem)== "PIERRE_CHIENT"
        { 
        
string sAnimal GetLocalString(oItem,"ct_dres_Chien"); 
        
int nActif GetLocalInt(oItem,"Actif"); 
        
int nNth
 
        if(
nActif == 0
            { 
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oSuiv GetHenchman(oPC,nNth); 
                
string sTag GetTag(oSuiv); 
                
string sLeftTag GetStringLeft(sTag,8); 
                if(
sLeftTag == "ct_dres_"
                    { 
                    
SendMessageToPC(oPC
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois"); 
                    return; 
                    } 
                } 
            
location lLoc GetLocation(oPC); 
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc); 
            
AddHenchman(oPC,oMerc); 
            
SetLocalInt(oItem,"Actif",2); 
            } 
        else 
        if(
nActif == 1
            { 
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oSuiv GetHenchman(oPC,nNth); 
                
string sTag GetTag(oSuiv); 
                
string sLeftTag GetStringLeft(sTag,8); 
                if(
sLeftTag == "ct_dres_"
                    { 
                    
SendMessageToPC(oPC
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois"); 
                    return; 
                    } 
                } 
            
location lLoc GetLocation(oPC); 
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc); 
            
int nMaxHP GetMaxHitPoints(oMerc); 
            
int nHP GetLocalInt(oItem,"HP"); 
            
effect eEff EffectDamage(nMaxHP-nHP); 
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeEffoMerc); 
            
AddHenchman(oPC,oMerc); 
            
SetLocalInt(oItem,"Actif",2); 
            } 
        else 
        if(
nActif == 2
            { 
            for (
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oMerc GetHenchman(oPC,nNth); 
                if(
GetTag(oMerc) == sAnimal
                    { 
                    
int nHP GetCurrentHitPoints(oMerc); 
                    
SetLocalInt(oItem,"HP",nHP); 
                    
DestroyObject(oMerc); 
                    } 
                } 
            
SetLocalInt(oItem,"Actif",1); 
            } 
        } 
 
    if(
GetTag(oItem)== "PIERRE_CHAT"
        { 
        
string sAnimal GetLocalString(oItem,"ct_dres_Chat"); 
        
int nActif GetLocalInt(oItem,"Actif"); 
        
int nNth
 
        if(
nActif == 0
            { 
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oSuiv GetHenchman(oPC,nNth); 
                
string sTag GetTag(oSuiv); 
                
string sLeftTag GetStringLeft(sTag,8); 
                if(
sLeftTag == "ct_dres_"
                    { 
                    
SendMessageToPC(oPC
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois"); 
                    return; 
                    } 
                } 
            
location lLoc GetLocation(oPC); 
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc); 
            
AddHenchman(oPC,oMerc); 
            
SetLocalInt(oItem,"Actif",2); 
            } 
        else 
        if(
nActif == 1
            { 
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oSuiv GetHenchman(oPC,nNth); 
                
string sTag GetTag(oSuiv); 
                
string sLeftTag GetStringLeft(sTag,8); 
                if(
sLeftTag == "ct_dres_"
                    { 
                    
SendMessageToPC(oPC
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois"); 
                    return; 
                    } 
                } 
            
location lLoc GetLocation(oPC); 
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc); 
            
int nMaxHP GetMaxHitPoints(oMerc); 
            
int nHP GetLocalInt(oItem,"HP"); 
            
effect eEff EffectDamage(nMaxHP-nHP); 
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeEffoMerc); 
            
AddHenchman(oPC,oMerc); 
            
SetLocalInt(oItem,"Actif",2); 
            } 
        else 
        if(
nActif == 2
            { 
            for (
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oMerc GetHenchman(oPC,nNth); 
                if(
GetTag(oMerc) == sAnimal
                    { 
                    
int nHP GetCurrentHitPoints(oMerc); 
                    
SetLocalInt(oItem,"HP",nHP); 
                    
DestroyObject(oMerc); 
                    } 
                } 
            
SetLocalInt(oItem,"Actif",1); 
            } 
        } 
 
 
    if(
GetTag(oItem)== "PIERRE_LOUP"
        { 
        
string sAnimal GetLocalString(oItem,"ct_dres_loup"); 
        
int nActif GetLocalInt(oItem,"Actif"); 
        
int nNth
 
        if(
nActif == 0
            { 
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oSuiv GetHenchman(oPC,nNth); 
                
string sTag GetTag(oSuiv); 
                
string sLeftTag GetStringLeft(sTag,8); 
                if(
sLeftTag == "ct_dres_"
                    { 
                    
SendMessageToPC(oPC
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois"); 
                    return; 
                    } 
                } 
            
location lLoc GetLocation(oPC); 
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc); 
            
AddHenchman(oPC,oMerc); 
            
SetLocalInt(oItem,"Actif",2); 
            } 
        else 
        if(
nActif == 1
            { 
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oSuiv GetHenchman(oPC,nNth); 
                
string sTag GetTag(oSuiv); 
                
string sLeftTag GetStringLeft(sTag,8); 
                if(
sLeftTag == "ct_dres_"
                    { 
                    
SendMessageToPC(oPC
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois"); 
                    return; 
                    } 
                } 
            
location lLoc GetLocation(oPC); 
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc); 
            
int nMaxHP GetMaxHitPoints(oMerc); 
            
int nHP GetLocalInt(oItem,"HP"); 
            
effect eEff EffectDamage(nMaxHP-nHP); 
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeEffoMerc); 
            
AddHenchman(oPC,oMerc); 
            
SetLocalInt(oItem,"Actif",2); 
            } 
        else 
        if(
nActif == 2
            { 
            for (
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oMerc GetHenchman(oPC,nNth); 
                if(
GetTag(oMerc) == sAnimal
                    { 
                    
int nHP GetCurrentHitPoints(oMerc); 
                    
SetLocalInt(oItem,"HP",nHP); 
                    
DestroyObject(oMerc); 
                    } 
                } 
            
SetLocalInt(oItem,"Actif",1); 
            } 

je l'ai mis dans le OnActivateItem de mon module ... mais je ne peux pas tester, mon jeu déconne ...
Sachant que j'ai créé les trois laisse et les trois animaux ...
Citation :
Publié par Gimli Feln
string sAnimal = GetLocalString(oItem,"ct_dres_Chien");
string sAnimal = GetLocalString(oItem,"ct_dres_Chat");
string sAnimal = GetLocalString(oItem,"ct_dres_loup");
Oui, j'ai regardé, c'est pour ca que j'ai décidé de commenter le script
L'erreur que tu fais c'est dans ce que j'ai quoté. Si tu cherche un string sur l'objet avec la fonction GetLocalString tu n'a pas besoin de changer le nom de la variable. Tu change que le string.

Pour mettre une variable sur un objet, tu vas dans l'onglet description je crois et tu clique sur variables

Là dans le tableau qui apparais, en bas, tu mets comme nom de variable Animal (ou ce que tu veux) comme type string et comme valeur le tag/resRef de l'animal qui sera invoqué par la laisse.

En gros il faut que tu choisisse entre :
string sAnimal = GetLocalString(oItem,"Animal"); qui te permet d'avoir 1 seul script pour toutes les laisses
ou
string sAnimal = "ct_dres_Chien"; qui fait que tu devras remettre le code pour chaque animal dans ton OnActivatesItem ou faire un script par animal en TagBase.
Ah !!! oki donc en gros, il faut que je rajoute un truc comme IT_LAISSE_ devant le tag de chaque laisse, que je leur mette les variables sur elles et que je mette ce script dans le OnActivateItem:

Code PHP:

/*----------------------------------------------------------------------------*\ 
|                 le script suivant sert a avoir un animal ...                 | 
|    attention, c'est un animal de compagnie pas de combat !     | 
\*----------------------------------------------------------------------------*/ 
 
void main ()
{    
 
 
if(
GetStringLeft(GetTag(oItem)),10)== "IT_LAISSE_"
 
 
    { 
        
string sAnimal GetLocalString(oItem,"Animal"); 
        
int nActif GetLocalInt(oItem,"Actif"); 
        
int nNth
 
        if(
nActif == 0
            { 
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oSuiv GetHenchman(oPC,nNth); 
                
string sTag GetTag(oSuiv); 
                
string sLeftTag GetStringLeft(sTag,8); 
                if(
sLeftTag == "ct_dres_"
                    { 
                    
SendMessageToPC(oPC
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois"); 
                    return; 
                    } 
                } 
            
location lLoc GetLocation(oPC); 
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc); 
            
AddHenchman(oPC,oMerc); 
            
SetLocalInt(oItem,"Actif",2); 
            } 
        else 
        if(
nActif == 1
            { 
            for(
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oSuiv GetHenchman(oPC,nNth); 
                
string sTag GetTag(oSuiv); 
                
string sLeftTag GetStringLeft(sTag,8); 
                if(
sLeftTag == "ct_dres_"
                    { 
                    
SendMessageToPC(oPC
                    
"Vous ne pouvez avoir qu'un animal dressé a la fois"); 
                    return; 
                    } 
                } 
            
location lLoc GetLocation(oPC); 
            
object oMerc CreateObject(OBJECT_TYPE_CREATUREsAnimallLoc); 
            
int nMaxHP GetMaxHitPoints(oMerc); 
            
int nHP GetLocalInt(oItem,"HP"); 
            
effect eEff EffectDamage(nMaxHP-nHP); 
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeEffoMerc); 
            
AddHenchman(oPC,oMerc); 
            
SetLocalInt(oItem,"Actif",2); 
            } 
        else 
        if(
nActif == 2
            { 
            for (
nNth=1nNth<=GetMaxHenchmen(); nNth++) 
                { 
                
object oMerc GetHenchman(oPC,nNth); 
                if(
GetTag(oMerc) == sAnimal
                    { 
                    
int nHP GetCurrentHitPoints(oMerc); 
                    
SetLocalInt(oItem,"HP",nHP); 
                    
DestroyObject(oMerc); 
                    } 
                } 
            
SetLocalInt(oItem,"Actif",1); 
            } 
        } 
Logiquement, comme ça ça devrait marcher non ?
ou et comment le placer.
bonjour je suis un nouveau membre et je ne comprend pas ce que vous dites pour activer les objets pour familier.
je vois que dans activat item du module il faut placé le scripte mais avec quel langage de base comme (2x_mod_def_act).
lequel choisir pour faire le scripte.
merci a vous
Répondre

Connectés sur ce fil

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