/*
 Respawn_player.SQF © Pumpkin  -  version 2.42 (version getWeaponCargo & getMagazineCargo)
 -----------------------------
 V2.42 nota : suppression du retrait armes, magazines et items de l'ancien joueur


 récupération des armes à l'identique au moment de la mort du joueur.

 un tableau PUMPKINRespawnMove peut être défini indépendamment ou 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 :

 tableau "PUMPKINRespawnMove" = [rayon minimal de recherche, pas/incrément de recherche d'ennemis, distance maximale de respawn]

 fonctionne indépendement de ou avec "Event_Inventory.sqf"


 Paramètres:
 ===========
 nul = ([distance minimale de respawn, 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 = [[150,50,300]] execVM "plr_respawn\Respawn_player.sqf"; idem & recherche d'ennemis à 150m autour, +50m si des ennemis sont détectés, jusqu'à 300m maxi

*/

_testclient = call compile preprocessFile "lib\Client_detection.sqf";
if (not _testclient) exitwith {};

if (isnil "PUMPKINRespawnMove") then { PUMPKINRespawnMove = [] };


if (not (isNil "_this")) then {
	if (count _this > 0) then {
		_param = _this select 0;
		if (typename _param == "ARRAY") then { PUMPKINRespawnMove = _param };
		if (typename _param == "SCALAR") then { _nbspawn = _param };
		if (typename _param == "STRING") then { _mkrspawn = _param };
	};
};

private ["_backpackmags","_backpackwpns","_newbag"];

_extractCargo = compile preprocessFile "lib\Extract_Cargo.sqf";

// Sauver la config armes et magazines de l'ancien joueur
_oldplyer = player;

_plyerwpns = weapons player;
_plyermags = magazines player;

if (not isnil "Pumpkin_WeaponsInventory") then {
		Pumpkin_WeaponsInventory = [_plyermags, _plyerwpns];
};

_pWeap = primaryWeapon player;
_sWeap = secondaryWeapon player;

// Check si le joueur à un sac à dos
_bag = unitBackpack player;
_bagtype = typeof _bag;
if (_bagtype != "") then {
	_storedmags = getMagazineCargo _bag;
	_storedwpns = getWeaponCargo _bag;

	_backpackmags = _storedmags call _extractCargo;
	_backpackwpns = _storedwpns call _extractCargo;

	Pumpkin_BackpackContents = [_backpackmags, _backpackwpns];
};

// fin des sauvegardes
sleep 0.5;

//player setcaptive true;

// Retirer armes, magazines et items de l'ancien joueur
//removeallweapons player;
//removeAllItems player;
//sleep 0.2;

// Retirer les armes au joueur nouvellement ressuscité et effacer l'ancien corps
waitUntil {alive player};

if ((count PUMPKINRespawnMove) == 3) then { player execVM "plr_respawn\find_enemies.sqf" };

sleep 0.2;
deleteVehicle _oldplyer;
removeallweapons player;
removeAllItems player;
waituntil {primaryWeapon player == ""};
waituntil {secondaryWeapon player == ""};

// Réattribution du sac à dos et de son contenu à l'identique
if (_bagtype != "") then {
	// Cas des unités ayant un sac à dos par défaut
	if (not (isNull (unitBackpack player))) then {
		removeBackpack player;
		waituntil {isNull (unitBackpack player)};
	};

	player addBackpack _bagtype;
	waituntil {not (isNull (unitBackpack player))};

	// si Pumpkin_BackpackContents non vide, remplir le sac à dos avec le contenu sauvegarder
	_newbag = unitBackpack player;
	if (not isnil "Pumpkin_BackpackContents") then {
		_backpackmags = Pumpkin_BackpackContents select 0;
		_backpackwpns = Pumpkin_BackpackContents select 1;
	};

	// Effacement et restoration du contenu précédent
	clearMagazineCargo _newbag;
	clearWeaponCargo _newbag;

	if ((count _backpackmags) > 0) then {
		for "_i" from 0 to ((count _backpackmags) - 1) do {
			(unitBackpack player) addmagazinecargo [(_backpackmags select _i),1];
		};
	};
	if ((count _backpackwpns) > 0) then {
		for "_i" from 0 to ((count _backpackwpns) - 1) do {
			(unitBackpack player) addweaponcargo [(_backpackwpns select _i),1];
		};
	};

	// Détruire le sac à dos résiduel si le joueur avait un sac au moment de la mort
	sleep 0.1;
	_obj = (nearestObjects [player, ["Bag_Base_EP1"], 10]) select 0;
	deleteVehicle _obj;
};

if (not isnil "Pumpkin_WeaponsInventory") then {
	_plyermags = Pumpkin_WeaponsInventory select 0;
	_plyerwpns = Pumpkin_WeaponsInventory select 1;
};

// Restorer armes, munitions et items (après le sac à dos, sinon il y a pb avec les mitrailleuses ou les LR)
for [{_i = 0},{_i < count _plyermags},{_i = _i + 1}] do { player addmagazine (_plyermags select _i) };
for [{_i = 0},{_i < count _plyerwpns},{_i = _i + 1}] do { player addweapon (_plyerwpns select _i) };

// Fin de respawn : commuter et autoriser de suite le tir de l'arme principale
if (_pWeap != "") then {
	waitUntil {primaryweapon player != ""};
};
if (_sWeap != "") then {
	waitUntil {secondaryWeapon player != ""};
};

_weap = _pWeap;
if (_pWeap == "") then { _weap = _sWeap };

player selectweapon _weap;
_wpncfg = configFile >> "CfgWeapons" >> _weap;
_wpnname = getText (_wpncfg >> "displayName");
_wpnmuzzles = getArray (_wpncfg >> "muzzles");
player selectweapon (_wpnmuzzles select 0);

reload player;
player playmove "null";

sleep 0.2;
player action ["WEAPONONBACK",player];
sleep 0.2;
player action ["WEAPONINHAND",player];
sleep 0.2;
