Une boucle

Répondre
Partager Rechercher
Salut tous je suis nouveau ici , et j'écris des scripts depuis peu aussi.
Je souhaiterais juste un petit renseignement: Comment faire une boucle qui débuterait en entrant dans une zone (donc le OnEnter de cette zone) et qui se briserai lorsque oPC (object oPC = GetEnteringObject() ; ) sortirai de cette zone. L'action étant: un jet de vigueur ttes les heures avec un DD (difficulté) de 15 a raison de +1 par heure pour éviter 1d6 de dégats.
Enfin si c possible il serait encore mieu que c 1d6 dégats soient non létaux cad que lorsque oPC entre dans une nouvelle zone (sur laquelle n'est plus appliqué ce script car bien évidemment il doit etre possible de relancer ce scripts sur une zone adjacente a celle de départ) il récupère tout pdv perdu a cause de script.



La règle que je voudrais adapter: Par temps de froid (température inferieure à 5°c)*, un personnage non protégé doit réussir un jet de vigueur par heure (DD15, +1 par jet effectué au préalable) pour ne pas subir 1d6 de dégats non létaux. Un aventurier possédant la compétances survie peut bénéficier d'un bonus, voire en faire profiter ses compagnons (voir Manuel du joueur, page 85).
extrait page 304 du Guide du maître livre de règles II v3.5 de D&D 3

Pour ce qui est écrit en vert je peux me débrouiller seul
*froid important (-15°c)
froid estrème (-30°c)
donc des zones de ce type peuvent aussi etre adjacente a la première oPC ne doit pas pouvoir récupérer de pdv dans ces zones mais au contraire les jets et degats seront plus grave enfin fo voir les regles bref



Pour le moment j'ai essayé avec while et un delay avant chaque action mais soit il ne respecte mon DelayCommand(HoursToSeconds(1), ...) que la premiere fois ( je vous dit pas la gueule du pc quand ca arrive lol ) soit il me sort des choses bizard genre script grenouille (en anglais lol en jaune pdt le jeu) et sinon il me faut utiliser ++iMalus ou iMalus++ ????
Sinon un tel script risque de bcp tourner si trop utilisé j'en suis pleinement conscient.




NB: Je n'ai pas le guide du joueur pour le moment si vous avez d'autres détails sur les dégats non létaux je suis preneur sinon je serais en possession des info qui me manque sans trop de prob dans quelques jours enfin c pas le plus important...




J'ai des scripts de ce genre.

Sur le OnEnter de ta zone :
Code PHP:

void main()
{
    
object oPlayer GetEnteringObject();

    if (!
GetIsPC(oPlayer)) return;

    
ExecuteScript("sc_enter_area"OBJECT_SELF);
    
AssignCommand(oPlayerDelayCommand(120.0ExecuteScript("rec_frozen_area"oPlayer)));

Le script "rec_frozen_area" :
Code PHP:

void main()
{
    if (
GetLocalInt(GetArea(OBJECT_SELF), "Frozen_area") == FALSE) return;

    
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamaged6(), DAMAGE_TYPE_COLDDAMAGE_POWER_ENERGY), OBJECT_SELF);
    
FloatingTextStringOnCreature("Le froid est vraiment mordant ici."OBJECT_SELF);
    
AssignCommand(OBJECT_SELFDelayCommand(120.0ExecuteScript("rec_frozen_area"OBJECT_SELF)));

Tu as juste à mettre la variable locale "Frozen_area" de la zone à 1.

Dans mon système les dommages sont fixes, mais ça ne devrait pas poser de problèmes de les modifier en fonction de la zone. Une variable locale sur la zone donnant le montant maximum des dommages et un Random() sur cette valeur devrait faire l'affaire.
Script fait pour l'occasion.

Il gère toute les fonctionalités que tu souhaites: dommage modifiable en fonction de la température, jet de sauvegarde selon la règle, récupération des points de vie perdus une fois en zone saine.

Il est à placer dans le onEnter de la zone.

Étudie son fonctionnement, tu en apprendras certainement sur structures répétitives dans NWN.
Code PHP:

// =======================================================
// | Ajustement de la temperature de la zone sur un joueur
// | Par: CdN <cdn{at}altern.org>, le 29 juin 2004
// =======================================================
// oPC          - Defini le joueur a qui appliquer la
//                temperature.
// fTemperature - Defini la temperature a appliquer au
//                joueur.
// fRecheck     - Defini le temps en seconde avant chaque
//                reverification (et donc application des
//                dommages).
// bFirst       - Usage interne, ne pas toucher
void setAreaTemperature(object oPCfloat fTemperaturefloat fRecheck 600.0fint bFirst TRUE);

void setAreaTemperature(object oPCfloat fTemperaturefloat fRecheck 600.0fint bFirst TRUE) {
    
// Si oPC n'est pas un joueur, on arrete de suite.
    
if(!GetIsPC(oPC)) return;
    
// Si c'est le premier passage sur cette fonction
    
if(bFirst) {
        
// On enregistre dans la variable locale fTemperature la temperature du
        //   joueur, au cas ou, pour une utilisation hors de cette fonction.
        
SetLocalFloat(oPC"fTemperature"fTemperature);
        
// On sauvegarde la zone ou le joueur se trouvait, pour pouvoir lui
        //   rendre ses points de vie une fois qu'il en aura change.
        
SetLocalString(oPC"sTemperatureArea"GetName(GetArea(oPC)));
        
// On fait effectuer au joueur le jet de vigueur contre le froid, avec
        //   pour DD 15 + nombre de fois que le joueur a fait un jet de vigueur
        //   pour des raisons de temperature.
    
}
    
// Si on est toujours dans la meme zone froide
    
if(GetName(GetArea(oPC)) == GetLocalString(oPC"sTemperatureArea")) {
        
int nSave FortitudeSave(oPCGetLocalInt(oPC"nTemperatureShooted") + 15SAVING_THROW_TYPE_COLD);
        
// On sauve que le joueur a fait un jet de vigueur pour les prochaines fois
        
SetLocalInt(oPC"nTemperatureShooted"GetLocalInt(oPC"nTemperatureShooted") + 1);
        
// On verifie si le joueur a reussi son jet (ou s'il est immunise aux degats
        //   de froid), dans ce cas on ne fait pas de dommages. Sinon...
        
if(!(nSave >= 1)) {
            
// Ici on verifie la temperature et on applique les degats en fonction.
            
int nDamage 0// Par defaut, on ne fait pas de dommages.
            
if(fTemperature <= -30.0f) { // Si la temperature est inferieure ou egale a -30 degres
                
nDamage d6(3);   // 3D6 de dommage
            
} else if(fTemperature <= -15.0f) { // Si la temperature est inferieure ou egale a -15 degres
                
nDamage d6(2);   // 2D6 de dommage
            
} else if(fTemperature <= 5.0f) {  // Si la temperature est inferieure ou egale a 5 degres
                
nDamage d6();    // 1D6 de dommage
            
}
            
// On applique les degats de type froid.
            
SendMessageToPC(oPC"Vous êtes victime du froid.");
            
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC);
            
// On sauvegarde les degats effectues
            
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
        }
        
//On relance l'execution de la fonction
        
DelayCommand(fRechecksetAreaTemperature(oPCfTemperaturefRecheckFALSE));
    } else {
        
// Sinon on regenere les HP perdu de 1d6 HP par fRecheck seconde
        
int nRegen d6();
        
// Au cas ou on aurai rendu tous ses HP au joueur, on stop le script
        
if(nRegen GetLocalInt(oPC"nTemperatureDamaged")) nRegen GetLocalInt(oPC"nTemperatureDamaged");
        
SendMessageToPC(oPC"De retour à une température normale, votre corps se réchauffe.");
        
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(nRegen), oPC);
        
int nNewDamaged GetLocalInt(oPC"nTemperatureDamaged") - nRegen;
        if(
nNewDamaged && GetMaxHitPoints(oPC) > GetCurrentHitPoints(oPC)) {
            
SetLocalInt(oPC"nTemperatureDamaged"nNewDamaged);
            
DelayCommand(fRechecksetAreaTemperature(oPCfTemperaturefRecheckFALSE));
        } else {
            
SendMessageToPC(oPC"Votre corps a retrouvé une température normale.");
            
// On libere la memoire
            
DeleteLocalInt(oPC"nTemperatureDamaged");
            
DeleteLocalInt(oPC"nTemperatureShooted");
            
DeleteLocalString(oPC"sTemperatureArea");
            
DeleteLocalFloat(oPC"fTemperature");
        }
    }
}

