La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 22:03:47


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 22/12/2005 01:03:45 Sujet du message : Combat de PNJ et rez

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 Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 22/12/2005 15:27:25 Sujet du message : Questions ?

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 22/12/2005 17:55:17 Sujet du message :

Tout d'abord merci pour ta réponse Smile

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 Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 22/12/2005 18:25:56 Sujet du message : C'est fait !

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);
          }
    }
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.


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));
          }
    }
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.


Dans le onDeath du perso dont le tag est "A" :
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.


Dans le onDeath du perso "B" :
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.


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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 22/12/2005 21:15:51 Sujet du message :

Merci beaucoup ça fonctionne nickel Smile

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 Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 22/12/2005 22:35:26 Sujet du message : Pas de problème !

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 22/12/2005 23:25:06 Sujet du message :

Génial, c'est super gentil de ta part Smile

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 Smile

Si tu arrives à les faire se saluer avant le combat ce serait tip top Smile Smile Smile

[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 Sad
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 23/12/2005 00:20:17 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 23/12/2005 00:38:45 Sujet du message :

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 Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 23/12/2005 01:59:06 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 23/12/2005 02:02:45 Sujet du message : Une Lumière !

J'ai rencontré (à force de le tester Mad ) 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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 23/12/2005 02:08:56 Sujet du message :

Génial, c'est vraiment cool de ta part de me filer un coup de main comme ça Smile

D'ailleurs je suis particulièrement impressionné par l'ambiance qui règne sur ce forum Smile Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 23/12/2005 03:29:33 Sujet du message : ENFIN !

Bon, cette fois-ci, je suis sûr de mon coup, alors voici les nouveaux scripts :

OnEnter de la zone :
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.


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);
          }
    }
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.


OnDeath du pnj "A" :
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.


onDeath du PN "B" :
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.




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 ( Smile ) à 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)Wink et le PNJ "B" face (encore, désolé) à l'Ouest (SetFacing(180.0)Wink. 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)));
}


}
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.


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)));
}
}
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.


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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 23/12/2005 03:36:43 Sujet du message :

Merci à toi pour tes efforts Smile

Je teste ça de suite et je te ferai un compte rendu Wink

Bonne nuit Smile Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 23/12/2005 04:15:23 Sujet du message :

Bon je viens de tester ça et ça marche nickel !!!

Un grand merci à toi Smile

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 Laughing )

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 23/12/2005 04:38:43 Sujet du message : Et puis quoi encore ?

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)));
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.

Teste-le, quant à moi, je n'ai plus la force ce matin ... Fatigue

A ton service Khorgan !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Khorgan
Ecuyer
Inscrit le: 10 Déc 2005
Messages: 67
Répondre en citant
Posté le : 23/12/2005 06:27:07 Sujet du message :

Ca fonctionne nickel Smile

J'ai juste mon éternelle galère de SetFacing qui fait que là le healer fini par toujours se retrouver dos au tatami Razz

Mais bon je ne suis plus en état de tester quoique ce soit donc je verrais ça demain Smile

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
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


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 80.759ms