[SCRIPT] Armures qui rouillent

Répondre
Partager Rechercher
Voici une base que je vous propose pour un systeme d'armures qui rouillent.

Des améliorations sont nécessaires, je cherche a ne faire rouiller que les armures de CA de 5 et plus, en dehors des bonus magiques.

Yen a marre des GB qui courent de partout en armures a plaques... A noter que les armures magiques sont aussi affectées... faut bien les bichonner de temps en temps...

Sur un Onenter d'un declencheur générique que j'ai nommé declencheur de rouille :

Code PHP:

void main()
{
object oPC GetEnteringObject();
object oArmor GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);

if((
GetIsObjectValid(oArmor)==TRUE)&&(GetItemACValue(oArmor)>7)&&(GetIsPC(oPC)==TRUE))
    {
    if(
d100(1)>50)
        {
        
SetLocalInt(oPC,"rouille",TRUE);
        
SetLocalInt(oArmor,"armure_rouille",TRUE);
        }
    }

Créons un script "include" nommé sur mon module "markhor_rouille" :

Code PHP:

void CheckRust(object oPC)
{
object oArmor GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
if(
GetLocalInt(oPC,"rouille")==TRUE)
    {
    
int iCompteur GetLocalInt(oPC,"compt_rouille");
    if(
iCompteur<15)
        {
        
iCompteur iCompteur+1;
        
SetLocalInt(oPC,"compt_rouille",iCompteur);
        }

    if(
iCompteur>=15)
        {
        
SetLocalInt(oPC,"rouille",FALSE);
        
DeleteLocalInt(oPC,"compt_rouille");
        if(
GetLocalInt(oArmor,"armure_rouille")==TRUE)
            {
            
DeleteLocalInt(oArmor,"armure_rouille");
            
SetLocalInt(oArmor,"PENALTY_ARMOR_RUST",TRUE);
            }
            else
            {
            
object oRusted GetFirstItemInInventory(oPC);
            while(
GetIsObjectValid(oRusted)==TRUE)
                {
                if(
GetLocalInt(oRusted,"armure_rouille")==TRUE)
                    {
                    
DeleteLocalInt(oRusted,"armure_rouille");
                    
SetLocalInt(oRusted,"PENALTY_ARMOR_RUST",TRUE);
                    }
                
oRusted GetNextItemInInventory(oPC);
                }
            }
        }
    }

object oArmor2 GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);

if(
GetLocalInt(oArmor2,"PENALTY_ARMOR_RUST")==TRUE)
    {
    
effect eRouille EffectSlow();
    
effect eRouille2 EffectAttackDecrease(2,ATTACK_BONUS_MISC);
    if(
d20(1)+5<GetAbilityScore(oPC,ABILITY_DEXTERITY))
        {
        if(
GetLocalInt(oPC,"avert_rouille")==FALSE)
            {
            
FloatingTextStringOnCreature("L'armure de "+GetName(oPC)+" est rouillee et se grippe...",oPC,TRUE);
            
SetLocalInt(oPC,"avert_rouille",TRUE);
            }
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eRouille,oPC,IntToFloat(d6(1)));
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eRouille2,oPC,IntToFloat(d6(1)));
        }
    }

ensuite, sur le OHB du module, il suffit de mettre la fonction "CheckRust(oPC)" dans une boucle chopant les joueurs les uns apres les autres, et où oPC est "l'objet" joueur :

Code PHP:


