Besoin de bons Scripteurs !

Répondre
Partager Rechercher
Voilà, j'y connais rien en scripte et j'aurais besoin de quelque chose... je sais pas si ça existe (j'ai rien trouvé) donc je demande ici, si vous pouvez m'aider...


Voilà, j'aimerais un script que l'on placerait comme capacité spéciale sur une armure et qui serait utilisable que sur une autre armure du même type.

Ce script aurait pour effet de récupérer les bonus de l'armure visée (+X en CA, immunités... etc) et de les passer sur l'armure en cours (supprimant les anciens bonus). Puis qu'a la fin, quand les bonus ont été passés, que ça détruise l'armure sur laquelle j'aurais récupéré les bonus.

Donc voilà, ça serait un script qui modifierait carrément les propriétés de l'armure !

exemple :

j'ai une armure de cuir simple (sans bonus). j'utilise sa capacité spéciale sur une armure de cuir +1. Mon armure de cuir simple devient alors une armure de cuir +1 mais ne change pas de look. Après ça, l'armure de cuire +1 qui avait été prit pour cible est détruite.


Voilà, est-ce faisable ? est-ce que ça existe déjà ? Quelqu'un d'assez courageux et sympa pour me le faire ?

Merci pour tout ce que vous pourrez faire pour m'aider.
Ca devrait être faisable en ce qui concerne le passage des propriétés magiques de l'item, bien qu'un peu complexe à mettre en place efficacement. Par contre à part une recherche 2da (qui n'est pas si gourmande qu'on le dit quand on ne l'utilise pas dans une boucle), il n'y a pas grand chose qui permette de retrouver le même type d'armure. Sauf si tu veux que le rapport soit armure Vêtements/Légère/Intermédiaire/Lourde.

Pour copier une propriété d'item je suppose que ça devrait être :
Code PHP:

int GetItemArmorACBase(object oItem// Permet de retrouver la CA de base de l'armure.
{
    if(!
GetIsObjectValid(oItem)||GetBaseItemType(oItem)!=BASE_ITEM_ARMOR)
        return -
1;

    
int nTorso GetItemAppearance(oItem,ITEM_APPR_TYPE_ARMOR_MODEL,ITEM_APPR_ARMOR_MODEL_TORSO);
    
string sACBase Get2DAString("des_crft_appear","BaseAC",nTorso);
    return 
StringToInt(sACBase);
}

void main()
{
    
object oSource GetItemActivated();
    
object oTarget GetItemActivatedTarget();
    
int nDuration;
    if(
GetItemArmorACBase(oSource)==GetItemArmorACBase(oTarget)) // Si la CA des deux armures coîncident, la copie commence.
    
{
        
itemproperty ip GetFirstItemProperty(oTarget);
        while(
GetIsPropertyValid(ip))
        {
            
nDuration GetItemPropertyDurationType(ip)
            if(
nDuration==DURATION_TYPE_PERMANENT// on ne copie que les effets permanents.
            
{
                
AddItemProperty(nDuration,ip,oSource);
            }
            
ip GetNextItemProperty(oTarget);
        }
        
DestroyObject(oTarget); // on détruit l'armure ciblée.
    
}

Je ne suis absolument pas sûre du résultat copier-coller un pouvoir de cette manière, mais dans le cas où ça ne marche pas, il faudra faire une table de tous les ItemProperty* et galérer un bon moment. Par contre si ça marche, tant mieux. ^^
merci beaucoup, je vais tester ça, mais j'arrive pas a trouver où faut que je mette le script. J'ai une armure de créé et j'ai fait copier éditer et je vois vraiment pas où je pourrais le mettre.

Y'a pas de propriété bonus configurable ?

Si quelqu'un peut me renseigner ce serait sympa. Merci

EDIT : y'a bien quelque chose pour activer l'objet mais j'ai toujours pas trouvé où rentrer le script :/
Il faut le rajouter dans le OnItemActivated, dans les propriétés du module. Si tu comptes le rajouter à un script déjà existant, il faut que tu enlèves la partie "void main() { ... ... }" de ce script pour pouvoir l'insérer sans problèmes, à la suite du script de base. Pour la fonction GetItemArmorACBase(), il faut que tu la déclares avant le "void main()", pour qu'elle soit validée. J'ai retouché le script et enlevé les petites erreurs, mais rien ne dit que ça marche non plus.
lorsque je compile, il me met une erreur au niveau du :

Code PHP:

 while(GetIsPropertyValid(ip)) 

Il me dit : No Right Bracket on Expression.

Ensuite, si j'ai bien compris, je le met dans le onitemactivated du module (je vire celui par défaut ?). Et comment je fais après pour activer l'armure ? comment il va savoir que c'est ce script qu'il faut prendre ?


EDIT : j'ai corrigé le probleme j'ai mis :


Code PHP:

 while(GetIsItemPropertyValid(ip)) 

EDIT 2 :

Autre erreur ligne 22 :

Code PHP:

if(nDuration==DURATION_TYPE_PERMANENT
Il dit : No semicolon after expression
Tu lui mets un tag d'armure spécial, pour qu'il soit reconnu par le script, et tu rajoute à l'objet un sort --> pouvoir unique. À toi de voir si tu veux qu'une seule armure "vole" les pouvoirs magiques une seule fois, plusieurs, où à volonté, en réglant les paramètres du pouvoir unique.

Il vaut mieux rajouter les lignes de codes dans le script du OnItemActivated, à la fin du script déjà en place :
Code PHP:

int GetItemArmorACBase(object oItem// Début du script

    if(!
GetIsObjectValid(oItem)||GetBaseItemType(oItem)!=BASE_ITEM_ARMOR
        return -
1

    
int nTorso GetItemAppearance(oItem,ITEM_APPR_TYPE_ARMOR_MODEL,ITEM_APPR_ARMOR_MODEL_TORSO); 
    
string sACBase Get2DAString("des_crft_appear","BaseAC",nTorso); 
    return 
StringToInt(sACBase); 


void main() 

    
object oItem GetItemActivated();
    
// Script de base...

    // à rajouter :
    
if(GetTag(oItem)=="Tag_De_L'Armure")
    {
        
object oTarget GetItemActivatedTarget();
        if(
GetItemArmorACBase(oSource)==GetItemArmorACBase(oTarget)) // Si la CA des deux armures coîncident, la copie commence.
        
{
            
int nDuration;
            
itemproperty ip GetFirstItemProperty(oTarget);
            while(
GetIsItemPropertyValid(ip))
            {
                
nDuration GetItemPropertyDurationType(ip);
                if(
nDuration==DURATION_TYPE_PERMANENT// on ne copie que les effets permanents.
                
{
                    
AddItemProperty(nDuration,ip,oSource);
                }
                
ip GetNextItemProperty(oTarget);
            }
            
DestroyObject(oTarget); // on détruit l'armure ciblée.
        
}
    }
}
// fin du script 
La deuxième erreur vient du fait que j'ai oublié le ";" à la fin de la ligne "nDuration = GetItemPropertyDurationType(ip)"
y'a encore un truc qu'il me dit qui va pas :
ligne 20 :

Code PHP:

object oTarget GetItemActivatedTarget();
if(
GetItemArmorACBase(oSource)==GetItemArmorACBase(oTarget)) 
il me dit : Variable defined without type.

EDIT :

Corrigé :

j'ai rajouté la ligne

Code PHP:

object oSource GetItemActivated(); 

c'est compilé, y'a plus qu'a tester, je te tiens au courant !
Rapport :

Alors, ça marche bien, il fait bien ce que je veux mais y'a quelques trucs qu'il faudrait ajouter :

1-Qu'il ne puisse pas absorber les propriétés des objets non identifiés.
2-Que les anciennes propriétés de l'armure soient supprimés avant d'en rajouter d'autres.

Exemple :

J'ai utilisé la capacité de mon armure de cuir pour absorber le pouvoir "+1 CA"
J'ai trouvé une autre armure avec pouvoir "+2 CA"
J'utilise mon armure absorbe-pouvoir sur celle ci et il faut que le script SUPPRIME le bonus +1CA avant de mettre le bonus +2CA dessus.

Faisable ?

Encore merci pour tout ce que tu fais !
Bon, j'ai rajouté le test pour ce qui est de savoir si c'est identifié ou non, mais pour la suppression des anciens bonus, je sais pas.

voilà ce que j'ai pour le moment (avec le scripte de base)
Code PHP:

 #include "x2_inc_switches"

 
int GetItemArmorACBase(object oItem// Début du script
{
    if(!
GetIsObjectValid(oItem)||GetBaseItemType(oItem)!=BASE_ITEM_ARMOR)
            return -
1;

    
int nTorso GetItemAppearance(oItem,ITEM_APPR_TYPE_ARMOR_MODEL,ITEM_APPR_ARMOR_MODEL_TORSO);
    
string sACBase Get2DAString("des_crft_appear","BaseAC",nTorso);
    return 
StringToInt(sACBase);
}

void main()
{
    
//script de base.
    
object oItem GetItemActivated();

    
// * 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_ACTIVATE);
        
int nRet =   ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
        if (
nRet == X2_EXECUTE_SCRIPT_END)
        {
            return;
        }

    }


    
// Rajoute :
    
if(GetTag(oItem)=="Tag_de_l'Item")
    {
        
object oSource GetItemActivated();
        
object oTarget GetItemActivatedTarget();
        if (
GetIdentified(oTarget)==TRUE//Si l'objet est identifié
        
{
            if(
GetItemArmorACBase(oSource)==GetItemArmorACBase(oTarget)) // Si la CA des deux armures coîncident, la copie commence.
            
{
                
int nDuration;
                
itemproperty ip GetFirstItemProperty(oTarget);
                while(
GetIsItemPropertyValid(ip))
                {
                    
nDuration GetItemPropertyDurationType(ip);
                    if(
nDuration==DURATION_TYPE_PERMANENT// on ne copie que les effets permanents.
                    
{
                        
AddItemProperty(nDuration,ip,oSource);
                    }
                    
ip GetNextItemProperty(oTarget);
                }
                
DestroyObject(oTarget); // on détruit l'armure ciblée.
            
}
        }
    }
}
// fin du script 
Je sais pas comment faire pour supprimer les bonus qu'il y a déjà sur l'objet avant de placer les nouveaux...
Il suffit de rajouter une boucle qui supprime les pouvoirs spéciaux déjà résidents ici :
Code PHP:

// Début du script
        
if(GetIdentified(oTarget)==TRUE)
        { 
            if(
GetItemArmorACBase(oSource)==GetItemArmorACBase(oTarget))
            { 
                
// Suppression des précédents effets
                
itemproperty îp GetFirstItemProperty(oItem);
                while(
GetIsItemPropertyValid(ip)
                {
                    
RemoveItemProperty(oItem,ip);
                    
ip GetNextItemProperty(oItem);
                }
                
// Fin de la suppression des précédents effets

                
int nDuration
                
ip GetFirstItemProperty(oTarget);
                while(
GetIsItemPropertyValid(ip)) 
                { 
                    
nDuration GetItemPropertyDurationType(ip); 
                    if(
nDuration==DURATION_TYPE_PERMANENT)
                    { 
                        
AddItemProperty(nDuration,ip,oSource); 
                    } 
                    
ip GetNextItemProperty(oTarget); 
                } 
                
DestroyObject(oTarget);
            } 
        }
    }
}
// Fin du script 
Tu peux aussi changer le Tag et en mettre un à ta convenance, comme "VampiricArmor". Toutefois, il faudra aussi changer le Tag de l'objet en conséquence.

Egalement, tu as vu qu'il y a deux conditions à remplir avant que l'objet copie et détruise, soit l'état d'identification, et la similitude de la CA de base. Tu peux les rassembler en une condition en écrivant "if(GetIdentified(oTarget)==TRUE && GetArmorACBase(oSource)==GetArmorACBase(oTarget))". Attention toutefois à bien supprimer les accolades correspondantes qui réfèrent à la condition effacée. ("{" et "}")

Pour finir, tu as vu qu'il y a "oItem" au début du script, qui définit déjà la fonction "GetItemActivated()".
Tu peux supprimer la ligne "object oSource = GetItemActivated();" et remplacer tous les "oSource" par "oItem".
ok, tout semble marcher mais y'a un dernier probleme. quand ça supprime les anciennes propriétés, ça supprime aussi la possibilité d'absorber les autres armures.

y'a moyen de corriger ça ? c'est à dire de garder seulement la propriété d'absorber une autre armure ?

EDIT : est-ce qu'on peut faire un AddItemProperty de la propriété "lancer un sort : pouvoir unique utilisation illimité" ? si oui, c'ets quoi le code a mettre entre parenthèse ? où je peux trouver la liste de ce s codes si elle existe ?
Oui, j'avais oublié ce détail ( j'en oublie, des trucs... ^^ ).

En fait, dans la boucle, tu peux soit demander à ce que ce pouvoir ne soit pas effacé (le mieux je pense) :
Code PHP:

// Suppression des précédents effets
itemproperty ip GetFirstItemProperty(oItem);
while(
GetIsItemPropertyValid(ip)

    
// Si le pouvoir n'est pas "Pouvoir Unique", on le supprime
    
if(GetItemPropertySubType(ip)!=IP_CONST_CASTSPELL_UNIQUE_POWER)
    {
        
RemoveItemProperty(oItem,ip);
        
ip GetNextItemProperty(oItem);
    }
}
// Fin de la suppression des précédents effets 
Soit remettre cet effet après la boucle de copie :
Code PHP:

int nDuration
ip GetFirstItemProperty(oTarget); 
while(
GetIsItemPropertyValid(ip)) 

    
nDuration GetItemPropertyDurationType(ip); 
    if(
nDuration==DURATION_TYPE_PERMANENT
    { 
        
AddItemProperty(nDuration,ip,oSource); 
    } 
    
ip GetNextItemProperty(oTarget); 

// Rajout du "Pouvoir Unique" en utilisation illimitée.
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE),oItem); 
DestroyObject(oTarget); 
C'est ok, il m'a suffit de rajouter le pouvoir à la fin plutot que de le sauter dans le test.

Tout marche très bien !

Voici ce que donne le code une fois terminé, pour ceux qui seraient interressés :

Code PHP:

int GetItemArmorACBase(object oItem// Début du script
{
    if(!
GetIsObjectValid(oItem)||GetBaseItemType(oItem)!=BASE_ITEM_ARMOR)
        return -
1;

    
int nTorso GetItemAppearance(oItem,ITEM_APPR_TYPE_ARMOR_MODEL,ITEM_APPR_ARMOR_MODEL_TORSO);
    
string sACBase Get2DAString("des_crft_appear","BaseAC",nTorso);
    return 
StringToInt(sACBase);
}

void main()
{
    
object oItem GetItemActivated();
    
//script de base...





    // Rajoute :
    // Début du script
    
object oTarget GetItemActivatedTarget();
    if((
GetItemArmorACBase(oItem)==GetItemArmorACBase(oTarget)) && (GetIdentified(oTarget)==TRUE))
    {
        
// Suppression des précédents effets
        
itemproperty ip GetFirstItemProperty(oItem);
        while(
GetIsItemPropertyValid(ip))
        {
            
RemoveItemProperty(oItem,ip);
            
ip GetNextItemProperty(oItem);
        }
        
// Fin de la suppression des précédents effets

        
int nDuration;
        
ip GetFirstItemProperty(oTarget);
        while(
GetIsItemPropertyValid(ip))
        {
            
nDuration GetItemPropertyDurationType(ip);
            if(
nDuration==DURATION_TYPE_PERMANENT)
            {
                
AddItemProperty(nDuration,ip,oItem);
            }
            
ip GetNextItemProperty(oTarget);
        }
        
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER,IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE),oItem);
        
DestroyObject(oTarget);
    }
}
// Fin du script 
Et encore un grand merci à Deyonara sans qui ceci n'aurait jamais abouti !
Répondre

Connectés sur ce fil

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