Gaming Zone Communautes Battlefield PiTrust Communautes Mods

Créer un compteur pour un objectif. (COD et CODUO).

Retour au sommaire.

Tutorial réalisé par Tropheus.
Merci à Lucyfer pour son aide.

Le but de ce tutorial est de vous montrer comment construire un compteur au niveau d'un objectif.

1/ MAPPING.

Il vous faut une map avec un certain nombres d'axes ayant tous le même targetname (Ici fin). (Attention il est aussi possible de les sélectionner par d'autres critères que le targetname, c'est à vous de voir ce qui correspond le mieux à votre map).

Voila ce que cela donne.

2/ SCRIPTING

a/ Le fichier .gsc.

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");

    thread objectif1();
    thread compt_init();
    thread compteur();
}
////////Mise en tableau de AI et initialisation le l'objectif

objectif1()
{
    level.tab=getentarray("fin","targetname");
    level.count=level.tab.size;
    objective_add(1,"active",&"TEST_COMPTEUR_OBJ1");
    objective_string(1, &"TEST_COMPTEUR_OBJ1", level.count);
    objective_current(1);
}
////////// Définition des AI à compter.

compt_init()
{
    i=0;
    while(i<level.tab.size)
        {
        level.tab[i] thread bot();
        i++;
        }
}
///////////Décrémentation du compteur en fct de la mort des AI

bot()
{
    self waittill("death");
    level.count--;
    level notify("update_objective_1");
}
////////////Compteur // Affichage // Statut de l'objectif

compteur()
{
    while(level.count>0)
        {
        level waittill("update_objective_1");
        objective_string(1, &"TEST_COMPTEUR_OBJ1", level.count);
        }
    objective_state(1,"done");
    objective_string(1,&"TEST_COMPTEUR_OBJ1_FINI");
}

Explications

Tout d'abord il faut préciser que la variable level.count est la valeur qui sera décrémentée à chaque mort.

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");

    thread objectif1(); //envoi sur le thread définissant l'objectif.
    thread compt_init();//envoi vers le thread qui initialise le compteur.
    thread compteur();//envoi vers le compteur.
}
////////Mise en tableau de AI et initialisation le l'objectif

objectif1()
{
    level.tab=getentarray("fin","targetname");//mise en tableau des entité ayant pour targetname "fin".
    level.count=level.tab.size;
//on attribue à la variable level.count la taille du tableau (C'est à dire le nombre de cases) Chaque case correspondant à une entité.   (ici level.count = 3)
    objective_add(1,"active",&"TEST_COMPTEUR_OBJ1");//on définit et active l'objectif
    objective_string(1, &"TEST_COMPTEUR_OBJ1", level.count);
//on définit le texte à afficher. "level.count" sera la valeur affichée. c'est à dire 3 puis 2 puis 1 en fonction de morts axes.
    objective_current(1);
}
////////// Définition des AI à compter.
compt_init()
{
    i=0;//on donne la valeur 0 à i

    while(i<level.tab.size)//tant que i est inférieur à la taille du tableau on efectue la boucle.
        {
        level.tab[i] thread bot();//chaque entité du tableau est envoyée sur le thread bot().
        i++;//on incrémente i de 1.
        }
}
///////////Décrémentation du compteur (level.count) en fonction de la mort des AI.

bot()
{
    self waittill("death"); //on attend la mort d'un axe pour continuer.
    level.count--;//on diminue le valeur du compteur
    level notify("update_objective_1"); //on met à jour l'objectif 1.
}
////////////Compteur // Affichage // Statut de l'objectif

compteur()
{
    while(level.count>0)//tant que level.count est supérieur à 0
       {
       level waittill("update_objective_1");//le jeu attend la mise à jour de l'objectif pour continuer.
       objective_string(1, &"TEST_COMPTEUR_OBJ1", level.count);//on redéfinit le texte à écrire.
       }
    // Les lignes suivantes sont lues si et seulement si level.count n'est pas supérieur à 0
    objective_state(1,"done");//objectif1 rempli
    objective_string(1,&"TEST_COMPTEUR_OBJ1_FINI");//on change le texte de l'objectif.
}

b/ le fichier .str.

À placer dans le dossier localizedstrings/french dans votre pk3 comme vous devez en avoir l'habitude maintenant. Avec comme nom test_compteur.str.

Ici %s  permet de récupérer la valeur définie dans votre script. (Ici level.count)

REFERENCE            OBJ1
LANG_FRENCH        "Il reste encore %s Allemands à tuer."

REFERENCE            OBJ1_FINI
LANG_FRENCH        "Vous avez tué tous les Allemands."


ENDMARKER

Télécharger l'exemple (pour CODUO seulement)

c/ observations.

Je tenais à vous faire part d'une particularité.

Vous avez tous remarqué la boucle suivante.

compt_ini()
{
     i=0;
    while(i<level.tab.size)
        {
        level.tab[i] thread bot();
        i++;
        }
}


Je definis la valeur de i au début du thread avant la boucle while. Ensuite tant que i est plus petit que la taille du tableau on execute les commandes.
On envoie chaque élément du tableau vers le thread bot().
Puis j'incrémente la valeur de i de 1 avant que la boucle ne recommence.
De cette façon j'envoie vers le thread bot level.tab[0], level.tab[1], level.tab[2].

Cette boucle est tout à fait identique à une boucle FOR.
for(i=0;i<level.tab.size;i++)

Alors pour soulager votre script vous pouvez utiliser le thread suivant.

compt_ini()
{   
    for(i=0; i<level.tab.size; i++)
        {
        level.tab[i] thread bot();
        }
}


Voila pour cette précision, bon Mapping et Scripting

Tropheus

Pour CaskAmiProd et MohaaScriptLib
Tropheus©
Septembre 2005