From cf73b3fbc3df94f1ee24487e6532853783c3dbee Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Wed, 5 Sep 2018 00:47:40 +0200 Subject: [PATCH] Initial IR flashlight tests --- addons/irlight/$PBOPREFIX$ | 1 + addons/irlight/CfgEventHandlers.hpp | 17 +++++++ addons/irlight/CfgJointRails.hpp | 6 +++ addons/irlight/CfgWeapons.hpp | 45 ++++++++++++++++ addons/irlight/README.md | 11 ++++ addons/irlight/XEH_PREP.hpp | 3 ++ addons/irlight/XEH_postInit.sqf | 8 +++ addons/irlight/XEH_preInit.sqf | 27 ++++++++++ addons/irlight/XEH_preStart.sqf | 3 ++ addons/irlight/config.cpp | 19 +++++++ .../functions/fnc_handleLoadoutChanged.sqf | 3 ++ .../functions/fnc_handleVisionModeChanged.sqf | 13 +++++ .../functions/fnc_updateWeaponLights.sqf | 51 +++++++++++++++++++ addons/irlight/functions/script_component.hpp | 1 + addons/irlight/script_component.hpp | 17 +++++++ 15 files changed, 225 insertions(+) create mode 100644 addons/irlight/$PBOPREFIX$ create mode 100644 addons/irlight/CfgEventHandlers.hpp create mode 100644 addons/irlight/CfgJointRails.hpp create mode 100644 addons/irlight/CfgWeapons.hpp create mode 100644 addons/irlight/README.md create mode 100644 addons/irlight/XEH_PREP.hpp create mode 100644 addons/irlight/XEH_postInit.sqf create mode 100644 addons/irlight/XEH_preInit.sqf create mode 100644 addons/irlight/XEH_preStart.sqf create mode 100644 addons/irlight/config.cpp create mode 100644 addons/irlight/functions/fnc_handleLoadoutChanged.sqf create mode 100644 addons/irlight/functions/fnc_handleVisionModeChanged.sqf create mode 100644 addons/irlight/functions/fnc_updateWeaponLights.sqf create mode 100644 addons/irlight/functions/script_component.hpp create mode 100644 addons/irlight/script_component.hpp diff --git a/addons/irlight/$PBOPREFIX$ b/addons/irlight/$PBOPREFIX$ new file mode 100644 index 00000000000..5bb6f986811 --- /dev/null +++ b/addons/irlight/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\irlight diff --git a/addons/irlight/CfgEventHandlers.hpp b/addons/irlight/CfgEventHandlers.hpp new file mode 100644 index 00000000000..0d3301d6e0a --- /dev/null +++ b/addons/irlight/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/irlight/CfgJointRails.hpp b/addons/irlight/CfgJointRails.hpp new file mode 100644 index 00000000000..e3fc4ed6ffd --- /dev/null +++ b/addons/irlight/CfgJointRails.hpp @@ -0,0 +1,6 @@ +class asdg_SlotInfo; +class asdg_FrontSideRail: asdg_SlotInfo { + class compatibleItems { + ACE_acc_pointer_IR_flashlight = 1; + }; +}; diff --git a/addons/irlight/CfgWeapons.hpp b/addons/irlight/CfgWeapons.hpp new file mode 100644 index 00000000000..d4446fc19b4 --- /dev/null +++ b/addons/irlight/CfgWeapons.hpp @@ -0,0 +1,45 @@ +class SlotInfo; +class PointerSlot: SlotInfo { + compatibleItems[] += { + "ACE_acc_pointer_IR_flashlight" + }; +}; + +class CfgWeapons { + class ItemCore; + class acc_pointer_IR: ItemCore { + class ItemInfo; + }; + class ACE_acc_pointer_IR_flashlight: acc_pointer_IR { + author = ECSTRING(common,ACETeam); + displayName = "ACE IR flashlight"; // TODO: stringtable + + class ItemInfo: ItemInfo { + class Flashlight { + color[] = {180,160,130}; + ambient[] = {0.9,0.81,0.7}; + intensity = 100; // Brightness + size = 1; // TODO: OwO what's this? + innerAngle = 5; // Can't really tell if there are actually two cones? + outerAngle = 10; + coneFadeCoef = 8; // Higher value = sharper outline + position = "laser pos"; + direction = "laser dir"; + useFlare = 1; + flareSize = 1.4; + flareMaxDistance = 100; + dayLight = 0; + scale[] = {0}; + + class Attentuation { + start = 0; + constant = 0.5; + linear = 0.1; + quadratic = 0.2; + hardLimitStart = 27; + hardLimitEnd = 34; + }; + }; + }; + }; +}; diff --git a/addons/irlight/README.md b/addons/irlight/README.md new file mode 100644 index 00000000000..1ad38174d9d --- /dev/null +++ b/addons/irlight/README.md @@ -0,0 +1,11 @@ +ace_irlight +=================== + +Adds scripted IR flashlights. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [BaerMitUmlaut](https://github.com/BaerMitUmlaut) diff --git a/addons/irlight/XEH_PREP.hpp b/addons/irlight/XEH_PREP.hpp new file mode 100644 index 00000000000..79c749d3380 --- /dev/null +++ b/addons/irlight/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(handleLoadoutChanged); +PREP(updateWeaponLights); +PREP(handleVisionModeChanged); diff --git a/addons/irlight/XEH_postInit.sqf b/addons/irlight/XEH_postInit.sqf new file mode 100644 index 00000000000..42b8d314d88 --- /dev/null +++ b/addons/irlight/XEH_postInit.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +// Make sure JIPs can see already turned on IR lights +GVAR(units) = allPlayers select { + _x getVariable [QGVAR(turnedOn), false] +}; + +[FUNC(updateWeaponLights), 0, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/irlight/XEH_preInit.sqf b/addons/irlight/XEH_preInit.sqf new file mode 100644 index 00000000000..a52f51f2a8f --- /dev/null +++ b/addons/irlight/XEH_preInit.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +// List of units with an enabled IR light +GVAR(units) = []; + +[QGVAR(switchedLight), { + params ["_unit", "_lightOn"]; + + if (_lightOn) then { + _unit action ["GunLightOn", _unit]; + GVAR(units) pushBack _unit; + } else { + _unit action ["GunLightOff", _unit]; + GVAR(units) deleteAt (GVAR(units) find _unit); + }; +}] call CBA_fnc_addEventHandler; + +["loadout", FUNC(handleLoadoutChanged)] call CBA_fnc_addPlayerEventHandler; +["visionMode", FUNC(handleVisionModeChanged)] call CBA_fnc_addPlayerEventHandler; + +ADDON = true; diff --git a/addons/irlight/XEH_preStart.sqf b/addons/irlight/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/irlight/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/irlight/config.cpp b/addons/irlight/config.cpp new file mode 100644 index 00000000000..167d51d15a5 --- /dev/null +++ b/addons/irlight/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"BaerMitUmlaut"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgJointRails.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/irlight/functions/fnc_handleLoadoutChanged.sqf b/addons/irlight/functions/fnc_handleLoadoutChanged.sqf new file mode 100644 index 00000000000..5a249578a5a --- /dev/null +++ b/addons/irlight/functions/fnc_handleLoadoutChanged.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" +// TODO: save if the current weapon has an ir flashlight capable attachment +// isKindOf forEach attachment? config property? diff --git a/addons/irlight/functions/fnc_handleVisionModeChanged.sqf b/addons/irlight/functions/fnc_handleVisionModeChanged.sqf new file mode 100644 index 00000000000..ddc752e4645 --- /dev/null +++ b/addons/irlight/functions/fnc_handleVisionModeChanged.sqf @@ -0,0 +1,13 @@ +#include "script_component.hpp" + +// Manually update weapon lights once for instant change +// TODO: Check if still necessary? +if (IN_NVGS) then { + { + _x action ["GunLightOn", _x]; + } forEach GVAR(units); +} else { + { + _x action ["GunLightOff", _x]; + } forEach GVAR(units); +}; diff --git a/addons/irlight/functions/fnc_updateWeaponLights.sqf b/addons/irlight/functions/fnc_updateWeaponLights.sqf new file mode 100644 index 00000000000..53fe3444075 --- /dev/null +++ b/addons/irlight/functions/fnc_updateWeaponLights.sqf @@ -0,0 +1,51 @@ +/* + * Author: BaerMitUmlaut + * Makes the IR weapon lights visible depending on wether the player wears NVGs or not. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_irlight_fnc_updateWeaponLights + * + * Public: No + */ +#include "script_component.hpp" + +private _hasIRLight = "ACE_acc_pointer_IR_flashlight" in primaryWeaponItems ACE_player; +private _isLightOn = ACE_player isFlashlightOn primaryWeapon ACE_player; +private _synchedOn = ACE_player getVariable [QGVAR(turnedOn), false]; +private _inNVGS = IN_NVGS; + +// Detect if player switched light on or off +if (_hasIRLight) then { + if (_inNVGS) then { + // Synch weapon light state with virtual state + if !(_isLightOn isEqualTo _synchedOn) then { + [QGVAR(switchedLight), [ACE_player, _isLightOn]] call CBA_fnc_globalEvent; + ACE_player setVariable [QGVAR(turnedOn), _isLightOn, true]; + }; + } else { + // No NVGs, but light is on + // -> player pressed the weapon light button + // -> switch light status + if (_isLightOn) then { + [QGVAR(switchedLight), [ACE_player, !_synchedOn]] call CBA_fnc_globalEvent; + ACE_player setVariable [QGVAR(turnedOn), !_synchedOn, true]; + }; + }; +}; + +// Override weapon light of all units with enabled IR light +if (_inNVGS) then { + { + _x action ["GunLightOn", _x]; + } forEach GVAR(units); +} else { + { + _x action ["GunLightOff", _x]; + } forEach GVAR(units); +}; diff --git a/addons/irlight/functions/script_component.hpp b/addons/irlight/functions/script_component.hpp new file mode 100644 index 00000000000..3dab1f1e8ef --- /dev/null +++ b/addons/irlight/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\irlight\script_component.hpp" diff --git a/addons/irlight/script_component.hpp b/addons/irlight/script_component.hpp new file mode 100644 index 00000000000..d742691d782 --- /dev/null +++ b/addons/irlight/script_component.hpp @@ -0,0 +1,17 @@ +#define COMPONENT irlight +#define COMPONENT_BEAUTIFIED IR Light +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_IRLIGHT + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_IRLIGHT + #define DEBUG_SETTINGS DEBUG_SETTINGS_IRLIGHT +#endif + +#include "\z\ace\addons\main\script_macros.hpp"