void main()
{
    
// On recupere l'objet entrant
    
object oEntering GetEnteringObject();
    
// On defini la temperature de oEntering a -40 degres, et
    //   reverification chaque 5 secondes
    
setAreaTemperature(oEntering, -40.0f5.0f);

Et pour répondre à ta question, la différence entre ++iMalus et iMalus++.

++[variable] est une opération de pré-incrémentation, tandit que
[variable]++ est une opération de post-incrémentation.

La différence est au niveau de la valeur retournée. Une pré-incrémentation retournera la nouvelle valeur de la variable, tandit qu'une post-décrémentation retournera l'ancienne.

Exemple pratique:
Code PHP:

int nVariable 10;

int nTest = ++nVariable;

// Ici, nTest aura la valeur 11, et nVariable la valeur 11. 
Code PHP:

int nVariable 10;

int nTest nVariable++;

// Ici, nTest aura la valeur 10, et nVariable la valeur 11. 
Bon ben si j'ai le droit de demander avec des réponses comme ca je ressaye





Ton script est vraiment super , il m'a même permit de comprendre des choses par contre sans vouloir abuser y aurait il possibilité de faire en sorte que le jet de dégat pour le froid important se fasse toutes les 10minutes et celui du froid extrème ttes les minutes?enfin les dégats du à un froid extrème sont permanent mais pour ca je met un if (fTemperature <= -30.0f && fTemperature <= -15.0f) en plus héhé.


Enfin es ce que ce script peut s'appliquer a tt pj pnj compagnons animal, familiers et créatures? afin de me permettre de jouer sur les avantages de chacun car par la suite je verrais si les immunités au dégats de froid suffisent a faire en sorte qu'un ours polaire ne meurt pas au sein de son climat (ca serai malheureux quand meme ).




J'imagine un pj poursuivi par un groupe d'orque (orque dangereux pour lui héhé) la zone peut etre un bon moyen de s'en débarasser si le pj sait courir et si pour une raison ou une autre il sait aussi plus ou moins résister au froid en tout k mieux que les orques.
Le script modifié selon tes désirs:
- il est effectif sur toutes les créatures;
- la répétition des dégats de froid extrême (-30°C ou moins) se fait 10x plus vite que fRecheck. Par exemple, si tu mets fRecheck à 60.0f (une minute), en cas de froid extrême, les dégats seront refais chaque 6 secondes.
Code PHP:

// =======================================================
// | Ajustement de la temperature de la zone sur un joueur
// | Par: CdN <cdn{at}altern.org>, le 29 juin 2004
// =======================================================
// oPC          - Defini le joueur a qui appliquer la
//                temperature.
// fTemperature - Defini la temperature a appliquer au
//                joueur.
// fRecheck     - Defini le temps en seconde avant chaque
//                reverification (et donc application des
//                dommages).
// bFirst       - Usage interne, ne pas toucher
void setAreaTemperature(object oPCfloat fTemperaturefloat fRecheck 600.0fint bFirst TRUE);

void setAreaTemperature(object oPCfloat fTemperaturefloat fRecheck 600.0fint bFirst TRUE) {
    
// Si oPC n'est pas un joueur, on arrete de suite.
    //if(!GetIsPC(oPC)) return; Modification: On rend le script effectif sur toutes les créatures
    // Si c'est le premier passage sur cette fonction
    
if(bFirst) {
        
// On enregistre dans la variable locale fTemperature la temperature du
        //   joueur, au cas ou, pour une utilisation hors de cette fonction.
        
SetLocalFloat(oPC"fTemperature"fTemperature);
        
// On sauvegarde la zone ou le joueur se trouvait, pour pouvoir lui
        //   rendre ses points de vie une fois qu'il en aura change.
        
SetLocalString(oPC"sTemperatureArea"GetName(GetArea(oPC)));
        
// On fait effectuer au joueur le jet de vigueur contre le froid, avec
        //   pour DD 15 + nombre de fois que le joueur a fait un jet de vigueur
        //   pour des raisons de temperature.
    
}
    
// Si on est toujours dans la meme zone froide
    
if(GetName(GetArea(oPC)) == GetLocalString(oPC"sTemperatureArea")) {
        
int nSave FortitudeSave(oPCGetLocalInt(oPC"nTemperatureShooted") + 15SAVING_THROW_TYPE_COLD);
        
// On sauve que le joueur a fait un jet de vigueur pour les prochaines fois
        
SetLocalInt(oPC"nTemperatureShooted"GetLocalInt(oPC"nTemperatureShooted") + 1);
        
// On verifie si le joueur a reussi son jet (ou s'il est immunise aux degats
        //   de froid), dans ce cas on ne fait pas de dommages. Sinon...
        
if(!(nSave >= 1)) {
            
// Ici on verifie la temperature et on applique les degats en fonction.
            
int nDamage 0// Par defaut, on ne fait pas de dommages.
            
if(fTemperature <= -30.0f) { // Si la temperature est inferieure ou egale a -30 degres
                
nDamage d6(3);   // 3D6 de dommage
            
} else if(fTemperature <= -15.0f) { // Si la temperature est inferieure ou egale a -15 degres
                
nDamage d6(2);   // 2D6 de dommage
            
} else if(fTemperature <= 5.0f) {  // Si la temperature est inferieure ou egale a 5 degres
                
nDamage d6();    // 1D6 de dommage
            
}
            
// On applique les degats de type froid.
            
SendMessageToPC(oPC"Vous êtes victime du froid.");
            
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC);
            
// On sauvegarde les degats effectues
            
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
        }
        
//On relance l'execution de la fonction
        //Modification: Si la température est inférieure ou égale à -30.0f, on relance le script
        //    dix fois plus vite.
        
DelayCommand((fTemperature<=-30.0f)?fRecheck/10:fRechecksetAreaTemperature(oPCfTemperaturefRecheckFALSE));
    } else {
        
// Sinon on regenere les HP perdu de 1d6 HP par fRecheck seconde
        
int nRegen d6();
        
// Au cas ou on aurai rendu tous ses HP au joueur, on stop le script
        
if(nRegen GetLocalInt(oPC"nTemperatureDamaged")) nRegen GetLocalInt(oPC"nTemperatureDamaged");
        
SendMessageToPC(oPC"De retour à une température normale, votre corps se réchauffe.");
        
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(nRegen), oPC);
        
int nNewDamaged GetLocalInt(oPC"nTemperatureDamaged") - nRegen;
        if(
nNewDamaged && GetMaxHitPoints(oPC) > GetCurrentHitPoints(oPC)) {
            
SetLocalInt(oPC"nTemperatureDamaged"nNewDamaged);
            
DelayCommand(fRechecksetAreaTemperature(oPCfTemperaturefRecheckFALSE));
        } else {
            
SendMessageToPC(oPC"Votre corps a retrouvé une température normale.");
            
// On libere la memoire
            
DeleteLocalInt(oPC"nTemperatureDamaged");
            
DeleteLocalInt(oPC"nTemperatureShooted");
            
DeleteLocalString(oPC"sTemperatureArea");
            
DeleteLocalFloat(oPC"fTemperature");
        }
    }
}

