Redonner les PVs

Répondre
Partager Rechercher
Resalut ;o)
Je vous explique, j'ai un script qui permet de "capturer" une créature, en fait c'est tout bête, le script enregistre le resref de la cible et on peut la rappeler n'importe où en tant que créature invoqué. J'ai trouvé un gros problème dans ce script, lorsqu'on 'capture' la créature et qu'on la rappel, ses PVs reviennent au maximum, alors j'ai tenter de mémoriser aussi les PVs de la créature et de lui infliger des dégâts divins au rappel de la créature mais ça ne marche pas, elle de reçoit aucun dégâts :/
Voici le script :

Code PHP:

void main()
{

    
object oTarget GetItemActivatedTarget();
    
object oUser GetItemActivator();
    
int iType GetObjectType(oTarget);
    
int iPc GetIsPC(oTarget);
    
string sName GetName(oTarget);
    
int iPV GetCurrentHitPoints(oTarget); // Points de vies de la créature capturé
    
object oItem GetItemActivated();
    
int iFull GetLocalInt(oItem"full");
    
int iHd1 GetLevelByPosition(1oTarget);
    
int iHd2 GetLevelByPosition(2oTarget);
    
int iHd3 GetLevelByPosition(3oTarget);
    
int iHd = ((iHd1)+(iHd2)+(iHd3));
    
int iLevel1 GetLevelByPosition(1oUser);
    
int iLevel2 GetLevelByPosition(2oUser);
    
int iLevel3 GetLevelByPosition(3oUser);
    
int iLevelt = (((iLevel1)+(iLevel2)+(iLevel3))*2);
    
int iPlot GetPlotFlag(oTarget);
    
int iNpc GetLocalInt (oTarget"npc");
    
effect eDisappear EffectDisappear();
    
string sCreature GetLocalString(oItem"contents");
    
effect eRelease EffectSummonCreature(sCreatureVFX_IMP_MAGBLUE0.0f);
    
location lTarget GetItemActivatedTargetLocation();
    if (
iFull == 0){
        if (
iType == OBJECT_TYPE_CREATURE){
          if (
iPlot == FALSE){
            if (
iNpc == 1){}
            if (
iPc == FALSE){
                if (
iLevelt >= iHd){
                
ApplyEffectToObject (DURATION_TYPE_PERMANENTeDisappearoTarget);
                
SetLocalInt (oItem"full"1);
                
ActionSpeakString ("Capture reussite !"TALKVOLUME_TALK);
                
ActionSpeakString (sNameTALKVOLUME_TALK);
                
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY), GetLocation(oTarget));
                
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_DISPEL), GetLocation(oTarget));
                
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
                
string sResref GetResRef(oTarget);
                
SetLocalInt(oItem"pointvie"iPV); // On enregistre les pts de vie de la créature dans une variable local
                
SetLocalString(oItem"contents"sResref);
                }
                if (
iLevelt iHd){
                
ActionSpeakString ("Trop puissant pour toi !"TALKVOLUME_TALK);
                
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
                }
              }
            if (
iPc == TRUE){
                
ActionSpeakString ("Impossible de capturer un joueur"TALKVOLUME_TALK);
                
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
                }
            }

          if (
iPlot == TRUE){
                
ActionSpeakString ("Impossible a capturer"TALKVOLUME_TALK);
                
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
                }
     }
     }
     if (
iFull == 1){
        
ApplyEffectAtLocation (DURATION_TYPE_TEMPORARYeReleaselTarget120.0); // On rappel la créature et elle disparaitera 120 secondes plus tard
        
SetLocalInt (oItem"full"0);
// Apparement c'est à partir de là que ça coince
      
object oCreature GetAssociate(ASSOCIATE_TYPE_SUMMONEDoUser); // On identifie la créature invoqué qui accompagne le joueur (je pense que c'est ça qui va pas)
      
int iHitPoints GetLocalInt(oItem"pointvie"); // on recupère la variable ...
      
effect eDamage EffectDamage(iHitPointsDAMAGE_TYPE_DIVINE);
      
ApplyEffectToObject(DURATION_TYPE_INSTANTeDamageoCreature); // On lui balance les degats :o)
        
}