#include "markhor_rouille"
void main ()
{
object oPC GetFirstPlayer();
while(
GetIsObjectValid(oPC)==TRUE)
{
CheckRust(oPC);
oPC GetNextPlayer();
}

Voili, ensuite, on fout le declencheur sur TOUS les cours d'eau.

On pourrait imaginer un script ou une fonction supplémentaire qui verifie si il pleut .

En dernier lieu, on cree un objet que l'on nomme "fiole d'huile", dont le tag est .... "FioledHuile" et qui a comme propriété

utilisable une fois
lancer un sort > pouvoir unique

Quand le joueur a une armure qui est rouillée, il applique l'huile dessus (il clique avec le selecteur dessus)

et là le script dans le OnItemActivated est le suivant :

Code PHP:

if(GetTag(oActivItem) == "Fioledhuile")
    {
    
object oArmorRusted GetItemActivatedTarget();
    
DeleteLocalInt(oArmorRusted,"PENALTY_ARMOR_RUST");
    
FloatingTextStringOnCreature(GetName(oPlayer)+" enleve la rouille et la crasse qui s'est accumulee dans les plis et les articulations de son armure",oPlayer,TRUE);
    
SetLocalInt(oPlayer,"avert_rouille",FALSE);
    
DeleteLocalInt(oPlayer,"rouille");

    
AssignCommand(oPlayer,ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS,1.0f,12.0f));
    } 
oPlayer étant défini par GetItemActivator()... si je me souviens bien *a le cerveau qui rouille*

Le meme systeme est applicable avec les armures de cuir mal graissées...

Voili

A bientot avec toujours plus d'idées....
lol
Interressant je dois dire et rigolo
Bon en plus on devrait pouvoir changer la couleur du metal ce qui pourrait etre sympa...
Avec un petit
Code PHP:

object oModif CopyItemAndModify(oItemITEM_APPR_TYPE_ARMOR_COLOR,  ITEM_APPR_ARMOR_COLOR_METAL2X);
object oModif1 CopyItemAndModify(oModifITEM_APPR_TYPE_ARMOR_COLOR,  ITEM_APPR_ARMOR_COLOR_METAL1Y); 
avec X, Y une valeur de 1 à 63... a choisir la bonne couleur

Ensuite un petit truc que j'utilise assez souvent perso, pour eviter les script sur le OHB du module, je colle le script sur les PJ avec un
Code PHP:

ExecuteScript("nom_script"oPJ); 

et a la fin du script nom_script je relance le script avec un delay command (je suis pas sur d'être clair )

Ce qui fait que a la place d'avoir des script qui boucle tout le temps et pour tout le monde j'ai les script juste sur les PJ qui en ont besoins et uniquement eux... En plus pas oblige que cela soit fait toutes les 6s
Donc la typiquement pour tes PJ il suffirait de lancer le script quand les PJ s'equipent d'une armure lourde et de l'arreter quand ils ne la porte plus. (en ajoutant un test sur une variable locale stocke sur le PJ cela se fait tres bien)

On peut aussi lancer le script sur les armures en fait
Explique moi cette histoire de script qui boucle, ca m'a l'air bien...

A la limite, fait un fil qui en parle.

Merci mano !

J'ai pensé à la couleur, mais c'est un peu plus complexe dans le cas de Markhor, dans le sens où j'ai deja un script qui la modifie quand on s'equipe d'une cape. Et comme quand on reequipe le PJ avec l'armure copiée, le script veriifera si le PJ a une cape, et si oui.... il la copie pour mettre une cape... ca risque de faire des boucles de copie d'armure involontaires

Mais je vais tester ca, si j'ai le temps.

Merci pour ton enthousiasme.

Ca t'intéresse un script qui fait glisser les joueurs qui courent dans les cours d'eau gelés ?

Ca les fait glisser sur un test de dextérité loupé et les congele sur un test de constitution loupé...

+++
Bande de sadiques

J'ai, quant à moi, scripté des trous d'eau dans les marais où ils tombent et peuvent se noyer s'ils portent trop de barda dans le sac.
Ca doit avoir l'air con un niveau 40 avec une belle faux qui se noie dans un trou d'eau

Pour la différenciation des armures, j'y travaille et j'ai fait un fil sur le sujet, plus bas:

https://forums.jeuxonline.info/showthread.php?t=328603

La façon de faire de Garrath est ce qu'on appelle la récursivité. Une fonction s'appelle elle-même mais grâce à DelayCommand() on peut paramétrer la durée entre deux appels. J'utilise ça pour tous les calculs vitaux réguliers sur les PJs et les sauvegardes individuelles des personnages.

Exemple:

Code PHP:


void DecompteFroidGlacial
(object oPC);

void DecompteFroidGlacial(object oPC)
{
    
// Le PJ perd 1 pv toutes les 30 secondes a cause du froid glacial:
    
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectDamage(1DAMAGE_TYPE_COLD), oPC0.0);
    if ( 
GetIsObjectValid(GetItemPossessedBy(oPC"protec_froid")) ) return; // s'il recoit l'item, exit
    
DelayCommand(30.0DecompteFroidGlacial(oPC));

}


