ACE3/addons/medical/functions/fnc_onCarryObjectDropped.sqf
2015-03-22 20:59:57 +01:00

85 lines
3.0 KiB
Plaintext

/*
* Author: Glowbal
* Called on event CarryObjectDropped
*
* Arguments:
* 0: The caller <OBJECT>
*
* Return Value:
* NONE
*
* Public: No
*/
#include "script_component.hpp"
private ["_unit","_params"];
_caller = _this select 0;
_target = _caller getvariable [QGVAR(carrying), objNull];
_carrying = _caller getvariable [QGVAR(isCarrying), -1];
if (_carrying >= 0) then {
if !(isNull (_target getvariable [QGVAR(copyOfUnit), objNull])) then {
_copy = _target;
_target = _copy getvariable [QGVAR(copyOfUnit), objNull];
if (isMultiplayer) then {
_target hideObjectGlobal false;
} else {
_target hideObject false;
};
detach _copy;
deleteVehicle _copy;
_target setvariable [QGVAR(disableInteraction), nil, true];
_target setvariable [QGVAR(hasCopy), nil, true];
};
_caller setvariable [QGVAR(isCarrying), -1, true];
if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then {
_caller removeWeapon "ACE_FakePrimaryWeapon";
};
[_target, false] call EFUNC(common,disableAI);
_caller setvariable[QGVAR(onStartMovingUnitParams), nil];
// handle the drag & carry administration
if (_carrying == 0) then {
_target setvariable [QGVAR(beingDragged), nil, true];
_caller setvariable [QGVAR(dragging), nil, true];
} else {
_target setvariable [QGVAR(beingCarried), nil, true];
_caller setvariable [QGVAR(carrying), nil, true];
};
// handle the drag & carry animiations
if ([_caller] call EFUNC(common,isAwake) && (vehicle _caller == _caller)) then {
[_caller,"amovpercmstpsraswrfldnon_amovpknlmstpslowwrfldnon", 1] call EFUNC(common,doAnimation);
};
if (vehicle _target == _target) then {
if (_carrying == 0) then {
[_target,"AinjPpneMstpSnonWrflDb_release", 2, true] call EFUNC(common,doAnimation);
} else {
[_target,"AinjPfalMstpSnonWrflDnon_carried_Down", 2, true] call EFUNC(common,doAnimation);
};
} else {
if ([_target] call EFUNC(common,isAwake)) then {
[_target,"", 2] call EFUNC(common,doAnimation); // TODO play animation for the current seat instead
} else {
// this might not work properly
[_target,([_target] call EFUNC(common,getDeathAnim)), 1] call EFUNC(common,doAnimation);
};
};
// Ensure that the unit does not get dropped through the floor of a building
if (!surfaceIsWater getPos _caller) then {
[{
EXPLODE_3_PVT(_this,_caller,_target,_killOnDrop);
if (vehicle _target == _target && (vehicle _caller == _caller)) then {
// This will set the target body/unit on the correct position, so it doesn't fall through floors.
_positionUnit = getPosATL _target;
_positionUnit set [2, (getPosATL _caller) select 2];
_target setPosATL _positionUnit;
};
}, [_caller,_target], 0.5, 0.5] call EFUNC(common,waitAndExecute);
};
};