Merci d'avance
Je n'ai pas regardé tout en détail, mais j'ai relevé deux petites erreurs.

D'abord, tu enregistres les points de vie actuels de ta créature, et tu cherches ensuite à les appliquer en points de dégâts. Ce n'est pas exact. Il faut insérer un calcul de ce genre :

Code PHP:

int iHitPoints GetMaxHitPoints(oCreature) - GetLocalInt(oItem"pointvie"); 

Ensuite, je me demande si tu ne devrais pas appliquer des dégâts permanents (DURATION_TYPE_PERMANENT), mais ça j'en suis moins sûr, je ne suis pas très calé en ce qui concerne les effets de sorts.

Voilà pour ma contribution, je laisse la place aux autres.
Bon, je crois avoir vu où est-ce que ça pourrait coincer, mais avant tout je te conseille vraiment d'essayer de clarifier ton script.
Pour ça, il y a plusieurs choses sur la syntaxe à savoir :

# au lieu d'imbriquer les if, genre :

if(a==1)
{
if(b==1)
{
}
}

tu peux regrouper dans ce genre de cas les deux tests, en faisant une condition unique qui serait ici :
if(a==1 && b==1)

(pour des informations sur les opérateurs logiques ET, OU etc., cf. les persistants ou Jedaï )


# dans la même veine, au lieu de faire un test du genre :

if(a==1)
{
}
if(a!=1)
{
}

tu peux utiliser if...else


# Enfin, le niveau des créatures se récupère normalement sans problème avec GetHitDice (c'est la méthode que j'ai toujours utilisée, malgré que certains aient l'air de dire qu'elle n'est pas fiable à 100%)


Bon, ensuite faudrait juste que tu me dise si la variable iNpc sert à quelque chose de précis, et si oui à quoi

Pour en revenir au problème : tu récupère ta créature invoquée grâce à :

object oCreature = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oUser);

Or je ne crois pas que tu ai explicitement "associé" cette créature avec le PJ. Après relecture de la description de la fonction (un peu obscure d'ailleurs ) dans le toolset, apparemment la créature est placée dans le groupe du "caller".
Peut-être que :
AssignCommand(oUser, ApplyEffectAtLocation (DURATION_TYPE_TEMPORARY, eRelease, lTarget, 120.0));
te donneras plus de résultat, quoique je n'en sois pas sûr du tout.

En dehors de ça, la remarque de Twist est tout à fait juste il me semble
Heuuu juste comme ça, je ne suis pas trop d'accord de mettre un DURATION_TYPE_PERMANENT , je trouve que cela ne sert à rien comme le fait de faire perdre des points de vie c'est instantané et non permanent.

Donc c'est bien à mon avis DURATION_TYPE_INSTANT.


mais bon ce n'est qu'un avis lol
J'ai tout remis en ordre (je précise que le script n'est pas de moi et que je veut juste tenter de récupérer les pv de la créature)

Code PHP:

