La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 10:02:02
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
Salut, ça faisait longtemps hein ^^
Alors, je recherche un moyen de rendre un bracelet dit "vampire", qui soit non-déséquipable une fois en place sur un pj ou un pnj. Evidemment, il donne au pj tous les avantages des vampires, à savoir la régénération, la force etc... Mais je voudrais qu'il donne l'inconvenient majeur : le jour ! Si possible, je voudrais que à partir du moment où le jour se lève jusqu'a ce que le soleil se couche, s'ils sont en exterieur, tous les pj qui portent ce bracelet subissent des malus en FOR, DEX, et CON (assez élevés). Si cela s'avère impossible, ou trop compliqué, je suis ouvert aux suggestions. merci ^^ (hop, post suivant ) +++ _________________ Asphia Module RP Médiéval Fantastique pour Neverwiner Nights Dernière édition par warpShadow le 17/07/2006 23:37:22; édité 1 fois
|
Revenir en haut | |
Harmelyo Chevalier Messages: 84 |
Ne serait il pas plus simple d'utiliser un objet "peau"(qui ne sera pas droppable vu que le joueur ne peux pas y accéder), plutot que d'occuper un emplacement d'equipement?
Ensuite ce qu'il faut savoir c'est que des bonus donnés par de l'équipement seront comptabiliser dans la limite de max de caractéristique (+12) de plus avec tout les immunités si ton module prend en charge la limitation des objets il faudra avoisiner le Lvl 30 pour porter l'objet en question (déjà testé ). Je te conseillerais plutot d'utiliser une peau, ainsi qu'un test dans le onEnter des zones pour réaffecter les caractéristiques par script de cette manière pas de surprises. Pour ce qui est des effets du soleil, à mon niveau je vois deux gros moyens de gérer sa: - la méthode lourde: en utlisant un onheartbeat quelconque qui teste s'il fait jour, s'il s'agit d'un intérieur et affecte les caractéristiques en fonction de. Attention d'ajouter aussi une variable locale pour eviter les effets negatifs cumulatifs, mais aussi à prévoir un test pour retirer les effets à la nuit tombante ou en entrant dans un intérieur ect... - la méthode légère: qui consiste à n'effectuer le test que sur un évènement lancer moins fréquement, le onEnter de tes zones par exemple. Le test est similaire. Avantages et inconvenients: -méthode lourde: le script risque de devenir très gourmand en ressource et de plomber le serveur (je ne sais pas dans quel mesure je n'ai pas fait de calcul ou de test sur le sujet). Au moins avec cette méthodepas de risque de voir un vampire en plein jour sans malus pour plus de 6 secondes -méthode légère: le script sera beaucoup plus léger et ne devrait pas affecter le serveur plus qu'un autre script. En revanche, si le vampire ne quitte pas la zone pendant longtemps(cas onEnter), il ne se verra aps affecter par les effets si le soleil se lève. Voili voilou |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Bon je t'ai fait le script, il marche bien, pour la lourdeur je pense que c'est pas le plus optimisé qui soit (c'est pas terrible non plus).
Il y a largement moyen de l'améliorer, d'ailleurs je pense que c'est une bonne idée, donc je vais peut être me pencher dessus pour t'en faire un meilleur , il faudrait juste que tu donne plus de précision. En attendant celui ci est bien il marche dans les zones extérieur (jour ou nuit) et intérieur (vu comme nuit), et les bonus / malus ne se cumulent pas. 1 : Tu crée un objet de peau comme là dit Harmelyo, le tag j'ai mis "TAG_DE_LA_PEAU_DE_VAMPIRE". 2 : Tu met le script dans le OnHeartBeat du module. heartbeat_module : NWScript : #include "nw_i0_plot" #include "x0_i0_petrify" void appliquerBonus(object oJoueur); void appliquerMalus(object oJoueur); void main() { object oJoueur = GetFirstPC(); // On passe en revue tous les joueurs while(oJoueur != OBJECT_INVALID) { // Si le joueur a la peau de vampire if(HasItem(oJoueur, "TAG_DE_LA_PEAU_DE_VAMPIRE") == TRUE) { object oZone = GetArea(oJoueur); if(GetIsAreaInterior(oZone) == TRUE) { //Le joueur est dans une zone interieur : BONUS appliquerBonus(oJoueur); } else // Non, alors le joueur est a l'exterieur { // Si c'est le jour if(GetIsDay() == TRUE) { appliquerMalus(oJoueur); } // Non, alors c'est la nuit else { appliquerBonus(oJoueur); } } } oJoueur = GetNextPC(); } ActionWait(10.0); } // Fonction qui applique les bonus void appliquerBonus(object oJoueur) { SetLocalInt(oJoueur, "BONUS_APPLIQUE", 1); if(GetLocalInt(oJoueur, "MALUS_APPLIQUE") == 1) { RemoveEffectOfType(oJoueur, EFFECT_TYPE_ABILITY_DECREASE); SetLocalInt(oJoueur, "MALUS_APPLIQUE", 0); } effect eBonusCons = EffectAbilityIncrease(ABILITY_CONSTITUTION, 3); effect eBonusForce = EffectAbilityIncrease(ABILITY_STRENGTH, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusCons, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusForce, oJoueur); } // Fonction qui applique les malus void appliquerMalus(object oJoueur) { SetLocalInt(oJoueur, "MALUS_APPLIQUE", 1); if(GetLocalInt(oJoueur, "BONUS_APPLIQUE") == 1) { RemoveEffectOfType(oJoueur, EFFECT_TYPE_ABILITY_INCREASE); SetLocalInt(oJoueur, "BONUS_APPLIQUE", 0); } effect eMalusCons = EffectAbilityDecrease(ABILITY_CONSTITUTION, 3); effect eMalusForce = EffectAbilityDecrease(ABILITY_STRENGTH, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eMalusCons, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eMalusForce, oJoueur); } _________________ "Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit." |
Revenir en haut | |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
Salut !
Merci pour vos conseils et pour ce script Une question : Pour la peau, il faudrait la leur donner comment aux PJ ? Sinon, pour le script, serait-ce possible d'eviter le OHB du mod ? Sinon c'est pas grave, merci beaucoup Ah, et aussi, pour lui mettre l'effet régénération la nuit et l'enlever le jour, comment ce serait possible ? merci ^^ +++ _________________ Asphia Module RP Médiéval Fantastique pour Neverwiner Nights |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
warpShadow a écrit : Alors, je recherche un moyen de rendre un bracelet dit "vampire", qui soit non-déséquipable une fois en place sur un pj ou un pnj. Tu donne la peau de vampire tu l'as donne comme tu aurais donner le bracelet, dans ce que tu veux, dans un dialogue, à l'arrivé du serveur, le MD qui le donne manuellement.
Sinon éviter de mettre le script dans le OnHeartBeat du module c'est assez complexe, celle solution me semble quand même la plus sure. Et puis elle ne prend pas énormement de ressources puisque une fois que le script de bonus / malus à été éffectué, le module s'en souvient et passe outre à la prochaine boucle. Si tu veux qu'elle soit plus légère tu n'as qu'à augmenter le ActionWait(x.x) que j'ai placé à la fin. (j'ai mis 10.0 secondes, ca fait court...) 120.0 secondes semble correct, ni trop long (2 minute de marge sur le temps d'une nuit c'est rien), ni trop court. Ca ne rajoute que 1 script (peu conséquent) toutes les 2 minutes sur ton module, c'est rien . _________________ "Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit." |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Tiens d'ailleurs je viens de recompliquer le script en version light de chez light, certes un peu moins compréhensif .
NWScript : int HasItem(object oCreature, string s) { return GetIsObjectValid(GetItemPossessedBy(oCreature, s)); } void RemoveEffectOfType(object oTarget, int nEffectType) { effect eEff = GetFirstEffect(oTarget); while (GetIsEffectValid(eEff)) { if ( GetEffectType(eEff) == nEffectType) { RemoveEffect(oTarget, eEff); } eEff = GetNextEffect(oTarget); } } // Fonction qui applique les bonus void appliquerBonus(object oJoueur) { SetLocalInt(oJoueur, "BONUS_APPLIQUE", 1); if(GetLocalInt(oJoueur, "MALUS_APPLIQUE") == 1) { RemoveEffectOfType(oJoueur, EFFECT_TYPE_ABILITY_DECREASE); SetLocalInt(oJoueur, "MALUS_APPLIQUE", 0); } effect eBonusTemporaire = EffectAbilityIncrease(ABILITY_CONSTITUTION, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); eBonusTemporaire = EffectAbilityIncrease(ABILITY_STRENGTH, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); eBonusTemporaire = EffectRegenerate(1, 3.0); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); } // Fonction qui applique les malus void appliquerMalus(object oJoueur) { SetLocalInt(oJoueur, "MALUS_APPLIQUE", 1); if(GetLocalInt(oJoueur, "BONUS_APPLIQUE") == 1) { RemoveEffectOfType(oJoueur, EFFECT_TYPE_ABILITY_INCREASE); RemoveEffectOfType(oJoueur, EFFECT_TYPE_REGENERATE); SetLocalInt(oJoueur, "BONUS_APPLIQUE", 0); } effect eMalusTemporaire = EffectAbilityDecrease(ABILITY_CONSTITUTION, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eMalusTemporaire, oJoueur); eMalusTemporaire = EffectAbilityDecrease(ABILITY_STRENGTH, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eMalusTemporaire, oJoueur); } void vampireBonusEtMalus() { object oJoueur = GetFirstPC(); // On passe en revue tous les joueurs while(oJoueur != OBJECT_INVALID) { // Si le joueur a la peau de vampire if(HasItem(oJoueur, "TAG_DE_LA_PEAU_DE_VAMPIRE") == TRUE) { object oZone = GetArea(oJoueur); if(GetIsAreaInterior(oZone) == TRUE) { //Le joueur est dans une zone interieur : BONUS appliquerBonus(oJoueur); } else // Non, alors le joueur est a l'exterieur { // Si c'est le jour if(GetIsDay() == TRUE) { appliquerMalus(oJoueur); } // Non, alors c'est la nuit else { appliquerBonus(oJoueur); } } } oJoueur = GetNextPC(); } } void main() { vampireBonusEtMalus(); ActionWait(120.0); } _________________ "Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit." |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Juste : ActionWait sur un module ne sert à rien.
Plutot que le HB module, il vaut mieux faire un pseudo HB (un script qui s'appelle lui même avec un DelayCommand) pour uniquement les persos concernés. |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Tiens c'est vraiment pas bête ! Comme ca on fait la vérification de l'objet "peau de vampire" une fois, si c'est ok, eh bien le script se rappelle pour l'objet en question.
Voilà je crois que ya pas mieux merci Sith. _________________ "Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit." |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Bon bah voilà comme j'ai remodelé le script, ca marche impect et ca prend pas beaucoup de ressources comme tu le souhaitais.
Dans le OnEnterModule tu met ce script : NWScript :
int HasItem(object oCreature, string s) { return GetIsObjectValid(GetItemPossessedBy(oCreature, s)); } void main() { object oEntering = GetEnteringObject(); if(HasItem(oEntering, "TAG_DE_LA_PEAU_DE_VAMPIRE") == TRUE) ExecuteScript("vampire", oEntering); } Et là le script nommé "vampire" NWScript :
void RemoveEffectOfType(object oTarget, int nEffectType) { effect eEff = GetFirstEffect(oTarget); while (GetIsEffectValid(eEff)) { if ( GetEffectType(eEff) == nEffectType) { RemoveEffect(oTarget, eEff); } eEff = GetNextEffect(oTarget); } } // Fonction qui applique les bonus void appliquerBonus(object oJoueur) { SetLocalInt(oJoueur, "BONUS_APPLIQUE", 1); if(GetLocalInt(oJoueur, "MALUS_APPLIQUE") == 1) { RemoveEffectOfType(oJoueur, EFFECT_TYPE_ABILITY_DECREASE); SetLocalInt(oJoueur, "MALUS_APPLIQUE", 0); FloatingTextStringOnCreature("Les brulures qui marquent votre peau se dissipent et vous vous sentez mieux.", oJoueur, FALSE); } effect eBonusTemporaire = EffectAbilityIncrease(ABILITY_CONSTITUTION, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); eBonusTemporaire = EffectAbilityIncrease(ABILITY_STRENGTH, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); eBonusTemporaire = EffectRegenerate(1, 3.0); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); } // Fonction qui applique les malus void appliquerMalus(object oJoueur) { SetLocalInt(oJoueur, "MALUS_APPLIQUE", 1); if(GetLocalInt(oJoueur, "BONUS_APPLIQUE") == 1) { RemoveEffectOfType(oJoueur, EFFECT_TYPE_ABILITY_INCREASE); RemoveEffectOfType(oJoueur, EFFECT_TYPE_REGENERATE); SetLocalInt(oJoueur, "BONUS_APPLIQUE", 0); FloatingTextStringOnCreature("Le soleil brule votre peau, vous vous sentez affaibli.", oJoueur, FALSE); } effect eMalusTemporaire = EffectAbilityDecrease(ABILITY_CONSTITUTION, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eMalusTemporaire, oJoueur); eMalusTemporaire = EffectAbilityDecrease(ABILITY_STRENGTH, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eMalusTemporaire, oJoueur); } void main() { object oJoueur = OBJECT_SELF; object oZone = GetArea(oJoueur); if(GetIsAreaInterior(oZone) == TRUE) { //Le joueur est dans une zone interieur : BONUS appliquerBonus(oJoueur); } else // Non, alors le joueur est a l'exterieur { // Si c'est le jour if(GetIsDay() == TRUE) { appliquerMalus(oJoueur); } // Non, alors c'est la nuit else { appliquerBonus(oJoueur); } } DelayCommand(60.0, ExecuteScript("vampire", oJoueur)); } Il marche impect'. (note : les paroles "Vous vous sentez mieux ..." ou "Vous vous sentez affaiblie" elle n'arrive pas en boucle toutes les minutes elles flottent au dessus de la créature que lorsque des bonus / malus s'appliquent. _________________ "Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit." |
Revenir en haut | |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
Merci pour tout ça, ça va bien m'aider...
je demanderais juste si j'arrive pas à compiler avec un autre script qui est déjà sur le OnEnter. merci bien ^^ _________________ Asphia Module RP Médiéval Fantastique pour Neverwiner Nights |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
C'est pas parce qu'un script se compile qu'il marche comme on le souhaite. Je dis ca parce que j'ai peur que tu fasse ton module sans tester si les scripts sont fidèles à tes désirs, si c'est pas le cas tu vas avoir du mal à tous les refaires . Autant s'assurer avant.
_________________ "Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit." |
Revenir en haut | |
AZAZEL11 Seigneur Messages: 156 |
*onentermodule* ca existe pas, peut etre préciser si c'est OnClientEnter ou bien OnModuleLoad svp...
_________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
OnClientEnter
|
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Up le script a été mis à jour parce qu'il y avait un problème
Donc le script sur le OnEnterClient du module est toujours le même : NWScript :
int HasItem(object oCreature, string s) { return GetIsObjectValid(GetItemPossessedBy(oCreature, s)); } void main() { object oEntering = GetEnteringObject(); if(HasItem(oEntering, "TAG_DE_LA_PEAU_DE_VAMPIRE") == TRUE) ExecuteScript("vampire", oEntering); } Et le script nommé "vampire" ayant subit quelques modifications (assez importantes ) : NWScript : // Enleve un effet de type nEffectType void RemoveEffectOfType(object oTarget, int nEffectType); // Applique les bonus sur le vampire void appliquerBonus(object oJoueur); // Applique les malus sur le vampire void appliquerMalus(object oJoueur); void main() { object oJoueur = OBJECT_SELF; object oZone = GetArea(oJoueur); if(GetIsAreaInterior(oZone) == TRUE) { //Le joueur est dans une zone interieur : BONUS appliquerBonus(oJoueur); } else // Non, alors le joueur est a l'exterieur { // Si c'est le jour if(GetIsDay() == TRUE) { appliquerMalus(oJoueur); } // Non, alors c'est la nuit else { appliquerBonus(oJoueur); } } DelayCommand(5.0, ExecuteScript("vampire", oJoueur)); } void RemoveEffectOfType(object oTarget, int nEffectType) { effect eEff = GetFirstEffect(oTarget); while (GetIsEffectValid(eEff)) { if ( GetEffectType(eEff) == nEffectType) { RemoveEffect(oTarget, eEff); } eEff = GetNextEffect(oTarget); } } void appliquerBonus(object oJoueur) { // On enleve les malus if(GetLocalInt(oJoueur, "MALUS_APPLIQUE") == 1) { RemoveEffectOfType(oJoueur, EFFECT_TYPE_ABILITY_DECREASE); SetLocalInt(oJoueur, "MALUS_APPLIQUE", 0); FloatingTextStringOnCreature("Les brulures qui marquent votre peau se dissipent et vous vous sentez mieux.", oJoueur, FALSE); } // On applique les bonus UNE SEULE FOIS (un probleme etait la ) if(GetLocalInt(oJoueur, "BONUS_APPLIQUE") == 1) { effect eBonusTemporaire = EffectAbilityIncrease(ABILITY_CONSTITUTION, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); eBonusTemporaire = EffectAbilityIncrease(ABILITY_STRENGTH, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); eBonusTemporaire = EffectRegenerate(1, 3.0); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusTemporaire, oJoueur); SetLocalInt(oJoueur, "BONUS_APPLIQUE", 1); } } void appliquerMalus(object oJoueur) { // On enleve les bonus if(GetLocalInt(oJoueur, "BONUS_APPLIQUE") == 1) { RemoveEffectOfType(oJoueur, EFFECT_TYPE_ABILITY_INCREASE); RemoveEffectOfType(oJoueur, EFFECT_TYPE_REGENERATE); SetLocalInt(oJoueur, "BONUS_APPLIQUE", 0); FloatingTextStringOnCreature("Le soleil brule votre peau, vous vous sentez affaibli.", oJoueur, FALSE); } effect eMalusTemporaire; // On applique les bonus UNE SEULE FOIS (un probleme etait aussi la ) if(GetLocalInt(oJoueur, "MALUS_APPLIQUE") == 0) { eMalusTemporaire = EffectAbilityDecrease(ABILITY_CONSTITUTION, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eMalusTemporaire, oJoueur); eMalusTemporaire = EffectAbilityDecrease(ABILITY_STRENGTH, 3); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eMalusTemporaire, oJoueur); SetLocalInt(oJoueur, "MALUS_APPLIQUE", 1); } // Le vamp' subit 1 de degats lorsqu'il est au soleil (damage divin) eMalusTemporaire = EffectDamage(1, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_NORMAL); ApplyEffectToObject(DURATION_TYPE_INSTANT, eMalusTemporaire, oJoueur); } |
Revenir en haut | |
warpShadow Légende vivante Messages: 363 Localisation: Perpignan |
Lol merci, mais j'aurais du marquer résolu, j'utilise désormais un systeme qui modifie l'ethnie à la morsure garou et vampire, et ça prend tout en charge:grin:
merci néanmoins, et désolé +++ _________________ Asphia Module RP Médiéval Fantastique pour Neverwiner Nights |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Page 1 sur 1 ¤
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum