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 13:00:47
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 |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
Bonjour bonjour !
Je vous explique le problème auquel je voudrais que vous m'aidiez... Je cherche a créé un objet qu'un PJ pourra avoir par dialogue ou par DM qui ne serait pas lachable. Il servirais a transformer le PJ en werewolf (grâce à la fonction POLYMORPH_WEREWOLF ) avec des bonus a ses caractéristiques (une force de 30, dextérité de 25, discrétion de 20 etc...) mais tout cela, seulement la nuit mais que la transformation ne se fasse pas lorsque le PJ est en intérieur... Si vous pouviez m'expliquer comment faire ça... (pas me donner le script tout préparer, parce que je m'amméliorerais jamais en script sinon. ) Merci d'avance ! |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Comment faire :
Citation : Un joueur entre sur le module. Si celui ci à le tag de l'objet de loup-garous alors executer le script "loup_garou".
Si tu as des problèmes il y a (exactement) ce que tu veux ici : http://www.system-tek.com/nwinter//phpbb2/viewtopic.php?t=9174.
Dans le script loup_garou, mettre les éléments clés (bonus / malus selon les désires) Une fois le script loup_garou terminé, attendre 60 secondes et réexecuté le script loup_garou. Enfin c'est pas pour les loups-garous mais pour les vampires, le principe est le même. |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
oki, je regarderais ça dès que j'aurais le temps ! Merci !
|
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
Reboujour !
Voilà, avec le script de base que vous m'avez donnez, j'ai réussi a faire ça : 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 griffe de loup-garou if(HasItem(oJoueur, "griffegarou") == TRUE) { object oZone = GetArea(oJoueur); if(GetIsAreaInterior(oZone) == TRUE) { //Le joueur est dans une zone interieur : BONUS appliquerMalus(oJoueur); } else // Non, alors le joueur est a l'exterieur { // Si c'est le jour if(GetIsNight() == TRUE) { 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, 20); effect eBonusForce = EffectAbilityIncrease(ABILITY_STRENGTH, 20); effect EffectPolymorph(POLYMORPH_WEREWOLF); effect EffectHeal(int 5DamageToHeal); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusCons, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusForce, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT; EffectPolymorph, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT; EffectHeal, oJoueur); } // Fonction qui applique les malus void appliquerMalus(object oJoueur) { SetLocalInt(oJoueur, "MALUS_APPLIQUE", 1); if(GetLocalInt(oJoueur, "BONUS_APPLIQUE") == 1) { RemoveEffects; } } /* warning: 1 unclosed block {} */ Mais le problème, c'est qu'il ne se compile pas... Le problème est a a ligne 44. Alors, une fois de plus, je fais appelle a vos compétences ô combien plus élevée que les miennes ! Merci d'avance ! EDIT : J'ai mis a jour mon script, mais toujours le problème de la ligne 44 ! Dernière édition par SephirothFr le 15/07/2006 00:08:34; édité 1 fois
|
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 griffe de loup-garou if(HasItem(oJoueur, "griffegarou") == 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) { 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, 20); effect eBonusForce = EffectAbilityIncrease(ABILITY_STRENGTH, 20); effect ePolymorph = EffectPolymorph(POLYMORPH_TYPE_WEREWOLF); effect eHeal = EffectHeal(5); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusCons, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusForce, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePolymorph, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHeal, oJoueur); } Là ça compile. Mais bon je pige pas tout, là tu le polymorphise de jour ou à l'interieur, je pensais que tu voulais l'inverse. Je comprends pas non plus le truc "MALUS_APPLIQUE", comme c'est fait le if sert à rien, puisque tu le fixe juste avant à 1, et je vois pas non plus ce que tu retire. |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
Lol, bah il faut croire que j'me suis cracké quelque part...
Le but, c'est que la nuit : le PJ se transforme en Loup garou avec 20 de constitution, 20 de force et une régénération de 5 par round. Mais que le jour ou en intérieur, il ne subisse aucuns effets de la malédiction... Mais visiblement... j'ai zappé un épisode... J'me repenche dessus tout de suite ! (J'ai pris en compte ton script, merci beaucoup ! ) |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
Je me suis repenché dessus, et grâce a toi, Sith Vicious, il compile parfaitement... jusqu'à la ligne 71 !
En tout cas, j'ai réglé (je pense) les problèmes de jour/nuit ! Voici le script : 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 griffe de loup-garou if(HasItem(oJoueur, "griffegarou") == TRUE) { object oZone = GetArea(oJoueur); if(GetIsAreaInterior(oZone) == TRUE) { //Le joueur est dans une zone interieur : MALUS appliquerMalus(oJoueur); } else // Non, alors le joueur est a l'exterieur { // Si c'est la nuit if(GetIsNight() == TRUE) { 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, 20); effect eBonusForce = EffectAbilityIncrease(ABILITY_STRENGTH, 20); effect ePolymorph = EffectPolymorph(POLYMORPH_TYPE_WEREWOLF); effect eHeal = EffectHeal(5); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusCons, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusForce, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePolymorph, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHeal, oJoueur); } // Fonction qui applique les malus void appliquerMalus(object oJoueur) { SetLocalInt(oJoueur, "MALUS_APPLIQUE", 1); if(GetLocalInt(oJoueur, "BONUS_APPLIQUE") == 1) { effect RemoveEffect(object oJoueur); } } |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. C'est cette ligne, elle veut rien dire. Plusieurs trucs : là tu ne leur donne pas 20 en constit et 20 en force, mais un bonus de 20 qui s'ajoute à leur force et constit (en fait réduit à 12 puisque c'est le max de bonus). Pour l'ajuster, ça se règle dans le polymorph.2da qui donne les valeurs des carac selon le type de polymorph que tu appliques. EffectHeal c'est du soin, pas de la regen. (EffectRegenerate) Pour virer tes effets, il faut boucler sur tous les effets du joueur. Le mieux c'est que tu te serve d'un truc avec un tag spécial pour les appliquer, comme ça tu retrouve avec GetEffectCreator() ceux qui sont concernés pour les enlever avec RemoveEffect(), sinon tu peux virer des trucs qui n'ont rien à voir. |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
Ok, j'ai changé le systeme de bonus, et de la régénération, enfin pas trop parce que il y a un truc qui cloche dnas la ligne de regen... j'ai essayé pleins de trucs, mais ça marche pas ! J'pensais pas que c'était aussi long de faire un script aussi con !
Voilà ce que j'ai mis : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Sinon, Sith Vicious, au risque de passer pour un boulet... j'ai pas compris ce que tu veux dire pas ça : Citation : Pour virer tes effets, il faut boucler sur tous les effets du joueur. Le mieux c'est que tu te serve d'un truc avec un tag spécial pour les appliquer, comme ça tu retrouve avec GetEffectCreator() ceux qui sont concernés pour les enlever avec RemoveEffect(), sinon tu peux virer des trucs qui n'ont rien à voir. |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Faut juste que tu rentres les paramètres correctement quand tu utilises les fonctions, là tu laisse les commentaires et tout.
T'as la définition de la fonction : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. nAmount c'est le nombre de pv que tu veux faire récupérer, fIntervalSeconds c'est le temps en secondes entre chauqe gain. Donc si tu veux 5 points par round, tu fais : NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Pour le truc des effets. Tu crèes un objet ou une créature de TAG "MACHIN_POLYMORPH" Dans ton script, tu lui fais lancer appliquerBonus, comme ça c'est lui qui crée l'effet : NWScript :
object oCreator = GetObjectByTag("MACHIN_POLYMORPH"); AssignCommand(oCreator,appliquerBonus(oJoueur)); ensuite, quand tu veux retirer les effets du joueur, tu fais une fonction : NWScript :
void RemoveSpecificCreatorEffect(object oJoueur, object oCreator); { effect eEffect = GetFirstEffect(oJoueur); while (GetIsEffectValid(eEffect)) { if (GetEffectCreator(eEffect) == oCreator) RemoveEffect(eEffect); eEffect = GetNextEffect(oJoueur); } } Comme ça tu retires bien les effets que tu veux, et ceux là seulement. |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
Merci beaucoup Sith !
Voilà mon script est fini ! (je pense, si vous voyez pas une ligne de mauvaise ) Mais j'arrive pas a le tester ! J'ai mis la nuit a 20, je démarre a 19 (le temps de récupérer la peau de loup garou quoi...) mais quand il fait nuit, rien ne se déclanche ! Alors j'me suis dit qu'il fallais que je fasse une transition... Je suis passé d'une zone d'intérieur a une d'extérieur et la, surprise ! Il est toujours 20h et le jour est levé ! De quoi devenir fou ! Donc, voila le script : 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 griffe de loup-garou if(HasItem(oJoueur, "griffegarou") == TRUE) { object oZone = GetArea(oJoueur); if(GetIsAreaInterior(oZone) == TRUE) { //Le joueur est dans une zone interieur : BONUS ; } else // Non, alors le joueur est a l'exterieur { // Si c'est la nuit if(GetIsNight() == TRUE) { 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, 5); effect eBonusForce = EffectAbilityIncrease(ABILITY_STRENGTH, 5); effect ePolymorph = EffectPolymorph(POLYMORPH_TYPE_WEREWOLF); effect eRegenerate = EffectRegenerate(5, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusCons, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusForce, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePolymorph, oJoueur); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eRegenerate, oJoueur); } |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Alors ton script est bon, mais quelques choses :
1: si tu la testé dans un trigger laisse tomber, il faut pas mettre GetFirstPC();, mais GetEnteringObject(); sans le While et tout le blabla. 2: je sais pas si HasItem il est demandé la ref (en minuscule c'est en génerale la ref) alors tu mets plutot en majuscule, et n'oublie pas de faire de même pour le tag de ta griffe 3: GetIsAreaInterior(); ou ta pioché ça toi? j'ai pas ça dans mes fonctions O.o 4: t'aurais pas oublier de mettre "appliquermalus" je vois que "appliquerbonus" ... bref le 1 laisse tomber, ta pas besoin d'un trigger, ta juste a mettre ce script dans le HB du module (heartbeat), et enleve GetIsAreaInterior(); ça métonne que ça existe, si ça existe dit moi ou tu la pioché lol et le 4 fait ce que tu veux, mais tout doit être dans le tag de ta griffe pour moi. Voila _________________ [http] |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Avant de poster, tu regarde la définition de HasItem : c'est le tag qui est demandé, or son tag est bien en minuscules, même si c'est pas courant, chacun fait comme il veut.
Tu peux même aller jusqu'à ouvrir l'éditeur et taper Interior dans la recherche de fonction et là, ô miracle, tu verras que GetIsAreaInterior() existe bel et bien depuis pas mal de temps (1.64 par là, ptet même avant), le lexicon est plus mis à jour depuis bien longtemps. |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
moi je l'ai pas, mais tous les modules que j'ai son sans CEP c'est pour ça alors... mais dans NWScript il apparait en bleu foncer, donc NWScript connait pas aussi xD
et si je me souviens bien aussi : ActionWait(); ne marche pas sur HB ... enfin moi on me l'avait dit hein... _________________ [http] |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Pour le ActionWait t'as raison, mais à moins que t'ai pas mis à jour NWN depuis plus de deux ans, GetIsAreaInterior tu l'as comme tout le monde.
Le CEP c'est qu'un hak, ça rajoute rien au NWScript quand même, et je m'en suis jamais servi non plus. |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
Merci beaucoup vous deux, mais juste une question de noob comme ça... c'est quoi un trigger ? un tigre ? (ouh ! je retourne me coucher moi... les blagues moches commencent déjà !)
|
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
C'est un déclencheur générique. Dans l'éditeur, dans la fenêtre de droite, survole les boutons et y'en a un nommé "Peindre les déclencheurs", tu clique, tu fais défiler la liste des "déclencheurs générique" et clique sur "nouveau générique" et tu dessine ton polygone.
En simple ca sert a faire une zone. On peux exploiter les triggers pour différentes choses : -Lorsque qu'un objet entre dans sa zone. -................... quitte sa zone. -................... clique sur sa zone. -................... est sur sa zone. -Et le fameux OnUserDefined. |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
ok, je vois ce que c'est maintenant, mais c'est quoi l'interet d'en mettre un là ?!
|
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Car tu parlais de transition et je pensé que tu parlais d'un trigger, mais je pense que tu parlais d'une porte..
_________________ [http] |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
Ouais, c'était une porte ! Bah, au moins, j'aurais appris un mot de votre vocabulaire au passage
|
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