Gaming Zone Communautes Battlefield PiTrust Communautes Mods

La variable "self" (COD et CODUO)
ou comment économiser des lignes de script.


Retour au sommaire

Tutorial créé par Tropheus inspiré du tutorial de Bushman sur le déplacement des AI.

Dans l'exemple proposé vous pourrez comprendre l'intérêt d'utiliser la variable "self". Il s'agit en fait de script le même déplacement mais de deux façons différentes.

1/ Mapping

Ici rien de spécial, une map comme d'habitude avec 2 actors américains et 2 actors russes afin de bien voir les différents mouvements.
Les américains ont pour targtename us_1 et us_2
Les russes ont pour targtename russe_1 et russe_2

Vous ajouterez 2 trigger_multiple un pour le mouvement des américains, l'autre pour le mouvement des russes avec les targetnames respectifs trigg_us et trigg_russe.

Vous ajouterez aussi 2 node_concealment_stand (ou autre chose) un comme objectif du déplacement des américains, l'autre pour celui des russes avec respectivement les targetnames suivants : node_us et node_russe.

N'oubliez pas les node_pathnode pour mener vos soldats jusqu'à leur objectif.

Voici ce que cela donne au final.

2/ Scripting

Grace au script nous allons faire faire se déplacer les américains et les russes vers leur node objectif de deux façons différentes. Les américains iront rejoindre le node tel que l'on peut le faire pour un seul AI. Pour les Russes nous allons utiliser la variable "self".

Voici le script utilisé

main()
{
maps\_load::main();

//GIVE PLAYER WEAPONS
level.player takeallweapons();
level.player giveWeapon("panzerfaust");
level.player giveWeapon("thompson");
level.player giveWeapon("colt");
level.player giveWeapon("fraggrenade");
level.player switchToWeapon("thompson");

//définition des soldats russes//

soldat_russe_1 = getent("russe_1","targetname");
soldat_russe_2 = getent("russe_2","targetname");

//activation des soldats russes.//

soldat_russe_1 thread mouvement_russe();
soldat_russe_2 thread mouvement_russe();

thread mouvement_us();
}

mouvement_us()
{

trigger = getent ("trigg_us","targetname");

trigger waittill ("trigger");

// supprime le trigger une fois actionné

soldat_us_1 = getent ("us_1","targetname");
soldat_us_2 = getent ("us_2","targetname");

node = getnode ("node_us","targetname");

soldat_us_1 setgoalnode (node);
soldat_us_2 setgoalnode (node);

soldat_us_1 waittill ("goal");
soldat_us_1 waittill ("goal");

}

mouvement_russe()
{
trigger_ru = getent ("trigg_russe","targetname");

trigger_ru waittill ("trigger");

node = getnode ("node_russe","targetname");

self setgoalnode (node);

self waittill ("goal");
}

Explications.

main()
{
maps\_load::main();

//GIVE PLAYER WEAPONS
level.player takeallweapons();
level.player giveWeapon("panzerfaust");
level.player giveWeapon("thompson");
level.player giveWeapon("colt");
level.player giveWeapon("fraggrenade");
level.player switchToWeapon("thompson");

//définition des soldats russes//

soldat_russe_1 = getent("russe_1","targetname");
soldat_russe_2 = getent("russe_2","targetname");

//activation des soldats russes.//

soldat_russe_1 thread mouvement_russe();
soldat_russe_2 thread mouvement_russe();

//activation des soldats américains//

thread mouvement_us();
}

mouvement_us()
{
trigger = getent ("trigg_us","targetname");//on récupère le trigger_us
trigger waittill ("trigger"); // attend que le trigger soit actionné

soldat_us_1 = getent ("us_1","targetname");//détermine l’acteur à utiliser
soldat_us_2 = getent ("us_2","targetname");//détermine l’acteur à utiliser

node = getnode ("node_us","targetname"); //détermine le node à utiliser

soldat_us_1 setgoalnode (node); //connecte l’acteur au node
soldat_us_2 setgoalnode (node); //connecte l’acteur au node

soldat_us_1 waittill ("goal"); //attend que l’acteur arrive au node
soldat_us_1 waittill ("goal"); //attend que l’acteur arrive au node

}

mouvement_russe()
{
trigger_ru = getent ("trigg_russe","targetname");// on récupère le trigger_russe

trigger_ru waittill ("trigger"); // attend que le trigger soit actionné

node = getnode ("node_russe","targetname");//on détermine le node à utiliser.

self setgoalnode (node);//on connecte les soldats au node.

self waittill ("goal");//on attend que les soldats terminent leur déplacement.
}

Vous avez sans doute remarqué la différence entre les 2 threads.

Dans le premier, on répète les actions à effectuer pour chacun des soldats et encore ici on a de la chance on ne gère que 2 soldats imaginez un peu avec 15 AI ce que ça peut donner...

Dans le second thread, une seule ligne est nécessaire pour gérer les déplacements des 2 soldats. Ceci grace à la varialble "self".
Self remplace ici toutes les entités à conditions qu'elle aient été déterminées préalablement et qu'elles soient les activateurs du thread.

exemple:

soldat_russe_1 = getent("russe_1","targetname");//on détermine l'acteur à utiliser
soldat_russe_1 thread mouvement_russe();//Ici on dit au jeu d'activer le thread mouvement_russe avec comme variable soldat_russe_1.

comme l'AI a été définie au moment de l'envoi du thread on peut donc utiliser dans le thread mouvement_russe la variable "self". Self remplaçant ici toutes les variables qui renvoient à cette partie du script. soldat_russe_1 mais aussi soldat_russe_2.
Ceci est très utile car il permet d'allèger considérablement son script. Imaginer un peu si vous aviez 15 ou 20 entités à gérer en même temps? vous n'avez pas fini de tapez sur votre clavier.

Bon j'espère avoir été assez clair.

Téléchargez la map test créée pour CODUO.

Tropheus

Pour CaskAmiProd et MohaaScriptLib
by Tropheus©
juin 2005