void main()
{

    
object oTarget GetItemActivatedTarget();
    
object oUser GetItemActivator();
    
object oItem GetItemActivated();
    
object oCreature GetAssociate(ASSOCIATE_TYPE_SUMMONEDoUser);
    
int iType GetObjectType(oTarget);
    
int iPc GetIsPC(oTarget);
    
int iPV GetCurrentHitPoints(oTarget);
    
int iFull GetLocalInt(oItem"full");
    
int iHd1 GetLevelByPosition(1oTarget);
    
int iHd2 GetLevelByPosition(2oTarget);
    
int iHd3 GetLevelByPosition(3oTarget);
    
int iHd = ((iHd1)+(iHd2)+(iHd3));
    
int iLevel1 GetLevelByPosition(1oUser);
    
int iLevel2 GetLevelByPosition(2oUser);
    
int iLevel3 GetLevelByPosition(3oUser);
    
int iLevelt = (((iLevel1)+(iLevel2)+(iLevel3))*2);
    
int iPlot GetPlotFlag(oTarget);
    
int iHitPoints GetMaxHitPoints(oCreature) - GetLocalInt(oItem"pointvie");
    
string sResref GetResRef(oTarget);
    
string sName GetName(oTarget);
    
string sCreature GetLocalString(oItem"contents");
    
effect eDamage EffectDamage(iHitPointsDAMAGE_TYPE_DIVINE);
    
effect eDisappear EffectDisappear();
    
effect eRelease EffectSummonCreature(sCreatureVFX_IMP_MAGBLUE0.0f);
    
location lTarget GetItemActivatedTargetLocation();

      if (
iFull == && iType == OBJECT_TYPE_CREATURE)
       {
        if (
iPlot == FALSE)
         {
          if (
iPc == FALSE)
           {
            if (
iLevelt >= iHd)
             {
              
ApplyEffectToObject (DURATION_TYPE_INSTANTeDisappearoTarget);
              
SetLocalInt (oItem"full"1);
              
SetLocalInt(oItem"pointvie"iPV);
              
SetLocalString(oItem"contents"sResref);
              
ActionSpeakString ("Capture reussite !"TALKVOLUME_TALK);
              
ActionSpeakString (sNameTALKVOLUME_TALK);
              
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY), GetLocation(oTarget));
              
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_DISPEL), GetLocation(oTarget));
              
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
             }
            else
             {
              
ActionSpeakString ("Trop puissant pour toi !"TALKVOLUME_TALK);
              
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
             }
           }
          if (
iPc == TRUE)
           {
            
ActionSpeakString ("Impossible de capturer un joueur"TALKVOLUME_TALK);
            
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
           }
         }
        else
         {
          
ActionSpeakString ("Impossible a capturer"TALKVOLUME_TALK);
          
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
         }
       }

    if (
iFull == 1)
     {
      
AssignCommand(oUserApplyEffectAtLocation (DURATION_TYPE_TEMPORARYeReleaselTarget120.0));
      
ApplyEffectToObject(DURATION_TYPE_INSTANTeDamageoCreature);
      
SetLocalInt (oItem"full"0);
     }


Tu remarquera que j'ai bien mis
Code PHP:

      AssignCommand(oUserApplyEffectAtLocation (DURATION_TYPE_TEMPORARYeReleaselTarget120.0)); 

