Gaming Zone Communautes Battlefield PiTrust Communautes Mods

Debugger son script. (COD et CODUO)
Ou comment éviter de s'arracher les cheveux

Retour sommaire

Liste des erreurs.

- bad syntax -
- bad token -
- dead entity is not an object -
- illegal break statement applicable ausi à : continue, return, wait, waitframe -
- illegal localized string reference. -
- infinitve loop in script -
- unexpected end of file -
- undefined is not an object -
- unknown (builtin) method -

Un petit conseil. Pour déceler toutes les erreurs, jouez, rejouez, rerejouez à votre map en changeant de façon de faire à chaque fois. Tentez de diversifier au maximum l'ordre des morts etc... Plus vous jouerez, plus vous aurez de chance de voir apparaitre des erreurs. Plus vous les corrigerez, plus votre map sera appréciée.

1/ le fichier .bat

Tout d'abord il faut pour cela que vous ayez dans votre fichier .bat les commandes suivantes :

+seta developer_script 1 => qui va vous définir les erreurs il me semble.
et
+set logfile 2 => qui va vous générer un fichier texte nommé "console". L'interêt d'un tel fichier est qu'il reprend toutes les lignes lues par le jeu au cours soit du chargement de la map, soit du jeu.
Si jamais votre script contient une erreur la première commande vous la pointera et vous en donnera une raison.

NB :le fichier "console" est généré dans un dossier au nom de votre map dans le répertoire Call Of Duty.

Il existe une autre commande je crois qui permets de lire les lignes de la console dans le jeu, mais je ne sais plus laquelle est-ce. Il faudrait que notre ami BushMan nous l'a donne car je crois qu'il la connait.

2/ Comment trouver son erreur.

Tout d'abord, rechercher le message  ******* script runtime error ******* ou ******* script compile error ******* souvent vers le bas du fichier.  

Puis examiner le message en lui même.

Voici comment se présente la chose.

******* script runtime error *******
undefined is not an object: (file 'maps\passage.gsc', line 23)
passage waittill("trigger");
*
called from:
(file 'maps\passage.gsc', line 4)
main()
*

Lorsque vous avez une erreur vous devez faire attention à plusieurs choses.
1/ repérer l'astérisque "*" qui définit l'endroit ou se place l'erreur. ainsi que la ligne ou elle se trouve. (ligne 23)
2/ repérer le mot "called from" qui nous donne toutes les cascades d'appels qui arrivent jusqu'à la ligne.(sur la ligne en-dessous).

3/ voici quelques erreurs.

Voici un script qui va nous servir dans pour cette partie.

1 //tuto créer par Tropheus
2
3
4 main()
5 {
6 maps\_load::main();
7
8
9 level.player takeallweapons();
10 level.player giveweapon("mp40");
11 level.player giveweapon("luger");
12 level.player switchToWeapon("luger");
13 level.player setViewmodel( "xmodel/viewmodel_kriegsmarine" );
14
15 iprintlnbold ("Passer derriere le mur");
16objective_add(1,"active","changer de skin.",getent ("pointage","targetname").origin);
17objective_current(1);
18
19passage=getent("pas_trigg","targetname");
20passage waittill("trigger");
21objective_state(1,"done");
22wait (5);
23 missionSuccess("passage", true);
24 }

a) Bad syntax error

> cas 1
Imaginons qu'a la ligne 19 on ait oublié le point-virgule (chose qui arrive très souvent)

passage=getent("pas_trigg","targetname")

On aurait le message suivant.

******* script compile error *******
bad syntax: (file 'maps\passage.gsc', line 20)//erreur d'écriture dans le fichier passage.gsc du  dossier maps à la ligne 20)
passage waittill("trigger");//l'erreur est pointée sur waittill.
             
*
************************************

Ici l'erreur est pointée sur la première commande (waittill) or elle est parfaitement écrite (donc pas mise en cause) et de plus si une erreur se fait dans une commande un autre message apparait.
Puisque tout est normal il faut donc remonter à la ligne du dessus. Et là on s'aperçoit que le point-virgule n'est pas présent.

> cas 2

Dans le cas d'un script avec plusieurs threads comme celui avec plusieurs conditions test_et.

24 ////////Tuer les soldats///////////////////////
25 objectif()
26 {
27 self waittill("death");
28 thread compile();
29 }
30 compile()
31
32 cond1=!isalive(level.soldat1);
33 cond2=!isalive(level.soldat2);
34 if((cond1==true) && (cond2==true))
35 missionsuccess("test_et",true);
36 }

Vous remarquerez qu'ici il manque une accolade d'ouverture en-dessous du nom du thread (compile()).

dans ce cas nous auront ceci.

******* script compile error *******
bad syntax: (file 'maps\test_et.gsc', line 32)//erreur d'écriture dans le fichier test_et.gsc du dossier maps à la ligne 32.
cond1=!isalive(level.soldat1);
*
************************************

Or ici aussi tout est ok sur cette ligne. Une fois de plus il va falloir regarder au-dessus pour trouver l'erreur.

> cas 3

******* script compile error *******
bad syntax: (file 'maps\test_et.gsc', line 34)//erreur ligne 34
if(cond1==true) && (cond2==true))//erreur pointée au niveau du ET (&&) pourtant elle est bien avant (il manque une parenthèse d'ouverture sur la condition "if".
                         *                           
************************************

Pourquoi ce pointage ? Car sans la parenthèse le jeu considère la condition "if" comme unique du coup tout signe écrit ensuite sera une erreur.


b) bad token