void main()
{
    
object oPC GetEnteringObject(); // Entree dans une zone glaciaire
    
if ( GetIsObjectValid(GetItemPossessedBy(oPC"protec_froid")) ) return; // s'il a l'item, exit
    
else DecompteFroidGlacial(oPC);

Ce n'est pas testé, mais ça montre l'esprit de la méthode. Toutes les 30 secondes, le PJ qui n'a pas l'item contre le froid prend 1pv de dégâts.
__________________
[Fr] Legundas - Les Jardins d'Oustandie.
Liberté totale de jeu dans le respect des autres
Bientôt sept ans d'existence
connexion directe pour jouer
Pas de hakpack requis. Seulement NWN + SoU + HotU. Version 1.69

Notre forum
et moi qui passe pour un sadique
Excellent, tout est bon, comme quoi les idée universelles ne sont pas toutes pour le bien de l'être .


bravo a vous.
__________________
Congnois toy toy mesme. Nulle gloire dans le sang inutile
lol
C clair tous des sadiques

Oui c effectivement le systeme de la recursivite
Je pense que c'est un tout petit mieux que le OHB car seule les objets (en terme d'objet nwn pas que les Items) interesses par le script le voient, et donc c pas une boucle qui va faire des test toutes les 6 s sur tous les objets du jeu

Euh dit Azmathiel, tes trous d'eau je trouve cela interressant aussi ... euh ils bougent en plus non?

Et oui Mayk, le script sur les cours d'eau gelée aussi ca m'interresse, justement j'ai une zone de froid extreme... les faire glisser en plus de mourrir de froid ca peut etre interressant
Attention, c'est une fausse récursivité.

Une vraie récursivité consiste effectivement en un rappel d'une fonction dans son corps elle-même. Or, ici, ce n'est pas exactement le cas, l'appel de la fonction est déposé sur la pile. Ce qui engendre quelques différences :
- Pas d'empilage d'adresse de retour infini lors d'une récursivité infinie. Et ça, ça vaut son pesant d'or .
- Problèmes éventuels si les DelayCommand se font casser par un ClearAllActions.

Il y a eu un long fil de Georg Zoeller sur le sujet il a quelques semaines / mois pour bien expliquer les avantages / désavantages d'une telle méthode. Et lui-même disait que son intérêt pour remplacer purement et simplement le OHB n'était pas un bon choix de programmation. Il faudrait retrouver ce fil, je n'ai plus tout en tête mais ses arguments se tenaient. D'un coté il y avait les "pour" le OHB et de l'autre les "pour" le OHB simulé.

Bref, pour ma part, j'ai opté pour l'utilisation de l'OHB pour sauver quelques données régulierement toutes les 6 secondes, comme les localisations des PC. Par contre, dès que je dois effectuer des opérations pseudo-récursives dont la différence en temps est largement supérieure à 6 secondes, je passe effectivement par ce système pseudo-récursif. Pour le moment, je n'ai pas eu à m'en plaindre .

Sinon les idées des armures qui rouillent et des trous sont excellentes .
excellentissime
de plus

de blam
Citation :
et moi qui passe pour un sadique
c'est une certitude, et je vois avec quel empressement tu as applaudit des deux main.

Plus sérieusement, bravo; deux belles idées, des beaux scripts
__________________
Le bonheur ne fait que passer, mais on peut le suivre.
salut les sado

Azmathiel : très rigolo, les dommages dus au froid, et facilement réversible, pour les déserts.

sinon, je pense que tu dois utiliser les amulettes de protection contre les éléments ? tu devrai rajouter le tag de l'amulette de protection contre le froid.

en tant que joueur, j'aurai les boules de me cailler les miches, alors que j'ai investi dans le dit médaillon.

