Arma: Protéger des variables de l’écrasement

La commande compilefinal permet de protéger une fois pour toute le contenu d’une variable contre la modification durant le temps de vie de la variable (voir namespace). Cette méthode est notamment à utiliser pour protéger tes fonctions ou variables globales contre l’écrasement par des cheaters.

mavariable = compilefinale "ma valeur";

Premier cas de figure, si tu utilises une fonction déclarée dans un fichier prévu pour cela, tu peux utiliser une commande de ce type:

tafonction = compilefinal preprocessFileLineNumbers "tafonction.sqf";
tafonction = "ecrasement";
// renverra le contenue du fichier tafonction.sqf compilé

Par contre si ta fonction est déclarée dans un fichier avec d’autres fonctions, cette méthode ne marche plus 😦

Le problème étant que cette commande ne prend en paramètre que des variables de type STRING, alors dans ce cas de figure tu vas avoir une fonction entière à protéger de type CODE.

Deux méthodes, tu gères toi même l’échappement des quotes et tu mets donc ta fonction sous la forme d’un STRING, et tu places au bon endroit les quotes ou double quotes.

tafonction = compilefinal 'hint "hello";';

Mais parfois cette méthode peut être longue et compliquée, par exemple si tu utilises également des macros ou du code qui vient de l’extérieur.

Dans ce cas de figure, tu peux utiliser plutôt ce workaround :

private _array = toArray str (missionNamespace getVariable tavariable); 
_array deleteAt (count _array - 1); 
_array deleteAt (0); 
missionNamespace setVariable[tavariable, (compileFinal toString _array)]; 

En résumé ce qui différencie un CODE d’un STRING sous ARMA est uniquement l’adjonction de crochet {} en début et fin de ta chaine de caractère. Ce code les supprime simplement pour que le compile final les remette et surtout flag la variable comme non modifiable. C’est pas très clean mais c’est directement lié à l’implémentation de BIS qui ne donne pas un accès direct à la méthode du moteur ARMA qui permet de protéger la variable.

Pour une meilleur compréhension du fonctionnement du moteur, celui-ci utilise l’équivalent d’une structure qui contient la donnée de la variable , et un flag boolean. Si le flag est setté à true, alors la donnée de la variable a été définie et elle ne peut plus être réécrite. Ces fonctionnalités ne sont pas accessibles par le développeur à travers le SQF ce qui donne un niveau de sécurité suffisant pour la partie script.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s