A propos des animations.

Vous avez fondamentalement deux choix quand vous ajoutez des animations aux créatures dans le jeu. Les ajouter directement ou utiliser des fonctions automatiques dans l’IA générique.

Ajouter des animations directement.
La première chose à comprendre quand vous avez affaire à des scripts d’animation est que toutes les créatures n’ont pas toutes les animations. En règle générale, si la créature est une race jouable (humain, elfe, nain, demi-orc, gnome ou halfelin), elle aura toutes les animations. Si la créature est un monstre humanoïde (orc, gobelin…) elle a la plupart des animations, ci ce n’est toutes. Les races non-humanoïdes et spécialement les oiseaux, seront très limités dans leurs animations.

La file des actions (Action Queue)
La seconde chose à savoir quand vous scriptez des animations est comment utiliser la file des actions . Il y a certaines commandes de scripts qui commence par le mot « Action »…quand une créature appelle ces commandes sur elle même, elle place l’action dans une file. Le script ne passera pas à la ligne suivante avant que l’action soit terminée…jusqu’à ce qu’il n’y ait plus d’action ou la commande « ClearAllActions() ».

La raison pour laquelle c’est important est qu’il y a 2 commandes principales qui sont utilisées avec les animations :
ActionPlayAnimation et juste PlayAnimation. ActionPlayAnimation place la commande de l’animation dans la file…PlayAnimation demande à la créature de jouer l’animation immédiatement dès que c’est inscrit dans le script, en étant « prioritaire » sur tout autre commande placée dans la file.

Si je veux dans un script dire à quelqu’un de bouger jusqu’à un waypoint particulier puis de méditer 6 secondes, il ressemblera à ça :


void main()
{

object oTarget = GetNearestObjectByTag("WAYPOINT1");
ActionMoveToObject(oTarget);
ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE,
1.0, 6.0);
}


La créature se déplacera jusqu’au waypoint et attendra d’être arriver avant de commencer à jouer l’animation « meditate ».

Si je veux fixer une variable quand il aura terminé tout cela, je devrais l’ajouter aussi dans la file. Vous pouvez faire cela avec la commande ActionDoCommand(). Cela place une commande « non-Action » (sans « Action » au début) dans la file.


void main()
{

object oTarget = GetNearestObjectByTag("WAYPOINT1");
ActionMoveToObject(oTarget);
ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE,
1.0, 6.0);
ActionDoCommand(SetLocalInt (
OBJECT_SELF, "Done_Meditation", 1) );
}


Si j’avais fait la commande SetLocalInt sans la mettre dans la file, il se serait déclenché dès que ce point aurait été atteint dans le script…probablement avant que la créature soit arrivée au waypoint.

Les deux commandes pour les animations sont les suivantes :


void ActionPlayAnimation (int nAnimation, float fSpeed=1.0, float fSeconds=0.0)

- 'nAnimation' est la constante pour que l’animation soit jouée (c’est l’animation que vous voulez jouer)
- 'fSpeed' est la vitesse à laquelle l’animation est jouée…la créature peut, par exemple, tourner la tête très rapidement ou très lentement…1.0 est la vitesse normale.
- 'fSeconds' est uniquement utilisée pour les animations en boucle (comme la méditation)…elle détermine combien de temps vous souhaitez que l’information soit jouée. Si elle est laissée nulle dans une animation en boucle, celle ci sera jouée jusqu’à ce qu’on demande de faire autre chose.


void PlayAnimation (int nAnimation, float fSpeed=1.0, float fSeconds=0.0)

Comme expliqué ci dessus, c’est la même commande que ActionPlayedAnimation, execpté que l’animation n’est pas placée à la suite…elle est jouée immédiatement.

Constantes des Animation (Animation Constants)
Vous pouvez trouver une liste de toute les animations (utilisée dans la partie « nAnimation » de la commande) en sélectionnant le bouton « Constants » dans le script editor…toutes les constantes commencent par ANIMATION_*
Il y a deux types d’animations : « fire-and-forget » ou FNF (tire et oublie), qui sont jouées une fois et aucune durée n’est nécessaire.
Encore un rappel : TOUS LES MODELES N’ONT PAS TOUTES LES ANIMATIONS.Juste pour mentionner aussi que les animations listées dans « Constants » ne sont pas toutes les animations que le modèle est capable de jouer (il y a une animation de mort, après tout, aussi bien qu’une animation de combat)…C’est juste la liste de toutes celles qui peuvent être jouées par le script.

Utiliser les Animation de l’IA générique.
Pour une solution rapide et facile pour rajouter un peu de vie dans vos créatures placées, l’IA générique a 2 fonctions que vous pouvez utiliser.

Dans le script générique OnSpawn ("nw_c2_default9"), il y a une liste complète des commandes qui sont toutes commentées (les commentaires sont précédés par un « // » double qui les colorie en vert et évite qu’ils soient compilés). Pour utiliser l’animation pré construite, vous n’avez qu’à enlever le « // » devant une des commandes suivantes :


SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS); SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);

Ne vous tracassez pas à propos des commentaires qui sont sur la même ligne avec ces commandes…ils disent juste ce qu’ils font. Effacez simplement le double slash au début de la ligne.
Ensuite vous re-compilez le script et vous le sauvegardez dans un autre fichier. Et…c’est tout ce que vous avez à faire.

