Décalage d'évênnement étrange

Répondre
Partager Rechercher
Bonjour, voilà le script de sort que j'ai créé, il intervient dans le OnUseItem et le problème c'est que la cible encaisse les dégâts au minimum 2 secondes avant l'effet visuel et c'est pas normal. Si quelqu'un a la solution à mon problème

Code:
//sort lance en differe
void SORT();

void main()
{
    //L'animation se deroule.
    ActionPlayAnimation(ANIMATION_LOOPING_CONJURE1, 0.6, 5.0);
    DelayCommand(5.1,SORT());
}

void SORT()
{
    string sItem = GetTag(GetItemActivated());
    if (sItem == "book_fire_001")
    {
        object oSelf = GetItemActivator();
        object oTarget = GetItemActivatedTarget();
        object oVictim = GetNearestObject(OBJECT_TYPE_CREATURE, OBJECT_SELF, 1);

        int nCasterLevel = GetCasterLevel(OBJECT_SELF);
        int nDam = d4(2) + ((nCasterLevel * nCasterLevel) / 2 ) + 1;
        int nDice = d100(100) + ( nCasterLevel * 10 );

        effect eVis2 = EffectVisualEffect(VFX_IMP_GLOBE_USE);
        effect eVis3 = EffectVisualEffect(VFX_IMP_PULSE_FIRE);
        effect eVis4 = EffectVisualEffect(VFX_DUR_LIGHT_RED_5);
        effect eVis = EffectVisualEffect(VFX_IMP_FLAME_S);
        effect eRay = EffectBeam(VFX_BEAM_FIRE, OBJECT_SELF, BODY_NODE_HAND);
        effect eDam;
        //Type de degat
        eDam = EffectDamage(nDam, DAMAGE_TYPE_FIRE);


        // Echec critique
        if(nDice <= 100)
        {
            // Si le jet est inferieur a 100 / 1000 et si le score est inferieur a 10
            if(nDice <= 10)
            {
                //On lance le VFX sur le point d'impact et on applique les degats sur le PC lui meme.
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oSelf);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oSelf);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oSelf);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis3, oSelf);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis4, oSelf);

                //L'animation se deroule.
                ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRay, oSelf, 0.5);
            }
            // Si le jet est inferieur a 100 / 1000 et si le score est compris entre 11 et 100 inclu
            if(nDice >= 11)
            {
                //On lance le VFX sur le point d'impact et on applique les degats sur la personne la plus proche du PC.
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oVictim);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oVictim);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oSelf);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis3, oSelf);
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis4, oSelf);

                //L'animation se deroule.
                ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRay, oSelf, 0.5);
            }
        }
        else
        {
            //On lance le VFX sur le point d'impact et on applique les degats.
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oSelf);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis3, oSelf);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis4, oSelf);

            //L'animation se deroule.
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRay, oSelf, 0.5);
        }
    }
}
Je t'offre un petit nettoyage dans ton script, et pour le temps entre l'effet visuel et les dégâts, il faudrait voir par rapport au sort "Fléau (majeur) de projectiles d'Isaac" ou "Projectiles magiques".
Code PHP:

//sort lance en differe
void SORT();

void main()
{
    
//L'animation se deroule.
    
ActionPlayAnimation(ANIMATION_LOOPING_CONJURE1,0.6,5.0);
    
DelayCommand(5.1,SORT());
}

void SORT()
{
    
string sItem GetTag(GetItemActivated());
    if(
sItem=="book_fire_001")
    {
        
object oSelf GetItemActivator();
        
object oTarget GetItemActivatedTarget();
        
object oVictim GetNearestObject(OBJECT_TYPE_CREATURE,OBJECT_SELF,1);

        
int nCasterLevel GetCasterLevel(OBJECT_SELF);
        
int nDam d4(2)+((nCasterLevel*nCasterLevel)/2)+1;
        
int nDice d100(100)+(nCasterLevel*10);

        
effect eVis2 EffectVisualEffect(VFX_IMP_GLOBE_USE);
        
effect eVis3 EffectVisualEffect(VFX_IMP_PULSE_FIRE);
        
effect eVis4 EffectVisualEffect(VFX_DUR_LIGHT_RED_5);
        
effect eVis EffectVisualEffect(VFX_IMP_FLAME_S);
        
effect eRay EffectBeam(VFX_BEAM_FIREOBJECT_SELFBODY_NODE_HAND);

        
//Type de degat
        
effect eDam EffectDamage(nDamDAMAGE_TYPE_FIRE);

        
object oObject;

        
// Echec critique
        
if(nDice<=100)
        {
            
// Si le jet est inferieur a 100 / 1000 et si le score est inferieur a 10
            //On lance le VFX sur le point d'impact et on applique les degats sur le PC lui meme.
            
if(nDice<11)
                
oObject oSelf;

            
// Si le jet est inferieur a 100 / 1000 et si le score est compris entre 11 et 100 inclu
            //On lance le VFX sur le point d'impact et on applique les degats sur la personne la plus proche du PC.
            
if(nDice>10)
                
oObject oVictim;
        }

        
//On lance le VFX sur le point d'impact et on applique les degats.
        
else
            
oObject oTarget;

        
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oObject);
        
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDam,oObject);
        
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis2,oSelf);
        
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis3,oSelf);
        
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis4,oSelf);

        
//L'animation se deroule.
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eRay,oSelf,0.5);
    }

Il s'agit d'un évènement "OnItemActivated", donc "GetCasterLevel()" est, je pense, inapproprié.

Au passage, si sur "d100(100)" on obtient 100, c'est qu'on a un sérieux problème avec NwN (ou alors, comme moi, il faut arrêter de jouer). Les risques d'échec critiques sont donc inexistants, et je t'épargnerai la probabilité d'avoir un résultat de 100. Car oui, le minimum sur "d100(100)" est bien 100, chose réalisable uniquement les soirs de pleine lune, à 18h47, lorsque Venus, Mars et Pluton sont alignés avec la traînée de la comète de Halley par rapport à une éruption solaire toute particulière, alors que le chat de la voisine miaulera la Traviata en ré mineur septième.

À la limite, fais un "nDice = Random(10000)+1;", et tu auras en gros 1% de risque d'échec critique.
sinon y a un petit truc sympa... http://www.nwnlexicon.com/compiled/f...nkeffects.html

Ca te permets de lier les effets entre eux et donc logiquement de les activer ensemble...

Donc a la place de :
Code PHP:

        effect eVis EffectVisualEffect(VFX_IMP_FLAME_S);
...

        
//Type de degat
        
effect eDam EffectDamage(nDamDAMAGE_TYPE_FIRE); 
...
        
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oObject);
        
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDam,oObject); 
... 
ca devrait donner ca :
Code PHP:

...
        
effect eVis EffectVisualEffect(VFX_IMP_FLAME_S);
        
//Type de degat
        
effect eDam EffectDamage(nDamDAMAGE_TYPE_FIRE); 
        
effect eLink EffectLinkEffects(eVis eDam );
...

        
ApplyEffectToObject(DURATION_TYPE_INSTANT,eLink ,oObject);
... 
Et normalement les 2 effets devrait se produire en meme temps
Répondre

Connectés sur ce fil

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