From 87452c6aa18c0143af2c37fb6fcb4787b5e53da8 Mon Sep 17 00:00:00 2001 From: Moritz Schmidt Date: Tue, 28 Sep 2021 11:23:56 +0200 Subject: [PATCH] houselight switch implementation * while in a house, use self interact/equipment to look for the fuse box * fuse box will appear as a helper object that will have actions for turning off/on all lights in the house --- addons/houseLightSwitch/$PBOPREFIX$ | 1 + addons/houseLightSwitch/CfgEventHandlers.hpp | 17 +++++++ addons/houseLightSwitch/CfgVehicles.hpp | 16 +++++++ addons/houseLightSwitch/README.md | 9 ++++ addons/houseLightSwitch/XEH_PREP.hpp | 9 ++++ addons/houseLightSwitch/XEH_postInit.sqf | 5 ++ addons/houseLightSwitch/XEH_preInit.sqf | 9 ++++ addons/houseLightSwitch/XEH_preStart.sqf | 3 ++ addons/houseLightSwitch/config.cpp | 18 +++++++ .../functions/fnc_action_fusebox.sqf | 23 +++++++++ .../functions/fnc_condition.sqf | 13 ++++++ .../functions/fnc_condition_fusebox.sqf | 3 ++ .../functions/fnc_condition_off.sqf | 3 ++ .../functions/fnc_condition_on.sqf | 3 ++ .../functions/fnc_createFuseboxActions.sqf | 44 ++++++++++++++++++ .../functions/fnc_ensureFuseboxHelper.sqf | 21 +++++++++ .../functions/fnc_fadeFuseboxHelper.sqf | 42 +++++++++++++++++ .../fnc_server_setBuildingMainSwitch.sqf | 35 ++++++++++++++ .../functions/script_component.hpp | 1 + addons/houseLightSwitch/script_component.hpp | 4 ++ addons/houseLightSwitch/ui/bulb-off.paa | Bin 0 -> 22016 bytes addons/houseLightSwitch/ui/bulb-on.paa | Bin 0 -> 22016 bytes addons/houseLightSwitch/ui/bulb-question.paa | Bin 0 -> 22016 bytes 23 files changed, 279 insertions(+) create mode 100644 addons/houseLightSwitch/$PBOPREFIX$ create mode 100644 addons/houseLightSwitch/CfgEventHandlers.hpp create mode 100644 addons/houseLightSwitch/CfgVehicles.hpp create mode 100644 addons/houseLightSwitch/README.md create mode 100644 addons/houseLightSwitch/XEH_PREP.hpp create mode 100644 addons/houseLightSwitch/XEH_postInit.sqf create mode 100644 addons/houseLightSwitch/XEH_preInit.sqf create mode 100644 addons/houseLightSwitch/XEH_preStart.sqf create mode 100644 addons/houseLightSwitch/config.cpp create mode 100644 addons/houseLightSwitch/functions/fnc_action_fusebox.sqf create mode 100644 addons/houseLightSwitch/functions/fnc_condition.sqf create mode 100644 addons/houseLightSwitch/functions/fnc_condition_fusebox.sqf create mode 100644 addons/houseLightSwitch/functions/fnc_condition_off.sqf create mode 100644 addons/houseLightSwitch/functions/fnc_condition_on.sqf create mode 100644 addons/houseLightSwitch/functions/fnc_createFuseboxActions.sqf create mode 100644 addons/houseLightSwitch/functions/fnc_ensureFuseboxHelper.sqf create mode 100644 addons/houseLightSwitch/functions/fnc_fadeFuseboxHelper.sqf create mode 100644 addons/houseLightSwitch/functions/fnc_server_setBuildingMainSwitch.sqf create mode 100644 addons/houseLightSwitch/functions/script_component.hpp create mode 100644 addons/houseLightSwitch/script_component.hpp create mode 100644 addons/houseLightSwitch/ui/bulb-off.paa create mode 100644 addons/houseLightSwitch/ui/bulb-on.paa create mode 100644 addons/houseLightSwitch/ui/bulb-question.paa diff --git a/addons/houseLightSwitch/$PBOPREFIX$ b/addons/houseLightSwitch/$PBOPREFIX$ new file mode 100644 index 00000000..cbb92168 --- /dev/null +++ b/addons/houseLightSwitch/$PBOPREFIX$ @@ -0,0 +1 @@ +x\grad\addons\houseLightSwitch diff --git a/addons/houseLightSwitch/CfgEventHandlers.hpp b/addons/houseLightSwitch/CfgEventHandlers.hpp new file mode 100644 index 00000000..0d3301d6 --- /dev/null +++ b/addons/houseLightSwitch/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/houseLightSwitch/CfgVehicles.hpp b/addons/houseLightSwitch/CfgVehicles.hpp new file mode 100644 index 00000000..b15bcec1 --- /dev/null +++ b/addons/houseLightSwitch/CfgVehicles.hpp @@ -0,0 +1,16 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GRAD_houseLightSwitch_fusebox { + displayName = "Locate fuse box"; + condition = QUOTE(call FUNC(condition_fusebox)); + exceptions[] = {}; + statement = QUOTE(call FUNC(action_fusebox)); + icon = "\x\grad\addons\houseLightSwitch\ui\bulb-question.paa"; + }; + }; + }; + }; +}; diff --git a/addons/houseLightSwitch/README.md b/addons/houseLightSwitch/README.md new file mode 100644 index 00000000..2f4fbc60 --- /dev/null +++ b/addons/houseLightSwitch/README.md @@ -0,0 +1,9 @@ +### houseLightSwitch + +ACE self interact menu to switch all lights in a house. Requires player to be in and reasonably close to the house center. + +To test, move into a house that has lights - for example "Land_House_C_3_EP1" or "Land_House_C_9_EP1". Terrains containing these buildings are Zargabad or Uzbin_Valley . Be close to the center of the house. Self interact should now contain a "switch house lights off" entry. + +#### Maintainer(s) + +* Fusselwurm diff --git a/addons/houseLightSwitch/XEH_PREP.hpp b/addons/houseLightSwitch/XEH_PREP.hpp new file mode 100644 index 00000000..eda0c711 --- /dev/null +++ b/addons/houseLightSwitch/XEH_PREP.hpp @@ -0,0 +1,9 @@ +PREP(action_fusebox); +PREP(createFuseboxActions); +PREP(condition); +PREP(condition_fusebox); +PREP(condition_off); +PREP(condition_on); +PREP(ensureFuseboxHelper); +PREP(fadeFuseboxHelper); +PREP(server_setBuildingMainSwitch); diff --git a/addons/houseLightSwitch/XEH_postInit.sqf b/addons/houseLightSwitch/XEH_postInit.sqf new file mode 100644 index 00000000..24075fd9 --- /dev/null +++ b/addons/houseLightSwitch/XEH_postInit.sqf @@ -0,0 +1,5 @@ +#include "script_component.hpp" + +if (isServer) then { + [QGVAR(setBuildingMainSwitch),FUNC(server_setBuildingMainSwitch)] call CBA_fnc_addEventHandler; +}; diff --git a/addons/houseLightSwitch/XEH_preInit.sqf b/addons/houseLightSwitch/XEH_preInit.sqf new file mode 100644 index 00000000..b47cf662 --- /dev/null +++ b/addons/houseLightSwitch/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +ADDON = true; diff --git a/addons/houseLightSwitch/XEH_preStart.sqf b/addons/houseLightSwitch/XEH_preStart.sqf new file mode 100644 index 00000000..02288857 --- /dev/null +++ b/addons/houseLightSwitch/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/houseLightSwitch/config.cpp b/addons/houseLightSwitch/config.cpp new file mode 100644 index 00000000..92740c1c --- /dev/null +++ b/addons/houseLightSwitch/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + author = "$STR_grad_Author"; + name = QUOTE(ADDON); + url = "$STR_grad_URL"; + requiredVersion = 1.0; + requiredAddons[] = {"grad_main", "ace_interact_menu"}; + units[] = {}; + weapons[] = {}; + VERSION_CONFIG; + authors[] = {"Fusselwurm"}; + }; +}; + +#include "CfgVehicles.hpp" +#include "CfgEventHandlers.hpp" diff --git a/addons/houseLightSwitch/functions/fnc_action_fusebox.sqf b/addons/houseLightSwitch/functions/fnc_action_fusebox.sqf new file mode 100644 index 00000000..231d6d3e --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_action_fusebox.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +private _building = GVAR(house); +private _hasFuseboxActions = _building getVariable [QGVAR(hasFuseboxActions), false]; + +if (_hasFuseboxActions) exitWith { + [_building] call FUNC(ensureFuseboxHelper); +}; + +[ + ACE_player distance _building, + [_building], + { + params ["_args"]; + _args params ["_building"]; + assert(!isNull(_building)); + hint "Found the fuse box. Look for a bright helper object!"; + [_building] call FUNC(ensureFuseboxHelper); + [_building] call FUNC(createFuseboxActions); + }, + {hint "Failure"}, + "Searching fuse box..." +] call ace_common_fnc_progressBar; diff --git a/addons/houseLightSwitch/functions/fnc_condition.sqf b/addons/houseLightSwitch/functions/fnc_condition.sqf new file mode 100644 index 00000000..c9f0c7a0 --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_condition.sqf @@ -0,0 +1,13 @@ +#include "script_component.hpp" + +private _cursorTarget = cursorTarget; + +private _isUnderSomething = lineIntersectsObjs [getposASL ace_player, getposASL ace_player vectorAdd [0, 0, 20]] isNotEqualTo []; +private _pointsAtHouse = _cursorTarget isKindOf "House" || {_cursorTarget isKindOf "Building"}; + +if (_pointsAtHouse && {_isUnderSomething}) then { + GVAR(house) = _cursorTarget; + true +} else { + false +}; diff --git a/addons/houseLightSwitch/functions/fnc_condition_fusebox.sqf b/addons/houseLightSwitch/functions/fnc_condition_fusebox.sqf new file mode 100644 index 00000000..11bb8ded --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_condition_fusebox.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +call FUNC(condition) diff --git a/addons/houseLightSwitch/functions/fnc_condition_off.sqf b/addons/houseLightSwitch/functions/fnc_condition_off.sqf new file mode 100644 index 00000000..8a3f51d2 --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_condition_off.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +[] call FUNC(condition) && {GVAR(house) getVariable [QGVAR(mainSwitchState), true] isEqualTo true}; diff --git a/addons/houseLightSwitch/functions/fnc_condition_on.sqf b/addons/houseLightSwitch/functions/fnc_condition_on.sqf new file mode 100644 index 00000000..c5008649 --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_condition_on.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +[] call FUNC(condition) && {GVAR(house) getVariable [QGVAR(mainSwitchState), true] isEqualTo false}; diff --git a/addons/houseLightSwitch/functions/fnc_createFuseboxActions.sqf b/addons/houseLightSwitch/functions/fnc_createFuseboxActions.sqf new file mode 100644 index 00000000..77f9171a --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_createFuseboxActions.sqf @@ -0,0 +1,44 @@ +#include "script_component.hpp" + +params [ + ["_building", objNull, [objNull]] +]; + +assert(!(isNull _building)); + +if (_building getVariable [QGVAR(hasFuseboxActions), false]) exitWith { + WARNING_1("fusebox actions already added for %1", _building); +}; +_building setVariable [QGVAR(hasFuseboxActions), true]; + +private _onAction = [ + QGVAR(on), + "Turn on house lights", + "x\grad\addons\houseLightSwitch\ui\bulb-on.paa", + { + params ["", "", "_args"]; + _args params [["_building", objNull, [objNull]]]; + [QGVAR(setBuildingMainSwitch), [GVAR(house), true]] call CBA_fnc_serverEvent; + [_building] call FUNC(fadeFuseboxHelper); + }, + {call FUNC(condition_on)}, + {[]}, + [_building] +] call ace_interact_menu_fnc_createAction; +[_building, 0, [], _onAction] call ace_interact_menu_fnc_addActionToObject; + +private _offAction = [ + QGVAR(off), + "Turn off house lights", + "\x\grad\addons\houseLightSwitch\ui\bulb-off.paa", + { + params ["", "", "_args"]; + _args params [["_building", objNull, [objNull]]]; + [QGVAR(setBuildingMainSwitch), [GVAR(house), false]] call CBA_fnc_serverEvent; + [_building] call FUNC(fadeFuseboxHelper); + }, + {call FUNC(condition_off)}, + {[]}, + [_building] +] call ace_interact_menu_fnc_createAction; +[_building, 0, [], _offAction] call ace_interact_menu_fnc_addActionToObject; diff --git a/addons/houseLightSwitch/functions/fnc_ensureFuseboxHelper.sqf b/addons/houseLightSwitch/functions/fnc_ensureFuseboxHelper.sqf new file mode 100644 index 00000000..46c1a862 --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_ensureFuseboxHelper.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +params [ + ["_building", objNull, [objNull]] +]; +assert(!(isNull _building)); + +private _helper = _building getVariable [QGVAR(fuseboxHelper), objNull]; +if (_helper isNotEqualTo objNull) exitWith { + TRACE_1("helper for %1 exists already!", _building); +}; + +private _helperPos = _building modelToWorld [0, 0, 0]; +TRACE_2("creating helper for building %1 at %2", _building, _helperPos); + +// NOTE: cannot use createSimpleObject, as these cannot hold ACE actions +// NOTE: createVehicleLocal will avoid collisions! hence setpos later +_helper = "Sign_Sphere25cm_F" createVehicleLocal [0, 0, 0]; +_helper setPos _helperPos; + +_building setVariable [QGVAR(fuseboxHelper), _helper]; diff --git a/addons/houseLightSwitch/functions/fnc_fadeFuseboxHelper.sqf b/addons/houseLightSwitch/functions/fnc_fadeFuseboxHelper.sqf new file mode 100644 index 00000000..4cc9f7ae --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_fadeFuseboxHelper.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" + +params [ + ["_building", objNull, [objNull]] +]; +assert(!(isNull _building)); + +private _helper = _building getVariable [QGVAR(fuseboxHelper), objNull]; +private _existingOpacity = _helper getVariable [QGVAR(opaqueness), -1]; +if (_existingOpacity != -1) exitWith { + WARNING_1("helper already has non-default opacity %1 , will not add another handler", _existingOpacity); +}; +_helper setVariable [QGVAR(opaqueness), 1]; + +[ + { + params [ + ["_args", [], [[]]], + ["_handle", 0, [0]] + ]; + _args params [ + ["_building", objNull, [objNull]] + ]; + assert(!(isNull _building)); + private _helper = _building getVariable [QGVAR(fuseboxHelper), objNull]; + private _opaqueness = _helper getVariable [QGVAR(opaqueness), 0]; + _helper setVariable [QGVAR(opaqueness), _opaqueness - 0.05]; + if (isNull _helper) exitWith { + [_handle] call CBA_fnc_removePerFrameHandler; + _building setVariable [QGVAR(fuseboxHelper), nil]; + WARNING_1("null helper in loop for building %1!", _building); + }; + if (_opaqueness <= 0) exitWith { + [_handle] call CBA_fnc_removePerFrameHandler; + _building setVariable [QGVAR(fuseboxHelper), nil]; + deleteVehicle _helper; + }; + _helper setObjectTexture [0, format ["#(argb,8,8,3)color(1,0.6,0.1,%1,ca)", _opaqueness]]; + }, + 0.1, + [_building] +] call CBA_fnc_addPerFrameHandler; diff --git a/addons/houseLightSwitch/functions/fnc_server_setBuildingMainSwitch.sqf b/addons/houseLightSwitch/functions/fnc_server_setBuildingMainSwitch.sqf new file mode 100644 index 00000000..c9f69cad --- /dev/null +++ b/addons/houseLightSwitch/functions/fnc_server_setBuildingMainSwitch.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +// assumption: any damage to a light source should be enough to kill it. +// therefore, I can use a magic damage (< 1) to mark as light as "switched off" as opposed to "destroyed" +#define MAGIC_DAMAGE_LIGHT_OFF 0.9 + +params [ + ["_building", objNull, [objNull]], + ["_newState", false, [false]] +]; + +assert(isServer); // terrain objects are local *everywhere*. therefore, force server to have a single point of truth. + +private _isOn = _building getVariable [QGVAR(mainSwitchState), true]; +if (_newState isEqualTo _isOn) exitWith { + TRACE_2("someone tried to switch lights on building %1 to pre-existing state %2", _building, _newState); +}; +_building setVariable [QGVAR(mainSwitchState), _newState, true]; + +private _existingDmg = getAllHitPointsDamage _building; + +{ + if (_x find "#" == 0) then { // assume indices starting with "#" to be lights + private _prevLightDmg = (_existingDmg#2#_forEachIndex); + // using setHitIndex over setHitPointDamage as there are buildings - looking at you, Land_House_C_2_EP1 - where hitpointnames are not unique + _building setHitIndex [ + _forEachIndex, + if (_newState) then { + if (_prevLightDmg isEqualTo MAGIC_DAMAGE_LIGHT_OFF) then {0} else {_prevLightDmg} + } else { + _prevLightDmg max MAGIC_DAMAGE_LIGHT_OFF + }, + false + ]; + }; +} forEach _existingDmg#0; diff --git a/addons/houseLightSwitch/functions/script_component.hpp b/addons/houseLightSwitch/functions/script_component.hpp new file mode 100644 index 00000000..fcf9da98 --- /dev/null +++ b/addons/houseLightSwitch/functions/script_component.hpp @@ -0,0 +1 @@ +#include "..\script_component.hpp" diff --git a/addons/houseLightSwitch/script_component.hpp b/addons/houseLightSwitch/script_component.hpp new file mode 100644 index 00000000..002916cd --- /dev/null +++ b/addons/houseLightSwitch/script_component.hpp @@ -0,0 +1,4 @@ +#define COMPONENT houseLightSwitch + +#include "\x\grad\addons\main\script_mod.hpp" +#include "\x\grad\addons\main\script_macros.hpp" diff --git a/addons/houseLightSwitch/ui/bulb-off.paa b/addons/houseLightSwitch/ui/bulb-off.paa new file mode 100644 index 0000000000000000000000000000000000000000..407331ccd6db22553be3520ea28871d32ad73216 GIT binary patch literal 22016 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 Xj(no@tB;?_JSAW!IXMdz1tI?fHBjk( literal 0 HcmV?d00001 diff --git a/addons/houseLightSwitch/ui/bulb-on.paa b/addons/houseLightSwitch/ui/bulb-on.paa new file mode 100644 index 0000000000000000000000000000000000000000..09e35ab3903f2cb04b6d675e077d423afafb3684 GIT binary patch literal 22016 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 literal 0 HcmV?d00001 diff --git a/addons/houseLightSwitch/ui/bulb-question.paa b/addons/houseLightSwitch/ui/bulb-question.paa new file mode 100644 index 0000000000000000000000000000000000000000..415e87edd4845af65f96a59a9a9bd1474d9c7fef GIT binary patch literal 22016 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 QFMJGIHZgfdwnzB?2~L_l%>V!Z literal 0 HcmV?d00001