Points de passage scriptés

Répondre
Partager Rechercher
Salut à tous.

N ayant trouvé aucun sujet se rapportant a cet fonctionnalité, qui, a ma connaissance, n existait pas dans NWN I, je post ici une traduction d un message trouvé sur les forums bioware ecrit par un dev d obsidian Charles Mead.

Ceci est relatif au deplacement des creatures suivant un set de point de passage et permet de scripter un evenement a chaque fois qu une creature atteint un point de passage. Cette fonction peux etre utilise egalement pour donner des points de passage different selon vos envies ( jour/nuit par exemple.

Quelques informations sur la nouvelle fonctionnalité appelée “Points de passages scriptés”.



Le système de points de passage scripté s appuie sur le système des Points de passage en déclenchant un script à chaque arrive à un point de passage. Ceci marche avec tout PNJ qui utiliser les scripts par défauts et un set de waypoint qui lui est associé.



Rappel du système de point de passage :

Les créatures se déplacent le long d une séquence de points de passage taggés selon cette convention : “ WP_<tag de la créature>_## “. ( ## est un numéro d ordre). Le PNJ commence son déplacement au point de passage 1 et continue de marcher vers les points de passages dans l ordre de leurs numéro ( le ## ). Une fois la séquence épuisée, il font le chemin en ordre inverse.


Le système de points de passage scripté :

Dans ce nouveau système, a chaque fois qu’ une créature atteint un point de passage un script est déclenché. Ce script est nommé de cette manière : « wp_<tag de la créature> ». A noter qu’ il n y a qu’ un seul script pour l ensemble des points de passage de la créature. Si le script n existe pas, il ne se passe rien, le PNJ poursuit sa route.

Exemple 1 :

Ce script ordonne au PNJ de s arrêter a chaque point de passage et de se tourner dans la direction du waypoint, de faire une pause d une seconde et de continuer sa route.


Code PHP:


#include "ginc_wp"
void main()
{
    
int iCurrentWP GetCurrentWaypoint();
    
FaceAndPause(iCurrentWP1.0f);

Notez que la fonction GetCurrentWaypoint() est utilisée. Cette fonction renvoie le point de passage qui viens d être atteint.



Exemple 2 :
-quand le PNJ atteint le point 1, il s assois, pour quelques secondes et il reprend sa route vers un point de passage pris au hasard.
-Quand le PNJ atteint le point 2, l animation « get low » est jouée et il reprend sa route vers le point1.
-Quand le PNJ atteint le point 3, il continue sa route vers le point 1

Code PHP:


#include "ginc_wp"
 
void main()
{
    
int iCurrentWP GetCurrentWaypoint();
    
int iNextWP;
    switch (
iCurrentWP)
    {
        case 
1:
            
iNextWP Random(GetNumWaypoints()-1) + 2;
            
SetNextWaypoint(iNextWP);
            
ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS1.07.0);
            break;
        case 
2:
            
SetNextWaypoint(1);
            
ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW1.04.0);
            break;
        case 
3:
            
SetNextWaypoint(1);
            break;
    }

A noter de cet exemple :
- L utilisation de la commande SetNextWaypoint(). Cette commande dit au PNJ quel est le prochain point de passage vers lequel il doit se diriger.



Utilisation avancée
Pour avoir des créatures avec des tags différents qui suivent le même set de point de passage :
Pour remplacer le set initial de points de passage, il faut utiliser une variable locale de type « string » appelée « WP_TAG » qui contiendra le nom du set de points de passage à utiliser.
Par exemple, si vous avez une créature « ours » qui suit un set de points de passage , vous pouvez avoir un poulet qui utilisera les points de passages de l’ours en plaçant sur votre poulet la variable locale WP_TAG avec la valeur « ours ».
NB : cette variable n est vérifiée qu’ au premier spawn de la créature, donc, changer cette variable par script ne donnera rien.


Comment changer un set de points de passage dynamiquement :
En utilisant cette fonction :
object SetWWPController(string sWalkWayPointsTag, object oCreature=OBJECT_SELF);

Donc, sur l exemple précédent, vous pouvez avoir votre poulet qui suivra les points de passage de l’ours en appelant la fonction de cette manière :
SetWWPController(“ours”);



Comment faire pour dire à un NPJ d arrêter de suivre ses points de passage :
SetWalkCondition(NW_WALK_FLAG_PAUSED, TRUE);

Pour que la créature recommence a suivre ses points de passage :
SetWalkCondition(NW_WALK_FLAG_PAUSED, FALSE);






Voila. Avec un peu d imagination, je pense que ce systeme offre de belles possibilités.
Je trouve ça pas mal du tout...

Je pense que la distribution des actes au hasard et des waypoints idem pourrait faire des miracles. En effet voir les PNJs faire toujours la même chose au même endroit...

Ce qui serait pas mal, ce serait d'assigner un système de rumeurs à tout cela, en stockant dans mysql les lignes à sortir par exemple...

Dommage qu'on aie pas accès aux tableaux dans nwscript... parce qu'il faut passer par des case du coup non ?
Tu peux faire tes propres fichiers 2DA, que tu peux utiliser avec la commande "Get2DAString(...)". Par exemple je peux faire un fichier 2DA que j'appelerai "dial_aleatoire.2da" :
Code:
     Phrase             Animation

0    "Bonjour"          animation1
1    "Au revoir"        animation2
2    ****               animation3
3    "oui"              animation4
4    "Non"              animation5
5    "Sinon ça va ?"    ****

etc...
Normalement en utilisant la fonction comme suit, je peux faire parler un PNJ et lui faire jouer une animation sans passer par des trucs SQL :
Code PHP:

string sPhrase Get2DAString("dial_aleatoire","Phrase",0);
string sAnimation Get2DAString("dial_aleatoire","Animation",2);

if(
sPhrase != "")
    
SpeakString(sPhrase);

if(
sAnimation != "")
    
PlayCustomAnimation(OBJECT_SELF,sAnimation); 

Je ne sais pas trop si les fichiers TLK personnalisés fonctionnent bien, mais si c'est le cas, tu peux faire ton propre fichier TLK, avec les phrases dedans, puis tu reportes le numéro de la phrase dans le fichier 2DA.
auriez vous compris cette partie ?
Moi j'ai un peu de mal à saisir tout ceci...

Code PHP:

#include "ginc_wp"
 
const int REDIRECTOR_WP 1;
 
void main()
{
    
int iCurrentWP GetCurrentWaypoint();// where we are
    
int iNextWP;
    switch (
iCurrentWP)
    {
        case 
1
// Node 1 should be placed off somewhere out of the way.  This is where the creatures
// will hang out in between reaching the end of the path and starting on a new path.
// Creatures will change their appearance in between travels.
 
// 1st param is the list of nodes they may reappear at. Must follow the pattern XX,YY,ZZ...
// 2nd param is the length of time to wait before reappearing.
                  
StandardRedirectorNode("02,03"5.0f);
            break;
        case 
2:
// Nodes 2 on up define the network the road walkers travel.  They will never return to the node
// they just came from.  When they reach an end node (typically a door or a route out of the area)
// they will be be "redirector node" - typically node 1.
 
// 1st param is the list of nodes they may travel to. Must follow the pattern XX,YY,ZZ...
//                (end nodes are those with only 1 element in the list)
// 2nd param is the redirector WP
                  
StandardRoadNetworkNode("03"REDIRECTOR_WP);
            break;
 
        case 
3:
                  
StandardRoadNetworkNode("02"REDIRECTOR_WP);
            break;
 
    }

Citation :
Publié par Ariok
Je dois bien avouer que je n ai pas compris grand chose a ce passage
j'ai l'impression que c'est une fonctionnalité qui permet aux PNJ d'arriver d'un WP particulier, et ensuite font leur trajet sans jamais revenir sur ce 1er WP.. bizarre.

Mais cela dépasse de loin mes compétences en english
je suis aller voir dans les scripts d'origines 1.06 :
StandardRedirectorNode :
où = ginc_wp.NSS
ce qui est marrant c'est de voir ce que ça doit faire =
EquipRandomArmorFromInventory();
ActionWait(fWaitTime);
JumpToNextWP(iWP);
ActionWait(1.0f);
ActionDoCommand(SetScriptHidden(OBJECT_SELF, FALSE));// show myself again

StandardRoadNetworkNode :
où = ginc_wp.NSS
ce que ça fait =
Retourne un WP aléatoirement, en excluant le second paramètre, dans ton cas
REDIRECTOR_WP qui est égal a 1, donc oui sans revenir sur le WP01

tu as raison KorteX dans ta logique.
Oui, j ai regardé aussi dans le ginc_wp et ce que j ai pu en comprendre c est que ces commandes sont la pour faire une sorte de chemin pour les PNJ.

Chemin qui traverse une carte par exemple de A->B arrivé à B, le PNJ disparait, est teleporté en A et change d armure donc d apparence.
bon j'ai fait des tests



Code PHP:

// le pnj réapparaitra au WP 02 ou 03 aléatoirement, après avoir changé d'armure (il choisit une armure aléatoirement aussi dans son inventaire), au bout de 5 secondes (5.0f)
StandardRedirectorNode("02,03"5.0f); 
Code PHP:

// le PNJ arrivé à ce WP n'aura pas le choix, il devra partir vers le 2, 
// ou le 3 s'il est au 2
// si on avait mis "03,04,05" il aurait choisi aléatoirement les WP 3,4, ou 5
StandardRoadNetworkNode("03"REDIRECTOR_WP);
StandardRoadNetworkNode("02"REDIRECTOR_WP); 
Code PHP:

// le PNJ ne choisi pas sa route, il ne peut retourner en arrière
// s'il le fait, il repart au WP 1, et donc on tombe sur une fonctionnalité due 
// à la 2eme variable (REDIRECTOR_WP)
// donc s'il apparait au 3, va vers le 2, et repart au 1
// s'il apparait au 2, il va vers le 3, et repart au 1

// il se téléporte jusqu'au 1, donc pas de soucis 
// s'il n'est pas accessible par la marche.
// par contre, le fait d'avoir 2 waypoint de même tag le fait s'immobiliser.
// (donc pas de GetNearest... ) 
valà..
donc je me suis amusé à faire des pnjs, avec des SetWWPController, un groupe de wp, plusieurs chemins (2-3-6-7-8-9, 4-5-10-11, etc..) et le système fonctionne bien. J'ai essayé avec plusieurs groupe de WP assignés aléatoirement, et c'est bon aussi... mais
- il est très lourd, la charge mémoire est considérable, et lag engendré est considérable passé 10 PNJs (j'ai fait un système monstrueux pour les WP de mes pnjs et il me prend carrément moins de charge UC.)
- Passé un certain moment, les pnjs peuvent s'arrêter (les chemins des pnjs ne sont pas forcément prioritaires)


D'autres fonctions sont pas mal par contre, des fonctions sociables, mais il ne fat pas les mettre sur les OnPerceived... il vaut mieux choisir de les mettre sur d sWP et choisir les interlocuteur avec des GetFirstObjectInShape
Je décrirait ces fonctions plus tard
-
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés