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







La date/heure actuelle est 01/05/2025 05:40:34
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 |
ptolemee Ecuyer Messages: 42 |
![]() Voilà, je débute dans la programmation de scripts et je bute sur un problème.
Je souhaiterais qu'un NPC escorté de 2 gardes interdisent l'acces à un endroit à moins d'avoir un item. Si le PC n'a pas l'item alors la conversation avec le chef NPC peut s'enveminer (3 étapes : 1- il prévient, 2- il s'énervent, 3- ils attaquent). quand le chef attaque, les deux autres suivent et l'un des deux crie "A l'Attaque" C'est au moment de l'attaque que j'ai un problème .... Si je mets mon script sur la dernière parole du NPC alors le deuxième garde crie bien "A l'Attaque" mais aucun des 3 perso ne m'attaquent ?? Si je rajoute un réponse du PC au dialogue (genre vas-y attaque moi si tu l'ose) alors là les 3 persos attaquent bien le PC mais le second NPC ne crie pas "A l'Attaque" Je dois vous avoué que je ne comprends pas bien. voici le script : Code : #include "NW_I0_GENERIC"
void main() { object oElf001 = GetObjectByTag ("Elf001"); object oElf002 = GetObjectByTag ("Elf002"); AdjustReputation (GetPCSpeaker(), OBJECT_SELF, -100); AssignCommand (oElf001, DetermineCombatRound()); AssignCommand (oElf002, DetermineCombatRound()); AssignCommand(oElf001, ActionDoCommand(SpeakString("A l'Attaque!!!"))); DetermineCombatRound(); } merci pour votre aide précieuse. ![]() |
Revenir en haut | ![]() ![]() ![]() |
Cassin Papa-poule(t) & poissard intemporel ![]() Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
(j'ai ajouté les balises [ code ] et [ /code ] (sans les espaces) autour de ton script pour que ça soit plus lisible)
A première vue ton script me paraît correct, le seul truc "suspect" que je trouve est cette ligne : AssignCommand(oElf001, ActionDoCommand(SpeakString("A l'Attaque!!!"))); Pourquoi un AssignCommand suivis d'un ActionDoCommand ? Un simple AssignCommand(oElf001, ActionSpeakString("A l'Attaque!!!")); ne serait-il pas plus simple ? Enfin, je dis ça, si ça se trouve je me plante ![]() _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | ![]() ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
Merci pour ton aide.
j'ai effectivement remplacé cette ligne de code mais cela n'a véritablement rien changé sur le fond. Si c'est mon NPC qui finit le dialogue (ex "je t'avais prévenu, meurt!") alors il me dit bien cette phrase, le second perso crie bien (cf au dessus) mais personne ne m'attaque. Si c'est le PC qui finit la phrase (ex chiche !) alors là le combat à lieu mais mon second NPC ne crie pas. Donc problème intacte.... ils sont sur une faction defender, cela a-t-il quelque chose à voir ? merci |
Revenir en haut | ![]() ![]() ![]() |
Cassin Papa-poule(t) & poissard intemporel ![]() Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Non, la faction n'a rien à voir là-dedans... Par contre si tu fais passer la Faction Defender en hostile envers le joueur, TOUS les PNJ de Defender le deviendront, même à l'autre bout du module, donc attention
![]() Selon cette ligne Code : AdjustReputation (GetPCSpeaker(), OBJECT_SELF, -100);
tu fais baisser de -100 la réputation de GetPCSpeaker par rapport à OBJECT_SELF, donc si tu la met sur une phrase du PJ, ça devrait ajuster la réput' du PJ par rapport au PJ, donc il ne devrait rien se passer, hors apparemment c'est le contraire... ![]() Difficile d'en dire plus l'éditeur sous les yeux, j'essaierais de regarder ce soir si j'ai le temps ![]() _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | ![]() ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
J'essaye de mon côté quelques bodouillage, je mets un post demain à ce sujet
![]() |
Revenir en haut | ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
Voilà,
j'ai un peu avancé. Si je change ma ligne adjustréputation par SetIsTemporaryEnemy(GetPCSpeaker()); alors là tout fonctionne bien si le dernier à parler est le PJ. Si le dernier à parler est le NPC alors ils ne m'attaquent toujours pas ? Je pense que cela peut venir du fait que le NPC ne peut pas devenir ennemi de lui-même (si je comprends bien la fonction GetPCSpeaker). Si quelqu'un à une idée.... |
Revenir en haut | ![]() ![]() ![]() |
Cassin Papa-poule(t) & poissard intemporel ![]() Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
ptolemee a écrit : Si le dernier à parler est le NPC alors ils ne m'attaquent toujours pas ? Je pense que cela peut venir du fait que le NPC ne peut pas devenir ennemi de lui-même (si je comprends bien la fonction GetPCSpeaker). Non justement, GetPCSpeaker renvoie le joueur qui dialogue avec le PNJ (pour récupérer le PNJ il faut un GetLastSpeaker), c'est ça que je ne comprend pas, ça fait l'inverse de ce que ça devrait faire..._________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | ![]() ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
Bon j'ai effectué quelques test :
Si je veux que mon NPC attaque le joueur à la fin de sa phrase alors il faut que je remplace "GetPCSpeaker" dans mon script par "GetLastSpeaker".... Cela vous semble-t-il correct comme script ? 2- autres questions : pourquoi seul le NPC me saute dessus et que les 2 gars qui l'accompagnent ne m'attaquent qu'une fois ce NPC principal mort ? Je voudrais qu'ils m'attaquent tous ensembles (je sais je suis un peu pervers.....) merci |
Revenir en haut | ![]() ![]() ![]() |
Cassin Papa-poule(t) & poissard intemporel ![]() Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Désolé, je n'ai pas pu regarder ça hier soir...
Pour le fait que seul un des PNJ t'attaque et que les autres ne réagissent qu'à sa mort, je pense (si quelqu'un d'autre pouvait confirmer/infirmer... ![]() Je crois qu'il y a une sorte de "changement de faction actif" et "changement de faction passif". Je m'explique ![]() Ton PNJ attaques le joueur car c'est sur lui que tu changes la faction ("changement actif"). Les gardes, eux, ont quand même leur faction changée mais pas directement ("changement passif"), et donc n'attaquent pas en premier lieu car un PNJ réagit à 2 choses : - leur champ de vision : celui-ci n'est modifié que si quelque chose entre ou sort de leur champ de vision, s'il se déplace à l'intérieur de celui-ci, ils ne réagissent pas, c'est donc pour ça qu'ils ne "voient" pas que le joueur a changé de faction - les "listeners" : ce sont des "phrases" muettes qui sont envoyées par un PNJ lorsqu'il entreprend quelque chose. Par exemple lorsqu'un PNJ meurt, il envoie à ses copains à portée un truc du genre "argh je suis mort", ce qui les fait réagir en conséquence. Ca serait donc pour ça que tes gardes n'attaquent le joueur que lorsque ton PNJ principal meurt (je ne pense pas qu'il y ait de listener de lancé lorsqu'un PNJ se met à attaquer, d'où le problème) La solution ? Essaie de mettre la ligne de changement de faction sur les 3 PNJ, ça marchera peut-être... Maintenant, je dis ça mais je peux me tromper complètement ![]() ![]() _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | ![]() ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
J'ai essayé différentes méthodes pour changer la faction des 3 NPC mais mes limites de codes se font cruellement sentir.
Pourrais-tu me suggérer une idée de code stp ![]() mici |
Revenir en haut | ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
sinon j'ai essayé ça mais il semble y avoir une erreur sur la ligne adjustereputation...
Code : #include "NW_I0_GENERIC"
void main() { object oElf001 = GetObjectByTag ("Elf001"); object oElf002 = GetObjectByTag ("Elf002"); object oPJ = GetPCSpeaker (); AssignCommand (oElf001, DetermineCombatRound()); AssignCommand (oElf002, DetermineCombatRound()); SetIsTemporaryEnemy(GetLastSpeaker()); void AdjustReputation(oPJ, oElf001, -100); AssignCommand(oElf001, ActionSpeakString("A l'Attaque!!!")); AssignCommand(oElf002, ActionSpeakString("Protegeons Thord !!!")); DetermineCombatRound(); } où est l'erreur merci |
Revenir en haut | ![]() ![]() ![]() |
lendraste Grand Maître Chanteur du Conseil ![]() Messages: 1403 Localisation: Quelque part ailleurs |
ptolemee a écrit : sinon j'ai essayé ça mais il semble y avoir une erreur sur la ligne adjustereputation... Oui, il y a un "void" en trop.
Désolé, mais n'ayant pas suivi avec assiduité le reste du sujet, je n'ai pas la possibilité de répondre pleinement aux questions qui se sont posées ici. _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
Bien merci pour ton aide le script fonctionne mieux maintenant.
Bon je vous demande votre aide une dernière fois à partir du dernier script : 1- si dans mon dialogue, je le met sur la fin d'un texte du PJ, alors les 3 NPC m'attaquent bien en même temps mais aucun des deux elfes ne crient leurs textes ? 2- si dans mon dialogue, je le met sur la fin d'un texte du NPC, alors seul ce dernier m'attaque et les 2 autres une fois celui-ci mort (j'ai bien lu ton message Cassin mais je ne trouve pas la solution) par contre au bébut du combat, les 2 elfes crient bien leurs textes ? Bref un coup ca marche à moitié, un coup ca marche mais l'autre moité ![]() Si quelqu'un à la réponse à ce problème... |
Revenir en haut | ![]() ![]() ![]() |
lendraste Grand Maître Chanteur du Conseil ![]() Messages: 1403 Localisation: Quelque part ailleurs |
ptolemee a écrit : 1- si dans mon dialogue, je le met sur la fin d'un texte du PJ, alors les 3 NPC m'attaquent bien en même temps mais aucun des deux elfes ne crient leurs textes ? C'est normal car tu leur assigne sous forme d'action. Donc ces "cris" vont être placé à la suite de toute autre action. Le problème est que le passage en mode combat des deux personnages s'approprie leur queue d'action et empêchera donc l'ActionSpeakString de se déclencher.
Donc, plutot que d'assigner un ActionSpeakString, assigne leur plutôt un SpeakString. Le SpeakString n'est pas une action et sera joué immédiatement quoi que fasse le personnage à ce moment. Citation : 2- si dans mon dialogue, je le met sur la fin d'un texte du NPC, alors seul ce dernier m'attaque et les 2 autres une fois celui-ci mort (j'ai bien lu ton message Cassin mais je ne trouve pas la solution) par contre au bébut du combat, les 2 elfes crient bien leurs textes ? Si je trace l'exécution de ton script dans le cas numéro 2 voici ce qui se passe. Tu demandes un DetermineCombatRound sur les deux elfes, mais à ce moment tu n'as pas changé la réputation du personnage, donc les elfes ne font rien contre lui. Ayant épuisé leur queue d'action (en ne faisant rien), les ActionSpeakString que tu leur place dans la queue s'exécute normalement. Le fait de les passer hostile semble ne pas suffire à déclencher leurs assauts, mais dès que le PJ à tué le premier personnage, les PNJs le détecte et l'attaque pour ce crime. A noter que le SetIsTemporaryEnnemy fonctionne là avec ses valeurs par défaut, autrement dit, comme c'était au PNJ de parler, il est le OBJECT_SELF de la fonction. De plus SetIsTemporaryEnnemy ne s'applique qu'à une seule personne et non à une faction. Note que je ne comprends pas pourquoi le AdjustReputation semble n'avoir aucun effet dans ce contexte. Il y a sans doute des données manquantes dans la présentation de ton problème.
Désolé ne n'avoir pas le temps de creuser davantage, mais je pense qu'il y a pas mal de chose à revoir dans l'ordre des instructions de ce scripts. Essaye surtout de bien faire la différence entre ce qui est une action (donc qui se met dans la queue d'action et qui est différé s'il y a déjà des actions en cours) et ce qui n'en est pas (donc qui est exécuté immédiatement). _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
Merci bcp pour tes explication sur les actions et le reste. Cela éclaire un peu ma lumière.
|
Revenir en haut | ![]() ![]() ![]() |
ptolemee Ecuyer Messages: 42 |
Bon lendraste dans le cas 1 j'ai parfaitement réussit à faire fonctionner le script.
Dans le cas 2 toujours pas même en changeant de place les éléments. Par contre je veux bien une suggestion pour changer l'ensemble de la faction de ces 3 NPC mais j'ai pas bien réussit à le faire. Si on change l'ensemble de faction en hostile, il devraient me sauter dessus tous les trois.. Pouvez-vous m'éclairer la dessus ? merci |
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