void main()
{
    
// On recupere l'objet entrant
    
object oEntering GetEnteringObject();
    
// On defini la temperature de oEntering a -40 degres, et
    //   reverification chaque 5 secondes
    
setAreaTemperature(oEntering, -40.0f5.0f);

Et pour répondre à ta question, oui, ce script gère les imunités et les absorptions de froid. Un glaçon à patte avec absorption du froid sera régénéré à la place de prendre des dommages. Et un ours polaire immunisé n'en prendra aucun.
if(fTemperature <= -30.0f) { // Si la temperature est inferieure ou egale a -30 degres
nDamage = d6(3); // 3D6 de dommage
SendMessageToPC(oPC, "Vous êtes victime du froid -30.");
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_COLD), oPC);
DelayCommand(fRecheck/60, setAreaTemperature(oPC, fTemperature, fRecheck, FALSE));
SetLocalInt(oPC, "nTemperatureDamaged", nDamage);
} else if(fTemperature <= -15.0f) { // Si la temperature est inferieure ou egale a -15 degres
nDamage = d6(2); // 2D6 de dommage
SendMessageToPC(oPC, "Vous êtes victime du froid -15.");
DelayCommand(fRecheck/6, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_COLD), oPC));
DelayCommand(fRecheck/6, setAreaTemperature(oPC, fTemperature, fRecheck, FALSE));
SetLocalInt(oPC, "nTemperatureDamaged", nDamage);
} else if(fTemperature <= 5.0f) { // Si la temperature est inferieure ou egale a 5 degres
nDamage = d6(); // 1D6 de dommage
SendMessageToPC(oPC, "Vous êtes victime du froid. -5");
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_COLD), oPC);
DelayCommand(fRecheck, setAreaTemperature(oPC, fTemperature, fRecheck, FALSE));
SetLocalInt(oPC, "nTemperatureDamaged", nDamage);
}






