Arma 3 – Hisser un drapeau (Partie 1)

Hisser un drapeau dans un jeu comme Arma vous semble simple ? Derrière cette simple opération se cache pas mal de subtilités, surtout dans le cas d’un serveur dédié.

Dans cet article, on va tenter de comprendre l’animation d’un objet, la gestion des évènements, mais aussi les appels client/serveur.
Le but n’est pas de pousser chaque partie à fond, mais déjà de comprendre la base.

Le but n’est pas de devenir expert, mais d’avoir une compréhension globale afin de savoir ce qu’il est possible de faire et vers où se tourner pour savoir comment.

Petite vidéo liée

Je vous ai fait une petite vidéo pour présenter l’évolution de cet article :

Présentation du drapeau

Dans mon cas, je n’ai pas créé de 2ème profil pour faire cette mission, aussi la mission se trouve dans « Mes documents » / « Arma 3 » / « mpmissions » / …

« mpmissions », parce que j’ai enregistré dans le dossier multijoueur, mais ça ne change rien entre les deux.

J’utilise ici un JPG, cependant Arma ne prends pas en compte tous les jpg. Il faut un niveau de compression minimal, mais les informations sont parfois un peu compliquées à avoir.
Si vous avez un doute, le format .paa reste le plus optimisé pour Arma.

Changer de drapeau

Changer le drapeau est relativement simple une fois qu’on a une image compatible et que l’on a nommé son drapeau.

Comment nommer son drapeau et à quoi sa sert ?

La variable name, ou le nom de l’objet, est une variable dédiée et unique retournant l’objet dont il est question.
C’est pourquoi si vous tentez de nommer un autre objet avec le même nom, ce sera refusé.

On a notre objet dans une variable pour interagir avec.
Reste encore à connaitre la commande dédiée !

flag_0 setFlagTexture "images\cpc.jpg"; 

C’est bien pratique, mais tel quel, on est obligé de l’écrire dans la fenêtre de debug, durant la mission… pas très pratique.

Action simple

Ajoutons donc une action pour exécuter ce changement de drapeau.
Utilisons la commande sur la molette, qui est la plus utilisée sur Arma :

Pour ce faire, il faut utiliser la commande « addAction » (La documentation).
Le script suivant est copiable dans l’init du drapeau :

this addAction
[ 
	"Hisser le drapeau",
	{ 
		params ["_target", "_caller", "_actionId", "_arguments"]; 
		_target setFlagTexture "images\cpc.jpg";
	}
];

Avant d’expliquer le code, comment l’utiliser ?

Quand vous lancerez le jeu, il suffira alors de viser vers le bas du poteau afin de lancer l’action.
Si vous visez bien, vous devriez pouvoir faire l’action à 50 mètres de là !

this addAction
[ 
	"Hisser le drapeau",
	{ 
		params ["_target", "_caller", "_actionId", "_arguments"]; 
		_target setFlagTexture "images\cpc.jpg";
	}
];

Explication : le this est une variable qui cible votre objet dans ce cadre init et uniquement dans celui-ci.

AddAction prend deux paramètres dans notre cas :

  • Le titre, celui qui est affiché pour l’action molette
  • Ce qu’il produit, soit le script qu’on reconnait étant entre { et }.

Dans le script en lui-même, PARAMS permet de décomposer les variables du contexte… qui en réalité est la variable _this mais on ne s’attardera pas tout de suite dessus. Je vous ai mis l’ensemble des variables ainsi que leurs noms pour que tout se passe bien.

Enfin, nous avons notre setFlagTexture, qui s’applique ici sur _target, qui est la cible de notre script, celui à partir de qui on a effectué le addAction.
Pour les autres :

  • _caller : Le personnage du joueur qui a appelé l’action
  • _actionId : L’identifiant unique de l’action molette, mais uniquement pour notre joueur
  • _arguments : On ne s’attardera pas dessus, mais il est possible comme on va le voir au paragraphe suivant de passer plus de paramètres, dont des données supplémentaires

Toutefois, ce script a quelques problèmes : on peut l’appeler continuellement, et surtout, on peut l’appeler depuis 50 mètres de là !

Limiter la distance et le nombre d’interactions

Pour retenir que l’action a été faite et qu’on ne puisse pas la refaire, on va devoir ajouter une ligne dans le script :

_target setVariable ['cpc_flaged', true, true];

Explication : on va définir une variable sur le drapeau du nom de cpc_flaged qu’on passe à « true« , une fois le drapeau changé.
Le dernier « true » permet de transmettre à tous les clients et au serveur afin qu’ils prennent en compte cette nouvelle valeur.
C’est très important quand vous jouez en multijoueur, sinon chacun pourra faire l’action une fois. Avec cette option, une fois qu’une personne aura fait l’action, elle ne sera plus disponible, ni pour elle, ni pour les autres.

Une fois qu’on a cette variable, il faut la prendre en compte.

La méthode addAction propose beaucoup plus de paramètres que ceux que nous avons utilisés.
Je vous propose d’en utiliser deux de plus, à savoir la condition d’apparition et la distance d’interaction.

this addAction
[ 
	"Hisser le drapeau",
	{ 
		params ["_target", "_caller", "_actionId", "_arguments"]; 
		_target setVariable ['cpc_flaged', true, true];
		_target setFlagTexture "images\cpc.jpg"; 
	}, 
	[], 
	1.5,
	true,
	true,
	"", 
	"!(_target getVariable ['cpc_flaged', false])", 
	3, 
	false, 
	"", 
	"" 
];

Les paramètres en question sont les

  • « !(_target getVariable [‘cpc_flaged’, false]) »,
  • 3,

Le premier est une condition qui permet de dire si on doit afficher l’action ou non. Dans notre cas, on vient chercher via une variable réservée _target si la variable cpc_flaged a été initialisée, sinon on prend la valeur par défaut « false ».
Le ! permet d’inverser la condition.
Au final, on affichera la condition à condition que la variable n’ait pas encore été initialisée, ou si elle est encore à la valeur false (soit faux), étant un booléan, avec trois états : sans valeur, True et False.

Le second est la distance maximale à laquelle on pourra interagir avec notre action.

Les autres, sont les valeurs par défaut, même s’il était possible d’écrire le script sous la forme :

this addAction
[ 
	"Hisser le drapeau",
	{ 
		params ["_target", "_caller", "_actionId", "_arguments"]; 
		_target setVariable ['cpc_flaged', true, true];
		_target setFlagTexture "images\cpc.jpg"; 
	}, 
	nil, 
	nil,
	nil,
	nil,
	nil, 
	"!(_target getVariable ['cpc_flaged', false])", 
	3, 
	nil, 
	nil, 
	nil 
];

La valeur nil est l’absence de variable. Par ailleurs, quand on le passe pour une variable optionnelle on aura la valeur par défaut puisqu’on ne fera pas la différence entre ce nil et le fait de ne pas avoir spécifié de valeur.

Un petit soucis cependant : si vous voulez faire fonctionner ce script avec un serveur dédié, certes un seul joueur pourra faire l’action, MAIS le changement de drapeau ne se fera que pour un seul joueur et durant quelques secondes seulement.

Conclusion

La gestion du multijoueur n’est pas si simple, et l’article est déjà assez long, même si on ignore une partie des difficultés.

On a déjà un script fonctionnant parfaitement pour un joueur.
Les problèmes du multijoueur seront abordés dans la 2ème partie !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.