diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp index 916990f1b5..e2e8df28f1 100644 --- a/addons/captives/CfgEventHandlers.hpp +++ b/addons/captives/CfgEventHandlers.hpp @@ -55,3 +55,11 @@ class Extended_Respawn_EventHandlers { }; }; }; + +class Extended_Local_EventHandlers { + class CAManBase { + class ADDON { + local = QUOTE(call FUNC(handleLocal)); + }; + }; +}; diff --git a/addons/captives/XEH_PREP.hpp b/addons/captives/XEH_PREP.hpp index 2722214e1b..f2d7db410a 100644 --- a/addons/captives/XEH_PREP.hpp +++ b/addons/captives/XEH_PREP.hpp @@ -16,6 +16,7 @@ PREP(doUnloadCaptive); PREP(findEmptyNonFFVCargoSeat); PREP(handleGetIn); PREP(handleGetOut); +PREP(handleLocal); PREP(handleOnUnconscious); PREP(handlePlayerChanged); PREP(handleRespawn); diff --git a/addons/captives/functions/fnc_handleLocal.sqf b/addons/captives/functions/fnc_handleLocal.sqf new file mode 100644 index 0000000000..1664229a2f --- /dev/null +++ b/addons/captives/functions/fnc_handleLocal.sqf @@ -0,0 +1,61 @@ +/* + * Author: esteldunedain + * Called when a unit switched locality + * + * Arguments: + * 0: The Unit + * 1: Is local + * + * ReturnValue: + * None + * + * Public: No + */ + + +#include "script_component.hpp" + +params ["_unit", "_local"]; + +// Make sure that if the unit is captive it has a AnimChanged EH running ONLY on the machine that owns it +if (_local) then { + // If the unit is not handcuffed there's nothing to do + if !(_unit getVariable [QGVAR(isHandcuffed), false]) exitWith {}; + // If the unit already has an AnimChanged EH here then there's nothing to do either + if (_unit getVariable [QGVAR(handcuffAnimEHID), -1] != -1) exitWith {}; + + // Otherwise, restart the AnimChanged EH in the new machine + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + params ["_unit", "_newAnimation"]; + TRACE_2("AnimChanged",_unit,_newAnimation); + if (_unit == (vehicle _unit)) then { + if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { + TRACE_1("Handcuff animation interrupted",_newAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + }; + } else { + _turretPath = []; + { + _x params ["_xUnit", "", "", "_xTurretPath"]; + if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; + } forEach (fullCrew (vehicle _unit)); + TRACE_1("turret Path",_turretPath); + if (_turretPath isEqualTo []) exitWith {}; + + TRACE_1("Handcuff (FFV) animation interrupted",_newAnimation); + [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); + }; + }]; + TRACE_2("Adding animChangedEH",_unit,_animChangedEHID); + _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; +} else { + private _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1]; + // If the unit didn't have an AnimChanged EH here, do nothing + if (_animChangedEHID == -1) exitWith {}; + + // If the unit had a AnimChanged EH in the old machine then remove it + TRACE_1("removing animChanged EH",_animChangedEHID); + _unit removeEventHandler ["AnimChanged", _animChangedEHID]; + _unit setVariable [QGVAR(handcuffAnimEHID), -1]; +};