From 529e200a4c55a3c919d43bcb30a7e3f35a258e38 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 28 May 2015 17:56:45 +0200 Subject: [PATCH] Made explosives Zeus and AI compatible specifically in regards to Deadman's switches. --- addons/explosives/CfgEventHandlers.hpp | 25 +++++++---- addons/explosives/XEH_postInit.sqf | 44 ------------------- addons/explosives/XEH_preInit.sqf | 2 + .../functions/fnc_onInventoryChanged.sqf | 35 +++++++++++++++ addons/explosives/functions/fnc_onKilled.sqf | 26 +++++++++++ 5 files changed, 79 insertions(+), 53 deletions(-) create mode 100644 addons/explosives/functions/fnc_onInventoryChanged.sqf create mode 100644 addons/explosives/functions/fnc_onKilled.sqf diff --git a/addons/explosives/CfgEventHandlers.hpp b/addons/explosives/CfgEventHandlers.hpp index 8d0b110935..89e3017e8a 100644 --- a/addons/explosives/CfgEventHandlers.hpp +++ b/addons/explosives/CfgEventHandlers.hpp @@ -9,12 +9,19 @@ class Extended_PostInit_EventHandlers { }; }; -/* -TODO: Move the addEventHandlers out of PostInit into here or separate eventHandlers, -to enable them on all units, so unit switching works for explosives properly. -class Extended_Init_EventHandlers { -class CAManBase { -init = ""; -} -} -*/ +class Extended_Killed_EventHandlers { + class CAManBase { + GVAR(killedHandler) = QUOTE(_this call FUNC(onKilled)); + }; +}; + +class Extended_Take_EventHandlers { + class CAManBase { + GVAR(takeHandler) = QUOTE([ARR_3(_this select 0, _this select 1, _this select 2)] call FUNC(onInventoryChanged)); + }; +}; +class Extended_Put_EventHandlers { + class CAManBase { + GVAR(takeHandler) = QUOTE([ARR_3(_this select 1, _this select 0, _this select 2)] call FUNC(onInventoryChanged)); + }; +}; diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index 88a7bbba95..cc0b7347b6 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -50,47 +50,3 @@ GVAR(CurrentSpeedDial) = 0; }] call EFUNC(common,addEventHandler); [{(_this select 0) call FUNC(handleScrollWheel);}] call EFUNC(Common,addScrollWheelEventHandler); -player addEventHandler ["Killed", { - private "_deadman"; - call FUNC(place_Cancel); - _deadman = [(_this select 0), "DeadManSwitch"] call FUNC(getPlacedExplosives); - { - [(_this select 0), -1, _x, true] call FUNC(detonateExplosive); - } count _deadman; -}]; -player addEventHandler ["Take", { - private ["_item", "_getter", "_giver", "_config", "_detonators"]; - _item = _this select 2; - _getter = _this select 0; - _giver = _this select 1; - - _config = ConfigFile >> "CfgWeapons" >> _item; - if (isClass _config && {getNumber(_config >> "ACE_Detonator") == 1}) then { - private ["_clackerItems"]; - _clackerItems = _giver getVariable [QGVAR(Clackers), []]; - _getter SetVariable [QGVAR(Clackers), (_getter getVariable [QGVAR(Clackers), []]) + _clackerItems, true]; - - _detonators = [_giver] call FUNC(getDetonators); - if (count _detonators == 0) then { - _giver setVariable [QGVAR(Clackers), nil, true]; - }; - }; -}]; -player addEventHandler ["Put", { - private ["_item", "_getter", "_giver", "_config"]; - _item = _this select 2; - _getter = _this select 1; - _giver = _this select 0; - - _config = ConfigFile >> "CfgWeapons" >> _item; - if (isClass _config && {getNumber(_config >> "ACE_Detonator") == 1}) then { - private ["_clackerItems"]; - _clackerItems = _giver getVariable [QGVAR(Clackers), []]; - _getter SetVariable [QGVAR(Clackers), (_getter getVariable [QGVAR(Clackers), []]) + _clackerItems, true]; - - _detonators = [_giver] call FUNC(getDetonators); - if (count _detonators == 0) then { - _giver setVariable [QGVAR(Clackers), nil, true]; - }; - }; -}]; diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index d010fd8d1e..519d917793 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -42,6 +42,8 @@ PREP(getSpeedDialExplosive); PREP(module); +PREP(onInventoryChanged); +PREP(onKilled); PREP(onLanded); PREP(openTimerSetUI); diff --git a/addons/explosives/functions/fnc_onInventoryChanged.sqf b/addons/explosives/functions/fnc_onInventoryChanged.sqf new file mode 100644 index 0000000000..53ebb2464d --- /dev/null +++ b/addons/explosives/functions/fnc_onInventoryChanged.sqf @@ -0,0 +1,35 @@ +/* + * Author: Garth 'L-H' de Wet + * When a take/put event handler fires and a detonator is changed hands. + * Then take "attached" explosives. + * + * Arguments: + * 0: Receiver + * 1: Giver + * 2: Item + * + * Return Value: + * None + * + * Example: + * Handled by CBA + * + * Public: No + */ +#include "script_component.hpp" +private ["_config", "_detonators"]; +PARAMS_3(_receiver,_giver,_item); + +if (_receiver != ace_player) exitWith {}; + +_config = ConfigFile >> "CfgWeapons" >> _item; +if (isClass _config && {getNumber(_config >> "ACE_Detonator") == 1}) then { + private ["_clackerItems"]; + _clackerItems = _giver getVariable [QGVAR(Clackers), []]; + _receiver SetVariable [QGVAR(Clackers), (_receiver getVariable [QGVAR(Clackers), []]) + _clackerItems, true]; + + _detonators = [_giver] call FUNC(getDetonators); + if (count _detonators == 0) then { + _giver setVariable [QGVAR(Clackers), nil, true]; + }; +}; diff --git a/addons/explosives/functions/fnc_onKilled.sqf b/addons/explosives/functions/fnc_onKilled.sqf new file mode 100644 index 0000000000..74775b2e66 --- /dev/null +++ b/addons/explosives/functions/fnc_onKilled.sqf @@ -0,0 +1,26 @@ +/* + * Author: Garth 'L-H' de Wet + * Detonates all attached deadman's switched triggered explosives. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * Handled by CBA + * + * Public: No + */ +#include "script_component.hpp" +private ["_deadman"]; +_unit = _this select 0; +if (_unit == ACE_player) then { + call FUNC(place_Cancel); +}; +if (!isServer) exitWith{}; +_deadman = [_unit, "DeadManSwitch"] call FUNC(getPlacedExplosives); +{ + [_unit, -1, _x, true] call FUNC(detonateExplosive); +} foreach _deadman;