/**
 * fn_makeCopyOfBody_f.sqf
 * @Descr: Makes a copy of a dead body. For handling dead bodies for actions such as load and carry.
 * @Author: Glowbal
 *
 * @Arguments: [oldBody OBJECT, caller OBJECT]
 * @Return: newUnit OBJECT Returns the copy of the unit. If no copy could be made, returns the oldBody
 * @PublicAPI: false
 */

#include "script_component.hpp"

private ["_oldBody","_newUnit","_class","_group","_position","_side","_allVariables"];
_oldBody = _this select 0;
_caller = _this select 1;

    if (alive _oldBody) exitwith {_oldBody}; // we only want to do this for dead bodies
    _name = _oldBody getvariable ["ACE_name","unknown"];
    _class = typeof _oldBody;
    _side = side _caller;
    _group = createGroup _side;
    _position = getPos _oldBody;

    _newUnit = _group createUnit [typeof _oldBody, _position, [], 0, "NONE"];

    _allVariables = [_oldBody] call EFUNC(common,getAllDefinedSetVariables);
    //  [NAME (STRING), TYPENAME (STRING), VALUE (ANY), DEFAULT GLOBAL (BOOLEAN)]
    {
        [_newUnit,_x select 0, _x select 2] call EFUNC(common,setDefinedVariable);
    }foreach _allVariables;
    _newUnit setVariable ["ACE_name",_name,true];

    _newUnit disableAI "TARGET";
    _newUnit disableAI "AUTOTARGET";
    _newUnit disableAI "MOVE";
    _newUnit disableAI "ANIM";
    _newUnit disableAI "FSM";
    _newUnit setvariable ["ACE_isDead",true,true];

    removeallweapons _newUnit;
    removeallassigneditems _newUnit;
    removeUniform _newUnit;
    removeHeadgear _newUnit;
    removeBackpack _newUnit;
    removeVest _newUnit;

    _newUnit addHeadgear (headgear _oldBody);
    _newUnit addBackpack (backpack _oldBody);
    clearItemCargoGlobal (backpackContainer _newUnit);
    clearMagazineCargoGlobal (backpackContainer _newUnit);
    clearWeaponCargoGlobal (backpackContainer _newUnit);

    _newUnit addVest (vest _oldBody);
    clearItemCargoGlobal (backpackContainer _newUnit);
    clearMagazineCargoGlobal (backpackContainer _newUnit);
    clearWeaponCargoGlobal (backpackContainer _newUnit);

    _newUnit addUniform (uniform _oldBody);
    clearItemCargoGlobal (backpackContainer _newUnit);
    clearMagazineCargoGlobal (backpackContainer _newUnit);
    clearWeaponCargoGlobal (backpackContainer _newUnit);

    {_newUnit addMagazine _x} count (magazines _oldBody);
    {_newUnit addWeapon _x} count (weapons _oldBody);
    {_newUnit addItem _x} count (items _oldBody);

    _newUnit selectWeapon (primaryWeapon _newUnit);
    //_newUnit playMoveNow ([_newUnit] call FUNC(getDeathAnim));

    deleteVehicle _oldBody;

    // TODO sometimes the old body does not get cleaned up properly. Look into garbage collection.

    _newUnit setDamage 0.9;
_newUnit