
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.







La date/heure actuelle est 30/04/2025 21:50:10
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 |
Djezebel Héros ![]() Messages: 252 |
![]() Bonjour à tous !
J'ai commencé une animation mais j'ai un peu de mal à la terminer. Vos avis sont donc les bienvenus ! Voici l'idée : Un homme menant des intrigues demande à un roublard (PJ) d'aller se dissimuler afin de collecter quelques informations. Il lui demande donc de se rendre dans une certaine pièce de l'auberge où deux agents ont l'habitude de parler. Le joueur va donc dans cette pièce, attend un peu, et les deux compères arrivent. Ils discutent puis s'en vont, ignorant qu'ils ont été écoutés. L'animation n'est pas terminée mais j'en ai fais une bonne partie. L'animation est quasiment finie, oui ^^ Pour ce faire, j'ai eu besoin de : - Un PNJ donnant la quête (mais on s'en fiche un peu) - Un PNJ avec pour Tag : "homme1" (oui je suis très imaginative) - Un PNJ avec pour Tag : "homme2" (...no comment) - Un waypoint : "WP_hommes" - Un waypoint : "WP_homme1" - Un waypoint : "WP_homme2" - Un grand trigger dans la pièce où se situera l'action (sur tout le sol) - un petit trigger autour du "WP_homme1" - un autre autour du "WP_homme2" Je passe la partie du dialogue où le PNJ indique la quête au joueur. Il faut juste savoir qu'en acceptant la quête, le joueur prend une variable SetLocalInt(oPC, ecoute", 1). Dans le OnSPawn des deux PNJ (homme1 et homme2) je rajoute juste ceci : 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 grand trigger qui fait toute la pièce, sur le OnEnter : NWScript :
void main() { object oPC = GetEnteringObject(); location lSpwn = GetLocation(GetWaypointByTag("WP_hommes")); if (GetLocalInt(oPC, "ecoute")==1) { CreateObject(OBJECT_TYPE_CREATURE, "homme1", lSpwn, FALSE); CreateObject(OBJECT_TYPE_CREATURE, "homme2", lSpwn, FALSE);// les deux PNJ apparaissent SetLocalInt(oPC, "ecoute", 2); } } Sur le OnEnter du trigger autour du WP_homme1 (cf modif plus bas aussi) NWScript :
void main() { object oEnter = GetEnteringObject(); if (GetTag(oEnter) == "homme1") { AssignCommand(oEnter, ActionSpeakString("")); DelayCommand(9.0, AssignCommand(oEnter, ActionSpeakString(""))); DelayCommand(19.0, AssignCommand(oEnter, ActionSpeakString(""))); } } Et celui sur le OnEnter du WP_homme2 (cf modif plus bas) NWScript :
void main() { object oEnter = GetEnteringObject(); object oDoor = GetNearestObject(OBJECT_TYPE_DOOR); if (GetTag(oEnter) == "homme2") { AssignCommand(oEnter, ActionCloseDoor(oDoor)); // Oui, il va fermer la porte la plus proche avant de parler DelayCommand(7.0, AssignCommand(oEnter, ActionSpeakString("Quoi ?"))); DelayCommand(15.0, AssignCommand(oEnter, ActionSpeakString(""))); } } Bon, voilà donc les questions : Comment faire si on veut que la discussion se passe en "privé" ? C'est à dire que si quelqu'un est dissimulé et que les PNJ ne voient pas la personne, ils parlent sans gène. Si quelqu'un entre ou que le PJ est visible, ils s'interrompent et lui demandent de partir puis s'en vont en disant "l'endroit n'est pas sûr, on se reverra plus tard". Comment les faire partir une fois que la conversation est terminée ? (passer par la porte de l'auberge) ![]() Si vous avez d'autres idées, n'hésitez pas ! A vos claviers ! Dernière édition par Djezebel le 17/02/2006 11:50:08; édité 1 fois
|
Revenir en haut | ![]() ![]() ![]() |
L'Erudit Seigneur ![]() Messages: 167 |
Je n'ai pas lu l'ensemble de ton message, mais je vais tenter de te donner quelques pistes en réponse à tes interrogations.
Si tu souhaites que les PNJ interrompent leur conversation s'il voient le PJ, je suppose qu'il faut poser une condition lorsque que le OnPerceeption est appellé. Si le PJ est vu, alors les PNJ s'interrompent, ou ne disent rien. Ensuite, il suffit ded placer les conséquences que tu souhaites après la condition. Pour les faire sortir de l'auberge il doit y avoir des actions adéquates à disposer selon le bon enchaînement gràce aux "DelayCommand". Pour le sfonctions elle même, je pense que le lexicon te sera plus utile que moi ![]() |
Revenir en haut | ![]() ![]() ![]() |
Djezebel Héros ![]() Messages: 252 |
J'avais bien pensé à mettre quelque chose sur le onPerception pour "interrompre" le dialogue.
Mais est-ce qu'un "clearallactions" va empêcher le script de dialogue de se poursuivre ? Car ce "dialogue" n'est pas dans un "onconversation" mais dans un script avec un delaycommand pour chaque phrase. Donc peut-on interrompre ce delaycommand ? ^^ |
Revenir en haut | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
Salut
Une solution serait d'intercaler des ActionWait entre les ActionSpeakString() au lieu des delaycommand. Comme ça il y aura une liste d'action dès le début et un clearallactions fonctionera. Ou passe par des UserDefinedEvent. Tu laisses les delaycommand, avec un event par phase. Et dans chaque evenement tu vérifies une variable du genre "On_EST_TRANKIL" que tu modifies selon le OnPerception. Des ptites idées comme ça. |
Revenir en haut | ![]() ![]() ![]() |
Djezebel Héros ![]() Messages: 252 |
Bonjour,
J'ai tenté de mettre des ActionWait au lieu des DelayCommand et ça donnait tous les dialogues en même temps, donc pas top ^^. Dans mes scripts ça va un peu mieux mais j'ai toujours des problèmes : - Quand le PJ est vu, les PNJ continuent leur conversation tout en s'en allant et disant bien "l'endroit n'est pas sûr, allons nous en"... (mais ça enchaine sur le dialogue donné par les triggers^^) - Ils ne sont pas "face à face" quand ils parlent (ils sont presque dos à dos et pourtant les WP se font face) Voici ce que j'ai actuellement : Sur le OnEnter du trigger autour du WP_homme1 NWScript :
void main() { object oEnter = GetEnteringObject(); location lSpwn = GetLocation(GetWaypointByTag("WP_hommes")); if (GetTag(oEnter) == "homme1") { AssignCommand(oEnter, ActionSpeakString("")); DelayCommand(9.0,AssignCommand(oEnter, ActionSpeakString(""))); DelayCommand(18.0, AssignCommand(oEnter, ActionSpeakString(""))); DelayCommand(26.0, AssignCommand(oEnter, ActionSpeakString("Ouais t'as raison. D'ailleurs on ferait mieux d'y retourner avant d'avoir des ennuis."))); DelayCommand(31.0, AssignCommand(oEnter, ActionForceMoveToLocation(lSpwn, FALSE, 10.0))); DelayCommand(44.0, DestroyObject(oEnter)); } } Sur celui sur le OnEnter du WP_homme2 NWScript :
void main() { object oEnter = GetEnteringObject(); object oDoor = GetNearestObject(OBJECT_TYPE_DOOR); location lSpwn = GetLocation(GetWaypointByTag("WP_hommes")); if (GetTag(oEnter) == "homme2") { AssignCommand(oEnter, ActionCloseDoor(oDoor)); DelayCommand(5.5, AssignCommand (oEnter, ActionSpeakString("Quoi ?"))); DelayCommand(14.0, AssignCommand(oEnter, ActionSpeakString(""))); DelayCommand(23.0, AssignCommand(oEnter, ActionSpeakString("Ca ne donne pas envie de rester dans l'coin."))); DelayCommand(28.0, AssignCommand(oEnter, ActionOpenDoor(oDoor))); DelayCommand(31.0, AssignCommand(oEnter, ActionForceMoveToLocation(lSpwn, FALSE, 10.0))); DelayCommand(43.0, DestroyObject(oEnter)); } } Dans le OnPerception du PNJ homme1 : NWScript :
void main() { object oPC = GetLastPerceived(); int nVu = GetLastPerceptionSeen(); int nHear = GetLastPerceptionHeard(); location lSpwn = GetLocation(GetWaypointByTag("WP_hommes")); if (GetIsPC(oPC)) { if(nVu || nHear) { if (GetLocalInt(oPC, "ecoute")==2) { ClearAllActions(); ActionSpeakString("Attend... il semblerait que nous ne soyons pas seul.", TALKVOLUME_TALK); ActionWait(4.2); ActionMoveToLocation(lSpwn); DestroyObject(OBJECT_SELF, 15.0); } } } } Et dans le OnPerception du PNJ homme2 NWScript : void main() { object oPC = GetLastPerceived(); int nVu = GetLastPerceptionSeen(); int nHear = GetLastPerceptionHeard(); location lSpwn = GetLocation(GetWaypointByTag("WP_hommes")); if (GetIsPC(oPC)) { if(nVu || nHear) { if (GetLocalInt(oPC, "ecoute")==2) { ClearAllActions(); ActionWait(4.2); ActionSpeakString("Allons-nous en.", TALKVOLUME_TALK); ActionMoveToLocation(lSpwn); ClearAllActions(); DestroyObject(OBJECT_SELF, 15.0); } } } } |
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Pourquoi ne pas faire un dialogue au lieu de passer par un script ?
Peut-être que tu préfères les strings ( ![]() A mon avis, cela devrait marcher ! |
Revenir en haut | ![]() ![]() ![]() |
Djezebel Héros ![]() Messages: 252 |
Citation : Pourquoi ne pas faire un dialogue au lieu de passer par un script ? Parce que je ne sais pas comment faire en sorte que 2 PNJ discutent ensemble avec un dialogue sans que le PJ intervienne.
Citation : Peut-être que tu préfères les strings ( Heu... ![]() ![]() Pour faire une condition qui teste s'il y a quelqu'un, je pense pouvoir le faire... donc si on pouvait m'expliquer juste comment faire un dialogue entre deux PNJ... (je vais faire une recherche en attendant là dessus sur le forum) |
Revenir en haut | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
Bof un dialogue entre 2 PNJ c'est un peu faire beucoup de scripts pour rien.
Sinon je pige pas pourquoi ça marche pas avec les actionWait(), ça devrait le faire pourtant, t'as bien fait un truc comme ça : NWScript :
AssignCommand(oNPC,ActionSpeakString("1")); AssignCommand(oNPC,ActionWait(3.0)); AssignCommand(oNPC,ActionSpeakString("2")); AssignCommand(oNPC,ActionWait(3.0)); AssignCommand(oNPC,ActionSpeakString("3")); AssignCommand(oNPC,ActionWait(3.0)); AssignCommand(oNPC,ActionSpeakString("4")); Pour le problème de ils se tournent le dos, place un SetFacing ou un SetFacingPoint() bien senti ça corrigera. Sinon je pense toujours que des UserDefinedEvent peuvent être pas mal. |
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Citation : Peut-être que tu préfères les strings ( Désolé, je suis parfois un peu trop culotté !
![]() Heu... ![]() Bon, allez, promis, j'arrête ! Pour initier un dialogue, tu mets AssignCommand(homme1,ActionStartConversation(homme2); dans le trigger sur lequel marche ton pnj homme1 par exemple. Je vais essayer, de voir si ça marche, parce que des fois j'ai des idées mais elles ne sont pas possibles ! Citation : Bof un dialogue entre 2 PNJ c'est un peu faire beaucoup de scripts pour rien. je crois au contraire que si cela marche, ça va pas mal simplifier les scripts. |
Revenir en haut | ![]() ![]() ![]() |
Djezebel Héros ![]() Messages: 252 |
Effectivement, j'avais juste mis un "ActionWait(x.x)" et pas d'AssignCommand devant
![]() Ca marche déjà tout de suite mieux et résoud mon problème majeur ![]() Maintenant, le seul petit souci que j'ai, c'est quand ils repartent s'ils ont vu le PJ, ils ouvrent la porte et restent debout à ne rien faire. Mais bon, ce n'est pas gravissime. Citation : Pour initier un dialogue, tu mets AssignCommand(homme1,ActionStartConversation(homme2); dans le trigger sur lequel marche ton pnj homme1 par exemple. Je vais tester, mais ça m'étonnerait qu'ils fassent l'action qu'aurait fait un PJ (à savoir cliquer sur continuer)... Peut-être dans une Action à faire ensuite...
Citation : Désolé, je suis parfois un peu trop culotté ! Oui, parfois on touche le fond, je dirai même la cale. Sont-ce mes yeux qui me jouent des tours où tu tentes de faire de l'humour ? ^^ |
Revenir en haut | ![]() ![]() ![]() |


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