Je ne comprand pas des que j'écris ca comme ca ca marche plus pourtant si je retire le delay command devant ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_COLD), oPC) il applique les dégats mais ne relance pas l'execution de la fonction.
Ben d'apres ces observation je dirais que le prob vient du delay mais euh je vois pas pourquoi......??,,
Citation :
Publié par Ido
Code PHP:

if(fTemperature <= -30.0f) { // Si la temperature est inferieure ou egale a -30 degres
                
nDamage d6(3);   // 3D6 de dommage
                
SendMessageToPC(oPC"Vous êtes victime du froid -30.");
                                        
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC);
                                        
DelayCommand(fRecheck/60setAreaTemperature(oPCfTemperaturefRecheckFALSE));
                                        
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
            } else if(
fTemperature <= -15.0f) { // Si la temperature est inferieure ou egale a -15 degres
                
nDamage d6(2);   // 2D6 de dommage
                
SendMessageToPC(oPC"Vous êtes victime du froid -15.");
                                        
DelayCommand(fRecheck/6ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC));
                                        
DelayCommand(fRecheck/6setAreaTemperature(oPCfTemperaturefRecheckFALSE));
                                        
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
            } else if(
fTemperature <= 5.0f) {  // Si la temperature est inferieure ou egale a 5 degres
                
nDamage d6();    // 1D6 de dommage
                
SendMessageToPC(oPC"Vous êtes victime du froid. -5");
                                        
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC);
                                        