parce que a priori ton "protec_froid" est un objet particulier, genre manteau fourré ? je me trompe ?
Perso je gere aussi des zones a climat extreme

Et pour le froid j'ai ete encore plus sadique, en fonction de leur constitution, je leur fait subir des dommages de froids, je les ralentis, perte de force et de constitution ... j'arrive pas a les faire trembler mais bon ... ce qui fait queplus longtemps ils restent dans la zone et pire c pour eux...
J'envisage meme de faire une zone qui serait une passe en montagne qui serait 'facile' en été et quasi impraticable en hiver

Je gere meme 3 niveau de froid avec des objets qui ont du coup aussi 3 niveaux de protection...

Et effectivement je pense faire la meme chose mais pas avec les memes degats pour un desert par exemple

J'ai aussi deja des zones toxiques mais la les degats sont en plus permanents... faudra trouver un un ermite pour se soigner ...
Citation :
Provient du message de Garrath
je leur fait subir des dommages de froids, je les ralentis, perte de force et de constitution ...
Tu passes par le OHB pour ça j'imagine, comme dans l'OC ?

Ca m'ennuie toujours de mettre des trucs sur l'OHB quand même.
Non je passes par le simili systeme de recursitvite... j'associe le script au PJ et je le relance par un delaycommand a la fin
avec un delaycommand...
En fait je gere les niveaux de froid sur le temps du delayCommand
Je fais un truc du style (niveau_froid_zone - niveau_protection_froid)*temps

Bien sur si niveau_froid_zone - niveau_protection_froid < 0 le script ne se relance pas


euh c quoi l'OC?
Ok oui, c'est effectivement une solution bien meilleure .

L'OC : Official Campaign, dans un des actes, le PC est dans les "Frozen Wastes", désolée, j'ai la VO , et il reçoit des dommages toutes les 6 secondes s'il n'a pas les objets adéquats pour se protéger.
@Malicene:

Les dégâts appliqués sont de froid (DAMAGE_TYPE_COLD), par conséquent, les protections magiques doivent s'appliquer. Y compris les médaillons de base qui offrent des protections 15/- contre les éléments.
L'item en question peut être ce que tu veux. Il suffit de lui appliquer le Tag qui est testé.


@Sherazade:

Le DelayCommand() influencé par un ClearAllActions() ?
Il me semblait que cela ne faisait que vider la pile d'actions de l'objet appelé en référence ?
Effectivement, si tu appelles un DelayCommand() par un ActionDoCommand(), ça peut être le cas... Mais pas autrement. Enfin, je ne l'ai pas constaté.


@Garrath

Non, les trous ne bougent pas, ce sont des triggers et on ne peut pas les retracer. On pourrait en effet cribler les zones de triggers et les activer successivement grâce à des variables locales, mais dans le design, ce n'est pas pratique du tout.
Je m'explique: pour respecter une certaine logique, je les dessine uniquement DANS l'eau, or, ils sont quasi invisibles. C'est dès lors très difficile de travailler sur un enchaînement logique après un plaçage manuel obligatoire.
Et personnellement, je vais toujours au plus simple. Si dans 6 mois, je dois me repencher sur tel ou tel truc et qu'il me faille une encyclopédie de documentation, je serais mal, très mal. Donc, je privilégie toujours la simplicité pour la relecture et la compréhension des choses.
Il faut que je pense à ma vieillesse, qui sait, bientôt Alzheimer ?
__________________
[Fr] Legundas - Les Jardins d'Oustandie.
Liberté totale de jeu dans le respect des autres
Bientôt sept ans d'existence
connexion directe pour jouer
Pas de hakpack requis. Seulement NWN + SoU + HotU. Version 1.69

Notre forum
Effectivement d'apres moi le DelayCommand n'est pas enleve de la pile car sinon apres un combat, mon PJ ne subirait plus de degats due au froid...

Argh ouai si y a bien un truc de chiant c qu'on ne peut pas faire apparaitre des triggers ou et quand on veut! Ca c bien dommage...
Répondre

Connectés sur ce fil

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