Demande eclaircissement ...

Répondre
Partager Rechercher
Bonjour,
J'ai pas bien compris la différence de comportement qu'il existe entre AssignCommand() et ActioDoCommand(action).

Je suis allez lire sur www.nwnlexicon.com mais je dois dire que l'anglais et moi sont souvent signe de contre-sens

Alors si quelqu'un pouvait m'expliquer ?
AssignCommand() permet d'ajouter une action à la fin de la liste d'actions d'une créature.
Par exemple, imaginons un PNJ en train de lancer un sort. Alors qu'il est occupé avec son sort, on fait :
Code PHP:

AssignCommand(oLanceurDeSortActionMoveToLocation(lDestination)); 

Une fois qu'il aura fini son sort (et pas avant), le PNJ va marcher jusqu'à la destination indiquée.
Cette fonction est très utile car c'est elle qui permet de contrôler les PNJ (et éventuellement les PJ) par script.


ActionDoCommand(), quand à elle, constitue une action parmi beaucoup d'autres, telle que marcher, lancer un sort, jouer une animation, ouvrir une porte etc.
Cette action a la particularité de pouvoir être tout et n'importe quoi, tout simplement parceque c'est ce qui est passé en paramètre à la fonction qui sera effectué par la créature.
Le paramètre peut être une action toute bête, ou une commande de script, ou un mix des deux, etc.

Par exemple, imaginons notre lanceur de sort dont on a parlé au-dessus. Il est en ce moment en train de marcher tranquillement vers sa destination. C'est alors que nous, o cruels et omnipotents scripteurs, décidons de le supprimer sans autre forme de procès dès qu'il sera arrivé à destination (grâce à la fonction DestroyObject() ).
Ceci est impossible à réaliser avec la fonction DelayCommand(), puisque nous ne savons pas exactement quand arrivera le PNJ à sa destination (et donc nous ne pouvons pas fournir de délai à la fonction).
Nous allons donc ajouter une action à la suite de "marcher jusqu'à la destination", et qui sera "destruction de moi-même". Malheureusement, il n'existe pas de fonction ActionDestroyObject() ! Il est donc nécessaire d'utiliser ActionDoCommand().

Le résultat final sera donc :
Code PHP:

AssignCommand(oLanceurDeSortActionDoCommand(DestroyObject(oLanceurDeSort))); 

Voilà, j'espère que ça répond à ta question
Merci, c'est très clair ...

Maintenant juste 2 éclaircissements en plus :



  1. Dans les 2 cas les actions se positionnent donc en fin de fil d'attente ?
  2. Comment faire pour ajouter une action en plein milieu d'une file d'attente ?
Par exemple :
Imagine un script qui définisse 5 actions numéroté de 1 à 5 et qu'entre chaque action le PNJ fasse une scrutation.
Si le PJ détecte quelqu'un, vu qu'il est intelligent il fait comme si de rien pendant une action et donc agira à l'action n+1, histoire de laisser l'intrus (PJ) entrer dans la pièce (oui je sais c'est sadique).
L'action (nouvelle n+1), serait tout simplement de verrouiller la porte et de se moquer du PJ et de le passer en hostile.
C'est à toi de bien définir l'arborescence des actions que le PNJ doit ou devrait faire, si telle ou telle situation se présenterait.

Supprimer les actions en attente, je ne sais pas, mais tu peux déclencher l'action sadique du PNJ, grace à un signal que lui enverrait la porte si le joueur entre dans la dite pièce. Il vaut mieux un déclencheur, d'après moi, situé à une certaine distance de la porte, afin qu'il n'ait pas le temps de sortir.

Dans le OnEnter du déclencheur, on peut envoyer l'information au PNJ. Celui-ci va subir un "ClearAllActions()" pour rafraîchir sa liste, et lui assigner les différentes tâches à accomplir :
- Déplacement vers la porte
- Verrouillage de celle-ci
- Dialogue navrant
- Passage en mode hostile
Citation :
Publié par sinquem
  1. Dans les 2 cas les actions se positionnent donc en fin de fil d'attente ?
  2. Comment faire pour ajouter une action en plein milieu d'une file d'attente ?
1. Oui (c'est à dire qu'elles seront exécutées en dernier)

2. Plus ou moins impossible, à moins de recréer entièrement la file d'attente en la modifiant. Il n'existe quasiment pas de fonctions qui permettent de manipuler la pile d'actions, à part ClearallActions et GetCurrentAction.

Pour ton exemple, l'idéal serait de ne pas mettre les 5 actions d'un coup dans la file d'attente. Par exemple, le PNJ effectue l'action n, et arrive à la fin de celle-ci. Soit il a détecté un PJ, et alors il fait comme tu as dit, soit il n'a rien détecté et passe à l'action n+1 normalement.
L'utilisation de ActionDoCommand() est donc ici largement recommandée.
Répondre

Connectés sur ce fil

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