DelayCommand(fRechecksetAreaTemperature(oPCfTemperaturefRecheckFALSE));
                                        
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
            } 





Je ne comprand pas des que j'écris ca comme ca ca marche plus pourtant si je retire le delay command devant ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_COLD), oPC) il applique les dégats mais ne relance pas l'execution de la fonction.
Ben d'apres ces observation je dirais que le prob vient du delay mais euh je vois pas pourquoi......??,,
Relit plus.

Script corrigé:
Code PHP:

void setAreaTemperature(object oPCfloat fTemperaturefloat fRecheck 600.0fint bFirst TRUE) {
    
// Si oPC n'est pas un joueur, on arrete de suite.
    //if(!GetIsPC(oPC)) return; Modification: On rend le script effectif sur toutes les créatures
    // Si c'est le premier passage sur cette fonction
    
if(bFirst) {
        
// On enregistre dans la variable locale fTemperature la temperature du
        //   joueur, au cas ou, pour une utilisation hors de cette fonction.
        
SetLocalFloat(oPC"fTemperature"fTemperature);
        
// On sauvegarde la zone ou le joueur se trouvait, pour pouvoir lui
        //   rendre ses points de vie une fois qu'il en aura change.
        
SetLocalString(oPC"sTemperatureArea"GetName(GetArea(oPC)));
        
// On fait effectuer au joueur le jet de vigueur contre le froid, avec
        //   pour DD 15 + nombre de fois que le joueur a fait un jet de vigueur
        //   pour des raisons de temperature.
    
}
    
// Si on est toujours dans la meme zone froide
    
if(GetName(GetArea(oPC)) == GetLocalString(oPC"sTemperatureArea")) {
        
int nSave FortitudeSave(oPCGetLocalInt(oPC"nTemperatureShooted") + 15SAVING_THROW_TYPE_COLD);
        
// On sauve que le joueur a fait un jet de vigueur pour les prochaines fois
        
SetLocalInt(oPC"nTemperatureShooted"GetLocalInt(oPC"nTemperatureShooted") + 1);
        
// On verifie si le joueur a reussi son jet (ou s'il est immunise aux degats
        //   de froid), dans ce cas on ne fait pas de dommages. Sinon...
        
float fRecheckMod fRecheck;
        if(!(
nSave >= 1)) {
            
int nDamage 0;
            if(
fTemperature <= -30.0f) { // Si la temperature est inferieure ou egale a -30 degres
                
nDamage d6(3);   // 3D6 de dommage
                
fRecheckMod fRecheck 60;
            } else if(
fTemperature <= -15.0f) { // Si la temperature est inferieure ou egale a -15 degres
                
nDamage d6(2);   // 2D6 de dommage
                
fRecheckMod fRecheck 6;
            } else if(
fTemperature <= 5.0f) {  // Si la temperature est inferieure ou egale a 5 degres
                
nDamage d6();    // 1D6 de dommage
                
fRecheckMod fRecheck 60;
            }
            
SendMessageToPC(oPC"Vous êtes victime du froid, il fait " FloatToString(fTemperature180) + "°C.");
            
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC);
            
// On sauvegarde les degats effectues
            
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
        }
        
//On relance l'execution de la fonction
        //Modification: Si la température est inférieure ou égale à -30.0f, on relance le script
        //    dix fois plus vite.
        
DelayCommand(fRecheckModsetAreaTemperature(oPCfTemperaturefRecheckFALSE));
    } else {
        
// Sinon on regenere les HP perdu de 1d6 HP par fRecheck seconde
        
int nRegen d6();
        
// Au cas ou on aurai rendu tous ses HP au joueur, on stop le script
        
if(nRegen GetLocalInt(oPC"nTemperatureDamaged")) nRegen GetLocalInt(oPC"nTemperatureDamaged");
        
SendMessageToPC(oPC"De retour à une température normale, votre corps se réchauffe.");
        
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(nRegen), oPC);
        
int nNewDamaged GetLocalInt(oPC"nTemperatureDamaged") - nRegen;
        if(
nNewDamaged && GetMaxHitPoints(oPC) > GetCurrentHitPoints(oPC)) {
            
SetLocalInt(oPC"nTemperatureDamaged"nNewDamaged);
            
DelayCommand(fRechecksetAreaTemperature(oPCfTemperaturefRecheckFALSE));
        } else {
            
SendMessageToPC(oPC"Votre corps a retrouvé une température normale.");
            
// On libere la memoire
            
DeleteLocalInt(oPC"nTemperatureDamaged");
            
DeleteLocalInt(oPC"nTemperatureShooted");
            
DeleteLocalString(oPC"sTemperatureArea");
            
DeleteLocalFloat(oPC"fTemperature");
        }
    }
}

