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:47:09


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
fikus
Novice
Inscrit le: 22 Mar 2003
Messages: 11
Répondre en citant
Posté le : 18/04/2003 09:39:33 Sujet du message : Activation des zones d'un module...

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Cassin
Papa-poule(t) & poissard intemporel
Inscrit le: 16 Sep 2002
Messages: 7471
Localisation: 6 bis rue de la Couveuse, Poulailler 39b
Répondre en citant
Posté le : 18/04/2003 10:05:14 Sujet du message :

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


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 Wink
_________________
Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ?

http://cassin1306.spaces.live.com
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
fikus
Novice
Inscrit le: 22 Mar 2003
Messages: 11
Répondre en citant
Posté le : 18/04/2003 10:17:44 Sujet du message :

Merci de la réponse, même si elle ne me réjouit pas Shocked ...
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 Very Happy

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
fikus
Novice
Inscrit le: 22 Mar 2003
Messages: 11
Répondre en citant
Posté le : 18/04/2003 17:05:23 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
fikus
Novice
Inscrit le: 22 Mar 2003
Messages: 11
Répondre en citant
Posté le : 21/04/2003 10:48:40 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Dark Schneider
Ecuyer
Inscrit le: 22 Avr 2003
Messages: 47
Localisation: Belgique
Répondre en citant
Posté le : 29/04/2003 09:52:49 Sujet du message :

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 Laughing ) ?
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 Very Happy

( si ce que je dis est une connerie ne me blamez pas siouplait Surprised )
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
fikus
Novice
Inscrit le: 22 Mar 2003
Messages: 11
Répondre en citant
Posté le : 29/04/2003 12:55:23 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Atreide de Samarande
Voyageur
Inscrit le: 18 Juil 2003
Messages: 2
Répondre en citant
Posté le : 18/07/2003 22:00:22 Sujet du message :


fikus a écrit :
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...
Et pourquoi ne pas utiliser le trigger avec le changement de la faction ?
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 :

  • faction1 / faction2 = 50
  • faction2 / faction1 = 50
  • PJ / faction1 = 50
  • PJ / faction2 = 50

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 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 46.38ms