Dans un ancien article, j'avais expliqué la base pour créer un mode dans le jeu Arma 3.
Dans cette publication, je vais aborder rapidement la création de scripts spécifique pour une mission, et je ne m'attarderais que sur l'approche multijoueurs.

Où sont stockés les fichiers non compilés d'une mission Arma 3 ?

Sous Eden Editor quand vous enregistrez une mission, ses fichiers sons stockés dans : C:\Users\Pc\Documents\Arma 3\mpmissions\Nom_De_Votre_Mission.Carte_De_Votre_Mission

Soit dans mon cas : C:\Users\dev\Documents\Arma 3\mpmissions\Appuis_Rapproches.Enoch

Quels sont les noms réservés pour les noms de fichier ?

Excellente question, certains noms remplissent des fonctions particulières on gardera donc en tête les noms et les fonctionnalités des fichiers suivants par ordre d'appel :
init.sqf (appelé par chaque joueur et par le serveur lors de l'initialisation de la mission en simple comme en multijoueurs).

initServer.sqf (appelé uniquement par le serveur lors de l'initialisation du scénario).

initPlayerLocal.sqf (appelé par le joueur, mais exécuté uniquement en local sans contrôle par le serveur).

initPlayerServer.sqf (appelé par le joueur, mais exécuté sur le serveur).

(plus d'infos : https://community.bistudio.com/wiki/Initialization_Order)

Comment créer un script SQF spécifique que je pourrais appeler dans la mission Arma3 ?

Il suffit de rajouter le script en racine du dossier.

Pour notre exemple nous créons deux fichiers en racine de C:\Users\dev\Documents\Arma 3\mpmissions\Appuis_Rapproches.Enoch

init.sqf qui ajoutera l'action sur l'unité qui servira pour réaliser le ciblage.
laser_target_bomber.sqf qui contiendra le contenu de notre script.

Création de l'unité d'appel :

Notre unité d'appel doit avoir pour nom de variable unit_target

Assigniation d'un nom de variable sur une unité arma3
Elle doit disposée de l'objet désignateur laser équipé d'une batterie.

Désignateur laser arma3

Impératif - comprendre les systèmes de coordonnées AGL, ASL et ATL.

Avant de parler du script lui même il semblait impératif d'aborder la thématique du système de coordonnées dans Arma3.

Arma3 offre 4 types de référentiels à connaître :

L'ASL pour Above Sea Level, littéralement le niveau de la mer (vagues exclues).

L'ASLW pour Above Sea Level including wave, littéralement le niveau de la mer vagues inclusent.

L'ATL pour Above Terrain Level, soit le niveau de la croute terrestre, il peut donc être suivant les circonstances au-dessus ou en dessous de la mer.

L'AGL pour Above Generic Groud Level. Le référentiel AGL offre la possibilité de manipuler des coordonnées sur une surface terrestre, le niveau de la mer en tenant compte des vagues.

arma3 référentiels

Création du script d'appel de la fonction de bombardement :

 Dans le fichier init.sqf, on commence par définir la variable de mission global_map_laser_target_destroy à la valeur 3 (pour limiter le nombre possible de frappes).

missionNamespace setVariable ["global_map_laser_target_destroy",3,true]; 

Puis on ajoute l'action sur l'unité (noob: il est possible de la lier à un déclencheur, un l'initialisation de l'objet, etc.) avec sa fonction anonyme qui appelle notre script de frappe aérienne.
Cette fonction anonyme prend pour paramètre la position ATL (donc par rapport au sol) de ce que désigne le pointeur laser du désignateur du personnage.

if (isServer) then {
	missionNamespace setVariable ["global_map_laser_target_destroy",3,true]; 
	
	/**Ajoute l'action sur l'unité */
	private _action = unit_pointer addAction ["Frappe guidage laser", {laser_target_bomber = [getPosATL laserTarget unit_pointer] execVM "laser_target_bomber.sqf";}]; 
	unit_pointer setUserActionText [_action , "Frappe guidage laser", "<img size='2' image='\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\target_ca'/>"]; 
};

Plus d'infos sur le addAction de Arma3 : https://community.bistudio.com/wiki/addAction

Ce qui nous permettra en jeu d'avoir l'action "Frappe guidage laser" dans le menu mais aussi l'icone au milieu de l'écran quand l'action est séléctionnée dans le menu.

Arma3 menu option

Création de la fonction de frappe aérienne :

L'objectif du script étant de permettre de délivrer 3 frappes aériennes là où pointe le rayon infrarouge du désignateur laser avec un délai pouvant varier de 20 a 50 secondes entre la demande et l'arrivée de la frappe. Il doit également ne pas permettre au joueur de déclencher l'appel alors qu'il n'est pas équipé du désignateur laser, et n'a pas activé le pointeur infrarouge.

 arma3 script

Le code est volontairement ultra commenté

//paramètre d'entrées de la fonction 
params [
	"_position",["_vehicle","B_Plane_CAS_01_F"],["_type",3],"_logic"
];

//Rappel : le paramètre _position = [getPosATL laserTarget player]
if(_position select 0 == 0 && _position select 1 == 0 && _position select 2 == 0) then { 
	"down" cutText ["<t color='#ff0000' size='1.5'>Equipez vous du désignateur laser et marquer la cible à détruire avec le marqueur laser IR</t>", "PLAIN DOWN",-1,true,true];
}
else{
	
	/**Génère le nombre de frappes disponibles à 3 si non initiée dans le init.sqf mission */
	private _max_usage = missionNamespace getVariable "global_map_laser_target_destroy";
	if (isNil "global_map_laser_target_destroy") then
	{	
		_max_usage = 3;
		missionNamespace setVariable ["global_map_laser_target_destroy", _max_usage];
	};
		

	if(_max_usage > 0) then {
		//Décrémente le nombre d'usage restant 
		_max_usage = _max_usage-1;
		missionNamespace setVariable ["global_map_laser_target_destroy",_max_usage,true];
		
		//Génère un délais aléatoire entre 20 et 50 secondes
		_wait_delay = random [20,30,50];
		
		//Informe les joueurs du délais
		["FAF - QG", format["Demande bien prise, Rafale en approche dans %1 secondes - Indicatif ROGUE.",_wait_delay]] spawn BIS_fnc_showSubtitle;
		
		//Bloque le thread pendant le délais
		sleep _wait_delay;

		//Génère l'unité 
		_logic = "Logic" createVehicle_position;
		_logic setVariable ["vehicle",_vehicle];
		_logic setVariable ["type",_type];
		
		//Informe les joueurs que la frappe est imminentes (environs 5 secondes)
		["FAF - ROGUE", "En approche de l'objectif."] spawn BIS_fnc_showSubtitle;
	
		[_logic,nil,true] call BIS_fnc_moduleCAS;
		deleteVehicle _logic;
		
		sleep 3;
		
		//Informe le joueur sur le nombre de frappes aériennes dispo
		"down" cutText [format["<t color='#ff0000' size='1.5'>Frappes aériennes disponibles : %1</t>",_max_usage], "PLAIN DOWN",-1,true,true];
	}
	else{
		//Informe le joueur qu'il n'y à plus aucune frappe
		["FAF - QG", "Négatif - Aucune unité aérienne disponible."] spawn BIS_fnc_showSubtitle;
	};

};

 

arma3 ciblage d'unité