void main()
{
    
// On recupere l'objet entrant
    
object oEntering GetEnteringObject();
    
// On defini la temperature de oEntering a -40 degres, et
    //   reverification chaque 5 secondes
    
setAreaTemperature(oEntering, -40.0f5.0f);

PS: N'oublie pas les balises [PHP][/PHP]
Excuse moi mais la il me relance la fonction toutes les secondes, bizard la température est configuré a 15°c il devrait me faire SendMessageToPC(oPC, "Vous êtes victime du froid, il fait " + FloatToString(fTemperature, 18, 0) + "°C." + FloatToString(fRecheckMod, 18, 0)); fRecheckMod, = 600 mais non il m'écrit dans le jeu fRecheckMod, = 1


voila ce qui est écrit en jeu


Vous êtes victime du froid, il fait -15°c 1





Code PHP:

void setAreaTemperature(object oPCfloat fTemperaturefloat fRecheck 3600.0fint bFirst TRUE) {
    
// Si oPC n'est pas un joueur, on arrete de suite.
    //if(!GetIsPC(oPC)) return; Modification: On rend le script effectif sur toutes les créatures
    // Si c'est le premier passage sur cette fonction
    
if(bFirst) {
        
// On enregistre dans la variable locale fTemperature la temperature du
        // joueur, au cas ou, pour une utilisation hors de cette fonction.
        
SetLocalFloat(oPC"fTemperature"fTemperature);
        
// On sauvegarde la zone ou le joueur se trouvait, pour pouvoir lui
        // rendre ses points de vie une fois qu'il en aura change.
        
SetLocalString(oPC"sTemperatureArea"GetName(GetArea(oPC)));
        
// On fait effectuer au joueur le jet de vigueur contre le froid, avec
        // pour DD 15 + nombre de fois que le joueur a fait un jet de vigueur
        // pour des raisons de temperature.
    
}
    
// Si on est toujours dans la meme zone froide
    
if(GetName(GetArea(oPC)) == GetLocalString(oPC"sTemperatureArea")) {
        
int nSave FortitudeSave(oPCGetLocalInt(oPC"nTemperatureShooted") + 15SAVING_THROW_TYPE_COLD);
        
// On sauve que le joueur a fait un jet de vigueur pour les prochaines fois
        
SetLocalInt(oPC"nTemperatureShooted"GetLocalInt(oPC"nTemperatureShooted") + 1);
        
// On verifie si le joueur a reussi son jet (ou s'il est immunise aux degats
        // de froid), dans ce cas on ne fait pas de dommages. Sinon...
        
float fRecheckMod fRecheck;
        if(!(
nSave >= 1)) {
            
int nDamage 0;
            if(
fTemperature <= -30.0f) { // Si la temperature est inferieure ou egale a -30 degres
                
nDamage d6(1); // 3D6 de dommage
                
fRecheckMod fRecheck 60;
            } else if(
fTemperature <= -15.0f) { // Si la temperature est inferieure ou egale a -15 degres
                
nDamage d6(1); // 2D6 de dommage
                
fRecheckMod fRecheck 6;
            } else if(
fTemperature <= 5.0f) { // Si la temperature est inferieure ou egale a 5 degres
                
nDamage d6();    // 1D6 de dommage
                
fRecheckMod fRecheck;
            }
            
SendMessageToPC(oPC"Vous êtes victime du froid, il fait " FloatToString(fTemperature180) + "°C." FloatToString(fRecheckMod180));
            
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC);
            
// On sauvegarde les degats effectues
            
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
        }
        
//On relance l'execution de la fonction
        //Modification: Si la température est inférieure ou égale à -30.0f, on relance le script
        //    dix fois plus vite.
        
DelayCommand(fRecheckModsetAreaTemperature(oPCfTemperaturefRecheckFALSE));
    } else {
        
// Sinon on regenere les HP perdu de 1d6 HP par fRecheck seconde
        
int nRegen d6();
        
// Au cas ou on aurai rendu tous ses HP au joueur, on stop le script
        
if(nRegen GetLocalInt(oPC"nTemperatureDamaged")) nRegen GetLocalInt(oPC"nTemperatureDamaged");
        
SendMessageToPC(oPC"De retour à une température normale, votre corps se réchauffe.");
        
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(nRegen), oPC);
        
int nNewDamaged GetLocalInt(oPC"nTemperatureDamaged") - nRegen;
        if(
nNewDamaged && GetMaxHitPoints(oPC) > GetCurrentHitPoints(oPC)) {
            
SetLocalInt(oPC"nTemperatureDamaged"nNewDamaged);
            
DelayCommand(fRechecksetAreaTemperature(oPCfTemperaturefRecheckFALSE));
        } else {
            
SendMessageToPC(oPC"Votre corps a retrouvé une température normale.");
            
// On libere la memoire
            
DeleteLocalInt(oPC"nTemperatureDamaged");
            
DeleteLocalInt(oPC"nTemperatureShooted");
            
DeleteLocalString(oPC"sTemperatureArea");
            
DeleteLocalFloat(oPC"fTemperature");
        }
    }
}
 
