scripts de gestion du respawn joueur © Pumpkin

 


Description :

Ils composent un ensemble de scripts permettant principalement de "respawner" (néologisme signifiant que le joueur revient à la vie virtuelle) en rétablissant l'état du joueur tel qu'avant son décès virtuel, de palier à certaines situations gênantes (comme respawner au beau milieur d'une troupe ennemie), voir d'ajouter des options de jeu.

S'il y a encore une version Arma 2 simple qui subsiste, la version Operation Arrowhead est bien plus développée, puisqu'elle permet notamment la récupération du sac à dos et de son contenu. A cela il faut ajouter quelques "options" pouvant s'avérées nécessaires, comme la détection d'ennemis au alentour pour déplacer le joueur "à l'abri", ou la gestion du sac à dos, qui permet notament d'échanger un fusil de sniper avec une mitrailleuse lourde ou un lance-roquette anti-char, stocké dans le sac à dos, armes qui interdisent normalement le port du sac à dos.

 


Mise en oeuvre :

Dans le cas le plus simpliste, on peut utiliser une ligne de commande dans le fichier "init.sqf"

player addEventHandler ["killed",{[] execVM "plr_respawn\Respawn_player.sqf"}];

Mais souvent, il y a plusieurs choses à faire au respawn, plusieurs scripts à prendre en charge et pas forcément mes scripts ! La solution la plus simple consiste donc à faire appel à script "global" qui va contenir toutes les commandes et scripts qui devront être lancés à la "mort" du joueur, script que je nomme "respawn_handler.sqf" (cf template de mission). On va donc ecrire une autre ligne dans le fichier "init.sqf" :

player addEventHandler ["killed",{execVM "respawn_handler.sqf"}];

Ligne qui lancera le script "respawn_handler.sqf" dès la mort du joueur. Ci-dessous un script "respawn_handler.sqf" typique, standard, commenté pour une plus grande compréhension

script "briefing.sqf"

// ---------- METTRE CI-DESSOUS LES SCRIPTS DEVANT S'EXECUTER AVANT LA REAPPARITION DU JOUEUR ----------

// recup. des armes dans la configuration juste avant la mort - A GARDER EN 1ERE POSITION IMPERATIVEMENT !
_isOperationArrowhead = "TK_CIV_Takistani_Base_EP1" isKindOf "civilian"; //test simple pour distinguer ArmA2 "normale" (jusqu'à V1.07) de Operation Arrowhead

// choix du script à lancer en fonction de la version (compatible sac à dos ou non compatible)
// params = [rayon minimal de recherche, pas/incrément de recherche d'ennemis, distance maximale de respawn]
if ( _isOperationArrowhead ) then {
	nul = [[150,50,300]] execVM "plr_respawn\Respawn_player.sqf";
}
else {
	nul = execVM "plr_respawn\Respawn_player_A2.sqf";
};

// sécurité avant la poursuite des opérations sur le "nouveau" joueur : attendre que le joueur soit en vie
waituntil{alive player};
sleep 0.5;

// ---------- METTRE CI-DESSOUS LES SCRIPTS DEVANT S'EXECUTER APRES LA REAPPARITION DU JOUEUR ----------

if ( _isOperationArrowhead ) then {
	// ajout de la gestion du sac à dos (pour OA uniquement).
	nul = execVM "plr_respawn\Event_Inventory.sqf";
};
Et si je veux gérer un autre script, par exemple l'ajout/le rétablissement du menu qui permet l'utilisation de trousses de soins, menu perdu à la mort du joeur, je n'ai qu'à ajouté l'appel à l'endroit approprié
...
// ---------- METTRE CI-DESSOUS LES SCRIPTS DEVANT S'EXECUTER APRES LA REAPPARITION DU JOUEUR ----------

if ( _isOperationArrowhead ) then {
	// ajout de la gestion du sac à dos (pour OA uniquement).
	nul = execVM "plr_respawn\Event_Inventory.sqf";
};

// A activer si le joueur n'est pas inclut dans un déclencheur
nul = player execVM "medkit\recover_medkits_menu.sqf";

A remarquer les lignes qui gère l'inventaire et le contenu du sac à dos

if ( _isOperationArrowhead ) then {
// ajout de la gestion du sac à dos (pour OA uniquement).
nul = execVM "plr_respawn\Event_Inventory.sqf";
};
dont je reparlerai plus bas. Petit rappel si on ne veut pas de cette gestion : il suffit de la désactiver en mettant les deux // devant la ligne (donc "//nul = ...).

 


Paramétres :

Un tableau peut être passer en paramètre pour permettre le respawn à une certaine distance de l'endroit où le joueur est mort, avec une recherche d'un endroit sûr, sans ennemis si c'est possible. On peut aussi définir indépendamment la variable "PUMPKINRespawnMove" (par ex. : PUMPKINRespawnMove = [10,50,300]), ce qui aura le même effet.

Le fait de passer un tableau en paramètre déclenche automatique un appel au script "find_enemies.sqf", qui recherche une endroit sûr dans la mesure du possible et y déplace le joueur.

nul = ([rayon minimal de recherche, pas de recherche d'ennemis, distance maximale de respawn]) execVM "lib\Respawn_player.sqf"

Exemples :

nul = [] execVM "plr_respawn\Respawn_player.sqf";
récupération des armes + sac à dos et son contenu, sur place

nul = [[50,50,300]] execVM "plr_respawn\Respawn_player.sqf";
recherche d'ennemis à 50m autour, +50m si des ennemis sont détectés, jusqu'à 300m maxi

 


La gestion de l'inventaire et du sac à dos :

Le script scrute l'accès à un inventaire pour gérer ensuite le contenu du sac à dos. Ce qui permet d'avoir une sécurité supplémentaire pour rétablir l'inventaire complet, du joueur et du sac à dos, mais surtout permet un swap d'arme normalement interdit par le port du sac à dos. Par exemple, si on veut emmener un sac à dos, une mitrailleuse lourde, et être armé d'une fusil de sniper, il faut accéder à une caisse d'armement et

Après s'être retiré de l'inventaire de la caisse d'armement, un menu sera disponible permettant d'echanger l'arme contenu dans le sac à dos et l'arme à la main. Attention cependant à prévoir d'avoir les munitions appropriées dans l'inventaire du joueur car, tant que la mitrailleuse sera en main, le sac à dos sera inaccessible.

Autre "astuce", qui consiste à avoir sur le dos en même temps sac à dos et lance-roquette :

Après s'être retiré de l'inventaire de la caisse d'armement, le lance-roquette se placera sur le dos, s'effacera de l'inventaire du sac à dos, laissant vide tous les slots qu'il occupait et permettant ainsi de se bourrer de roquettes ! Evidemment, le lance-roquette sera accessible comme d'habitude.

Evidemment le "réalisme" en prend un coup mais l'équipe avec laquelle je joue est petite et on a besoin de "matos" lorsqu'on part en expédition ;) Et cette astuce est assez pratique.

Pour activer la gestion de l'inventaire, il faut deux appels obligatoires :

1.- dans le fichier "init.sqf"

nul = execVM "plr_respawn\Event_Inventory.sqf";

2.- dans le fichier "respawn_handler.sqf" ou tout autre fichier appelé par l'évènement "killed", ce qu'on a vu plus haut

if ( _isOperationArrowhead ) then {
// ajout de la gestion du sac à dos (pour OA uniquement).
nul = execVM "plr_respawn\Event_Inventory.sqf";
};
Ce qui est un peu "lourd" mais qui permet d'economiser une boucle infinie de scrutation, généralement désastreuse pour le temps machine.

Pour info et sans trop s'étendre, les deux derniers scripts du répertoire sont :

et ne sont pas à utiliser individuellement.