From f3fc99f3b8ca6cb015df462df855309d7584bea4 Mon Sep 17 00:00:00 2001 From: voiper Date: Sun, 12 Jun 2016 15:31:11 -0700 Subject: [PATCH 01/10] Housekeeping of ace_flashlights and ace_map. ace_map now handles flashlights independently of ace_flashlights. ace_map searches for flashlight beam textures directly from weapon configs. ace_map has acc_flashlight config (so vanilla ace_map will have at least one flashlight to use). --- addons/flashlights/CfgSounds.hpp | 7 --- addons/flashlights/CfgWeapons.hpp | 41 ++++++++---------- addons/flashlights/config.cpp | 1 - addons/map/CfgAmmo.hpp | 4 ++ addons/map/CfgWeapons.hpp | 16 +++++++ addons/map/Effects.hpp | 7 +++ addons/map/UI/Flashlight_Beam_white_ca.paa | Bin 0 -> 123643 bytes addons/map/XEH_postInitClient.sqf | 16 +++---- addons/map/config.cpp | 3 +- addons/map/functions/fnc_flashlightGlow.sqf | 2 +- .../map/functions/fnc_getUnitFlashlights.sqf | 4 +- addons/map/functions/fnc_simulateMapLight.sqf | 10 ++--- addons/map/functions/fnc_switchFlashlight.sqf | 20 ++++++--- 13 files changed, 76 insertions(+), 55 deletions(-) delete mode 100644 addons/flashlights/CfgSounds.hpp create mode 100644 addons/map/CfgWeapons.hpp create mode 100644 addons/map/UI/Flashlight_Beam_white_ca.paa diff --git a/addons/flashlights/CfgSounds.hpp b/addons/flashlights/CfgSounds.hpp deleted file mode 100644 index f0fabe3a39..0000000000 --- a/addons/flashlights/CfgSounds.hpp +++ /dev/null @@ -1,7 +0,0 @@ -class CfgSounds { - class ACE_flashlights_flashlightClick { - name = "ACE_flashlights_flashlightClick"; - sound[] = {"\a3\sounds_f\weapons\Other\dry4.wss", 0.2, 2}; - titles[] = {}; - }; -}; \ No newline at end of file diff --git a/addons/flashlights/CfgWeapons.hpp b/addons/flashlights/CfgWeapons.hpp index 84edac6c85..66ad4c0052 100644 --- a/addons/flashlights/CfgWeapons.hpp +++ b/addons/flashlights/CfgWeapons.hpp @@ -1,20 +1,9 @@ class CfgWeapons { - class ItemCore; class ACE_ItemCore; class InventoryItem_Base_F; - class InventoryFlashlightItem_Base_F; - class acc_flashlight: ItemCore { - class ItemInfo: InventoryFlashlightItem_Base_F { - class Flashlight { - ACE_Flashlight_Colour = "white"; - ACE_Flashlight_Size = 2.75; - }; - }; - }; - - class ACE_Flashlight_MX991: ACE_ItemCore { + class ACE_Map_Flashlight_MX991: ACE_ItemCore { displayName = CSTRING(MX991_DisplayName); descriptionShort = CSTRING(MX991_Description); model = QPATHTOF(data\MX_991.p3d); @@ -22,14 +11,16 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class FlashLight { - ACE_Flashlight_Colour = "red"; - ACE_Flashlight_Size = 1.75; + class ACE_Map_Flashlight { + ACE_Map_Flashlight_Color = "red"; + ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_red_ca.paa)); + ACE_Map_Flashlight_Size = 1.75; + ACE_Map_Flashlight_Sound = 1; }; }; }; - class ACE_Flashlight_KSF1: ACE_ItemCore { + class ACE_Map_Flashlight_KSF1: ACE_ItemCore { displayName = CSTRING(KSF1_DisplayName); descriptionShort = CSTRING(KSF1_Description); model = QPATHTOF(data\KSF_1.p3d); @@ -37,14 +28,16 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class FlashLight { - ACE_Flashlight_Colour = "red"; - ACE_Flashlight_Size = 1.5; + class ACE_Map_Flashlight { + ACE_Map_Flashlight_Colour = "red"; + ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_red_ca.paa)); + ACE_Map_Flashlight_Size = 1.5; + ACE_Map_Flashlight_Sound = 1; }; }; }; - class ACE_Flashlight_XL50: ACE_ItemCore { + class ACE_Map_Flashlight_XL50: ACE_ItemCore { displayName = CSTRING(XL50_DisplayName); descriptionShort = CSTRING(XL50_Description); model = QPATHTOF(data\Maglight.p3d); @@ -52,9 +45,11 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class FlashLight { - ACE_Flashlight_Colour = "white"; - ACE_Flashlight_Size = 2.15; + class ACE_Map_Flashlight { + ACE_Map_Flashlight_Colour = "white"; + ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_white_ca.paa)); + ACE_Map_Flashlight_Size = 2.15; + ACE_Map_Flashlight_Sound = 1; }; }; }; diff --git a/addons/flashlights/config.cpp b/addons/flashlights/config.cpp index 08349be0a7..07678a3027 100644 --- a/addons/flashlights/config.cpp +++ b/addons/flashlights/config.cpp @@ -16,4 +16,3 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" -#include "CfgSounds.hpp" diff --git a/addons/map/CfgAmmo.hpp b/addons/map/CfgAmmo.hpp index 82ff6841cb..48b3d91527 100644 --- a/addons/map/CfgAmmo.hpp +++ b/addons/map/CfgAmmo.hpp @@ -51,4 +51,8 @@ class CfgAmmo { class ACE_FlashlightProxy_Yellow: ACE_FlashlightProxy_White { effectsSmoke = "ACE_FlashlightEffect_Yellow"; }; + + class ACE_FlashlightProxy_Orange: ACE_FlashlightProxy_White { + effectsSmoke = "ACE_FlashlightEffect_Orange"; + }; }; \ No newline at end of file diff --git a/addons/map/CfgWeapons.hpp b/addons/map/CfgWeapons.hpp new file mode 100644 index 0000000000..69423717c6 --- /dev/null +++ b/addons/map/CfgWeapons.hpp @@ -0,0 +1,16 @@ +class CfgWeapons { + + class ItemCore; + class InventoryFlashlightItem_Base_F; + + class acc_flashlight: ItemCore { + class ItemInfo: InventoryFlashlightItem_Base_F { + class ACE_Map_Flashlight { + ACE_Map_Flashlight_Color = "white"; + ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_white_ca.paa)); + ACE_Map_Flashlight_Size = 2.75; + ACE_Map_Flashlight_Sound = 1; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/map/Effects.hpp b/addons/map/Effects.hpp index 1dc9b4c993..5258b225aa 100644 --- a/addons/map/Effects.hpp +++ b/addons/map/Effects.hpp @@ -33,4 +33,11 @@ class ACE_FlashlightEffect_Yellow { simulation = "light"; type = "ACE_FlashlightLight_Yellow"; }; +}; + +class ACE_FlashlightEffect_Orange { + class Light1 { + simulation = "light"; + type = "ACE_FlashlightLight_Orange"; + }; }; \ No newline at end of file diff --git a/addons/map/UI/Flashlight_Beam_white_ca.paa b/addons/map/UI/Flashlight_Beam_white_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..08460e9a9ce70392b356c4b4f7f4b4af26c4a174 GIT binary patch literal 123643 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%0A$ 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 literal 0 HcmV?d00001 diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index f598266695..7ee567cabf 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -73,7 +73,7 @@ call FUNC(determineZoom); [_this select 1] call CBA_fnc_removePerFrameHandler; }, 0] call CBA_fnc_addPerFrameHandler; -["ace_settingsInitialized", { +["SettingsInitialized", { if (isMultiplayer && {GVAR(DefaultChannel) != -1}) then { //Set the chat channel once the map has finished loading [{ @@ -100,15 +100,15 @@ call FUNC(determineZoom); GVAR(flashlightInUse) = ""; GVAR(glow) = objNull; - ["ace_playerInventoryChanged", { + ["playerInventoryChanged", { private _flashlights = [ACE_player] call FUNC(getUnitFlashlights); if ((GVAR(flashlightInUse) != "") && !(GVAR(flashlightInUse) in _flashlights)) then { GVAR(flashlightInUse) = ""; }; - }] call CBA_fnc_addEventHandler; + }] call EFUNC(common,addEventHandler); if (GVAR(mapGlow)) then { - ["ace_visibleMapChanged", { + ["visibleMapChanged", { params ["_player", "_mapOn"]; if (_mapOn) then { if (!alive _player && !isNull GVAR(glow)) then { @@ -128,15 +128,15 @@ call FUNC(determineZoom); [""] call FUNC(flashlightGlow); }; }; - }] call CBA_fnc_addEventHandler; + }] call EFUNC(common,addEventHandler); }; }; -}] call CBA_fnc_addEventHandler; +}] call EFUNC(common,addEventHandler); // hide clock on map if player has no watch GVAR(hasWatch) = true; -["ace_playerInventoryChanged", { +["playerInventoryChanged", { if (isNull (_this select 0)) exitWith { GVAR(hasWatch) = true; }; @@ -145,4 +145,4 @@ GVAR(hasWatch) = true; if (_x isKindOf ["ItemWatch", configFile >> "CfgWeapons"]) exitWith {GVAR(hasWatch) = true;}; false } count (assignedItems ACE_player); -}] call CBA_fnc_addEventHandler; +}] call EFUNC(common,addEventHandler); diff --git a/addons/map/config.cpp b/addons/map/config.cpp index 17e9aae0ab..85ed6d289c 100644 --- a/addons/map/config.cpp +++ b/addons/map/config.cpp @@ -28,6 +28,7 @@ class RscEdit; #include "CfgEventHandlers.hpp" #include "CfgMarkers.hpp" #include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" #include "CfgAmmo.hpp" #include "CfgSounds.hpp" #include "CfgLights.hpp" @@ -163,4 +164,4 @@ class RscDisplayServerGetReady: RscDisplayGetReady { #include "MapControls.hpp" }; }; -}; +}; \ No newline at end of file diff --git a/addons/map/functions/fnc_flashlightGlow.sqf b/addons/map/functions/fnc_flashlightGlow.sqf index 799b99e3d2..18568a6bea 100644 --- a/addons/map/functions/fnc_flashlightGlow.sqf +++ b/addons/map/functions/fnc_flashlightGlow.sqf @@ -26,7 +26,7 @@ if (!isNull _light) then { }; if (_flashlight != "") then { - _color = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour"); + _color = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> QGVAR(Flashlight) >> QGVAR(Flashlight_Color)); if !(_color in ["white", "red", "green", "blue", "yellow"]) then {_color = "white"}; _class = format["ACE_FlashlightProxy_%1", _color]; diff --git a/addons/map/functions/fnc_getUnitFlashlights.sqf b/addons/map/functions/fnc_getUnitFlashlights.sqf index 41874cc0ca..883861052c 100644 --- a/addons/map/functions/fnc_getUnitFlashlights.sqf +++ b/addons/map/functions/fnc_getUnitFlashlights.sqf @@ -21,8 +21,8 @@ params ["_unit"]; private _flashlights = []; { - if ((isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour")) && !(_x in _flashlights)) then { - _flashlights pushBack _x; + if ((isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> QGVAR(flashlight) >> QGVAR(Flashlight_Color))) then { + _flashlights pushBackUnique _x; }; } forEach (items _unit); diff --git a/addons/map/functions/fnc_simulateMapLight.sqf b/addons/map/functions/fnc_simulateMapLight.sqf index 84fcc32773..c74c17c31d 100644 --- a/addons/map/functions/fnc_simulateMapLight.sqf +++ b/addons/map/functions/fnc_simulateMapLight.sqf @@ -51,16 +51,14 @@ if (_flashlight == "") then { //ambient shade fill _mapCtrl drawIcon [_fillTex, [1,1,1,_shadeAlpha], _mapCentre, _screenSize, _screenSize, 0, "", 0]; } else { - private ["_mousePos", "_colour", "_size", "_flashTex", "_beamSize", "_viewPortRatioFixY", "_offsetX", "_offsetYDown", "_offsetYUp"]; + private ["_mousePos", "_cfg", "_size", "_flashTex", "_beamSize", "_viewPortRatioFixY", "_offsetX", "_offsetYDown", "_offsetYUp"]; //mouse pos _mousePos = GVAR(mousePos); //flashlight settings - _colour = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour"); - if !(_colour in ["white", "red", "green", "blue", "yellow"]) then {_colour = "white"}; - _size = getNumber (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Size"); - _flashTex = format[QUOTE(PATHTOF_SYS(ace,flashlights,UI\Flashlight_Beam_%1_ca.paa)), _colour]; - _beamSize = (safeZoneW/safeZoneWAbs) * _screenSize / _size; + _cfg = (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> QGVAR(Flashlight)); + _flashTex = getText (_cfg >> QGVAR(Flashlight_Beam)); + _size = getNumber (_cfg >> QGVAR(Flashlight_Size)); //after 5x zoom, it's simulated to be fixed (it actually gets bigger relative to zoom) if (_mapScale < 0.2) then {_beamSize = _beamSize / (_mapScale * (1 / 0.2))}; diff --git a/addons/map/functions/fnc_switchFlashlight.sqf b/addons/map/functions/fnc_switchFlashlight.sqf index e177f886fa..645bf11380 100644 --- a/addons/map/functions/fnc_switchFlashlight.sqf +++ b/addons/map/functions/fnc_switchFlashlight.sqf @@ -1,9 +1,9 @@ /* * Author: voioper - * Switch flashlight. + * Switch flashlight on/off. * * Arguments: - * 0: Flashlight classname ("" for off) + * 0: New flashlight classname ("" for off) * * Return value: * None @@ -16,10 +16,18 @@ #include "script_component.hpp" -params ["_flashlight"]; +params ["_newFlashlight"]; +private _oldFlashlight = GVAR(flashlightInUse); -GVAR(flashlightInUse) = _flashlight; if (GVAR(mapGlow)) then { - [GVAR(flashlightInUse)] call FUNC(flashlightGlow); + [_newFlashlight] call FUNC(flashlightGlow); }; -playSound "ACE_map_flashlightClick"; \ No newline at end of file + +if ( + (getNumber (configFile >> "CfgWeapons" >> _newFlashlight >> "ItemInfo" >> QGVAR(Flashlight) >> QGVAR(Flashlight_Sound)) > 0) || + {getNumber (configFile >> "CfgWeapons" >> _oldFlashlight >> "ItemInfo" >> QGVAR(Flashlight) >> QGVAR(Flashlight_Sound)) > 0} +) then { + playSound QGVAR(flashlightClick); +}; + +GVAR(flashlightInUse) = _newFlashlight; \ No newline at end of file From 5a29c4b04c68a4b8f5265cbe6e26e9512ab190f3 Mon Sep 17 00:00:00 2001 From: voiper Date: Sun, 12 Jun 2016 15:33:37 -0700 Subject: [PATCH 02/10] Fix up weapon names. --- addons/flashlights/CfgWeapons.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/flashlights/CfgWeapons.hpp b/addons/flashlights/CfgWeapons.hpp index 66ad4c0052..e644348467 100644 --- a/addons/flashlights/CfgWeapons.hpp +++ b/addons/flashlights/CfgWeapons.hpp @@ -3,7 +3,7 @@ class CfgWeapons { class ACE_ItemCore; class InventoryItem_Base_F; - class ACE_Map_Flashlight_MX991: ACE_ItemCore { + class ACE_Flashlight_MX991: ACE_ItemCore { displayName = CSTRING(MX991_DisplayName); descriptionShort = CSTRING(MX991_Description); model = QPATHTOF(data\MX_991.p3d); @@ -20,7 +20,7 @@ class CfgWeapons { }; }; - class ACE_Map_Flashlight_KSF1: ACE_ItemCore { + class ACE_Flashlight_KSF1: ACE_ItemCore { displayName = CSTRING(KSF1_DisplayName); descriptionShort = CSTRING(KSF1_Description); model = QPATHTOF(data\KSF_1.p3d); @@ -37,7 +37,7 @@ class CfgWeapons { }; }; - class ACE_Map_Flashlight_XL50: ACE_ItemCore { + class ACE_Flashlight_XL50: ACE_ItemCore { displayName = CSTRING(XL50_DisplayName); descriptionShort = CSTRING(XL50_Description); model = QPATHTOF(data\Maglight.p3d); From 1ffd9d58ab93efaef25163b207a800c1c4d36faf Mon Sep 17 00:00:00 2001 From: voiper Date: Sun, 12 Jun 2016 15:39:16 -0700 Subject: [PATCH 03/10] Revert postInit. --- addons/map/XEH_postInitClient.sqf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index 7ee567cabf..f598266695 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -73,7 +73,7 @@ call FUNC(determineZoom); [_this select 1] call CBA_fnc_removePerFrameHandler; }, 0] call CBA_fnc_addPerFrameHandler; -["SettingsInitialized", { +["ace_settingsInitialized", { if (isMultiplayer && {GVAR(DefaultChannel) != -1}) then { //Set the chat channel once the map has finished loading [{ @@ -100,15 +100,15 @@ call FUNC(determineZoom); GVAR(flashlightInUse) = ""; GVAR(glow) = objNull; - ["playerInventoryChanged", { + ["ace_playerInventoryChanged", { private _flashlights = [ACE_player] call FUNC(getUnitFlashlights); if ((GVAR(flashlightInUse) != "") && !(GVAR(flashlightInUse) in _flashlights)) then { GVAR(flashlightInUse) = ""; }; - }] call EFUNC(common,addEventHandler); + }] call CBA_fnc_addEventHandler; if (GVAR(mapGlow)) then { - ["visibleMapChanged", { + ["ace_visibleMapChanged", { params ["_player", "_mapOn"]; if (_mapOn) then { if (!alive _player && !isNull GVAR(glow)) then { @@ -128,15 +128,15 @@ call FUNC(determineZoom); [""] call FUNC(flashlightGlow); }; }; - }] call EFUNC(common,addEventHandler); + }] call CBA_fnc_addEventHandler; }; }; -}] call EFUNC(common,addEventHandler); +}] call CBA_fnc_addEventHandler; // hide clock on map if player has no watch GVAR(hasWatch) = true; -["playerInventoryChanged", { +["ace_playerInventoryChanged", { if (isNull (_this select 0)) exitWith { GVAR(hasWatch) = true; }; @@ -145,4 +145,4 @@ GVAR(hasWatch) = true; if (_x isKindOf ["ItemWatch", configFile >> "CfgWeapons"]) exitWith {GVAR(hasWatch) = true;}; false } count (assignedItems ACE_player); -}] call EFUNC(common,addEventHandler); +}] call CBA_fnc_addEventHandler; From 69c3dd5cfb3310bddb5603dae3cb9790e9f38a5f Mon Sep 17 00:00:00 2001 From: voiper Date: Mon, 13 Jun 2016 18:42:45 -0700 Subject: [PATCH 04/10] Remove extra bracket. --- addons/map/functions/fnc_getUnitFlashlights.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map/functions/fnc_getUnitFlashlights.sqf b/addons/map/functions/fnc_getUnitFlashlights.sqf index 883861052c..ca1d45c844 100644 --- a/addons/map/functions/fnc_getUnitFlashlights.sqf +++ b/addons/map/functions/fnc_getUnitFlashlights.sqf @@ -21,7 +21,7 @@ params ["_unit"]; private _flashlights = []; { - if ((isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> QGVAR(flashlight) >> QGVAR(Flashlight_Color))) then { + if (isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> QGVAR(flashlight) >> QGVAR(Flashlight_Color))) then { _flashlights pushBackUnique _x; }; } forEach (items _unit); From 01c335d13a5e9ed60db64575789c3f89fa311efb Mon Sep 17 00:00:00 2001 From: voiper Date: Mon, 13 Jun 2016 19:23:14 -0700 Subject: [PATCH 05/10] More cleanup + a bug fix. --- addons/flashlights/CfgWeapons.hpp | 4 ++-- addons/map/functions/fnc_simulateMapLight.sqf | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/flashlights/CfgWeapons.hpp b/addons/flashlights/CfgWeapons.hpp index e644348467..496367765d 100644 --- a/addons/flashlights/CfgWeapons.hpp +++ b/addons/flashlights/CfgWeapons.hpp @@ -29,7 +29,7 @@ class CfgWeapons { class ItemInfo: InventoryItem_Base_F { mass = 1; class ACE_Map_Flashlight { - ACE_Map_Flashlight_Colour = "red"; + ACE_Map_Flashlight_Color = "red"; ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_red_ca.paa)); ACE_Map_Flashlight_Size = 1.5; ACE_Map_Flashlight_Sound = 1; @@ -46,7 +46,7 @@ class CfgWeapons { class ItemInfo: InventoryItem_Base_F { mass = 1; class ACE_Map_Flashlight { - ACE_Map_Flashlight_Colour = "white"; + ACE_Map_Flashlight_Color = "white"; ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_white_ca.paa)); ACE_Map_Flashlight_Size = 2.15; ACE_Map_Flashlight_Sound = 1; diff --git a/addons/map/functions/fnc_simulateMapLight.sqf b/addons/map/functions/fnc_simulateMapLight.sqf index c74c17c31d..58851cb10f 100644 --- a/addons/map/functions/fnc_simulateMapLight.sqf +++ b/addons/map/functions/fnc_simulateMapLight.sqf @@ -57,8 +57,9 @@ if (_flashlight == "") then { //flashlight settings _cfg = (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> QGVAR(Flashlight)); - _flashTex = getText (_cfg >> QGVAR(Flashlight_Beam)); _size = getNumber (_cfg >> QGVAR(Flashlight_Size)); + _flashTex = getText (_cfg >> QGVAR(Flashlight_Beam)); + _beamSize = (safeZoneW/safeZoneWAbs) * _screenSize / _size; //after 5x zoom, it's simulated to be fixed (it actually gets bigger relative to zoom) if (_mapScale < 0.2) then {_beamSize = _beamSize / (_mapScale * (1 / 0.2))}; From 2158d39e8afa29c87f6046bb45edc4c50ce50a63 Mon Sep 17 00:00:00 2001 From: voiper Date: Wed, 15 Jun 2016 14:58:07 -0700 Subject: [PATCH 06/10] Used QPATHTOF. Reverted config names. Optimised fnc_getUnitFlashlights. --- addons/flashlights/CfgWeapons.hpp | 28 +++++++++---------- addons/map/CfgWeapons.hpp | 10 +++---- addons/map/functions/fnc_flashlightGlow.sqf | 4 +-- .../map/functions/fnc_getUnitFlashlights.sqf | 10 +------ addons/map/functions/fnc_simulateMapLight.sqf | 6 ++-- 5 files changed, 25 insertions(+), 33 deletions(-) diff --git a/addons/flashlights/CfgWeapons.hpp b/addons/flashlights/CfgWeapons.hpp index 496367765d..75dd94db52 100644 --- a/addons/flashlights/CfgWeapons.hpp +++ b/addons/flashlights/CfgWeapons.hpp @@ -11,11 +11,11 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class ACE_Map_Flashlight { - ACE_Map_Flashlight_Color = "red"; - ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_red_ca.paa)); - ACE_Map_Flashlight_Size = 1.75; - ACE_Map_Flashlight_Sound = 1; + class Flashlight { + ACE_Flashlight_Colour = "red"; + ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_red_ca.paa); + ACE_Flashlight_Size = 1.75; + ACE_Flashlight_Sound = 1; }; }; }; @@ -28,10 +28,10 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class ACE_Map_Flashlight { - ACE_Map_Flashlight_Color = "red"; - ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_red_ca.paa)); - ACE_Map_Flashlight_Size = 1.5; + class Flashlight { + ACE_Flashlight_Colour = "red"; + ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_red_ca.paa); + ACE_Flashlight_Size = 1.5; ACE_Map_Flashlight_Sound = 1; }; }; @@ -45,11 +45,11 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class ACE_Map_Flashlight { - ACE_Map_Flashlight_Color = "white"; - ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_white_ca.paa)); - ACE_Map_Flashlight_Size = 2.15; - ACE_Map_Flashlight_Sound = 1; + class Flashlight { + ACE_Flashlight_Colour = "white"; + ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_white_ca.paa); + ACE_Flashlight_Size = 2.15; + ACE_Flashlight_Sound = 1; }; }; }; diff --git a/addons/map/CfgWeapons.hpp b/addons/map/CfgWeapons.hpp index 69423717c6..1e4ab801f7 100644 --- a/addons/map/CfgWeapons.hpp +++ b/addons/map/CfgWeapons.hpp @@ -5,11 +5,11 @@ class CfgWeapons { class acc_flashlight: ItemCore { class ItemInfo: InventoryFlashlightItem_Base_F { - class ACE_Map_Flashlight { - ACE_Map_Flashlight_Color = "white"; - ACE_Map_Flashlight_Beam = QUOTE(PATHTOF(UI\Flashlight_beam_white_ca.paa)); - ACE_Map_Flashlight_Size = 2.75; - ACE_Map_Flashlight_Sound = 1; + class Flashlight { + ACE_Flashlight_Colour = "white"; + ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_white_ca.paa); + ACE_Flashlight_Size = 2.75; + ACE_Flashlight_Sound = 1; }; }; }; diff --git a/addons/map/functions/fnc_flashlightGlow.sqf b/addons/map/functions/fnc_flashlightGlow.sqf index 18568a6bea..10cf1fbb46 100644 --- a/addons/map/functions/fnc_flashlightGlow.sqf +++ b/addons/map/functions/fnc_flashlightGlow.sqf @@ -26,8 +26,8 @@ if (!isNull _light) then { }; if (_flashlight != "") then { - _color = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> QGVAR(Flashlight) >> QGVAR(Flashlight_Color)); - if !(_color in ["white", "red", "green", "blue", "yellow"]) then {_color = "white"}; + _color = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "Flashlight" >> "ACE_Flashlight_Colour"); + if !(_color in ["white", "red", "green", "blue", "yellow", "orange"]) then {_color = "white"}; _class = format["ACE_FlashlightProxy_%1", _color]; _light = _class createVehicle [0,0,0]; diff --git a/addons/map/functions/fnc_getUnitFlashlights.sqf b/addons/map/functions/fnc_getUnitFlashlights.sqf index ca1d45c844..953a2c53e9 100644 --- a/addons/map/functions/fnc_getUnitFlashlights.sqf +++ b/addons/map/functions/fnc_getUnitFlashlights.sqf @@ -18,12 +18,4 @@ params ["_unit"]; -private _flashlights = []; - -{ - if (isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> QGVAR(flashlight) >> QGVAR(Flashlight_Color))) then { - _flashlights pushBackUnique _x; - }; -} forEach (items _unit); - -_flashlights +(items _unit) select {isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> "Flashlight" >> "ACE_Flashlight_Colour")} \ No newline at end of file diff --git a/addons/map/functions/fnc_simulateMapLight.sqf b/addons/map/functions/fnc_simulateMapLight.sqf index 58851cb10f..70ad4e715a 100644 --- a/addons/map/functions/fnc_simulateMapLight.sqf +++ b/addons/map/functions/fnc_simulateMapLight.sqf @@ -56,9 +56,9 @@ if (_flashlight == "") then { _mousePos = GVAR(mousePos); //flashlight settings - _cfg = (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> QGVAR(Flashlight)); - _size = getNumber (_cfg >> QGVAR(Flashlight_Size)); - _flashTex = getText (_cfg >> QGVAR(Flashlight_Beam)); + _cfg = (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "Flashlight"); + _size = getNumber (_cfg >> "ACE_Flashlight_Size"); + _flashTex = getText (_cfg >> "ACE_Flashlight_Beam"); _beamSize = (safeZoneW/safeZoneWAbs) * _screenSize / _size; //after 5x zoom, it's simulated to be fixed (it actually gets bigger relative to zoom) From a20629066a400c26db1472b68584589f52ff50ec Mon Sep 17 00:00:00 2001 From: voiper Date: Wed, 15 Jun 2016 16:27:46 -0700 Subject: [PATCH 07/10] Further cleanup. Checked some privates. --- addons/map/CfgWeapons.hpp | 2 +- addons/map/functions/fnc_flashlightGlow.sqf | 7 +++---- addons/map/functions/fnc_getUnitFlashlights.sqf | 10 +++++++++- addons/map/functions/fnc_simulateMapLight.sqf | 2 +- addons/map/functions/fnc_switchFlashlight.sqf | 4 ++-- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/addons/map/CfgWeapons.hpp b/addons/map/CfgWeapons.hpp index 1e4ab801f7..c7f350a454 100644 --- a/addons/map/CfgWeapons.hpp +++ b/addons/map/CfgWeapons.hpp @@ -5,7 +5,7 @@ class CfgWeapons { class acc_flashlight: ItemCore { class ItemInfo: InventoryFlashlightItem_Base_F { - class Flashlight { + class FlashLight { ACE_Flashlight_Colour = "white"; ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_white_ca.paa); ACE_Flashlight_Size = 2.75; diff --git a/addons/map/functions/fnc_flashlightGlow.sqf b/addons/map/functions/fnc_flashlightGlow.sqf index 10cf1fbb46..565182c2a6 100644 --- a/addons/map/functions/fnc_flashlightGlow.sqf +++ b/addons/map/functions/fnc_flashlightGlow.sqf @@ -16,19 +16,18 @@ #include "script_component.hpp" -private ["_light", "_color", "_class"]; params ["_flashlight"]; -_light = GVAR(glow); +private _light = GVAR(glow); if (!isNull _light) then { detach _light; deleteVehicle _light; }; if (_flashlight != "") then { - _color = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "Flashlight" >> "ACE_Flashlight_Colour"); + private _color = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour"); if !(_color in ["white", "red", "green", "blue", "yellow", "orange"]) then {_color = "white"}; - _class = format["ACE_FlashlightProxy_%1", _color]; + private _class = format["ACE_FlashlightProxy_%1", _color]; _light = _class createVehicle [0,0,0]; _light attachTo [ACE_player, [0,0.1,-0.05], "neck"]; diff --git a/addons/map/functions/fnc_getUnitFlashlights.sqf b/addons/map/functions/fnc_getUnitFlashlights.sqf index 953a2c53e9..cdd1bba28b 100644 --- a/addons/map/functions/fnc_getUnitFlashlights.sqf +++ b/addons/map/functions/fnc_getUnitFlashlights.sqf @@ -18,4 +18,12 @@ params ["_unit"]; -(items _unit) select {isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> "Flashlight" >> "ACE_Flashlight_Colour")} \ No newline at end of file +private _flashlights = []; + +{ + if (isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour")) then { + _flashlights pushBackUnique _x; + }; +} forEach (items _unit); + +_flashlights diff --git a/addons/map/functions/fnc_simulateMapLight.sqf b/addons/map/functions/fnc_simulateMapLight.sqf index 70ad4e715a..30a9802e54 100644 --- a/addons/map/functions/fnc_simulateMapLight.sqf +++ b/addons/map/functions/fnc_simulateMapLight.sqf @@ -56,7 +56,7 @@ if (_flashlight == "") then { _mousePos = GVAR(mousePos); //flashlight settings - _cfg = (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "Flashlight"); + _cfg = (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight"); _size = getNumber (_cfg >> "ACE_Flashlight_Size"); _flashTex = getText (_cfg >> "ACE_Flashlight_Beam"); _beamSize = (safeZoneW/safeZoneWAbs) * _screenSize / _size; diff --git a/addons/map/functions/fnc_switchFlashlight.sqf b/addons/map/functions/fnc_switchFlashlight.sqf index 645bf11380..e7843e5fa1 100644 --- a/addons/map/functions/fnc_switchFlashlight.sqf +++ b/addons/map/functions/fnc_switchFlashlight.sqf @@ -24,8 +24,8 @@ if (GVAR(mapGlow)) then { }; if ( - (getNumber (configFile >> "CfgWeapons" >> _newFlashlight >> "ItemInfo" >> QGVAR(Flashlight) >> QGVAR(Flashlight_Sound)) > 0) || - {getNumber (configFile >> "CfgWeapons" >> _oldFlashlight >> "ItemInfo" >> QGVAR(Flashlight) >> QGVAR(Flashlight_Sound)) > 0} + (getNumber (configFile >> "CfgWeapons" >> _newFlashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Sound") > 0) || + {getNumber (configFile >> "CfgWeapons" >> _oldFlashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Sound") > 0} ) then { playSound QGVAR(flashlightClick); }; From d4dfaeaf8595a9827661385c1487ee907be5bcd8 Mon Sep 17 00:00:00 2001 From: voiper Date: Wed, 15 Jun 2016 16:31:05 -0700 Subject: [PATCH 08/10] Capital L. --- addons/flashlights/CfgWeapons.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/flashlights/CfgWeapons.hpp b/addons/flashlights/CfgWeapons.hpp index 75dd94db52..a708e1eb74 100644 --- a/addons/flashlights/CfgWeapons.hpp +++ b/addons/flashlights/CfgWeapons.hpp @@ -11,7 +11,7 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class Flashlight { + class FlashLight { ACE_Flashlight_Colour = "red"; ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_red_ca.paa); ACE_Flashlight_Size = 1.75; @@ -28,11 +28,11 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class Flashlight { + class FlashLight { ACE_Flashlight_Colour = "red"; ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_red_ca.paa); ACE_Flashlight_Size = 1.5; - ACE_Map_Flashlight_Sound = 1; + ACE_Flashlight_Sound = 1; }; }; }; @@ -45,7 +45,7 @@ class CfgWeapons { scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; - class Flashlight { + class FlashLight { ACE_Flashlight_Colour = "white"; ACE_Flashlight_Beam = QPATHTOF(UI\Flashlight_beam_white_ca.paa); ACE_Flashlight_Size = 2.15; From d5b3b03c1ce3705dd1018c7c36bef92adc6d87de Mon Sep 17 00:00:00 2001 From: voiper Date: Fri, 17 Jun 2016 17:18:06 -0700 Subject: [PATCH 09/10] Make flashlight on/off + glow a PVAR. Clean up all privates. Change glow proxies to not inherit from chemlight_base, to avoid ammo detection issues. Make handleDisconnect glow deletion dedi server compatible (was only listen server compatible). Clean up determineMapLight: faster when no chemlights nearby, a tad slower when chemlights nearby, however sources the colour settings directly from the chemlight's config. --- addons/map/CfgAmmo.hpp | 53 ++++--- addons/map/CfgEventHandlers.hpp | 5 +- addons/map/XEH_postInitClient.sqf | 61 +++----- addons/map/XEH_postInitServer.sqf | 16 +++ .../functions/fnc_blueForceTrackingUpdate.sqf | 8 +- .../functions/fnc_compileFlashlightMenu.sqf | 22 +-- .../map/functions/fnc_determineMapLight.sqf | 130 +++++++----------- addons/map/functions/fnc_determineZoom.sqf | 11 +- addons/map/functions/fnc_flashlightGlow.sqf | 38 +++-- addons/map/functions/fnc_simulateMapLight.sqf | 69 +++++----- addons/map/functions/fnc_switchFlashlight.sqf | 24 ++-- addons/map/functions/fnc_updateMapEffects.sqf | 41 +++--- 12 files changed, 226 insertions(+), 252 deletions(-) create mode 100644 addons/map/XEH_postInitServer.sqf diff --git a/addons/map/CfgAmmo.hpp b/addons/map/CfgAmmo.hpp index 48b3d91527..aca4042b4f 100644 --- a/addons/map/CfgAmmo.hpp +++ b/addons/map/CfgAmmo.hpp @@ -1,39 +1,34 @@ class CfgAmmo { - class Chemlight_base; + class Grenade; - class ACE_FlashlightProxy_White: Chemlight_base { - model = "\A3\Weapons_f\empty"; + class ACE_FlashlightProxy_White: Grenade { effectsSmoke = "ACE_FlashlightEffect_White"; explosionTime = 0.01; + grenadeBurningSound[] = {}; + grenadeFireSound[] = {}; + hit = 0; + model = "\A3\Weapons_f\empty.p3d"; + simulation = "shotSmokeX"; + smokeColor[] = {1,1,1,1}; timeToLive = 1e10; - soundImpactHard1[] = {"",1,1}; - soundImpactHard2[] = {"",1,1}; - soundImpactHard3[] = {"",1,1}; - soundImpactHard4[] = {"",1,1}; - soundImpactHard5[] = {"",1,1}; - soundImpactHard6[] = {"",1,1}; - soundImpactHard7[] = {"",1,1}; - soundImpactIron1[] = {"",1,1}; - soundImpactIron2[] = {"",1,1}; - soundImpactIron3[] = {"",1,1}; - soundImpactIron4[] = {"",1,1}; - soundImpactIron5[] = {"",1,1}; - soundImpactSoft1[] = {"",1,1}; - soundImpactSoft2[] = {"",1,1}; - soundImpactSoft3[] = {"",1,1}; - soundImpactSoft4[] = {"",1,1}; - soundImpactSoft5[] = {"",1,1}; - soundImpactSoft6[] = {"",1,1}; - soundImpactSoft7[] = {"",1,1}; - soundImpactWater1[] = {"",1,1}; - soundImpactWater2[] = {"",1,1}; - soundImpactWater3[] = {"",1,1}; - soundImpactWoodExt1[] = {"",1,1}; - soundImpactWoodExt2[] = {"",1,1}; - soundImpactWoodExt3[] = {"",1,1}; - soundImpactWoodExt4[] = {"",1,1}; + impactArmor[] = {}; + impactConcrete[] = {}; + impactDefault[] = {}; + impactGlass[] = {}; + impactGlassArmored[] = {}; + impactGroundHard[] = {}; + impactGroundSoft[] = {}; + impactIron[] = {}; + impactMan[] = {}; + impactMetal[] = {}; + impactMetalPlate[] = {}; + impactMetalPlastic[] = {}; + impactRubber[] = {}; + impactTyre[] = {}; + impactWater[] = {}; + impactWood[] = {}; }; class ACE_FlashlightProxy_Red: ACE_FlashlightProxy_White { diff --git a/addons/map/CfgEventHandlers.hpp b/addons/map/CfgEventHandlers.hpp index 5c77927e53..0a9f567e49 100644 --- a/addons/map/CfgEventHandlers.hpp +++ b/addons/map/CfgEventHandlers.hpp @@ -7,12 +7,13 @@ class Extended_PreStart_EventHandlers { class Extended_PreInit_EventHandlers { class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit) ); + init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient) ); + clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient)); + serverInit = QUOTE(call COMPILE_FILE(XEH_postInitServer)); }; }; diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index f598266695..874681606c 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -1,23 +1,5 @@ #include "script_component.hpp" -//Delete map glow lights from disconnecting players #2810 -if (isServer) then { - addMissionEventHandler ["HandleDisconnect",{ - params ["_disconnectedPlayer"]; - - if ((!GVAR(mapGlow)) || {isNull _disconnectedPlayer}) exitWith {}; - { - if (_x isKindOf "ACE_FlashlightProxy_White") then { - // ACE_LOGINFO_2("Deleting leftover light [%1:%2] from DC player [%3]", _x, typeOf _x, _disconnectedPlayer); - detach _x; - deleteVehicle _x; - }; - } forEach attachedObjects _disconnectedPlayer; - - nil - }]; -}; - // Exit on Headless as well if (!hasInterface) exitWith {}; @@ -39,12 +21,11 @@ call FUNC(determineZoom); //Allow panning the lastStillPosition while mapShake is active GVAR(rightMouseButtonLastPos) = []; - ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapEffects);}]; + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {_this call FUNC(updateMapEffects)}]; ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseMoving", { if (GVAR(isShaking) && {(count GVAR(rightMouseButtonLastPos)) == 2}) then { - private["_lastPos", "_newPos"]; - _lastPos = (_this select 0) ctrlMapScreenToWorld GVAR(rightMouseButtonLastPos); - _newPos = (_this select 0) ctrlMapScreenToWorld (_this select [1,2]); + private _lastPos = (_this select 0) ctrlMapScreenToWorld GVAR(rightMouseButtonLastPos); + private _newPos = (_this select 0) ctrlMapScreenToWorld (_this select [1,2]); GVAR(lastStillPosition) set [0, (GVAR(lastStillPosition) select 0) + (_lastPos select 0) - (_newPos select 0)]; GVAR(lastStillPosition) set [1, (GVAR(lastStillPosition) select 1) + (_lastPos select 1) - (_newPos select 1)]; GVAR(rightMouseButtonLastPos) = _this select [1,2]; @@ -97,35 +78,33 @@ call FUNC(determineZoom); //illumination settings if (GVAR(mapIllumination)) then { - GVAR(flashlightInUse) = ""; - GVAR(glow) = objNull; - ["ace_playerInventoryChanged", { - private _flashlights = [ACE_player] call FUNC(getUnitFlashlights); - if ((GVAR(flashlightInUse) != "") && !(GVAR(flashlightInUse) in _flashlights)) then { - GVAR(flashlightInUse) = ""; + params ["_player", ""]; + private _flashlightItems = [_player] call FUNC(getUnitFlashlights); + private _unitLight = _player getVariable [QGVAR(flashlight), ["", objNull]]; + _unitLight params ["_flashlight", "_glow"]; + if (!(_flashlight isEqualTo "") && {!(_flashlight in _flashlightItems)}) then { + if (!isNull _glow) then { + _glow = [_player, "", false] call FUNC(flashlightGlow); + }; + _player setVariable [QGVAR(flashlight), ["", _glow], true]; }; }] call CBA_fnc_addEventHandler; if (GVAR(mapGlow)) then { ["ace_visibleMapChanged", { params ["_player", "_mapOn"]; + private _unitLight = _player getVariable [QGVAR(flashlight), ["", objNull]]; + _unitLight params ["_flashlight", "_glow"]; + private _flashlightOn = !(_flashlight isEqualTo ""); if (_mapOn) then { - if (!alive _player && !isNull GVAR(glow)) then { - GVAR(flashlightInUse) = ""; - }; - if (GVAR(flashlightInUse) != "") then { - if (isNull GVAR(glow)) then { - [GVAR(flashlightInUse)] call FUNC(flashlightGlow); - }; - } else { - if (!isNull GVAR(glow)) then { - [""] call FUNC(flashlightGlow); - }; + if (_flashlightOn && {isNull _glow}) then { + [_player, _flashlight] call FUNC(flashlightGlow); + playSound QGVAR(flashlightClick); }; } else { - if (!isNull GVAR(glow)) then { - [""] call FUNC(flashlightGlow); + if (!isNull _glow) then { + [_player, ""] call FUNC(flashlightGlow); }; }; }] call CBA_fnc_addEventHandler; diff --git a/addons/map/XEH_postInitServer.sqf b/addons/map/XEH_postInitServer.sqf new file mode 100644 index 0000000000..763c21b002 --- /dev/null +++ b/addons/map/XEH_postInitServer.sqf @@ -0,0 +1,16 @@ +#include "script_component.hpp" + +// Delete map glow lights from disconnecting players, #2810 +addMissionEventHandler ["HandleDisconnect",{ + params ["_disconnectedPlayer"]; + if (!GVAR(mapGlow)) exitWith {}; + private _unitLight = _disconnectedPlayer getVariable [QGVAR(flashlight), ["", objNull]]; + _unitLight params ["", "_glow"]; + + if ((!isNull _disconnectedPlayer) && {!isNull _glow}) then { + detach _glow; + deleteVehicle _glow; + }; + + nil +}]; \ No newline at end of file diff --git a/addons/map/functions/fnc_blueForceTrackingUpdate.sqf b/addons/map/functions/fnc_blueForceTrackingUpdate.sqf index cecf228924..3fe7dd07fc 100644 --- a/addons/map/functions/fnc_blueForceTrackingUpdate.sqf +++ b/addons/map/functions/fnc_blueForceTrackingUpdate.sqf @@ -2,8 +2,6 @@ #include "script_component.hpp" // BEGIN_COUNTER(blueForceTrackingUpdate); -private ["_groupsToDrawMarkers", "_playersToDrawMarkers", "_playerSide", "_anyPlayers", "_colour", "_marker"]; - // Delete last set of markers (always) { deleteMarkerLocal _x; @@ -13,8 +11,8 @@ GVAR(BFT_markers) = []; if (GVAR(BFT_Enabled) and {(!isNil "ACE_player") and {alive ACE_player}}) then { - _groupsToDrawMarkers = []; - _playerSide = call EFUNC(common,playerSide); + private _groupsToDrawMarkers = []; + private _playerSide = call EFUNC(common,playerSide); _groupsToDrawMarkers = allGroups select {side _x == _playerSide}; @@ -27,7 +25,7 @@ if (GVAR(BFT_Enabled) and {(!isNil "ACE_player") and {alive ACE_player}}) then { }; if (GVAR(BFT_ShowPlayerNames)) then { - _playersToDrawMarkers = allPlayers select {side _x == _playerSide}; + private _playersToDrawMarkers = allPlayers select {side _x == _playerSide}; { private _markerType = [_x] call EFUNC(common,getMarkerType); diff --git a/addons/map/functions/fnc_compileFlashlightMenu.sqf b/addons/map/functions/fnc_compileFlashlightMenu.sqf index 836b483a20..2ba2c215f5 100644 --- a/addons/map/functions/fnc_compileFlashlightMenu.sqf +++ b/addons/map/functions/fnc_compileFlashlightMenu.sqf @@ -20,27 +20,27 @@ params ["", "_player"]; -private["_action", "_actions", "_cfg", "_displayName", "_flashlights", "_icon", "_statement"]; - -_actions = []; -_flashlights = [_player] call FUNC(getUnitFlashlights); +private _actions = []; +private _flashlightItems = [_player] call FUNC(getUnitFlashlights); +private _unitLight = _player getVariable [QGVAR(flashlight), ["", objNull]]; +_unitLight params ["_flashlight", ""]; //add all carried flashlight menus and on/off submenu actions { - _cfg = (configFile >> "CfgWeapons" >> _x); - _displayName = getText (_cfg >> "displayName"); - _icon = getText (_cfg >> "picture"); + private _cfg = (configFile >> "CfgWeapons" >> _x); + private _displayName = getText (_cfg >> "displayName"); + private _icon = getText (_cfg >> "picture"); - _statement = if (GVAR(flashlightInUse) == _x) then { + private _statement = if (_flashlight == _x) then { _displayName = format [localize LSTRING(turnLightOff), _displayName]; - {[""] call FUNC(switchFlashlight)} + {[_player, ""] call FUNC(switchFlashlight)} } else { _displayName = format [localize LSTRING(turnLightOn), _displayName]; - {[_this select 2] call FUNC(switchFlashlight)} + {[_player, _this select 2] call FUNC(switchFlashlight)} }; _action = [_x, _displayName, _icon, _statement, {true}, {}, _x] call EFUNC(interact_menu,createAction); _actions pushBack [_action, [], _player]; -} forEach _flashlights; +} forEach _flashlightItems; _actions diff --git a/addons/map/functions/fnc_determineMapLight.sqf b/addons/map/functions/fnc_determineMapLight.sqf index c647e93e0c..3269c5a056 100644 --- a/addons/map/functions/fnc_determineMapLight.sqf +++ b/addons/map/functions/fnc_determineMapLight.sqf @@ -1,83 +1,50 @@ /* -* Author: Rocko and esteldunedain -* Calculates the current map illumination for a given unit -* -* Arguments: -* 0: Unit -* -* Return Value: -* 0: Does the map needs shading? -* 1: Color of the overlay -* -* Public: No -*/ + * Author: Rocko and esteldunedain + * Calculates the current map illumination for a given unit + * + * Arguments: + * 0: Unit + * + * Return Value: + * 0: Does the map needs shading? + * 1: Color of the overlay + * + * Public: No + */ + #include "script_component.hpp" + params ["_unit"]; -private ["_fnc_blendColor", "_lightTint", "_fnc_calcColor", "_l", "_lightLevel", "_vehicle", "_isEnclosed", "_nearObjects", "_light", "_ll", "_flashlight", "_flareTint"]; - // Blend two colors -_fnc_blendColor = { +private _fnc_blendColor = { params ["_c1", "_c2", "_alpha"]; [(_c1 select 0) * (1 - _alpha) + (_c2 select 0) * _alpha, - (_c1 select 1) * (1 - _alpha) + (_c2 select 1) * _alpha, - (_c1 select 2) * (1 - _alpha) + (_c2 select 2) * _alpha, - (_c1 select 3) * (1 - _alpha) + (_c2 select 3) * _alpha] + (_c1 select 1) * (1 - _alpha) + (_c2 select 1) * _alpha, + (_c1 select 2) * (1 - _alpha) + (_c2 select 2) * _alpha, + (_c1 select 3) * (1 - _alpha) + (_c2 select 3) * _alpha] }; // Ambient light tint depending on time of day -_lightTint = call { - if (sunOrMoon == 1.0) exitWith { [0.5,0.5,0.5,1] }; - if (sunOrMoon > 0.80) exitWith { [[1.0 - overcast,0.2,0,1], [1,1,1,1], (sunOrMoon - 0.8)/0.2] call _fnc_blendColor }; - if (sunOrMoon > 0.50) exitWith { [[0,0,0.1,1], [1.0 - overcast,0.2,0,1], (sunOrMoon - 0.5)/0.3] call _fnc_blendColor }; - if (sunOrMoon <= 0.5) exitWith { [0,0,0.1,1] }; +private _lightTint = call { + if (sunOrMoon == 1.0) exitWith {[0.5,0.5,0.5,1]}; + if (sunOrMoon > 0.80) exitWith {[[1.0 - overcast,0.2,0,1], [1,1,1,1], (sunOrMoon - 0.8) / 0.2] call _fnc_blendColor}; + if (sunOrMoon > 0.50) exitWith {[[0,0,0.1,1], [1.0 - overcast,0.2,0,1], (sunOrMoon - 0.5) / 0.3] call _fnc_blendColor}; + if (sunOrMoon <= 0.5) exitWith {[0,0,0.1,1]}; [0,0,0,0] }; -// Calculates overlay color from tint and light level -_fnc_calcColor = { - params ["_c1", "_lightLevel"]; - - if (_lightLevel < 0.5) then { - _l = _lightLevel / 0.5; - [(_c1 select 0) * _l, - (_c1 select 1) * _l, - (_c1 select 2) * _l, - (_c1 select 3) * (1 - _lightLevel)] - } else { - _l = (_lightLevel - 0.5) / 0.5; - [(_c1 select 0) * (1 - _l) + _l, - (_c1 select 1) * (1 - _l) + _l, - (_c1 select 2) * (1 - _l) + _l, - (_c1 select 3) * (1 - _lightLevel)] - }; -}; - -_lightLevel = 0.04 + (0.96 * call EFUNC(common,ambientBrightness)); - -/* -// check if player has NVG enabled -if (currentVisionMode _unit == 1) exitWith { - // stick to nvg color - [true, [154/255,253/255,177/255,0.5]] -}; -*/ +private _lightLevel = 0.04 + (0.96 * call EFUNC(common,ambientBrightness)); // Do not obscure the map if the ambient light level is above 0.95 if (_lightLevel > 0.95) exitWith { - [false, [0.5,0.5,0.5,0]] + [false, [1,1,1,0]] }; -_vehicle = vehicle _unit; +private _vehicle = vehicle _unit; // Do not obscure the map if the player is on a enclosed vehicle (assume internal illumination) -if (_vehicle != _unit) then { - // Player is in a vehicle - if (!isTurnedOut _unit && { _vehicle isKindOf "Tank" || { ( _vehicle isKindOf "Helicopter" || _vehicle isKindOf "Plane" ) && { (driver _vehicle) == _unit || { (gunner _vehicle) == _unit } } } || {_vehicle isKindOf "Wheeled_APC"}}) then { - _isEnclosed = true; - }; -}; -if (_isEnclosed) exitWith { +if ((_vehicle != _unit) && {!isTurnedOut _unit && {_vehicle isKindOf "Tank" || {(_vehicle isKindOf "Helicopter" || _vehicle isKindOf "Plane") && {driver _vehicle == _unit || {gunner _vehicle == _unit}}} || {_vehicle isKindOf "Wheeled_APC"}}}) exitWith { TRACE_1("Player in a enclosed vehicle",""); [false, [1,1,1,0]] }; @@ -93,29 +60,38 @@ TRACE_1("Player is on foot or in an open vehicle",""); // @todo: Illumination flares (timed) // Using chemlights -_nearObjects = (_unit nearObjects ["SmokeShell", 4]) select {alive _x && {toLower typeOf _x in ["chemlight_red", "chemlight_green", "chemlight_blue", "chemlight_yellow"]}}; +private _nearObjects = (_unit nearObjects ["Chemlight_base", 4]) select {alive _x}; -if (count (_nearObjects) > 0) then { - _light = _nearObjects select 0; - - _ll = (1 - ((((_unit distance _light) - 2)/2) max 0)) * 0.4; - if (_ll > _lightLevel) then { - _flareTint = switch (toLower typeOf _light) do { - case "chemlight_red" : {[1,0,0,1]}; - case "chemlight_green" : {[0,1,0,1]}; - case "chemlight_blue" : {[0,0,1,1]}; - case "chemlight_yellow" : {[1,1,0,1]}; - }; - _lightTint = [_lightTint, _flareTint, (_ll - _lightLevel)/(1 - _lightLevel)] call _fnc_blendColor; - _lightLevel = _ll; +if !(_nearObjects isEqualTo []) then { + private _nearestlight = _nearObjects select 0; + private _lightLevelTemp = (1 - ((((_unit distance _nearestlight) - 2) / 2) max 0)) * 0.4; + if (_lightLevelTemp > _lightLevel) then { + private _flareTint = getArray (configFile >> "CfgLights" >> (getText (configFile >> (getText (configFile >> "CfgAmmo" >> typeOf _nearestlight >> "EffectsSmoke")) >> "Light1" >> "type")) >> "color"); + _lightTint = [_lightTint, _flareTint, (_lightLevelTemp - _lightLevel) / (1 - _lightLevel)] call _fnc_blendColor; + _lightLevel = _lightLevelTemp; TRACE_1("player near chemlight",""); }; }; // Do not obscure the map if the ambient light level is above 0.95 if (_lightLevel > 0.95) exitWith { - [false, [0.5,0.5,0.5,0]] + [false, [1,1,1,0]] }; -// Calculate resulting map color -[true, [_lightTint, _lightLevel] call _fnc_calcColor] +// Calculate resulting map color from tint and light level +private _halfLight = _lightLevel / 0.5; + +private _finalLevel = if (_lightLevel < 0.5) then { + [(_lightTint select 0) * _halfLight, + (_lightTint select 1) * _halfLight, + (_lightTint select 2) * _halfLight, + (_lightTint select 3) * (1 - _lightLevel)] +} else { + _halfLight = (_lightLevel - 0.5) / 0.5; + [(_lightTint select 0) * (1 - _halfLight) + _halfLight, + (_lightTint select 1) * (1 - _halfLight) + _halfLight, + (_lightTint select 2) * (1 - _halfLight) + _halfLight, + (_lightTint select 3) * (1 - _lightLevel)] +}; + +[true, _finalLevel] diff --git a/addons/map/functions/fnc_determineZoom.sqf b/addons/map/functions/fnc_determineZoom.sqf index bdfc9a866b..efe20a0e52 100644 --- a/addons/map/functions/fnc_determineZoom.sqf +++ b/addons/map/functions/fnc_determineZoom.sqf @@ -12,15 +12,14 @@ */ #include "script_component.hpp" -private ["_grids", "_fourSize", "_sixSize", "_continue", "_size", "_i"]; -_grids = (configFile >> "CfgWorlds" >> worldName >> "Grid"); -_fourSize = -1; -_sixSize = -1; +private _grids = (configFile >> "CfgWorlds" >> worldName >> "Grid"); +private _fourSize = -1; +private _sixSize = -1; for "_i" from 1 to 10 do { - _continue = false; + private _continue = false; if (isClass(_grids >> format["Zoom%1", _i])) then { _continue = true; - _size = getText(_grids >> format["Zoom%1", _i] >> "formatX"); + private _size = getText(_grids >> format["Zoom%1", _i] >> "formatX"); if ((count toArray(_size)) == 2) then { _fourSize = getNumber(_grids >> format["Zoom%1", _i] >> "zoomMax"); }; diff --git a/addons/map/functions/fnc_flashlightGlow.sqf b/addons/map/functions/fnc_flashlightGlow.sqf index 565182c2a6..9d65c93b98 100644 --- a/addons/map/functions/fnc_flashlightGlow.sqf +++ b/addons/map/functions/fnc_flashlightGlow.sqf @@ -3,36 +3,44 @@ * Add or remove global flashlight glow for when player is looking at map. * * Arguments: - * 0: Flashlight classname ("" for off) + * 0: Unit + * 1: Flashlight classname ("" for off) + * 2: Set the PVAR? (default: true) * * Return value: - * None + * Glow object * * Example: - * ["ACE_Flashlight_MX991"] call ace_map_fnc_flashlightGlow; + * [ACE_player, "ACE_Flashlight_MX991"] call ace_map_fnc_flashlightGlow; * * Public: No */ #include "script_component.hpp" -params ["_flashlight"]; +params ["_unit", "_flashlightType", ["_set", true]]; -private _light = GVAR(glow); -if (!isNull _light) then { - detach _light; - deleteVehicle _light; +private _unitLight = _unit getVariable [QGVAR(flashlight), ["", objNull]]; +_unitLight params ["_flashlight", "_glow"]; + +if (!isNull _glow) then { + detach _glow; + deleteVehicle _glow; }; -if (_flashlight != "") then { - private _color = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour"); +if !(_flashlightType isEqualTo "") then { + private _color = getText (configFile >> "CfgWeapons" >> _flashlightType >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour"); if !(_color in ["white", "red", "green", "blue", "yellow", "orange"]) then {_color = "white"}; - private _class = format["ACE_FlashlightProxy_%1", _color]; + private _class = format ["ACE_FlashlightProxy_%1", _color]; - _light = _class createVehicle [0,0,0]; - _light attachTo [ACE_player, [0,0.1,-0.05], "neck"]; + _glow = _class createVehicle [0,0,0]; + _glow attachTo [_unit, [0,0.1,-0.05], "neck"]; } else { - _light = objNull; + _glow = objNull; }; -GVAR(glow) = _light; \ No newline at end of file +if (_set) then { + _unit setVariable [QGVAR(flashlight), [_flashlight, _glow], true]; +}; + +_glow diff --git a/addons/map/functions/fnc_simulateMapLight.sqf b/addons/map/functions/fnc_simulateMapLight.sqf index 30a9802e54..ba03c421a7 100644 --- a/addons/map/functions/fnc_simulateMapLight.sqf +++ b/addons/map/functions/fnc_simulateMapLight.sqf @@ -1,48 +1,47 @@ /* -* Author: voiper -* Draw nearby lighting and sexy flashlight beams on main map. -* -* Arguments: -* 0: Map control -* 1: Map zoom level -* 2: Current map centre -* 3: Light level from ace_map_fnc_determineMapLight -* -* Return Value: -* None -* -* Public: No -*/ + * Author: voiper + * Draw nearby lighting and sexy flashlight beams on main map. + * + * Arguments: + * 0: Map control + * 1: Map zoom level + * 2: Current map centre + * 3: Light level from ace_map_fnc_determineMapLight + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" -private ["_hmd", "_flashlight", "_screenSize", "_realViewPortY", "_realViewPortX", "_fillTex", "_colourAlpha", "_shadeAlpha", "_colourList", "_maxColour"]; params ["_mapCtrl", "_mapScale", "_mapCentre", "_lightLevel"]; -_hmd = hmd ACE_player; -_flashlight = GVAR(flashlightInUse); +private _unitLight = ACE_player getVariable [QGVAR(flashlight), ["", objNull]]; +_unitLight params ["_flashlight", ""]; //map width (on screen) in pixels -_screenSize = 640 * safeZoneWAbs; +private _screenSize = 640 * safeZoneWAbs; //resolution params (every frame in case resolution change) getResolution params ["_resX", "_resY", "_viewPortX", "_viewPortY", "", "_uiScale"]; //engine rounds the viewport ratios, when they should be fractions; this can cause problems -_realViewPortY = _resY * _uiScale; -_realViewPortX = _realViewPortY * 4/3; +private _realViewPortY = _resY * _uiScale; +private _realViewPortX = _realViewPortY * 4/3; //textures -_fillTex = "#(rgb,8,8,3)color(0,0,0,1)"; +private _fillTex = "#(rgb,8,8,3)color(0,0,0,1)"; //colour/alpha _lightLevel params ["_r", "_g", "_b", "_a"]; -_colourAlpha = (_r + _g + _b) min _a; -_shadeAlpha = _a; +private _colourAlpha = (_r + _g + _b) min _a; +private _shadeAlpha = _a; -_colourList = [_r, _g, _b]; +private _colourList = [_r, _g, _b]; _colourList sort false; -_maxColour = _colourList select 0; +private _maxColour = _colourList select 0; //ambient colour fill _mapCtrl drawIcon [format["#(rgb,8,8,3)color(%1,%2,%3,1)", _r / _maxColour, _g / _maxColour, _b / _maxColour], [1,1,1,_colourAlpha], _mapCentre, _screenSize, _screenSize, 0, "", 0]; @@ -51,21 +50,19 @@ if (_flashlight == "") then { //ambient shade fill _mapCtrl drawIcon [_fillTex, [1,1,1,_shadeAlpha], _mapCentre, _screenSize, _screenSize, 0, "", 0]; } else { - private ["_mousePos", "_cfg", "_size", "_flashTex", "_beamSize", "_viewPortRatioFixY", "_offsetX", "_offsetYDown", "_offsetYUp"]; - //mouse pos - _mousePos = GVAR(mousePos); + private _mousePos = GVAR(mousePos); //flashlight settings - _cfg = (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight"); - _size = getNumber (_cfg >> "ACE_Flashlight_Size"); - _flashTex = getText (_cfg >> "ACE_Flashlight_Beam"); - _beamSize = (safeZoneW/safeZoneWAbs) * _screenSize / _size; + private _cfg = (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight"); + private _size = getNumber (_cfg >> "ACE_Flashlight_Size"); + private _flashTex = getText (_cfg >> "ACE_Flashlight_Beam"); + private _beamSize = (safeZoneW/safeZoneWAbs) * _screenSize / _size; //after 5x zoom, it's simulated to be fixed (it actually gets bigger relative to zoom) if (_mapScale < 0.2) then {_beamSize = _beamSize / (_mapScale * (1 / 0.2))}; //assign corrective ratio to fix sub-pixel gaps/overlaps (symptom of viewport * X/Y resolution rounding) - _viewPortRatioFixY = if (_realViewPortY != _viewPortY) then { + private _viewPortRatioFixY = if (_realViewPortY != _viewPortY) then { _realViewPortX / (_realViewPortY / _viewPortY * _viewPortX) } else { if (_realViewPortX != _viewPortX) then { @@ -76,10 +73,10 @@ if (_flashlight == "") then { }; //offset the elements - _offsetX = _mapScale * GVAR(worldSize) * (_screenSize * 2 + _beamSize); - _offsetYDown = _mapScale * GVAR(worldSize) * (_screenSize + _beamSize) * _viewPortRatioFixY; + private _offsetX = _mapScale * GVAR(worldSize) * (_screenSize * 2 + _beamSize); + private _offsetYDown = _mapScale * GVAR(worldSize) * (_screenSize + _beamSize) * _viewPortRatioFixY; //up is bigger because of a potential exploit - _offsetYUp = _mapScale * GVAR(worldSize) * (_screenSize * 4 + _beamSize) * _viewPortRatioFixY; + private _offsetYUp = _mapScale * GVAR(worldSize) * (_screenSize * 4 + _beamSize) * _viewPortRatioFixY; //draw the matrix /whoa _mapCtrl drawIcon [_flashTex, [1,1,1,_shadeAlpha], _mousePos, _beamSize, _beamSize, 0, "", 0]; //centre beam diff --git a/addons/map/functions/fnc_switchFlashlight.sqf b/addons/map/functions/fnc_switchFlashlight.sqf index e7843e5fa1..2d6d4c5ac2 100644 --- a/addons/map/functions/fnc_switchFlashlight.sqf +++ b/addons/map/functions/fnc_switchFlashlight.sqf @@ -3,31 +3,37 @@ * Switch flashlight on/off. * * Arguments: - * 0: New flashlight classname ("" for off) + * 0: Unit + * 1: New flashlight classname ("" for off) * * Return value: * None * * Example: - * ["ACE_Flashlight_MX991"] call ace_map_fnc_switchFlashlight; + * [ACE_player, "ACE_Flashlight_MX991"] call ace_map_fnc_switchFlashlight; * * Public: No */ #include "script_component.hpp" -params ["_newFlashlight"]; -private _oldFlashlight = GVAR(flashlightInUse); +params ["_unit", "_newFlashlight"]; + +private _unitLight = _unit getVariable [QGVAR(flashlight), ["", objNull]]; +_unitLight params ["_flashlight", "_glow"]; if (GVAR(mapGlow)) then { - [_newFlashlight] call FUNC(flashlightGlow); + // we don't want to set the PVAR twice in a row, so tell this func not to set it + _glow = [_unit, _newFlashlight, false] call FUNC(flashlightGlow); }; +private _config = (configFile >> "CfgWeapons"); + if ( - (getNumber (configFile >> "CfgWeapons" >> _newFlashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Sound") > 0) || - {getNumber (configFile >> "CfgWeapons" >> _oldFlashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Sound") > 0} -) then { + (getNumber (_config >> _newFlashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Sound") > 0) || + {getNumber (_config >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Sound") > 0} +) then { playSound QGVAR(flashlightClick); }; -GVAR(flashlightInUse) = _newFlashlight; \ No newline at end of file +_unit setVariable [QGVAR(flashlight), [_newFlashlight, _glow], true]; diff --git a/addons/map/functions/fnc_updateMapEffects.sqf b/addons/map/functions/fnc_updateMapEffects.sqf index b89a75aa32..23e97114a8 100644 --- a/addons/map/functions/fnc_updateMapEffects.sqf +++ b/addons/map/functions/fnc_updateMapEffects.sqf @@ -1,25 +1,25 @@ /* -* Author: Rocko and esteldunedain -* On map draw, updates the effects -* -* Arguments: -* None -* -* Return Value: -* None -* -* Public: No -*/ + * Author: Rocko and esteldunedain + * On map draw, updates the effects + * + * Arguments: + * None + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" -private ["_mapCtrl", "_mapScale", "_mapCentre", "_light"]; -_mapCtrl = findDisplay 12 displayCtrl 51; -_mapScale = ctrlMapScale _mapCtrl; -_mapCentre = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; + +params ["_mapCtrl"]; +private _mapScale = ctrlMapScale _mapCtrl; +private _mapCentre = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; if (GVAR(mapIllumination)) then { //get nearby lighting - _light = [[ACE_player], FUNC(determineMapLight), missionNamespace, QGVAR(mapLight), 0.1] call EFUNC(common,cachedCall); + private _light = [[ACE_player], FUNC(determineMapLight), missionNamespace, QGVAR(mapLight), 0.1] call EFUNC(common,cachedCall); _light params ["_applyLighting", "_lightLevel"]; @@ -29,10 +29,9 @@ if (GVAR(mapIllumination)) then { }; if (GVAR(mapShake)) then { - private ["_speed","_amplitude", "_time", "_shakePos"]; // Only shake map while moving on foot - _speed = 0; + private _speed = 0; if (vehicle ACE_player == ACE_player) then { _speed = vectorMagnitude (velocity ACE_player); }; @@ -41,10 +40,10 @@ if (GVAR(mapShake)) then { if (_speed > 0.1) then { if (ctrlMapAnimDone _mapCtrl) then { - _amplitude = (_speed - 0.1) / 5 * (1000 * _mapScale); - _time = 0.1; + private _amplitude = (_speed - 0.1) / 5 * (1000 * _mapScale); + private _time = 0.1; - _shakePos = [(GVAR(lastStillPosition) select 0) + sin((CBA_missionTime + _time - GVAR(lastStillTime))*100) * _amplitude * 0.25, + private _shakePos = [(GVAR(lastStillPosition) select 0) + sin((CBA_missionTime + _time - GVAR(lastStillTime))*100) * _amplitude * 0.25, (GVAR(lastStillPosition) select 1) + sin((CBA_missionTime + _time - GVAR(lastStillTime))*260) * _amplitude]; _mapCtrl ctrlMapAnimAdd [_time, _mapScale, _shakePos]; From c9f9b89ea2b1f67fd828fb2ba657636a18ab7708 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 25 Aug 2016 18:23:42 -0500 Subject: [PATCH 10/10] Fix merge (was moved to XEH_postInitServer) Use short circuit for loadout change and add note --- addons/map/XEH_postInitClient.sqf | 26 ++++---------------------- addons/map/XEH_postInitServer.sqf | 2 +- addons/map/config.cpp | 2 +- 3 files changed, 6 insertions(+), 24 deletions(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index 9170f7ebf6..683b7b1eda 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -1,23 +1,5 @@ #include "script_component.hpp" -//Delete map glow lights from disconnecting players #2810 -if (isServer) then { - addMissionEventHandler ["HandleDisconnect",{ - params ["_disconnectedPlayer"]; - - if ((!GVAR(mapGlow)) || {isNull _disconnectedPlayer}) exitWith {}; - { - if (_x isKindOf "ACE_FlashlightProxy_White") then { - // ACE_LOGINFO_2("Deleting leftover light [%1:%2] from DC player [%3]", _x, typeOf _x, _disconnectedPlayer); - detach _x; - deleteVehicle _x; - }; - } forEach attachedObjects _disconnectedPlayer; - - nil - }]; -}; - // Exit on Headless as well if (!hasInterface) exitWith {}; @@ -98,10 +80,10 @@ call FUNC(determineZoom); if (GVAR(mapIllumination)) then { ["loadout", { params ["_player", ""]; - private _flashlightItems = [_player] call FUNC(getUnitFlashlights); private _unitLight = _player getVariable [QGVAR(flashlight), ["", objNull]]; _unitLight params ["_flashlight", "_glow"]; - if (!(_flashlight isEqualTo "") && {!(_flashlight in _flashlightItems)}) then { + if ((_flashlight != "") && {!(_flashlight in ([_player] call FUNC(getUnitFlashlights)))}) then { + // remove the current glow if the unit suddenly lost it's flashlight if (!isNull _glow) then { _glow = [_player, "", false] call FUNC(flashlightGlow); }; @@ -110,7 +92,7 @@ call FUNC(determineZoom); }] call CBA_fnc_addPlayerEventHandler; if (GVAR(mapGlow)) then { - ["ace_visibleMapChanged", { + ["visibleMap", { params ["_player", "_mapOn"]; private _unitLight = _player getVariable [QGVAR(flashlight), ["", objNull]]; _unitLight params ["_flashlight", "_glow"]; @@ -125,7 +107,7 @@ call FUNC(determineZoom); [_player, ""] call FUNC(flashlightGlow); }; }; - }] call CBA_fnc_addEventHandler; + }] call CBA_fnc_addPlayerEventHandler; }; }; }] call CBA_fnc_addEventHandler; diff --git a/addons/map/XEH_postInitServer.sqf b/addons/map/XEH_postInitServer.sqf index 763c21b002..dc0c7f991e 100644 --- a/addons/map/XEH_postInitServer.sqf +++ b/addons/map/XEH_postInitServer.sqf @@ -13,4 +13,4 @@ addMissionEventHandler ["HandleDisconnect",{ }; nil -}]; \ No newline at end of file +}]; diff --git a/addons/map/config.cpp b/addons/map/config.cpp index 6a26f74a6b..b619d96d10 100644 --- a/addons/map/config.cpp +++ b/addons/map/config.cpp @@ -165,4 +165,4 @@ class RscDisplayServerGetReady: RscDisplayGetReady { #include "MapControls.hpp" }; }; -}; \ No newline at end of file +};