******* script compile error *******
bad token '"': (file 'maps\passage.gsc', line 19)// erreur sur la ligne 19 avec une erreur de "parole" ici le guillemet.
passage=getent("pas_trigg",targetname"); //la ligne fautive.
                                                         *   // quelle chance on nous dit exactement l'endroit ou se décèle l'erreur. (Pas ou elle se trouve.)
************************************


c) unexpected end of file.

Ici encore une erreur de frappe qui fait qu'on a oublié de fermer la dernière accolade.
On a donc dans ce cas l'erreur suivante.

******* script compile error *******
unexpected end of file found: (file 'maps\test_et.gsc', line 35)//fin de fichier non conforme à la ligne 35  du fichier test_et.gsc du dossier maps.
missionSuccess("passage", true);
                                                   *
************************************


d) undefined is not an object

Ici encore une erreur de frappe qui fait qu'à la ligne 19 du premier script on se soit trompé dans le targetname de l'entité à définir.


******* script runtime error *******
undefined is not an object: (file 'maps\passage.gsc', line 20)//passage n'est pas définit car il ne correspond pas au nom de mon trigger auquel il devrait faire référence. Nom donné sur la map.
passage waittill( "trigger");//la ligne incriminée
*
called from:
(file 'maps\passage.gsc', line 4)//la ligne est appelée dans la partie main du fichier passage.gsc dans le dossier maps à la ligne 4
main()
*
************************************


e) unknown (builtin) method

Encore une erreur de frappe à l'origine de cette erreur. (oubli d'un "L" à waittill).
Attention waittill prend 2 "T" et 2 "L".

******* script compile error *******
unknown (builtin) method 'waittil': (file 'maps\passage.gsc', line 20)//erreur ligne 20 sur la commande waittill (elle n'est pas reconnue par le jeu).
passage waittil("trigger");//la ligne où se trouve l'erreur.
             *                      // l'endroit où se trouve l'erreur.
************************************


f) infinitve loop in script

Cela signifie que vous avez utilisé l'opérateur "while", mais que vous n'avez pas mis de commande (wait(0.05); break; return; continue) pour terminer la vérification en boucle. Du coup le jeu au lancement va considérer que c'est une boucle infinie et ne va jamais charger la map.

*
script runtime warning: potential infinite loop in script.
(file 'maps\test_if.gsc', line 21)
while (isalive(level.soldat))

*// l'erreur est pointée juste après la condition "while". A vous maintenant de placer correctement une commande "briseuse" de boucle.


g) illegal break statement

Toujours avec un opérateur de condition "while" vous avez placé pour briser la boucle ci-dessus une commande "break". Seulement, elle n'est pas bien placée par rapport à la boucle de condition. Pour y remédier essayez de la placer juste avant ou juste après l'accolade pr rapport à l'endroit où elle était actuellement.

******* script compile error *******
illegal break statement: (file 'maps\test_if.gsc', line 30)
break;
*// L'erreur pointée sur le "break" signifie qu'il n'est pas au bon endroit. Mais pas forcément que ce n'est pas la bonne commande.
************************************

L'erreur se retouve aussi si vous avez return; continue; wait(0.05), waitframe; S'ils sont mal plcés vous obtiendrez la même erreur.
exemple : illegal return statement, etc...


h) Illegal localized string reference. (Erreur obtenue par "Gros Molard")

******* script runtime error *******
Illegal localized string reference: tuer l'officer (must contain only alpha-numeric characters and underscores: (file 'maps\raphael.gsc', line 102)
objective_add(1, "active", &"tuer l'officer",getent("obj_officier","targetname").origin);
*
called from:
(file 'maps\raphael.gsc', line 33)
level thread objectif_1();
*
called from:
(file 'maps\raphael.gsc', line 1)
main()
*

//Ici appelée par la ligne 1 qui renvoie sur la ligne 33 puis sur la ligne 102 du script raphael.gsc, l'erreur est encore une erreur de typologie. En effet, dans la linge 102 on trouve : objective_add(1, "active", &"tuer l'officer",getent("obj_officier","targetname").origin); or on nous précise juste au-dessus que nous n'avons le droit de n'utiliser que des caractères alphanumériques et des underscores (tiret-bas "_").


i) dead entity is not an object

Ceci arrive lorsque vous appliquez une action sur un personnage alors qu'il est déjà mort.

******* script runtime error *******
dead entity is not an object: (file 'maps\test_while.gsc', line 24)//à la ligne 24 on fait référence à
level.sniper.team="allies"; //level.sniper. Or celui-ci est déjà mort. Pour y remédier, appliquez lui une condition de vie.
       *
called from:
(file 'maps\test_while.gsc', line 25)
wait(0.05);
*
************************************

Voici le script avec les lignes rajoutées en rouge.

{
while (isalive(level.soldat))
      {
       level.soldat.team="allies";
       if (isalive(level.sniper))//première vérification dans la boucle pour ne pas la faire planter.
                 {
                  level.sniper.team="allies";
                  }
       wait(0.05);
       }
      if (isalive(level.sniper)) //seconde vérification hors de la boucle. Si jamais il meurt pdt la boucle.
     level.sniper.team="axis";
}


 

Voici donc quelques erreurs les plus souvent rencontrées. Si vous en avez d'autres avec la solution. Soit vous me les laissez sur le forum Caskami.soit vous m'envoyez un mail. Je vous remercie d'avance de contribuer à l'expension de la communauté COD et CODUO.

 

Pour CaskAmiProd et MohaaScriptLib
by Tropheus©
juillet 2005