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:29:20
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
fikus Novice Messages: 11 |
Bonjour!
Bon, après m'être tapé quelques tutoriaux et avoir créé quelques zones bien ratés, je commence mon premier module un peu sérieux. Le forum est riche d'infos donc ça fait une bonne base de données pour le scripteur galèrant. (quoique finalement c'est pas si dur quand on s'y met vraiment..) Par contre je n'ai rien trouvé sur ce sujet: J'ai la vague impression qu'au chargement du module, toutes les zones deviennent "actives". Ca me parait étonnant au point de vue ressources, mais voilà mon problème: Si je veux que deux créatures se battent quand le PJ entre dans la zone, je peux tout simplement les mettre à côté l'une de l'autre et dans des factions hostiles. (après on peut peaufiner...) Quand je teste et que j'entre dans la zone (qui n'est pas la première du module), je m'aperçois qu'elles sont déjà blessées, c'est à dire que j'ai la vague impression que le combat a commencé à partir du moment où j'ai chargé le module, même si j'ai commencé dans une autre zone... Le fonctionnement général d'un module est-il bien celui-là, toutes les zones "existent" au chargement du module? On serait donc poussé à faire spawner, animer etc. un maximum de truc sur le OnEnter de la zone pour économiser les ressources et synchroniser certains trucs avec l'arrivée du PJ? Dans ce cas, y-a-t-il un moyen propre de bloquer une créature jusqu'à l'arrivée de quelqu'un dans la zone? Ca c'est la question subsidiaire, l'important pour moi est de savoir comment fonctionne le module... Merci d'avance! |
Revenir en haut | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Oui en effet toutes les zones sont "actives" dès que le module est lancé.
Pour ton problème de créatures qui ne doivent se battre que lorsque le joueur est là, j'ai eu le même problème récemment. En fait j'ai mis tous les "méchants" qui devaient originellement être en Faction Hostile en Faction "neutre", comme ça ils ne se tapent pas sur la gueule, et sur le OnEnter de la zone j'ai un script qui les met en Hostile. (je ne l'ai pas sous la main, je le posterais cet après-midi ) Le hic étant qu'il semble qu'il faille que quelque chose entre ou sorte de la zone de perception d'une créature pour qu'un test sur les factions des créatures visibles soit à nouveau effectué. Donc en gros, même avec ma bande d'orc en Hostiles, les orcs et les soldats se regardaient en chien de faïence jusqu'à ce que le joueur arrive. Là les créatures qui l'aperçoivent se rendent enfin compte qu'il y a des méchants à proximité et se mettent à se battre. J'ai contourné le problème en faisant errer les protagonistes de la bataille (RandomWalk sur leur OnSpawn), mais bon, c'est un peu du bidouillage, si quelqu'un à une meilleure solution, je suis preneur _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
fikus Novice Messages: 11 |
Merci de la réponse, même si elle ne me réjouit pas ...
Je pensais pas que toutes les zones me bouffaient des ressources en même temps!!! Je crois que je vais mettre des if(le PC est dans la zone) un peu partout pour éviter quelques scripts lourds... Cela dit, y'a une certaine logique, le fait que tout soit actif permet de beaucoup moins se compliquer la vie sur certains trucs comme le déplacement des PNJs quand le PJ sort puis rerentre dans la zone... Par contre, je vais me creuser la tête pour trouver une solution sympa, je t'en ferais part si j'en suis fier EDIT:Après un peu de creausage de tête... Bon, il est facile de conditionner tout ce qu'il y a dans OnPerception des combattants par la présence du PC dans la zone. (Un gros if(le PC est là) englobant tout le script à l'intérieur du void) Bien, c'est une autre technique pour bloquer tout le monde que les factions, personnellement ça m'arrange. En fait le vrai problème c'est celui de l'appel du script de perception. Pour l'instant je le résoud avec un : ExecuteScript(objet combattant, script combattant_onperception) dans le OnEnter de la zone. Ca marche très bien dans mon test. Mais c'est très lourd: Il faut cibler tous les tags des PNJs à activer... En bref, ça fonctionne mais c'est pas "global" comme solution... On y retourne! |
Revenir en haut | |
fikus Novice Messages: 11 |
Bon, en fait ça marche très moyen... Toujours ce problème d'avoir besoin de quelque chose qui entre dans l'espace de la perception...
Ca faisait illusion ma technique, jusqu'à ce que je pousse les tests. Grrr. |
Revenir en haut | |
fikus Novice Messages: 11 |
Bon, je ne sais pas si c'est de la meilleure manière, mais finalement j'ai adopté cette solution. Je ne détaille pas tous les scripts car y'en a partout...
Alors, il faut d'abord créer une variable de zone qui dit si le PC est présent dans la zone. Par zone on peut entendre "endroit dans la zone", si on veut plusieurs déclenchements. Exemple: Quand le PC arrive dans l'area, deux combattants commencent à se battre, puis, quand le PC passe par un couloir, deux autres commencent à se battre au bout du couloir. Dans le OnEnter de la zone, on fait passer PCPresent à 1. Sur un trigger dans le couloir on fait passer PCpresent à 1. Il faut englober les scripts OnPerception des combattants par un if(PCPresent==1) pour les deux premiers, if(PCpresent2==1) pour les combattants du bout du couloir. A partir de là, on a déjà des PNJs qui ne vont pas se taper dessus tant que le PC n'est pas là. Problème, parfois les PNJs n'appellent pas correctement le OnPerception. Donc ils ne se tapent pas dessus avant que le PC arrive, mais pas non plus une fois qu'il est là! Dans ce cas, il suffit de mettre dans le OnEnter de la zone ou du trigger du couloir: Code : void main()
{ object objet=GetFirstObjectInArea(); SetLocalInt(GetArea(OBJECT_SELF), "PCpresent", 1); //la variable de presence du PC while(GetIsObjectValid(objet)) { if(GetTag(objet)=="combattantami" || GetTag(objet)=="combattantennemi") { ExecuteScript("nw_c2_default3", objet);//appelle le script du OnCombatRoundEnd }; objet=GetNextObjectInArea(); }; DestroyObject(OBJECT_SELF); } A partir du moment ou le PC déclenche ça, le script de fin de round passe par tous les combattants taggés "combattantami" et "combattantennemi", et ils se tapent dessus. Voilà, c'est pas clair parce que c'est tordu, mais bon, ça marche, et la plupart des scripts sont génériques (fonctionnent un peu partout avec un peu tout le monde)... |
Revenir en haut | |
Dark Schneider Ecuyer Messages: 47 Localisation: Belgique |
ca marcherais pas si on mettait juste une zone trigger a un endroit forcé de passage ( pour reprendre l'idée du couloir )
qui ferais apparaitre l'une des deux créatures a coté de l'autre déposée a l'avance ( ou alors mème faire spawnerles deux sur la mème zone de rencontre ) ? ainsi elle commence à se fritter des que l'une des deux apparait. si c'est pour une zone a plusieur entrée, ben on fais un trigger qui prend toute la zone ( si ce que je dis est une connerie ne me blamez pas siouplait ) |
Revenir en haut | |
fikus Novice Messages: 11 |
Non à priori c'est pas une bêtise. Je pense que ça doit fonctionner.
Mais je veux une solution qui fonctionne avec des petits bonhommes déjà placés, pour des raisons d'organisation. (pouvoir modifier un gars parmi d'autres du même modèle etc.) Pour l'instant l'usine à gaz avec appel du OnCombatRoundEnd fonctionne bien... |
Revenir en haut | |
Atreide de Samarande Voyageur Messages: 2 |
fikus a écrit : Non à priori c'est pas une bêtise. Je pense que ça doit fonctionner.
Et pourquoi ne pas utiliser le trigger avec le changement de la faction ?
Mais je veux une solution qui fonctionne avec des petits bonhommes déjà placés, pour des raisons d'organisation. (pouvoir modifier un gars parmi d'autres du même modèle etc.) Pour l'instant l'usine à gaz avec appel du OnCombatRoundEnd fonctionne bien... Comme ça tu poses tous tes monstres, ils attendent en se regardant (faction Neutre) et dès que le PJ entre dans la (ou une des zones) trigger tu changes les factions. Créer des monstres dont les tags sont par ex. "monstre1", "monstre2a", "monstre2b" etc... Créer les monstres et créer des factions "faction1" et "faction2". Editer les relations entre les factions :
Comme ça personne n'attaque personne. Ne pas oublier d'affecter la bonne faction à chaque monstre. Si tu testes le module à ce moment, personne ne s'attaque. Créer une déclencheur générique (tag "trigger"). Editer le script "OnEnter" et mettre le code : Code : #include "nw_i0_plot" void main() { //Changer les TAGs string sMonstreFaction1="monstre1"; string sMonstreFaction2="monstre2a"; object oMonstre1 = GetObjectByTag (sMonstreFaction1); object oMonstre2 = GetObjectByTag (sMonstreFaction2); AdjustFactionReputation(oMonstre1, oMonstre2, -100); AdjustFactionReputation(oMonstre2, oMonstre1, -100); object oPartyMember = GetFirstFactionMember(oMonstre1, FALSE); while (GetIsObjectValid(oPartyMember) == TRUE) { ExecuteScript("nw_c2_default3", oPartyMember);//appelle le script du OnCombatRoundEnd oPartyMember = GetNextFactionMember(oPartyMember, FALSE); } oPartyMember = GetFirstFactionMember(oMonstre2, FALSE); while (GetIsObjectValid(oPartyMember) == TRUE) { ExecuteScript("nw_c2_default3", oPartyMember);//appelle le script du OnCombatRoundEnd oPartyMember = GetNextFactionMember(oPartyMember, FALSE); } } Et voici le script documenté : Code : #include "nw_i0_plot" void main() { //TAG pour 1 monstre de chaque faction string sMonstreFaction1="monstre1"; string sMonstreFaction2="monstre2a"; //récupère l'objet (monstre) associé au TAG object oMonstre1 = GetObjectByTag (sMonstreFaction1); //SendMessageToPC( GetFirstPC(), "test1 = " + GetTag(oMonstre1) ); object oMonstre2 = GetObjectByTag (sMonstreFaction2); //SendMessageToPC( GetFirstPC(), "test2 = " + GetTag(oMonstre2) ); //le monstre 1 de la faction 1 devient ennemi du monstre 2 de la faction 2 //en fait c'est la faction de chaque monstre qui est modifiée AdjustFactionReputation(oMonstre1, oMonstre2, -100); //il faut faire le pendant, sinon il faudra attendre le 1er coup reçu pour contre attaquer AdjustFactionReputation(oMonstre2, oMonstre1, -100); //nota : je mets -100 pour être sûr, mais -50 suffit //car normalement j'ai mis les relations à 50 entre les 2 factions //ici on passe en revue tous les membre de la première faction et on leur dit d'attaquer //ils attaquent tous leurs ennemis (oh ! super on vient juste avant d'en rajouter, cool) object oPartyMember = GetFirstFactionMember(oMonstre1, FALSE); while (GetIsObjectValid(oPartyMember) == TRUE) { // SendMessageToPC( GetFirstPC(), GetTag (oPartyMember) + " vs " + GetTag (oMonstre2) + " = " + IntToString (GetReputation (oPartyMember, oMonstre2))); ExecuteScript("nw_c2_default3", oPartyMember);//appelle le script du OnCombatRoundEnd oPartyMember = GetNextFactionMember(oPartyMember, FALSE); } //ici on passe en revue tous les membre de la seconde faction et on leur dit d'attaquer //ils attaquent tous leurs ennemis (oh ! super on vient juste avant d'en rajouter, cool) oPartyMember = GetFirstFactionMember(oMonstre2, FALSE); while (GetIsObjectValid(oPartyMember) == TRUE) { // SendMessageToPC( GetFirstPC(), GetTag (oPartyMember) + " vs " + GetTag (oMonstre1) + " = " + IntToString (GetReputation (oPartyMember, oMonstre1))); ExecuteScript("nw_c2_default3", oPartyMember);//appelle le script du OnCombatRoundEnd oPartyMember = GetNextFactionMember(oPartyMember, FALSE); } } Attention, si tu oublies #include "nw_i0_plot" ça ne compile pas. Si on ne fait qu'une seule boucle et/ou que l'on affecte qu'un seul ajustement de faction, alors le groupe attaqué ne fait rien jusqu'au dernier moment. Puis il réplique. Selon la distance entre les protagonistes cela peut poser problème ou non. En outre si tu exécutes le script sur un seul monstre (pas de boucle), il ira parfois attaquer seul. |
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