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 22:00:25
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 |
Khorgan Ecuyer Messages: 67 |
Bonjour,
Je voudrais faire interragir 3 pnj : 2 combattants (A et B) et un healer. Je souhaiterai que les 2 combattants... combattent ^^ (ça j'arrive à le faire) et qu'une fois le combat fini (A ou B est mort) le healer ressucite le combattant décédé et heal l'autre. Enfin, je voudrais que le combat entre A et B reprenne. Si quelqu'un a une idée, je suis preneur ^^ Merci d'avance |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
Bonjour,
Est-il nécessaire que le perso meure vraiment, ou est il possible que ce ne soit qu'une animation ? Qu'est-ce qui déclenche le scène, un trigger, une date précise ? J'essaie de faire ça ce soir, si d'ici là tu as plus d'info vas-y. Voilà ! |
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Tout d'abord merci pour ta réponse
Alors ce qui déclenche l'anim : à la base c'est du "onspawn" (la scène se passe dans une salle d'entrainement d'un monastère, quand on arrive dans la salle on voit les pnj s'entrainer au combat). Mais si tu penses que c'est mieux de le faire démarrer sur un trigger (à l'entrée de la salle par exemple), np, je suis ouvert à toutes propositions. Non le pnj n'est pas obligé de mourir. Le top ce serait même que le combat se stop quand un des pnj n'a plus que quelques points de vie (voir quand il passe "agonisant" mais je ne sais pas si c'est possible), que le healer soigne les 2 combattants puis que l'entrainement recommence. Si tu as besoin d'autres précisions n'hésite pas à me les demander |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
Bon, j'ai fait un petit module de démo pour voir comment faire.
J'ai déclenché la scène par un trigger, et j'ai mis un script sur le onDeath des persos pour que le healer les ressuscite, et les soignent, ça marche sans problème. Faire en sorte que le combat s'arrete lorsque leurs points de vie sont en bas c'est faisable mais plus complexe, à toi de voir. Bon, pour cette scène trois PNJ : - 2 combattants avec le tag "A" et "B". - 1 prêtre avec le tag "healer". - Les persos doivent avoir une nouvelle faction neutre les uns envers les autres. - 1 trigger carré assez grand sur lequel on place les pnj. Dans le onEnter du trigger : NWScript :
void main() { object oPC=GetEnteringObject(); object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); if (GetIsPC(oPC)) { AssignCommand(oA,ActionAttack(oB)); AssignCommand(oB,ActionAttack(oA)); SetIsTemporaryEnemy(oA,oB); SetIsTemporaryEnemy(oB,oA); } } Dans le onExit pour que les PNJs ne se battent pas à l'infini : NWScript :
void main() { object oPC=GetExitingObject(); object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); if (GetIsPC(oPC)) { AssignCommand(oA,ClearAllActions(TRUE)); AssignCommand(oB,ClearAllActions(TRUE)); } } Dans le onDeath du perso dont le tag est "A" : NWScript :
void main() { object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); SetIsDestroyable(FALSE, TRUE, TRUE); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_RAISE_DEAD,oA,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT)); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_HEAL,oB,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_HEAL,oA,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); ClearPersonalReputation(oA,oB); ClearPersonalReputation(oB,oA); DelayCommand(4.0,AssignCommand(oA,ActionAttack(oB))); DelayCommand(4.0,AssignCommand(oB,ActionAttack(oA))); } Dans le onDeath du perso "B" : NWScript :
void main() { object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); SetIsDestroyable(FALSE, TRUE, TRUE); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_RAISE_DEAD,oB,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT)); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_HEAL,oA,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_HEAL,oB,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); ClearPersonalReputation(oA,oB); ClearPersonalReputation(oB,oA); DelayCommand(4.0,AssignCommand(oB,ActionAttack(oA))); DelayCommand(4.0,AssignCommand(oA,ActionAttack(oB))); } Voilà, c'est tout ! Si ça ne te satisfaiT pas je peux essayer de faire autrement, avant que les PNJ ne meurrent par exemple, mais je pense que si c'est des moines, la résurrection, c'est plus sympa ! A bientôt ! |
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Merci beaucoup ça fonctionne nickel
Maintenant je me demande si il est possible d'améliorer ça, je m'explique : La salle dans laquelle ça se passe a une taille de 5 x 5. Au centre de cette salle il y a un tatami de 1 x 1. Je souhaiterai (si c'est possible) que le combat se déroule le plus possible sur le tatami, malheureusement les pnj ont une facheuse tendance à se déplacer loin de celui-ci. Serait-il possible de faire un script qui, si les pnj s'éloignent trop du tatami (trigger ?) le combat s'arrête, les pnj reviennent au centre et recommence le combat ? (ça me parait beaucoup mais bon ^^) Sinon, pour faire fonctionner ton script j'ai placé le trigger sur le tatami. Donc le combat ne s'engage que lorsque j'entre dessus. Donc pour que l'anim se déclenche dès mon entrée dans la salle je suis obligé de faire un trigger de la taille de la salle (mais bon ce n'est pas grave ça). Ensuite comme il y a différente chose à faire pour le pj dans cette salle, je ne voudrais que le combat continue tout le temps, donc soit je supprime le script du onexit (mais est-ce que ça ne va pas créer de problème) ou encore une fois je mets le trigger à la taille de la salle ? Voilà, et encore merci |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
Alors, pour le script de combat uniquement sur le tatami, pas de problème je m'en charge de suite.
Après, Je n'ai pas bien compris si tu voulais que le combat s'arrête quand le PJ reste dans la salle mais fait autre chose que regarder le combat ou au contraire si tu voulais qu'il continue mais sans avoir à fare un trigger de la taille de la zone. Si tu veux que le combat continue tant que le PJ est dans la zone, alors c'est simple : il suffit de mettre les scripts du onEnter et du onExit du trigger (l'enlever serait une erreur car il est gourmand en ressource à mon avis) dans le onEnter et onExit de la zone (dans les propriétés de celle-ci). Aprés bien sûr tu supprimes le trigger. Bon, dès que j'ai fini ce script pour le combat sur le tatami, je te l'envoie. et si tu veuxje peux même les faire se saluer comme au karate ! A plus tard ! |
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Génial, c'est super gentil de ta part
En fait je souhaite que le combat continue quoique fasse le pj, donc je vais tester le mettre les script sur les onenter/onexit de la zone Si tu arrives à les faire se saluer avant le combat ce serait tip top [Edit]: J'ai supprimé le trigger et j'ai mis les script onenter/onexit de ce dernier sur la zone. Il m'est alors arrivé 2 soucis : 1) Si les pnj A et B s'éloignaient trop du healer celui-ci ne réagissait pas à la mort d'un des deux (j'ai résolu ce problème en mettant la zone de perception du healer au max). 2) Une fois que le healer à ressucité le pnj mort et soigné l'autre, le combat ne reprend pas |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
Ce que tu me dis m'étonne car j'ai testé mon petit module de démo avec les scripts sur la zone et tout fonctionne comme avant. Tes persos ont-ils d'autres scripts onHeartbeat, onspawn, etc, que les scripts de base de bioware ?
Et la faction de tes persos est-elle neutre-neutre ? Si tu veux, tu peux m'envoyer ton mail par MP et je t'envoie le module démo que j'ai fait. Bon, je retourne à mon script du tatami. Au fait, ça-y-est, ils se saluent avant le combat. |
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Hmm oui mes pnj ont les scripts par défaut à l'exception du ondeath ou j'ai mis ceux que tu m'as passé.
Et c'est bizarre car avec le trigger ça fonctionnait nickel... Enfin je vais attendre la suite de tes scripts pour voir ^^ P.S : trop cool qu'ils se saluent avant de combattre, j'ai hate de voir ça |
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Ce qui est bizarre c'est qu'en fait, après la mort d'un des 2 combattants, le healer fait son boulot et le combat reprend uniquement si les pnj ne sont pas dans mon champs de vision :
Je vois le message indiquant que le healer lance son sort (mon pj est de dos par rapport aux combattants et ne les voit donc pas), et si je fait tourner la caméra pour voir ce qui se passe je vois les combattants qui ont repris le combat, mais ils s'arrêtent dès que je les vois (j'ai essayé de laisser plus ou moins de temps après l'action du healer et à chaque fois quand je fais pivoter ma caméra je les vois en train de combattre et s'arrêter immidiatement). J'espère que ce détail pourra t'éclairer un peu ^^ |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
J'ai rencontré (à force de le tester ) le bug dont tu parles et je pense avoir trouvé la solution. Enfin, je crois que c'est le SetIsTemporaryEnemy qui pose problème. j'y retourne et je corrige tout cela.
|
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Génial, c'est vraiment cool de ta part de me filer un coup de main comme ça
D'ailleurs je suis particulièrement impressionné par l'ambiance qui règne sur ce forum |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
Bon, cette fois-ci, je suis sûr de mon coup, alors voici les nouveaux scripts :
OnEnter de la zone : NWScript :
#include "nw_i0_plot" void main() { object oPC=GetEnteringObject(); object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); if (GetIsPC(oPC)) { DelayCommand(6.0,AssignCommand(oA,PlayAnimation(ANIMATION_FIREFORGET_BOW,1.0))); DelayCommand(6.0,AssignCommand(oB,PlayAnimation(ANIMATION_FIREFORGET_BOW,1.0))); DelayCommand(7.5,AssignCommand(oB,SetIsEnemy(oA))); DelayCommand(7.5,AssignCommand(oA,SetIsEnemy(oB))); } } onExit de la zone : NWScript :
void main() { object oPC=GetExitingObject(); object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); if (GetIsPC(oPC)) { AssignCommand(oA,ClearAllActions(TRUE)); AssignCommand(oB,ClearAllActions(TRUE)); ClearPersonalReputation(oB,oA); ClearPersonalReputation(oA,oB); } } OnDeath du pnj "A" : NWScript :
#include "nw_i0_plot" void main() { object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); SetIsDestroyable(FALSE, TRUE, TRUE); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_RAISE_DEAD,oA,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT)); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_HEAL,oB,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_HEAL,oA,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); DelayCommand(4.0,AssignCommand(oB,SetIsEnemy(oA))); DelayCommand(4.0,AssignCommand(oA,SetIsEnemy(oB))); } onDeath du PN "B" : NWScript :
#include "nw_i0_plot" void main() { object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); SetIsDestroyable(FALSE, TRUE, TRUE); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_RAISE_DEAD,oB,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT)); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_HEAL,oA,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); AssignCommand(oHealer, ActionCastSpellAtObject( SPELL_HEAL,oB,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE)); DelayCommand(4.0,AssignCommand(oB,SetIsEnemy(oA))); DelayCommand(4.0,AssignCommand(oA,SetIsEnemy(oB))); } Bon, pour que les persos restent sur le tatami ou plutôt y retourne s'ils s'en écartent, il faut que tu fasses un trigger légerement plus petit que ton tatami afin que les PNJ ne se battent pas trop sur les bords, c'est pas très beau. Ensuite, place deux waypoints à l'endroit où se trouvent les combattants, je te conseille plutôt au centre mais pas trop près l'un de l'autre. Les Tags de ces waypoints doivent être "way01" pour le pnj "A" et "way02" pour le PNJ "B". Alors par contre attention, voici un point crucial du script qui va suivre. Ce script, qui va sur le OnExit du trigger, déclenche une petite animation quand les PNJ sortent du trigger : ils arrêtent de se battre, se dirigent chacun vers son waypoint respectif, et là ils se font face pour se saluer à nouveau avant de reprendre le combat. Le trucage ici est que pour simplifier le script, je demande à chaque PNJ de faire face ( SetFacing) à la direction face ( ) à laquelle il était avant le combat au tout début. Pour moi dans mon petit module démo, le PNJ "A" était face à l'Est (SetFacing(0.0) et le PNJ "B" face (encore, désolé) à l'Ouest (SetFacing(180.0). A toi d'adapter en fonction de ton module. Voici le scrip OnExit du Trigger : NWScript :
#include "nw_i0_plot" void main() { object oNPC=GetExitingObject(); object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); object oHealer=GetObjectByTag("healer"); object oWay01=GetWaypointByTag("way01"); object oWay02=GetWaypointByTag("way02"); if (oNPC == oA) { AssignCommand(oA,ClearAllActions(TRUE)); AssignCommand(oB,ClearAllActions(TRUE)); DelayCommand(1.0,AssignCommand(oA,ActionForceMoveToObject(oWay01,TRUE,0.0f))); DelayCommand(1.0,AssignCommand(oB,ActionForceMoveToObject(oWay02,TRUE,0.0f))); DelayCommand(6.5,AssignCommand(oA,SetFacing(0.0))); DelayCommand(6.5,AssignCommand(oB,SetFacing(180.0 ))); DelayCommand(7.5,AssignCommand(oA,PlayAnimation(ANIMATION_FIREFORGET_BOW,1.0))); DelayCommand(7.5,AssignCommand(oB,PlayAnimation(ANIMATION_FIREFORGET_BOW,1.0))); DelayCommand(8.5,AssignCommand(oB,SetIsEnemy(oA))); DelayCommand(8.5,AssignCommand(oA,SetIsEnemy(oB))); } else if (oNPC == oB) { AssignCommand(oA,ClearAllActions(TRUE)); AssignCommand(oB,ClearAllActions(TRUE)); DelayCommand(1.0,AssignCommand(oA,ActionForceMoveToObject(oWay01,TRUE,0.0f))); DelayCommand(1.0,AssignCommand(oB,ActionForceMoveToObject(oWay02,TRUE,0.0f))); DelayCommand(6.5,AssignCommand(oA,SetFacing(0.0))); DelayCommand(6.5,AssignCommand(oB,SetFacing(180.0 ))); DelayCommand(7.5,AssignCommand(oA,PlayAnimation(ANIMATION_FIREFORGET_BOW,1.0))); DelayCommand(7.5,AssignCommand(oB,PlayAnimation(ANIMATION_FIREFORGET_BOW,1.0))); DelayCommand(8.5,AssignCommand(oB,SetIsEnemy(oA))); DelayCommand(8.5,AssignCommand(oA,SetIsEnemy(oB))); } } Enfin, par sécurité, pour éviter que le bug précédent ne se reproduise (je crois qu'au bout du compte le problème venait d'un mauvais Timing) un denier script : sur le OnEnter du Trigger : NWScript :
#include "nw_i0_plot" void main() { object oNPC=GetEnteringObject(); object oA=GetObjectByTag("A"); object oB=GetObjectByTag("B"); if (oNPC == oA) { DelayCommand(7.5,AssignCommand(oB,SetIsEnemy(oA))); DelayCommand(7.5,AssignCommand(oA,SetIsEnemy(oB))); } else if (oNPC == oB) { DelayCommand(7.5,AssignCommand(oB,SetIsEnemy(oA))); DelayCommand(7.5,AssignCommand(oA,SetIsEnemy(oB))); } } Voilà, j'espère que cela ira cette fois, et qu'il n'y aura plus de problème, n'hésite pas en m'en faire part sinon. Bonne nuit ! |
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Merci à toi pour tes efforts
Je teste ça de suite et je te ferai un compte rendu Bonne nuit |
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Bon je viens de tester ça et ça marche nickel !!!
Un grand merci à toi Bon j'ai un peu galéré sur l'histoire du positionnement des pnj mais j'y suis arrivé (va savoir pourquoi ils se tournaient systématiquement le dos pour saluer ) Par contre sans vouloir abusé, je voudrais te demander une dernière petite chose : A force de ressuciter/healer les combattants, le healer se déplace peu à peu et fini par se retrouver au milieu du tatami ^^ Est-ce qu'il serait possible de lui faire reprendre sa place de départ après avoir réssucité/healé les combattants ? (je pense que oui avec un wp mais je ne sais pas trop où mettre ça et je ne voudrais pas mettre le souk dans ton script qui tourne nickel ^^) |
Revenir en haut | |
Enki Légende vivante Messages: 432 |
Bonsoir,
je vois que je ne suis pas le seul noctambule de ce forum. Pour le healer, j'y avais pensé aussi, mais tu as raison, ce n'est pas un match de boxe, il fait désordre au milieu du tatami. Il faut que tu fasses un waypoint de tag "way03" que tu places à l'endroit où doit se trouver le healer. Ensuite, dans les deux scripts onDeath, tu mets la ligne suivante : NWScript :
DelayCommand(4.0,AssignCommand(oHealer,ActionForceMoveToObject(oWay03,TRUE,0.0f))); /// Pour l'emplacemet, c'est juste au dessus de cette ligne : ///// DelayCommand(4.0,AssignCommand(oB,SetIsEnemy(oA))); Teste-le, quant à moi, je n'ai plus la force ce matin ... A ton service Khorgan ! |
Revenir en haut | |
Khorgan Ecuyer Messages: 67 |
Ca fonctionne nickel
J'ai juste mon éternelle galère de SetFacing qui fait que là le healer fini par toujours se retrouver dos au tatami Mais bon je ne suis plus en état de tester quoique ce soit donc je verrais ça demain Encore une fois merci, tes scripts m'aident vraiment beaucoup et la salle d'entraînement de mon module commence a être vraiment sympa ^^ |
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