void main()
{
    
// On recupere l'objet entrant
    
object oEntering GetEnteringObject();
    
// On defini la temperature de oEntering a -40 degres, et
    // reverification chaque 5 secondes
    
setAreaTemperature(oEntering, -15.0f5.0f);

et avec ca SendMessageToPC(oPC, "Vous êtes victime du froid, il fait " + FloatToString(fTemperature, 18, 0) + "°C." + FloatToString(fRecheckMod, 18, 0) + FloatToString(fRecheck, 18, 0)); il me dit


Vous êtes victime du froid, il fait -15°c plus loin 1 plus loin 5
je viens de tester avec float fRecheck = 600.0f, et setAreaTemperature(oEntering, -5.0f, 5.0f); il me répond cette fois ci


Vous êtes victime du froid, il fait -5°c plus loin 5 plus loin 5
En gros il doit me faire dans le k des 15°c 5/6 = en dessous de 1 donc il prend 1 et pour 5°c comme il n'y a pas de division il garde 5 mais pourtant le temps est de 600 ou de 3600 secondes ....... j'avoue la que j'ai l'impression de rentrer dans le domaine de paranormal.
Espece d'abruti caché derrière un pseudo je vais te répondre moi dans le jeu une heure = 600s et non 3600 sinon on aurait pas fini d'attendre le repos de plus le temps est redéfini ici setAreaTemperature(oEntering, -15.0f, 600.0f); .




Bon au cas ou quelqu'un serai aussi bete que moi lisez le sujet jusqu'au bout, et c promi j'arrete la moquette
Cette fois ci c'est un peu plus sérieux. Une petite explication serai super sympas, pourrais-je en avoir une?



Code PHP:

 void setAreaTemperature(object oPCfloat fTemperaturefloat fRecheck 600.0fint bFirst TRUE) {
    
//if(!GetIsPC(oPC)) return; Modification: Retirer les // pour rendre le script effectif uniquement sur un joueur
    
if(bFirst)
    {
        
// On enregistre dans la variable locale fTemperature la temperature du
        // joueur, au cas ou, pour une utilisation hors de cette fonction.
        
SetLocalFloat(oPC"fTemperature"fTemperature);
        
// On sauvegarde la zone ou le joueur se trouvait, pour pouvoir lui
        // rendre ses points de vie une fois qu'il en aura change.
        
SetLocalString(oPC"sTemperatureArea"GetName(GetArea(oPC)));
        
// On fait effectuer au joueur le jet de vigueur contre le froid, avec
        // pour DD 15 + nombre de fois que le joueur a fait un jet de vigueur
        // pour des raisons de temperature.
    
}
    
// Si on est toujours dans la meme zone froide
    
if(GetName(GetArea(oPC)) == GetLocalString(oPC"sTemperatureArea"))
    {
        
int nSave FortitudeSave(oPCGetLocalInt(oPC"nTemperatureShooted") + 15SAVING_THROW_TYPE_COLD);
        
// On sauve que le joueur a fait un jet de vigueur pour les prochaines fois
        
SetLocalInt(oPC"nTemperatureShooted"GetLocalInt(oPC"nTemperatureShooted") + 1);
        
// On verifie si le joueur a reussi son jet (ou s'il est immunise aux degats
        // de froid), dans ce cas on ne fait pas de dommages. Sinon...
 
        
float fRecheckMod fRecheck;
        if(!(
nSave >= 1))
        {
            
int nDamage 0;
            if(
fTemperature <= -30.0f)
            { 
// Si la temperature est inferieure ou egale a -30 degres
                
nDamage d6(1); // 3D6 de dommage
                
fRecheckMod fRecheck 590;
            }
            else if(
fTemperature <= -15.0f)
            { 
// Si la temperature est inferieure ou egale a -15 degres
                
nDamage d6(1); // 2D6 de dommage
                
fRecheckMod fRecheck 500;
            }
            else if(
fTemperature <= 5.0f)
            { 
// Si la temperature est inferieure ou egale a 5 degres
                
nDamage d6();    // 1D6 de dommage
                
fRecheckMod fRecheck;
            }
            
SendMessageToPC(oPC"Vous êtes victime du froid, il fait " FloatToString(fTemperature180) + "°C." FloatToString(fRecheckMod180) + FloatToString(fRecheck180));
            
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC);
            
// On sauvegarde les degats effectues
            
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
        }
        
DelayCommand(fRecheckModsetAreaTemperature(oPCfTemperaturefRecheckFALSE));
    }
}
void main()
{
    
// On recupere l'objet entrant
    
object oEntering GetEnteringObject();
    
// On defini la temperature de oEntering a -40 degres, et
    // reverification chaque 5 secondes
    
setAreaTemperature(oEntering, -30.0f600.0f);




Alors voilà ici il n'y a que la 1ère partie du script. Ma question est, pourquoi celui ci s'arrete apres un jet réussi? tant que le jet de vigueur est un échec le delay DelayCommand(fRecheckMod, setAreaTemperature(oPC, fTemperature, fRecheck, FALSE)); fonctionne dès que le jet est une réussite le script est stoppé et la fonction n'est pas relancé.


Arrivé a ce stade c navrant quand même.... please
c cool j'arrive a répondre a mes propres questions mouhahaha :



Code PHP:

 void setAreaTemperature(object oPCfloat fTemperaturefloat fRecheck 600.0fint bFirst TRUE) {
    
//if(!GetIsPC(oPC)) return; Modification: Retirer les // pour rendre le script effectif uniquement sur un joueur
    
if(bFirst)
    {
        
// On enregistre dans la variable locale fTemperature la temperature du
        // joueur, au cas ou, pour une utilisation hors de cette fonction.
        
SetLocalFloat(oPC"fTemperature"fTemperature);
        
// On sauvegarde la zone ou le joueur se trouvait, pour pouvoir lui
        // rendre ses points de vie une fois qu'il en aura change.
        
SetLocalString(oPC"sTemperatureArea"GetName(GetArea(oPC)));
        
// On fait effectuer au joueur le jet de vigueur contre le froid, avec
        // pour DD 15 + nombre de fois que le joueur a fait un jet de vigueur
        // pour des raisons de temperature.
    
}
    
// Si on est toujours dans la meme zone froide
    
if(GetName(GetArea(oPC)) == GetLocalString(oPC"sTemperatureArea"))
    {
 
            
float fRecheckMod fRecheck;
            
int nDamage 0;
            if(
fTemperature <= -30.0f)
            { 
// Si la temperature est inferieure ou egale a -30 degres
                
nDamage d6(1); // 3D6 de dommage
                
fRecheckMod fRecheck 590;
            }
            else if(
fTemperature <= -15.0f)
            { 
// Si la temperature est inferieure ou egale a -15 degres
                
nDamage d6(1); // 2D6 de dommage
                
fRecheckMod fRecheck 500;
            }
            else if(
fTemperature <= 5.0f)
            { 
// Si la temperature est inferieure ou egale a 5 degres
                
nDamage d6();    // 1D6 de dommage
                
fRecheckMod fRecheck;
            }
 
 
        
int nSave FortitudeSave(oPCGetLocalInt(oPC"nTemperatureShooted") + 15SAVING_THROW_TYPE_COLD);
        
// On sauve que le joueur a fait un jet de vigueur pour les prochaines fois
        
SetLocalInt(oPC"nTemperatureShooted"GetLocalInt(oPC"nTemperatureShooted") + 1);
        
// On verifie si le joueur a reussi son jet (ou s'il est immunise aux degats
        // de froid), dans ce cas on ne fait pas de dommages. Sinon...
 
        
if(!(nSave >= 1))
        {
            
SendMessageToPC(oPC"Vous êtes victime du froid, il fait " FloatToString(fTemperature180) + "°C." FloatToString(fRecheckMod180) + FloatToString(fRecheck180));
            
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(nDamageDAMAGE_TYPE_COLD), oPC);
            
// On sauvegarde les degats effectues
            
SetLocalInt(oPC"nTemperatureDamaged"nDamage);
        }
        
DelayCommand(fRecheckModsetAreaTemperature(oPCfTemperaturefRecheckFALSE));
    }
}
void main()
{
    
// On recupere l'objet entrant
    
object oEntering GetEnteringObject();
    
// On defini la temperature de oEntering a -40 degres, et
    // reverification chaque 5 secondes
    
setAreaTemperature(oEntering, -30.0f600.0f);




NB: mouhahaha vous foutez pas de moi j'écris des scripts depuis a peine deux semaines et encore
Répondre

Connectés sur ce fil

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