Mais ça ne change rien, ça l'invoque correctement mais les PVs reviennent toujours au Maximum +_+
je n'ai lut le code qu'en diagonale (je suis desole, promis, si j'ai plus de temps, je verif cet AM)

Mais dans le fonctionnement, tu test d'abord pour voir si iFull est egal à 0, puis tu le met à 1 dans la boucle qui suit, et dans la derniere boucle, tu verifie si iFull est a 1, et tu applique les dommages... c'est ca ?


Une chose : tu modifie le iFull stocké SetocalInt(iFull,1), mais dans la derniere boucle, tu verifie la variable iFull, et non pas la variable stocke iFull...

C'est normal ?
(je veux dire : si au lancement du script, iFull est a 1, il ne fera que la petite boucle, et si il est a 0, il ne fera que la grande.... jamais les deux... c'est bien le resultat attendu ?)


PS : desole de pas pouvoir y consacrer plus de temps avant cet AM ou ce soir...
PS : une suggestion : au moment du l'execution du script, je ne suis passur que ta creature soit effectivement la, surtout que tu determine oCreature largement avant EffectSummon (mais de toute facon, je ne suis pas sur que EffectSummon crée l'objet suffisement vite pour agir dessus via un GetAssociate...


En clair : tu declare que oCreature est la creature associée a ton joueur, puis apres seulement tu Summon la creature, et enfin, tu applique les degats sur oCreature (qui a mon avis est OBJECT_INVALID au moment de l'execution.)
Je pense qu'il s'agit la d'un defaut de conception putot que de construction.

Le plus simple:
- Soit tu fais un DelayCommand pour le get associate et un autre DelayCommand pour l'effet Degats
- Soit tu gere ca sur le OnSpawn des creature, en modifiant les scripts generics (un peu hasardeux pour ce genre de chose, je dirait...


voila, apres une premiere analyse a froid.
Eventuellement, teste, et si ca fonctionne pas, on essaye autre chose ^^
Histoire d'optimiser un ptit peu et de raccourcir :

Code PHP:

int iHd1 GetLevelByPosition(1oTarget);
int iHd2 GetLevelByPosition(2oTarget);
int iHd3 GetLevelByPosition(3oTarget);
int iHd = ((iHd1)+(iHd2)+(iHd3));
int iLevel1 GetLevelByPosition(1oUser);
int iLevel2 GetLevelByPosition(2oUser);
int iLevel3 GetLevelByPosition(3oUser);
int iLevelt = (((iLevel1)+(iLevel2)+(iLevel3))*2); 
A remplacer par

Code PHP:

int iHd GetHitDice(oTarget);
int iLevelt GetHitDice (oUser); 
essaye ca :

Code PHP:

void main()
{

    
object oTarget GetItemActivatedTarget();
    
object oUser GetItemActivator();
    
object oItem GetItemActivated();
    
int iType GetObjectType(oTarget);
    
int iFull GetLocalInt(oItem"full");
    
location lTarget GetItemActivatedTargetLocation();

      if (
iFull == && iType == OBJECT_TYPE_CREATURE)
       {
        
int iPV GetCurrentHitPoints(oTarget);
        
int iHd GetHitDice(oTarget);
        
int iLevelt GetHitDice (oUser);
        
string sResref GetResRef(oTarget);
        
string sName GetName(oTarget);
        
effect eDisappear EffectDisappear();
        
        if (
GetPlotFlag(oTarget) == FALSE)
         {
          if (!
GetIsPC(oTarget))
           {
            if (
iLevelt >= iHd)
             {
              
ApplyEffectToObject (DURATION_TYPE_INSTANTeDisappearoTarget);
          
DelayCommand(2.0,DestroyObject(oTarget));
              
SetLocalInt (oItem"full"1);
              
SetLocalInt(oItem"pointvie"iPV);
              
SetLocalString(oItem"contents"sResref);
              
ActionSpeakString ("Capture reussite !"TALKVOLUME_TALK);
              
ActionSpeakString (sNameTALKVOLUME_TALK);
              
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY), GetLocation(oTarget));
              
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_DISPEL), GetLocation(oTarget));
              
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
              return;
             }
            else
             {
              
ActionSpeakString ("Trop puissant pour toi !"TALKVOLUME_TALK);
              
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
              return;
             }
           }
          if (
GetIsPC(oTarget))
           {
            
ActionSpeakString ("Impossible de capturer un joueur"TALKVOLUME_TALK);
            
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
            return;
           }
         }
        else
         {
          
ActionSpeakString ("Impossible a capturer"TALKVOLUME_TALK);
          
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_HEAD_SONIC), GetLocation(oUser));
          return;
         }
       }

    if (
iFull == 1)
     {
      
string sCreature GetLocalString(oItem"contents");
      
effect eRelease EffectSummonCreature(sCreatureVFX_IMP_MAGBLUE0.0f);
      
AssignCommand(oUserApplyEffectAtLocation (DURATION_TYPE_TEMPORARYeReleaselTarget120.0));
      
int nHP GetLocalInt(oItem"pointvie");
      
DelayCommand(1.0,CorrectLife(oUser,nHP,));
      
SetLocalInt (oItem"full"0);
     }

}

void CorrectLife(object oMasterint nCorrection)
{
object oCreature GetAssociate(ASSOCIATE_TYPE_SUMMONEDoMaster);    
int iHitPoints GetMaxHitPoints(oCreature) - nCorrection;
effect eDamage EffectDamage(iHitPointsDAMAGE_TYPE_DIVINE);
ApplyEffectToObject(0eDamageoCreature);

PS : fais attention : il faut aussi que tu pense a rajouter une verification de l'item utilisé, sinon, tout les items de ton module ayant UNIQUE_POWER vont lancer ca.
Répondre

Connectés sur ce fil

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