Qu’est ce que cela va faire ?
Fondamentalement, elles sont appellé par le OnHeartbeat (ce qui veut dire que le script est activé toutes les 6 secondes). Le script vérifie que la créature n’est pas en train de dormir, de combattre, de parler et que aucun ennemi n’est dans la ligne de vue…Si tout est okay, il joue l’animation.

'Ambient animations' signifit que la créature se déplacera aléatoirement, s’arretant de temps en temps pour se tourner vers les amis proches (créatures avec une réputation amicale) et jouer les animations « sociales » qu’il a (et, oui, ca marche avec tous les types de créature…et qu’il fera ce qu’il peut pour les créatures qui n’ont pas toutes les animations.)

'Immobile ambient animation' fait la même chose… sans le mouvement aléatoire. La créature reste sur place.

Vous pouvez donc placer plusieur crétures de ce type, par exemple, et elle se tourneront l’une vers l’autre à un interval aléatoire et sembleront parler, discuter, débattre…et même mélangeront, avec les animation ambiantes (ambient animations)

Est ce que ca marche de la même manière avec les objets placable (placeable objects)?
Oui. Vous pouvez demander à un coffre de s’ouvrir en utilisant ANIMATION_PLACEABLE_OPEN, ou éteindre une lampe en utilisant ANIMATION_PLACEABLE_DESACTIVATE. Vous devez juste garder quelques conseils à l’esprit :

1) Pour les objets placable qui sont source de lumière (comme les lampes), ce n’est suffisant de juste utiliser
ANIMATION_PLACEABLE_DEACTIVATE ou ANIMATION_PLACEABLE_ACTIVATE.
Ca affecte juste l’apparence de l’objet. Vous devez aussi utiliser la commande SetPlaceableIllumination
fixée à TRUE et préciser la zone concernée par RecomputeStaticLighting.
Voici un exemple d’utilisation d’une lumière plaçable:


// allume ou éteit les objets lumineux quand sélectionné // à placer dans OnUsed
void main()
{

if (GetLocalInt (OBJECT_SELF,"NW_L_AMION") == 0)
{
SetLocalInt (
OBJECT_SELF,"NW_L_AMION",1);
PlayAnimation (ANIMATION_PLACEABLE_ACTIVATE);
SetPlaceableIllumination (
OBJECT_SELF, TRUE);
RecomputeStaticLighting (GetArea(
OBJECT_SELF));
}

else
{
SetLocalInt (
OBJECT_SELF,"NW_L_AMION",0);
PlayAnimation (ANIMATION_PLACEABLE_DEACTIVATE);
SetPlaceableIllumination (
OBJECT_SELF, FALSE);
RecomputeStaticLighting (GetArea(
OBJECT_SELF));
}
}


2) Les portes ne sont pas des objets placables. La première chose que vous devez savoir à propos de ces dernières est que si une porte est déverrouillée, une créature qui doit aller à un point de l’autre côté de celle ci l’ouvrira automatiquement.

A part ça, les commandes pour les portes sont les suivantes :

l ActionOpenDoor: Si utilisée dans le script d’une créature, elle se déplacera jusqu’à la porte et l’ouvrira (si elle est ouverte). Si utilisée dans le script d’une porte (ou si la commande est envoyée à la porte via AssignCommand), la porte s’ouvrira toute seule.
l ActionCloseDoor: Comme ci dessus, seulement la porte est fermée.
l ActionLockObject: Si utilié dans le script d’une créature, elle se déplacera jusqu’à l’objet (ca peut être une porte ou un objet placable.) et tentera d’utiliser sa compétence de crochetage pour l’ouvrir. A utiliser UNIQUEMENT dans le script d’une créature !
l ActionUnlockObject: Comme au dessus, sauf que l’objet est déverrouillé.
l - SetLocked: C’est la commande à utiliser si vous voulez verrouiller ou déverrouiller une porte ou un objet sans l’aide d’une créature ou d’une compétence. Si 'bLocked' est fixé sur TRUE, l’objet sera fermé... Si il est fixé sur FALSE, il sera déverrouillé. (exemple: Utilisé dans le propre script d’une porte, SetLocked(OBJECT_SELF, TRUE) la fermera.)


// A mettre dans le OnHeartbeat d’une porte, il la fermera au crépuscule
// et l’ouvrira à l’aube.

void main()
{

if (GetIsDusk() && GetIsOpen (OBJECT_SELF))
{
ActionCloseDoor (
OBJECT_SELF)
// SetLocked est mise dans une ActionDoCommand parce que nous
// voulons qu’elle soit dans la file de la porte... Nous voulons
// que ActionCloseDoor soit fini avant de fermer la porte.

ActionDoCommand (SetLocked (OBJECT_SELF, TRUE))
}
else if (GetIsDawn() && GetLocked (OBJECT_SELF))
{

SetLocked (OBJECT_SELF, FALSE);
}
}



__________________
Théranthil, Mage Elfe prêtre de Mystra Membre des GdE
Parti Elmotiste pour un parler jowilien: Ministre supérieur de la corruption

"Les langues vont toujours bon train. Les pieds ont du mal à suivre."
(les bourses aussi NdT )
Mespert de la porte de Baldur