Une petite question sur le DelayCommand

Répondre
Partager Rechercher
Salut à tous

Je suis en train de travailler sur un script qui permet à un PC de récupérer un à un ses PV quand il tombe en-dessous de 0 (façon HCR) :

Code PHP:

// OnPlayerDying

void main()
{
    
object oPC GetLastPlayerDying();
    
int nHP GetCurrentHitPoints(oPC);

    if (
nHP 1)
    {
        
DelayCommand(6.0ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(1), oPC));
        
nHP GetCurrentHitPoints(oPC);
        
ExecuteScript("recoverytest"oPC);  // ce script
    
}

Pour une raison qui m'échappe, le DelayCommand n'est pris en compte qu'à la première exécution du script, c'est à dire que dès que le perso arrive à 0pv ou moins, il ne se passe rien pendant 6 secondes puis il récupère tous ses pv jusqu'à concurrence de 1 d'un seul coup.

Je suis obligé de rajouter un DelayCommand devant le ExecuteScript pour obtenir l'effet voulu (récupération de 1 pv toutes les 6 secondes), pourtant quand je lis le script j'ai l'impression que l'intervalle devrait être de 12 secondes après la récupération du premier pv (6s récupération du pv + 6 secondes nouvelle exécution du script)

La question est simple : pourquoi ? (la réponse l'est sans doute moins )

Merci d'avance
C'est simple. Sans ton deuxième delay, le script s'exécute six secondes avant l'effet. Par conséquent ton script s'effectue en permanence et donc tu récupères tout d'un coup. Pour expliquer clairement, ce n'est pas parce que ton execute script est placé après qu'il s'effectue après

PS : il y a des moyens plus simple, comme un while, de faire une boucle... C'est amusant c'est la technique que j'avais voulu employer à mes débuts en script quand je voulais faire des boucles et que je ne connaissais pas le while. Niveau CPU, je pense que c'est plus virulent.
J'avais justement commencé par un while, je pense aussi que c'est plus léger, mais comme ma boucle était foireuse je me suis rabattu sur un ExecuteScript

Code PHP:

void main()
{
    
object oPC GetLastPlayerDying();
    
int nHP GetCurrentHitPoints(oPC);

    while(
nHP 1)
    {
        
nHP GetCurrentHitPoints(oPC);
        
DelayCommand(6.0ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(1), oPC));
    }

A la lumière de tes explications (très claires, merci) je pense avoir compris ce qui ne va pas dans la boucle : nHP n'est pas modifié à chaque passage comme je le croyais mais 6 secondes après, quand l'effet est appliqué, et pendant ce temps la boucle continue de tourner, tourner, tourner... et produit un énoooorme lag . Le problème c'est que je n'ai pas trouvé comment faire autrement pour dire à cette satanée boucle d'attendre gentiment que l'effet se produise pour continuer

Si vous connaissez une bidouille j'aimerais beaucoup la connaître moi aussi
Bon, soyons clair, DelayCommand() n'est pas un Sleep(), elle n'influe nullement sur l'exécution du script, quand un delaycommand est exécuté, il place simplement une fonction dans l'ordonnanceur et le script se poursuit immédiatement. Ainsi ici, ton ExecuteScript() redéclenche immédiatement le script, qui vérifie le nombre de HP, qui n'a pas changé puisque le Heal a été retardé 6 s, donc il refait un heal et il relance le script qui refait un heal qui relance le script....etc
Ca fait mal au CPU non ?

Quant à la boucle, comme il n'y a pas de sleep, tu ferais mieux de faire ça comme ça :
Code PHP:

void main()
{
    
object oPC GetLastPlayerDying();
    
int nHP GetCurrentHitPoints(oPC);
    
int n 1;
    
effect eHeal EffectHeal(1);

    for(
nHP -= 1nHPnHP++)
    {
        
DelayCommand(6.0f nApplyEffectToObject(DURATION_TYPE_INSTANTeHealoPC));
        
n++;
    }

Je pense que ça marchera pas trop mal, même si ça ne prend pas en compte les sorts de guérison ou ce genre de chose.
Tu peux aussi essayer ça :
Code PHP:

void Healobject oPJ );

void main()
{
    
object oPC GetLastPlayerDying();
    
    
DelayCommand(6.0fHealoPC ));
}

void Healobject oPJ )
{
    if(
GetCurrentHitPoints(oPJ) < 1)
    {
        
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(1), oPJ);
        
        
DelayCommand(6.0fHealoPJ ));
    }

Ca sera peut-être mieux.
Citation :
Ainsi ici, ton ExecuteScript() redéclenche immédiatement le script, qui vérifie le nombre de HP, qui n'a pas changé puisque le Heal a été retardé 6 s, donc il refait un heal et il relance le script qui refait un heal qui relance le script....etc
Ca fait mal au CPU non ?
Ben non, en fait un DelayCommand(6.0, ExecuteScript()) fonctionne parfaitement, il prend en compte l'incrémentation de nHP (je dirais que l'ExecuteScript est bien retardé par le DelayCommand tout comme l'EffectHeal, donc l'incrémentation a le temps de se faire avant que le script soit relancé... ou alors j'ai toujours rien compris )

Sinon, j'ai beaucoup de mal à comprendre ton premier script. A la lecture je comprends que si nHP = -5, tu initialises ta boucle à -6 et lui demande de s'arrêter à -5, puis de multiplier la durée du DelayCommand() par n qui est incrémenté de 1 à chaque passage (donc DelayCommand 12.0 au deuxième passage, 18.0 au troisième etc). Euh... J'ai été clair là ? Et accessoirement à l'exécution gros lag et un petit message d'erreur "too many instructions"

Pour ton deuxième script, je ne peux que dire "Bon sang mais c'est bien sûr". Elle fonctionne impeccable et produit exactement le résultat que je voulais. J'avais tenté une boucle de ce type lors de mes essais mais je m'étais royalement planté

Un grand merci donc
Je parlai de ton premier script

Sinon pour mon premier script (qui est pas génial j'admets), tu es sûr pour le "Too Many Instructions" ? Parce que logiquement, puisque le joueur commence à mourir à 0 pt de vie ou moins, ce script devrait rapidement s'arrêter, nHP passant par la valeur 0, c'est à dire FALSE. On donnerait donc une guérison de 1pt de vie toutes les 6 secondes, suffisamment pour remonter le joueur à 0 pt de vie. Il me semble du moins...

Bon de toute façon le deuxième script est ce que j'aurais fait spontanément mais bon... j'aimerais bien comprendre ?
J'avais mal compris, désolé

En fait mon premier script ne fait pas souffrir du tout le CPU, peut-être que l'ExecuteScript en boucle ne tourne pas assez vite pour faire cramer le pross

Pour la boucle en for, à moins que j'ai fait une petite erreur en recopiant le script, oui j'en suis sûr. Je reteste ça dès que j'ai le temps (je connais un CPU qui va passer un sale quart d'heure moi )
Répondre

Connectés sur ce fil

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