From 8e999ae0cf8707b04de0cf5f6355632be56a3f09 Mon Sep 17 00:00:00 2001 From: Laid3acK Date: Sun, 25 Oct 2020 16:49:44 +0100 Subject: [PATCH 001/335] Scopes - Weapons IronSightBaseAngle updated (#7958) * spar_IronSightBaseAngle * spar_IronSightBaseAngle * spar_IronSightBaseAngle --- addons/ballistics/CfgAmmo.hpp | 4 +- addons/scopes/CfgWeapons.hpp | 102 +++++++++++++++++++--------------- 2 files changed, 58 insertions(+), 48 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 37f1678e35..20e9af803b 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -188,9 +188,7 @@ class CfgAmmo { ACE_muzzleVelocities[] = {743, 848, 891, 900}; // at 21°C, at 15°C {735, 840, 883, 892} according with the AKS initSpeed ACE_barrelLengths[] = {210, 314, 415, 508.0}; // respectively {AKS74U / AK105,AK12K / AK74 / default} }; - class B_56x15_dual: BulletBase { - tracerScale = 0.5; - }; + class B_580x42_Ball_F: BulletBase { // DBP87 airFriction = -0.00121087; ACE_caliber = 6; diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index c533cf04c2..b521b541eb 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -219,13 +219,13 @@ class CfgWeapons { class Rifle_Long_Base_F: Rifle_Base_F {}; class DMR_06_base_F: Rifle_Long_Base_F { - ACE_IronSightBaseAngle = 0.018227; + ACE_IronSightBaseAngle = 0.010313; ACE_RailHeightAboveBore = 3.27488; }; class DMR_07_base_F: Rifle_Long_Base_F { ACE_RailHeightAboveBore = 5.07109; - ACE_IronSightBaseAngle = -0.00160721; + ACE_IronSightBaseAngle = 0; }; class arifle_MX_Base_F: Rifle_Base_F { @@ -234,158 +234,170 @@ class CfgWeapons { }; class arifle_MX_SW_F: arifle_MX_Base_F { ACE_RailHeightAboveBore = 2.40874; - ACE_IronSightBaseAngle = 0.216372; + ACE_IronSightBaseAngle = -0.004011; }; class arifle_MXM_F: arifle_MX_Base_F { ACE_RailHeightAboveBore = 2.40323; - ACE_IronSightBaseAngle = 0.157545; + ACE_IronSightBaseAngle = -0.004011; }; class arifle_SPAR_01_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 3.20768; - ACE_IronSightBaseAngle = -0.166678; + ACE_IronSightBaseAngle = 0.002856; }; class arifle_SPAR_02_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 3.22175; - ACE_IronSightBaseAngle = -0.184641; + ACE_IronSightBaseAngle = -0.018908; }; class arifle_SPAR_03_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 3.71491; - ACE_IronSightBaseAngle = -0.134908; + ACE_IronSightBaseAngle = 0; }; class LMG_Mk200_F: Rifle_Long_Base_F { ACE_RailHeightAboveBore = 2.68925; - ACE_IronSightBaseAngle = 0.0182228; + ACE_IronSightBaseAngle = 0.001719; }; class LMG_Zafir_F: Rifle_Long_Base_F { ACE_RailHeightAboveBore = 0.996651; - ACE_IronSightBaseAngle = 0.19812212; + ACE_IronSightBaseAngle = 0.004584; }; class LMG_03_base_F: Rifle_Long_Base_F { ACE_RailHeightAboveBore = 4.24282; - ACE_IronSightBaseAngle = 0.00181939; + ACE_IronSightBaseAngle = 0.008021; }; class pdw2000_base_F: Rifle_Short_Base_F { ACE_RailHeightAboveBore = 3.08883; ACE_RailBaseAngle = 0.019366; - ACE_IronSightBaseAngle = 0.0399664; + ACE_IronSightBaseAngle = 0.009740; }; class arifle_AKS_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 0; - ACE_IronSightBaseAngle = 0.00574991; + ACE_IronSightBaseAngle = 0; }; class arifle_AKM_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 0; - ACE_IronSightBaseAngle = 0.006273; + ACE_IronSightBaseAngle = 0.014897; }; class arifle_AK12_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 3.82508; - ACE_IronSightBaseAngle = 0.0276926; + ACE_IronSightBaseAngle = 0.025210; + }; + class arifle_AK12_GL_base_F: arifle_AK12_base_F { + ACE_IronSightBaseAngle = 0.017189; + }; + class arifle_AK12U_base_F: arifle_AK12_base_F { + ACE_IronSightBaseAngle = 0.002865; + }; + class arifle_RPK12_base_F: arifle_AK12_base_F { + ACE_IronSightBaseAngle = 0.003438; }; class arifle_CTAR_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 6.07588; - ACE_IronSightBaseAngle = 0.0151815; + ACE_IronSightBaseAngle = 0.004584; }; class arifle_CTARS_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 6.0787; - ACE_IronSightBaseAngle = 0.0125245; + ACE_IronSightBaseAngle = 0.022918; }; class arifle_ARX_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 2.81635; - ACE_IronSightBaseAngle = 0.113024; + ACE_IronSightBaseAngle = 0.016043; }; class arifle_katiba_Base_F: Rifle_Base_F {}; class arifle_Katiba_F: arifle_katiba_Base_F { ACE_RailHeightAboveBore = 5.75468; - ACE_IronSightBaseAngle = 0.0863227; + ACE_IronSightBaseAngle = 0.011459; }; class arifle_Katiba_C_F: arifle_katiba_Base_F { ACE_RailHeightAboveBore = 5.75468; - ACE_IronSightBaseAngle = 0.083419; + ACE_IronSightBaseAngle = 0.011459; }; class arifle_Katiba_GL_F: arifle_katiba_Base_F { ACE_RailHeightAboveBore = 5.75468; - ACE_IronSightBaseAngle = 0.0863227; + ACE_IronSightBaseAngle = 0.011459; }; class arifle_MX_F: arifle_MX_Base_F { ACE_RailHeightAboveBore = 2.80201; - ACE_IronSightBaseAngle = 0.19502; + ACE_IronSightBaseAngle = -0.005157; }; class arifle_MX_GL_F: arifle_MX_Base_F { ACE_RailHeightAboveBore = 2.80201; - ACE_IronSightBaseAngle = 0.17142857; + ACE_IronSightBaseAngle = -0.005730; }; class arifle_MXC_F: arifle_MX_Base_F { ACE_RailHeightAboveBore = 2.40874; - ACE_IronSightBaseAngle = 0.0154129; + ACE_IronSightBaseAngle = -0.005157; }; class SDAR_base_F: Rifle_Base_F {}; class arifle_SDAR_F: SDAR_base_F { ACE_RailHeightAboveBore = 0; - ACE_IronSightBaseAngle = -0.0237516; + ACE_IronSightBaseAngle = -0.037242; }; class SMG_01_Base: Rifle_Short_Base_F { ACE_RailHeightAboveBore = 4.85355; ACE_RailBaseAngle = 0.0250956; - ACE_IronSightBaseAngle = -0.159239; + ACE_IronSightBaseAngle = 0.018908; }; class SMG_02_base_F: Rifle_Short_Base_F { ACE_RailHeightAboveBore = 4.41831; ACE_RailBaseAngle = 0.0217724; - ACE_IronSightBaseAngle = 0.434847; + ACE_IronSightBaseAngle = 0.022918; + }; + class SMG_03_TR_BASE: Rifle_Base_F { + ACE_IronSightBaseAngle = -0.011459; }; class SMG_05_base_F: Rifle_Short_Base_F { ACE_RailHeightAboveBore = 4.05169; ACE_RailBaseAngle = 0.019366; - ACE_IronSightBaseAngle = -0.122823; + ACE_IronSightBaseAngle = 0.027502; }; class Tavor_base_F: Rifle_Base_F {}; class arifle_TRG20_F: Tavor_base_F { ACE_RailHeightAboveBore = 4.30954; - ACE_IronSightBaseAngle = 0.0338428; + ACE_IronSightBaseAngle = 0.002292; }; class arifle_TRG21_F: Tavor_base_F { ACE_RailHeightAboveBore = 4.30954; - ACE_IronSightBaseAngle = 0.0317759; + ACE_IronSightBaseAngle = 0.002292; }; class arifle_TRG21_GL_F: arifle_TRG21_F { ACE_RailHeightAboveBore = 4.30954; - ACE_IronSightBaseAngle = -0.03428571; + ACE_IronSightBaseAngle = -0.014424; }; class mk20_base_F: Rifle_Base_F {}; class arifle_Mk20_F: mk20_base_F { ACE_RailHeightAboveBore = 4.57255; - ACE_IronSightBaseAngle = -0.153292; + ACE_IronSightBaseAngle = 0.006303; }; class arifle_Mk20C_F: mk20_base_F { ACE_RailHeightAboveBore = 4.41539; - ACE_IronSightBaseAngle = -0.137835; + ACE_IronSightBaseAngle = 0.001146; }; class arifle_Mk20_GL_F: mk20_base_F { ACE_RailHeightAboveBore = 4.41539; - ACE_IronSightBaseAngle = -0.1532926; + ACE_IronSightBaseAngle = 0.005730; }; class arifle_MSBS65_base_F: Rifle_Base_F { ACE_RailHeightAboveBore = 5.2; - ACE_IronSightBaseAngle = -0.028648; + ACE_IronSightBaseAngle = 0.001719; }; class arifle_MSBS65_Mark_base_F: arifle_MSBS65_base_F { - ACE_IronSightBaseAngle = -0.045837; + ACE_IronSightBaseAngle = 0.002292; }; class EBR_base_F: Rifle_Long_Base_F {}; @@ -399,35 +411,35 @@ class CfgWeapons { class srifle_EBR_F: EBR_base_F { ACE_RailHeightAboveBore = 1.98812; - ACE_IronSightBaseAngle = -0.00601782; + ACE_IronSightBaseAngle = 0.007448; }; class srifle_LRR_F: LRR_base_F { ACE_RailHeightAboveBore = 3.20864; - ACE_IronSightBaseAngle = -0.0302847; + ACE_IronSightBaseAngle = 0.004011; }; class srifle_GM6_F: GM6_base_F { ACE_RailHeightAboveBore = 4.75572; - ACE_IronSightBaseAngle = -0.165062; + ACE_IronSightBaseAngle = 0.001146; }; class srifle_DMR_01_F: DMR_01_base_F { ACE_RailHeightAboveBore = 2.83284; - ACE_IronSightBaseAngle = 0.234393; + ACE_IronSightBaseAngle = 0.005730; }; class srifle_DMR_02_F: DMR_02_base_F { ACE_RailHeightAboveBore = 3.43913; - ACE_IronSightBaseAngle = 0.013878; + ACE_IronSightBaseAngle = 0.015470; }; class srifle_DMR_03_F: DMR_03_base_F { ACE_RailHeightAboveBore = 4.0795; - ACE_IronSightBaseAngle = 0.0138099; + ACE_IronSightBaseAngle = 0.005730; }; class srifle_DMR_04_F: DMR_04_base_F { ACE_RailHeightAboveBore = 2.38022; - ACE_RailBaseAngle = 0.0171842; + ACE_RailBaseAngle = 0.019481; }; class srifle_DMR_05_blk_F: DMR_05_base_F { ACE_RailHeightAboveBore = 3.91334; - ACE_IronSightBaseAngle = 0.0123425; + ACE_IronSightBaseAngle = 0.012605; }; class MMG_01_base_F; @@ -435,10 +447,10 @@ class CfgWeapons { class MMG_01_hex_F: MMG_01_base_F { ACE_RailHeightAboveBore = 4.73961; - ACE_IronSightBaseAngle = -0.0101613; + ACE_IronSightBaseAngle = -0.003438; }; class MMG_02_camo_F: MMG_02_base_F { ACE_RailHeightAboveBore = 5.01913; - ACE_IronSightBaseAngle = 0.0136377; + ACE_IronSightBaseAngle = 0.010886; }; }; From 84b18d3f0699a05d8b73aa7d04fdc5179d152091 Mon Sep 17 00:00:00 2001 From: Walthzer Date: Sun, 25 Oct 2020 18:14:57 +0100 Subject: [PATCH 002/335] Slideshow - Add "SlideChanged" event (#7954) * Implement Events in slideshow framework. * Update function header * Pass correct agruments to next call of autoTransiton. * Add return of slideshow ID Return slideshow ID so it can be stored for later use with the events. * Replace repeat code with variable. _image. * Redundant comment removal * Update addons/slideshow/functions/fnc_createSlideshow.sqf Co-authored-by: jonpas Co-authored-by: jonpas --- AUTHORS.txt | 1 + .../slideshow/functions/fnc_addSlideActions.sqf | 5 +++-- addons/slideshow/functions/fnc_autoTransition.sqf | 15 ++++++++++----- .../slideshow/functions/fnc_createSlideshow.sqf | 6 ++++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 78f4287014..e8d1b9affb 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -159,6 +159,7 @@ Tuupertunut Valentin Torikian voiper VyMajoris(W-Cephei) +Walthzer Winter xrufix Zakant diff --git a/addons/slideshow/functions/fnc_addSlideActions.sqf b/addons/slideshow/functions/fnc_addSlideActions.sqf index 6acd304d32..6416c35748 100644 --- a/addons/slideshow/functions/fnc_addSlideActions.sqf +++ b/addons/slideshow/functions/fnc_addSlideActions.sqf @@ -30,14 +30,15 @@ private _actions = []; _names select _forEachIndex, "", { - (_this select 2) params ["_objects", "_image"]; + (_this select 2) params ["_objects", "_image", "_currentSlideshow"]; { _x setObjectTextureGlobal [0, _image] } count _objects; + [QGVAR(slideChanged), [_image, _currentSlideshow]] call CBA_fnc_localEvent; }, {true}, {}, - [_objects, _x] + [_objects, _x, _currentSlideshow] ] call EFUNC(interact_menu,createAction), [], _controller diff --git a/addons/slideshow/functions/fnc_autoTransition.sqf b/addons/slideshow/functions/fnc_autoTransition.sqf index 50e8b1d13d..87fe488754 100644 --- a/addons/slideshow/functions/fnc_autoTransition.sqf +++ b/addons/slideshow/functions/fnc_autoTransition.sqf @@ -7,7 +7,8 @@ * 0: Objects * 1: Image Paths * 2: State Variable Name - * 3: Duration (0 disables automatic transitions) + * 3: Current Slideshow + * 4: Duration (0 disables automatic transitions) * * Return Value: * None @@ -18,7 +19,7 @@ * Public: No */ -params ["_objects", "_images", "_varString", "_duration"]; +params ["_objects", "_images", "_varString", "_currentSlideshow", "_duration"]; // Get current slide number of this slideshow private _currentSlide = missionNamespace getVariable [_varString, 0]; @@ -29,11 +30,15 @@ _currentSlide = (_currentSlide + 1) mod (count _images); // Save slide back into global variable (PFH's local variables do not persist through PFH run) missionNamespace setVariable [_varString, _currentSlide]; +private _image = _images select _currentSlide; + // Set slide { - _x setObjectTextureGlobal [0, _images select _currentSlide]; + _x setObjectTextureGlobal [0, _image]; } count _objects; +[QGVAR(slideChanged), [_image, _currentSlideshow]] call CBA_fnc_localEvent; + // Log current slide and execute Next slide -TRACE_4("Auto-transition",_images select _currentSlide,_currentSlide,count _images,_duration); -[FUNC(autoTransition), [_objects, _images, _varString, _duration], _duration] call CBA_fnc_waitAndExecute; +TRACE_4("Auto-transition",_image,_currentSlide,count _images,_duration); +[FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration], _duration] call CBA_fnc_waitAndExecute; diff --git a/addons/slideshow/functions/fnc_createSlideshow.sqf b/addons/slideshow/functions/fnc_createSlideshow.sqf index 290fad89b4..0d84fa969b 100644 --- a/addons/slideshow/functions/fnc_createSlideshow.sqf +++ b/addons/slideshow/functions/fnc_createSlideshow.sqf @@ -12,7 +12,7 @@ * 5: Set Name (default: localized "Slides") * * Return Value: - * None + * Slideshow ID * * Example: * [[object1, object2, object3], [controller1], ["images\image1.paa", "images\image2.paa"], ["Action1", "Action2"], 5, "My Slides"] call ace_slideshow_fnc_createSlideshow @@ -100,5 +100,7 @@ if (_duration == 0) then { missionNamespace setVariable [_varString, 0]; // Automatic transitions handler - [FUNC(autoTransition), [_objects, _images, _varString, _duration], _duration] call CBA_fnc_waitAndExecute; + [FUNC(autoTransition), [_objects, _images, _varString, _currentSlideshow, _duration], _duration] call CBA_fnc_waitAndExecute; }; + +_currentSlideshow From 0f6a9ecb87cfda634baa8b11fbbe7cc91cc3a1cb Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 25 Oct 2020 14:01:59 -0500 Subject: [PATCH 003/335] Zeus - Don't allow creating a new zeus module if we already are one (#7970) --- addons/zeus/functions/fnc_canCreateModule.sqf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/zeus/functions/fnc_canCreateModule.sqf b/addons/zeus/functions/fnc_canCreateModule.sqf index df6cb99400..1981833625 100644 --- a/addons/zeus/functions/fnc_canCreateModule.sqf +++ b/addons/zeus/functions/fnc_canCreateModule.sqf @@ -15,6 +15,9 @@ * Public: No */ +// Don't allow if we already are a zeus, intentionally using player instead of ace_player + if (!isNull getAssignedCuratorLogic player) exitWith { false }; + (isNil QGVAR(zeus)) && { switch (GVAR(canCreateZeus)) do { case CAN_CREATE_ADMIN: {isServer || {IS_ADMIN_LOGGED}}; From a67d6eecb05c3c2f69f33cad15ff39f27162cd54 Mon Sep 17 00:00:00 2001 From: Brett Date: Mon, 26 Oct 2020 11:01:18 -0600 Subject: [PATCH 004/335] Arsenal - Provide reference to the current box (#7948) * arsenal: provide ref to current box * use objNull instead of nil * Update fnc_openBox.sqf --- addons/arsenal/XEH_postInit.sqf | 2 ++ addons/arsenal/functions/fnc_onArsenalClose.sqf | 2 ++ addons/arsenal/functions/fnc_openBox.sqf | 2 ++ 3 files changed, 6 insertions(+) diff --git a/addons/arsenal/XEH_postInit.sqf b/addons/arsenal/XEH_postInit.sqf index 9b92f8ee51..65b8045562 100644 --- a/addons/arsenal/XEH_postInit.sqf +++ b/addons/arsenal/XEH_postInit.sqf @@ -1,6 +1,8 @@ #include "script_component.hpp" #include "defines.hpp" +GVAR(currentBox) = objNull; + GVAR(EH_ID) = 0; GVAR(lastSearchTextLeft) = ""; GVAR(lastSearchTextRight) = ""; diff --git a/addons/arsenal/functions/fnc_onArsenalClose.sqf b/addons/arsenal/functions/fnc_onArsenalClose.sqf index 554947df85..9132ea1bc2 100644 --- a/addons/arsenal/functions/fnc_onArsenalClose.sqf +++ b/addons/arsenal/functions/fnc_onArsenalClose.sqf @@ -80,6 +80,8 @@ if (isMultiplayer) then { [QGVAR(center) + "_voice", GVAR(center)] call CBA_fnc_removeGlobalEventJIP; }; +GVAR(currentBox) = objNull; + GVAR(camera) = nil; GVAR(cameraHelper) = nil; diff --git a/addons/arsenal/functions/fnc_openBox.sqf b/addons/arsenal/functions/fnc_openBox.sqf index ce02e6e343..91098fbd2b 100644 --- a/addons/arsenal/functions/fnc_openBox.sqf +++ b/addons/arsenal/functions/fnc_openBox.sqf @@ -41,6 +41,8 @@ if (isNil "_displayToUse" || {!isnil QGVAR(camera)}) exitWith { [localize LSTRING(CantOpenDisplay), false, 5, 1] call EFUNC(common,displayText); }; +GVAR(currentBox) = _object; + if (_mode) then { GVAR(virtualItems) = +(uiNamespace getVariable QGVAR(configItems)); } else { From 78c307196da9c5cbc23a74d656c82b98d026d4ce Mon Sep 17 00:00:00 2001 From: Brett Date: Wed, 28 Oct 2020 18:08:00 -0600 Subject: [PATCH 005/335] Medical - Show triage level in interaction (#7940) * medical: show triage in interaction * rename * clean up comments * Update addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf Co-authored-by: jonpas * Update addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf Co-authored-by: jonpas * Add setting (disabled, enabled, medicsOnly) * Apply suggestions from code review Co-authored-by: mharis001 <34453221+mharis001@users.noreply.github.com> Co-authored-by: jonpas Co-authored-by: PabstMirror Co-authored-by: mharis001 <34453221+mharis001@users.noreply.github.com> --- addons/medical_gui/CfgVehicles.hpp | 3 ++ addons/medical_gui/XEH_PREP.hpp | 1 + .../functions/fnc_modifyActionTriageLevel.sqf | 46 +++++++++++++++++++ addons/medical_gui/initSettings.sqf | 9 ++++ addons/medical_gui/stringtable.xml | 6 +++ 5 files changed, 65 insertions(+) create mode 100644 addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf diff --git a/addons/medical_gui/CfgVehicles.hpp b/addons/medical_gui/CfgVehicles.hpp index eecae9a359..f30f9908ce 100644 --- a/addons/medical_gui/CfgVehicles.hpp +++ b/addons/medical_gui/CfgVehicles.hpp @@ -19,6 +19,7 @@ class CfgVehicles { exceptions[] = {"isNotInside", "isNotSwimming"}; statement = QUOTE(_target call FUNC(openMenu)); icon = QPATHTOF(ui\cross.paa); + modifierFunction = QUOTE(call FUNC(modifyActionTriageLevel)); }; }; class ACE_Actions { @@ -26,12 +27,14 @@ class CfgVehicles { #include "InteractionBodyParts.hpp" #undef ACTION_CONDITION class ACE_MainActions { + modifierFunction = QUOTE(call FUNC(modifyActionTriageLevel)); class ACE_Medical_Menu { displayName = CSTRING(MedicalMenu); condition = QUOTE([ARR_2(ACE_player,_target)] call FUNC(canOpenMenu)); exceptions[] = {"isNotInside", "isNotSwimming"}; statement = QUOTE(_target call FUNC(openMenu)); icon = QPATHTOF(ui\cross.paa); + modifierFunction = QUOTE(call FUNC(modifyActionTriageLevel)); }; class ACE_Medical_Radial { displayName = CSTRING(Medical); diff --git a/addons/medical_gui/XEH_PREP.hpp b/addons/medical_gui/XEH_PREP.hpp index c53b693bdf..857e72315b 100644 --- a/addons/medical_gui/XEH_PREP.hpp +++ b/addons/medical_gui/XEH_PREP.hpp @@ -9,6 +9,7 @@ PREP(handleToggle); PREP(handleTriageSelect); PREP(menuPFH); PREP(modifyAction); +PREP(modifyActionTriageLevel); PREP(onMenuClose); PREP(onMenuOpen); PREP(openMenu); diff --git a/addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf b/addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf new file mode 100644 index 0000000000..2dcdb8afaa --- /dev/null +++ b/addons/medical_gui/functions/fnc_modifyActionTriageLevel.sqf @@ -0,0 +1,46 @@ +#include "script_component.hpp" +/* + * Author: SynixeBrett + * Modifies the action color to match the triage level. + * + * Arguments: + * 0: Target + * 1: Player + * 2: Args + * 3: Action Data + * + * Return Value: + * None + * + * Example: + * [cursorObject, player, [], []] call ace_interaction_fnc_modifyActionTriageLevel + * + * Public: No + */ + +params ["_target", "_player", "", "_actionData"]; +if ( + GVAR(interactionMenuShowTriage) == 1 // Anyone + || {GVAR(interactionMenuShowTriage) == 2 && {[_player] call EFUNC(medical_treatment,isMedic)}} // Medics & Doctors +) then { + private _colorHex = switch (_target getVariable [QEGVAR(medical,triageLevel), 0]) do { + case 1: { + [TRIAGE_COLOR_MINIMAL] call BIS_fnc_colorRGBtoHTML + }; + case 2: { + [TRIAGE_COLOR_DELAYED] call BIS_fnc_colorRGBtoHTML + }; + case 3: { + [TRIAGE_COLOR_IMMEDIATE] call BIS_fnc_colorRGBtoHTML + }; + case 4: { + [TRIAGE_COLOR_DECEASED] call BIS_fnc_colorRGBtoHTML + }; + default { + "#FFFFFF" + }; + }; + + _actionData params ["", "", "_icon"]; + _icon set [1, _colorHex]; +}; diff --git a/addons/medical_gui/initSettings.sqf b/addons/medical_gui/initSettings.sqf index be7dc60fa6..e61dd647b2 100644 --- a/addons/medical_gui/initSettings.sqf +++ b/addons/medical_gui/initSettings.sqf @@ -42,3 +42,12 @@ [0, 10, 3, 1], true ] call CBA_settings_fnc_init; + +[ + QGVAR(interactionMenuShowTriage), + "LIST", + [LSTRING(InteractionMenuShowTriage_DisplayName), LSTRING(InteractionMenuShowTriage_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(Medical_Treatment,Anyone), ELSTRING(Medical_Treatment,Medics)], 1], + false +] call CBA_settings_fnc_init; diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml index 0963c1a6db..a081b31695 100644 --- a/addons/medical_gui/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -189,6 +189,12 @@ Distancia máxima desde el paciente para que el menú pueda ser abierto Tıbbi Menünün açılabileceği maksimum mesafe. + + Show Triage Level in Interaction Menu + + + Shows the patient's triage level by changing the color of the main and medical menu actions. + Medical Lékařské From 2220822d30a4f934d45633dcf6827648d5f7f3fa Mon Sep 17 00:00:00 2001 From: mjc4wilton Date: Thu, 29 Oct 2020 11:12:51 -0400 Subject: [PATCH 006/335] Gunbag - Add BI Arsenal Compatibility (#7887) * Initial Commit * Remove development components * Adapt to ACE_player & resolve returned assignment * Update addons/gunbag/functions/fnc_BIArsenalClose.sqf Co-authored-by: commy2 Co-authored-by: commy2 --- addons/gunbag/CfgEventHandlers.hpp | 16 ++++++++++++ addons/gunbag/XEH_PREP.hpp | 2 ++ .../gunbag/functions/fnc_BIArsenalClose.sqf | 26 +++++++++++++++++++ addons/gunbag/functions/fnc_BIArsenalOpen.sqf | 22 ++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 addons/gunbag/functions/fnc_BIArsenalClose.sqf create mode 100644 addons/gunbag/functions/fnc_BIArsenalOpen.sqf diff --git a/addons/gunbag/CfgEventHandlers.hpp b/addons/gunbag/CfgEventHandlers.hpp index be284a9d70..9c24190803 100644 --- a/addons/gunbag/CfgEventHandlers.hpp +++ b/addons/gunbag/CfgEventHandlers.hpp @@ -10,3 +10,19 @@ class Extended_PreInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; + +//EH must be loaded this way to get ace_gunbag_gunbagWeapon before it is deleted upon opening the BI arsenal. May cause instability with other mods. +class RscPicture; +class RscDisplayArsenal { + class Controls { + class IconBackgroundPrimaryWeapon: RscPicture { + onLoad = QUOTE([ACE_player] call FUNC(BIArsenalOpen)); + }; + }; +}; + +class Extended_DisplayUnload_EventHandlers { + class RscDisplayArsenal { + ADDON = QUOTE([ACE_player] call FUNC(BIArsenalClose)); + }; +}; diff --git a/addons/gunbag/XEH_PREP.hpp b/addons/gunbag/XEH_PREP.hpp index 45d55207d6..2e2c57a056 100644 --- a/addons/gunbag/XEH_PREP.hpp +++ b/addons/gunbag/XEH_PREP.hpp @@ -10,3 +10,5 @@ PREP(canInteract); PREP(calculateMass); PREP(hasGunbag); PREP(isMachineGun); +PREP(BIArsenalClose); +PREP(BIArsenalOpen); diff --git a/addons/gunbag/functions/fnc_BIArsenalClose.sqf b/addons/gunbag/functions/fnc_BIArsenalClose.sqf new file mode 100644 index 0000000000..011593aaa0 --- /dev/null +++ b/addons/gunbag/functions/fnc_BIArsenalClose.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: mjc4wilton + * Handle BI arsenal closing + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [] call ace_gunbag_fnc_BIArsenalClose + * + * Public: No + */ + +params ["_unit"]; + +if (!isNil QGVAR(arsenalCache)) then { + backpackContainer _unit setVariable [QGVAR(gunbagWeapon), GVAR(arsenalCache), true]; +}; + +GVAR(arsenalCache) = nil; + +nil diff --git a/addons/gunbag/functions/fnc_BIArsenalOpen.sqf b/addons/gunbag/functions/fnc_BIArsenalOpen.sqf new file mode 100644 index 0000000000..713e9eb8aa --- /dev/null +++ b/addons/gunbag/functions/fnc_BIArsenalOpen.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: mjc4wilton + * Handle BI arsenal opening + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [] call ace_gunbag_fnc_BIArsenalOpen + * + * Public: No + */ + +params ["_unit"]; + +if ([_unit] call FUNC(hasGunBag)) then { + GVAR(arsenalCache) = backpackContainer _unit getVariable [QGVAR(gunbagWeapon), []]; +}; From 174223bddf68ba09bdbdce13525d65c76f4c3090 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Thu, 29 Oct 2020 12:07:30 -0400 Subject: [PATCH 007/335] Medical - Add Treatment Time Addon Settings (#7900) * Added Addon Settings for several Medical Treatment Times Tourniquets, IV Bags, Syringes, Splints, and Body Bags. * Fixed stringtable indentation * And again --- .../ACE_Medical_Treatment_Actions.hpp | 10 ++-- addons/medical_treatment/initSettings.sqf | 46 +++++++++++++++++ addons/medical_treatment/stringtable.xml | 50 +++++++++++++++++++ 3 files changed, 101 insertions(+), 5 deletions(-) diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index f080c19079..d86f1323c7 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -79,7 +79,7 @@ class GVAR(actions) { icon = QPATHTOEF(medical_gui,ui\tourniquet.paa); allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; items[] = {"ACE_tourniquet"}; - treatmentTime = 7; + treatmentTime = QGVAR(treatmentTimeTourniquet); condition = QUOTE(!([ARR_2(_patient,_bodyPart)] call FUNC(hasTourniquetAppliedTo))); callbackSuccess = QFUNC(tourniquet); litter[] = {}; @@ -100,7 +100,7 @@ class GVAR(actions) { icon = QPATHTOEF(medical_gui,ui\splint.paa); allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"}; items[] = {"ACE_splint"}; - treatmentTime = 7; + treatmentTime = QGVAR(treatmentTimeSplint); callbackSuccess = QFUNC(splint); condition = QFUNC(canSplint); litter[] = { @@ -117,7 +117,7 @@ class GVAR(actions) { category = "medication"; items[] = {"ACE_morphine"}; condition = ""; - treatmentTime = 5; + treatmentTime = QGVAR(treatmentTimeSyringe); callbackSuccess = QFUNC(medication); animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; sounds[] = {{QPATHTO_R(sounds\Inject.ogg),1,1,50}}; @@ -148,7 +148,7 @@ class GVAR(actions) { allowSelfTreatment = QGVAR(allowSelfIV); category = "advanced"; medicRequired = QGVAR(medicIV); - treatmentTime = 12; + treatmentTime = QGVAR(treatmentTimeIV); items[] = {"ACE_bloodIV"}; condition = ""; callbackSuccess = QFUNC(ivBag); @@ -243,7 +243,7 @@ class GVAR(actions) { treatmentLocations = TREATMENT_LOCATIONS_ALL; allowSelfTreatment = 0; medicRequired = 0; - treatmentTime = 15; + treatmentTime = QGVAR(treatmentTimeBodyBag); items[] = {"ACE_bodyBag"}; // 'vehicle _patient' always returns the body // '_patient in _patient' always false for body diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf index 3b68a0409f..a4ed3c5543 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -34,6 +34,52 @@ true ] call CBA_settings_fnc_init; +[ + QGVAR(treatmentTimeTourniquet), + "SLIDER", + [LSTRING(TreatmentTimeTourniquet_DisplayName), LSTRING(TreatmentTimeTourniquet_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 30, 7, 2], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(treatmentTimeSplint), + "SLIDER", + [LSTRING(TreatmentTimeSplint_DisplayName), LSTRING(TreatmentTimeSplint_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 30, 7, 2], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(treatmentTimeIV), + "SLIDER", + [LSTRING(TreatmentTimeIV_DisplayName), LSTRING(TreatmentTimeIV_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 36, 12, 2], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(treatmentTimeSyringe), + "SLIDER", + [LSTRING(TreatmentTimeSyringe_DisplayName), LSTRING(TreatmentTimeSyringe_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 30, 5, 2], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(treatmentTimeBodyBag), + "SLIDER", + [LSTRING(TreatmentTimeBodyBag_DisplayName), LSTRING(TreatmentTimeBodyBag_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 60, 15, 2], + true +] call CBA_settings_fnc_init; + + [ QGVAR(clearTraumaAfterBandage), "CHECKBOX", diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 4f36baec44..b89d10df51 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -133,6 +133,56 @@ 傷が再開放する確率の係数を設定できます。再開放は、この数値と傷の種類、そして使用した包帯に応じて左右されます。 Yaranın yeniden açılma şansını kontrol etme katsayısı. Son yeniden açılma şansı, bu değerin kullanılan yara tipi ve bandaj için spesifik yeniden açılma şansı ile çarpılmasıyla belirlenir. + + Tourniquet Treatment Time + Temps de traitement du tourniquet + Tourniquet-Behandlungszeit + + + Time in seconds it takes to apply a tourniquet. + Temps en secondes nécessaire pour appliquer un garrot. + Zeit in Sekunden, die benötigt wird, um ein Tourniquet anzuwenden. + + + Syringe Treatment Time + Temps de traitement de la seringue + Spritzenbehandlungszeit + + + Time in seconds it takes to apply a syringe. + Temps en secondes nécessaire pour appliquer une seringue. + Zeit in Sekunden, die zum Auftragen einer Spritze benötigt wird. + + + IV Bag Treatment Time + Temps de traitement du sac IV + IV Beutelbehandlungszeit + + + Time in seconds it takes to apply an IV bag. + Temps en secondes nécessaire pour appliquer un sac IV. + Zeit in Sekunden, die benötigt wird, um einen Infusionsbeutel aufzutragen. + + + Splint Treatment Time + Temps de traitement de l'attelle + Schienenbehandlungszeit + + + Time in seconds it takes to apply a splint. + Temps en secondes nécessaire pour appliquer une attelle. + Zeit in Sekunden, die zum Anbringen einer Schiene benötigt wird. + + + Body Bag Use Time + Temps d'utilisation du sac mortuaire + Anwendungszeit für Leichensack + + + Time in seconds it takes to apply a body bag. + Temps en secondes qu'il faut pour appliquer un sac mortuaire. + Zeit in Sekunden, die benötigt wird, um einen Leichensack aufzutragen. + Clear Trauma After Bandage 治療後に外傷を削除 From 42f4edc9b71d752b22b91a10beba197cd7b224e4 Mon Sep 17 00:00:00 2001 From: jonpas Date: Thu, 29 Oct 2020 17:36:41 +0100 Subject: [PATCH 008/335] Documentation - Remove slideshow note (#7715) * Documentation - Remove slideshow note Fix in Arma 3 v2.00 * Remove another issue reference --- docs/wiki/development/arma-3-issues.md | 1 - docs/wiki/framework/slideshow-framework.md | 5 ----- 2 files changed, 6 deletions(-) diff --git a/docs/wiki/development/arma-3-issues.md b/docs/wiki/development/arma-3-issues.md index 11c117b0bf..506bfde222 100644 --- a/docs/wiki/development/arma-3-issues.md +++ b/docs/wiki/development/arma-3-issues.md @@ -22,7 +22,6 @@ Keeping track of Arma 3 issues that need to be fixed. - [James2464: T82092: All Environment Rocks Should Have PhysX LODs](https://feedback.bistudio.com/T82092) - [Jaynus: T82046: Display event handler return values for mouse buttons should be respected](https://feedback.bistudio.com/T82046) - [Heisenberg: T82108: Switching between optic modes of a sniper scope (AMS, DMS, MOS) will result in a blurred vision](https://feedback.bistudio.com/T82108) -- [AgentRev: T80668: setObjectTextureGlobal causing "Cannot load texture" errors when used with valid mission files](https://feedback.bistudio.com/T80668) - [BaerMitUmlaut: T120030: Particles do not render properly since 1.62](https://feedback.bistudio.com/T120030) - [Killzone_Kid: T79689: magazineTurretAmmo and setMagazineTurretAmmo do not function as expected if there are multiple magazines of the same type](https://feedback.bistudio.com/T79689) - [nekoarrow: T122981: setMagazineTurretAmmo locality issue](https://feedback.bistudio.com/T122981) diff --git a/docs/wiki/framework/slideshow-framework.md b/docs/wiki/framework/slideshow-framework.md index 2859252670..ef1d7062fd 100644 --- a/docs/wiki/framework/slideshow-framework.md +++ b/docs/wiki/framework/slideshow-framework.md @@ -25,11 +25,6 @@ Important notes: - You can have multiple sets of images on different screens by using multiple modules/function calls. - It is advisable images resolution sizes are powers of 2 (eg. 512x512) to avoid graphical glitches in them. -
-
Note:
-

Mission MUST be in a PBO format (not bare folder) when used on a dedicated server with slideshow images inside a mission due to an issue to prevent errors.

-
- ## 2. Scripting From afb3dad22bf90c86ddb388e72f6a302376430a80 Mon Sep 17 00:00:00 2001 From: Freddo Date: Thu, 29 Oct 2020 17:36:59 +0100 Subject: [PATCH 009/335] Markers - Add timestamps (#7947) * Add timestamps to markers * Tiny tweaks * Update addons/markers/functions/fnc_canTimestamp.sqf Co-authored-by: Brett * Update addons/markers/functions/fnc_initInsertMarker.sqf Co-authored-by: Brett * Add timestamp format setting * Script cleanup, move checkbox under desc * Fix stringtable validation * Tweaks * Remove styling from stringtable * Edit timestamps instead of append Credits to @PabstMirror Co-authored-by: Brett --- addons/markers/InsertMarker.hpp | 15 ++- addons/markers/XEH_PREP.hpp | 3 + addons/markers/functions/fnc_canTimestamp.sqf | 26 ++++ .../functions/fnc_initInsertMarker.sqf | 115 +++++++++++++----- .../functions/fnc_onButtonClickConfirm.sqf | 42 +++++++ .../fnc_onCheckedChangedTimestamp.sqf | 23 ++++ .../functions/fnc_onLBSelChangedColor.sqf | 9 +- .../functions/fnc_onLBSelChangedShape.sqf | 9 +- .../functions/fnc_onSliderPosChangedAngle.sqf | 2 +- addons/markers/initSettings.sqf | 57 ++++++++- addons/markers/script_component.hpp | 22 +++- addons/markers/stringtable.xml | 42 +++++++ 12 files changed, 317 insertions(+), 48 deletions(-) create mode 100644 addons/markers/functions/fnc_canTimestamp.sqf create mode 100644 addons/markers/functions/fnc_onButtonClickConfirm.sqf create mode 100644 addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf diff --git a/addons/markers/InsertMarker.hpp b/addons/markers/InsertMarker.hpp index 5d7cc987e2..ed2d562220 100644 --- a/addons/markers/InsertMarker.hpp +++ b/addons/markers/InsertMarker.hpp @@ -5,6 +5,7 @@ class RscStructuredText; class RscButtonMenuOK; class RscButtonMenuCancel; class RscButtonMenu; +class RscCheckBox; class RscEdit; class RscCombo; class RscSlider; @@ -16,17 +17,23 @@ class RscDisplayInsertMarker { movingEnable = 1; class controls { + class TimeStampText: RscStructuredText { + idc = IDC_ACE_INSERT_MARKER_TIMESTAMP_TEXT; + }; + class TimeStamp: RscCheckBox { + idc = IDC_ACE_INSERT_MARKER_TIMESTAMP; + }; class MarkerShape: RscCombo { - idc = 1210; + idc = IDC_ACE_INSERT_MARKER_SHAPE; }; class MarkerColor: RscCombo { - idc = 1211; + idc = IDC_ACE_INSERT_MARKER_COLOR; }; class MarkerAngle: RscXSliderH { - idc = 1220; + idc = IDC_ACE_INSERT_MARKER_ANGLE; }; class MarkerAngleText: RscText { - idc = 1221; + idc = IDC_ACE_INSERT_MARKER_ANGLE_TEXT; }; }; }; diff --git a/addons/markers/XEH_PREP.hpp b/addons/markers/XEH_PREP.hpp index bbac954b66..3cf9dfc600 100644 --- a/addons/markers/XEH_PREP.hpp +++ b/addons/markers/XEH_PREP.hpp @@ -14,3 +14,6 @@ PREP(canMove); PREP(onMouseButtonDown); PREP(onMouseButtonUp); PREP(movePFH); +PREP(canTimestamp); +PREP(onButtonClickConfirm); +PREP(onCheckedChangedTimestamp); diff --git a/addons/markers/functions/fnc_canTimestamp.sqf b/addons/markers/functions/fnc_canTimestamp.sqf new file mode 100644 index 0000000000..21e80c0921 --- /dev/null +++ b/addons/markers/functions/fnc_canTimestamp.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: Freddo + * Checks whether a unit is able to timestamp. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Whether unit is able to timestamp + * + * Example: + * [ACE_Player] call ace_markers_fnc_canTimestamp + * + * Public: No + */ + +params [["_unit", ACE_player]]; + +private _assignedItems = assignedItems _unit; + +private _index = _assignedItems findIf { + ([_x] call EFUNC(common,getItemType)) isEqualTo ["item", "watch"] +}; + +_index != -1 diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index 8a7a5f21fb..1560040bc9 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" +#include "\A3\ui_f\hpp\defineResincl.inc" /* * Author: BIS, commy2, Timi007 * Sets up the marker placement @@ -29,26 +30,28 @@ }; //BIS Controls: - private _text = _display displayctrl 101; - private _picture = _display displayctrl 102; - private _channel = _display displayctrl 103; - private _buttonOK = _display displayctrl 1; - private _buttonCancel = _display displayctrl 2; - private _description = _display displayctrl 1100; - private _title = _display displayctrl 1001; - private _descriptionChannel = _display displayctrl 1101; + private _text = _display displayctrl IDC_INSERT_MARKER; + private _picture = _display displayctrl IDC_INSERT_MARKER_PICTURE; + private _channel = _display displayctrl IDC_INSERT_MARKER_CHANNELS; + private _buttonOK = _display displayctrl IDC_OK; + private _buttonCancel = _display displayctrl IDC_CANCEL; + private _description = _display displayctrl 1100; + private _title = _display displayctrl 1001; + private _descriptionChannel = _display displayctrl 1101; //ACE Controls: - // _sizeX = _display displayctrl 1200; - // _sizeY = _display displayctrl 1201; - private _aceShapeLB = _display displayctrl 1210; - private _aceColorLB = _display displayctrl 1211; - private _aceAngleSlider = _display displayctrl 1220; - private _aceAngleSliderText = _display displayctrl 1221; + // _sizeX = _display displayctrl 1200; + // _sizeY = _display displayctrl 1201; + private _aceTimestamp = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP; + private _aceTimestampText = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP_TEXT; + private _aceShapeLB = _display displayctrl IDC_ACE_INSERT_MARKER_SHAPE; + private _aceColorLB = _display displayctrl IDC_ACE_INSERT_MARKER_COLOR; + private _aceAngleSlider = _display displayctrl IDC_ACE_INSERT_MARKER_ANGLE; + private _aceAngleSliderText = _display displayctrl IDC_ACE_INSERT_MARKER_ANGLE_TEXT; - private _mapDisplay = displayParent _display; + private _mapDisplay = displayParent _display; if (isNull _mapDisplay) exitWith {ERROR("No Map");}; - private _mapCtrl = _mapDisplay displayCtrl 51; + private _mapCtrl = _mapDisplay displayCtrl IDC_MAP; GVAR(editingMarker) = ""; (ctrlMapMouseOver _mapCtrl) params ["_mouseOverType", "_marker"]; @@ -76,7 +79,10 @@ GVAR(currentMarkerPosition) = markerPos GVAR(editingMarker); } else { private _pos = ctrlPosition _picture; - _pos = [(_pos select 0) + (_pos select 2) / 2, (_pos select 1) + (_pos select 3) / 2]; + _pos = [ + (_pos select 0) + (_pos select 2) / 2, + (_pos select 1) + (_pos select 3) / 2 + ]; GVAR(currentMarkerPosition) = _mapCtrl ctrlMapScreenToWorld _pos; }; @@ -86,9 +92,19 @@ // prevent vanilla key input _display displayAddEventHandler ["KeyDown", {(_this select 1) in [200, 208]}]; + private _hasTimestamp = false; if !((markerText GVAR(editingMarker)) isEqualTo "") then { - //fill text input with text from marker which is being edited - _text ctrlSetText (markerText GVAR(editingMarker)); + // fill text input with text from marker which is being edited + + private _originalText = markerText GVAR(editingMarker); + private _timeIndex = _originalText find (TIMESTAMP_SPACE + "["); + if (_timeIndex > 0 ) then { + // Shave off timestamp + _hasTimestamp = true; + _originalText = _originalText select [0,_timeIndex]; + }; + + _text ctrlSetText _originalText; }; //Focus on the text input @@ -112,33 +128,70 @@ //--- Description _pos set [1, _posY - 1 * _posH]; - _pos set [3,6 * _posH + 6 * BORDER]; + if (GVAR(timestampEnabled)) then { + _pos set [3,7 * _posH + 7 * BORDER]; + } else { + _pos set [3,6 * _posH + 6 * BORDER]; + }; _description ctrlEnable false; _description ctrlSetPosition _pos; _description ctrlSetStructuredText parseText format ["%1", localize "str_lib_label_description"]; _description ctrlCommit 0; + //--- Timestamp + private _timestampOffset = 0; + if (GVAR(timestampEnabled)) then { + _timestampOffset = _posH + BORDER; + + _pos set [0, _posX]; + _pos set [1, _posY + 1 * _posH + 2 * BORDER]; + _pos set [2, _posW - _posH]; + _pos set [3, _posH]; + _aceTimestampText ctrlSetStructuredText parseText format ["%1", LLSTRING(Timestamp)]; + _aceTimestampText ctrlSetPosition _pos; + _aceTimestampText ctrlCommit 0; + + _pos set [0, _posX + _posW - _posH]; + _pos set [2, _posH]; + _pos set [3, _posH]; + _aceTimestamp ctrlSetPosition _pos; + _aceTimestamp ctrlCommit 0; + + if !([ACE_player] call FUNC(canTimestamp)) then { + _aceTimestamp ctrlEnable false; + _aceTimestamp ctrlSetTooltip LLSTRING(TimestampTooltipNoWatch); + } else { + _aceTimestamp cbSetChecked (GETUVAR(GVAR(timestampChecked),false) || _hasTimestamp); + }; + } else { + _aceTimestampText ctrlEnable false; + _aceTimestampText ctrlShow false; + _aceTimestamp ctrlEnable false; + _aceTimestamp ctrlShow false; + }; + //--- Shape - _pos set [1, _posY + 1 * _posH + 2 * BORDER]; + _pos set [0, _posX]; + _pos set [1, _posY + 1 * _posH + 2 * BORDER + _timestampOffset]; _pos set [2, _posW]; _pos set [3, _posH]; _aceShapeLB ctrlSetPosition _pos; _aceShapeLB ctrlCommit 0; //--- Color - _pos set [1, _posY + 2 * _posH + 3 * BORDER]; + _pos set [1, _posY + 2 * _posH + 3 * BORDER + _timestampOffset]; _pos set [2, _posW]; _aceColorLB ctrlSetPosition _pos; _aceColorLB ctrlCommit 0; //--- Angle - _pos set [1, _posY + 3 * _posH + 4 * BORDER]; + _pos set [1, _posY + 3 * _posH + 4 * BORDER + _timestampOffset]; _pos set [2, _posW]; _aceAngleSlider ctrlSetPosition _pos; _aceAngleSlider ctrlCommit 0; //--- Angle Text - _pos set [1, _posY + 4 * _posH + 5 * BORDER]; + _pos set [1, _posY + 4 * _posH + 5 * BORDER + _timestampOffset]; _pos set [2, _posW]; _aceAngleSliderText ctrlSetPosition _pos; _aceAngleSliderText ctrlCommit 0; @@ -146,13 +199,13 @@ private _offsetButtons = 0; if (isMultiplayer) then { - _pos set [1,_posY + 5 * _posH + 7 * BORDER]; + _pos set [1,_posY + 5 * _posH + 7 * BORDER + _timestampOffset]; _pos set [3,_posH]; _descriptionChannel ctrlSetStructuredText parseText format ["%1:", localize "str_a3_cfgvehicles_modulerespawnposition_f_arguments_marker_0"]; _descriptionChannel ctrlSetPosition _pos; _descriptionChannel ctrlCommit 0; - _pos set [1,_posY + 6 * _posH + 7 * BORDER]; + _pos set [1,_posY + 6 * _posH + 7 * BORDER + _timestampOffset]; _pos set [3,_posH]; _channel ctrlSetPosition _pos; _channel ctrlCommit 0; @@ -199,7 +252,7 @@ }; //--- ButtonOK - _pos set [1, _posY + _offsetButtons]; + _pos set [1, _posY + _offsetButtons + _timestampOffset]; _pos set [2, _posW / 2 - BORDER]; _pos set [3, _posH]; _buttonOk ctrlSetPosition _pos; @@ -207,12 +260,18 @@ //--- ButtonCancel _pos set [0, _posX + _posW / 2]; - _pos set [1, _posY + _offsetButtons]; + _pos set [1, _posY + _offsetButtons + _timestampOffset]; _pos set [2, _posW / 2]; _pos set [3, _posH]; _buttonCancel ctrlSetPosition _pos; _buttonCancel ctrlCommit 0; + //////////////////// + // init marker timestamp cb + + _buttonOK ctrlAddEventHandler ['ButtonClick', FUNC(onButtonClickConfirm)]; + _aceTimestamp ctrlAddEventHandler ['CheckedChanged', FUNC(onCheckedChangedTimestamp)]; + //////////////////// // init marker shape lb lbClear _aceShapeLB; diff --git a/addons/markers/functions/fnc_onButtonClickConfirm.sqf b/addons/markers/functions/fnc_onButtonClickConfirm.sqf new file mode 100644 index 0000000000..caa49a0e1c --- /dev/null +++ b/addons/markers/functions/fnc_onButtonClickConfirm.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" +/* + * Author: Freddo + * When the confirm button is pressed. + * + * Arguments: + * 0: Confirm button + * + * Return Value: + * None + * + * Example: + * [_buttonOk] call ACE_markers_fnc_onButtonClickConfirm + * + * Public: No + */ +params ["_buttonOk"]; + +private _display = ctrlParent _buttonOk; +private _description = _display displayctrl IDC_INSERT_MARKER; +private _aceTimestamp = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP; + +// Handle timestamp +if (cbChecked _aceTimestamp && {[ACE_player] call FUNC(canTimestamp)}) then { + private _time = daytime; + private _ampm = switch (true) do { + case (GVAR(timestampHourFormat) == 24): {""}; + case (_time < 12): {" am"}; + case (_time > 12): {SUB(_time,12); " pm"}; + }; + + _description ctrlSetText format [ // Add timestamp suffix + "%1%2[%2%3]", + ctrlText _description, + TIMESTAMP_SPACE, + [_time, GVAR(timestampFormat)] call BIS_fnc_timeToString, + _ampm + ]; +}; + +nil diff --git a/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf b/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf new file mode 100644 index 0000000000..23a3b8c73d --- /dev/null +++ b/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" +/* + * Author: Freddo + * When the timestamp checkbox is toggled + * + * Arguments: + * 0: Checkbox + * 1: Value + * + * Return Value: + * None + * + * Example: + * [_cbTimestamp,1] call ACE_markers_fnc_onCheckedChangedTimestamp + * + * Public: No + */ +params ["_cbTimestamp", "_checked"]; + +SETUVAR(GVAR(timestampChecked),(_checked == 1)); + +nil diff --git a/addons/markers/functions/fnc_onLBSelChangedColor.sqf b/addons/markers/functions/fnc_onLBSelChangedColor.sqf index a141f7e72d..df45213b8e 100644 --- a/addons/markers/functions/fnc_onLBSelChangedColor.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedColor.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" /* * Author: commy2 * When the color list box is changed. @@ -29,10 +30,10 @@ GVAR(currentMarkerColorConfigName) = configName _config; //Set map display to same color: private _bisColorLB = switch (false) do { - case (isNull findDisplay 12): {(findDisplay 12) displayCtrl 1090}; - case (isNull findDisplay 52): {(findDisplay 52) displayCtrl 1090}; - case (isNull findDisplay 53): {(findDisplay 53) displayCtrl 1090}; - case (isNull findDisplay 37): {(findDisplay 37) displayCtrl 1090}; + case (isNull findDisplay 12): {(findDisplay 12) displayCtrl IDC_DIARY_MARKER_COLOR}; + case (isNull findDisplay 52): {(findDisplay 52) displayCtrl IDC_DIARY_MARKER_COLOR}; + case (isNull findDisplay 53): {(findDisplay 53) displayCtrl IDC_DIARY_MARKER_COLOR}; + case (isNull findDisplay 37): {(findDisplay 37) displayCtrl IDC_DIARY_MARKER_COLOR}; default {controlNull}; }; if (_ctrl != _bisColorLB) then { //Don't set what we got a EH from diff --git a/addons/markers/functions/fnc_onLBSelChangedShape.sqf b/addons/markers/functions/fnc_onLBSelChangedShape.sqf index 52a85e5c8d..25e6b54468 100644 --- a/addons/markers/functions/fnc_onLBSelChangedShape.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedShape.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" /* * Author: commy2 * When the shape list box is changed. @@ -29,10 +30,10 @@ GVAR(currentMarkerConfigName) = configName _config; //Set map display to same shape: private _bisShapeLB = switch (false) do { - case (isNull findDisplay 12): {(findDisplay 12) displayCtrl 1091}; - case (isNull findDisplay 52): {(findDisplay 52) displayCtrl 1091}; - case (isNull findDisplay 53): {(findDisplay 53) displayCtrl 1091}; - case (isNull findDisplay 37): {(findDisplay 37) displayCtrl 1091}; + case (isNull findDisplay 12): {(findDisplay 12) displayCtrl IDC_DIARY_MARKER_ICON}; + case (isNull findDisplay 52): {(findDisplay 52) displayCtrl IDC_DIARY_MARKER_ICON}; + case (isNull findDisplay 53): {(findDisplay 53) displayCtrl IDC_DIARY_MARKER_ICON}; + case (isNull findDisplay 37): {(findDisplay 37) displayCtrl IDC_DIARY_MARKER_ICON}; default {controlNull}; }; if (_ctrl != _bisShapeLB) then { //Don't set what we got a EH from diff --git a/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf b/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf index c334d0a8f0..20f63e7115 100644 --- a/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf +++ b/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf @@ -25,6 +25,6 @@ if (_direction < 0) then { _direction = _direction + 360; }; -((ctrlParent _ctrl) displayCtrl 1221) ctrlSetText format [localize LSTRING(MarkerDirection), _direction]; +((ctrlParent _ctrl) displayCtrl IDC_ACE_INSERT_MARKER_ANGLE_TEXT) ctrlSetText format [localize LSTRING(MarkerDirection), _direction]; GVAR(currentMarkerAngle) = _data; diff --git a/addons/markers/initSettings.sqf b/addons/markers/initSettings.sqf index e4aa16b00f..35d1cca4bb 100644 --- a/addons/markers/initSettings.sqf +++ b/addons/markers/initSettings.sqf @@ -1,7 +1,9 @@ +private _categoryName = format ["ACE %1", localize ELSTRING(map,Module_DisplayName)]; + [ QGVAR(moveRestriction), "LIST", [LSTRING(MoveRestriction), LSTRING(MoveRestriction_Description)], - [format ["ACE %1", localize ELSTRING(map,Module_DisplayName)], localize LSTRING(Module_DisplayName)], + [_categoryName, LLSTRING(Module_DisplayName)], [ [ MOVE_RESTRICTION_NOBODY, @@ -22,3 +24,56 @@ 1 ] ] call cba_settings_fnc_init; + +[ + QGVAR(timestampEnabled), "CHECKBOX", + [LSTRING(TimestampEnabled), LSTRING(TimestampEnabledDescription)], + [_categoryName, LLSTRING(Module_DisplayName)], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(timestampHourFormat), "LIST", + [LSTRING(TimestampHourFormat), LSTRING(TimestampHourFormatDescription)], + [_categoryName, LLSTRING(Module_DisplayName)], + [ + [ + 24, + 12 + ], + [ + LSTRING(TimestampHourFormat24), + LSTRING(TimestampHourFormat12) + ], + 0 + ] +] call CBA_fnc_addSetting; + +private _formatDescription = [ + LLSTRING(TimestampFormatDescription0), + LLSTRING(TimestampFormatDescription1), + LLSTRING(TimestampFormatDescription2), + LLSTRING(TimestampFormatDescription3), + LLSTRING(TimestampFormatDescription4) +] joinString "\n"; + +[ + QGVAR(timestampFormat), "LIST", + [LSTRING(timestampFormat), _formatDescription], + [_categoryName, LLSTRING(Module_DisplayName)], + [ + [ + "HH", + "HH:MM", + "HH:MM:SS", + "HH:MM:SS:MM" + ], + [ + "HH", + "HH:MM", + "HH:MM:SS", + "HH:MM:SS:MM" + ], + 1 + ] +] call CBA_fnc_addSetting; diff --git a/addons/markers/script_component.hpp b/addons/markers/script_component.hpp index 8b268e2d03..a40e557135 100644 --- a/addons/markers/script_component.hpp +++ b/addons/markers/script_component.hpp @@ -24,9 +24,19 @@ localize "str_channel_vehicle" \ ] -#define MOVE_RESTRICTION_NOBODY -1 -#define MOVE_RESTRICTION_ALL 0 -#define MOVE_RESTRICTION_ADMINS 1 -#define MOVE_RESTRICTION_GROUP_LEADERS 2 -#define MOVE_RESTRICTION_GROUP_LEADERS_ADMINS 3 -#define MOVE_RESTRICTION_OWNER 4 +// 129 just looks like a space +#define TIMESTAMP_SPACE (toString [129]) + +#define MOVE_RESTRICTION_NOBODY -1 +#define MOVE_RESTRICTION_ALL 0 +#define MOVE_RESTRICTION_ADMINS 1 +#define MOVE_RESTRICTION_GROUP_LEADERS 2 +#define MOVE_RESTRICTION_GROUP_LEADERS_ADMINS 3 +#define MOVE_RESTRICTION_OWNER 4 + +#define IDC_ACE_INSERT_MARKER_TIMESTAMP 1210 +#define IDC_ACE_INSERT_MARKER_TIMESTAMP_TEXT 1211 +#define IDC_ACE_INSERT_MARKER_SHAPE 1220 +#define IDC_ACE_INSERT_MARKER_COLOR 1221 +#define IDC_ACE_INSERT_MARKER_ANGLE 1230 +#define IDC_ACE_INSERT_MARKER_ANGLE_TEXT 1231 diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index 2add6e468e..1fb27d8a1d 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -150,5 +150,47 @@ Tvůrce Yaratıcı + + Allow Timestamps + + + Whether to allow timestamps to be automatically applied to markers + + + Add Timestamp: + + + Watch Required + + + Timestamp Format + + + Changes the timestamp format + + + "HH" - Hour + + + "MM" - Minute + + + "SS" - Seconds + + + "MM" - Milliseconds + + + Timestamp Hour Format + + + 24-Hour Clock + + + 12-Hour Clock + + + Changes timestamp to use either 24-hour or 12-hour clock format + From ef56a2dc3201f4a99f0061dea70530ab3f881a26 Mon Sep 17 00:00:00 2001 From: Drofseh Date: Thu, 29 Oct 2020 09:37:15 -0700 Subject: [PATCH 010/335] Remove MAR-10 magazines from AWM magwell (#7777) --- addons/ballistics/CfgMagazineWells.hpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/addons/ballistics/CfgMagazineWells.hpp b/addons/ballistics/CfgMagazineWells.hpp index 258b619e14..6fa0ea1caf 100644 --- a/addons/ballistics/CfgMagazineWells.hpp +++ b/addons/ballistics/CfgMagazineWells.hpp @@ -159,13 +159,6 @@ class CfgMagazineWells { }; }; - class CBA_338LM_AI { //338 Lapua Magnum Accuracy International - ADDON[] = { - "ACE_10Rnd_338_300gr_HPBT_Mag", - "ACE_10Rnd_338_API526_Mag" - }; - }; - class CBA_408CT_Inter { ADDON[] = { "ACE_7Rnd_408_305gr_Mag" From 9e3409fc6e8dde9f65bf557a8e06a49f852ad325 Mon Sep 17 00:00:00 2001 From: Brett Date: Thu, 29 Oct 2020 10:37:36 -0600 Subject: [PATCH 011/335] Medical - Allow placing unconscious in a body bag (#7941) * medical: allow placing unconscious in a bodybag * Always show body bag action on non-awake units Co-authored-by: PabstMirror --- .../ACE_Medical_Treatment_Actions.hpp | 4 +--- addons/medical_treatment/XEH_PREP.hpp | 1 + .../functions/fnc_canPlaceInBodyBag.sqf | 24 +++++++++++++++++++ .../functions/fnc_placeInBodyBag.sqf | 9 +++++-- addons/medical_treatment/initSettings.sqf | 9 +++++++ addons/medical_treatment/stringtable.xml | 9 +++++++ 6 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 addons/medical_treatment/functions/fnc_canPlaceInBodyBag.sqf diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index d86f1323c7..734f5ff4b2 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -245,9 +245,7 @@ class GVAR(actions) { medicRequired = 0; treatmentTime = QGVAR(treatmentTimeBodyBag); items[] = {"ACE_bodyBag"}; - // 'vehicle _patient' always returns the body - // '_patient in _patient' always false for body - condition = QUOTE(!alive _patient && {isNull objectParent _patient}); + condition = QFUNC(canPlaceInBodyBag); callbackSuccess = QFUNC(placeInBodyBag); consumeItem = 1; litter[] = {}; diff --git a/addons/medical_treatment/XEH_PREP.hpp b/addons/medical_treatment/XEH_PREP.hpp index 480a65f2cb..0c0f11742f 100644 --- a/addons/medical_treatment/XEH_PREP.hpp +++ b/addons/medical_treatment/XEH_PREP.hpp @@ -6,6 +6,7 @@ PREP(bandageLocal); PREP(bodyCleanupLoop); PREP(canBandage); PREP(canCPR); +PREP(canPlaceInBodyBag); PREP(canSplint); PREP(canStitch); PREP(canTreat); diff --git a/addons/medical_treatment/functions/fnc_canPlaceInBodyBag.sqf b/addons/medical_treatment/functions/fnc_canPlaceInBodyBag.sqf new file mode 100644 index 0000000000..d99ac5ce2d --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canPlaceInBodyBag.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: SynixeBrett + * Checks if the patient can be placed in a bodybag. + * + * 'vehicle _patient' always returns the body + * '_patient in _patient' always false for body + * + * Arguments: + * 0: Medic (not used) + * 1: Patient + * + * Return Value: + * Can Place in Bodybag + * + * Example: + * [player, cursorObject] call ace_medical_treatment_fnc_canPlaceInBodybag + * + * Public: No + */ + +params ["", "_patient"]; + +(isNull objectParent _patient) && {!(_patient call EFUNC(common,isAwake))} diff --git a/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf index 02feb52025..3154107e01 100644 --- a/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf +++ b/addons/medical_treatment/functions/fnc_placeInBodyBag.sqf @@ -4,7 +4,7 @@ * Places a dead body inside a body bag. * * Arguments: - * 0: Medic (not used) + * 0: Medic * 1: Patient * * Return Value: @@ -16,9 +16,14 @@ * Public: No */ -params ["", "_patient"]; +params ["_medic", "_patient"]; TRACE_1("placeInBodyBag",_patient); +if ((alive _patient) && {!GVAR(allowBodyBagUnconscious)}) exitWith { + [_medic, "ACE_bodyBag"] call EFUNC(common,addToInventory); // re-add slighly used bodybag? + [LSTRING(bodybagWhileStillAlive)] call EFUNC(common,displayTextStructured); +}; + if (!local _patient) exitWith { TRACE_1("Calling where local",local _patient); [QGVAR(placeInBodyBag), [nil, _patient], _patient] call CBA_fnc_targetEvent; diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf index a4ed3c5543..4586ac4468 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -234,6 +234,15 @@ true ] call CBA_settings_fnc_init; +[ + QGVAR(allowBodyBagUnconscious), + "CHECKBOX", + [LSTRING(AllowBodyBagUnconscious_DisplayName), LSTRING(AllowBodyBagUnconscious_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + false, + true +] call CBA_settings_fnc_init; + [ QGVAR(cprSuccessChance), "SLIDER", diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index b89d10df51..f10ee53d9e 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -606,6 +606,12 @@ Pozwala przetoczyć płyny IV samemu sobie Abilita la trasfusione in endovena su se stessi. + + Allow Unconscious Body Bag + + + Enables placing an unconscious patient in a body bag. + Allow IV Transfusion Erlaube Bluttransfusionen @@ -4282,5 +4288,8 @@ 這部位沒有止血帶! Bu vücut kısmında turnike yok! + + The body twitched and may not be dead! + From 2b0db1980712cad61f6e5cd253bd799e9aac37c8 Mon Sep 17 00:00:00 2001 From: diwako Date: Thu, 29 Oct 2020 17:37:44 +0100 Subject: [PATCH 012/335] Medical - Adjustable times for many treatment actions (#7951) * adjustable times for most constant treatment times * add new line, formatting * cleanup merge Co-authored-by: PabstMirror --- .../medical_engine/script_macros_medical.hpp | 3 --- .../ACE_Medical_Treatment_Actions.hpp | 2 +- .../functions/fnc_getStitchTime.sqf | 2 +- .../functions/fnc_surgicalKitProgress.sqf | 2 +- addons/medical_treatment/initSettings.sqf | 18 ++++++++++++++++++ addons/medical_treatment/stringtable.xml | 12 ++++++++++++ 6 files changed, 33 insertions(+), 6 deletions(-) diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp index d93baf4f2a..f2d4fb9a09 100644 --- a/addons/medical_engine/script_macros_medical.hpp +++ b/addons/medical_engine/script_macros_medical.hpp @@ -113,9 +113,6 @@ #define DEFAULT_BANDAGE_REOPENING_MIN_DELAY 120 #define DEFAULT_BANDAGE_REOPENING_MAX_DELAY 200 -// Time it takes to stitch one wound -#define WOUND_STITCH_TIME 5 - #define DEFAULT_TOURNIQUET_VALUES [0,0,0,0,0,0] #define DEFAULT_FRACTURE_VALUES [0,0,0,0,0,0] diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index 734f5ff4b2..6c23f23711 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -259,7 +259,7 @@ class GVAR(actions) { allowedSelections[] = {"Body"}; allowSelfTreatment = 0; medicRequired = 0; - treatmentTime = 15; + treatmentTime = QGVAR(treatmentTimeCPR); items[] = {}; condition = QFUNC(canCPR); callbackSuccess = QFUNC(cprSuccess); diff --git a/addons/medical_treatment/functions/fnc_getStitchTime.sqf b/addons/medical_treatment/functions/fnc_getStitchTime.sqf index 9d0254605a..21e0d14105 100644 --- a/addons/medical_treatment/functions/fnc_getStitchTime.sqf +++ b/addons/medical_treatment/functions/fnc_getStitchTime.sqf @@ -18,4 +18,4 @@ params ["", "_patient"]; -count (_patient call FUNC(getStitchableWounds)) * WOUND_STITCH_TIME +count (_patient call FUNC(getStitchableWounds)) * GVAR(treatmentTimeStich) diff --git a/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf index 9dcd7265e1..7a97c256f6 100644 --- a/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf +++ b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf @@ -28,7 +28,7 @@ private _stitchableWounds = _patient call FUNC(getStitchableWounds); if (_stitchableWounds isEqualTo []) exitWith {false}; // Not enough time has elapsed to stitch a wound -if (_totalTime - _elapsedTime > (count _stitchableWounds - 1) * WOUND_STITCH_TIME) exitWith {true}; +if (_totalTime - _elapsedTime > (count _stitchableWounds - 1) * GVAR(treatmentTimeStich)) exitWith {true}; private _bandagedWounds = GET_BANDAGED_WOUNDS(_patient); private _stitchedWounds = GET_STITCHED_WOUNDS(_patient); diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf index 4586ac4468..8a59853d99 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -216,6 +216,15 @@ true ] call CBA_settings_fnc_init; +[ + QGVAR(treatmentTimeStich), + "SLIDER", + [LSTRING(treatmentTimeStich_DisplayName), LSTRING(treatmentTimeStich_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.01, 10, 5, 2], + true +] call CBA_settings_fnc_init; + [ QGVAR(medicIV), "LIST", @@ -252,6 +261,15 @@ true ] call CBA_settings_fnc_init; +[ + QGVAR(treatmentTimeCPR), + "SLIDER", + [LSTRING(treatmentTimeCPR_DisplayName), LSTRING(treatmentTimeCPR_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 30, 15, 1], + true +] call CBA_settings_fnc_init; + [ QGVAR(holsterRequired), "LIST", diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index f10ee53d9e..836c305b77 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -183,6 +183,18 @@ Temps en secondes qu'il faut pour appliquer un sac mortuaire. Zeit in Sekunden, die benötigt wird, um einen Leichensack aufzutragen. + + Stitching time per wound + + + Time that is needed to stitch one wound + + + Time to give CPR + + + Time in seconds how long the CPR action takes to complete + Clear Trauma After Bandage 治療後に外傷を削除 From b389740a293dd3a4df0f35365e912189f558c851 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Thu, 29 Oct 2020 17:38:24 +0100 Subject: [PATCH 013/335] Medical AI - Fix AI healing itself too fast when hit (#7955) * Fix AI healing itself too fast when hit * make time constants gvars Co-authored-by: PabstMirror --- addons/medical_ai/XEH_postInit.sqf | 5 +++++ addons/medical_ai/XEH_preInit.sqf | 4 ++++ addons/medical_ai/functions/fnc_isSafe.sqf | 3 ++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/medical_ai/XEH_postInit.sqf b/addons/medical_ai/XEH_postInit.sqf index d8676e9695..432846cbeb 100644 --- a/addons/medical_ai/XEH_postInit.sqf +++ b/addons/medical_ai/XEH_postInit.sqf @@ -9,6 +9,11 @@ _unit setVariable [QGVAR(lastFired), CBA_missionTime]; }] call CBA_fnc_addEventHandler; + ["CAManBase", "Hit", { + params ["_unit"]; + _unit setVariable [QGVAR(lastHit), CBA_missionTime]; + }] call CBA_fnc_addClassEventHandler; + #include "stateMachine.sqf" }] call CBA_fnc_addEventHandler; diff --git a/addons/medical_ai/XEH_preInit.sqf b/addons/medical_ai/XEH_preInit.sqf index 9361d05015..8dcb0111d7 100644 --- a/addons/medical_ai/XEH_preInit.sqf +++ b/addons/medical_ai/XEH_preInit.sqf @@ -8,4 +8,8 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" +// default time values for AI being ready to heal, used in fnc_isSafe +if (isNil QGVAR(timeSafe_shoot)) then { GVAR(timeSafe_shoot) = 30; }; +if (isNil QGVAR(timeSafe_hit)) then { GVAR(timeSafe_hit) = 30; }; + ADDON = true; diff --git a/addons/medical_ai/functions/fnc_isSafe.sqf b/addons/medical_ai/functions/fnc_isSafe.sqf index 3c6c9f5dca..93ac425602 100644 --- a/addons/medical_ai/functions/fnc_isSafe.sqf +++ b/addons/medical_ai/functions/fnc_isSafe.sqf @@ -16,5 +16,6 @@ */ (getSuppression _this == 0) -&& {CBA_missionTime - (_this getVariable [QGVAR(lastFired), -30]) > 30} +&& {CBA_missionTime - (_this getVariable [QGVAR(lastFired), -999999]) > GVAR(timeSafe_shoot)} +&& {CBA_missionTime - (_this getVariable [QGVAR(lastHit), -999999]) > GVAR(timeSafe_hit)} && {!(_this getVariable [QEGVAR(captives,isHandcuffed), false])} From b991fe1343943a869371ef5ba525b6b944b1023d Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 29 Oct 2020 11:38:31 -0500 Subject: [PATCH 014/335] Arsenal - Sort by protection (helm, uniform, vest) (#7952) * Arsenal - Sort by protection (helm, uniform, vest) * Update fnc_sortStatement_protection.sqf * split to 2 different sorts --- addons/arsenal/ACE_Arsenal_Sorts.hpp | 12 ++++++++++ addons/arsenal/XEH_PREP.hpp | 1 + .../fnc_sortStatement_protection.sqf | 23 +++++++++++++++++++ addons/arsenal/stringtable.xml | 6 +++++ 4 files changed, 42 insertions(+) create mode 100644 addons/arsenal/functions/fnc_sortStatement_protection.sqf diff --git a/addons/arsenal/ACE_Arsenal_Sorts.hpp b/addons/arsenal/ACE_Arsenal_Sorts.hpp index 17c5abf4a0..6d5125d7ff 100644 --- a/addons/arsenal/ACE_Arsenal_Sorts.hpp +++ b/addons/arsenal/ACE_Arsenal_Sorts.hpp @@ -61,4 +61,16 @@ class GVAR(sorts) { tabs[] = {{}, {4}}; statement = QUOTE(_this call FUNC(sortStatement_magCount)); }; + + class ACE_protectionBallistic: sortBase { + scope = 2; + displayName = CSTRING(sortByProtectionBallistic); + tabs[] = {{3,4,6}, {}}; + statement = QUOTE([ARR_3(_this, 1000000, 1000)] call FUNC(sortStatement_protection)); + }; + + class ACE_protectionExplosive: ACE_protectionBallistic { + displayName = CSTRING(sortByProtectionExplosive); + statement = QUOTE([ARR_3(_this, 1000, 1000000)] call FUNC(sortStatement_protection)); + }; }; diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp index 4879e6d7a1..209f882738 100644 --- a/addons/arsenal/XEH_PREP.hpp +++ b/addons/arsenal/XEH_PREP.hpp @@ -67,6 +67,7 @@ PREP(sortStatement_accuracy); PREP(sortStatement_magCount); PREP(sortStatement_mass); PREP(sortStatement_mod); +PREP(sortStatement_protection); PREP(sortStatement_rateOfFire); PREP(sortStatement_scopeMag); PREP(statBarStatement_accuracy); diff --git a/addons/arsenal/functions/fnc_sortStatement_protection.sqf b/addons/arsenal/functions/fnc_sortStatement_protection.sqf new file mode 100644 index 0000000000..4ab0509e42 --- /dev/null +++ b/addons/arsenal/functions/fnc_sortStatement_protection.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Statement to sort items by their protection (combination of ballistic and explosive). + * + * Arguments: + * 0: Item Config + * 1: Ballistic (passthrough) coefficent + * 2: Explosive (armor) coefficent + * + * Return Value: + * Sorting Value + * + * Public: No +*/ + +params ["_itemCfg", "_ballisticCo", "_explosiveCo"]; + +(([[_itemCfg], ["passthrough", "armor"]] call BIS_fnc_configExtremes) select 1) params [["_passthroughMax", 0], ["_armorMax", 0]]; + +private _protectionCombined = _passthroughMax * _ballisticCo + _armorMax * _explosiveCo; + +_protectionCombined diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index dcb2d22a64..2585abc530 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -416,6 +416,12 @@ 装弾数で並び替え Mermi sayısına göre sırala + + Sort by ballistic protection + + + Sort by explosive protection + Share or stop sharing the selected loadout Compartir o dejar de compartir el equipamiento seleccionado From aab8d8eb32cb369c0daa6d2e838065f7ad3b3126 Mon Sep 17 00:00:00 2001 From: mharis001 <34453221+mharis001@users.noreply.github.com> Date: Fri, 30 Oct 2020 09:45:28 -0400 Subject: [PATCH 015/335] Medical Treatment - Title case autoinjector item names (#7974) --- addons/medical_treatment/stringtable.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 836c305b77..7b855a4014 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -1367,7 +1367,7 @@ Kırık bir uzvu stabilize eder - Morphine autoinjector + Morphine Autoinjector Morphium-Autoinjektor Морфин в пневмошприце Morfina auto-inyectable @@ -1416,7 +1416,7 @@ 止痛藥的一種, 用於減低中度至重度的疼痛感 - Adenosine autoinjector + Adenosine Autoinjector Adenosin-Autoinjektor Asenosina auto-inyectable Autostrzykawka z adenozyną @@ -1462,7 +1462,7 @@ 一種藥物用於減低腎上腺素的效果 - Atropine autoinjector + Atropine Autoinjector Атропин в пневмошприце Atropina auto-inyectable Auto-injecteur d'atropine @@ -1511,7 +1511,7 @@ 軍用神經解毒針, 用來應付核生化汙染的情況. - Epinephrine autoinjector + Epinephrine Autoinjector Адреналин в пневмошприце Epinefrina auto-inyectable Auto-injecteur d'épinéphrine From 2ca13fc0229ac65208a9b56fe93492c8f2a6d153 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 30 Oct 2020 13:29:13 -0500 Subject: [PATCH 016/335] Medical - Cleanup preload debugging, bump to 2.00 (#7976) --- addons/main/script_mod.hpp | 2 +- addons/medical_engine/script_component.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 4123688015..d3a54e131e 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -10,7 +10,7 @@ #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD // MINIMAL required version for the Mod. Components can specify others.. -#define REQUIRED_VERSION 1.98 +#define REQUIRED_VERSION 2.00 #define REQUIRED_CBA_VERSION {3,15,0} #ifdef COMPONENT_BEAUTIFIED diff --git a/addons/medical_engine/script_component.hpp b/addons/medical_engine/script_component.hpp index 5166324b1e..e5e03e6d1f 100644 --- a/addons/medical_engine/script_component.hpp +++ b/addons/medical_engine/script_component.hpp @@ -19,11 +19,11 @@ #include "\z\ace\addons\medical_engine\script_macros_config.hpp" #define PRELOAD_CLASS(class) \ - INFO_1("Starting preload for (%1)",class);\ + TRACE_1("Starting preload",class);\ [{\ 1 preloadObject _this;\ }, {\ - INFO_1("Preload done for (%1)",_this);\ + TRACE_1("Preload done",_this);\ }, class] call CBA_fnc_waitUntilAndExecute #define PRIORITY_HEAD 3 From 171fbf1e9ec3ee593ee0fc9e5c04b1270db4d01f Mon Sep 17 00:00:00 2001 From: mharis001 <34453221+mharis001@users.noreply.github.com> Date: Sat, 31 Oct 2020 00:40:10 -0400 Subject: [PATCH 017/335] Medical Treatment - Settings cleanup (#7973) --- .../ACE_Medical_Treatment_Actions.hpp | 2 +- .../functions/fnc_getStitchTime.sqf | 2 +- .../functions/fnc_surgicalKitProgress.sqf | 2 +- addons/medical_treatment/initSettings.sqf | 109 ++++++++-------- addons/medical_treatment/stringtable.xml | 120 +++++++++--------- 5 files changed, 115 insertions(+), 120 deletions(-) diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index 6c23f23711..1308f4bcea 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -117,7 +117,7 @@ class GVAR(actions) { category = "medication"; items[] = {"ACE_morphine"}; condition = ""; - treatmentTime = QGVAR(treatmentTimeSyringe); + treatmentTime = QGVAR(treatmentTimeAutoinjector); callbackSuccess = QFUNC(medication); animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; sounds[] = {{QPATHTO_R(sounds\Inject.ogg),1,1,50}}; diff --git a/addons/medical_treatment/functions/fnc_getStitchTime.sqf b/addons/medical_treatment/functions/fnc_getStitchTime.sqf index 21e0d14105..12c770eb95 100644 --- a/addons/medical_treatment/functions/fnc_getStitchTime.sqf +++ b/addons/medical_treatment/functions/fnc_getStitchTime.sqf @@ -18,4 +18,4 @@ params ["", "_patient"]; -count (_patient call FUNC(getStitchableWounds)) * GVAR(treatmentTimeStich) +count (_patient call FUNC(getStitchableWounds)) * GVAR(woundStitchTime) diff --git a/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf index 7a97c256f6..14e11df259 100644 --- a/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf +++ b/addons/medical_treatment/functions/fnc_surgicalKitProgress.sqf @@ -28,7 +28,7 @@ private _stitchableWounds = _patient call FUNC(getStitchableWounds); if (_stitchableWounds isEqualTo []) exitWith {false}; // Not enough time has elapsed to stitch a wound -if (_totalTime - _elapsedTime > (count _stitchableWounds - 1) * GVAR(treatmentTimeStich)) exitWith {true}; +if (_totalTime - _elapsedTime > (count _stitchableWounds - 1) * GVAR(woundStitchTime)) exitWith {true}; private _bandagedWounds = GET_BANDAGED_WOUNDS(_patient); private _stitchedWounds = GET_STITCHED_WOUNDS(_patient); diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf index 8a59853d99..54a83453e4 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -34,52 +34,6 @@ true ] call CBA_settings_fnc_init; -[ - QGVAR(treatmentTimeTourniquet), - "SLIDER", - [LSTRING(TreatmentTimeTourniquet_DisplayName), LSTRING(TreatmentTimeTourniquet_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - [0.1, 30, 7, 2], - true -] call CBA_settings_fnc_init; - -[ - QGVAR(treatmentTimeSplint), - "SLIDER", - [LSTRING(TreatmentTimeSplint_DisplayName), LSTRING(TreatmentTimeSplint_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - [0.1, 30, 7, 2], - true -] call CBA_settings_fnc_init; - -[ - QGVAR(treatmentTimeIV), - "SLIDER", - [LSTRING(TreatmentTimeIV_DisplayName), LSTRING(TreatmentTimeIV_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - [0.1, 36, 12, 2], - true -] call CBA_settings_fnc_init; - -[ - QGVAR(treatmentTimeSyringe), - "SLIDER", - [LSTRING(TreatmentTimeSyringe_DisplayName), LSTRING(TreatmentTimeSyringe_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - [0.1, 30, 5, 2], - true -] call CBA_settings_fnc_init; - -[ - QGVAR(treatmentTimeBodyBag), - "SLIDER", - [LSTRING(TreatmentTimeBodyBag_DisplayName), LSTRING(TreatmentTimeBodyBag_Description)], - [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - [0.1, 60, 15, 2], - true -] call CBA_settings_fnc_init; - - [ QGVAR(clearTraumaAfterBandage), "CHECKBOX", @@ -117,6 +71,42 @@ true ] call CBA_settings_fnc_init; +[ + QGVAR(treatmentTimeAutoinjector), + "SLIDER", + [LSTRING(TreatmentTimeAutoinjector_DisplayName), LSTRING(TreatmentTimeAutoinjector_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 60, 5, 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(treatmentTimeTourniquet), + "SLIDER", + [LSTRING(TreatmentTimeTourniquet_DisplayName), LSTRING(TreatmentTimeTourniquet_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 60, 7, 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(treatmentTimeSplint), + "SLIDER", + [LSTRING(TreatmentTimeSplint_DisplayName), LSTRING(TreatmentTimeSplint_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 60, 7, 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(treatmentTimeBodyBag), + "SLIDER", + [LSTRING(TreatmentTimeBodyBag_DisplayName), LSTRING(TreatmentTimeBodyBag_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [0.1, 60, 15, 1], + true +] call CBA_settings_fnc_init; + [ QGVAR(medicEpinephrine), "LIST", @@ -217,11 +207,11 @@ ] call CBA_settings_fnc_init; [ - QGVAR(treatmentTimeStich), + QGVAR(woundStitchTime), "SLIDER", - [LSTRING(treatmentTimeStich_DisplayName), LSTRING(treatmentTimeStich_Description)], + [LSTRING(WoundStitchTime_DisplayName), LSTRING(WoundStitchTime_Description)], [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - [0.01, 10, 5, 2], + [0.1, 60, 5, 1], true ] call CBA_settings_fnc_init; @@ -244,11 +234,11 @@ ] call CBA_settings_fnc_init; [ - QGVAR(allowBodyBagUnconscious), - "CHECKBOX", - [LSTRING(AllowBodyBagUnconscious_DisplayName), LSTRING(AllowBodyBagUnconscious_Description)], + QGVAR(treatmentTimeIV), + "SLIDER", + [LSTRING(TreatmentTimeIV_DisplayName), LSTRING(TreatmentTimeIV_Description)], [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - false, + [0.1, 60, 12, 1], true ] call CBA_settings_fnc_init; @@ -264,9 +254,18 @@ [ QGVAR(treatmentTimeCPR), "SLIDER", - [LSTRING(treatmentTimeCPR_DisplayName), LSTRING(treatmentTimeCPR_Description)], + [LSTRING(TreatmentTimeCPR_DisplayName), LSTRING(TreatmentTimeCPR_Description)], [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], - [0.1, 30, 15, 1], + [0.1, 60, 15, 1], + true +] call CBA_settings_fnc_init; + +[ + QGVAR(allowBodyBagUnconscious), + "CHECKBOX", + [LSTRING(AllowBodyBagUnconscious_DisplayName), LSTRING(AllowBodyBagUnconscious_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + false, true ] call CBA_settings_fnc_init; diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 7b855a4014..1c59c6ba81 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -133,68 +133,6 @@ 傷が再開放する確率の係数を設定できます。再開放は、この数値と傷の種類、そして使用した包帯に応じて左右されます。 Yaranın yeniden açılma şansını kontrol etme katsayısı. Son yeniden açılma şansı, bu değerin kullanılan yara tipi ve bandaj için spesifik yeniden açılma şansı ile çarpılmasıyla belirlenir. - - Tourniquet Treatment Time - Temps de traitement du tourniquet - Tourniquet-Behandlungszeit - - - Time in seconds it takes to apply a tourniquet. - Temps en secondes nécessaire pour appliquer un garrot. - Zeit in Sekunden, die benötigt wird, um ein Tourniquet anzuwenden. - - - Syringe Treatment Time - Temps de traitement de la seringue - Spritzenbehandlungszeit - - - Time in seconds it takes to apply a syringe. - Temps en secondes nécessaire pour appliquer une seringue. - Zeit in Sekunden, die zum Auftragen einer Spritze benötigt wird. - - - IV Bag Treatment Time - Temps de traitement du sac IV - IV Beutelbehandlungszeit - - - Time in seconds it takes to apply an IV bag. - Temps en secondes nécessaire pour appliquer un sac IV. - Zeit in Sekunden, die benötigt wird, um einen Infusionsbeutel aufzutragen. - - - Splint Treatment Time - Temps de traitement de l'attelle - Schienenbehandlungszeit - - - Time in seconds it takes to apply a splint. - Temps en secondes nécessaire pour appliquer une attelle. - Zeit in Sekunden, die zum Anbringen einer Schiene benötigt wird. - - - Body Bag Use Time - Temps d'utilisation du sac mortuaire - Anwendungszeit für Leichensack - - - Time in seconds it takes to apply a body bag. - Temps en secondes qu'il faut pour appliquer un sac mortuaire. - Zeit in Sekunden, die benötigt wird, um einen Leichensack aufzutragen. - - - Stitching time per wound - - - Time that is needed to stitch one wound - - - Time to give CPR - - - Time in seconds how long the CPR action takes to complete - Clear Trauma After Bandage 治療後に外傷を削除 @@ -300,6 +238,52 @@ Ausrüstung des Sanitäters zuerst İlk Sıhhiyenin Ekipmanı + + Autoinjector Treatment Time + + + Time, in seconds, required to administer medication using an autoinjector. + + + Tourniquet Treatment Time + Temps de traitement du tourniquet + Tourniquet-Behandlungszeit + + + Time, in seconds, required to apply/remove a tourniquet. + Temps en secondes nécessaire pour appliquer un garrot. + Zeit in Sekunden, die benötigt wird, um ein Tourniquet anzuwenden. + + + IV Bag Treatment Time + Temps de traitement du sac IV + IV Beutelbehandlungszeit + + + Time, in seconds, required to administer an IV bag. + Temps en secondes nécessaire pour appliquer un sac IV. + Zeit in Sekunden, die benötigt wird, um einen Infusionsbeutel aufzutragen. + + + Splint Treatment Time + Temps de traitement de l'attelle + Schienenbehandlungszeit + + + Time, in seconds, required to apply a splint. + Temps en secondes nécessaire pour appliquer une attelle. + Zeit in Sekunden, die zum Anbringen einer Schiene benötigt wird. + + + Body Bag Use Time + Temps d'utilisation du sac mortuaire + Anwendungszeit für Leichensack + + + Time, in seconds, required to put a patient in a body bag. + Temps en secondes qu'il faut pour appliquer un sac mortuaire. + Zeit in Sekunden, die benötigt wird, um einen Leichensack aufzutragen. + Allow Epinephrine Erlaube Epiniphrin @@ -594,6 +578,12 @@ Ermöglicht die Benutzung des Operations-Sets, um sich selbst zu nähen. Включает использование хирургического набора на себе. + + Wound Stitch Time + + + Time, in seconds, required to stitch a single wound. + Self IV Transfusion Eigennutzung von Bluttransfusionen @@ -852,6 +842,12 @@ Wahrscheinlichkeit, dass HLW bei der Wiederherstellung des Herzrhythmus erfolgreich sein wird. Kalp ritmini geri kazanmada CPR'nin başarılı olma olasılığı. + + CPR Treatment Time + + + Time, in seconds, required to perform CPR on a patient. + Holster Required 武器の扱い From 260706cb9fbb0ef378d7be961aab8fd0fd59c99c Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Mon, 2 Nov 2020 19:22:53 +0100 Subject: [PATCH 018/335] Fix door opening for buildings with 10+ doors (#7975) --- addons/interaction/functions/fnc_getDoorAnimations.sqf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/interaction/functions/fnc_getDoorAnimations.sqf b/addons/interaction/functions/fnc_getDoorAnimations.sqf index 003cce7664..f23a4f0ffd 100644 --- a/addons/interaction/functions/fnc_getDoorAnimations.sqf +++ b/addons/interaction/functions/fnc_getDoorAnimations.sqf @@ -23,10 +23,13 @@ params ["_house", "_door"]; private _animate = animationNames _house; private _animations = []; private _lockedVariable = []; +private _numberStrings = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; { private _animName = toLower _x; - if ((_animName find (toLower _door)) != -1) then { + private _index = _animName find toLower _door; + + if (_index != -1 && {!(_animName select [_index + count _door, 1] in _numberStrings)}) then { if (((_animName find "disabled") != -1) || ((_animName find "locked") != -1)) then { _lockedVariable pushBack _animName; } else { From 9226035d597bf0fb2d6aadba2be8b5c1280ada56 Mon Sep 17 00:00:00 2001 From: Brett Date: Mon, 2 Nov 2020 12:23:44 -0600 Subject: [PATCH 019/335] Arsenal - Conditional on sorts (#7889) * Arsenal - conditional on sorts * fix: zero divisor * update fnc_addSort * Update fnc_fillSort.sqf Co-authored-by: PabstMirror --- addons/arsenal/ACE_Arsenal_Sorts.hpp | 9 +++++++++ addons/arsenal/XEH_PREP.hpp | 1 + addons/arsenal/functions/fnc_addSort.sqf | 8 +++++--- addons/arsenal/functions/fnc_compileSorts.sqf | 7 ++++++- addons/arsenal/functions/fnc_fillSort.sqf | 10 +++++++--- addons/arsenal/functions/fnc_sortPanel.sqf | 14 ++++++++++---- .../functions/fnc_sortStatement_amount.sqf | 19 +++++++++++++++++++ 7 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 addons/arsenal/functions/fnc_sortStatement_amount.sqf diff --git a/addons/arsenal/ACE_Arsenal_Sorts.hpp b/addons/arsenal/ACE_Arsenal_Sorts.hpp index 6d5125d7ff..ecdd1e68b2 100644 --- a/addons/arsenal/ACE_Arsenal_Sorts.hpp +++ b/addons/arsenal/ACE_Arsenal_Sorts.hpp @@ -4,6 +4,7 @@ class GVAR(sorts) { displayName = ""; tabs[] = {{}, {}}; statement = ""; + condition = "true"; }; class ACE_alphabetically: sortBase { @@ -27,6 +28,14 @@ class GVAR(sorts) { statement = QUOTE(_this call FUNC(sortStatement_mass)); }; + class ACE_amount: sortBase { + scope = 2; + displayName = CSTRING(sortByAmountText); + tabs[] = {{}, {0,1,2,3,4,5,6,7}}; + statement = QUOTE(_this call FUNC(sortStatement_amount)); + condition = QUOTE(_this select 0); // Only show for containers + }; + class ACE_load: sortBase { scope = 2; displayName = CSTRING(sortByLoadText); diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp index 209f882738..18128f8cc9 100644 --- a/addons/arsenal/XEH_PREP.hpp +++ b/addons/arsenal/XEH_PREP.hpp @@ -64,6 +64,7 @@ PREP(scanConfig); PREP(showItem); PREP(sortPanel); PREP(sortStatement_accuracy); +PREP(sortStatement_amount); PREP(sortStatement_magCount); PREP(sortStatement_mass); PREP(sortStatement_mod); diff --git a/addons/arsenal/functions/fnc_addSort.sqf b/addons/arsenal/functions/fnc_addSort.sqf index 6faa2ba51c..5ef5a8fc90 100644 --- a/addons/arsenal/functions/fnc_addSort.sqf +++ b/addons/arsenal/functions/fnc_addSort.sqf @@ -10,12 +10,13 @@ * 1: Sort Class (a unique string for each algorithm) * 2: Display Name * 3: Algorithm + * 4: Condition (Optional) * * Return Value: * 0: Array of IDs (ARRAY of STRINGS) * * Example: - * [[[0, 1]], "fireRateSort", "Sort by fire rate", { + * [[[0, 1], []], "fireRateSort", "Sort by fire rate", { * params ["_itemCfg"]; * private _fireModes = getArray (_itemCfg >> "modes"); * private _fireRate = []; @@ -35,7 +36,8 @@ params [ ["_tabs", [[], []], [[]], 2], ["_class", "", [""]], ["_displayName", "", [""]], - ["_statement", {}, [{}]] + ["_statement", {}, [{}]], + ["_condition", {true}, [{}]] ]; _tabs params [ @@ -57,7 +59,7 @@ private _fnc_addToTabs = { } forEach _tabsToAddTo; }; -_finalArray = ["", _displayName, _statement]; +_finalArray = ["", _displayName, _statement, _condition]; if !(_leftTabs isEqualTo []) then { [GVAR(sortListLeftPanel), _leftTabs, "L", 0] call _fnc_addToTabs; diff --git a/addons/arsenal/functions/fnc_compileSorts.sqf b/addons/arsenal/functions/fnc_compileSorts.sqf index 423bec30b3..e810f64a9b 100644 --- a/addons/arsenal/functions/fnc_compileSorts.sqf +++ b/addons/arsenal/functions/fnc_compileSorts.sqf @@ -64,13 +64,18 @@ private _configEntries = "(getNumber (_x >> 'scope')) == 2" configClasses (confi private _class = configName _x; private _displayName = getText (_x >> "displayName"); private _statement = getText (_x >> "statement"); + private _condition = getText (_x >> "condition"); (getArray (_x >> "tabs")) params ["_leftTabsList", "_rightTabsList"]; if (_statement != "") then { _statement = compile _statement; }; - _finalArray = ["", _displayName, _statement]; + if (_condition != "") then { + _condition = compile _condition; + }; + + _finalArray = ["", _displayName, _statement, _condition]; if !(_leftTabsList isEqualTo []) then { [_sortListLeftPanel, _leftTabsList, "L"] call _fnc_addToTabs; diff --git a/addons/arsenal/functions/fnc_fillSort.sqf b/addons/arsenal/functions/fnc_fillSort.sqf index a6e93a0508..1f27fd879d 100644 --- a/addons/arsenal/functions/fnc_fillSort.sqf +++ b/addons/arsenal/functions/fnc_fillSort.sqf @@ -90,9 +90,13 @@ private _sortIndex = 0; { if (_x isEqualTo []) exitWith {}; - _sortCtrl lbAdd (_x select 1); - if ((_x select 1) isEqualTo _lastSort) then { - _sortIndex = _forEachIndex; + _x params ["_sortName", "_displayName", "", "_condition"] + if ([_right] call _condition) then { + private _index = _sortCtrl lbAdd _displayName; + _sortCtrl lbSetData [_index, _sortName]; + if (_displayName isEqualTo _lastSort) then { + _sortIndex = _index; + }; }; } forEach _sorts; diff --git a/addons/arsenal/functions/fnc_sortPanel.sqf b/addons/arsenal/functions/fnc_sortPanel.sqf index 91d0614c65..e840b11c07 100644 --- a/addons/arsenal/functions/fnc_sortPanel.sqf +++ b/addons/arsenal/functions/fnc_sortPanel.sqf @@ -97,12 +97,13 @@ private _selected = if (_right) then { _panel lbData _curSel }; -private _mode = 0 max lbCurSel _sortControl; -private _statement = _sorts select _mode select 2; +private _sortName = _sortControl lbData (0 max lbCurSel _sortControl); +private _sortConfig = _sorts select (0 max (_sorts findIf {(_x select 0) isEqualTo _sortName})); +private _statement = _sortConfig select 2; missionNamespace setVariable [ [QGVAR(lastSortLeft), QGVAR(lastSortRight)] select _rightSort, - _sorts select _mode select 1 + _sortConfig select 1 ]; private _for = if (_right) then { @@ -117,8 +118,13 @@ _for do { } else { _panel lbData _i }; + private _quantity = if (_right) then { + parseNumber (_panel lnbText [_i, 2]) + } else { + 0 + }; private _itemCfg = _cfgClass >> _item; - private _value = _itemCfg call _statement; + private _value = [_itemCfg, _item, _quantity] call _statement; if (_value isEqualType 0) then { _value = [_value, 8] call CBA_fnc_formatNumber; }; diff --git a/addons/arsenal/functions/fnc_sortStatement_amount.sqf b/addons/arsenal/functions/fnc_sortStatement_amount.sqf new file mode 100644 index 0000000000..f4e4539d99 --- /dev/null +++ b/addons/arsenal/functions/fnc_sortStatement_amount.sqf @@ -0,0 +1,19 @@ +#include "script_component.hpp" +/* + * Author: SynixeBrett + * Statement to sort items by the amount in inventory. + * + * Arguments: + * 0: Item Config + * 1: Item Name + * 2: Quantity + * + * Return Value: + * Sorting Value + * + * Public: No +*/ + +params ["", "", "_quantity"]; + +10000 - _quantity From ff2136c98f9d4822b689e5b1e6e1938aa0ed5296 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 2 Nov 2020 21:42:48 -0600 Subject: [PATCH 020/335] Update fnc_fillSort.sqf (#7981) --- addons/arsenal/functions/fnc_fillSort.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/arsenal/functions/fnc_fillSort.sqf b/addons/arsenal/functions/fnc_fillSort.sqf index 1f27fd879d..6c1cf8e131 100644 --- a/addons/arsenal/functions/fnc_fillSort.sqf +++ b/addons/arsenal/functions/fnc_fillSort.sqf @@ -90,7 +90,7 @@ private _sortIndex = 0; { if (_x isEqualTo []) exitWith {}; - _x params ["_sortName", "_displayName", "", "_condition"] + _x params ["_sortName", "_displayName", "", "_condition"]; if ([_right] call _condition) then { private _index = _sortCtrl lbAdd _displayName; _sortCtrl lbSetData [_index, _sortName]; From af2973a9f0b15c74eb3ecf6e4f85667fcd129870 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Tue, 3 Nov 2020 04:43:49 +0100 Subject: [PATCH 021/335] Fix spare wheels receiving fall damage (#7978) --- addons/repair/CfgVehicles.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index cb9183ba0e..9ed723e66a 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -377,13 +377,14 @@ class CfgVehicles { // can not take damage individually though, because of limitations of the thingX simulation type class HitPoints { class HitBody { - armor = 0.6; + armor = 1; material = -1; name = "mat_rim"; visual = "mat_rim"; passThrough = 1; radius = 0.1; explosionShielding = 1; + minimalHit = 1; }; }; From 12ad406fa378274c73a2f689ba18a83ac180db63 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 2 Nov 2020 23:01:40 -0600 Subject: [PATCH 022/335] Prep 3.13.5 Build 56 --- README.md | 2 +- addons/main/script_version.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 90a469dc27..21c9e3cf9d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Issues diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 2719f4d842..0d800d28a7 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 13 -#define PATCHLVL 4 -#define BUILD 55 +#define PATCHLVL 5 +#define BUILD 56 From ae13438ce2c840ccd39e071764b2d3d75561e3c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Dahlgren?= Date: Wed, 4 Nov 2020 19:57:04 +0100 Subject: [PATCH 023/335] Add Dahlgren to maintainers (#7985) --- AUTHORS.txt | 1 + docs/team.md | 1 + 2 files changed, 2 insertions(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index e8d1b9affb..4781fdb531 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -9,6 +9,7 @@ Brandon (TCVM) bux578 commy2 +Dahlgren esteldunedain Felix Wiegand Garth "L-H" de Wet diff --git a/docs/team.md b/docs/team.md index 3846f7e1fe..345fe1b126 100644 --- a/docs/team.md +++ b/docs/team.md @@ -61,6 +61,7 @@ This lists all the maintainers responsible for project management and the overal - [mharis001](https://github.com/mharis001){:target="_blank"} - [Brandon (TCVM)](https://github.com/TheCandianVendingMachine){:target="_blank"} - [veteran29](https://github.com/veteran29){:target="_blank"} +- [Dahlgren](https://github.com/Dahlgren){:target="_blank"} ## Contributors From 0a27a275d1d41d3ca4e052eef0eb46d6f8e4e344 Mon Sep 17 00:00:00 2001 From: Kyle Mckay <5459452+kymckay@users.noreply.github.com> Date: Wed, 4 Nov 2020 23:22:51 +0000 Subject: [PATCH 024/335] Update my GitHub link (#7991) --- docs/team.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team.md b/docs/team.md index 345fe1b126..5ea6fb7264 100644 --- a/docs/team.md +++ b/docs/team.md @@ -38,7 +38,7 @@ This lists all the maintainers responsible for project management and the overal - Coding, Performance, SME - [jokoho48](https://github.com/jokoho48){:target="_blank"} - Scripting, Model Editing / Import -- [SilentSpike](https://github.com/SilentSpike){:target="_blank"} +- [SilentSpike](https://github.com/kymckay){:target="_blank"} - Scripting, Config - [Ruthberg](https://github.com/ulteq){:target="_blank"} - Scripting, Config From bc7194942f7a09a32e21a7b3c9311e973ba3dbc0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 5 Nov 2020 11:42:41 -0600 Subject: [PATCH 025/335] Update fnc_sortStatement_protection.sqf (#7989) --- addons/arsenal/functions/fnc_sortStatement_protection.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/arsenal/functions/fnc_sortStatement_protection.sqf b/addons/arsenal/functions/fnc_sortStatement_protection.sqf index 4ab0509e42..463c75e03d 100644 --- a/addons/arsenal/functions/fnc_sortStatement_protection.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_protection.sqf @@ -14,7 +14,8 @@ * Public: No */ -params ["_itemCfg", "_ballisticCo", "_explosiveCo"]; +params ["_itemInfo", "_ballisticCo", "_explosiveCo"]; +_itemInfo params ["_itemCfg"]; (([[_itemCfg], ["passthrough", "armor"]] call BIS_fnc_configExtremes) select 1) params [["_passthroughMax", 0], ["_armorMax", 0]]; From 712a27788fbdafb45a1308dee4eff0463f1fc2f6 Mon Sep 17 00:00:00 2001 From: Elgin675 Date: Sat, 7 Nov 2020 16:35:40 +0100 Subject: [PATCH 026/335] Translations - Update / Fix French Translations (Medical Treatment) (#7988) * Translations - Fix French "TreatmentTime" keys. * Translations - Add French "TreatmentTime" keys. * Translations - Fix some french keys (medical_treatment). * Translation - Add french "Treatment_WoundStitchTime" and "AllowBodyBagUnconscious "keys * Translations - Fix french "Medical_Treatment_AllowSelfStitch_DisplayName" key * Fix french "Medical_Treatment_MedicIV_Description" key * Fix french "Medical_Treatment_AllowSelfIV_DisplayName" key --- addons/medical_treatment/stringtable.xml | 46 ++++++++++++++---------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 1c59c6ba81..8af257fa42 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -240,48 +240,50 @@ Autoinjector Treatment Time + Durée d'interaction - Auto-injecteurs Time, in seconds, required to administer medication using an autoinjector. + Définit le temps nécessaire à l'administration d'une substance auto-injectable (en secondes). Tourniquet Treatment Time - Temps de traitement du tourniquet + Durée d'interaction - Garrots Tourniquet-Behandlungszeit Time, in seconds, required to apply/remove a tourniquet. - Temps en secondes nécessaire pour appliquer un garrot. + Définit le temps nécessaire à l'application ou au retrait d'un garrot (en secondes). Zeit in Sekunden, die benötigt wird, um ein Tourniquet anzuwenden. IV Bag Treatment Time - Temps de traitement du sac IV + Durée d'interaction - IVs IV Beutelbehandlungszeit Time, in seconds, required to administer an IV bag. - Temps en secondes nécessaire pour appliquer un sac IV. + Définit le temps nécessaire à la pose d'une perfusion IV (en secondes). Zeit in Sekunden, die benötigt wird, um einen Infusionsbeutel aufzutragen. Splint Treatment Time - Temps de traitement de l'attelle + Durée d'interaction - Attelles Schienenbehandlungszeit Time, in seconds, required to apply a splint. - Temps en secondes nécessaire pour appliquer une attelle. + Définit le temps nécessaire à l'application d'une attelle (en secondes). Zeit in Sekunden, die zum Anbringen einer Schiene benötigt wird. Body Bag Use Time - Temps d'utilisation du sac mortuaire + Durée d'interaction - Housses mortuaires Anwendungszeit für Leichensack Time, in seconds, required to put a patient in a body bag. - Temps en secondes qu'il faut pour appliquer un sac mortuaire. + Définit le temps nécessaire à la mise en housse d'un corps (en secondes). Zeit in Sekunden, die benötigt wird, um einen Leichensack aufzutragen. @@ -303,7 +305,7 @@ Training level required to use epinephrine. アドレナリンの使用に訓練レベルを必要とさせます。 - Définit quelle qualification médicale est requise pour pouvoir utiliser l'épinéphrine. + Définit la qualification médicale requise pour utiliser l'épinéphrine. Уровень подготовки, необходимый для использования Адреналина. É necessária uma qualificação médica para usar epinefrina. 要受過何種程度的醫療訓練才可以使用腎上腺素 @@ -332,7 +334,7 @@ Controls where epinephrine can be used. アドレナリンが使える場所を決定します。 - Définit où l'épinéphrine peut être utilisée. + Définit les lieux où l'usage d'épinéphrine est autorisé. Контролирует, где можно использовать Адреналин. Controla onde Epinefrina pode ser utilizada. 控制何處能使用腎上腺素 @@ -362,7 +364,7 @@ Training level required to use a PAK. 応急処置キットの使用に訓練レベルを必要とさせます。 - Définit quelle qualification médicale est requise pour pouvoir utiliser la trousse sanitaire. + Définit la qualification médicale requise pour utiliser la trousse sanitaire. Уровень подготовки, необходимый для использования Аптечки. É necessária uma qualificação médica para usar KPS 要受過何種程度的醫療訓練才可以使用個人急救包 @@ -392,7 +394,7 @@ Controls where a PAK can be used. 応急処置キットが使える場所を決定します。 - Définit où la trousse sanitaire peut être utilisée. + Définit les lieux où l'usage de la trousse sanitaire est autorisé. Контролирует, где можно использовать Аптечку. Controla onde o KPS pode ser utilizado. 控制何處能使用個人急救包 @@ -494,7 +496,7 @@ Training level required to use a surgical kit. 縫合キットの使用に訓練レベルを必要とさせます。 - Définit quelle qualification médicale est requise pour pouvoir utiliser une trousse chirurgicale. + Définit la qualification médicale requise pour utiliser la trousse chirurgicale. Уровень медицинской подготовки, необходимый для использования Хирургического набора. É necessária uma qualificação médica para usar Kit Cirúrgico 要受過多少程度的醫療訓練才能使用手術包。 @@ -520,7 +522,7 @@ Controls where a surgical kit can be used. 縫合キットが使える場所を決定します。 - Définit où la trousse chirurgicale peut être utilisée. + Définit les lieux où l'usage de la trousse chirurgicale est autorisé. Контролирует, где можно использовать Хирургический набор Controle onde o Kit Cirúrgico pode ser utilizado. 控制何處能使用手術包 @@ -556,7 +558,7 @@ Self Stitching - Suturer soi-même + Réaliser des sutures sur soi-même Auto-Cirurgia 自己縫合 自我縫合 @@ -580,16 +582,18 @@ Wound Stitch Time + Durée d'interaction - Sutures Time, in seconds, required to stitch a single wound. + Définit le temps nécessaire à la suture d'une plaie (en secondes). Self IV Transfusion Eigennutzung von Bluttransfusionen Внутривенное переливание на себе 自己 IV 輸血 - Autotransfusion d'IV + Pose d'IV sur soi-même Autotransfusão de IV 自我注射點滴 Samoaplikace IV transfuze @@ -601,7 +605,7 @@ Erlaube Bluttransfusionen an sich selbst zu benutzen Позволяет использовать внутривенные переливания на себе 自らに対して IV 輸血を可能にします。 - Permet de poser des IV sur soi-même. + Active la possibilité de s'auto-poser des IVs. Permite utilizar bolsas de IV para transfusão em si mesmo 啟用是否能對自己注射點滴 Umožňuje aplikovat IV transfuze na sama sebe. @@ -610,15 +614,17 @@ Allow Unconscious Body Bag + Housse mortuaire - Autoriser patients inconscients Enables placing an unconscious patient in a body bag. + Active la possibilité de placer des patients inconscients dans les housses mortuaires.\nAttention : le cas échéant cela provoquera la mort du patient. Allow IV Transfusion Erlaube Bluttransfusionen Zezwalaj na przetaczanie płynów IV - Pose de perfusion autorisée pour + Pose de perfusions autorisée pour 允許操作點滴 IV 輸血の制限 Povolit IV transfuzi @@ -628,7 +634,7 @@ Training level required to transfuse IVs. 'Fähigkeiten-Level', das benötigt wird, um Blut zu transfundieren. Poziom wyszkolenia potrzebny aby móc przetaczać płyny IV. - Définit quelle qualification médicale est requise pour pouvoir poser des perfusions intraveineuses. + Définit la qualification médicale requise pour poser des perfusions intraveineuses. 要有何種醫療水準才可注射點滴。 IV 輸血を行うのに訓練済レベルを要求とします。 Úroveň výcviku nutná pro IV transfuzi. @@ -844,9 +850,11 @@ CPR Treatment Time + Durée d'interaction - RCP Time, in seconds, required to perform CPR on a patient. + Définit le temps nécessaire à la mise en œuvre d'une RCP (en secondes). Holster Required From 95d4dc811bc4ec7c5abb9cb02d13fd6e5ee59568 Mon Sep 17 00:00:00 2001 From: Elgin675 Date: Sat, 7 Nov 2020 16:36:12 +0100 Subject: [PATCH 027/335] Translations - Update French Translations (Arsenal, Markers and Medical GUI) (#7987) * Translation - Add french "Arsenal_sortByProtection" keys * Translation - Add french "Markers_Timestamp" keys * Translation - Add french "Medical_GUI_InteractionMenuShowTriage" keys --- addons/arsenal/stringtable.xml | 2 ++ addons/markers/stringtable.xml | 14 ++++++++++++++ addons/medical_gui/stringtable.xml | 2 ++ 3 files changed, 18 insertions(+) diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index 2585abc530..ebb9d7a5c8 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -418,9 +418,11 @@ Sort by ballistic protection + Trier par protection balistique Sort by explosive protection + Trier par résistance aux explosifs Share or stop sharing the selected loadout diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index 1fb27d8a1d..3b0fed2a04 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -152,45 +152,59 @@ Allow Timestamps + Permettre l'horodatage Whether to allow timestamps to be automatically applied to markers + Active une interface permettant d'apposer un horodatage sur les marqueurs. Add Timestamp: + Ajouter l'horodatage Watch Required + Une montre est requise. Timestamp Format + Horodatage - Format Changes the timestamp format + Modifie le format de l'horodatage. "HH" - Hour + "HH" - Heures "MM" - Minute + "MM" - Minutes "SS" - Seconds + "SS" - Secondes "MM" - Milliseconds + "MS" - Millisecondes Timestamp Hour Format + Horodatage - Système horaire 24-Hour Clock + Format 24 heures 12-Hour Clock + Format 12 heures Changes timestamp to use either 24-hour or 12-hour clock format + Permet de choisir le système d'horodatage souhaité, au format 12 ou 24 heures. diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml index a081b31695..709b03fc25 100644 --- a/addons/medical_gui/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -191,9 +191,11 @@ Show Triage Level in Interaction Menu + Couleur de triage dans le menu d'interaction Shows the patient's triage level by changing the color of the main and medical menu actions. + Modifie la couleur du menu d'interactions et du sous-menu médical en fonction de la fiche de triage du patient. Medical From 5d1aa28419a409eaf9f7a13ecac93f18a94b2b74 Mon Sep 17 00:00:00 2001 From: Elgin675 Date: Sun, 8 Nov 2020 00:08:01 +0100 Subject: [PATCH 028/335] Translations - Add French "Medical_Treatment_bodybagWhileStillAlive" key (#7993) --- addons/medical_treatment/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 8af257fa42..514a4795e6 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -4306,6 +4306,7 @@ The body twitched and may not be dead! + L'unité a bougé et n'est peut-être pas morte ! From 119450f4e9269190d8706305c1efd5b6d4f94926 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Sun, 8 Nov 2020 15:54:14 +0100 Subject: [PATCH 029/335] DAGR / Interaction Menu / Repair - Fix overwriting globals (#7990) * Remove global DAGR_NEXT variable * Remove global ERR variable * Fix overwriting global this variable * Fix overwriting global total and hitpoint variables * fix condition Co-authored-by: PabstMirror --- addons/dagr/Dialog.hpp | 1 - addons/dagr/functions/fnc_menuInit.sqf | 1 - .../functions/fnc_disarmDropItems.sqf | 1 - addons/interact_menu/functions/fnc_keyUp.sqf | 10 ++++++-- addons/interact_menu/functions/fnc_render.sqf | 8 ++++++- .../fnc_userActions_getHouseActions.sqf | 23 +++++++++++++++++-- .../functions/fnc_normalizeHitPoints.sqf | 11 +++++++-- 7 files changed, 45 insertions(+), 10 deletions(-) diff --git a/addons/dagr/Dialog.hpp b/addons/dagr/Dialog.hpp index 52e3a8f683..51b6c988b6 100644 --- a/addons/dagr/Dialog.hpp +++ b/addons/dagr/Dialog.hpp @@ -201,7 +201,6 @@ class DAGR_Menu { class DAGR_NEXT_Button : DAGR_Button { idc = 266868; - action = QUOTE(DAGR_NEXT = true); x = 0.60; y = 0.65; }; diff --git a/addons/dagr/functions/fnc_menuInit.sqf b/addons/dagr/functions/fnc_menuInit.sqf index c535ac1349..498d6614d4 100644 --- a/addons/dagr/functions/fnc_menuInit.sqf +++ b/addons/dagr/functions/fnc_menuInit.sqf @@ -596,7 +596,6 @@ GVAR(menuRun) = true; GVAR(F1) = false; GVAR(MENU_B) = false; GVAR(SEL) = false; - DAGR_NEXT = false; GVAR(RIGHT) = false; GVAR(LEFT) = false; GVAR(UP) = false; diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf index 4c8fb3bf2d..f46c06b280 100644 --- a/addons/disarming/functions/fnc_disarmDropItems.sqf +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -92,7 +92,6 @@ if (({((_x select 0) in _listOfItemsToRemove) && {(getNumber (configFile >> "Cfg }; //Verify holder has mags unit had if (!([_targetMagazinesStart, _targetMagazinesEnd, _holderMagazinesStart, _holderMagazinesEnd] call FUNC(verifyMagazinesMoved))) then { - ERR = [_targetMagazinesStart, _targetMagazinesEnd, _holderMagazinesStart, _holderMagazinesEnd]; _holder setVariable [QGVAR(holderInUse), false]; [_caller, _target, "Debug: Crate Magazines not in holder"] call FUNC(eventTargetFinish); }; diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 2504ca2b78..9ed14d66d3 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -25,8 +25,6 @@ if (uiNamespace getVariable [QGVAR(cursorMenuOpened),false]) then { }; if (GVAR(actionSelected)) then { - this = GVAR(selectedTarget); - private _player = ACE_Player; private _target = GVAR(selectedTarget); @@ -38,6 +36,11 @@ if (GVAR(actionSelected)) then { // Check the action conditions private _actionData = GVAR(selectedAction) select 0; + + // Use global variable this for action condition and action code + private _savedThis = this; + this = GVAR(selectedTarget); + if ([_target, _player, _actionData select 6] call (_actionData select 4)) then { // Call the statement [_target, _player, _actionData select 6] call (_actionData select 3); @@ -45,6 +48,9 @@ if (GVAR(actionSelected)) then { // Clear the conditions caches again if the action was performed [QGVAR(clearConditionCaches), []] call CBA_fnc_localEvent; }; + + // Restore this variable + this = _savedThis; }; ["ace_interactMenuClosed", [GVAR(openedMenuType)]] call CBA_fnc_localEvent; diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 687498e7cd..36e86cd9b3 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -91,13 +91,16 @@ if (GVAR(openedMenuType) >= 0) then { }; }; if (_runOnHover) then { - this = GVAR(selectedTarget); private _player = ACE_Player; private _target = GVAR(selectedTarget); // Clear the conditions caches [QGVAR(clearConditionCaches), []] call CBA_fnc_localEvent; + // Use global variable this for action condition and action code + private _savedThis = this; + this = GVAR(selectedTarget); + // Check the action conditions private _actionData = GVAR(selectedAction) select 0; if ([_target, _player, _actionData select 6] call (_actionData select 4)) then { @@ -107,6 +110,9 @@ if (GVAR(openedMenuType) >= 0) then { // Clear the conditions caches again if the action was performed [QGVAR(clearConditionCaches), []] call CBA_fnc_localEvent; }; + + // Restore this variable + this = _savedThis; }; }; }; diff --git a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf index 46667857f5..0d02b6a6c1 100644 --- a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf @@ -41,15 +41,34 @@ private _fnc_getMemPointOffset = { private _fnc_userAction_Statement = { params ["_target", "_player", "_variable"]; _variable params ["_actionStatement", "_actionCondition"]; + + // Use global variable this for action condition and action code + private _savedThis = this; this = _target getVariable [QGVAR(building), objNull]; + call _actionStatement; + + // Restore this variable + this = _savedThis; }; + private _fnc_userAction_Condition = { params ["_target", "_player", "_variable"]; _variable params ["_actionStatement", "_actionCondition"]; + + private _building = _target getVariable [QGVAR(building), objNull]; + if (isNull _building) exitWith {false}; + + // Use global variable this for action condition and action code + private _savedThis = this; this = _target getVariable [QGVAR(building), objNull]; - if (isNull this) exitWith {false}; - call _actionCondition; + + private _result = call _actionCondition; + + // Restore this variable + this = _savedThis; + + _result }; private _configPath = configFile >> "CfgVehicles" >> _typeOfBuilding >> "UserActions"; diff --git a/addons/repair/functions/fnc_normalizeHitPoints.sqf b/addons/repair/functions/fnc_normalizeHitPoints.sqf index fb07147a6a..5a33151875 100644 --- a/addons/repair/functions/fnc_normalizeHitPoints.sqf +++ b/addons/repair/functions/fnc_normalizeHitPoints.sqf @@ -46,9 +46,11 @@ TRACE_2("",_realHitPoints,_dependentHitPoints); if (_dependentHitPoints isEqualTo []) exitWith {}; -// Define global variables -Total = damage _vehicle; +// Define global variables and save original values +private _savedGlobals = [["total", total]]; +total = damage _vehicle; { + _savedGlobals pushBack [_x, missionNamespace getVariable _x]; missionNamespace setVariable [_x, _vehicle getHitPointDamage _x]; } forEach _realHitPoints; @@ -58,3 +60,8 @@ Total = damage _vehicle; TRACE_2("setting depend hitpoint", _x, _damage); _vehicle setHitPointDamage [_x, _damage]; } forEach _dependentHitPoints; + +// Restore global variables +{ + missionNamespace setVariable _x; +} forEach _savedGlobals; From 0e642758d6d3b93ff0ee4f5b97a374165dc2e25b Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Sun, 8 Nov 2020 23:24:44 +0100 Subject: [PATCH 030/335] Medical Statemachine - Add setting to disallow bleedout in cardiac arrest (#7547) * Add setting to disable bleedout in cardiac arrest * Improve setting name and description --- addons/medical_statemachine/Statemachine.hpp | 1 + addons/medical_statemachine/initSettings.sqf | 9 +++++++++ addons/medical_statemachine/stringtable.xml | 11 ++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/addons/medical_statemachine/Statemachine.hpp b/addons/medical_statemachine/Statemachine.hpp index 17a4baaf07..2aaba197e2 100644 --- a/addons/medical_statemachine/Statemachine.hpp +++ b/addons/medical_statemachine/Statemachine.hpp @@ -103,6 +103,7 @@ class ACE_Medical_StateMachine { }; class Bleedout { targetState = "Dead"; + condition = QGVAR(cardiacArrestBleedoutEnabled); events[] = {QEGVAR(medical,Bleedout)}; }; }; diff --git a/addons/medical_statemachine/initSettings.sqf b/addons/medical_statemachine/initSettings.sqf index df66002ff9..75d93f19b2 100644 --- a/addons/medical_statemachine/initSettings.sqf +++ b/addons/medical_statemachine/initSettings.sqf @@ -41,3 +41,12 @@ [1, 3600, 300], true ] call CBA_settings_fnc_init; + +[ + QGVAR(cardiacArrestBleedoutEnabled), + "CHECKBOX", + [LSTRING(CardiacArrestBleedout_DisplayName), LSTRING(CardiacArrestBleedout_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory)], + true, + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml index 6952f16dd5..58efa9bb1d 100644 --- a/addons/medical_statemachine/stringtable.xml +++ b/addons/medical_statemachine/stringtable.xml @@ -98,7 +98,7 @@ Cardiac Arrest Time - Zeit bis zum Herzstillstand + Überlebenszeit im Herzstillstand 心停止時間 Длительность остановки сердца Durée de l'arrêt cardiaque @@ -119,6 +119,7 @@ Controlla quanto tempo ci vuole per morire di arresto cardiaco. Nastavuje po jak dlouhé době pacient zemře kvůli srdeční zástavě. Definiuje czas potrzebny na śmierć z powodu zatrzymania akcji serca. + Bestimmt die Dauer bis zum Tod durch Herzstillstand. Ne kadar süre de kalbi durarak ölmesini belirleyin. @@ -134,5 +135,13 @@ Zatrzymanie Akcji Serca Kalbi Durdu + + Bleedout During Cardiac Arrest + Ausbluten im Herzstillstand + + + Controls whether a person can die in cardiac arrest by blood loss before the cardiac arrest time runs out. + Legt fest, ob man während des Herzstillstands durch Blutverlust sterben kann, auch wenn die Überlebenszeit im Herzstillstand noch nicht ausgelaufen ist. + From 718d28226331d03a5917ea9080cc942f879fe419 Mon Sep 17 00:00:00 2001 From: Laid3acK Date: Sun, 8 Nov 2020 23:26:30 +0100 Subject: [PATCH 031/335] Ballistics - Update the B 556x45 dual (#7982) * B_556x45_dual * B_556x45_dual --- addons/ballistics/CfgAmmo.hpp | 8 ++++++++ addons/scopes/CfgWeapons.hpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 20e9af803b..8ad1b4729a 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -130,6 +130,14 @@ class CfgAmmo { ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; ACE_barrelLengths[]={210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; }; + + class B_556x45_dual: B_556x45_Ball { + airFriction = -0.00055; + ACE_ammoTempMuzzleVelocityShifts[] = {-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_muzzleVelocities[] = {268}; // at 21°C, at 15°C 267 m/s according with the 20Rnd_556x45_UW_mag initSpeed + ACE_barrelLengths[] = {457.2}; // according with the SDAR barrel length: https://en.wikipedia.org/wiki/Kel-Tec_RFB + }; + class ACE_556x45_Ball_Mk262 : B_556x45_Ball { airFriction=-0.00111805; ACE_caliber=5.69; diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index b521b541eb..653742180f 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -340,7 +340,7 @@ class CfgWeapons { class arifle_SDAR_F: SDAR_base_F { ACE_RailHeightAboveBore = 0; - ACE_IronSightBaseAngle = -0.037242; + ACE_IronSightBaseAngle = -0.042972; }; class SMG_01_Base: Rifle_Short_Base_F { From d27122fa16c66f3166656785c0f56324953d513b Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Sun, 8 Nov 2020 23:27:10 +0100 Subject: [PATCH 032/335] Medical Status - Fix unconscious AI aiming at enemies (#7977) * Fix unconscious AI aiming at enemies * Improve handling when locality changes Co-authored-by: PabstMirror Co-authored-by: PabstMirror --- .../functions/fnc_setUnconsciousState.sqf | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/addons/medical_status/functions/fnc_setUnconsciousState.sqf b/addons/medical_status/functions/fnc_setUnconsciousState.sqf index 715041d701..6508e2fb1c 100644 --- a/addons/medical_status/functions/fnc_setUnconsciousState.sqf +++ b/addons/medical_status/functions/fnc_setUnconsciousState.sqf @@ -52,9 +52,20 @@ if (_active) then { // Do "Unlock controls" user action, co-pilot will then have to do the "Take Controls" actions _unit action ["UnlockVehicleControl", vehicle _unit]; }; + + // Disable AI aiming + if (!isPlayer _unit && {_unit checkAIFeature "WEAPONAIM"}) then { + _unit disableAI "WEAPONAIM"; + _unit setVariable [QGVAR(reenableWeaponAim), true, true]; + }; } else { // Unit has woken up, no longer need to track this _unit setVariable [QEGVAR(medical,lastWakeUpCheck), nil]; + + // Reenable AI aiming + if (_unit getVariable [QGVAR(reenableWeaponAim), false]) then { + _unit enableAI "WEAPONAIM"; + }; }; // This event doesn't correspond to unconscious in statemachine From 0c84cdd3755eaae80e337e6f981c0c16851ea9ab Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Sun, 8 Nov 2020 23:32:02 +0100 Subject: [PATCH 033/335] Fix unconscious medics not being healed by other AI medics (#7995) --- addons/medical_ai/functions/fnc_canRequestMedic.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/medical_ai/functions/fnc_canRequestMedic.sqf b/addons/medical_ai/functions/fnc_canRequestMedic.sqf index c2a29c1c9f..135c345750 100644 --- a/addons/medical_ai/functions/fnc_canRequestMedic.sqf +++ b/addons/medical_ai/functions/fnc_canRequestMedic.sqf @@ -19,7 +19,8 @@ // we ignore this here. We need to "notice" the medic that he should // treat other units, or else he won't do anything on his own. -if ([_this] call EFUNC(medical_treatment,isMedic) || {vehicle _this != _this}) exitWith {false}; +private _isMedic = [_this] call EFUNC(medical_treatment,isMedic); +if (_isMedic && {!IS_UNCONSCIOUS(_this)} || {vehicle _this != _this}) exitWith {false}; // Search for a medic, prioritize unitReady private _medic = objNull; From 1efa25fe2b1594434acf66c3aa38240144c87fe9 Mon Sep 17 00:00:00 2001 From: Dedmen Miller Date: Mon, 9 Nov 2020 00:26:02 +0100 Subject: [PATCH 034/335] Explosives - Add `clackerAdded` event (#7994) * Add clackerPlaced event * Update docs/wiki/framework/events-framework.md Co-authored-by: PabstMirror --- addons/explosives/functions/fnc_addClacker.sqf | 2 ++ docs/wiki/framework/events-framework.md | 1 + 2 files changed, 3 insertions(+) diff --git a/addons/explosives/functions/fnc_addClacker.sqf b/addons/explosives/functions/fnc_addClacker.sqf index 684161d7ee..6b48980d54 100644 --- a/addons/explosives/functions/fnc_addClacker.sqf +++ b/addons/explosives/functions/fnc_addClacker.sqf @@ -46,3 +46,5 @@ _unit setVariable [QGVAR(Clackers), _clacker, true]; //display clacker code message: [format [localize LSTRING(DetonateCode), GVAR(PlacedCount)]] call EFUNC(common,displayTextStructured); + +[QGVAR(clackerAdded), [_unit, _explosive, GVAR(PlacedCount)]] call CBA_fnc_localEvent; diff --git a/docs/wiki/framework/events-framework.md b/docs/wiki/framework/events-framework.md index 30feada6cf..d1cc6d01d0 100644 --- a/docs/wiki/framework/events-framework.md +++ b/docs/wiki/framework/events-framework.md @@ -82,6 +82,7 @@ MenuType: 0 = Interaction, 1 = Self Interaction | Event Key | Parameters | Locality | Type | Description | |----------|---------|---------|---------|---------|---------| |`ace_tripflareTriggered` | [_flareObject, [_posX, _posY, _posZ]] | Global | Listen | Tripflare triggered +|`ace_explosives_clackerAdded` | [_unit, _explosive, _id] | Local | Listen | Clacker added to explosive ### 2.9 Logistics Wirecutter (`ace_logistics`) From 92cd36776562d25bbf3bb214cd4b50d22b27cf32 Mon Sep 17 00:00:00 2001 From: Elgin675 Date: Mon, 9 Nov 2020 00:46:13 +0100 Subject: [PATCH 035/335] Translations - Add French "Medical_Statemachine_CardiacArrestBleedout" keys (#7997) --- addons/medical_statemachine/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml index 58efa9bb1d..31a91d1413 100644 --- a/addons/medical_statemachine/stringtable.xml +++ b/addons/medical_statemachine/stringtable.xml @@ -138,10 +138,12 @@ Bleedout During Cardiac Arrest Ausbluten im Herzstillstand + Saignement durant l'arrêt cardiaque Controls whether a person can die in cardiac arrest by blood loss before the cardiac arrest time runs out. Legt fest, ob man während des Herzstillstands durch Blutverlust sterben kann, auch wenn die Überlebenszeit im Herzstillstand noch nicht ausgelaufen ist. + Définit si un joueur en arrêt cardiaque peut mourir par exsanguination, avant que la durée de l'arrêt cardiaque définie ci-dessus ne soit écoulée. From a621d2eb72e82a2246f339da19b6317600a55a95 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 10 Nov 2020 10:06:45 -0600 Subject: [PATCH 036/335] Medical Statemachine - Ensure bleedout condition string is code (#7998) --- addons/medical_statemachine/Statemachine.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_statemachine/Statemachine.hpp b/addons/medical_statemachine/Statemachine.hpp index 2aaba197e2..eecb6a236c 100644 --- a/addons/medical_statemachine/Statemachine.hpp +++ b/addons/medical_statemachine/Statemachine.hpp @@ -103,7 +103,7 @@ class ACE_Medical_StateMachine { }; class Bleedout { targetState = "Dead"; - condition = QGVAR(cardiacArrestBleedoutEnabled); + condition = QUOTE((GVAR(cardiacArrestBleedoutEnabled))); // wrap to ensure cba uses this as code and not a direct variable events[] = {QEGVAR(medical,Bleedout)}; }; }; From 629942885e111d99f054ec3e247b8454876b58b0 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Tue, 10 Nov 2020 17:07:42 +0100 Subject: [PATCH 037/335] Fix players occasionally being invincible after respawning (#7999) --- .../medical_statemachine/functions/fnc_resetStateDefault.sqf | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf index 4cffd47076..b29adcb9f4 100644 --- a/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf +++ b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf @@ -17,7 +17,4 @@ params ["_unit"]; -// Statemachine only handles local units -if !(local _unit) exitWith {}; - [_unit, EGVAR(medical,STATE_MACHINE), "Dead", "Default"] call CBA_statemachine_fnc_manualTransition; From ad75c7c9b82cee25ece78de93ab59fb2dffd9e82 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Sun, 15 Nov 2020 19:57:27 +0100 Subject: [PATCH 038/335] Common / Medical - Fix loading patients into turret only seats (#7980) * Fix loading patients into turret only seats * Fix cargo logic, adjust function for captives (#8000) Co-authored-by: PabstMirror --- .../functions/fnc_addLoadCaptiveActions.sqf | 2 +- .../captives/functions/fnc_canLoadCaptive.sqf | 2 +- .../captives/functions/fnc_doLoadCaptive.sqf | 2 +- .../common/functions/fnc_loadPersonLocal.sqf | 23 +++++++++++++++++-- .../functions/fnc_nearestVehiclesFreeSeat.sqf | 17 ++++++++++---- .../functions/fnc_unloadPersonLocal.sqf | 10 ++++++++ 6 files changed, 46 insertions(+), 10 deletions(-) diff --git a/addons/captives/functions/fnc_addLoadCaptiveActions.sqf b/addons/captives/functions/fnc_addLoadCaptiveActions.sqf index d1ad8f603d..279ca0924e 100644 --- a/addons/captives/functions/fnc_addLoadCaptiveActions.sqf +++ b/addons/captives/functions/fnc_addLoadCaptiveActions.sqf @@ -22,4 +22,4 @@ private _statement = { [_player, _target, _vehicle] call FUNC(doLoadCaptive); }; -[_target call EFUNC(common,nearestVehiclesFreeSeat), _statement, _target] call EFUNC(interact_menu,createVehiclesActions) +[[_target, nil, true] call EFUNC(common,nearestVehiclesFreeSeat), _statement, _target] call EFUNC(interact_menu,createVehiclesActions) diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index 2129b36f5a..b1757884b7 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -34,7 +34,7 @@ if (isNull _target || {(vehicle _target) != _target} || {!(_target getVariable [ if (isNull _vehicle) then { // Looking at a captive unit, get nearest vehicle with valid seat: - _vehicle = (_target call EFUNC(common,nearestVehiclesFreeSeat)) param [0, objNull]; + _vehicle = ([_target, nil, true] call EFUNC(common,nearestVehiclesFreeSeat)) param [0, objNull]; } else { // We have a vehicle picked, make sure it has empty seats: if (_vehicle emptyPositions "cargo" == 0 && {_vehicle emptyPositions "gunner" == 0}) then { diff --git a/addons/captives/functions/fnc_doLoadCaptive.sqf b/addons/captives/functions/fnc_doLoadCaptive.sqf index e4e3b5f45b..7740610b6a 100644 --- a/addons/captives/functions/fnc_doLoadCaptive.sqf +++ b/addons/captives/functions/fnc_doLoadCaptive.sqf @@ -31,7 +31,7 @@ if (isNull _target || {(vehicle _target) != _target} || {!(_target getVariable [ if (isNull _vehicle) then { // Looking at a captive unit, get nearest vehicle with valid seat: - _vehicle = (_target call EFUNC(common,nearestVehiclesFreeSeat)) param [0, objNull]; + _vehicle = ([_target, nil, true] call EFUNC(common,nearestVehiclesFreeSeat)) param [0, objNull]; } else { // We have a vehicle picked, make sure it has empty seats: if (_vehicle emptyPositions "cargo" == 0 && {_vehicle emptyPositions "gunner" == 0}) then { diff --git a/addons/common/functions/fnc_loadPersonLocal.sqf b/addons/common/functions/fnc_loadPersonLocal.sqf index 0426a94582..7135e9e302 100644 --- a/addons/common/functions/fnc_loadPersonLocal.sqf +++ b/addons/common/functions/fnc_loadPersonLocal.sqf @@ -21,11 +21,30 @@ params ["_unit", "_vehicle", ["_caller", objNull]]; TRACE_3("loadPersonLocal",_unit,_vehicle,_caller); private _slotsOpen = false; -if ((_vehicle emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false])} || {(getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "ejectDeadCargo")) == 0}) then { +if ((_vehicle emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false]) || {(getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "ejectDeadCargo")) == 0}}) then { _unit moveInCargo _vehicle; + TRACE_1("moveInCargo",_vehicle); _slotsOpen = true; } else { - if (_vehicle emptyPositions "gunner" > 0) then { + // Check if an empty turret is available + // This already excludes FFV seats, which count as cargo positions + private _turrets = fullCrew [_vehicle, "turret", true]; + private _index = _turrets findIf {isNull (_x#0)}; + if (_index >= 0) exitWith { + _unit moveInTurret [_vehicle, _turrets#_index#3]; + TRACE_2("moveInTurret",_vehicle,_turrets#_index#3); + _slotsOpen = true; + }; + + // Check if the commander seat is available + if (_vehicle emptyPositions "commander" > 0) exitWith { + _unit moveInCommander _vehicle; + TRACE_1("moveInCommander",_vehicle); + _slotsOpen = true; + }; + + // Lastly, check if the gunner seat is available + if (_vehicle emptyPositions "gunner" > 0) exitWith { _unit moveInGunner _vehicle; _slotsOpen = true; }; diff --git a/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf b/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf index aba75ff60f..83ed8ceb20 100644 --- a/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf +++ b/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf @@ -5,22 +5,29 @@ * * Arguments: * 0: Unit - * 1: Distance + * 1: Distance + * 2: Restriceted to cargo only * * Return Value: * Nearest vehicles with a free seat * * Example: - * [bob] call ace_common_fnc_nearestVehiclesFreeSeat + * [cursorObject] call ace_common_fnc_nearestVehiclesFreeSeat * * Public: Yes */ -params ["_unit", ["_distance", 10]]; +params ["_unit", ["_distance", 10], ["_cargoOnly", false]]; private _nearVehicles = nearestObjects [_unit, ["Car", "Air", "Tank", "Ship_F", "Pod_Heli_Transport_04_crewed_base_F"], _distance]; _nearVehicles select { // Filter cargo seats that will eject unconscious units (e.g. quad bike) - ((_x emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false])} || {(getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "ejectDeadCargo")) == 0}) - || {_x emptyPositions "gunner" > 0} + private _canSitInCargo = (!(_unit getVariable ['ACE_isUnconscious', false])) || {(getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "ejectDeadCargo")) == 0}; + ((fullCrew [_x, "", true]) findIf { + _x params ["_body", "_role", "_cargoIndex"]; + (isNull _body) // seat empty + && {_role != "DRIVER"} // not driver seat + && {_canSitInCargo || {_cargoIndex == -1}} // won't be ejected (uncon) + && {(!_cargoOnly) || {_cargoIndex != -1}} // not restricted (captive) + }) > -1 } diff --git a/addons/common/functions/fnc_unloadPersonLocal.sqf b/addons/common/functions/fnc_unloadPersonLocal.sqf index d51f911eaf..dd4480c1f9 100644 --- a/addons/common/functions/fnc_unloadPersonLocal.sqf +++ b/addons/common/functions/fnc_unloadPersonLocal.sqf @@ -49,6 +49,16 @@ unassignVehicle _unit; TRACE_1("Ejecting", alive _unit); _unit action ["Eject", vehicle _unit]; +// Failsafe - sometimes eject alone doesn't work, but moveOut does +[{ + params ["_unit"]; + + if (vehicle _unit != _unit) then { + WARNING_1("UnloadPersonLocal [%1] did not eject normally",_unit); + moveOut _unit; + }; +}, [_unit], 1] call CBA_fnc_waitAndExecute; + [{ params ["_unit", "_emptyPos"]; (alive _unit) && {(vehicle _unit) != _unit} From 109e12cc2be56a0ba1acd9c419428fb29dfceab6 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 16 Nov 2020 17:46:16 -0600 Subject: [PATCH 039/335] Prep 3.13.5 Build 57 --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 0d800d28a7..01da94555c 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 13 #define PATCHLVL 5 -#define BUILD 56 +#define BUILD 57 From b4e190971b0fb41c4dff6d6f480615883a5fa7fc Mon Sep 17 00:00:00 2001 From: Jo David Date: Fri, 20 Nov 2020 08:16:54 +0100 Subject: [PATCH 040/335] add issue template alteration warnings (#8007) --- .github/ISSUE_TEMPLATE/bug_report.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0ed30391a5..2dd93748a3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,23 +4,37 @@ about: Create a report to help us improve title: '' labels: kind/bug assignees: '' - --- + + **Mods (complete and add to the following information):** - **Arma 3:** `x.xx` [e.g. 1.00 stable, rc, dev] - **CBA:** `3.x.x` [e.g. 3.0.0 stable, commit hash] - **ACE3:** `3.x.x` [eg. 3.0.0 stable, commit hash] -_Make sure to reproduce the issue with only CBA and ACE3 on a newly created mission!_ + **Description:** A clear and concise description of what the bug is. **Steps to reproduce:** -- _Follow [https://ace3mod.com/img/wiki/user/issue_flowchart.png](this flowchart)!_ -- Go to ... -- Click ... -- See ... +_Follow [https://ace3mod.com/img/wiki/user/issue_flowchart.png](this flowchart)!_ + +1. _Go to ..._ +2. _Click ..._ +3. _See ..._ **Expected behavior:** A clear and concise description of what you expected to happen. From 137af792d20d8f7120d8c9823f81565cf173979b Mon Sep 17 00:00:00 2001 From: mharis001 <34453221+mharis001@users.noreply.github.com> Date: Tue, 24 Nov 2020 09:29:43 -0500 Subject: [PATCH 041/335] Arsenal - Fix sort by load (#8011) --- addons/arsenal/ACE_Arsenal_Sorts.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/arsenal/ACE_Arsenal_Sorts.hpp b/addons/arsenal/ACE_Arsenal_Sorts.hpp index ecdd1e68b2..22e618c1e4 100644 --- a/addons/arsenal/ACE_Arsenal_Sorts.hpp +++ b/addons/arsenal/ACE_Arsenal_Sorts.hpp @@ -40,7 +40,7 @@ class GVAR(sorts) { scope = 2; displayName = CSTRING(sortByLoadText); tabs[] = {{3,4,5}, {}}; - statement = QUOTE(getContainerMaxLoad configName _this); + statement = QUOTE(getContainerMaxLoad (_this select 1)); }; class ACE_accuracy: sortBase { From 9dc82ee187a60c4266c527eb1b3cbf1f5eb64605 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Wed, 25 Nov 2020 23:22:25 +0400 Subject: [PATCH 042/335] Fix fnc_common_addToInventory using (#8013) --- addons/medical_treatment/functions/fnc_tourniquetRemove.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf index aebf56a6ff..2eb620bf77 100644 --- a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf +++ b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf @@ -40,7 +40,7 @@ TRACE_1("clearConditionCaches: tourniquetRemove",_nearPlayers); // Add tourniquet item to medic's inventory // todo: should there be a setting to select who receives the removed tourniquet? -[_medic, "ACE_tourniquet", true] call EFUNC(common,addToInventory); +[_medic, "ACE_tourniquet"] call EFUNC(common,addToInventory); // Handle occluded medications that were blocked due to tourniquet private _occludedMedications = _patient getVariable [QEGVAR(medical,occludedMedications), []]; From 2ec28c59465d157453543ffa118b661416833a0b Mon Sep 17 00:00:00 2001 From: Cyruz143 Date: Sun, 29 Nov 2020 18:21:02 +0000 Subject: [PATCH 043/335] Medical Engine - Hide actions that have ACE interactions (#8003) --- addons/medical_engine/CfgActions.hpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/addons/medical_engine/CfgActions.hpp b/addons/medical_engine/CfgActions.hpp index 64ecf717db..425b33dbce 100644 --- a/addons/medical_engine/CfgActions.hpp +++ b/addons/medical_engine/CfgActions.hpp @@ -13,4 +13,25 @@ class CfgActions { class FirstAid: None { show = 0; }; + class UnloadUnconsciousUnits: None { + show = 0; + }; + class UnloadFromDriver: None { + show = 0; + }; + class UnloadFromPilot: None { + show = 0; + }; + class UnloadFromCargo: None { + show = 0; + }; + class UnloadFromCommander: None { + show = 0; + }; + class UnloadFromGunner: None { + show = 0; + }; + class UnloadFromTurret: None { + show = 0; + }; }; From 0e884792209ffc3d93f8b2a400d034521e0ceab0 Mon Sep 17 00:00:00 2001 From: Dedmen Miller Date: Sun, 29 Nov 2020 19:21:41 +0100 Subject: [PATCH 044/335] Tagging - Remove useless isClass check in configClasses (#8017) --- addons/tagging/XEH_preStart.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/tagging/XEH_preStart.sqf b/addons/tagging/XEH_preStart.sqf index 342b4b6407..f1abf9e8a5 100644 --- a/addons/tagging/XEH_preStart.sqf +++ b/addons/tagging/XEH_preStart.sqf @@ -4,7 +4,7 @@ private _cacheStaticModels = []; -private _vehicleClasses = "isClass _x && (configName _x) isKindOf 'Static'" configClasses (configFile >> "CfgVehicles"); +private _vehicleClasses = "(configName _x) isKindOf 'Static'" configClasses (configFile >> "CfgVehicles"); // Consider static everything vehicle that inherit from Static // This include houses (which we don't need), but also walls, that we do @@ -16,7 +16,7 @@ private _vehicleClasses = "isClass _x && (configName _x) isKindOf 'Static'" conf }; } forEach _vehicleClasses; -private _nonAIVehicleClasses = "isClass _x" configClasses (configFile >> "CfgNonAIVehicles"); +private _nonAIVehicleClasses = "true" configClasses (configFile >> "CfgNonAIVehicles"); // Also consider static all object inheriting from bridges private _cfgBase = configFile >> "CfgNonAIVehicles"; From a64ba9f7a59ff579e0916286d8039716dde9318a Mon Sep 17 00:00:00 2001 From: Dedmen Miller Date: Sun, 29 Nov 2020 19:21:53 +0100 Subject: [PATCH 045/335] Arsenal - Remove useless isClass check in configClasses (#8018) --- addons/arsenal/functions/fnc_fillLeftPanel.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/arsenal/functions/fnc_fillLeftPanel.sqf b/addons/arsenal/functions/fnc_fillLeftPanel.sqf index 1dca06b065..37cbd4e431 100644 --- a/addons/arsenal/functions/fnc_fillLeftPanel.sqf +++ b/addons/arsenal/functions/fnc_fillLeftPanel.sqf @@ -153,8 +153,8 @@ switch true do { _ctrlPanel lbSetTooltip [_lbAdd,format ["%1\n%2",_displayName, _configName]]; _x call ADDMODICON; }; - } foreach ("isClass _x" configClasses _x); - } foreach ("isClass _x" configClasses (configfile >> "cfgfaces")); + } foreach ("true" configClasses _x); + } foreach ("true" configClasses (configfile >> "cfgfaces")); }; case IDC_buttonVoice : { private _voices = (configProperties [(configFile >> "CfgVoice"), "isClass _x && {getNumber (_x >> 'scope') == 2}", true]) - [(configfile >> "CfgVoice" >> "NoVoice")]; From 5a6b21dd0bdff5fdbcee9e23e44115812266f187 Mon Sep 17 00:00:00 2001 From: Smith Date: Wed, 2 Dec 2020 16:49:35 +0200 Subject: [PATCH 046/335] Map Gestures - Fix briefing mode group (#8025) * fix getting players from a group * add brackets Co-authored-by: jonpas * small refactoring * remove useless parentheses Co-authored-by: commy2 Co-authored-by: jonpas Co-authored-by: commy2 --- addons/map_gestures/functions/fnc_getProximityPlayers.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf index f687dfdfca..f057c000bc 100644 --- a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf +++ b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf @@ -37,7 +37,7 @@ switch (_this) do { _proximityPlayers append allUnits; }; case (1): { // Players in Group - _proximityPlayers append group ace_player; + _proximityPlayers append units ace_player; }; case (2): { // Players on Side _proximityPlayers append (allUnits select {side (group _x) == side (group ace_player)}); From 0f77e8ea2d75455387b8c1e5494ba4b717cb370e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Dec 2020 19:14:33 +0100 Subject: [PATCH 047/335] Bump ini from 1.3.5 to 1.3.7 in /docs/src (#8040) Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/src/package-lock.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/src/package-lock.json b/docs/src/package-lock.json index 66c32ab10b..7a26357f29 100644 --- a/docs/src/package-lock.json +++ b/docs/src/package-lock.json @@ -217,7 +217,8 @@ }, "kind-of": { "version": "6.0.2", - "resolved": "", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } @@ -1657,7 +1658,8 @@ }, "kind-of": { "version": "6.0.2", - "resolved": "", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } @@ -2597,9 +2599,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", "dev": true, "optional": true }, @@ -4054,7 +4056,8 @@ }, "kind-of": { "version": "6.0.2", - "resolved": "", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } From 4058a7e42b3254a3a1c3be9c2eacb5f37831928f Mon Sep 17 00:00:00 2001 From: Brandon Danyluk Date: Tue, 15 Dec 2020 20:01:53 -0700 Subject: [PATCH 048/335] MissileGuidance - Active Radar Homing: Use AGL for `nearestObjects` check (#8045) * Use AGL for `nearestObjects` check * remove empty line --- addons/missileguidance/functions/fnc_seekerType_ARH.sqf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf index 9244090af7..a3bda11258 100644 --- a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf @@ -30,6 +30,7 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then { _seekerStateParams set [6, true]; TRACE_1("Missile Pitbull",_seekerStateParams); }; + // Internal radar homing // For performance reasons only poll for target every so often instead of each frame if ((_lastTargetPollTime + ACTIVE_RADAR_POLL_FREQUENCY) - CBA_missionTime < 0) then { @@ -59,7 +60,7 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then { _seekerBaseRadiusAdjusted = _seekerBaseRadiusAtGround; }; // Look in front of seeker for any targets - private _nearestObjects = nearestObjects [_searchPos, ["Air", "LandVehicle", "Ship"], _seekerBaseRadiusAdjusted, false]; + private _nearestObjects = nearestObjects [ASLtoAGL _searchPos, ["Air", "LandVehicle", "Ship"], _seekerBaseRadiusAdjusted, false]; _nearestObjects = _nearestObjects apply { // I check both Line of Sight versions to make sure that a single bush doesnt make the target lock dissapear but at the same time ensure that this can see through smoke. Should work 80% of the time @@ -70,7 +71,6 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then { }; }; _nearestObjects = _nearestObjects select { !isNull _x }; - // Select closest object to the expected position to be the current radar target if ((count _nearestObjects) <= 0) exitWith { _projectile setMissileTarget objNull; @@ -83,6 +83,7 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then { _target = _x; }; } forEach _nearestObjects; + _expectedTargetPos = _searchPos; }; From 50f740f9be8bc23bed06333312143e3065421f16 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Fri, 18 Dec 2020 00:28:54 +0400 Subject: [PATCH 049/335] Optimize interaction menu conditions (#8037) --- addons/interact_menu/functions/fnc_compileMenu.sqf | 11 +++++++---- .../functions/fnc_compileMenuSelfAction.sqf | 6 +++--- .../interact_menu/functions/fnc_compileMenuZeus.sqf | 7 +++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 7f36247e22..1e1924d8fd 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -69,11 +69,14 @@ private _recurseFnc = { }; private _condition = getText (_entryCfg >> "condition"); - if (_condition == "") then {_condition = "true"}; - // Add canInteract (including exceptions) and canInteractWith to condition - if ((configName _entryCfg) != "ACE_MainActions") then { - _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; + if (configName _entryCfg == "ACE_MainActions") then { + if (_condition isEqualTo "") then {_condition = "true"}; + } else { + // Add canInteract (including exceptions) and canInteractWith to condition + private _canInteractCondition = format [QUOTE([ARR_3(ACE_player,_target,%1)] call EFUNC(common,canInteractWith)), getArray (_entryCfg >> "exceptions")]; + private _conditionFormatPattern = ["%1 && {%2}", "%2"] select (_condition isEqualTo "" || {_condition == "true"}); + _condition = format [_conditionFormatPattern, _condition, _canInteractCondition]; }; private _insertChildren = compile (getText (_entryCfg >> "insertChildren")); diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 879ca7b138..c3ad9b35e7 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -45,10 +45,11 @@ private _recurseFnc = { private _statement = compile (getText (_entryCfg >> "statement")); private _condition = getText (_entryCfg >> "condition"); - if (_condition == "") then {_condition = "true"}; // Add canInteract (including exceptions) and canInteractWith to condition - _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; + private _canInteractCondition = format [QUOTE([ARR_3(ACE_player,_target,%1)] call EFUNC(common,canInteractWith)), getArray (_entryCfg >> "exceptions")]; + private _conditionFormatPattern = ["%1 && {%2}", "%2"] select (_condition isEqualTo "" || {_condition == "true"}); + _condition = compile format [_conditionFormatPattern, _condition, _canInteractCondition]; private _insertChildren = compile (getText (_entryCfg >> "insertChildren")); private _modifierFunction = compile (getText (_entryCfg >> "modifierFunction")); @@ -63,7 +64,6 @@ private _recurseFnc = { _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; }; - _condition = compile _condition; private _children = [_entryCfg] call _recurseFnc; private _entry = [ diff --git a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf index c1f4dc0858..675cebe61f 100644 --- a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf @@ -35,7 +35,11 @@ private _recurseFnc = { private _statement = compile (getText (_entryCfg >> "statement")); private _condition = getText (_entryCfg >> "condition"); - if (_condition == "") then {_condition = "true"}; + if (_condition == "") then { + _condition = {true}; + } else { + _condition = compile _condition; + }; private _insertChildren = compile (getText (_entryCfg >> "insertChildren")); private _modifierFunction = compile (getText (_entryCfg >> "modifierFunction")); @@ -50,7 +54,6 @@ private _recurseFnc = { _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; }; - private _condition = compile _condition; private _children = [_entryCfg] call _recurseFnc; private _entry = [ From 8eccabbc0a6c0d0ac22e351c9bb957f8c9ac24f3 Mon Sep 17 00:00:00 2001 From: Cyruz143 Date: Sun, 20 Dec 2020 23:15:46 +0000 Subject: [PATCH 050/335] Grenades - Use fnc_addToInventory (#8016) * Try and put converted item back in the same container * Update addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf Co-authored-by: Dystopian * Update addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf Co-authored-by: Dystopian * Less hacky handling of container names * Return value convention Co-authored-by: Dystopian --- ...nc_addChangeFuseItemContextMenuOptions.sqf | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf b/addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf index 407d029c0e..99a28d91f4 100644 --- a/addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf +++ b/addons/grenades/functions/fnc_addChangeFuseItemContextMenuOptions.sqf @@ -33,9 +33,25 @@ } ], { - params ["_unit", "", "", "", "_magArr"]; - _unit addMagazine (_magArr select 1); - false; + params ["_unit", "", "", "_slot", "_magArr"]; + private _container = ""; + switch _slot do { + case "UNIFORM_CONTAINER": { + _container = "uniform"; + }; + case "VEST_CONTAINER": { + _container = "vest"; + }; + case "BACKPACK_CONTAINER": { + _container = "backpack"; + }; + }; + + if (_container != "") then { + [_unit, _magArr select 1, _container] call EFUNC(common,addToInventory); + }; + + false }, true, [_mag,_throwableMag] @@ -55,9 +71,25 @@ } ], { - params ["_unit", "", "", "", "_magArr"]; - _unit addMagazine (_magArr select 0); - false; + params ["_unit", "", "", "_slot", "_magArr"]; + private _container = ""; + switch _slot do { + case "UNIFORM_CONTAINER": { + _container = "uniform"; + }; + case "VEST_CONTAINER": { + _container = "vest"; + }; + case "BACKPACK_CONTAINER": { + _container = "backpack"; + }; + }; + + if (_container != "") then { + [_unit, _magArr select 0, _container] call EFUNC(common,addToInventory); + }; + + false }, true, [_mag,_throwableMag] From ff30a7b98173630baaac99d92d444ef8c8eba820 Mon Sep 17 00:00:00 2001 From: jonpas Date: Thu, 31 Dec 2020 02:42:19 +0100 Subject: [PATCH 051/335] CI - Simplify extension paths condition (#8051) Introduced in https://github.blog/changelog/2019-09-30-github-actions-event-filtering-updates/ --- .github/workflows/extensions.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/extensions.yml b/.github/workflows/extensions.yml index 65f0a29eb9..12be4ceb1e 100644 --- a/.github/workflows/extensions.yml +++ b/.github/workflows/extensions.yml @@ -3,11 +3,7 @@ name: Extensions on: pull_request: paths: - - 'extensions/*' - - 'extensions/*/*' - - 'extensions/*/*/*' - - 'extensions/*/*/*/*' - - 'extensions/*/*/*/*/*' + - 'extensions/**' jobs: build: From 718535ca3badfef3e78068d668286b7eb3b3efce Mon Sep 17 00:00:00 2001 From: YetheSamartaka <55753928+YetheSamartaka@users.noreply.github.com> Date: Thu, 31 Dec 2020 02:43:00 +0100 Subject: [PATCH 052/335] RHS Compat - Add ACE_GForceCoef value for DF-15 uniforms (#8039) * Add DF-15 GForceCoef Value This adds missing ACE_GForceCoef value for DF-15 uniforms. * DF-15 PR - cfgWeapons formating DF-15 PR - cfgWeapons formating * DF-15 PR - cfgWeapons formating II Forgot to save it with braces and spaces around = * Update CfgWeapons.hpp Co-authored-by: PabstMirror --- optionals/compat_rhs_afrf3/CfgWeapons.hpp | 5 +++++ optionals/compat_rhs_saf3/CfgWeapons.hpp | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp index fdfe7164e9..d0bd43a16a 100644 --- a/optionals/compat_rhs_afrf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_afrf3/CfgWeapons.hpp @@ -332,4 +332,9 @@ class CfgWeapons { modes[] = {}; picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_Kornet_9M133_2_msv_ca.paa"; }; + + class rhs_uniform_flora; + class rhs_uniform_df15: rhs_uniform_flora { + ACE_GForceCoef = 0.8; + }; }; diff --git a/optionals/compat_rhs_saf3/CfgWeapons.hpp b/optionals/compat_rhs_saf3/CfgWeapons.hpp index e3cae125bc..b20dca276b 100644 --- a/optionals/compat_rhs_saf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_saf3/CfgWeapons.hpp @@ -63,4 +63,12 @@ class CfgWeapons { class rhs_weap_cz99: hgun_P07_F { ACE_barrelLength = 108; }; + + class Uniform_Base; + class rhssaf_uniform_mig29_pilot: Uniform_Base { + ACE_GForceCoef = 0.8; + }; + class rhssaf_uniform_heli_pilot: Uniform_Base { + ACE_GForceCoef = 0.8; + }; }; From fe544a274d043480e557903a891f6bfe02277d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Dahlgren?= Date: Tue, 5 Jan 2021 10:54:52 +0100 Subject: [PATCH 053/335] Ballistics - Add 30rnd 556 magazines to SCAR EGLM magwell (#8054) --- addons/ballistics/CfgMagazineWells.hpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/ballistics/CfgMagazineWells.hpp b/addons/ballistics/CfgMagazineWells.hpp index 6fa0ea1caf..d75381f8a4 100644 --- a/addons/ballistics/CfgMagazineWells.hpp +++ b/addons/ballistics/CfgMagazineWells.hpp @@ -67,6 +67,15 @@ class CfgMagazineWells { }; }; + class CBA_556x45_SCAR_EGLM { + ADDON[] = { + "ACE_30Rnd_556x45_Stanag_M995_AP_mag", + "ACE_30Rnd_556x45_Stanag_Mk262_mag", + "ACE_30Rnd_556x45_Stanag_Mk318_mag", + "ACE_30Rnd_556x45_Stanag_Tracer_Dim" + }; + }; + class STANAG_556x45 { //Vanilla magwell ADDON[] = { "ACE_30Rnd_556x45_Stanag_M995_AP_mag", From d991f8ebdcd9568e7667be61a07f44b4e82ef256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Dahlgren?= Date: Sun, 10 Jan 2021 20:27:25 +0100 Subject: [PATCH 054/335] Tools - Disable pboproject warnings are errors in build script (#8049) Macros with unused variables are now warnings This causes issues with logging macros being unused with disabled debug --- tools/make.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make.py b/tools/make.py index 5078cdda60..a92a517ea5 100644 --- a/tools/make.py +++ b/tools/make.py @@ -1268,7 +1268,7 @@ See the make.cfg file for additional build options. cmd = [makepboTool, "-P","-A","-X=*.backup", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"addons")] else: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S", "+Noisy", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S", "+Noisy", "+Clean", "-Warnings", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] color("grey") if quiet: From 8b8abec70ee329f850432599da771f5716b2c4ca Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 10 Jan 2021 13:28:29 -0600 Subject: [PATCH 055/335] Tools - Build dev (filepatching) with hemtt if installed (#8061) * Build dev (filepatching) with hemtt if installed * Update build.py --- tools/build.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/build.py b/tools/build.py index 9151daa095..257fbff224 100644 --- a/tools/build.py +++ b/tools/build.py @@ -9,6 +9,17 @@ MAINPREFIX = "z" PREFIX = "ace_" ########################## +def tryHemttBuild(projectpath): + hemttExe = os.path.join(projectpath, "hemtt.exe") + if os.path.isfile(hemttExe): + os.chdir(projectpath) + ret = subprocess.call([hemttExe, "pack"], stderr=subprocess.STDOUT) + print("Using hemtt: {}".format(ret)); + return True + else: + print("hemtt not installed"); + return False + def mod_time(path): if not os.path.isdir(path): return os.path.getmtime(path) @@ -40,6 +51,8 @@ def main(): projectpath = os.path.dirname(os.path.dirname(scriptpath)) addonspath = os.path.join(projectpath, "addons") + if (tryHemttBuild(projectpath)): return + os.chdir(addonspath) made = 0 From 24b1a71fbbc7a458435461fff19d44357e7eeaa5 Mon Sep 17 00:00:00 2001 From: Jo David Date: Thu, 14 Jan 2021 07:29:05 +0100 Subject: [PATCH 056/335] fix docs version of ace3 (#8069) --- docs/_config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index c5871f0f5d..533a2e325d 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -8,9 +8,9 @@ ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 14 - patch: 3 - build: 55 + minor: 13 + patch: 5 + build: 57 acex: githubUrl: https://github.com/acemod/ACEX From 6522dba87e75f0a35d4e35e53309aafb6fb6527e Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 20 Jan 2021 21:49:38 +0100 Subject: [PATCH 057/335] Dragging - Fix mass synchronization (#8071) * Dragging - Fix mass synchronization * Cleanup redundant argument --- addons/dragging/functions/fnc_dropObject.sqf | 2 +- addons/dragging/functions/fnc_dropObject_carry.sqf | 2 +- addons/dragging/functions/fnc_startCarry.sqf | 2 +- addons/dragging/functions/fnc_startDrag.sqf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/dragging/functions/fnc_dropObject.sqf b/addons/dragging/functions/fnc_dropObject.sqf index 4ecc876afd..6218f4afec 100644 --- a/addons/dragging/functions/fnc_dropObject.sqf +++ b/addons/dragging/functions/fnc_dropObject.sqf @@ -84,5 +84,5 @@ if (_target getVariable [QGVAR(isUAV), false]) then { private _mass = _target getVariable [QGVAR(originalMass), 0]; if (_mass != 0) then { - [QEGVAR(common,setMass), [_target, _mass], _target] call CBA_fnc_targetEvent; + [QEGVAR(common,setMass), [_target, _mass]] call CBA_fnc_globalEvent; // force global sync }; diff --git a/addons/dragging/functions/fnc_dropObject_carry.sqf b/addons/dragging/functions/fnc_dropObject_carry.sqf index 5235b7e66d..fd10d64f95 100644 --- a/addons/dragging/functions/fnc_dropObject_carry.sqf +++ b/addons/dragging/functions/fnc_dropObject_carry.sqf @@ -81,7 +81,7 @@ if (_target getVariable [QGVAR(isUAV), false]) then { private _mass = _target getVariable [QGVAR(originalMass), 0]; if (_mass != 0) then { - [QEGVAR(common,setMass), [_target, _mass], _target] call CBA_fnc_targetEvent; + [QEGVAR(common,setMass), [_target, _mass]] call CBA_fnc_globalEvent; // force global sync }; // reset temp direction diff --git a/addons/dragging/functions/fnc_startCarry.sqf b/addons/dragging/functions/fnc_startCarry.sqf index a52afd1c27..7d1babf075 100644 --- a/addons/dragging/functions/fnc_startCarry.sqf +++ b/addons/dragging/functions/fnc_startCarry.sqf @@ -79,5 +79,5 @@ private _mass = getMass _target; if (_mass > 1) then { _target setVariable [QGVAR(originalMass), _mass, true]; - [QEGVAR(common,setMass), [_target, 1e-12], _target] call CBA_fnc_targetEvent; + [QEGVAR(common,setMass), [_target, 1e-12]] call CBA_fnc_globalEvent; // force global sync }; diff --git a/addons/dragging/functions/fnc_startDrag.sqf b/addons/dragging/functions/fnc_startDrag.sqf index 7a4c8908d3..0b24bc4337 100644 --- a/addons/dragging/functions/fnc_startDrag.sqf +++ b/addons/dragging/functions/fnc_startDrag.sqf @@ -67,5 +67,5 @@ private _mass = getMass _target; if (_mass > 1) then { _target setVariable [QGVAR(originalMass), _mass, true]; - [QEGVAR(common,setMass), [_target, 1e-12], _target] call CBA_fnc_targetEvent; + [QEGVAR(common,setMass), [_target, 1e-12]] call CBA_fnc_globalEvent; // force global sync }; From 4acfc35e77713c532cc219425ae2437aaaeebd8f Mon Sep 17 00:00:00 2001 From: Dystopian Date: Thu, 28 Jan 2021 21:14:28 +0400 Subject: [PATCH 058/335] Cleanup unused variable (#8074) --- addons/quickmount/functions/fnc_addFreeSeatsActions.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf index 422afece6d..bd3157c15f 100644 --- a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf +++ b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf @@ -59,8 +59,8 @@ #define MOVE_IN_CODE(command) (_this select 0) command (_this select 1) private _fnc_move = { - (_this select 2) params ["_moveInCode", "_moveInParams", "_currentTurret", "_moveBackCode", "_moveBackParams", ["_enabledByAnimationSource", ""]]; - TRACE_7("fnc_move params",_moveInCode,_moveInParams,_currentTurret,_moveBackCode,_moveBackParams,_enabledByAnimationSource,call {GVAR(frame)=diag_frameno}); + (_this select 2) params ["_moveInCode", "_moveInParams", "_currentTurret", "_moveBackCode", "_moveBackParams"]; + TRACE_6("fnc_move params",_moveInCode,_moveInParams,_currentTurret,_moveBackCode,_moveBackParams,call {GVAR(frame)=diag_frameno}); // workaround getting damage when moveOut while vehicle is moving // also this helps with arma bug when unit is stuck in wrong anim when move in turret with configured enabledByAnimationSource @@ -208,7 +208,7 @@ private _cargoNumber = -1; private _gunnerCompartments = (_turretConfig >> "gunnerCompartments") call BIS_fnc_getCfgData; TO_COMPARTMENT_STRING(_gunnerCompartments); if (_compartment != _gunnerCompartments) then {breakTo "crewLoop"}; - _params = [{MOVE_IN_CODE(moveInTurret)}, [_vehicle, _turretPath], _currentTurret, _moveBackCode, _moveBackParams, _enabledByAnimationSource]; + _params = [{MOVE_IN_CODE(moveInTurret)}, [_vehicle, _turretPath], _currentTurret, _moveBackCode, _moveBackParams]; _statement = _fnc_move; }; _name = getText (_turretConfig >> "gunnerName"); From 5ffcac9c88ff3e829dc799c95bce95491f7fe0ac Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 3 Feb 2021 17:56:18 -0600 Subject: [PATCH 059/335] Misc - Fix minor macro usage (#8091) --- addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf | 2 +- addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf index fe144ea78a..d2789f5d38 100644 --- a/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf +++ b/addons/medical_treatment/functions/fnc_isInMedicalFacility.sqf @@ -21,7 +21,7 @@ params ["_unit"]; private _fnc_check = { private _position = _unit modelToWorldVisual [0, 0, eyePos _unit select 2]; - CHECK_OBJECTS(ARR_5(lineIntersectsWith [_position, _position vectorAdd [0, 0, 10], _unit])) || {CHECK_OBJECTS(_unit nearObjects 7.5)} + CHECK_OBJECTS(lineIntersectsWith [ARR_3(_position, _position vectorAdd [ARR_3(0, 0, 10)], _unit)]) || {CHECK_OBJECTS(_unit nearObjects 7.5)} }; [[], _fnc_check, _unit, QGVAR(inMedicalFacilityCache), IN_MEDICAL_FACILITY_CACHE_EXPIRY] call EFUNC(common,cachedCall); diff --git a/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf b/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf index f6d11334b3..fd4804b98f 100644 --- a/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf +++ b/addons/mk6mortar/functions/fnc_csw_getProxyWeapon.sqf @@ -55,7 +55,7 @@ if (_proxyWeaponNeeded || GVAR(useAmmoHandling)) then { }; }; } else { - WARNING("unknown mag %1", _xMag); + WARNING_1("unknown mag %1", _xMag); }; }; } forEach (magazinesAllTurrets _mortar); From 091d0d2449fa4601f42810649e3dbe8e25d73bf2 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 4 Feb 2021 10:48:58 -0600 Subject: [PATCH 060/335] Tripod - Fix blocking mouse wheel input handler (#8090) --- addons/tripod/functions/fnc_adjust.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/tripod/functions/fnc_adjust.sqf b/addons/tripod/functions/fnc_adjust.sqf index d2a837c89e..2dd6964768 100644 --- a/addons/tripod/functions/fnc_adjust.sqf +++ b/addons/tripod/functions/fnc_adjust.sqf @@ -30,6 +30,7 @@ GVAR(adjustPFH) = [{ [_unit, "DefaultAction", _unit getVariable [QGVAR(Adjust), -1]] call EFUNC(common,removeActionEventHandler); [_this select 1] call CBA_fnc_removePerFrameHandler; + GVAR(adjustPFH) = -1; }; { From 08472f63437a5619a56e55a7bddb976fc5a77b00 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Thu, 4 Feb 2021 21:01:35 +0400 Subject: [PATCH 061/335] Interact Menu - Combine parent menu with single child (#8060) * Combine parent menu with single child * Adapt fastroping Cut ropes action for the setting * Change setting name and description * Fix action object when child action has different object Co-authored-by: PabstMirror * Adapt quickmount Change Seat actions Co-authored-by: PabstMirror --- addons/chemlights/CfgVehicles.hpp | 5 +-- addons/fastroping/CfgVehicles.hpp | 5 +-- .../functions/fnc_collectActiveActionTree.sqf | 32 +++++++++++++++++-- addons/interact_menu/initSettings.sqf | 8 +++++ addons/interact_menu/stringtable.xml | 8 +++++ addons/map/CfgVehicles.hpp | 6 ++-- addons/quickmount/CfgVehicles.hpp | 3 +- .../functions/fnc_canShowFreeSeats.sqf | 12 ++++--- 8 files changed, 61 insertions(+), 18 deletions(-) diff --git a/addons/chemlights/CfgVehicles.hpp b/addons/chemlights/CfgVehicles.hpp index 02856b99e7..e01fb79b87 100644 --- a/addons/chemlights/CfgVehicles.hpp +++ b/addons/chemlights/CfgVehicles.hpp @@ -9,11 +9,8 @@ class CfgVehicles { class ACE_Chemlights { displayName = CSTRING(Action_Chemlights); icon = "\a3\ui_f\data\gui\cfg\Hints\chemlights_ca.paa"; - condition = QUOTE(count ([ACE_player] call FUNC(getShieldComponents)) > 0); - statement = "true"; exceptions[] = {"isNotDragging", "isNotSwimming", "notOnMap", "isNotInside", "isNotSitting"}; - insertChildren = QUOTE(_this call DFUNC(compileChemlightMenu)); - showDisabled = 0; + insertChildren = QUOTE(call DFUNC(compileChemlightMenu)); }; }; }; diff --git a/addons/fastroping/CfgVehicles.hpp b/addons/fastroping/CfgVehicles.hpp index 2a130b37f9..24f996d825 100644 --- a/addons/fastroping/CfgVehicles.hpp +++ b/addons/fastroping/CfgVehicles.hpp @@ -75,8 +75,9 @@ class CfgVehicles { }; class ACE_cutRopes { displayName = CSTRING(Interaction_cutRopes); - condition = QUOTE(true); - statement = ""; + condition = QUOTE([_target] call FUNC(canCutRopes)); + // should not be empty to work with EGVAR(interact_menu,consolidateSingleChild) setting + statement = QUOTE(true); class confirmCutRopes { displayName = ECSTRING(common,confirm); condition = QUOTE([_target] call FUNC(canCutRopes)); diff --git a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf index e7fecfcac8..a59a7ff787 100644 --- a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf +++ b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf @@ -13,7 +13,7 @@ * Active children * * Example: - * [bob, [array], [array], 5] call ACE_interact_menu_fnc_collectActoveActionTree + * [bob, [array], [array], 5] call ACE_interact_menu_fnc_collectActiveActionTree * * Public: No */ @@ -31,7 +31,17 @@ if !((_origActionData select 10) isEqualTo {}) then { [_target, ACE_player, _origActionData select 6, _origActionData] call (_origActionData select 10); }; -_origActionData params ["_actionName", "", "", "_statementCode", "_conditionCode", "_insertChildrenCode", "_customParams", "", "_distance"]; +_origActionData params [ + "_actionName", + "_displayName", + "", + "_statementCode", + "_conditionCode", + "_insertChildrenCode", + "_customParams", + "_position", + "_distance" +]; // Return nothing if the action itself is not active if !([_target, ACE_player, _customParams] call _conditionCode) exitWith { @@ -91,5 +101,23 @@ if ((_activeChildren isEqualTo []) && {_statementCode isEqualTo {}}) exitWith { [] }; +if (GVAR(consolidateSingleChild) && {count _activeChildren == 1} && {_statementCode isEqualTo {}}) then { + _activeChildren select 0 params ["_childActionData", "_childChildren", "_childObject"]; + _childActionData params ["", "_displayNameChild", "_iconChild", "_statementChild", "", "", "_customParamsChild", "", "", "_paramsChild"]; + _origActionData = [ + _actionName, + format ["%1 > %2", _displayName, _displayNameChild], + _iconChild, + _statementChild, + _conditionCode, + _insertChildrenCode, + _customParamsChild, + _position, + _distance, + _paramsChild + ]; + _activeChildren = _childChildren; + _object = _childObject; +}; [_origActionData, _activeChildren, _object] diff --git a/addons/interact_menu/initSettings.sqf b/addons/interact_menu/initSettings.sqf index 8d353906f6..6b58196f07 100644 --- a/addons/interact_menu/initSettings.sqf +++ b/addons/interact_menu/initSettings.sqf @@ -8,6 +8,14 @@ {GVAR(selectorColorHex) = _this call BIS_fnc_colorRGBtoHTML} // Stored in Hex to avoid constant conversion ] call CBA_settings_fnc_init; +[ + QGVAR(consolidateSingleChild), + "CHECKBOX", + [LSTRING(consolidateSingleChild), LSTRING(consolidateSingleChild_Description)], + format ["ACE %1", LLSTRING(Category_InteractionMenu)], + false +] call CBA_fnc_addSetting; + [ QGVAR(alwaysUseCursorInteraction), "CHECKBOX", diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 106fb1aebc..4da4d9ae35 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -489,5 +489,13 @@ Selector de color Seçici Renk + + Consolidate single child actions + Объединять с единственным дочерним действием + + + Combines parent action with only one child action together. + Объединять родительское действие с единственным дочерним действием в одно. + diff --git a/addons/map/CfgVehicles.hpp b/addons/map/CfgVehicles.hpp index 3da69a1216..181978551a 100644 --- a/addons/map/CfgVehicles.hpp +++ b/addons/map/CfgVehicles.hpp @@ -5,11 +5,9 @@ class CfgVehicles { class ACE_MapFlashlight { displayName = CSTRING(Action_Flashlights); icon = QUOTE(\a3\ui_f\data\IGUI\Cfg\VehicleToggles\lightsiconon_ca.paa); - condition = QUOTE(GVAR(mapIllumination) && visibleMap && {!([] isEqualTo (_player call FUNC(getUnitFlashlights)))}); - statement = "true"; + condition = QUOTE(GVAR(mapIllumination) && visibleMap); exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; - insertChildren = QUOTE(_this call DFUNC(compileFlashlightMenu)); - showDisabled = 0; + insertChildren = QUOTE(call DFUNC(compileFlashlightMenu)); }; }; }; diff --git a/addons/quickmount/CfgVehicles.hpp b/addons/quickmount/CfgVehicles.hpp index a0b54df48b..f58cb5df33 100644 --- a/addons/quickmount/CfgVehicles.hpp +++ b/addons/quickmount/CfgVehicles.hpp @@ -51,8 +51,7 @@ class CfgVehicles { class GVAR(ChangeSeat) { \ displayName = CSTRING(ChangeSeat); \ condition = QUOTE(call DFUNC(canShowFreeSeats)); \ - statement = ""; \ - insertChildren = QUOTE((_this select 2) param [ARR_2(0, [])]); \ + insertChildren = QUOTE(call DFUNC(addFreeSeatsActions)); \ }; \ } diff --git a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf index 506dbd78ac..8fd2f9c840 100644 --- a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf +++ b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf @@ -19,7 +19,6 @@ params ["_vehicle", "_unit", "_args"]; -_args set [0, []]; private _isInVehicle = _unit in _vehicle; GVAR(enabled) @@ -40,7 +39,12 @@ GVAR(enabled) || {_vehicle isKindOf "Air"} // except Air } && { - private _subActions = _this call FUNC(addFreeSeatsActions); - _args set [0, _subActions]; - !([] isEqualTo _subActions) + _isInVehicle + || { + // because Get In action has its own statement + // we have to cache subactions in args and reuse them in insertChildren code + private _subActions = _this call FUNC(addFreeSeatsActions); + _args set [0, _subActions]; + !([] isEqualTo _subActions) + } } From 7a65acdc15373dc321d566cd2cd7c2da6d48653f Mon Sep 17 00:00:00 2001 From: TyroneMF Date: Mon, 8 Feb 2021 03:13:59 +0000 Subject: [PATCH 062/335] Medical Damage - Add setting for unconscious chance from pain (#8092) Co-authored-by: Filip Maciejewski --- .../functions/fnc_handleIncapacitation.sqf | 2 +- addons/medical_damage/initSettings.sqf | 9 +++++++++ addons/medical_damage/stringtable.xml | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/addons/medical_damage/functions/fnc_handleIncapacitation.sqf b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf index bdfa3fe4de..4e87e749df 100644 --- a/addons/medical_damage/functions/fnc_handleIncapacitation.sqf +++ b/addons/medical_damage/functions/fnc_handleIncapacitation.sqf @@ -32,6 +32,6 @@ _bodyPartDamage params ["_headDamage", "_bodyDamage", "_leftArmDamage", "_rightA private _damageThreshold = GET_DAMAGE_THRESHOLD(_unit); -if ((_headDamage > _damageThreshold / 2) || {_bodyDamage > _damageThreshold} || {(_painLevel >= PAIN_UNCONSCIOUS) && {random 1 < 0.1}}) then { +if ((_headDamage > _damageThreshold / 2) || {_bodyDamage > _damageThreshold} || {(_painLevel >= PAIN_UNCONSCIOUS) && {random 1 < EGVAR(medical,painUnconsciousChance)}}) then { [QEGVAR(medical,CriticalInjury), _unit] call CBA_fnc_localEvent; }; diff --git a/addons/medical_damage/initSettings.sqf b/addons/medical_damage/initSettings.sqf index e508f74621..9f606169b5 100644 --- a/addons/medical_damage/initSettings.sqf +++ b/addons/medical_damage/initSettings.sqf @@ -24,3 +24,12 @@ [0, 25, 1, 2], true ] call CBA_settings_fnc_init; + +[ + QEGVAR(medical,painUnconsciousChance), + "SLIDER", + [LSTRING(PainUnconsciousChance_DisplayName), LSTRING(PainUnconsciousChance_Description)], + ELSTRING(medical,Category), + [0, 1, 0.1, 2, true], + true +] call CBA_settings_fnc_init; diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index 1406ef4dbe..0baee24c91 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -687,5 +687,13 @@ Ustawia próg obrażeń jakie może otrzymać jednostka przed utratą przytomności. (0 jako ustawienie domyślne misji) Bilinçsiz duruma geçmeden önce bir birimin alabileceği hasar miktarını ayarlar. (Görev varsayılanı için 0) + + Pain Unconscious Chance + Szansa na nieprzytomność przez ból + + + The probability of a person falling unconscious when their pain is above the tolerance threshold upon receiving damage. + Szansa że osoba straci przytomność gdy jej ból jest powyżej tolerowalnego progu podczas otrzymywania obrażeń. + From b50a49c287df90035d3044b42eb6c928eda5b051 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 7 Feb 2021 21:14:45 -0600 Subject: [PATCH 063/335] Convert all true/false in configs to 0/1 (#8095) --- addons/cargo/menu.hpp | 2 +- addons/common/CfgEventHandlers.hpp | 2 -- addons/common/HintConfig.hpp | 4 ++-- addons/common/ProgressScreen.hpp | 4 ++-- addons/common/define.hpp | 2 +- addons/dagr/Dialog.hpp | 2 +- addons/dagr/RscTitles.hpp | 2 +- addons/goggles/RscTitles.hpp | 2 +- addons/huntir/Dialog.hpp | 2 +- addons/huntir/RscTitles.hpp | 2 +- addons/interact_menu/CursorMenus.hpp | 2 +- 11 files changed, 12 insertions(+), 14 deletions(-) diff --git a/addons/cargo/menu.hpp b/addons/cargo/menu.hpp index 7496298371..bdc9477ca1 100644 --- a/addons/cargo/menu.hpp +++ b/addons/cargo/menu.hpp @@ -2,7 +2,7 @@ class GVAR(menu) { idd = 314614; - movingEnable = true; + movingEnable = 1; onLoad = QUOTE([_this select 0] call FUNC(onMenuOpen)); onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(menuDisplay)),nil)];); class controlsBackground { diff --git a/addons/common/CfgEventHandlers.hpp b/addons/common/CfgEventHandlers.hpp index fa4f3dcacd..b8be2cc63a 100644 --- a/addons/common/CfgEventHandlers.hpp +++ b/addons/common/CfgEventHandlers.hpp @@ -8,14 +8,12 @@ class Extended_PreStart_EventHandlers { class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); - disableModuload = true; }; }; class Extended_PostInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_postInit)); - disableModuload = true; }; }; diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index e3912e56f3..f647b7b1de 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -23,7 +23,7 @@ class RscTitles { class ACE_RscHint { idd = -1; onLoad = "uiNamespace setVariable ['ACE_ctrlHint', (_this select 0) displayCtrl 1];"; - movingEnable = false; + movingEnable = 0; duration = 4; fadeIn = 0.2; fadeOut = 0.2; @@ -48,7 +48,7 @@ class RscTitles { class ACE_RscErrorHint { idd = -1; onLoad = "uiNamespace setVariable ['ACE_ctrlErrorHint', (_this select 0) displayCtrl 1];"; - movingEnable = false; + movingEnable = 0; duration = 999999; fadeIn = 0.2; fadeOut = 0.2; diff --git a/addons/common/ProgressScreen.hpp b/addons/common/ProgressScreen.hpp index 9b55ae33a3..8933fae6f9 100644 --- a/addons/common/ProgressScreen.hpp +++ b/addons/common/ProgressScreen.hpp @@ -1,6 +1,6 @@ class GVAR(ProgressBar_Dialog) { idd = -1; - movingEnable = false; + movingEnable = 0; onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBG)),(_this select 0) displayCtrl 1)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBar)),(_this select 0) displayCtrl 2)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBarTitle)),(_this select 0) displayCtrl 3)];); objects[] = {}; @@ -52,7 +52,7 @@ class GVAR(ProgressBar_Dialog) { class GVAR(DisableMouse_Dialog) { idd = -1; - movingEnable = false; + movingEnable = 0; onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),_this select 0)];); objects[] = {}; class controlsBackground { diff --git a/addons/common/define.hpp b/addons/common/define.hpp index f25892b6d7..68f467d205 100644 --- a/addons/common/define.hpp +++ b/addons/common/define.hpp @@ -159,7 +159,7 @@ class ACE_gui_buttonBase { colorBackgroundFocused[] = {1,1,1,1}; periodFocus = 1.2; periodOver = 0.8; - default = false; + default = 0; class HitZone { left = 0.00; top = 0.00; diff --git a/addons/dagr/Dialog.hpp b/addons/dagr/Dialog.hpp index 51b6c988b6..1b98263fe2 100644 --- a/addons/dagr/Dialog.hpp +++ b/addons/dagr/Dialog.hpp @@ -139,7 +139,7 @@ class DAGR_Menu_Text { class DAGR_Menu { idd = 266860; - movingEnable = false; + movingEnable = 0; duration = 100000; fadein = 0; fadeout = 0; diff --git a/addons/dagr/RscTitles.hpp b/addons/dagr/RscTitles.hpp index ab70517c9a..87230c7fc0 100644 --- a/addons/dagr/RscTitles.hpp +++ b/addons/dagr/RscTitles.hpp @@ -32,7 +32,7 @@ class RscTitles { class DAGR_Display { idd = 266850; - movingEnable = false; + movingEnable = 0; duration = 100000; fadein = 0; fadeout = 0; diff --git a/addons/goggles/RscTitles.hpp b/addons/goggles/RscTitles.hpp index 5544b9b132..7c62c6960c 100644 --- a/addons/goggles/RscTitles.hpp +++ b/addons/goggles/RscTitles.hpp @@ -7,7 +7,7 @@ class RscTitles{ onUnload = "uiNamespace setVariable ['ACE_Goggles_Display', displayNull]"; fadeIn=0.5; fadeOut=0.5; - movingEnable = false; + movingEnable = 0; duration = 10e10; name = "RscACE_Goggles_BaseTitle"; class controls; diff --git a/addons/huntir/Dialog.hpp b/addons/huntir/Dialog.hpp index 17578bbb3e..18c5ac1339 100644 --- a/addons/huntir/Dialog.hpp +++ b/addons/huntir/Dialog.hpp @@ -60,7 +60,7 @@ class GVAR(cam_dialog) { idd = 18880; - movingEnable = true; + movingEnable = 1; controlsBackground[] = { }; objects[] = { }; controls[] = { diff --git a/addons/huntir/RscTitles.hpp b/addons/huntir/RscTitles.hpp index e93eb9b508..7d2e06fa6b 100644 --- a/addons/huntir/RscTitles.hpp +++ b/addons/huntir/RscTitles.hpp @@ -3,7 +3,7 @@ class RscTitles { class GVAR(cam_rose) { idd=-1; - movingEnable = true; + movingEnable = 1; fadein = 0; fadeout = 1; duration = 1e+011; diff --git a/addons/interact_menu/CursorMenus.hpp b/addons/interact_menu/CursorMenus.hpp index 385c3a0f75..98f05082a9 100644 --- a/addons/interact_menu/CursorMenus.hpp +++ b/addons/interact_menu/CursorMenus.hpp @@ -12,7 +12,7 @@ class RscTitles { onUnload = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(menuBackground)),displayNull)]); fadeIn = 0.25; fadeOut = 0.25; - movingEnable = false; + movingEnable = 0; duration = 10e10; name = QGVAR(menuBackground); class controls {}; From b8820eb3da31324807d2112d5de2e08e54b1f928 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Mon, 8 Feb 2021 04:26:40 +0100 Subject: [PATCH 064/335] Arsenal - Fix custom categories not working for some Misc item types (#8088) --- addons/arsenal/functions/fnc_fillRightPanel.sqf | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/addons/arsenal/functions/fnc_fillRightPanel.sqf b/addons/arsenal/functions/fnc_fillRightPanel.sqf index ae675ffcdf..b4c7e2695a 100644 --- a/addons/arsenal/functions/fnc_fillRightPanel.sqf +++ b/addons/arsenal/functions/fnc_fillRightPanel.sqf @@ -289,13 +289,13 @@ switch (_ctrlIDC) do { { ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 18); + } foreach ((GVAR(virtualItems) select 18) select {!((toLower _x) in _blockItems)}); { ["CfgVehicles", _x, false, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 23); + } foreach ((GVAR(virtualItems) select 23) select {!((toLower _x) in _blockItems)}); { ["CfgGlasses", _x, false, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 24); + } foreach ((GVAR(virtualItems) select 24) select {!((toLower _x) in _blockItems)}); }; default { @@ -308,6 +308,16 @@ switch (_ctrlIDC) do { { ["CfgWeapons", _x, true] call _fnc_fill_right_Container; } foreach ((GVAR(virtualItems) select 17) select {(toLower _x) in _items}); + + { + ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; + } foreach ((GVAR(virtualItems) select 18) select {(toLower _x) in _items}); + { + ["CfgVehicles", _x, false, true] call _fnc_fill_right_Container; + } foreach ((GVAR(virtualItems) select 23) select {(toLower _x) in _items}); + { + ["CfgGlasses", _x, false, true] call _fnc_fill_right_Container; + } foreach ((GVAR(virtualItems) select 24) select {(toLower _x) in _items}); }; }; }; From 174df77564a2033add51e674ed7abb596370029e Mon Sep 17 00:00:00 2001 From: Laid3acK Date: Mon, 8 Feb 2021 04:45:36 +0100 Subject: [PATCH 065/335] R3F Compat - Update to the R3F weapons 3.7.1 (#8078) --- optionals/compat_r3f/CfgAmmo.hpp | 118 ++++------ optionals/compat_r3f/CfgMagazines.hpp | 54 +---- optionals/compat_r3f/CfgWeapons.hpp | 315 ++++++++++++-------------- optionals/compat_r3f/config.cpp | 2 +- 4 files changed, 197 insertions(+), 292 deletions(-) diff --git a/optionals/compat_r3f/CfgAmmo.hpp b/optionals/compat_r3f/CfgAmmo.hpp index 1145e9ab0f..085d15edd2 100644 --- a/optionals/compat_r3f/CfgAmmo.hpp +++ b/optionals/compat_r3f/CfgAmmo.hpp @@ -1,9 +1,7 @@ class CfgAmmo { class Default; class BulletBase; - class R3F_9x19_Ball: BulletBase { // https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L370 - hit = 6; // R3F default value 13, BI default value 5 - typicalSpeed = 350; // R3F config + class R3F_9x19_Ball: BulletBase { // https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L495 airFriction = -0.00201185; // ACE3 value, default -0.001413 ACE_caliber = 9.017; ACE_bulletLength = 15.494; @@ -13,12 +11,10 @@ class CfgAmmo { ACE_velocityBoundaries[] = {}; ACE_standardAtmosphere = "ASM"; ACE_dragModel = 1; - ACE_muzzleVelocities[] = {340, 370, 400}; - ACE_barrelLengths[] = {101.6, 127.0, 228.6}; + ACE_muzzleVelocities[] = {341, 371, 401}; // at 21°C, at 15°C 400 m/s according with the R3F_MP5A5 initSpeed + ACE_barrelLengths[] = {101.6, 127, 225}; }; - class R3F_556x45_Ball: BulletBase { // M855 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L9 - typicalSpeed = 930; // R3F config - airFriction = -0.00130094; // ACE3 value, default -0.001625 + class R3F_556x45_Ball: BulletBase { // M855 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L117 ACE_caliber = 5.69; ACE_bulletLength = 23.012; ACE_bulletMass = 4.0176; @@ -30,12 +26,10 @@ class CfgAmmo { ACE_muzzleVelocities[] = {723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; ACE_barrelLengths[] = {210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; }; - class R3F_762x51_Ball: BulletBase { // M80 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L155 - typicalSpeed = 820; // R3F config - airFriction = -0.00103711; // ACE3 value, default -0.00095 - ACE_caliber = 7.823; - ACE_bulletLength = 28.956; - ACE_bulletMass = 9.4608; + class R3F_762x51_Ball: BulletBase { // M80 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L280 + ACE_caliber = 7.82; + ACE_bulletLength = 28.96; + ACE_bulletMass = 9.46; ACE_ammoTempMuzzleVelocityShifts[] = {-18.91, -17.83, -15.21, -12.48, -09.34, -05.16, 0, 6.11, 13.60, 22.81, 33.83}; ACE_ballisticCoefficients[] = {0.2}; ACE_velocityBoundaries[] = {}; @@ -44,12 +38,10 @@ class CfgAmmo { ACE_muzzleVelocities[] = {700, 800, 820, 833, 845}; ACE_barrelLengths[] = {254.0, 406.4, 508.0, 609.6, 660.4}; }; - class R3F_762x51_Ball2: R3F_762x51_Ball { // M993 AP https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L226 - typicalSpeed = 850; // R3F config - airFriction = -0.00110718; // ACE3 value, default -0.00095 - ACE_caliber = 7.823; - ACE_bulletLength = 31.496; - ACE_bulletMass = 8.22946157; + class R3F_762x51_Ball2: R3F_762x51_Ball { // M993 AP https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L351 + ACE_caliber = 7.82; + ACE_bulletLength = 31.5; + ACE_bulletMass = 8.23; ACE_ammoTempMuzzleVelocityShifts[] = {-18.91, -17.83, -15.21, -12.48, -09.34, -05.16, 0, 6.11, 13.60, 22.81, 33.83}; ACE_ballisticCoefficients[] = {0.359}; ACE_velocityBoundaries[] = {}; @@ -58,15 +50,22 @@ class CfgAmmo { ACE_muzzleVelocities[] = {850}; ACE_barrelLengths[] = {650}; }; - class R3F_762x51_Minimi_Ball: R3F_762x51_Ball { // M80 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L155 - airFriction = -0.00103711; // ACE3 value, default -0.002000 + class R3F_762x51_Ball_SCAR: BulletBase { // M80 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L280 + ACE_caliber = 7.82; + ACE_bulletLength = 28.96; + ACE_bulletMass = 9.46; + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.8, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[] = {0.2}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ICAO"; + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {708, 808, 828, 841, 853}; // at 21°C, at 15°C 820 m/s according with the R3F SCAR-H initSpeed + ACE_barrelLengths[] = {254.0, 406.4, 508.0, 609.6, 660.4}; }; - class R3F_127x99_Ball: BulletBase { // M33 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L510 - typicalSpeed = 780; // R3F config - airFriction = -0.00062115; // ACE3 value, default -0.00086 - ACE_caliber = 12.954; - ACE_bulletLength = 58.674; - ACE_bulletMass = 41.9256; + class R3F_127x99_Ball: BulletBase { // PGM Hécate 2 M33 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L635 + ACE_caliber = 12.95; + ACE_bulletLength = 58.67; + ACE_bulletMass = 41.93; ACE_muzzleVelocityVariationSD = 0.35; ACE_ammoTempMuzzleVelocityShifts[] = {-18.91, -17.83, -15.21, -12.48, -09.34, -05.16, 0, 6.11, 13.60, 22.81, 33.83}; ACE_ballisticCoefficients[] = {0.670}; @@ -76,27 +75,11 @@ class CfgAmmo { ACE_muzzleVelocities[] = {780}; ACE_barrelLengths[] = {700}; }; - class R3F_127x99_PEI: R3F_127x99_Ball { // M33 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L510 - typicalSpeed = 780; // R3F config - airFriction = -0.00062115; // ACE3 value, default -0.00086 - ACE_caliber = 12.954; - ACE_bulletLength = 58.674; - ACE_bulletMass = 41.9256; - ACE_muzzleVelocityVariationSD = 0.4; - ACE_ammoTempMuzzleVelocityShifts[] = {-18.91, -17.83, -15.21, -12.48, -09.34, -05.16, 0, 6.11, 13.60, 22.81, 33.83}; - ACE_ballisticCoefficients[] = {0.670}; - ACE_velocityBoundaries[] = {}; - ACE_standardAtmosphere = "ASM"; - ACE_dragModel = 1; - ACE_muzzleVelocities[] = {780}; - ACE_barrelLengths[] = {700}; - }; - class R3F_127x99_Ball2: BulletBase { // M33 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L510 - typicalSpeed = 850; // R3F config - airFriction = -0.000601; // ACE3 value, default -0.00086 - ACE_caliber = 12.954; - ACE_bulletLength = 58.674; - ACE_bulletMass = 41.9256; + class R3F_127x99_Ball2: BulletBase { // BARRETT M107 M33 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L635 + airFriction = -0.000618; // ACE3 value, default -0.00086 + ACE_caliber = 12.95; + ACE_bulletLength = 58.67; + ACE_bulletMass = 41.93; ACE_muzzleVelocityVariationSD = 0.35; ACE_ammoTempMuzzleVelocityShifts[] = {-18.91, -17.83, -15.21, -12.48, -09.34, -05.16, 0, 6.11, 13.60, 22.81, 33.83}; ACE_ballisticCoefficients[] = {0.670}; @@ -106,34 +89,19 @@ class CfgAmmo { ACE_muzzleVelocities[] = {850}; ACE_barrelLengths[] = {736.6}; }; - class R3F_127x99_PEI2: R3F_127x99_Ball2 { // M33 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L510 - typicalSpeed = 850; // R3F config - airFriction = -0.000601; // ACE3 value, default -0.00086 - ACE_caliber = 12.954; - ACE_bulletLength = 58.674; - ACE_bulletMass = 41.9256; - ACE_muzzleVelocityVariationSD = 0.4; - ACE_ammoTempMuzzleVelocityShifts[] = {-18.91, -17.83, -15.21, -12.48, -09.34, -05.16, 0, 6.11, 13.60, 22.81, 33.83}; - ACE_ballisticCoefficients[] = {0.670}; + class R3F_127x99_Ball3: BulletBase { // McMillan TAC-50 AMAX https://web.archive.org/web/20080527201619/http://mcmfamily.com/pdfs/Tac-50%20Technical%20Data.pdf + typicalSpeed = 823; // R3F default value 820 + airFriction = -0.000388; // R3F default value -0.00086 + ACE_caliber = 12.98; + ACE_bulletLength = 64.52; + ACE_bulletMass = 48.6; + ACE_muzzleVelocityVariationSD = 0.2; + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.8, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[] = {1.05}; ACE_velocityBoundaries[] = {}; - ACE_standardAtmosphere = "ASM"; + ACE_standardAtmosphere = "ICAO"; ACE_dragModel = 1; - ACE_muzzleVelocities[] = {850}; - ACE_barrelLengths[] = {736.6}; - }; - class R3F_127x99_Ball3: BulletBase { // M33 https://github.com/acemod/ACE3/blob/master/addons/ballistics/CfgAmmo.hpp#L510 - typicalSpeed = 820; // R3F config - airFriction = -0.00060964; // ACE3 value, default -0.00086 - ACE_caliber = 12.954; - ACE_bulletLength = 58.674; - ACE_bulletMass = 41.9256; - ACE_muzzleVelocityVariationSD = 0.35; - ACE_ammoTempMuzzleVelocityShifts[] = {-18.91, -17.83, -15.21, -12.48, -09.34, -05.16, 0, 6.11, 13.60, 22.81, 33.83}; - ACE_ballisticCoefficients[] = {0.670}; - ACE_velocityBoundaries[] = {}; - ACE_standardAtmosphere = "ASM"; - ACE_dragModel = 1; - ACE_muzzleVelocities[] = {820}; + ACE_muzzleVelocities[] = {831}; // at 21°C, at 15°C 823 m/s (2700 fps) according with the R3F_TAC50 initSpeed ACE_barrelLengths[] = {736.6}; }; }; diff --git a/optionals/compat_r3f/CfgMagazines.hpp b/optionals/compat_r3f/CfgMagazines.hpp index 3a36eadfed..ea20d8c06d 100644 --- a/optionals/compat_r3f/CfgMagazines.hpp +++ b/optionals/compat_r3f/CfgMagazines.hpp @@ -4,59 +4,15 @@ class CfgMagazines { scope = 1; // Game Update 1.84: "Tweaked: Magazines can now be hidden in Virtual Arsenal by setting their scope to 1", R3F default value 2 }; class R3F_15Rnd_9x19_PAMAS: CA_magazine { - initSpeed = 350; // R3F config + initSpeed = 368; // according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C), R3F default value 350 }; class R3F_15Rnd_9x19_HKUSP: CA_magazine { - initSpeed = 350; // R3F config + initSpeed = 363; // according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C), R3F default value 350 }; class R3F_17Rnd_9x19_G17: CA_magazine { - initSpeed = 350; // R3F config + initSpeed = 355; // according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C), R3F default value 350 }; - class R3F_30Rnd_9x19_MP5: CA_magazine { - initSpeed = 400; // R3F config - }; - class R3F_25Rnd_556x45_FAMAS: CA_magazine { // AtragMx GunList: 5.56x45mm M855 - initSpeed = 960; // R3F config - }; - class R3F_25Rnd_556x45_TRACER_FAMAS: R3F_25Rnd_556x45_FAMAS {}; // AtragMx GunList: 5.56x45mm M855 - class R3F_30Rnd_556x45_FAMAS: CA_magazine { // AtragMx GunList: 5.56x45mm M855 - initSpeed = 925; // R3F config - }; - class R3F_30Rnd_556x45_TRACER_FAMAS: R3F_30Rnd_556x45_FAMAS {}; // AtragMx GunList: 5.56x45mm M855 - class R3F_30Rnd_556x45_HK416: CA_magazine { // AtragMx GunList: 5.56x45mm M855 - initSpeed = 850; // R3F config - }; - class R3F_30Rnd_556x45_TRACER_HK416: R3F_30Rnd_556x45_HK416 {}; // AtragMx GunList: 5.56x45mm M855 - class R3F_30Rnd_556x45_SIG551: CA_magazine { // AtragMx GunList: 5.56x45mm M855 - initSpeed = 850; // R3F config - }; - class R3F_30Rnd_556x45_TRACER_SIG551: R3F_30Rnd_556x45_SIG551 {}; // AtragMx GunList: 5.56x45mm M855 - class R3F_10Rnd_762x51_FRF2: CA_magazine { // AtragMx GunList: R3F FRF2 M993 - initSpeed = 850; // R3F config - }; - class R3F_200Rnd_556x45_MINIMI: CA_magazine { // AtragMx GunList: 5.56x45mm M855 - initSpeed = 915; // R3F config - }; - class R3F_100Rnd_762x51_MINIMI: CA_magazine { // AtragMx GunList: 7.62x51mm M80 - initSpeed = 820; // R3F config - }; - class R3F_20Rnd_762x51_HK417: CA_magazine { // AtragMx GunList: 7.62x51mm M80 / HK417L 20": R3F HK417L M80 - initSpeed = 820; // R3F config - }; - class R3F_20Rnd_762x51_TRACER_HK417: R3F_20Rnd_762x51_HK417 {}; // AtragMx GunList: 7.62x51mm M80 / HK417L 20": R3F HK417L M80 - class R3F_7Rnd_127x99_PGM: CA_magazine { // AtragMx GunList: R3F PGM M33 - initSpeed = 780; // R3F config - }; - class R3F_7Rnd_127x99_PEI_PGM: R3F_7Rnd_127x99_PGM { // AtragMx GunList: R3F PGM M33 - initSpeed = 780; // R3F config - }; - class R3F_10Rnd_127x99_M107: CA_magazine { // AtragMx GunList: R3F M107 M33 - initSpeed = 850; // R3F config - }; - class R3F_10Rnd_127x99_PEI_M107: R3F_10Rnd_127x99_M107 { // AtragMx GunList: R3F M107 M33 - initSpeed = 850; // R3F config - }; - class R3F_5Rnd_127x99_TAC50: CA_magazine { // AtragMx GunList: R3F TAC50 M33 - initSpeed = 820; // R3F config + class R3F_5Rnd_127x99_TAC50: CA_magazine { // AtragMx GunList: R3F TAC50 AMAX + initSpeed = 823; // 2700 fps according with the McMillan Tactical Products specification and the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C), R3F default value 820 }; }; diff --git a/optionals/compat_r3f/CfgWeapons.hpp b/optionals/compat_r3f/CfgWeapons.hpp index e25f959009..1f8523f802 100644 --- a/optionals/compat_r3f/CfgWeapons.hpp +++ b/optionals/compat_r3f/CfgWeapons.hpp @@ -1,31 +1,21 @@ class Mode_SemiAuto; -class Mode_Burst; -class Mode_FullAuto; class CfgWeapons { class Pistol_Base_F; class Rifle_Base_F; + class Rifle_Long_Base_F; class R3F_Famas_F1: Rifle_Base_F { ACE_RailHeightAboveBore = 10.1796; ACE_barrelTwist = 304.8; // 1:12" ACE_barrelLength = 488.0; muzzles[] = {"this"}; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.74); // 3.1 MOA*0.562, R3F default value 0.00087 (2.99 MOA) - }; - class Burst: Mode_Burst { - dispersion = MOA_TO_RAD(1.74); // 3.1 MOA*0.562, R3F default value 0.0035 (12 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.74); // 3.1 MOA*0.562, R3F default value 0.005 (17.2 MOA) - }; }; class R3F_Famas_F1_M203: R3F_Famas_F1 { muzzles[] = {"this","Lance_Grenades"}; }; class R3F_Famas_surb: R3F_Famas_F1 { // R3F FAMAS Surbaissé, should be FAMAS Valorisé : http://narval34.free.fr/fiche_tech_famas.pdf ACE_RailHeightAboveBore = 5.08219; - ACE_barrelTwist = 228.6; // 1:9" FAMAS Surbaissé, should be 1:7" FAMAS Valorisé + ACE_barrelTwist = 177.8; // 1:7" FAMAS Valorisé ACE_barrelLength = 450.0; // 3D model with Beretta barrel : FAMAS Valorisé }; class R3F_Famas_surb_M203: R3F_Famas_surb { @@ -35,15 +25,6 @@ class CfgWeapons { ACE_RailHeightAboveBore = 10.1808; ACE_barrelTwist = 228.6; // 1:9" ACE_barrelLength = 488.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.74); // 3.1 MOA*0.562, R3F default value 0.00087 (2.99 MOA) - }; - class Burst: Mode_Burst { - dispersion = MOA_TO_RAD(1.74); // 3.1 MOA*0.562, R3F default value 0.0035 (12 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.74); // 3.1 MOA*0.562, R3F default value 0.005 (17.2 MOA) - }; }; class R3F_Famas_G2_M203: R3F_Famas_G2 { muzzles[] = {"this","Lance_Grenades"}; @@ -70,160 +51,126 @@ class CfgWeapons { ACE_RailHeightAboveBore = 1.79013; ACE_barrelTwist = 294.6; ACE_barrelLength = 650.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.88); // 1.56 MOA*0.562, R3F default value 9.9999997e-005 (0.34 MOA) - }; muzzles[] = {"this"}; }; class R3F_PGM_Hecate_II: Rifle_Base_F { ACE_RailHeightAboveBore = 1.84858; ACE_barrelTwist = 381.0; ACE_barrelLength = 700.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.58); // 1.04 MOA*0.562, R3F default value 0.00018 (0.62 MOA) - }; muzzles[] = {"this"}; }; class R3F_M107: Rifle_Base_F { ACE_RailHeightAboveBore = 3.13099; ACE_barrelTwist = 381.0; ACE_barrelLength = 736.6; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.5); // 0.9 MOA*0.562, R3F default value 0.00030 (1.03 MOA) - }; muzzles[] = {"this"}; }; class R3F_TAC50: Rifle_Base_F { ACE_RailHeightAboveBore = 2.99563; ACE_barrelTwist = 381.0; ACE_barrelLength = 736.6; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.53); // 0.95 MOA*0.562, R3F default value 0.00015 (0.52 MOA) - }; muzzles[] = {"this"}; }; - class R3F_Minimi: Rifle_Base_F { + class R3F_Minimi: Rifle_Base_F { // FN HERSTAL Minimi 5.56 Mk3 https://www.fnherstal.com/sites/default/files/2020-06/technical-data-fn-minimi-556-mk3.pdf ACE_RailHeightAboveBore = 3.81385; ACE_barrelTwist = 177.8; - ACE_barrelLength = 347.98; + ACE_barrelLength = 349; muzzles[] = {"this"}; - initSpeed = 915; // R3F config - class manual: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.92); // 3.41 MOA*0.562, R3F default value 0.0008 (2.75 MOA) - }; }; - class R3F_Minimi_HG: R3F_Minimi { - class manual: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.92); // 3.41 MOA*0.562, R3F default value 0.0008 (2.75 MOA) - }; - }; - class R3F_Minimi_762: R3F_Minimi { + class R3F_Minimi_762: R3F_Minimi { // FN HERSTAL Minimi 7.62 Mk3 https://www.fnherstal.com/sites/default/files/2020-06/technical-data-fn-minimi-762-mk3.pdf ACE_RailHeightAboveBore = 3.80834; ACE_barrelTwist = 304.8; - ACE_barrelLength = 502.92; - initSpeed = 820; // R3F config - class manual: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.56); // 2.77 MOA*0.562, R3F default value 0.002 (6.88 MOA) - }; + ACE_barrelLength = 422; }; - class R3F_Minimi_762_HG: R3F_Minimi_762 { - class manual: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.56); // 2.77 MOA*0.562, R3F default value 0.002 (6.88 MOA) - }; - }; - class R3F_HK417M: Rifle_Base_F { + class R3F_HK417M: Rifle_Base_F { // https://www.heckler-koch.com/ ACE_RailHeightAboveBore = 3.23377; ACE_barrelTwist = 279.4; - ACE_barrelLength = 406.0; + ACE_barrelLength = 406.4; muzzles[] = {"this"}; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.62); // 2.89 MOA*0.562, R3F default value 0.001 (3.44 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.62); // 2.89 MOA*0.562, R3F default value 0.0025 (8.6 MOA) - }; }; class R3F_HK417S_HG: R3F_HK417M { - ACE_barrelLength = 305.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.9); // 3.4 MOA*0.562, R3F default value 0.002 (6.88 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.9); // 3.4 MOA*0.562, R3F default value 0.007 (24.06 MOA) - }; + ACE_barrelLength = 304.8; }; class R3F_HK417L: R3F_HK417M { ACE_barrelLength = 508.0; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(0.93); // 1.66 MOA*0.562, R3F default value 0.0002 (0.69 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(0.93); // 1.66 MOA*0.562, R3F default value 0.0025 (8.6 MOA) - }; }; class R3F_HK416M: Rifle_Base_F { ACE_RailHeightAboveBore = 2.84776; ACE_barrelTwist = 177.8; ACE_barrelLength = 368.3; muzzles[] = {"this"}; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.87); // 3.32 MOA*0.562, R3F default value 0.00087 (2.99 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.87); // 3.32 MOA*0.562, R3F default value 0.005 (17.2 MOA) - }; }; class R3F_HK416M_M203: R3F_HK416M { muzzles[] = {"this","Lance_Grenades"}; }; - class R3F_HK416S_HG: R3F_HK416M { + class R3F_HK416M_HG: R3F_HK416M {}; + class R3F_HK416S_HG: R3F_HK416M_HG { ACE_barrelLength = 279.4; - class Single: Single { - dispersion = MOA_TO_RAD(2.12); // 3.78 MOA*0.562, R3F default value 0.00087 (2.99 MOA) - }; - class FullAuto: FullAuto { - dispersion = MOA_TO_RAD(2.12); // 3.78 MOA*0.562, R3F default value 0.005 (17.2 MOA) - }; }; - class R3F_SIG551: Rifle_Base_F { + class R3F_SIG551: Rifle_Base_F { // http://www.sigsauer.swiss ACE_RailHeightAboveBore = 3.95288; ACE_barrelTwist = 177.8; - ACE_barrelLength = 363.0; + ACE_barrelLength = 363.5; // SG551 SB http://www.sigsauer.swiss/en/accessories-conversion-kits.php muzzles[] = {"this"}; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(1.88); // 3.34 MOA*0.562, R3F default value 0.00087 (2.99 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(1.88); // 3.34 MOA*0.562, R3F default value 0.005 (17.2 MOA) - }; }; - class R3F_MP5SD: Rifle_Base_F { + class R3F_MP5SD: Rifle_Base_F { // https://www.heckler-koch.com/en/products/military/submachine-guns/mp5/mp5sd/overview.html ACE_RailHeightAboveBore = 4.21816; ACE_barrelTwist = 254.0; - ACE_barrelLength = 144.78; + ACE_barrelLength = 146; + initSpeed = -0.94; // 400*0.94= 376 m/s according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C), R3F default value 0 muzzles[] = {"this"}; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(7.73); // 13.75 MOA*0.562 (a square of 10/10cm at 50 meters), R3F default value 0.004 (13.75 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(7.73); // 13.75 MOA*0.562 (a square of 10/10cm at 50 meters), R3F default value 0.007 (24.06 MOA) - }; }; - class R3F_MP5A5: R3F_MP5SD { - ACE_barrelLength = 226.06; + class R3F_MP5A5: R3F_MP5SD { // https://www.heckler-koch.com/en/products/military/submachine-guns/mp5/mp5/overview.html + ACE_barrelLength = 225; + initSpeed = -1; // 400 m/s according with the ACE_ammoTempMuzzleVelocityShifts at the normal conditions (15°C), R3F default value 0 muzzles[] = {"this"}; - class Single: Mode_SemiAuto { - dispersion = MOA_TO_RAD(7.73); // 13.75 MOA*0.562 (a square of 10/10cm at 50 meters), R3F default value 0.004 (13.75 MOA) - }; - class FullAuto: Mode_FullAuto { - dispersion = MOA_TO_RAD(7.73); // 13.75 MOA*0.562 (a square of 10/10cm at 50 meters), R3F default value 0.007 (24.06 MOA) - }; }; - class R3F_M4S90: Rifle_Base_F { + class R3F_M4S90: Rifle_Base_F { // https://www.benelli.it ACE_RailHeightAboveBore = 1.86213; ACE_twistDirection = 0; ACE_barrelTwist = 0; - ACE_barrelLength = 144.78; + ACE_barrelLength = 470; + }; + class R3F_SCAR_H_PR_20cps_base: Rifle_Base_F { // FN HERSTAL https://www.fnherstal.com/sites/default/files/2020-06/technical-data-fn-scar-h-pr_0.pdf + ACE_barrelTwist = 279.4; + ACE_barrelLength = 508; + muzzles[] = {"this"}; + }; + class R3F_SCAR_H_PR_20cps_recup_base: Rifle_Base_F { + ACE_barrelTwist = 279.4; + ACE_barrelLength = 508; + muzzles[] = {"this"}; + }; + class R3F_SCAR_H_CAM_base: Rifle_Base_F { // FN HERSTAL https://www.fnherstal.com/sites/default/files/2020-06/technical-data-fn-scar-h_0.pdf + ACE_barrelTwist = 304.8; + ACE_barrelLength = 330.2; + muzzles[] = {"this"}; + }; + class R3F_SCAR_H_CAM_LG_GHILLIE: R3F_SCAR_H_CAM_base { + muzzles[] = {"this", "EGLM"}; + }; + class R3F_SCAR_H_CAM_LG: R3F_SCAR_H_CAM_base { + muzzles[] = {"this", "EGLM"}; + }; + class R3F_SCAR_L_CAM_base: Rifle_Base_F { // FN HERSTAL https://www.fnherstal.com/sites/default/files/2020-06/technical-data-fn-scar-l_1.pdf + ACE_barrelTwist = 177.8; + ACE_barrelLength = 368.3; + muzzles[] = {"this"}; + }; + class R3F_SCAR_L_CAM_ghillie_LG: R3F_SCAR_L_CAM_base { + muzzles[] = {"this", "EGLM"}; + }; + class R3F_SCAR_L_CQC_CAM: R3F_SCAR_L_CAM_base { + ACE_barrelLength = 254; + }; + class R3F_SCAR_L_CQC_LG_CAM: R3F_SCAR_L_CAM_base { + ACE_barrelLength = 254; + muzzles[] = {"this", "EGLM"}; + }; + class R3F_FN_MAG58: Rifle_Long_Base_F { // FN HERSTAL https://www.fnherstal.com/sites/default/files/2020-10/technical-data-fn-mag-1.pdf + ACE_barrelTwist = 304.8; + ACE_barrelLength = 630; + muzzles[] = {"this"}; }; class R3F_PAMAS: Pistol_Base_F { ACE_barrelTwist = 250.0; @@ -248,9 +195,6 @@ class CfgWeapons { ACE_barrelLength = 114.0; muzzles[] = {"this"}; initSpeed = -1.0; // default 410 - class Single: Mode_SemiAuto { - dispersion=0.0029; // R3F default value, 9.97 MOA (a square of 7.25/7.25cm at 25 meters) - }; }; class ItemCore; class InventoryOpticsItem_Base_F; @@ -284,48 +228,38 @@ class CfgWeapons { class OpticsModes { class Felin {}; class Oeilleton: Felin { - opticsID=2; - opticsDisplayName=""; - useModelOptics=0; - opticsPPEffects[]={}; - opticsFlare=0; - opticsDisablePeripherialVision=0; - opticsZoomMin=0.25; - opticsZoomMax=1.25; - opticsZoomInit=0.75; - memoryPointCamera="eye_Oeilleton"; - visionMode[]={}; - discretefov[]={}; - discreteDistance[]={200}; - discreteDistanceInitIndex=0; - distanceZoomMin=200; - distanceZoomMax=200; - discreteInitIndex=0; - cameraDir=""; + opticsID = 2; + opticsDisplayName = ""; + useModelOptics = 0; + opticsPPEffects[] = {}; + opticsFlare = 0; + opticsDisablePeripherialVision = 0; + opticsZoomMin = 0.25; + opticsZoomMax = 1.25; + opticsZoomInit = 0.75; + memoryPointCamera = "eye_Oeilleton"; + visionMode[] = {}; + discretefov[] = {}; + discreteDistance[] = {200}; + discreteDistanceInitIndex = 0; + distanceZoomMin = 200; + distanceZoomMax = 200; + discreteInitIndex = 0; + cameraDir = ""; }; }; }; }; class R3F_J8: ItemCore { // http://www.scrome.com/assets/templates/flexibility/pdf/Scrome_Marksman_Scope_LTE_Datasheet_GB.pdf - ACE_ScopeHeightAboveRail = 4.474; // Inaccurate BDC reticle, designed to work with the vanilla ballistic and R3F values. + ACE_ScopeHeightAboveRail = -2.237; // Off-center BDC reticle designed to work with the vanilla ballistic and R3F values only. ACE_ScopeAdjust_Vertical[] = {-10, 10}; ACE_ScopeAdjust_Horizontal[] = {-10, 10}; ACE_ScopeAdjust_VerticalIncrement = 0.1; ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class J8 { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; }; class R3F_J8_MILDOT: R3F_J8 { + ACE_ScopeHeightAboveRail = 4.474; ACE_ScopeAdjust_Vertical[] = {0, 20}; - ACE_ScopeAdjust_Horizontal[] = {-10, 10}; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo: InventoryOpticsItem_Base_F { class OpticsModes { class J8_MILDOT { @@ -336,27 +270,14 @@ class CfgWeapons { }; }; class R3F_J10: ItemCore { // http://www.scrome.com/assets/templates/flexibility/pdf/Scrome_Marksman_Scope_LTE_Datasheet_GB.pdf - ACE_ScopeZeroRange = 1400; // Inaccurate BDC reticle, designed to work with the vanilla ballistic and R3F values. - ACE_ScopeHeightAboveRail = 4.474; + ACE_ScopeHeightAboveRail = 4.474; // BDC reticle designed to work with the vanilla ballistic and R3F values only. ACE_ScopeAdjust_Vertical[] = {-10, 10}; ACE_ScopeAdjust_Horizontal[] = {-10, 10}; ACE_ScopeAdjust_VerticalIncrement = 0.1; ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class J10 { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; }; class R3F_J10_MILDOT: R3F_J10 { - ACE_ScopeZeroRange = 100; ACE_ScopeAdjust_Vertical[] = {0, 20}; - ACE_ScopeAdjust_Horizontal[] = {-10, 10}; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; class ItemInfo: InventoryOpticsItem_Base_F { class OpticsModes { class J10_MILDOT { @@ -414,6 +335,34 @@ class CfgWeapons { class R3F_OB50: ItemCore { ACE_ScopeHeightAboveRail = 4.13217; }; + class R3F_SB_PM: ItemCore { // Off-center BDC reticle designed to work with the vanilla ballistic and R3F values only. + ACE_ScopeAdjust_Vertical[] = {0, 12}; // https://www.schmidtundbender.de/en/products/police-military-forces/1-8x24-pm-ii-shortdot-dual-cc.html + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class SB_PM { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + distanceZoomMin = 100; + distanceZoomMax = 1200; + }; + }; + }; + }; + class R3F_SB_PM_BLACK: R3F_SB_PM { + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class SB_PM { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + distanceZoomMin = 100; + distanceZoomMax = 1200; + }; + }; + }; + }; class InventoryMuzzleItem_Base_F; class R3F_SILENCIEUX_HK416: ItemCore { class ItemInfo: InventoryMuzzleItem_Base_F { @@ -511,27 +460,59 @@ class CfgWeapons { }; }; }; + class R3F_SILENCIEUX_SCAR_H_PR: ItemCore { + class ItemInfo: InventoryMuzzleItem_Base_F { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.95f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "0.95f"; + recoilProneCoef = "0.95f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; }; class ACE_ATragMX_Presets { class R3F_PGM_Hecate_II { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation - preset[] = {"R3F PGM M33", 780, 100, 0.0845596, -0.00062115, 6.35, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM", {{-15, 761},{0, 768},{10, 775},{15, 780},{25, 794},{30, 803},{35, 814}}, {{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0}}}; + preset[] = {"R3F PGM M33", 780, 100, 0.0845596, -0.00086, 6.35, 0, 2, 10, 120, 0, 0, 41.92, 12.18, 38.10, 0.670, 1, "ASM", {{-15, 761},{0, 768},{10, 775},{15, 780},{25, 794},{30, 803},{35, 814}}, {{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0}}}; }; class R3F_M107 { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation - preset[] = {"R3F M107 M33", 850, 100, 0.0841653, -0.000601, 7.62, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM", {{-15, 831},{0, 838},{10, 845},{15, 850},{25, 864},{30, 873},{35, 884}}, {{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0}}}; + preset[] = {"R3F M107 M33", 850, 100, 0.0841653, -0.00061813, 7.62, 0, 2, 10, 120, 0, 0, 41.92, 12.19, 38.10, 0.670, 1, "ASM", {{-15, 831},{0, 838},{10, 845},{15, 850},{25, 864},{30, 873},{35, 884}}, {{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0}}}; }; class R3F_TAC50 { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation - preset[] = {"R3F TAC50 M33", 820, 100, 0.0872461, -0.00060964, 7.62, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM", {{-15, 801},{0, 808},{10, 815},{15, 820},{25, 834},{30, 843},{35, 854}}, {{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0}}}; + preset[] = {"R3F TAC50 AMAX", 823, 100, 0.0848384, -0.00038793, 7.37, 0, 2, 10, 120, 0, 0, 48.6, 12.44, 38.10, 1.050, 1, "ICAO", {{-15, 804},{0, 811},{10, 818},{15, 823},{25, 837},{30, 846},{35, 857}}, {{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0},{0, 0}}}; }; class R3F_FRF2 { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation - preset[] = {"R3F FRF2 M993", 850, 100, 0.0783702, -0.00110718, 6.35, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 29.46, 0.359, 1, "ICAO", {{-15, 831},{0, 838},{10, 845},{15, 850},{25, 864},{30, 873},{35, 884}}, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}}; + preset[] = {"R3F FRF2 M993", 850, 100, 0.0783702, -0.00095, 6.35, 0, 2, 10, 120, 0, 0, 8.23, 7.35, 29.46, 0.359, 1, "ICAO", {{-15, 831},{0, 838},{10, 845},{15, 850},{25, 864},{30, 873},{35, 884}}, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}}; }; class R3F_HK417L { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation - preset[] = {"R3F HK417L M80", 820, 100, 0.0884448, -0.00103711, 7.62, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 27.94, 0.398, 1, "ICAO", {{-15, 801},{0, 808},{10, 815},{15, 820},{25, 834},{30, 843},{35, 854}}, {{200, 0.398}, {400, 0.398}, {600, 0.398}, {800, 0.39}, {1000, 0.383}, {1200, 0.379}, {1400, 0.378}}}; + preset[] = {"R3F HK417L M80", 820, 100, 0.0884758, -0.00095, 7.62, 0, 2, 10, 120, 0, 0, 9.46, 8.02, 27.94, 0.394, 1, "ICAO", {{-15, 801},{0, 808},{10, 815},{15, 820},{25, 834},{30, 843},{35, 854}}, {{0, 0.394}, {700, 0.394}, {800, 0.391}, {900, 0.386}, {1000, 0.383}, {1100, 0.381}, {1300, 0.379}}}; }; }; diff --git a/optionals/compat_r3f/config.cpp b/optionals/compat_r3f/config.cpp index 90218d7f04..2790068152 100644 --- a/optionals/compat_r3f/config.cpp +++ b/optionals/compat_r3f/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"r3f_armes_c", "R3F_G17_addons", "r3f_acc"}; + requiredAddons[] = {"r3f_armes_c", "r3f_acc", "R3F_G17_addons", "R3F_G_SCAR", "R3F_SCAR_H", "R3F_SCAR_L", "R3F_FN_MAG"}; author = ECSTRING(common,ACETeam); authors[] = {"Ruthberg"}; url = ECSTRING(main,URL); From 56850cd8ad7a392bce0adc72ac8002626c6c802d Mon Sep 17 00:00:00 2001 From: ace3mod Date: Mon, 8 Feb 2021 04:46:16 +0100 Subject: [PATCH 066/335] [Docs] Update component dependencies Automatically committed through CI. [ci skip] --- docs/_includes/dependencies_list.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/dependencies_list.md b/docs/_includes/dependencies_list.md index 7d920e0108..ffdf6c5d9a 100644 --- a/docs/_includes/dependencies_list.md +++ b/docs/_includes/dependencies_list.md @@ -495,7 +495,7 @@ {% endif %} {% if include.component == "compat_r3f" %} -`r3f_armes_c`, `R3F_G17_addons`, `r3f_acc` +`r3f_armes_c`, `r3f_acc`, `R3F_G17_addons`, `R3F_G_SCAR`, `R3F_SCAR_H`, `R3F_SCAR_L`, `R3F_FN_MAG` {% endif %} {% if include.component == "compat_rh_acc" %} From cb870693fd946ab59fcd0e971e3e315cde1adbf9 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 13 Feb 2021 15:37:26 -0600 Subject: [PATCH 067/335] CSW - use preferred XEH format (#8112) --- addons/csw/CfgEventHandlers.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/csw/CfgEventHandlers.hpp b/addons/csw/CfgEventHandlers.hpp index afe6392a7c..e90bed419e 100644 --- a/addons/csw/CfgEventHandlers.hpp +++ b/addons/csw/CfgEventHandlers.hpp @@ -10,6 +10,6 @@ class Extended_PreInit_EventHandlers { }; class Extended_PostInit_EventHandlers { class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; From 111202971ba7edd5fe505a6ea5303a7ce485babd Mon Sep 17 00:00:00 2001 From: jonpas Date: Sun, 14 Feb 2021 04:28:58 +0100 Subject: [PATCH 068/335] Goggles - Allow wiping in more states (#8111) --- addons/goggles/CfgVehicles.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/goggles/CfgVehicles.hpp b/addons/goggles/CfgVehicles.hpp index c9cdf70293..68506d3269 100644 --- a/addons/goggles/CfgVehicles.hpp +++ b/addons/goggles/CfgVehicles.hpp @@ -7,6 +7,7 @@ class CfgVehicles { displayName = CSTRING(WipeGlasses); condition = QUOTE(GVAR(showClearGlasses) && {call FUNC(canWipeGlasses)}); statement = QUOTE(call FUNC(clearGlasses)); + exceptions[] = {"isNotInside", "isNotSitting", "isNotSwimming", "isNotEscorting"}; }; }; }; From f72175f823f7df07e248aa9de30474bc8608003b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 18 Feb 2021 12:53:22 -0600 Subject: [PATCH 069/335] Tools - Don't let mikro tools touch configs (#8093) --- tools/make.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make.py b/tools/make.py index a92a517ea5..d7ef417996 100644 --- a/tools/make.py +++ b/tools/make.py @@ -1268,7 +1268,7 @@ See the make.cfg file for additional build options. cmd = [makepboTool, "-P","-A","-X=*.backup", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"addons")] else: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S", "+Noisy", "+Clean", "-Warnings", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + cmd = [pboproject, "-B", "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S", "+Noisy", "+Clean", "-Warnings", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] color("grey") if quiet: From e8693c8db9c5d8d9f983cd138e732d013a8de37b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 18 Feb 2021 12:58:08 -0600 Subject: [PATCH 070/335] Various - Use configOf command for faster lookup (#8100) * configOf * replace some use of CBA_fnc_getObjectConfig --- .../functions/fnc_initEjectAction.sqf | 2 +- addons/artillerytables/XEH_postInit.sqf | 2 +- .../functions/fnc_interactMenuOpened.sqf | 2 +- addons/cargo/CfgEden.hpp | 4 ++-- addons/cargo/XEH_postInit.sqf | 12 +++++----- .../functions/fnc_addCargoVehiclesActions.sqf | 2 +- addons/cargo/functions/fnc_canLoadItemIn.sqf | 2 +- .../cargo/functions/fnc_getCargoSpaceLeft.sqf | 2 +- addons/cargo/functions/fnc_initVehicle.sqf | 2 +- addons/cargo/functions/fnc_paradropItem.sqf | 4 ++-- addons/cargo/functions/fnc_startLoadIn.sqf | 2 +- .../functions/fnc_validateCargoSpace.sqf | 2 +- addons/chemlights/functions/fnc_initIR.sqf | 2 +- .../common/functions/fnc_canGetInPosition.sqf | 2 +- addons/common/functions/fnc_claim.sqf | 2 +- .../common/functions/fnc_claimSafeServer.sqf | 2 +- addons/common/functions/fnc_fixPosition.sqf | 2 +- addons/common/functions/fnc_getAwakeAnim.sqf | 2 +- .../functions/fnc_getConfigCommander.sqf | 2 +- .../common/functions/fnc_getConfigGunner.sqf | 2 +- .../common/functions/fnc_getDoorTurrets.sqf | 2 +- addons/common/functions/fnc_getInPosition.sqf | 4 ++-- .../functions/fnc_getLightProperties.sqf | 2 +- addons/common/functions/fnc_getMarkerType.sqf | 22 +++++++++---------- addons/common/functions/fnc_getName.sqf | 2 +- .../common/functions/fnc_getPylonTurret.sqf | 2 +- .../fnc_getReflectorsWithSelections.sqf | 2 +- .../functions/fnc_getVehicleUAVCrew.sqf | 2 +- addons/common/functions/fnc_hasHatch.sqf | 2 +- addons/common/functions/fnc_isMedic.sqf | 2 +- .../fnc_lightIntensityFromObject.sqf | 2 +- .../common/functions/fnc_loadPersonLocal.sqf | 2 +- .../functions/fnc_moduleLSDVehicles.sqf | 2 +- .../functions/fnc_nearestVehiclesFreeSeat.sqf | 2 +- .../functions/fnc_dismount.sqf | 2 +- .../functions/fnc_vehicleDamage.sqf | 4 ++-- .../cookoff/functions/fnc_getVehicleAmmo.sqf | 2 +- addons/csw/functions/fnc_ai_handleFired.sqf | 4 ++-- .../functions/fnc_assemble_pickupTripod.sqf | 2 +- .../functions/fnc_assemble_pickupWeapon.sqf | 6 ++--- .../functions/fnc_reload_actionsUnload.sqf | 4 ++-- .../functions/fnc_reload_canLoadMagazine.sqf | 2 +- .../fnc_reload_getVehicleMagazine.sqf | 2 +- .../csw/functions/fnc_reload_loadMagazine.sqf | 4 ++-- .../fnc_staticWeaponInit_unloadExtraMags.sqf | 2 +- addons/dragging/functions/fnc_canCarry.sqf | 2 +- addons/dragging/functions/fnc_canDrag.sqf | 2 +- addons/dragging/functions/fnc_initObject.sqf | 2 +- addons/dragon/functions/fnc_onFired.sqf | 2 +- addons/fastroping/XEH_postInit.sqf | 2 +- .../functions/fnc_canDeployRopes.sqf | 2 +- .../functions/fnc_canPrepareFRIES.sqf | 2 +- .../fastroping/functions/fnc_canStowFRIES.sqf | 2 +- addons/fastroping/functions/fnc_cutRopes.sqf | 2 +- addons/fastroping/functions/fnc_deployAI.sqf | 2 +- .../fastroping/functions/fnc_deployRopes.sqf | 2 +- .../fastroping/functions/fnc_equipFRIES.sqf | 2 +- .../fastroping/functions/fnc_prepareFRIES.sqf | 2 +- addons/fastroping/functions/fnc_stowFRIES.sqf | 2 +- addons/fcs/functions/fnc_adjustRange.sqf | 2 +- .../fcs/functions/fnc_calculateSolution.sqf | 2 +- addons/fcs/functions/fnc_canUseFCS.sqf | 2 +- addons/fcs/functions/fnc_keyDown.sqf | 2 +- addons/fcs/functions/fnc_keyUp.sqf | 2 +- addons/fcs/functions/fnc_vehicleInit.sqf | 2 +- addons/gforces/XEH_postInit.sqf | 4 ++-- .../functions/fnc_applyGlassesEffect.sqf | 2 +- .../functions/fnc_flashbangExplosionEH.sqf | 2 +- addons/grenades/functions/fnc_incendiary.sqf | 2 +- addons/hearing/XEH_postInit.sqf | 2 +- .../fnc_updatePlayerVehAttenuation.sqf | 6 ++--- .../hellfire/functions/fnc_setupVehicle.sqf | 2 +- .../fnc_userActions_addHouseActions.sqf | 2 +- addons/interaction/CfgVehicles.hpp | 2 +- .../functions/fnc_addPassengersActions.sqf | 2 +- addons/interaction/functions/fnc_canPush.sqf | 2 +- .../functions/fnc_getVehiclePosComplex.sqf | 2 +- addons/interaction/functions/fnc_openDoor.sqf | 6 ++--- addons/map/XEH_postInitClient.sqf | 2 +- addons/medical_engine/XEH_postInit.sqf | 4 ++-- .../functions/fnc_getHitpointArmor.sqf | 2 +- addons/medical_status/XEH_preInit.sqf | 2 +- .../functions/fnc_isMedicalVehicle.sqf | 2 +- .../functions/fnc_loadUnit.sqf | 2 +- .../functions/fnc_unloadUnit.sqf | 2 +- addons/minedetector/XEH_postInit.sqf | 2 +- .../functions/fnc_SACLOS_onFired.sqf | 2 +- .../functions/fnc_ahr_onFired.sqf | 2 +- .../functions/fnc_wire_onFired.sqf | 2 +- .../functions/fnc_refreshGoggleType.sqf | 2 +- addons/pylons/functions/fnc_onButtonLoad.sqf | 2 +- addons/pylons/functions/fnc_showDialog.sqf | 2 +- .../functions/fnc_addFreeSeatsActions.sqf | 2 +- .../quickmount/functions/fnc_getInNearest.sqf | 2 +- addons/rearm/Cfg3DEN.hpp | 2 +- .../rearm/functions/fnc_addRearmActions.sqf | 6 ++--- .../functions/fnc_getNeedRearmMagazines.sqf | 2 +- addons/rearm/functions/fnc_getSupplyCount.sqf | 4 ++-- addons/rearm/functions/fnc_isSource.sqf | 2 +- addons/rearm/functions/fnc_makeSource.sqf | 2 +- addons/rearm/functions/fnc_rearm.sqf | 2 +- .../functions/fnc_rearmEntireVehicle.sqf | 2 +- .../rearm/functions/fnc_rearmSuccessLocal.sqf | 6 ++--- addons/rearm/functions/fnc_storeAmmo.sqf | 2 +- addons/rearm/functions/fnc_takeAmmo.sqf | 2 +- addons/refuel/Cfg3DEN.hpp | 4 ++-- addons/refuel/XEH_postInit.sqf | 2 +- addons/refuel/functions/fnc_getFuel.sqf | 2 +- addons/refuel/functions/fnc_makeSource.sqf | 2 +- .../functions/fnc_onMouseButtonDown.sqf | 2 +- addons/refuel/functions/fnc_refuel.sqf | 2 +- .../functions/fnc_startNozzleInHandsPFH.sqf | 2 +- addons/refuel/functions/fnc_takeNozzle.sqf | 4 ++-- addons/repair/CfgEden.hpp | 2 +- addons/repair/dev/draw_showRepairInfo.sqf | 2 +- addons/repair/functions/fnc_canMiscRepair.sqf | 2 +- addons/repair/functions/fnc_doRepair.sqf | 2 +- .../functions/fnc_getPostRepairDamage.sqf | 2 +- .../fnc_getWheelHitPointsWithSelections.sqf | 2 +- .../functions/fnc_isInRepairFacility.sqf | 2 +- .../repair/functions/fnc_isRepairVehicle.sqf | 2 +- .../functions/fnc_normalizeHitPoints.sqf | 2 +- addons/repair/functions/fnc_repair.sqf | 2 +- .../functions/fnc_setHitPointDamage.sqf | 2 +- .../functions/fnc_ui_updateWidget.sqf | 2 +- .../switchunits/functions/fnc_markAiOnMap.sqf | 2 +- .../functions/fnc_continueDiggingTrench.sqf | 4 ++-- .../trenches/functions/fnc_removeTrench.sqf | 2 +- addons/zeus/functions/fnc_bi_moduleMine.sqf | 2 +- .../functions/fnc_bi_moduleProjectile.sqf | 2 +- .../functions/fnc_moduleAddOrRemoveFRIES.sqf | 2 +- .../functions/fnc_moduleSuppressiveFire.sqf | 2 +- addons/zeus/functions/fnc_moduleToggleNvg.sqf | 3 +-- .../zeus/functions/fnc_ui_attributeCargo.sqf | 2 +- 134 files changed, 172 insertions(+), 173 deletions(-) diff --git a/addons/aircraft/functions/fnc_initEjectAction.sqf b/addons/aircraft/functions/fnc_initEjectAction.sqf index 8ec9e33ade..b453ce7704 100644 --- a/addons/aircraft/functions/fnc_initEjectAction.sqf +++ b/addons/aircraft/functions/fnc_initEjectAction.sqf @@ -19,7 +19,7 @@ params ["_vehicle"]; if (unitIsUAV _vehicle) exitWith {}; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _addAction = false; diff --git a/addons/artillerytables/XEH_postInit.sqf b/addons/artillerytables/XEH_postInit.sqf index 2f31655814..b558fb1096 100644 --- a/addons/artillerytables/XEH_postInit.sqf +++ b/addons/artillerytables/XEH_postInit.sqf @@ -15,7 +15,7 @@ if (GVAR(advancedCorrections)) then { ["LandVehicle", "init", { params ["_vehicle"]; - private _vehicleCfg = configFile >> "CfgVehicles" >> typeOf _vehicle; + private _vehicleCfg = configOf _vehicle; // config "ace_artillerytables_applyCorrections" [0 disabled, 1 enabled] falls back to artilleryScanner private _applyCorrections = if (isNumber (_vehicleCfg >> QGVAR(applyCorrections))) then { getNumber (_vehicleCfg >> QGVAR(applyCorrections)) diff --git a/addons/artillerytables/functions/fnc_interactMenuOpened.sqf b/addons/artillerytables/functions/fnc_interactMenuOpened.sqf index 849be932ce..8e396a0f13 100644 --- a/addons/artillerytables/functions/fnc_interactMenuOpened.sqf +++ b/addons/artillerytables/functions/fnc_interactMenuOpened.sqf @@ -26,7 +26,7 @@ private _rangeTablesShown = ace_player getVariable [QGVAR(rangeTablesShown), []] TRACE_2("searching for new vehicles",_vehicleAdded,_rangeTablesShown); { - private _vehicleCfg = configFile >> "CfgVehicles" >> typeOf _x; + private _vehicleCfg = configOf _x; // config "ace_artillerytables_showRangetable" [0 disabled, 1 enabled] falls back to artilleryScanner private _showRangetable = if (isNumber (_vehicleCfg >> QGVAR(showRangetable))) then { getNumber (_vehicleCfg >> QGVAR(showRangetable)) diff --git a/addons/cargo/CfgEden.hpp b/addons/cargo/CfgEden.hpp index 9144ba458b..a342215290 100644 --- a/addons/cargo/CfgEden.hpp +++ b/addons/cargo/CfgEden.hpp @@ -10,7 +10,7 @@ class Cfg3DEN { control = "Edit"; expression = QUOTE([ARR_2(_this,_value)] call DFUNC(setSpace);); - defaultValue = QUOTE(GET_NUMBER(configFile >> 'CfgVehicles' >> typeOf _this >> QQGVAR(space),0)); + defaultValue = QUOTE(GET_NUMBER(configOf _this >> QQGVAR(space),0)); validate = "number"; condition = "objectHasInventoryCargo"; @@ -24,7 +24,7 @@ class Cfg3DEN { // Expression only runs on the server, must handle actions for all machines and future JIPs (Why BI?!) expression = QUOTE([ARR_2(_this,_value)] call DFUNC(setSize);); - defaultValue = QUOTE(GET_NUMBER(configFile >> 'CfgVehicles' >> typeOf _this >> QQGVAR(size),-1)); + defaultValue = QUOTE(GET_NUMBER(configOf _this >> QQGVAR(size),-1)); validate = "number"; condition = "1-objectBrain"; diff --git a/addons/cargo/XEH_postInit.sqf b/addons/cargo/XEH_postInit.sqf index 7ea978dc73..0f2ab2bd2c 100644 --- a/addons/cargo/XEH_postInit.sqf +++ b/addons/cargo/XEH_postInit.sqf @@ -11,8 +11,8 @@ // Show hint as feedback private _hint = [LSTRING(LoadingFailed), LSTRING(LoadedItem)] select _loaded; - private _itemName = getText (configFile >> "CfgVehicles" >> typeOf _item >> "displayName"); - private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); + private _itemName = getText (configOf _item >> "displayName"); + private _vehicleName = getText (configOf _vehicle >> "displayName"); [[_hint, _itemName, _vehicleName], 3.0] call EFUNC(common,displayTextStructured); @@ -33,7 +33,7 @@ // Show hint as feedback private _hint = [LSTRING(UnloadingFailed), LSTRING(UnloadedItem)] select _unloaded; private _itemName = getText (configFile >> "CfgVehicles" >> _itemClass >> "displayName"); - private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); + private _vehicleName = getText (configOf _vehicle >> "displayName"); [[_hint, _itemName, _vehicleName], 3.0] call EFUNC(common,displayTextStructured); @@ -70,7 +70,7 @@ GVAR(vehicleAction) = [ { //IGNORE_PRIVATE_WARNING ["_target", "_player"]; GVAR(enable) && - {(_target getVariable [QGVAR(hasCargo), getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(hasCargo)) == 1])} && + {(_target getVariable [QGVAR(hasCargo), getNumber (configOf _target >> QGVAR(hasCargo)) == 1])} && {locked _target < 2} && {([_player, _target] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE} && {alive _target} && @@ -87,12 +87,12 @@ GVAR(objectAction) = [ { //IGNORE_PRIVATE_WARNING ["_target", "_player"]; GVAR(enable) && - {(_target getVariable [QGVAR(canLoad), getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(canLoad))]) in [true, 1]} && + {(_target getVariable [QGVAR(canLoad), getNumber (configOf _target >> QGVAR(canLoad))]) in [true, 1]} && {locked _target < 2} && {alive _target} && {[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)} && {((nearestObjects [_target, GVAR(cargoHolderTypes), (MAX_LOAD_DISTANCE + 10)]) findIf { - private _hasCargoConfig = 1 == getNumber (configFile >> "CfgVehicles" >> typeOf _x >> QGVAR(hasCargo)); + private _hasCargoConfig = 1 == getNumber (configOf _x >> QGVAR(hasCargo)); private _hasCargoPublic = _x getVariable [QGVAR(hasCargo), false]; (_hasCargoConfig || {_hasCargoPublic}) && {_x != _target} && {alive _x} && {locked _x < 2} && {([_target, _x] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE} diff --git a/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf b/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf index d3a66794db..2bec4f4df3 100644 --- a/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf +++ b/addons/cargo/functions/fnc_addCargoVehiclesActions.sqf @@ -23,7 +23,7 @@ private _statement = { }; private _vehicles = (nearestObjects [_target, GVAR(cargoHolderTypes), (MAX_LOAD_DISTANCE + 10)]) select { - private _hasCargoConfig = 1 == getNumber (configFile >> "CfgVehicles" >> typeOf _x >> QGVAR(hasCargo)); + private _hasCargoConfig = 1 == getNumber (configOf _x >> QGVAR(hasCargo)); private _hasCargoPublic = _x getVariable [QGVAR(hasCargo), false]; (_hasCargoConfig || {_hasCargoPublic}) && {_x != _target} && {alive _x} && {locked _x < 2} && {([_target, _x] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE} diff --git a/addons/cargo/functions/fnc_canLoadItemIn.sqf b/addons/cargo/functions/fnc_canLoadItemIn.sqf index f7bc696d35..469dc45c9d 100644 --- a/addons/cargo/functions/fnc_canLoadItemIn.sqf +++ b/addons/cargo/functions/fnc_canLoadItemIn.sqf @@ -21,7 +21,7 @@ params [["_item", "", [objNull,""]], "_vehicle", ["_ignoreInteraction", false]]; if ((!_ignoreInteraction) && {speed _vehicle > 1 || {((getPos _vehicle) select 2) > 3}}) exitWith {TRACE_1("vehicle not stable",_vehicle); false}; -if (_item isEqualType objNull && {{alive _x && {getText (configFile >> "CfgVehicles" >> typeOf _x >> "simulation") != "UAVPilot"}} count crew _item > 0}) exitWith { +if (_item isEqualType objNull && {{alive _x && {getText (configOf _x >> "simulation") != "UAVPilot"}} count crew _item > 0}) exitWith { TRACE_1("item is occupied",_item); false }; diff --git a/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf b/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf index d9452d4b01..b03108066d 100644 --- a/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf +++ b/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf @@ -18,4 +18,4 @@ params ["_object"]; // TRACE_1("params",_object); -(_object getVariable [QGVAR(space), getNumber (configFile >> "CfgVehicles" >> typeOf _object >> QGVAR(space))]) max 0 +(_object getVariable [QGVAR(space), getNumber (configOf _object >> QGVAR(space))]) max 0 diff --git a/addons/cargo/functions/fnc_initVehicle.sqf b/addons/cargo/functions/fnc_initVehicle.sqf index 60f204cb75..dac28a5ac9 100644 --- a/addons/cargo/functions/fnc_initVehicle.sqf +++ b/addons/cargo/functions/fnc_initVehicle.sqf @@ -76,7 +76,7 @@ if (_vehicle isKindOf "Air") then { private _turretPath = _player call CBA_fnc_turretPath; (_player == (driver _target)) || // pilot {(getNumber (([_target, _turretPath] call CBA_fnc_getTurret) >> "isCopilot")) == 1} || // coPilot - {_turretPath in (getArray (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(loadmasterTurrets)))}} // loadMaster turret from config + {_turretPath in (getArray (configOf _target >> QGVAR(loadmasterTurrets)))}} // loadMaster turret from config }; private _statement = { //IGNORE_PRIVATE_WARNING ["_target", "_player"]; diff --git a/addons/cargo/functions/fnc_paradropItem.sqf b/addons/cargo/functions/fnc_paradropItem.sqf index 4c873d189e..4e314cdf37 100644 --- a/addons/cargo/functions/fnc_paradropItem.sqf +++ b/addons/cargo/functions/fnc_paradropItem.sqf @@ -99,8 +99,8 @@ if (_showHint) then { [ [ LSTRING(UnloadedItem), - getText (configFile >> "CfgVehicles" >> typeOf _itemObject >> "displayName"), - getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName") + getText (configOf _itemObject >> "displayName"), + getText (configOf _vehicle >> "displayName") ], 3 ] call EFUNC(common,displayTextStructured); diff --git a/addons/cargo/functions/fnc_startLoadIn.sqf b/addons/cargo/functions/fnc_startLoadIn.sqf index 7cc7923696..ef5f543016 100644 --- a/addons/cargo/functions/fnc_startLoadIn.sqf +++ b/addons/cargo/functions/fnc_startLoadIn.sqf @@ -60,7 +60,7 @@ if ([_object, _vehicle] call FUNC(canLoadItemIn)) then { ] call EFUNC(common,progressBar); _return = true; } else { - private _displayName = getText (configFile >> "CfgVehicles" >> typeOf _object >> "displayName"); + private _displayName = getText (configOf _object >> "displayName"); [[LSTRING(LoadingFailed), _displayName], 3] call EFUNC(common,displayTextStructured); }; diff --git a/addons/cargo/functions/fnc_validateCargoSpace.sqf b/addons/cargo/functions/fnc_validateCargoSpace.sqf index b83ccfe93a..4f996a30aa 100644 --- a/addons/cargo/functions/fnc_validateCargoSpace.sqf +++ b/addons/cargo/functions/fnc_validateCargoSpace.sqf @@ -34,4 +34,4 @@ if (count _loaded != count _newLoaded) then { _vehicle setVariable [QGVAR(loaded), _newLoaded, true]; }; -_vehicle setVariable [QGVAR(space), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(space)) - _totalSpaceOccupied, true]; +_vehicle setVariable [QGVAR(space), getNumber (configOf _vehicle >> QGVAR(space)) - _totalSpaceOccupied, true]; diff --git a/addons/chemlights/functions/fnc_initIR.sqf b/addons/chemlights/functions/fnc_initIR.sqf index 29532f41f1..b6be8cf5fe 100644 --- a/addons/chemlights/functions/fnc_initIR.sqf +++ b/addons/chemlights/functions/fnc_initIR.sqf @@ -17,7 +17,7 @@ params ["_dummy"]; -private _chemlightClass = getText (configFile >> "CfgVehicles" >> typeOf _dummy >> "ACE_Attachable"); +private _chemlightClass = getText (configOf _dummy >> "ACE_Attachable"); private _config = configFile >> "CfgAmmo" >> _chemlightClass; private _delay = getNumber (_config >> "explosionTime"); private _lifeTime = getNumber (_config >> "timeToLive"); diff --git a/addons/common/functions/fnc_canGetInPosition.sqf b/addons/common/functions/fnc_canGetInPosition.sqf index 22d885b38c..c8870cebd7 100644 --- a/addons/common/functions/fnc_canGetInPosition.sqf +++ b/addons/common/functions/fnc_canGetInPosition.sqf @@ -31,7 +31,7 @@ if (!alive _vehicle || {locked _vehicle > 1}) exitWith {false}; private ["_selectionPosition", "_selectionPosition2"]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _turret = []; private _radius = 0; diff --git a/addons/common/functions/fnc_claim.sqf b/addons/common/functions/fnc_claim.sqf index 3c30b8f28f..f29f4622a0 100644 --- a/addons/common/functions/fnc_claim.sqf +++ b/addons/common/functions/fnc_claim.sqf @@ -30,7 +30,7 @@ _target setVariable [QGVAR(owner), _unit, true]; // lock target object if (_lockTarget) then { - private _canBeDisassembled = !([] isEqualTo getArray (_target call CBA_fnc_getObjectConfig >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; + private _canBeDisassembled = !([] isEqualTo getArray (configOf _target >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; if (!isNull _unit) then { [QGVAR(lockVehicle), _target, _target] call CBA_fnc_targetEvent; if (_canBeDisassembled) then { diff --git a/addons/common/functions/fnc_claimSafeServer.sqf b/addons/common/functions/fnc_claimSafeServer.sqf index f3017f5bed..1cf1d1385e 100644 --- a/addons/common/functions/fnc_claimSafeServer.sqf +++ b/addons/common/functions/fnc_claimSafeServer.sqf @@ -36,7 +36,7 @@ _target setVariable [QGVAR(owner), _unit, true]; // lock target object if (_lockTarget) then { - private _canBeDisassembled = !([] isEqualTo getArray (_target call CBA_fnc_getObjectConfig >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; + private _canBeDisassembled = !([] isEqualTo getArray (configOf _target >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; if (!isNull _unit) then { [QGVAR(lockVehicle), _target, _target] call CBA_fnc_targetEvent; if (_canBeDisassembled) then { diff --git a/addons/common/functions/fnc_fixPosition.sqf b/addons/common/functions/fnc_fixPosition.sqf index ac152cf5c9..e4f956dadb 100644 --- a/addons/common/functions/fnc_fixPosition.sqf +++ b/addons/common/functions/fnc_fixPosition.sqf @@ -19,7 +19,7 @@ if (!local _this) exitWith {}; // Objects with disabled simulation and objects with simulation type "house" don't have gravity/physics, so make sure they are not floating -private _hasGravity = simulationEnabled _this && {getText (configFile >> "CfgVehicles" >> typeOf _this >> "simulation") != "house"}; +private _hasGravity = simulationEnabled _this && {getText (configOf _this >> "simulation") != "house"}; if (!_hasGravity) then { private _positionASL = getPosASL _this; diff --git a/addons/common/functions/fnc_getAwakeAnim.sqf b/addons/common/functions/fnc_getAwakeAnim.sqf index 7da2837759..aa7a28c3c5 100644 --- a/addons/common/functions/fnc_getAwakeAnim.sqf +++ b/addons/common/functions/fnc_getAwakeAnim.sqf @@ -23,7 +23,7 @@ private _vehicle = vehicle _unit; if (_vehicle isEqualTo _unit) exitWith {""}; // --- driver -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; if (_unit == driver _vehicle) exitWith { getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getText (_config >> "driverAction")) // return diff --git a/addons/common/functions/fnc_getConfigCommander.sqf b/addons/common/functions/fnc_getConfigCommander.sqf index f3d011c57a..a49664bcf2 100644 --- a/addons/common/functions/fnc_getConfigCommander.sqf +++ b/addons/common/functions/fnc_getConfigCommander.sqf @@ -17,7 +17,7 @@ params ["_vehicle"]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _turret = _vehicle call FUNC(getTurretCommander); [_config, _turret] call FUNC(getTurretConfigPath) // return diff --git a/addons/common/functions/fnc_getConfigGunner.sqf b/addons/common/functions/fnc_getConfigGunner.sqf index 732256b8a1..d1e86a9bd0 100644 --- a/addons/common/functions/fnc_getConfigGunner.sqf +++ b/addons/common/functions/fnc_getConfigGunner.sqf @@ -17,7 +17,7 @@ params ["_vehicle"]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _turret = _vehicle call FUNC(getTurretGunner); [_config, _turret] call FUNC(getTurretConfigPath) // return diff --git a/addons/common/functions/fnc_getDoorTurrets.sqf b/addons/common/functions/fnc_getDoorTurrets.sqf index 93b0360042..8fb872a6f7 100644 --- a/addons/common/functions/fnc_getDoorTurrets.sqf +++ b/addons/common/functions/fnc_getDoorTurrets.sqf @@ -22,7 +22,7 @@ private _turrets = allTurrets [_vehicle, true]; private _doorTurrets = []; { - private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; + private _config = configOf _vehicle; _config = [_config, _x] call FUNC(getTurretConfigPath); diff --git a/addons/common/functions/fnc_getInPosition.sqf b/addons/common/functions/fnc_getInPosition.sqf index a45b5546a6..ef012a33b4 100644 --- a/addons/common/functions/fnc_getInPosition.sqf +++ b/addons/common/functions/fnc_getInPosition.sqf @@ -28,7 +28,7 @@ _position = toLower _position; // general if (!alive _vehicle || {locked _vehicle > 1}) exitWith {false}; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _turret = []; private _isInside = vehicle _unit == _vehicle; @@ -206,7 +206,7 @@ switch (_position) do { // this will execute all config based event handlers. Not script based ones unfortunately, but atleast we don't use any. private _fnc_getInEH = { // config based getIn EHs are assigned to the soldier, not the vehicle. Why Bis? Why? - private _config = configFile >> "CfgVehicles" >> typeOf _unit >> "EventHandlers"; + private _config = configOf _unit >> "EventHandlers"; if (isClass _config) then { //getIn is local effects with global arguments. It doesn't trigger if the unit was already inside and only switched seats diff --git a/addons/common/functions/fnc_getLightProperties.sqf b/addons/common/functions/fnc_getLightProperties.sqf index 002868dd4e..635284ade4 100644 --- a/addons/common/functions/fnc_getLightProperties.sqf +++ b/addons/common/functions/fnc_getLightProperties.sqf @@ -22,7 +22,7 @@ params ["_vehicle", "_light"]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle >> "Reflectors" >> _light; +private _config = configOf _vehicle >> "Reflectors" >> _light; private _intensity = getNumber (_config >> "intensity"); private _position = getText (_config >> "position"); diff --git a/addons/common/functions/fnc_getMarkerType.sqf b/addons/common/functions/fnc_getMarkerType.sqf index 1541074a07..7f44861769 100644 --- a/addons/common/functions/fnc_getMarkerType.sqf +++ b/addons/common/functions/fnc_getMarkerType.sqf @@ -23,9 +23,9 @@ private _side = side _leader; if (_vehicle == _leader) exitWith { if ( - getNumber (configFile >> "CfgVehicles" >> typeOf _leader >> "detectSkill") > 20 || - getNumber (configFile >> "CfgVehicles" >> typeOf _leader >> "camouflage") < 1 || - getText (configFile >> "CfgVehicles" >> typeOf _leader >> "textsingular") == "diver" + getNumber (configOf _leader >> "detectSkill") > 20 || + getNumber (configOf _leader >> "camouflage") < 1 || + getText (configOf _leader >> "textsingular") == "diver" ) then { ["n_recon", "b_recon", "o_recon"] select ((["GUER", "WEST", "EAST"] find str _side) max 0) } else { @@ -33,16 +33,16 @@ if (_vehicle == _leader) exitWith { }; }; -if (getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant") == 1) exitWith { +if (getNumber (configOf _vehicle >> "attendant") == 1) exitWith { ["n_med", "b_med", "o_med"] select ((["GUER", "WEST", "EAST"] find str _side) max 0) }; if ( - getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "transportRepair") > 0 || - getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "transportFuel") > 0 || - getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "transportAmmo") > 0 || - getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "ACE_canRepair") > 0 || - getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "ACE_fuelCapacityCargo") > 0 + getNumber (configOf _vehicle >> "transportRepair") > 0 || + getNumber (configOf _vehicle >> "transportFuel") > 0 || + getNumber (configOf _vehicle >> "transportAmmo") > 0 || + getNumber (configOf _vehicle >> "ACE_canRepair") > 0 || + getNumber (configOf _vehicle >> "ACE_fuelCapacityCargo") > 0 ) exitWith { ["n_maint", "b_maint", "o_maint"] select ((["GUER", "WEST", "EAST"] find str _side) max 0) }; @@ -59,7 +59,7 @@ if (_vehicle isKindOf "StaticMortar") exitWith { ["n_mortar", "b_mortar", "o_mortar"] select ((["GUER", "WEST", "EAST"] find str _side) max 0) }; -if (getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "artilleryScanner") == 1) exitWith { +if (getNumber (configOf _vehicle >> "artilleryScanner") == 1) exitWith { ["n_art", "b_art", "o_art"] select ((["GUER", "WEST", "EAST"] find str _side) max 0) }; @@ -68,7 +68,7 @@ if (_vehicle isKindOf "Car") exitWith { }; if (_vehicle isKindOf "Tank") exitWith { - if (getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "transportSoldier") > 0) then { + if (getNumber (configOf _vehicle >> "transportSoldier") > 0) then { ["n_mech_inf", "b_mech_inf", "o_mech_inf"] select ((["GUER", "WEST", "EAST"] find str _side) max 0) } else { ["n_armor", "b_armor", "o_armor"] select ((["GUER", "WEST", "EAST"] find str _side) max 0) diff --git a/addons/common/functions/fnc_getName.sqf b/addons/common/functions/fnc_getName.sqf index 0bcce9d2c8..7d9dd35803 100644 --- a/addons/common/functions/fnc_getName.sqf +++ b/addons/common/functions/fnc_getName.sqf @@ -27,7 +27,7 @@ if (_unit isKindOf "CAManBase") then { if (_showEffective) then { _name = [effectiveCommander _unit, false, _useRaw] call FUNC(getName); } else { - _name = getText (configFile >> "CfgVehicles" >> typeOf _unit >> "displayName"); + _name = getText (configOf _unit >> "displayName"); }; }; diff --git a/addons/common/functions/fnc_getPylonTurret.sqf b/addons/common/functions/fnc_getPylonTurret.sqf index b27e6eb582..e82df1912a 100644 --- a/addons/common/functions/fnc_getPylonTurret.sqf +++ b/addons/common/functions/fnc_getPylonTurret.sqf @@ -27,7 +27,7 @@ if (!(_returnValue isEqualTo [])) then { } else { // Attempt to determine turret owner based on magazines in the vehicle private _pyMags = getPylonMagazines _vehicle; - private _pylonConfigs = configProperties [configFile >> "CfgVehicles" >> typeOf _vehicle >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]; + private _pylonConfigs = configProperties [configOf _vehicle >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]; if (_pylonIndex >= (count _pyMags)) exitWith {ERROR("out of bounds");}; if (_pylonIndex >= (count _pylonConfigs)) exitWith {ERROR("out of bounds");}; diff --git a/addons/common/functions/fnc_getReflectorsWithSelections.sqf b/addons/common/functions/fnc_getReflectorsWithSelections.sqf index 97feca6e19..8d40642ae5 100644 --- a/addons/common/functions/fnc_getReflectorsWithSelections.sqf +++ b/addons/common/functions/fnc_getReflectorsWithSelections.sqf @@ -21,7 +21,7 @@ params ["_vehicle"]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _hitpoints = []; private _selections = []; diff --git a/addons/common/functions/fnc_getVehicleUAVCrew.sqf b/addons/common/functions/fnc_getVehicleUAVCrew.sqf index 45d151bc30..b1b1ae002e 100644 --- a/addons/common/functions/fnc_getVehicleUAVCrew.sqf +++ b/addons/common/functions/fnc_getVehicleUAVCrew.sqf @@ -17,4 +17,4 @@ params [["_vehicle", objNull, [objNull]]]; -crew _vehicle select {getText (configFile >> "CfgVehicles" >> typeOf _x >> "simulation") == "UAVPilot"} // return +crew _vehicle select {getText (configOf _x >> "simulation") == "UAVPilot"} // return diff --git a/addons/common/functions/fnc_hasHatch.sqf b/addons/common/functions/fnc_hasHatch.sqf index 90053f43d9..ab6a25035d 100644 --- a/addons/common/functions/fnc_hasHatch.sqf +++ b/addons/common/functions/fnc_hasHatch.sqf @@ -21,7 +21,7 @@ private _vehicle = vehicle _unit; if (_unit == _vehicle) exitWith {false}; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; if (getNumber (_config >> "hideProxyInCombat") != 1) exitWith {false}; diff --git a/addons/common/functions/fnc_isMedic.sqf b/addons/common/functions/fnc_isMedic.sqf index 9618a15548..43d7f6a7ea 100644 --- a/addons/common/functions/fnc_isMedic.sqf +++ b/addons/common/functions/fnc_isMedic.sqf @@ -17,6 +17,6 @@ params ["_unit"]; -private _isMedic = _unit getVariable [QEGVAR(medical,medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _unit >> "attendant")]; +private _isMedic = _unit getVariable [QEGVAR(medical,medicClass), getNumber (configOf _unit >> "attendant")]; _isMedic > 0 diff --git a/addons/common/functions/fnc_lightIntensityFromObject.sqf b/addons/common/functions/fnc_lightIntensityFromObject.sqf index 246424ae4d..e2099def69 100644 --- a/addons/common/functions/fnc_lightIntensityFromObject.sqf +++ b/addons/common/functions/fnc_lightIntensityFromObject.sqf @@ -82,7 +82,7 @@ if (_lightSource isKindOf "CAManBase") then { if (isCollisionLightOn _lightSource) then { private _markerLights = [ _lightSource, - {configProperties [configFile >> "CfgVehicles" >> typeOf _this >> "MarkerLights", "isClass _x", true]}, + {configProperties [configOf _this >> "MarkerLights", "isClass _x", true]}, uiNamespace, format [QEGVAR(cache,MarkerLights_%1), typeOf _lightSource], 1E11 diff --git a/addons/common/functions/fnc_loadPersonLocal.sqf b/addons/common/functions/fnc_loadPersonLocal.sqf index 7135e9e302..8490bf70e9 100644 --- a/addons/common/functions/fnc_loadPersonLocal.sqf +++ b/addons/common/functions/fnc_loadPersonLocal.sqf @@ -21,7 +21,7 @@ params ["_unit", "_vehicle", ["_caller", objNull]]; TRACE_3("loadPersonLocal",_unit,_vehicle,_caller); private _slotsOpen = false; -if ((_vehicle emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false]) || {(getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "ejectDeadCargo")) == 0}}) then { +if ((_vehicle emptyPositions "cargo" > 0) && {!(_unit getVariable ['ACE_isUnconscious', false]) || {(getNumber (configOf _vehicle >> "ejectDeadCargo")) == 0}}) then { _unit moveInCargo _vehicle; TRACE_1("moveInCargo",_vehicle); _slotsOpen = true; diff --git a/addons/common/functions/fnc_moduleLSDVehicles.sqf b/addons/common/functions/fnc_moduleLSDVehicles.sqf index 97ce3833eb..2a9df4c591 100644 --- a/addons/common/functions/fnc_moduleLSDVehicles.sqf +++ b/addons/common/functions/fnc_moduleLSDVehicles.sqf @@ -24,7 +24,7 @@ if (isNil QGVAR(LSD_Vehicles)) then { }; { - _hSCount = count (getArray (configFile >> "CfgVehicles" >> typeOf _x >> "hiddenSelections")); + _hSCount = count (getArray (configOf _x >> "hiddenSelections")); if (_hSCount > 0) then { GVAR(LSD_Vehicles) pushBack [_x, _hSCount]; }; diff --git a/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf b/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf index 83ed8ceb20..03a01cf395 100644 --- a/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf +++ b/addons/common/functions/fnc_nearestVehiclesFreeSeat.sqf @@ -22,7 +22,7 @@ params ["_unit", ["_distance", 10], ["_cargoOnly", false]]; private _nearVehicles = nearestObjects [_unit, ["Car", "Air", "Tank", "Ship_F", "Pod_Heli_Transport_04_crewed_base_F"], _distance]; _nearVehicles select { // Filter cargo seats that will eject unconscious units (e.g. quad bike) - private _canSitInCargo = (!(_unit getVariable ['ACE_isUnconscious', false])) || {(getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "ejectDeadCargo")) == 0}; + private _canSitInCargo = (!(_unit getVariable ['ACE_isUnconscious', false])) || {(getNumber (configOf _x >> "ejectDeadCargo")) == 0}; ((fullCrew [_x, "", true]) findIf { _x params ["_body", "_role", "_cargoIndex"]; (isNull _body) // seat empty diff --git a/addons/concertina_wire/functions/fnc_dismount.sqf b/addons/concertina_wire/functions/fnc_dismount.sqf index b8beeb6a9e..58f04379fd 100644 --- a/addons/concertina_wire/functions/fnc_dismount.sqf +++ b/addons/concertina_wire/functions/fnc_dismount.sqf @@ -25,7 +25,7 @@ if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exit }; params ["_wire", "_unit"]; -private _config = (configFile >> "CfgVehicles" >> typeOf _unit); +private _config = (configOf _unit); private _delay = [45, 30] select ([_unit] call EFUNC(common,isEngineer) || {[_unit] call EFUNC(common,isEOD)}); // TODO: Animation? diff --git a/addons/concertina_wire/functions/fnc_vehicleDamage.sqf b/addons/concertina_wire/functions/fnc_vehicleDamage.sqf index 6482ea718a..baaa8efe06 100644 --- a/addons/concertina_wire/functions/fnc_vehicleDamage.sqf +++ b/addons/concertina_wire/functions/fnc_vehicleDamage.sqf @@ -96,8 +96,8 @@ if (_mode == 1) then { if (canMove _vehicle) then { { private _selectionPart = "hit" + _x; - if (isText(configFile >> "CfgVehicles" >> typeOf _vehicle >> "hitpoints" >> _selectionPart >> "name")) then { - private _selection = getText(configFile >> "CfgVehicles" >> typeOf _vehicle >> "hitpoints" >> _selectionPart >> "name"); + if (isText(configOf _vehicle >> "hitpoints" >> _selectionPart >> "name")) then { + private _selection = getText(configOf _vehicle >> "hitpoints" >> _selectionPart >> "name"); // TODO: Only the tires that have touched the wire should burst. _vehicle setHit [_selection, 1]; }; diff --git a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf index 810084fe71..232e8190a1 100644 --- a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf +++ b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf @@ -46,7 +46,7 @@ private _totalAmmo = 0; } forEach (magazinesAmmoCargo _vehicle); // Get ammo from transportAmmo / ace_rearm -private _vehCfg = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _vehCfg = configOf _vehicle; private _configSupply = (getNumber (_vehCfg >> "transportAmmo")) max (getNumber (_vehCfg >> QEGVAR(rearm,defaultSupply))); if (_vehicle getVariable [QEGVAR(rearm,isSupplyVehicle), (_configSupply > 0)]) then { diff --git a/addons/csw/functions/fnc_ai_handleFired.sqf b/addons/csw/functions/fnc_ai_handleFired.sqf index f85c74fd20..2701b8cef8 100644 --- a/addons/csw/functions/fnc_ai_handleFired.sqf +++ b/addons/csw/functions/fnc_ai_handleFired.sqf @@ -81,8 +81,8 @@ if (_reloadSource isKindOf "CaManBase") then { }; private _timeToLoad = 1; -if (!isNull(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "ammoLoadTime")) then { - _timeToLoad = getNumber(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "ammoLoadTime"); +if (!isNull(configOf _staticWeapon >> QUOTE(ADDON) >> "ammoLoadTime")) then { + _timeToLoad = getNumber(configOf _staticWeapon >> QUOTE(ADDON) >> "ammoLoadTime"); }; TRACE_1("Reloading in progress",_timeToLoad); diff --git a/addons/csw/functions/fnc_assemble_pickupTripod.sqf b/addons/csw/functions/fnc_assemble_pickupTripod.sqf index 0167254795..4f06b6e406 100644 --- a/addons/csw/functions/fnc_assemble_pickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_pickupTripod.sqf @@ -20,7 +20,7 @@ params ["_tripod", "_player"]; TRACE_2("assemble_pickupTripod",_tripod,_player); - private _tripodClassname = getText(configFile >> "CfgVehicles" >> (typeof _tripod) >> QUOTE(ADDON) >> "disassembleTo"); + private _tripodClassname = getText(configOf _tripod >> QUOTE(ADDON) >> "disassembleTo"); private _pickupTime = getNumber(configFile >> "CfgWeapons" >> _tripodClassname >> QUOTE(ADDON) >> "pickupTime"); private _onFinish = { diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf index eb70371b59..381cd0186a 100644 --- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -19,9 +19,9 @@ params ["_staticWeapon", "_player"]; TRACE_2("assemble_pickupWeapon",_staticWeapon,_player); - private _onDisassembleFunc = getText(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "disassembleFunc"); - private _carryWeaponClassname = getText(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "disassembleWeapon"); - private _turretClassname = getText(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "disassembleTurret"); + private _onDisassembleFunc = getText(configOf _staticWeapon >> QUOTE(ADDON) >> "disassembleFunc"); + private _carryWeaponClassname = getText(configOf _staticWeapon >> QUOTE(ADDON) >> "disassembleWeapon"); + private _turretClassname = getText(configOf _staticWeapon >> QUOTE(ADDON) >> "disassembleTurret"); private _pickupTime = getNumber(configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "pickupTime"); TRACE_4("",typeOf _staticWeapon,_carryWeaponClassname,_turretClassname,_pickupTime); if (!isClass (configFile >> "CfgWeapons" >> _carryWeaponClassname)) exitWith {ERROR_1("bad weapon classname [%1]",_carryWeaponClassname);}; diff --git a/addons/csw/functions/fnc_reload_actionsUnload.sqf b/addons/csw/functions/fnc_reload_actionsUnload.sqf index 12d2cd2f9a..24e60b1a38 100644 --- a/addons/csw/functions/fnc_reload_actionsUnload.sqf +++ b/addons/csw/functions/fnc_reload_actionsUnload.sqf @@ -24,8 +24,8 @@ private _statement = { TRACE_5("starting unload",_target,_turretPath,_player,_carryMag,_vehMag); private _timeToUnload = 1; - if (!isNull(configFile >> "CfgVehicles" >> (typeOf _target) >> QUOTE(ADDON) >> "ammoUnloadTime")) then { - _timeToUnload = getNumber(configFile >> "CfgVehicles" >> (typeOf _target) >> QUOTE(ADDON) >> "ammoUnloadTime"); + if (!isNull(configOf _target >> QUOTE(ADDON) >> "ammoUnloadTime")) then { + _timeToUnload = getNumber(configOf _target >> QUOTE(ADDON) >> "ammoUnloadTime"); }; [ diff --git a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf index 505c920333..69f8e6c93a 100644 --- a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf +++ b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf @@ -26,7 +26,7 @@ if (!alive _vehicle) exitWith { [false, "", -1, false] }; // Verify unit has carry magazine if ((!isNull _unit) && {((_vehicle distance _unit) > 5) || {((magazines _unit) findIf {_x == _carryMag}) == -1}}) exitWith { [false, "", -2, false] }; -private _desiredAmmo = getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QUOTE(ADDON) >> "desiredAmmo"); +private _desiredAmmo = getNumber (configOf _vehicle >> QUOTE(ADDON) >> "desiredAmmo"); if (_desiredAmmo == 0) then { _desiredAmmo = 100; }; private _ammoNeeded = _desiredAmmo min getNumber (configFile >> "CfgMagazines" >> _carryMag >> "count"); // assume it needs full carry mag private _loadedMag = ""; diff --git a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf index b6265852c9..2b28535f0a 100644 --- a/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf +++ b/addons/csw/functions/fnc_reload_getVehicleMagazine.sqf @@ -20,7 +20,7 @@ params ["_vehicle", "_turret", "_carryMag"]; TRACE_3("reload_getVehicleMagazine",_vehicle,_turret,_carryMag); private _carryGroupCfg = configFile >> QGVAR(groups) >> _carryMag; -private _desiredAmmo = getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QUOTE(ADDON) >> "desiredAmmo"); +private _desiredAmmo = getNumber (configOf _vehicle >> QUOTE(ADDON) >> "desiredAmmo"); if (_desiredAmmo == 0) then { _desiredAmmo = 100; }; private _bestMag = "#"; diff --git a/addons/csw/functions/fnc_reload_loadMagazine.sqf b/addons/csw/functions/fnc_reload_loadMagazine.sqf index 25032a08f4..2b34d38a24 100644 --- a/addons/csw/functions/fnc_reload_loadMagazine.sqf +++ b/addons/csw/functions/fnc_reload_loadMagazine.sqf @@ -22,8 +22,8 @@ params ["_vehicle", "_turret", "_carryMag", "_unit"]; TRACE_4("loadMagazine",_vehicle,_turret,_carryMag,_unit); private _timeToLoad = 1; -if (!isNull(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QUOTE(ADDON) >> "ammoLoadTime")) then { - _timeToLoad = getNumber(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QUOTE(ADDON) >> "ammoLoadTime"); +if (!isNull(configOf _vehicle >> QUOTE(ADDON) >> "ammoLoadTime")) then { + _timeToLoad = getNumber(configOf _vehicle >> QUOTE(ADDON) >> "ammoLoadTime"); }; private _displayName = format [localize LSTRING(loadX), getText (configFile >> "CfgMagazines" >> _carryMag >> "displayName")]; diff --git a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf index a1e7ca9715..e1cba376f4 100644 --- a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf +++ b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf @@ -20,7 +20,7 @@ params ["_staticWeapon", "_assemblyMode", "_emptyWeapon"]; TRACE_3("staticWeaponInit_unloadExtraMags",_staticWeapon,_assemblyMode,_emptyWeapon); if (!_assemblyMode) exitWith {}; -private _desiredAmmo = getNumber (configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "desiredAmmo"); +private _desiredAmmo = getNumber (configOf _staticWeapon >> QUOTE(ADDON) >> "desiredAmmo"); private _storeExtraMagazines = GVAR(handleExtraMagazines); if (_emptyWeapon) then { _desiredAmmo = 0; diff --git a/addons/dragging/functions/fnc_canCarry.sqf b/addons/dragging/functions/fnc_canCarry.sqf index b5edbd800c..2483903eef 100644 --- a/addons/dragging/functions/fnc_canCarry.sqf +++ b/addons/dragging/functions/fnc_canCarry.sqf @@ -25,6 +25,6 @@ if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false}; if ((_unit getHitPointDamage "HitLegs") >= 0.5) exitWith {false}; // a static weapon has to be empty for dragging (ignore UAV AI) -if (((typeOf _target) isKindOf "StaticWeapon") && {{(getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "simulation")) != "UAVPilot"} count crew _target > 0}) exitWith {false}; +if (((typeOf _target) isKindOf "StaticWeapon") && {{(getText (configOf _x >> "simulation")) != "UAVPilot"} count crew _target > 0}) exitWith {false}; alive _target && {vehicle _target isEqualto _target} && {_target getVariable [QGVAR(canCarry), false]} && {animationState _target in ["", "unconscious"] || (_target getVariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})} diff --git a/addons/dragging/functions/fnc_canDrag.sqf b/addons/dragging/functions/fnc_canDrag.sqf index dbae83521b..afc679e375 100644 --- a/addons/dragging/functions/fnc_canDrag.sqf +++ b/addons/dragging/functions/fnc_canDrag.sqf @@ -21,6 +21,6 @@ params ["_unit", "_target"]; if !([_unit, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; // a static weapon has to be empty for dragging (ignore UAV AI) -if ((typeOf _target) isKindOf "StaticWeapon" && {{(getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "simulation")) != "UAVPilot"} count crew _target > 0}) exitWith {false}; +if ((typeOf _target) isKindOf "StaticWeapon" && {{(getText (configOf _x >> "simulation")) != "UAVPilot"} count crew _target > 0}) exitWith {false}; alive _target && {vehicle _target isEqualto _target} && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getVariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})} diff --git a/addons/dragging/functions/fnc_initObject.sqf b/addons/dragging/functions/fnc_initObject.sqf index 8e352a00bb..a687a52b99 100644 --- a/addons/dragging/functions/fnc_initObject.sqf +++ b/addons/dragging/functions/fnc_initObject.sqf @@ -17,7 +17,7 @@ params ["_object"]; -private _config = configFile >> "CfgVehicles" >> typeOf _object; +private _config = configOf _object; if (getNumber (_config >> QGVAR(canDrag)) == 1) then { private _position = getArray (_config >> QGVAR(dragPosition)); diff --git a/addons/dragon/functions/fnc_onFired.sqf b/addons/dragon/functions/fnc_onFired.sqf index 78d9d15b91..1fa24c1925 100644 --- a/addons/dragon/functions/fnc_onFired.sqf +++ b/addons/dragon/functions/fnc_onFired.sqf @@ -23,7 +23,7 @@ _seekerParams params ["", "", "_seekerMaxRange", "_seekerMinRange"]; _shooter setVariable [QGVAR(fired), true, true]; _shooter animate ["missile_hide", 1]; -private _config = ([_projectile] call CBA_fnc_getObjectConfig) >> "ace_missileguidance"; +private _config = configOf _projectile >> "ace_missileguidance"; private _serviceInterval = [_config >> "serviceInterval", "NUMBER", 0.33] call CBA_fnc_getConfigEntry; private _serviceChargeCount = [_config >> "serviceCharges", "NUMBER", 60] call CBA_fnc_getConfigEntry; diff --git a/addons/fastroping/XEH_postInit.sqf b/addons/fastroping/XEH_postInit.sqf index 72ded1b267..43e5de24f9 100644 --- a/addons/fastroping/XEH_postInit.sqf +++ b/addons/fastroping/XEH_postInit.sqf @@ -35,7 +35,7 @@ #ifdef DRAW_FASTROPE_INFO addMissionEventHandler ["Draw3D", { if (!(cursorObject isKindOf "Helicopter")) exitWith {}; - private _config = configFile >> "CfgVehicles" >> (typeOf cursorObject); + private _config = configOf cursorObject; private _enabled = getNumber (_config >> QGVAR(enabled)); drawIcon3D ["", [.5,.5,1,1], (ASLtoAGL getPosASL cursorObject), 0.5, 0.5, 0, format ["%1 = %2", typeOf cursorObject, _enabled], 0.5, 0.025, "TahomaB"]; if (_enabled > 0) then { diff --git a/addons/fastroping/functions/fnc_canDeployRopes.sqf b/addons/fastroping/functions/fnc_canDeployRopes.sqf index 26b514368b..4338ac0130 100644 --- a/addons/fastroping/functions/fnc_canDeployRopes.sqf +++ b/addons/fastroping/functions/fnc_canDeployRopes.sqf @@ -19,7 +19,7 @@ */ params ["_vehicle", "_player", "_ropeClass", ["_defaultOption", false]]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; (driver _vehicle != _player) && {getPos _vehicle select 2 > 2} && { diff --git a/addons/fastroping/functions/fnc_canPrepareFRIES.sqf b/addons/fastroping/functions/fnc_canPrepareFRIES.sqf index 881996b5a1..b6068f5341 100644 --- a/addons/fastroping/functions/fnc_canPrepareFRIES.sqf +++ b/addons/fastroping/functions/fnc_canPrepareFRIES.sqf @@ -16,7 +16,7 @@ */ params ["_vehicle"]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; ((getNumber (_config >> QGVAR(enabled)) == 1) || {!(isNull (_vehicle getVariable [QGVAR(FRIES), objNull]))}) && {(_vehicle getVariable [QGVAR(deploymentStage), 0]) == 0} && diff --git a/addons/fastroping/functions/fnc_canStowFRIES.sqf b/addons/fastroping/functions/fnc_canStowFRIES.sqf index 6f26fc1ed5..462799eb01 100644 --- a/addons/fastroping/functions/fnc_canStowFRIES.sqf +++ b/addons/fastroping/functions/fnc_canStowFRIES.sqf @@ -16,7 +16,7 @@ */ params ["_vehicle"]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; (_vehicle getVariable [QGVAR(deploymentStage), 0]) == 2 && {getText (_config >> QGVAR(onCut)) != ""} diff --git a/addons/fastroping/functions/fnc_cutRopes.sqf b/addons/fastroping/functions/fnc_cutRopes.sqf index ae1b58638a..8c4633ca8e 100644 --- a/addons/fastroping/functions/fnc_cutRopes.sqf +++ b/addons/fastroping/functions/fnc_cutRopes.sqf @@ -40,5 +40,5 @@ private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []]; _vehicle setVariable [QGVAR(deployedRopes), [], true]; // Set new state (0 if no FRIES, 2 if FRIES for manual stowing) -private _newState = [0, 2] select (isText (configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(onCut))); +private _newState = [0, 2] select (isText (configOf _vehicle >> QGVAR(onCut))); _vehicle setVariable [QGVAR(deploymentStage), _newState, true]; diff --git a/addons/fastroping/functions/fnc_deployAI.sqf b/addons/fastroping/functions/fnc_deployAI.sqf index 8101a99dae..d769fd6723 100644 --- a/addons/fastroping/functions/fnc_deployAI.sqf +++ b/addons/fastroping/functions/fnc_deployAI.sqf @@ -26,7 +26,7 @@ if (isNull _vehicle || {!(_vehicle isKindOf "Helicopter")}) exitWith { ERROR('FUNC(deployAI): deployAI was called with an invalid or non-existant vehicle.'); }; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _configEnabled = getNumber (_config >> QGVAR(enabled)); if (_configEnabled == 0) exitWith { if (hasInterface) then { diff --git a/addons/fastroping/functions/fnc_deployRopes.sqf b/addons/fastroping/functions/fnc_deployRopes.sqf index 27ad76a0f9..17627b63f2 100644 --- a/addons/fastroping/functions/fnc_deployRopes.sqf +++ b/addons/fastroping/functions/fnc_deployRopes.sqf @@ -20,7 +20,7 @@ params ["_vehicle", ["_player", objNull], ["_ropeClass", ""]]; TRACE_3("deployRopes",_vehicle,_player,_ropeClass); -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _ropeOrigins = getArray (_config >> QGVAR(ropeOrigins)); private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []]; diff --git a/addons/fastroping/functions/fnc_equipFRIES.sqf b/addons/fastroping/functions/fnc_equipFRIES.sqf index 002a32364c..6dcb29e3e7 100644 --- a/addons/fastroping/functions/fnc_equipFRIES.sqf +++ b/addons/fastroping/functions/fnc_equipFRIES.sqf @@ -17,7 +17,7 @@ params ["_vehicle"]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; if !(isNumber (_config >> QGVAR(enabled))) then { ["%1 has not been configured for ACE_Fastroping.", getText (_config >> "displayName")] call BIS_fnc_error; } else { diff --git a/addons/fastroping/functions/fnc_prepareFRIES.sqf b/addons/fastroping/functions/fnc_prepareFRIES.sqf index c5bac4deb1..9f1c1b941a 100644 --- a/addons/fastroping/functions/fnc_prepareFRIES.sqf +++ b/addons/fastroping/functions/fnc_prepareFRIES.sqf @@ -19,7 +19,7 @@ params ["_vehicle"]; //Stage indicator: 0 - travel mode; 1 - preparing/stowing FRIES; 2 - FRIES ready; 3 - ropes deployed _vehicle setVariable [QGVAR(deploymentStage), 1, true]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _waitTime = 0; if (isText (_config >> QGVAR(onPrepare))) then { _waitTime = [_vehicle] call (missionNamespace getVariable (getText (_config >> QGVAR(onPrepare)))); diff --git a/addons/fastroping/functions/fnc_stowFRIES.sqf b/addons/fastroping/functions/fnc_stowFRIES.sqf index 3b18a6dbe1..297cb925d1 100644 --- a/addons/fastroping/functions/fnc_stowFRIES.sqf +++ b/addons/fastroping/functions/fnc_stowFRIES.sqf @@ -19,7 +19,7 @@ params ["_vehicle"]; //Stage indicator: 0 - travel mode; 1 - preparing/stowing FRIES; 2 - FRIES ready; 3 - ropes deployed _vehicle setVariable [QGVAR(deploymentStage), 1, true]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _config = configOf _vehicle; private _waitTime = 0; if (isText (_config >> QGVAR(onCut))) then { _waitTime = [_vehicle] call (missionNamespace getVariable (getText (_config >> QGVAR(onCut)))); diff --git a/addons/fcs/functions/fnc_adjustRange.sqf b/addons/fcs/functions/fnc_adjustRange.sqf index cb0e00c9c1..30f9c86305 100644 --- a/addons/fcs/functions/fnc_adjustRange.sqf +++ b/addons/fcs/functions/fnc_adjustRange.sqf @@ -19,7 +19,7 @@ params ["_vehicle", "_turret", "_delta"]; -private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); +private _turretConfig = [configOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); private _min = getNumber (_turretConfig >> QGVAR(MinDistance)); private _max = getNumber (_turretConfig >> QGVAR(MaxDistance)); diff --git a/addons/fcs/functions/fnc_calculateSolution.sqf b/addons/fcs/functions/fnc_calculateSolution.sqf index 8ceb0c62cf..478b34f502 100644 --- a/addons/fcs/functions/fnc_calculateSolution.sqf +++ b/addons/fcs/functions/fnc_calculateSolution.sqf @@ -23,7 +23,7 @@ TRACE_4("params",_vehicle,_turret,_distance,_angleTarget); private _FCSInitSpeed = []; private _FCSMagazines = []; private _FCSElevation = []; -private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); +private _turretConfig = [configOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); { private _magazine = _x; diff --git a/addons/fcs/functions/fnc_canUseFCS.sqf b/addons/fcs/functions/fnc_canUseFCS.sqf index a246d51f0c..a5a1543de9 100644 --- a/addons/fcs/functions/fnc_canUseFCS.sqf +++ b/addons/fcs/functions/fnc_canUseFCS.sqf @@ -15,7 +15,7 @@ * Public: No */ -getNumber ([configFile >> "CfgVehicles" >> typeOf vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex)] call EFUNC(common,getTurretConfigPath) >> QGVAR(Enabled)) == 1 +getNumber ([configOf vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex)] call EFUNC(common,getTurretConfigPath) >> QGVAR(Enabled)) == 1 && {cameraView == "GUNNER"} && {!([ACE_player] call CBA_fnc_canUseWeapon)} //Not Turned Out && {cameraOn != (getConnectedUAV ACE_player)} //Not Controlling a UAV diff --git a/addons/fcs/functions/fnc_keyDown.sqf b/addons/fcs/functions/fnc_keyDown.sqf index 0e141c0968..2e40b64a84 100644 --- a/addons/fcs/functions/fnc_keyDown.sqf +++ b/addons/fcs/functions/fnc_keyDown.sqf @@ -18,7 +18,7 @@ params ["_vehicle", "_turret"]; -private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); +private _turretConfig = [configOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); // Update display for infantry rangefinders if (_vehicle == ACE_player) exitWith {[5,5500,25,true] call FUNC(getRange)}; diff --git a/addons/fcs/functions/fnc_keyUp.sqf b/addons/fcs/functions/fnc_keyUp.sqf index fb3ce99974..d96b6d5307 100644 --- a/addons/fcs/functions/fnc_keyUp.sqf +++ b/addons/fcs/functions/fnc_keyUp.sqf @@ -19,7 +19,7 @@ params ["_vehicle", "_turret", "_distance", ["_showHint", false], ["_playSound", true]]; TRACE_5("params",_vehicle,_turret,_distance,_showHint,_playSound); -private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); +private _turretConfig = [configOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); if (isNil "_distance") then { _distance = [ diff --git a/addons/fcs/functions/fnc_vehicleInit.sqf b/addons/fcs/functions/fnc_vehicleInit.sqf index 3314228729..b6e8eff316 100644 --- a/addons/fcs/functions/fnc_vehicleInit.sqf +++ b/addons/fcs/functions/fnc_vehicleInit.sqf @@ -18,7 +18,7 @@ params ["_vehicle"]; { - private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); + private _turretConfig = [configOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); if (getNumber (_turretConfig >> QGVAR(Enabled)) == 1) then { if (isNil QGVAR(jipID)) then { diff --git a/addons/gforces/XEH_postInit.sqf b/addons/gforces/XEH_postInit.sqf index f7d532c288..f07249c38f 100644 --- a/addons/gforces/XEH_postInit.sqf +++ b/addons/gforces/XEH_postInit.sqf @@ -12,8 +12,8 @@ GVAR(playerIsVirtual) = false; ["unit", { // Add unit changed EH to check if player is either virtual (logic) or a UAV AI params ["_unit"]; - GVAR(playerIsVirtual) = ((getNumber (configFile >> "CfgVehicles" >> (typeOf _unit) >> "isPlayableLogic")) == 1) || - {(getText (configFile >> "CfgVehicles" >> (typeOf _unit) >> "simulation")) == "UAVPilot"}; + GVAR(playerIsVirtual) = ((getNumber (configOf _unit >> "isPlayableLogic")) == 1) || + {(getText (configOf _unit >> "simulation")) == "UAVPilot"}; TRACE_3("unit changed",_unit,typeOf _unit,GVAR(playerIsVirtual)); }, true] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/goggles/functions/fnc_applyGlassesEffect.sqf b/addons/goggles/functions/fnc_applyGlassesEffect.sqf index f60eb79581..4c0b8dd1df 100644 --- a/addons/goggles/functions/fnc_applyGlassesEffect.sqf +++ b/addons/goggles/functions/fnc_applyGlassesEffect.sqf @@ -24,7 +24,7 @@ TRACE_2("applyGlassesEffect",_player,_glasses); // remove old effect call FUNC(removeGlassesEffect); -if ((getNumber (configFile >> "CfgVehicles" >> (typeOf _player) >> "isPlayableLogic")) == 1) exitWith { +if ((getNumber (configOf _player >> "isPlayableLogic")) == 1) exitWith { TRACE_1("skipping playable logic",typeOf _player); // VirtualMan_F (placeable logic zeus / spectator) }; diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index 39ad6fb706..07b5b64fd9 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -74,7 +74,7 @@ _affected = _affected - [ACE_player]; // Affect local player, independently of distance if (hasInterface && {!isNull ACE_player} && {alive ACE_player}) then { - if ((getNumber (configFile >> "CfgVehicles" >> (typeOf ACE_player) >> "isPlayableLogic")) == 1) exitWith { + if ((getNumber (configOf ACE_player >> "isPlayableLogic")) == 1) exitWith { TRACE_1("skipping playable logic",typeOf ACE_player); // VirtualMan_F (placeable logic zeus / spectator) }; // Do effects for player diff --git a/addons/grenades/functions/fnc_incendiary.sqf b/addons/grenades/functions/fnc_incendiary.sqf index d454001031..d6f689e4f2 100644 --- a/addons/grenades/functions/fnc_incendiary.sqf +++ b/addons/grenades/functions/fnc_incendiary.sqf @@ -196,7 +196,7 @@ private _vehicle = _position nearestObject "Car"; if (!local _vehicle) exitWith {}; -private _config = _vehicle call CBA_fnc_getObjectConfig; +private _config = configOf _vehicle; // --- burn tyres private _fnc_isWheelHitPoint = { diff --git a/addons/hearing/XEH_postInit.sqf b/addons/hearing/XEH_postInit.sqf index 17548a973b..3b35488568 100644 --- a/addons/hearing/XEH_postInit.sqf +++ b/addons/hearing/XEH_postInit.sqf @@ -60,7 +60,7 @@ GVAR(lastPlayerVehicle) = objNull; }; // Don't add a new EH if the unit respawned if ((_player getVariable [QGVAR(firedEH), -1]) == -1) then { - if ((getNumber (configFile >> "CfgVehicles" >> (typeOf _player) >> "isPlayableLogic")) == 1) exitWith { + if ((getNumber (configOf _player >> "isPlayableLogic")) == 1) exitWith { TRACE_1("skipping playable logic",typeOf _player); // VirtualMan_F (placeable logic zeus / spectator) }; private _firedEH = _player addEventHandler ["FiredNear", {call FUNC(firedNear)}]; diff --git a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf index 9f33633462..849c0c29a1 100644 --- a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf +++ b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf @@ -22,10 +22,10 @@ if (isNull _vehicle) exitWith {}; private _newAttenuation = 1; if (ACE_player != _vehicle) then { private _turretPath = [ACE_player] call EFUNC(common,getTurretIndex); - private _effectType = getText (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "attenuationEffectType"); + private _effectType = getText (configOf _vehicle >> "attenuationEffectType"); if (!(_turretPath isEqualTo [])) then { - private _turretConfig = [(configFile >> "CfgVehicles" >> (typeOf _vehicle)), _turretPath] call EFUNC(common,getTurretConfigPath); + private _turretConfig = [(configOf _vehicle), _turretPath] call EFUNC(common,getTurretConfigPath); if ((getNumber (_turretConfig >> "disableSoundAttenuation")) == 1) then { _effectType = ""; @@ -40,7 +40,7 @@ if (ACE_player != _vehicle) then { case (_effectType == ""): {1}; case (_effectType == "CarAttenuation"); case (_effectType == "RHS_CarAttenuation"): { // Increase protection for armored cars - private _armor = getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "HitPoints" >> "HitBody" >> "armor"); + private _armor = getNumber (configOf _vehicle >> "HitPoints" >> "HitBody" >> "armor"); linearConversion [2, 8, _armor, 0.5, 0.3, true];}; case (_effectType == "OpenCarAttenuation"): {1}; case (_effectType == "TankAttenuation"): {0.1}; diff --git a/addons/hellfire/functions/fnc_setupVehicle.sqf b/addons/hellfire/functions/fnc_setupVehicle.sqf index e824542021..cf0a17a2e7 100644 --- a/addons/hellfire/functions/fnc_setupVehicle.sqf +++ b/addons/hellfire/functions/fnc_setupVehicle.sqf @@ -41,7 +41,7 @@ if (!_enabled) exitWith {TRACE_3("Not enabled",_enabled,_vehicle,_turretPath);}; // Add laser if vehicle is configured for one: -if ((getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> QGVAR(addLaserDesignator))) == 1) then { +if ((getNumber (configOf _vehicle >> QGVAR(addLaserDesignator))) == 1) then { [{ params ["_vehicle", "_turretPath"]; TRACE_3("checking for laser",_vehicle,_turretPath,_vehicle turretLocal _turretPath); diff --git a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf index 2497021e00..924e50758d 100644 --- a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf @@ -38,7 +38,7 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; //Make the common case fast (cursorTarget is looking at a door): if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScaned)}) then { - if (((count (configFile >> "CfgVehicles" >> (typeOf cursorTarget) >> "UserActions")) > 0) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf cursorTarget) >> "ladders"))) > 0}) then { + if (((count (configOf cursorTarget >> "UserActions")) > 0) || {(count (getArray (configOf cursorTarget >> "ladders"))) > 0}) then { _housesToScanForActions = [cursorTarget]; } else { _housesScaned pushBack cursorTarget; diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 3239badbdd..3b53bf925c 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -620,7 +620,7 @@ class CfgVehicles { condition = "true"; class ACE_OpenBox { displayName = CSTRING(OpenBox); - condition = QUOTE((alive _target) && {(getNumber (configFile >> 'CfgVehicles' >> (typeOf _target) >> 'disableInventory')) == 0}); + condition = QUOTE((alive _target) && {(getNumber (configOf _target >> 'disableInventory')) == 0}); statement = QUOTE(_player action [ARR_2(QUOTE(QUOTE(Gear)), _target)]); showDisabled = 0; }; diff --git a/addons/interaction/functions/fnc_addPassengersActions.sqf b/addons/interaction/functions/fnc_addPassengersActions.sqf index 05e5ebfd55..b4efb97bfb 100644 --- a/addons/interaction/functions/fnc_addPassengersActions.sqf +++ b/addons/interaction/functions/fnc_addPassengersActions.sqf @@ -24,7 +24,7 @@ private _actions = []; { private _unit = _x; - if (_unit != _player && {getText (configFile >> "CfgVehicles" >> typeOf _unit >> "simulation") != "UAVPilot"}) then { + if (_unit != _player && {getText (configOf _unit >> "simulation") != "UAVPilot"}) then { private _icon = [ "", "A3\ui_f\data\IGUI\RscIngameUI\RscUnitInfo\role_driver_ca.paa", diff --git a/addons/interaction/functions/fnc_canPush.sqf b/addons/interaction/functions/fnc_canPush.sqf index 0032296a50..c8f82b65a5 100644 --- a/addons/interaction/functions/fnc_canPush.sqf +++ b/addons/interaction/functions/fnc_canPush.sqf @@ -18,5 +18,5 @@ params ["_target"]; alive _target && -{getMass _target <= 2600 || getNumber (configFile >> "CfgVehicles" >> typeOf _target >> QGVAR(canPush)) == 1} && +{getMass _target <= 2600 || getNumber (configOf _target >> QGVAR(canPush)) == 1} && {vectorMagnitude velocity _target < 3} diff --git a/addons/interaction/functions/fnc_getVehiclePosComplex.sqf b/addons/interaction/functions/fnc_getVehiclePosComplex.sqf index 17f77922b9..a3ec0b46ee 100644 --- a/addons/interaction/functions/fnc_getVehiclePosComplex.sqf +++ b/addons/interaction/functions/fnc_getVehiclePosComplex.sqf @@ -22,7 +22,7 @@ TRACE_2("params",_target,_cameraPosASL); private _bb = boundingBoxReal _target; (_bb select 0) params ["_bbX", "_bbY", "_bbZ"]; -private _config = configFile >> "CfgVehicles" >> (typeOf _target); +private _config = configOf _target; if (isNumber (_config >> QGVAR(bodyWidth))) then {_bbX = getNumber (_config >> QGVAR(bodyWidth));}; if (isNumber (_config >> QGVAR(bodyLength))) then {_bbY = getNumber (_config >> QGVAR(bodyLength));}; diff --git a/addons/interaction/functions/fnc_openDoor.sqf b/addons/interaction/functions/fnc_openDoor.sqf index 73cf4e0a37..cffb9e2410 100644 --- a/addons/interaction/functions/fnc_openDoor.sqf +++ b/addons/interaction/functions/fnc_openDoor.sqf @@ -23,7 +23,7 @@ TRACE_2("openDoor",_house,_door); if (isNull _house) exitWith {}; -if ((configProperties [configFile >> "CfgVehicles" >> (typeOf _house) >> "UserActions"]) isEqualTo []) exitWith { +if ((configProperties [configOf _house >> "UserActions"]) isEqualTo []) exitWith { TRACE_1("Ignore houses with no UserActions",typeOf _house); // Fix problem with Shoothouse Walls }; @@ -38,8 +38,8 @@ private _lockedVariable = format ["bis_disabled_%1", _door]; // Check if the door can be locked aka have locked variable, otherwhise cant lock it if ((_house animationPhase (_animations select 0) <= 0) && {_house getVariable [_lockedVariable, 0] == 1}) exitWith { private _lockedAnimation = format ["%1_locked_source", _door]; - TRACE_3("locked",_house,_lockedAnimation,isClass (configfile >> "CfgVehicles" >> (typeOf _house) >> "AnimationSources" >> _lockedAnimation)); - if (isClass (configfile >> "CfgVehicles" >> (typeOf _house) >> "AnimationSources" >> _lockedAnimation)) then { + TRACE_3("locked",_house,_lockedAnimation,isClass (configOf _house >> "AnimationSources" >> _lockedAnimation)); + if (isClass (configOf _house >> "AnimationSources" >> _lockedAnimation)) then { // from: a3\structures_f\scripts\fn_door.sqf: - wiggles the door handle (A3 buildings) _house animateSource [_lockedAnimation, (1 - (_house animationSourcePhase _lockedAnimation))]; }; diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index a30da81a40..d837367b59 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -86,7 +86,7 @@ GVAR(vehicleLightColor) = [1,1,1,0]; ["vehicle", { params ["_unit", "_vehicle"]; if ((isNull _vehicle) || {_unit == _vehicle}) exitWith {}; - private _cfg = configfile >> "CfgVehicles" >> (typeOf _vehicle); + private _cfg = configOf _vehicle; GVAR(vehicleExteriorTurrets) = getArray (_cfg >> QGVAR(vehicleExteriorTurrets)); GVAR(vehicleLightColor) = [_cfg >> QGVAR(vehicleLightColor), "array", [1,1,1,0]] call CBA_fnc_getConfigEntry; diff --git a/addons/medical_engine/XEH_postInit.sqf b/addons/medical_engine/XEH_postInit.sqf index 0467202b88..fec92ca620 100644 --- a/addons/medical_engine/XEH_postInit.sqf +++ b/addons/medical_engine/XEH_postInit.sqf @@ -15,7 +15,7 @@ reverse _allHitPoints; if (_allHitPoints param [0, ""] != "ACE_HDBracket") then { - private _config = [_unit] call CBA_fnc_getObjectConfig; + private _config = configOf _unit; if (getText (_config >> "simulation") == "UAVPilot") exitWith {TRACE_1("ignore UAV AI",typeOf _unit);}; if (getNumber (_config >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)}; ERROR_1("Bad hitpoints for unit type ""%1""",typeOf _unit); @@ -53,7 +53,7 @@ ["Air", "Killed", { params ["_vehicle", "_killer"]; TRACE_3("air killed",_vehicle,typeOf _vehicle,velocity _vehicle); - if ((getText (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "destrType")) == "") exitWith {}; + if ((getText (configOf _vehicle >> "destrType")) == "") exitWith {}; if (unitIsUAV _vehicle) exitWith {}; private _lethality = linearConversion [0, 25, (vectorMagnitude velocity _vehicle), 0.5, 1]; diff --git a/addons/medical_engine/functions/fnc_getHitpointArmor.sqf b/addons/medical_engine/functions/fnc_getHitpointArmor.sqf index 1f6f3c0550..62954a1b56 100644 --- a/addons/medical_engine/functions/fnc_getHitpointArmor.sqf +++ b/addons/medical_engine/functions/fnc_getHitpointArmor.sqf @@ -21,7 +21,7 @@ params ["_unit", "_hitpoint"]; private _uniform = uniform _unit; // If unit is naked, use its underwear class instead if (_uniform isEqualTo "") then { - _uniform = getText (configFile >> "CfgVehicles" >> typeOf _unit >> "nakedUniform"); + _uniform = getText (configOf _unit >> "nakedUniform"); }; private _gear = [ diff --git a/addons/medical_status/XEH_preInit.sqf b/addons/medical_status/XEH_preInit.sqf index aab312470d..c6343dcb63 100644 --- a/addons/medical_status/XEH_preInit.sqf +++ b/addons/medical_status/XEH_preInit.sqf @@ -12,7 +12,7 @@ PREP_RECOMPILE_END; ["CAManBase", "init", { params ["_unit"]; - private _config = [_unit] call CBA_fnc_getObjectConfig; + private _config = configOf _unit; if (getText (_config >> "simulation") == "UAVPilot") exitWith {TRACE_1("ignore UAV AI",typeOf _unit);}; if (getNumber (_config >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)}; diff --git a/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf index 4b06ffdb55..dda930a4f4 100644 --- a/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf +++ b/addons/medical_treatment/functions/fnc_isMedicalVehicle.sqf @@ -17,4 +17,4 @@ params ["_vehicle"]; -_vehicle getVariable [QEGVAR(medical,isMedicalVehicle), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant") > 0] +_vehicle getVariable [QEGVAR(medical,isMedicalVehicle), getNumber (configOf _vehicle >> "attendant") > 0] diff --git a/addons/medical_treatment/functions/fnc_loadUnit.sqf b/addons/medical_treatment/functions/fnc_loadUnit.sqf index 74e66d517b..8b556014e1 100644 --- a/addons/medical_treatment/functions/fnc_loadUnit.sqf +++ b/addons/medical_treatment/functions/fnc_loadUnit.sqf @@ -43,7 +43,7 @@ if (isNull _vehicle) exitWith { TRACE_1("no vehicle found",_vehicle); }; params ["_unit", "_vehicle"]; TRACE_2("success",_unit,_vehicle); private _patientName = [_unit, false, true] call EFUNC(common,getName); - private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); + private _vehicleName = getText (configOf _vehicle >> "displayName"); [[LSTRING(LoadedInto), _patientName, _vehicleName], 3] call EFUNC(common,displayTextStructured); }, [_patient, _vehicle], 3, { params ["_unit", "_emptyPos"]; diff --git a/addons/medical_treatment/functions/fnc_unloadUnit.sqf b/addons/medical_treatment/functions/fnc_unloadUnit.sqf index 6baeb005ca..07410493ad 100644 --- a/addons/medical_treatment/functions/fnc_unloadUnit.sqf +++ b/addons/medical_treatment/functions/fnc_unloadUnit.sqf @@ -36,7 +36,7 @@ if (_patient call EFUNC(common,isAwake)) exitWith { params ["_unit", "_vehicle"]; TRACE_2("success",_unit,_vehicle); private _patientName = [_unit, false, true] call EFUNC(common,getName); - private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); + private _vehicleName = getText (configOf _vehicle >> "displayName"); [[LSTRING(UnloadedFrom), _patientName, _vehicleName], 3] call EFUNC(common,displayTextStructured); }, [_patient, vehicle _patient], 3, { params ["_unit", "_vehicle"]; diff --git a/addons/minedetector/XEH_postInit.sqf b/addons/minedetector/XEH_postInit.sqf index 1c448794cc..0b8a521155 100644 --- a/addons/minedetector/XEH_postInit.sqf +++ b/addons/minedetector/XEH_postInit.sqf @@ -24,7 +24,7 @@ addMissionEventHandler ["Draw3D", { drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [0,0,1,1], _detectorPointAGL, 1, 1, 0, "detector", 1, 0.02, "PuristaMedium"]; { private _name = format ["%1@%2", typeOf _x, (floor ((_x distance _detectorPointAGL) * 10)) / 10]; - if ((getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> QGVAR(detectable))) == 1) then { + if ((getNumber (configOf _x >> QGVAR(detectable))) == 1) then { drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [1,0,0,1], (ASLtoAGL (getPosASL _x)), 1, 1, 0, _name, 1, 0.02, "PuristaMedium"]; } else { drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [1,1,0,1], (ASLtoAGL (getPosASL _x)), 1, 1, 0, _name, 1, 0.02, "PuristaMedium"]; diff --git a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf index 200e398133..10c3bd5892 100644 --- a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf +++ b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf @@ -18,7 +18,7 @@ params ["_firedEH", "", "", "", "_stateParams"]; _firedEH params ["_shooter","_weapon","","","","","_projectile"]; _stateParams params ["", "_seekerStateParams"]; -private _usePilotCamera = getNumber (([_shooter] call CBA_fnc_getObjectConfig) >> "pilotCamera" >> QGVAR(usePilotCameraForTargeting)) == 1; +private _usePilotCamera = getNumber (configOf _shooter >> "pilotCamera" >> QGVAR(usePilotCameraForTargeting)) == 1; private _turretPath = [_shooter, _weapon] call CBA_fnc_turretPathWeapon; private _turretConfig = [_shooter, _turretPath] call CBA_fnc_getTurret; diff --git a/addons/missileguidance/functions/fnc_ahr_onFired.sqf b/addons/missileguidance/functions/fnc_ahr_onFired.sqf index 331484f4a2..c7a3e5561c 100644 --- a/addons/missileguidance/functions/fnc_ahr_onFired.sqf +++ b/addons/missileguidance/functions/fnc_ahr_onFired.sqf @@ -30,7 +30,7 @@ if !(_target isKindOf "AllVehicles") then { _launchParams set [0, _target]; _projectile setMissileTarget objNull; // to emulate a no launch warning -private _projectileConfig = [_projectile] call CBA_fnc_getObjectConfig; +private _projectileConfig = configOf _projectile; private _config = _projectileConfig >> "ace_missileguidance"; private _isActive = false; diff --git a/addons/missileguidance/functions/fnc_wire_onFired.sqf b/addons/missileguidance/functions/fnc_wire_onFired.sqf index 295d6a2b5a..cb4020bd0f 100644 --- a/addons/missileguidance/functions/fnc_wire_onFired.sqf +++ b/addons/missileguidance/functions/fnc_wire_onFired.sqf @@ -19,7 +19,7 @@ _firedEH params ["_shooter","_weapon","","","","","_projectile", "_gunner"]; _stateParams params ["", "", "_attackProfileStateParams"]; _seekerParams params ["", "", "_seekerMaxRange", "_seekerMinRange"]; -private _config = ([_projectile] call CBA_fnc_getObjectConfig) >> "ace_missileguidance"; +private _config = configOf _projectile >> "ace_missileguidance"; private _maxCorrectableDistance = [_config >> "correctionDistance", "NUMBER", DEFAULT_CORRECTION_DISTANCE] call CBA_fnc_getConfigEntry; private _distanceAheadOfMissile = [_config >> "missileLeadDistance", "NUMBER", DEFAULT_LEAD_DISTANCE] call CBA_fnc_getConfigEntry; private _maxDistanceSqr = _seekerMaxRange * _seekerMaxRange; diff --git a/addons/nightvision/functions/fnc_refreshGoggleType.sqf b/addons/nightvision/functions/fnc_refreshGoggleType.sqf index c367d7a2f5..6bb9e35fdb 100644 --- a/addons/nightvision/functions/fnc_refreshGoggleType.sqf +++ b/addons/nightvision/functions/fnc_refreshGoggleType.sqf @@ -31,7 +31,7 @@ if (alive ACE_player) then { // Test if we are using player's nvg or if sourced from vehicle: private _currentVehicle = vehicle ACE_player; - private _vehConfig = configFile >> "CfgVehicles" >> (typeOf _currentVehicle); + private _vehConfig = configOf _currentVehicle; if (cameraView != "GUNNER") exitWith {true}; // asume hmd usage outside of gunner view if ([ACE_player] call CBA_fnc_canUseWeapon) exitWith {true}; // FFV diff --git a/addons/pylons/functions/fnc_onButtonLoad.sqf b/addons/pylons/functions/fnc_onButtonLoad.sqf index af3183073a..f689c8bf82 100644 --- a/addons/pylons/functions/fnc_onButtonLoad.sqf +++ b/addons/pylons/functions/fnc_onButtonLoad.sqf @@ -37,7 +37,7 @@ private _fnc_setSelections = { } forEach GVAR(comboBoxes); }; -private _pylonComponent = configFile >> "CfgVehicles" >> typeOf GVAR(currentAircraft) >> "Components" >> "TransportPylonsComponent"; +private _pylonComponent = configOf GVAR(currentAircraft) >> "Components" >> "TransportPylonsComponent"; private _loadoutFound = { if (getText (_x >> "displayName") isEqualTo _loadoutName) exitWith { // Get default turrets from config diff --git a/addons/pylons/functions/fnc_showDialog.sqf b/addons/pylons/functions/fnc_showDialog.sqf index 119489f4d8..146238a1b7 100644 --- a/addons/pylons/functions/fnc_showDialog.sqf +++ b/addons/pylons/functions/fnc_showDialog.sqf @@ -48,7 +48,7 @@ if (GVAR(rearmNewPylons) || {_isCurator}) then { ctrlShow [ID_TEXT_BANNER, false]; }; -private _config = configFile >> "CfgVehicles" >> typeOf _aircraft; +private _config = configOf _aircraft; private _pylonComponent = _config >> "Components" >> "TransportPylonsComponent"; ctrlSetText [ID_PICTURE_AIRCRAFT, getText (_pylonComponent >> "uiPicture")]; diff --git a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf index bd3157c15f..a4ccc737e7 100644 --- a/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf +++ b/addons/quickmount/functions/fnc_addFreeSeatsActions.sqf @@ -94,7 +94,7 @@ scopeName "main"; params ["_vehicle", "_player"]; -private _vehicleConfig = configFile >> "CfgVehicles" >> typeOf _vehicle; +private _vehicleConfig = configOf _vehicle; private _isInVehicle = _player in _vehicle; private _fullCrew = fullCrew [_vehicle, "", true]; diff --git a/addons/quickmount/functions/fnc_getInNearest.sqf b/addons/quickmount/functions/fnc_getInNearest.sqf index 7b1ac71868..341568e24a 100644 --- a/addons/quickmount/functions/fnc_getInNearest.sqf +++ b/addons/quickmount/functions/fnc_getInNearest.sqf @@ -72,7 +72,7 @@ if (!isNull _target && private _effectiveRole = toLower _role; if ((_effectiveRole in ["driver", "gunner"]) && {unitIsUAV _target}) exitWith {}; // Ignoring UAV Driver/Gunner - if ((_effectiveRole == "driver") && {(getNumber (([_target] call CBA_fnc_getObjectConfig) >> "hasDriver")) == 0}) exitWith {}; // Ignoring Non Driver (static weapons) + if ((_effectiveRole == "driver") && {(getNumber (configOf _target >> "hasDriver")) == 0}) exitWith {}; // Ignoring Non Driver (static weapons) // Seats can be locked independently of the main vehicle if ((_role == "driver") && {lockedDriver _target}) exitWith {TRACE_1("lockedDriver",_x);}; diff --git a/addons/rearm/Cfg3DEN.hpp b/addons/rearm/Cfg3DEN.hpp index 05eb3c05ff..05581e7206 100644 --- a/addons/rearm/Cfg3DEN.hpp +++ b/addons/rearm/Cfg3DEN.hpp @@ -1,5 +1,5 @@ #define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) -#define DEFAULT_REARMCARGO GET_NUMBER(configFile >> 'CfgVehicles' >> typeOf _this >> QQGVAR(defaultSupply),-1) +#define DEFAULT_REARMCARGO GET_NUMBER(configOf _this >> QQGVAR(defaultSupply),-1) class Cfg3DEN { diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index 480cc90007..4557532f56 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -44,7 +44,7 @@ private _vehicleActions = []; TRACE_2("can add",_x,_magazineHelper); if (!(_magazineHelper isEqualTo [])) then { - private _icon = getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Icon"); + private _icon = getText(configOf _vehicle >> "Icon"); if !((_icon select [0, 1]) == "\") then { _icon = ""; }; @@ -52,7 +52,7 @@ private _vehicleActions = []; // [Level 0] adds a single action to rearm the entire vic private _action = [ _vehicle, - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName"), + getText(configOf _vehicle >> "displayName"), _icon, {_this call FUNC(rearmEntireVehicle)}, {true}, @@ -79,7 +79,7 @@ private _vehicleActions = []; private _action = [ _vehicle, - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName"), + getText(configOf _vehicle >> "displayName"), _icon, {}, {true}, diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf index 9dbcf463eb..19802c0140 100644 --- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf +++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf @@ -30,7 +30,7 @@ params ["_vehicle"]; private _magazineInfo = []; // 1.70 pylons -private _pylonConfigs = configProperties [configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]; +private _pylonConfigs = configProperties [configOf _vehicle >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]; { private _pylonConfig = _x; diff --git a/addons/rearm/functions/fnc_getSupplyCount.sqf b/addons/rearm/functions/fnc_getSupplyCount.sqf index 892764b76f..87a1dd1ee8 100644 --- a/addons/rearm/functions/fnc_getSupplyCount.sqf +++ b/addons/rearm/functions/fnc_getSupplyCount.sqf @@ -25,8 +25,8 @@ if (GVAR(supply) != 1) exitWith { private _supply = _truck getVariable QGVAR(currentSupply); if (isNil "_supply") then { - if (isNumber (configFile >> "CfgVehicles" >> typeOf _truck >> QGVAR(defaultSupply))) then { - _supply = getNumber (configFile >> "CfgVehicles" >> typeOf _truck >> QGVAR(defaultSupply)); + if (isNumber (configOf _truck >> QGVAR(defaultSupply))) then { + _supply = getNumber (configOf _truck >> QGVAR(defaultSupply)); } else { _supply = 1200; }; diff --git a/addons/rearm/functions/fnc_isSource.sqf b/addons/rearm/functions/fnc_isSource.sqf index 175ab60f8e..c79c78308c 100644 --- a/addons/rearm/functions/fnc_isSource.sqf +++ b/addons/rearm/functions/fnc_isSource.sqf @@ -22,7 +22,7 @@ params [ if ((_target getVariable [QGVAR(currentSupply), 0]) < 0) exitWith {false}; -private _vehCfg = configFile >> "CfgVehicles" >> typeOf _target; +private _vehCfg = configOf _target; private _vanillaCargoConfig = getNumber (_vehCfg >> "transportAmmo"); private _rearmCargoConfig = getNumber (_vehCfg >> QGVAR(defaultSupply)); private _supplyVehicle = _target getVariable [QGVAR(isSupplyVehicle), false]; diff --git a/addons/rearm/functions/fnc_makeSource.sqf b/addons/rearm/functions/fnc_makeSource.sqf index c96c3a214a..36f3fba553 100644 --- a/addons/rearm/functions/fnc_makeSource.sqf +++ b/addons/rearm/functions/fnc_makeSource.sqf @@ -41,7 +41,7 @@ private _currentSupply = if (_addToCurrent) then { _source setVariable [QGVAR(currentSupply), _currentSupply + _rearmCargo, true]; -private _rearmCargoConfig = getNumber (configFile >> "CfgVehicles" >> typeOf _source >> QGVAR(defaultSupply)); +private _rearmCargoConfig = getNumber (configOf _source >> QGVAR(defaultSupply)); // already initialized because this is a config rearm vehicle if (_rearmCargoConfig > 0 || _source getVariable [QGVAR(isSupplyVehicle), false]) exitWith {}; diff --git a/addons/rearm/functions/fnc_rearm.sqf b/addons/rearm/functions/fnc_rearm.sqf index 6b5a3da12c..779ebf2d51 100644 --- a/addons/rearm/functions/fnc_rearm.sqf +++ b/addons/rearm/functions/fnc_rearm.sqf @@ -43,7 +43,7 @@ private _magazineDisplayName = _magazineClass call FUNC(getMagazineName); [_target, _unit, _turretPath, _magazineCount, _magazineClass, (REARM_COUNT select _idx), _pylon], {(_this select 0) call FUNC(rearmSuccess)}, "", - format [localize LSTRING(RearmAction), getText(configFile >> "CfgVehicles" >> (typeOf _target) >> "displayName"), _magazineDisplayName], + format [localize LSTRING(RearmAction), getText(configOf _target >> "displayName"), _magazineDisplayName], { param [0] params ["_target", "_unit"]; _player distance _target <= GVAR(distance); diff --git a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf index df06d384d4..945a0c0632 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf @@ -25,7 +25,7 @@ TRACE_3("rearmEntireVehicle",_truck,_player,_vehicle); [_truck, _vehicle, _player], {(_this select 0) call FUNC(rearmEntireVehicleSuccess)}, "", - format [localize LSTRING(BasicRearmAction), getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], + format [localize LSTRING(BasicRearmAction), getText(configOf _vehicle >> "displayName")], { param [0] params ["", "_vehicle", "_player"]; _player distance _vehicle <= GVAR(distance); diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf index 922d25b646..282a38b4e9 100644 --- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf @@ -34,7 +34,7 @@ if (_pylon > 0) exitWith { _vehicle setPylonLoadOut [_pylon, _magazineClass, true, _turretPath]; [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _rounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; + getText(configOf _vehicle >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; } else { // Fill only at most _numRounds if (_turretPath isEqualTo [-1]) then {_turretPath = [];}; // Convert back to pylon turret format @@ -45,7 +45,7 @@ if (_pylon > 0) exitWith { _vehicle setAmmoOnPylon [_pylon, _newCount]; [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _numRounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; + getText(configOf _vehicle >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; }; }; @@ -90,4 +90,4 @@ if (_ammoAdded == 0) exitWith {ERROR_1("could not load any ammo - %1",_this);}; [QEGVAR(common,displayTextStructured), [[LSTRING(Hint_RearmedTriple), _ammoAdded, _magazineClass call FUNC(getMagazineName), -getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; +getText(configOf _vehicle >> "displayName")], 3, _unit], [_unit]] call CBA_fnc_targetEvent; diff --git a/addons/rearm/functions/fnc_storeAmmo.sqf b/addons/rearm/functions/fnc_storeAmmo.sqf index 18b316d601..f693724323 100644 --- a/addons/rearm/functions/fnc_storeAmmo.sqf +++ b/addons/rearm/functions/fnc_storeAmmo.sqf @@ -33,7 +33,7 @@ private _magazineClass = _attachedDummy getVariable [QGVAR(magazineClass), "#noV [_unit, true, true] call FUNC(dropAmmo); }, "", - format [localize LSTRING(StoreAmmoAction), _magazineClass call FUNC(getMagazineName), getText(configFile >> "CfgVehicles" >> (typeOf _truck) >> "displayName")], + format [localize LSTRING(StoreAmmoAction), _magazineClass call FUNC(getMagazineName), getText(configOf _truck >> "displayName")], {true}, ["isnotinside"] ] call EFUNC(common,progressBar); diff --git a/addons/rearm/functions/fnc_takeAmmo.sqf b/addons/rearm/functions/fnc_takeAmmo.sqf index 1c1e325de8..12678b48c6 100644 --- a/addons/rearm/functions/fnc_takeAmmo.sqf +++ b/addons/rearm/functions/fnc_takeAmmo.sqf @@ -30,7 +30,7 @@ REARM_HOLSTER_WEAPON; private _targetName = if (_vehicle == _unit) then { "CSW" } else { - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName") + getText(configOf _vehicle >> "displayName") }; [ diff --git a/addons/refuel/Cfg3DEN.hpp b/addons/refuel/Cfg3DEN.hpp index 3dbc91c2cf..e8ed2790f8 100644 --- a/addons/refuel/Cfg3DEN.hpp +++ b/addons/refuel/Cfg3DEN.hpp @@ -1,8 +1,8 @@ #define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) #define GET_1ST_ARRAY(config) (if (isArray (config)) then {getArray (config) select 0} else {[ARR_3(0,0,0)]}) -#define DEFAULT_FUELCARGO GET_NUMBER(configFile >> 'CfgVehicles' >> typeOf _this >> QQGVAR(fuelCargo),REFUEL_DISABLED_FUEL) -#define DEFAULT_HOOKS GET_1ST_ARRAY(configFile >> 'CfgVehicles' >> typeOf _this >> QQGVAR(hooks)) +#define DEFAULT_FUELCARGO GET_NUMBER(configOf _this >> QQGVAR(fuelCargo),REFUEL_DISABLED_FUEL) +#define DEFAULT_HOOKS GET_1ST_ARRAY(configOf _this >> QQGVAR(hooks)) class Cfg3DEN { class Object { diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf index e6c0ad5b93..14e9b439c9 100644 --- a/addons/refuel/XEH_postInit.sqf +++ b/addons/refuel/XEH_postInit.sqf @@ -86,7 +86,7 @@ _cacheRefuelClasses params [["_staticClasses", [], [[]]], ["_dynamicClasses", [] #ifdef DRAW_HOOKS_POS addMissionEventHandler ["Draw3D", { private _source = cursorObject; - private _cfgPos = getArray (configFile >> "CfgVehicles" >> typeOf _source >> QGVAR(hooks)); + private _cfgPos = getArray (configOf _source >> QGVAR(hooks)); private _dynPos = _source getVariable [QGVAR(hooks), []]; { drawIcon3D ["\a3\ui_f\data\gui\cfg\hints\icon_text\group_1_ca.paa", [1,1,1,1], _source modelToWorldVisual _x, 1, 1, 0, format ["Hook %1", _forEachIndex]]; diff --git a/addons/refuel/functions/fnc_getFuel.sqf b/addons/refuel/functions/fnc_getFuel.sqf index ecba330363..a51b6df411 100644 --- a/addons/refuel/functions/fnc_getFuel.sqf +++ b/addons/refuel/functions/fnc_getFuel.sqf @@ -22,7 +22,7 @@ if (isNull _source) exitWith {0}; private _fuel = _source getVariable QGVAR(currentFuelCargo); if (isNil "_fuel") then { - _fuel = getNumber (configFile >> "CfgVehicles" >> typeOf _source >> QGVAR(fuelCargo)); + _fuel = getNumber (configOf _source >> QGVAR(fuelCargo)); _source setVariable [QGVAR(currentFuelCargo), _fuel, true]; }; diff --git a/addons/refuel/functions/fnc_makeSource.sqf b/addons/refuel/functions/fnc_makeSource.sqf index 7b2179adab..5553e1a906 100644 --- a/addons/refuel/functions/fnc_makeSource.sqf +++ b/addons/refuel/functions/fnc_makeSource.sqf @@ -32,7 +32,7 @@ params [ ]; TRACE_3("makeSource",_source,_fuelCargo,_hooks); -private _fuelCargoConfig = getNumber (configFile >> "CfgVehicles" >> typeOf _source >> QGVAR(fuelCargo)); +private _fuelCargoConfig = getNumber (configOf _source >> QGVAR(fuelCargo)); if ( isNull _source diff --git a/addons/refuel/functions/fnc_onMouseButtonDown.sqf b/addons/refuel/functions/fnc_onMouseButtonDown.sqf index 2111be99e8..184ede22eb 100644 --- a/addons/refuel/functions/fnc_onMouseButtonDown.sqf +++ b/addons/refuel/functions/fnc_onMouseButtonDown.sqf @@ -45,7 +45,7 @@ if (cameraView == "EXTERNAL") then { if ( !isNull _cursorObject && {_distance < REFUEL_NOZZLE_ACTION_DISTANCE} - && {1 == getNumber (configFile >> "CfgVehicles" >> (typeOf _cursorObject) >> QGVAR(canReceive))} + && {1 == getNumber (configOf _cursorObject >> QGVAR(canReceive))} && {isNull (_cursorObject getVariable [QGVAR(nozzle), objNull])} && {!lineIntersects [eyePos _unit, _virtualPosASL, _unit]} ) then { diff --git a/addons/refuel/functions/fnc_refuel.sqf b/addons/refuel/functions/fnc_refuel.sqf index f3e042cd56..0104c45a5c 100644 --- a/addons/refuel/functions/fnc_refuel.sqf +++ b/addons/refuel/functions/fnc_refuel.sqf @@ -20,7 +20,7 @@ params [["_unit", objNull, [objNull]], ["_sink", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_connectToPoint", [0,0,0], [[]], 3]]; -private _config = configFile >> "CfgVehicles" >> typeOf _sink; +private _config = configOf _sink; private _rate = getNumber (_config >> QGVAR(flowRate)) * GVAR(rate); private _maxFuel = getNumber (_config >> QGVAR(fuelCapacity)); diff --git a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf index 9fae9abdab..d33bb4f100 100644 --- a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf +++ b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf @@ -96,7 +96,7 @@ TRACE_2("start",_unit,_nozzle); getCursorObjectParams params ["_cursorObject", "", "_distance"]; if (!isNull _cursorObject && {_distance < REFUEL_NOZZLE_ACTION_DISTANCE}) then { if ( - 1 == getNumber (configFile >> "CfgVehicles" >> (typeOf _cursorObject) >> QGVAR(canReceive)) + 1 == getNumber (configOf _cursorObject >> QGVAR(canReceive)) && {isNull (_cursorObject getVariable [QGVAR(nozzle), objNull])} ) then { _hintLMB = localize LSTRING(Connect); diff --git a/addons/refuel/functions/fnc_takeNozzle.sqf b/addons/refuel/functions/fnc_takeNozzle.sqf index 83e38c1be6..7ce0a9d808 100644 --- a/addons/refuel/functions/fnc_takeNozzle.sqf +++ b/addons/refuel/functions/fnc_takeNozzle.sqf @@ -47,7 +47,7 @@ params [ if !(_source isKindOf "AllVehicles") then { private _helper = QGVAR(helper) createVehicle [0,0,0]; [QEGVAR(common,hideObjectGlobal), [_helper, true]] call CBA_fnc_serverEvent; - if ((getText (configFile >> "CfgVehicles" >> typeOf _source >> "simulation")) isEqualTo "thingX") then { + if ((getText (configOf _source >> "simulation")) isEqualTo "thingX") then { _helper attachTo [_source, [0,0,0]]; } else { _helper setPosWorld (getPosWorld _source); @@ -57,7 +57,7 @@ params [ _nozzle setVariable [QGVAR(helper), _helper, true]; _ropeTarget = _helper; }; - private _attachPos = _source getVariable [QGVAR(hooks), getArray (configFile >> "CfgVehicles" >> typeOf _source >> QGVAR(hooks))]; + private _attachPos = _source getVariable [QGVAR(hooks), getArray (configOf _source >> QGVAR(hooks))]; if (_attachPos isEqualTo []) then { _attachPos = [[0,0,0]]; }; diff --git a/addons/repair/CfgEden.hpp b/addons/repair/CfgEden.hpp index 03614b3a2f..3edc9420b0 100644 --- a/addons/repair/CfgEden.hpp +++ b/addons/repair/CfgEden.hpp @@ -1,7 +1,7 @@ #define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) #define DEFAULT_ISENGINEER ([ARR_2(0,1)] select (_this getUnitTrait 'engineer')) -#define DEFAULT_ISREPAIRVEHICLE GET_NUMBER(configFile >> 'CfgVehicles' >> typeOf _this >> QQGVAR(canRepair),0) +#define DEFAULT_ISREPAIRVEHICLE GET_NUMBER(configOf _this >> QQGVAR(canRepair),0) class ctrlToolbox; diff --git a/addons/repair/dev/draw_showRepairInfo.sqf b/addons/repair/dev/draw_showRepairInfo.sqf index 3a1f0c8d0f..b5516d6b98 100644 --- a/addons/repair/dev/draw_showRepairInfo.sqf +++ b/addons/repair/dev/draw_showRepairInfo.sqf @@ -5,7 +5,7 @@ addMissionEventHandler ["Draw3D", { if !((cursorObject isKindOf "Car") || (cursorObject isKindOf "Tank") || (cursorObject isKindOf "Air")) exitWith {}; - private _config = configFile >> "CfgVehicles" >> (typeOf cursorObject); + private _config = configOf cursorObject; private _hitpointPositions = getArray (_config >> QGVAR(hitpointPositions)); private _hitpointGroups = getArray (_config >> QGVAR(hitpointGroups)); diff --git a/addons/repair/functions/fnc_canMiscRepair.sqf b/addons/repair/functions/fnc_canMiscRepair.sqf index b9fe842a19..2fc4c2b3d6 100644 --- a/addons/repair/functions/fnc_canMiscRepair.sqf +++ b/addons/repair/functions/fnc_canMiscRepair.sqf @@ -24,7 +24,7 @@ params ["_caller", "_target", "_hitPointIndex"]; if !([_caller, _target, ["isNotDragging", "isNotCarrying", "isNotSwimming", "isNotOnLadder"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Get hitpoint groups if available -private _hitpointGroupConfig = configFile >> "CfgVehicles" >> typeOf _target >> QGVAR(hitpointGroups); +private _hitpointGroupConfig = configOf _target >> QGVAR(hitpointGroups); private _hitpointGroup = []; if (isArray _hitpointGroupConfig) then { private _hitPointClassname = _allHitPoints select _hitPointIndex; diff --git a/addons/repair/functions/fnc_doRepair.sqf b/addons/repair/functions/fnc_doRepair.sqf index c17858d8b3..1b6f497d8e 100644 --- a/addons/repair/functions/fnc_doRepair.sqf +++ b/addons/repair/functions/fnc_doRepair.sqf @@ -39,7 +39,7 @@ if (_hitPointNewDamage < _hitPointCurDamage) then { }; // Get hitpoint groups if available -private _hitpointGroupConfig = configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(hitpointGroups); +private _hitpointGroupConfig = configOf _vehicle >> QGVAR(hitpointGroups); if (isArray _hitpointGroupConfig) then { // Retrieve hitpoint subgroup if current hitpoint is main hitpoint of a group { diff --git a/addons/repair/functions/fnc_getPostRepairDamage.sqf b/addons/repair/functions/fnc_getPostRepairDamage.sqf index d8ed7d3804..cf0ff923bd 100644 --- a/addons/repair/functions/fnc_getPostRepairDamage.sqf +++ b/addons/repair/functions/fnc_getPostRepairDamage.sqf @@ -21,7 +21,7 @@ TRACE_1("params",_unit); //If in facility or near vehicle then complete repair of hitpoint: if (([_unit] call FUNC(isInRepairFacility) || {[_unit] call FUNC(isNearRepairVehicle)})) exitWith {0}; -private _class = _unit getVariable ["ACE_IsEngineer", getNumber (configFile >> "CfgVehicles" >> typeOf _unit >> "engineer")]; +private _class = _unit getVariable ["ACE_IsEngineer", getNumber (configOf _unit >> "engineer")]; //If advanced or more qualified than min, then use engineer threshold: if ((_class isEqualTo 2) || {[_unit, GVAR(engineerSetting_Repair) + 1] call FUNC(isEngineer)}) exitWith { (GVAR(repairDamageThreshold_Engineer) min GVAR(repairDamageThreshold)) diff --git a/addons/repair/functions/fnc_getWheelHitPointsWithSelections.sqf b/addons/repair/functions/fnc_getWheelHitPointsWithSelections.sqf index fe072859b2..9a5d32fdd9 100644 --- a/addons/repair/functions/fnc_getWheelHitPointsWithSelections.sqf +++ b/addons/repair/functions/fnc_getWheelHitPointsWithSelections.sqf @@ -20,7 +20,7 @@ params ["_vehicle"]; TRACE_1("params",_vehicle); // get the vehicles wheel config -private _wheels = configFile >> "CfgVehicles" >> typeOf _vehicle >> "Wheels"; +private _wheels = configOf _vehicle >> "Wheels"; // exit with nothing if the vehicle has no wheels class if !(isClass _wheels) exitWith {TRACE_1("No Wheels",_wheels); [[],[]]}; diff --git a/addons/repair/functions/fnc_isInRepairFacility.sqf b/addons/repair/functions/fnc_isInRepairFacility.sqf index dcbd141fb7..1693297494 100644 --- a/addons/repair/functions/fnc_isInRepairFacility.sqf +++ b/addons/repair/functions/fnc_isInRepairFacility.sqf @@ -23,7 +23,7 @@ private _isInBuilding = false; private _checkObject = { if ( - _x getVariable ["ACE_isRepairFacility", getNumber (configFile >> "CfgVehicles" >> typeOf _x >> QGVAR(canRepair))] > 0 + _x getVariable ["ACE_isRepairFacility", getNumber (configOf _x >> QGVAR(canRepair))] > 0 && {!(_x isKindOf "AllVehicles")} // check if it's not repair vehicle && {alive _x} ) exitWith { diff --git a/addons/repair/functions/fnc_isRepairVehicle.sqf b/addons/repair/functions/fnc_isRepairVehicle.sqf index 6e7ddcab27..dd2f69f34c 100644 --- a/addons/repair/functions/fnc_isRepairVehicle.sqf +++ b/addons/repair/functions/fnc_isRepairVehicle.sqf @@ -21,5 +21,5 @@ TRACE_1("params",_vehicle); if (_vehicle isKindOf "CAManBase") exitWith {false}; // Value can be integer or boolean -private _value = _vehicle getVariable ["ACE_isRepairVehicle", getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(canRepair))]; +private _value = _vehicle getVariable ["ACE_isRepairVehicle", getNumber (configOf _vehicle >> QGVAR(canRepair))]; _value in [1, true] // return diff --git a/addons/repair/functions/fnc_normalizeHitPoints.sqf b/addons/repair/functions/fnc_normalizeHitPoints.sqf index 5a33151875..aef2b7ae21 100644 --- a/addons/repair/functions/fnc_normalizeHitPoints.sqf +++ b/addons/repair/functions/fnc_normalizeHitPoints.sqf @@ -23,7 +23,7 @@ if !(local _vehicle) exitWith {ERROR_1("Vehicle Not Local %1", _vehicle);}; (getAllHitPointsDamage _vehicle) params [["_allHitPoints", []]]; -private _config = configFile >> "CfgVehicles" >> typeOf _vehicle >> "HitPoints"; +private _config = configOf _vehicle >> "HitPoints"; private _realHitPoints = []; private _dependentHitPoints = []; diff --git a/addons/repair/functions/fnc_repair.sqf b/addons/repair/functions/fnc_repair.sqf index 1c0707f7ed..826187f6cc 100644 --- a/addons/repair/functions/fnc_repair.sqf +++ b/addons/repair/functions/fnc_repair.sqf @@ -181,7 +181,7 @@ private _soundPosition = AGLToASL (_caller modelToWorldVisual (_caller selection // Get repair time private _repairTime = [ - configFile >> "CfgVehicles" >> typeOf _target >> QGVAR(repairTimes) >> configName _config, + configOf _target >> QGVAR(repairTimes) >> configName _config, "number", -1 ] call CBA_fnc_getConfigEntry; diff --git a/addons/repair/functions/fnc_setHitPointDamage.sqf b/addons/repair/functions/fnc_setHitPointDamage.sqf index 0e8a805689..1bb98e702e 100644 --- a/addons/repair/functions/fnc_setHitPointDamage.sqf +++ b/addons/repair/functions/fnc_setHitPointDamage.sqf @@ -44,7 +44,7 @@ private _hitPointDamageRepaired = 0; //positive for repairs : newSum = (oldSum - if ((!isNil {_vehicle getHit _selectionName}) && {_x != ""}) then { _realHitpointCount = _realHitpointCount + 1; - if ((((toLower _x) find "glass") == -1) && {(getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "HitPoints" >> _x >> "depends")) in ["", "0"]}) then { + if ((((toLower _x) find "glass") == -1) && {(getText (configOf _vehicle >> "HitPoints" >> _x >> "depends")) in ["", "0"]}) then { _hitPointDamageSumOld = _hitPointDamageSumOld + (_allHitPointDamages select _forEachIndex); if (_forEachIndex == _hitPointIndex) then { _hitPointDamageRepaired = (_allHitPointDamages select _forEachIndex) - _hitPointDamage; diff --git a/addons/spectator/functions/fnc_ui_updateWidget.sqf b/addons/spectator/functions/fnc_ui_updateWidget.sqf index 32337eae3d..68a0c1fe4f 100644 --- a/addons/spectator/functions/fnc_ui_updateWidget.sqf +++ b/addons/spectator/functions/fnc_ui_updateWidget.sqf @@ -32,7 +32,7 @@ private _unitTypePicture = ""; private _vehicleTypePicture = ""; private _vehiclePositionPicture = ""; if (_focus != vehicle _focus) then { - _vehicleTypePicture = getText (configFile >> "CfgVehicles" >> typeOf vehicle _focus >> "Picture"); + _vehicleTypePicture = getText (configOf vehicle _focus >> "Picture"); _vehiclePositionPicture = switch (_focus) do { case (commander vehicle _focus): {IMG_COMMANDER}; diff --git a/addons/switchunits/functions/fnc_markAiOnMap.sqf b/addons/switchunits/functions/fnc_markAiOnMap.sqf index 6c2eb0b0d9..2de13634e8 100644 --- a/addons/switchunits/functions/fnc_markAiOnMap.sqf +++ b/addons/switchunits/functions/fnc_markAiOnMap.sqf @@ -54,7 +54,7 @@ GVAR(AllMarkerNames) = []; _markerName setMarkerTextLocal (_x getVariable [QGVAR(PlayerControlledName), ""]); } else { _markerName setMarkerColorLocal _markerColor; - _markerName setMarkerTextLocal (getText (configFile >> "CfgVehicles" >> typeOf _x >> "displayName")); + _markerName setMarkerTextLocal (getText (configOf _x >> "displayName")); }; GVAR(AllMarkerNames) pushBack _markerName; diff --git a/addons/trenches/functions/fnc_continueDiggingTrench.sqf b/addons/trenches/functions/fnc_continueDiggingTrench.sqf index 951bfa9d21..95a1d914b0 100644 --- a/addons/trenches/functions/fnc_continueDiggingTrench.sqf +++ b/addons/trenches/functions/fnc_continueDiggingTrench.sqf @@ -25,7 +25,7 @@ if(_actualProgress == 1) exitWith {}; // Mark trench as being worked on _trench setVariable [QGVAR(digging), true, true]; -private _digTime = missionNamespace getVariable [getText (configFile >> "CfgVehicles" >> (typeof _trench) >> QGVAR(diggingDuration)), 20]; +private _digTime = missionNamespace getVariable [getText (configOf _trench >> QGVAR(diggingDuration)), 20]; private _digTimeLeft = _digTime * (1 - _actualProgress); private _placeData = _trench getVariable [QGVAR(placeData), [[], []]]; @@ -79,7 +79,7 @@ if(_actualProgress == 0) then { _cutterPos set [2, getTerrainHeightASL _cutterPos]; _trenchGrassCutter setPosASL _cutterPos; deleteVehicle _trenchGrassCutter; - } foreach getArray (configFile >> "CfgVehicles" >> (typeof _trench) >> QGVAR(grassCuttingPoints)); + } foreach getArray (configOf _trench >> QGVAR(grassCuttingPoints)); }; private _progressLeft = (_actualProgress * 10) + 1; diff --git a/addons/trenches/functions/fnc_removeTrench.sqf b/addons/trenches/functions/fnc_removeTrench.sqf index 868daa738c..2cdb874846 100644 --- a/addons/trenches/functions/fnc_removeTrench.sqf +++ b/addons/trenches/functions/fnc_removeTrench.sqf @@ -25,7 +25,7 @@ if(_actualProgress == 0) exitWith {}; // Mark trench as being worked on _trench setVariable [QGVAR(digging), true, true]; -private _removeTime = missionNamespace getVariable [getText (configFile >> "CfgVehicles" >> (typeof _trench) >> QGVAR(removalDuration)), 12]; +private _removeTime = missionNamespace getVariable [getText (configOf _trench >> QGVAR(removalDuration)), 12]; private _removeTimeLeft = _removeTime * _actualProgress; if (isNil {_trench getVariable QGVAR(placeData)}) then { diff --git a/addons/zeus/functions/fnc_bi_moduleMine.sqf b/addons/zeus/functions/fnc_bi_moduleMine.sqf index 6b8866aaa4..40fce2d2ee 100644 --- a/addons/zeus/functions/fnc_bi_moduleMine.sqf +++ b/addons/zeus/functions/fnc_bi_moduleMine.sqf @@ -21,7 +21,7 @@ params ["_logic", "_units", "_activated"]; if (_activated) then { - _explosive = gettext (configfile >> "cfgvehicles" >> typeof _logic >> "explosive"); + _explosive = gettext (configOf _logic >> "explosive"); if (_explosive != "") then { _explosive = createvehicle [_explosive,position _logic,[],0,"none"]; _explosive attachto [_logic]; diff --git a/addons/zeus/functions/fnc_bi_moduleProjectile.sqf b/addons/zeus/functions/fnc_bi_moduleProjectile.sqf index 4439ad3517..a450b105c0 100644 --- a/addons/zeus/functions/fnc_bi_moduleProjectile.sqf +++ b/addons/zeus/functions/fnc_bi_moduleProjectile.sqf @@ -31,7 +31,7 @@ if ({local _x} count (objectcurators _logic) > 0) then { if !(isserver) exitwith {}; if (_activated) then { - _ammo = _logic getvariable ["type",gettext (configfile >> "cfgvehicles" >> typeof _logic >> "ammo")]; + _ammo = _logic getvariable ["type",gettext (configOf _logic >> "ammo")]; if (_ammo != "") then { _cfgAmmo = configfile >> "cfgammo" >> _ammo; //if !(isclass _cfgAmmo) exitwith {["CfgAmmo class '%1' not found.",_ammo] call bis_fnc_error;}; diff --git a/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf b/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf index 967edc9396..532d340416 100644 --- a/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf +++ b/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf @@ -32,7 +32,7 @@ if !(["ace_fastroping"] call EFUNC(common,isModLoaded)) then { if !(alive _mouseOverUnit) then { [LSTRING(OnlyAlive)] call FUNC(showMessage); } else { - private _config = configFile >> "CfgVehicles" >> typeOf _mouseOverUnit; + private _config = configOf _mouseOverUnit; private _displayName = getText (_config >> "displayName"); if !(isNumber (_config >> QEGVAR(fastroping,enabled))) then { [LSTRING(NotFastRopeCompatible), _displayName] call FUNC(showMessage); diff --git a/addons/zeus/functions/fnc_moduleSuppressiveFire.sqf b/addons/zeus/functions/fnc_moduleSuppressiveFire.sqf index 1900e5a7a3..3c5a67de75 100644 --- a/addons/zeus/functions/fnc_moduleSuppressiveFire.sqf +++ b/addons/zeus/functions/fnc_moduleSuppressiveFire.sqf @@ -49,7 +49,7 @@ if ([_unit] call EFUNC(common,isPlayer)) exitWith { private _targetASL = _mousePosASL vectorAdd [0,0,0.6]; // mouse pos is at ground level zero, raise up a bit; private _artilleryMag = ""; - if ((getNumber (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "artilleryScanner")) == 1) then { + if ((getNumber (configOf _vehicle >> "artilleryScanner")) == 1) then { // Artillery - Get mortar ammo type and verify in range if (isNull gunner _vehicle) exitWith {_targetASL = [];}; { diff --git a/addons/zeus/functions/fnc_moduleToggleNvg.sqf b/addons/zeus/functions/fnc_moduleToggleNvg.sqf index f8627acfe6..3f91286534 100644 --- a/addons/zeus/functions/fnc_moduleToggleNvg.sqf +++ b/addons/zeus/functions/fnc_moduleToggleNvg.sqf @@ -31,14 +31,13 @@ if (_target == -1) then { }; // Add or remove NVGs from units -private _cfgVehicles = configFile >> "CfgVehicles"; private _cfgWeapons = configFile >> "CfgWeapons"; if (_toggle) then { { if (hmd _x isEqualTo "") then { // Get NVG item and helmet from unit config - private _linkedItems = getArray (_cfgVehicles >> typeOf _x >> "linkedItems"); + private _linkedItems = getArray (configOf _x >> "linkedItems"); private _nvgItem = _linkedItems select {_x isKindOf ["NVGoggles", _cfgWeapons]}; private _nvgHelmet = _linkedItems select {!(getArray (_cfgWeapons >> _x >> "subItems") isEqualTo [])}; diff --git a/addons/zeus/functions/fnc_ui_attributeCargo.sqf b/addons/zeus/functions/fnc_ui_attributeCargo.sqf index b4fc156127..d2345e8a96 100644 --- a/addons/zeus/functions/fnc_ui_attributeCargo.sqf +++ b/addons/zeus/functions/fnc_ui_attributeCargo.sqf @@ -60,7 +60,7 @@ private _fnc_onButtonUnload = { private _class = if (_item isEqualType "") then {_item} else {typeOf _item}; private _itemName = getText (configFile >> "CfgVehicles" >> _class >> "displayName"); if ([_item, _vehicle] call EFUNC(cargo,unloadItem)) then { - private _vehicleName = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName"); + private _vehicleName = getText (configOf _vehicle >> "displayName"); private _message = [localize ELSTRING(cargo,UnloadedItem), "
", " "] call CBA_fnc_replace; [_message, _itemName, _vehicleName] call FUNC(showMessage); } else { From f85632cbbd7ae69eabbd08e6b62c28bb1ae318f9 Mon Sep 17 00:00:00 2001 From: TyroneMF Date: Thu, 18 Feb 2021 18:58:26 +0000 Subject: [PATCH 071/335] initial push (#8099) --- addons/advanced_fatigue/initSettings.sqf | 16 ++--- addons/arsenal/XEH_preInit.sqf | 14 ++-- addons/artillerytables/initSettings.sqf | 4 +- addons/cargo/initSettings.sqf | 6 +- .../fnc_cbaSettings_convertHelper.sqf | 2 +- .../fnc_cbaSettings_loadFromConfig.sqf | 2 +- addons/common/initSettings.sqf | 4 +- addons/cookoff/initSettings.sqf | 10 +-- addons/csw/initSettings.sqf | 10 +-- addons/fastroping/initSettings.sqf | 2 +- addons/interact_menu/initSettings.sqf | 18 ++--- addons/markers/initSettings.sqf | 2 +- addons/medical/initSettings.sqf | 10 +-- addons/medical_ai/initSettings.sqf | 2 +- addons/medical_blood/initSettings.sqf | 6 +- addons/medical_damage/initSettings.sqf | 8 +-- addons/medical_gui/initSettings.sqf | 12 ++-- addons/medical_statemachine/initSettings.sqf | 10 +-- addons/medical_status/initSettings.sqf | 6 +- addons/medical_treatment/initSettings.sqf | 68 +++++++++---------- addons/microdagr/initSettings.sqf | 4 +- addons/mk6mortar/initSettings.sqf | 8 +-- addons/nametags/initSettings.sqf | 12 ++-- addons/nightvision/initSettings.sqf | 12 ++-- addons/noradio/XEH_preInit.sqf | 2 +- addons/parachute/XEH_preInit.sqf | 2 +- addons/pylons/initSettings.sqf | 14 ++-- addons/quickmount/initSettings.sqf | 10 +-- addons/rearm/initSettings.sqf | 6 +- addons/refuel/initSettings.sqf | 4 +- addons/repair/initSettings.sqf | 26 +++---- addons/spectator/initSettings.sqf | 8 +-- addons/tagging/initSettings.sqf | 2 +- addons/vehiclelock/initSettings.sqf | 6 +- addons/weaponselect/initSettings.sqf | 2 +- addons/weather/initSettings.sqf | 8 +-- addons/zeus/initSettings.sqf | 2 +- 37 files changed, 170 insertions(+), 170 deletions(-) diff --git a/addons/advanced_fatigue/initSettings.sqf b/addons/advanced_fatigue/initSettings.sqf index fa90aa9a4b..7787fd3f5d 100644 --- a/addons/advanced_fatigue/initSettings.sqf +++ b/addons/advanced_fatigue/initSettings.sqf @@ -13,7 +13,7 @@ [QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged) }, true // Needs mission restart -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(enableStaminaBar), @@ -28,7 +28,7 @@ _staminaBarContainer ctrlCommit 0; }; } -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(fadeStaminaBar), @@ -43,7 +43,7 @@ _staminaBarContainer ctrlCommit 0; }; } -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(performanceFactor), @@ -52,7 +52,7 @@ LSTRING(DisplayName), [0, 5, 1, 1], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(recoveryFactor), @@ -61,7 +61,7 @@ LSTRING(DisplayName), [0, 5, 1, 1], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(loadFactor), @@ -70,7 +70,7 @@ LSTRING(DisplayName), [0, 5, 1, 1], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(terrainGradientFactor), @@ -79,7 +79,7 @@ LSTRING(DisplayName), [0, 5, 1, 1], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(swayFactor), @@ -88,4 +88,4 @@ LSTRING(DisplayName), [0, 5, 1, 1], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf index 1aebf5040f..3fb6a7817c 100644 --- a/addons/arsenal/XEH_preInit.sqf +++ b/addons/arsenal/XEH_preInit.sqf @@ -8,15 +8,15 @@ PREP_RECOMPILE_START; PREP_RECOMPILE_END; // Arsenal -[QGVAR(camInverted), "CHECKBOX", localize LSTRING(invertCameraSetting), localize LSTRING(settingCategory), false] call CBA_Settings_fnc_init; -[QGVAR(enableModIcons), "CHECKBOX", [LSTRING(modIconsSetting), LSTRING(modIconsTooltip)], localize LSTRING(settingCategory), true] call CBA_Settings_fnc_init; -[QGVAR(fontHeight), "SLIDER", [LSTRING(fontHeightSetting), LSTRING(fontHeightTooltip)], localize LSTRING(settingCategory), [1, 10, 4.5, 1]] call CBA_Settings_fnc_init; -[QGVAR(enableIdentityTabs), "CHECKBOX", localize LSTRING(enableIdentityTabsSettings), localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init; +[QGVAR(camInverted), "CHECKBOX", localize LSTRING(invertCameraSetting), localize LSTRING(settingCategory), false] call CBA_fnc_addSetting; +[QGVAR(enableModIcons), "CHECKBOX", [LSTRING(modIconsSetting), LSTRING(modIconsTooltip)], localize LSTRING(settingCategory), true] call CBA_fnc_addSetting; +[QGVAR(fontHeight), "SLIDER", [LSTRING(fontHeightSetting), LSTRING(fontHeightTooltip)], localize LSTRING(settingCategory), [1, 10, 4.5, 1]] call CBA_fnc_addSetting; +[QGVAR(enableIdentityTabs), "CHECKBOX", localize LSTRING(enableIdentityTabsSettings), localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; // Arsenal loadouts -[QGVAR(allowDefaultLoadouts), "CHECKBOX", [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init; -[QGVAR(allowSharedLoadouts), "CHECKBOX", localize LSTRING(allowSharingSetting), localize LSTRING(settingCategory), true, true] call CBA_Settings_fnc_init; -[QGVAR(EnableRPTLog), "CHECKBOX", [LSTRING(printToRPTSetting), LSTRING(printToRPTTooltip)], localize LSTRING(settingCategory), false, false] call CBA_Settings_fnc_init; +[QGVAR(allowDefaultLoadouts), "CHECKBOX", [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; +[QGVAR(allowSharedLoadouts), "CHECKBOX", localize LSTRING(allowSharingSetting), localize LSTRING(settingCategory), true, true] call CBA_fnc_addSetting; +[QGVAR(EnableRPTLog), "CHECKBOX", [LSTRING(printToRPTSetting), LSTRING(printToRPTTooltip)], localize LSTRING(settingCategory), false, false] call CBA_fnc_addSetting; [QGVAR(statsToggle), { params ["_display", "_showStats"]; diff --git a/addons/artillerytables/initSettings.sqf b/addons/artillerytables/initSettings.sqf index c578901e2e..0a909ae41b 100644 --- a/addons/artillerytables/initSettings.sqf +++ b/addons/artillerytables/initSettings.sqf @@ -10,7 +10,7 @@ private _categoryName = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art" true, // isGlobal {[QGVAR(advancedCorrections), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(disableArtilleryComputer), "CHECKBOX", @@ -20,4 +20,4 @@ private _categoryName = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art" true, // isGlobal {[QGVAR(disableArtilleryComputer), _this] call EFUNC(common,cbaSettings_settingChanged)}, false // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/cargo/initSettings.sqf b/addons/cargo/initSettings.sqf index cbf0a121e5..83bc2d6b31 100644 --- a/addons/cargo/initSettings.sqf +++ b/addons/cargo/initSettings.sqf @@ -5,7 +5,7 @@ true, true, {[QGVAR(enable), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(loadTimeCoefficient), "SLIDER", @@ -14,7 +14,7 @@ [0, 10, 5, 1], true, {[QGVAR(loadTimeCoefficient), _this, true] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(paradropTimeCoefficent), "SLIDER", @@ -23,4 +23,4 @@ [0, 10, 2.5, 1], true, {[QGVAR(paradropTimeCoefficent), _this, true] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf index 8c892bcf13..b2b23eec91 100644 --- a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf +++ b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf @@ -123,7 +123,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x _output pushBack format [" {[""%1"", _this] call ace_common_fnc_cbaSettings_settingChanged},", _varName]; }; _output pushBack format [" %1 // Needs mission restart", _warnIfChangedMidMission]; - _output pushBack "] call CBA_settings_fnc_init;"; + _output pushBack "] call CBA_fnc_addSetting;"; } forEach _settings; copyToClipboard (_output joinString endl); diff --git a/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf b/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf index 7f6637f622..d6ded9969e 100644 --- a/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf +++ b/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf @@ -98,7 +98,7 @@ private _code = compile format ['["%1", _this] call FUNC(cbaSettings_settingChan TRACE_2("setting",_cbaSettingType,_cbaValueInfo); TRACE_4("",_isForced,_cbaIsGlobal,_category,_cbaValueInfo); -private _return = [_varName, _cbaSettingType, [_localizedName, _localizedDescription], _category, _cbaValueInfo, _cbaIsGlobal, _code, _warnIfChangedMidMission] call CBA_settings_fnc_init; +private _return = [_varName, _cbaSettingType, [_localizedName, _localizedDescription], _category, _cbaValueInfo, _cbaIsGlobal, _code, _warnIfChangedMidMission] call CBA_fnc_addSetting; TRACE_1("returned",_return); if ((isNil "_return") || {_return != 0}) then {ERROR_1("Setting [%1] - CBA Error",_varName);}; _return diff --git a/addons/common/initSettings.sqf b/addons/common/initSettings.sqf index fcaa242ac3..7546256d1b 100644 --- a/addons/common/initSettings.sqf +++ b/addons/common/initSettings.sqf @@ -6,7 +6,7 @@ false, false, LINKFUNC(switchPersistentLaser) -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowFadeMusic), @@ -15,4 +15,4 @@ localize LSTRING(ACEKeybindCategoryCommon), true, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/cookoff/initSettings.sqf b/addons/cookoff/initSettings.sqf index ce510a299d..42a4ac3397 100644 --- a/addons/cookoff/initSettings.sqf +++ b/addons/cookoff/initSettings.sqf @@ -8,7 +8,7 @@ true, // isGlobal {[QGVAR(enable), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(enableAmmobox), "CHECKBOX", @@ -18,7 +18,7 @@ true, // isGlobal {[QGVAR(enableAmmobox), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(enableAmmoCookoff), "CHECKBOX", @@ -28,7 +28,7 @@ true, // isGlobal {[QGVAR(enableAmmoCookoff), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(ammoCookoffDuration), "SLIDER", @@ -38,7 +38,7 @@ true, // isGlobal {[QGVAR(ammoCookoffDuration), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(probabilityCoef), "SLIDER", @@ -48,4 +48,4 @@ true, // isGlobal {[QGVAR(probabilityCoef), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/csw/initSettings.sqf b/addons/csw/initSettings.sqf index 28397a6e9b..10030b68da 100644 --- a/addons/csw/initSettings.sqf +++ b/addons/csw/initSettings.sqf @@ -10,7 +10,7 @@ private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; true, // isGlobal {[QGVAR(defaultAssemblyMode), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(handleExtraMagazines), "CHECKBOX", @@ -20,7 +20,7 @@ private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; true, // isGlobal {[QGVAR(handleExtraMagazines), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(ammoHandling), "LIST", @@ -30,7 +30,7 @@ private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; true, // isGlobal {[QGVAR(ammoHandling), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(progressBarTimeCoefficent), "SLIDER", @@ -40,7 +40,7 @@ private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; true, // isGlobal {[QGVAR(progressBarTimeCoefficent), _this] call EFUNC(common,cbaSettings_settingChanged)}, false // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(dragAfterDeploy), "CHECKBOX", @@ -50,4 +50,4 @@ private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]]; false, // isGlobal {[QGVAR(dragAfterDeploy), _this] call EFUNC(common,cbaSettings_settingChanged)}, false // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/fastroping/initSettings.sqf b/addons/fastroping/initSettings.sqf index eac47639c6..5888f49aa2 100644 --- a/addons/fastroping/initSettings.sqf +++ b/addons/fastroping/initSettings.sqf @@ -10,4 +10,4 @@ private _category = ["ACE Uncategorized", LLSTRING(setting_categoryMenu_displayN true, // isGlobal {[QGVAR(requireRopeItems), _this] call EFUNC(common,cbaSettings_settingChanged)}, false // needRestart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/interact_menu/initSettings.sqf b/addons/interact_menu/initSettings.sqf index 6b58196f07..f9395f69e6 100644 --- a/addons/interact_menu/initSettings.sqf +++ b/addons/interact_menu/initSettings.sqf @@ -6,7 +6,7 @@ [1, 0, 0], false, {GVAR(selectorColorHex) = _this call BIS_fnc_colorRGBtoHTML} // Stored in Hex to avoid constant conversion -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(consolidateSingleChild), @@ -23,7 +23,7 @@ [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LLSTRING(Category_InteractionMenu)], false, false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(cursorKeepCentered), @@ -32,7 +32,7 @@ [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LLSTRING(Category_InteractionMenu)], false, false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(useListMenu), @@ -41,7 +41,7 @@ [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LLSTRING(Category_InteractionMenu)], false, false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(menuBackground), @@ -50,7 +50,7 @@ [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LLSTRING(Category_InteractionMenu)], [[0, 1, 2], ["STR_A3_OPTIONS_DISABLED", LLSTRING(backgroundBlur), LLSTRING(backgroundBlack)], 0], false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(alwaysUseCursorSelfInteraction), @@ -59,7 +59,7 @@ [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LELSTRING(Interaction,InteractionMenuSelf)], true, false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(cursorKeepCenteredSelfInteraction), @@ -68,7 +68,7 @@ [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LELSTRING(Interaction,InteractionMenuSelf)], false, false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(useListMenuSelf), @@ -77,7 +77,7 @@ [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LELSTRING(Interaction,InteractionMenuSelf)], false, false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(menuBackgroundSelf), @@ -86,4 +86,4 @@ [format ["ACE %1", LLSTRING(Category_InteractionMenu)], LELSTRING(Interaction,InteractionMenuSelf)], [[0, 1, 2], ["STR_A3_OPTIONS_DISABLED", LLSTRING(backgroundBlur), LLSTRING(backgroundBlack)], 0], false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/markers/initSettings.sqf b/addons/markers/initSettings.sqf index 35d1cca4bb..b7bd72efca 100644 --- a/addons/markers/initSettings.sqf +++ b/addons/markers/initSettings.sqf @@ -23,7 +23,7 @@ private _categoryName = format ["ACE %1", localize ELSTRING(map,Module_DisplayNa ], 1 ] -] call cba_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(timestampEnabled), "CHECKBOX", diff --git a/addons/medical/initSettings.sqf b/addons/medical/initSettings.sqf index 065314fcf9..3c54f47cee 100644 --- a/addons/medical/initSettings.sqf +++ b/addons/medical/initSettings.sqf @@ -7,7 +7,7 @@ true, {}, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(fractures), @@ -18,7 +18,7 @@ true, {}, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(fractureChance), @@ -27,7 +27,7 @@ LSTRING(Category), [0, 1, 0.8, 2, true], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(spontaneousWakeUpChance), @@ -36,7 +36,7 @@ LSTRING(Category), [0, 1, 0.05, 2, true], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(spontaneousWakeUpEpinephrineBoost), @@ -45,4 +45,4 @@ LSTRING(Category), [1, 30, 1, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/medical_ai/initSettings.sqf b/addons/medical_ai/initSettings.sqf index 6fada00db5..7d583382d7 100644 --- a/addons/medical_ai/initSettings.sqf +++ b/addons/medical_ai/initSettings.sqf @@ -14,4 +14,4 @@ private _categoryArray = [ELSTRING(medical,Category), "STR_TEAM_SWITCH_AI"]; true, // isGlobal {[QGVAR(enabledFor), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/medical_blood/initSettings.sqf b/addons/medical_blood/initSettings.sqf index c2c52f93b8..c4ad57d4d7 100644 --- a/addons/medical_blood/initSettings.sqf +++ b/addons/medical_blood/initSettings.sqf @@ -6,7 +6,7 @@ [[BLOOD_DISABLED, BLOOD_ONLY_PLAYERS, BLOOD_ENABLED], [ELSTRING(Common,Disabled), LSTRING(OnlyPlayers), ELSTRING(Common,Enabled)], 2], true, LINKFUNC(init) -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(maxBloodObjects), @@ -15,7 +15,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [[50, 100, 200, 300, 400, 500, 1000, 2000, 3000, 4000, 5000], [/* settings function will auto create names */], 5], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(bloodLifetime), @@ -24,4 +24,4 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [1, 3600, 900], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/medical_damage/initSettings.sqf b/addons/medical_damage/initSettings.sqf index 9f606169b5..12806a46a2 100644 --- a/addons/medical_damage/initSettings.sqf +++ b/addons/medical_damage/initSettings.sqf @@ -5,7 +5,7 @@ [ELSTRING(medical,Category)], [[0, 1, 2], [LSTRING(fatalDamageSource_vitalShotsOnly), LSTRING(fatalDamageSource_trauma), LSTRING(fatalDamageSource_both)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QEGVAR(medical,playerDamageThreshold), @@ -14,7 +14,7 @@ ELSTRING(medical,Category), [0, 25, 1, 2], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QEGVAR(medical,AIDamageThreshold), @@ -23,7 +23,7 @@ ELSTRING(medical,Category), [0, 25, 1, 2], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QEGVAR(medical,painUnconsciousChance), @@ -32,4 +32,4 @@ ELSTRING(medical,Category), [0, 1, 0.1, 2, true], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/medical_gui/initSettings.sqf b/addons/medical_gui/initSettings.sqf index e61dd647b2..c2a4831d8a 100644 --- a/addons/medical_gui/initSettings.sqf +++ b/addons/medical_gui/initSettings.sqf @@ -5,7 +5,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [[0, 1, 2], [LSTRING(Selections3D), LSTRING(Radial), ELSTRING(common,Disabled)], 0], false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(enableSelfActions), @@ -14,7 +14,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], true, false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(enableMedicalMenu), @@ -23,7 +23,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(common,Enabled), ELSTRING(common,VehiclesOnly)], 1], false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(openAfterTreatment), @@ -32,7 +32,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], true, false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(maxDistance), @@ -41,7 +41,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [0, 10, 3, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(interactionMenuShowTriage), @@ -50,4 +50,4 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(Medical_Treatment,Anyone), ELSTRING(Medical_Treatment,Medics)], 1], false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/medical_statemachine/initSettings.sqf b/addons/medical_statemachine/initSettings.sqf index 75d93f19b2..c129223931 100644 --- a/addons/medical_statemachine/initSettings.sqf +++ b/addons/medical_statemachine/initSettings.sqf @@ -9,7 +9,7 @@ 0 ], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(fatalInjuriesAI), @@ -22,7 +22,7 @@ 0 ], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(AIUnconsciousness), @@ -31,7 +31,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], true, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(cardiacArrestTime), @@ -40,7 +40,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [1, 3600, 300], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(cardiacArrestBleedoutEnabled), @@ -49,4 +49,4 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], true, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/medical_status/initSettings.sqf b/addons/medical_status/initSettings.sqf index 95231b0acc..743c55cc00 100644 --- a/addons/medical_status/initSettings.sqf +++ b/addons/medical_status/initSettings.sqf @@ -5,7 +5,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [0, 25, 1, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QEGVAR(medical,painCoefficient), @@ -14,7 +14,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [0, 25, 1, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QEGVAR(medical,ivFlowRate), @@ -23,4 +23,4 @@ [ELSTRING(medical,Category), LSTRING(SubCategory)], [0, 25, 1, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf index 54a83453e4..b7b559594b 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -5,7 +5,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], true, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(advancedMedication), @@ -14,7 +14,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], true, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(advancedBandages), @@ -23,7 +23,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(common,Enabled), LSTRING(AdvancedBandages_EnabledCanReopen)], 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(woundReopenChance), @@ -32,7 +32,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0, 5, 1, 2], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(clearTraumaAfterBandage), @@ -41,7 +41,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], false, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; // todo: should this setting differentiate between medical vehicles and facilities? [ @@ -51,7 +51,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], false, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowSharedEquipment), @@ -60,7 +60,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2], [LSTRING(AllowSharedEquipment_PriorityPatient), LSTRING(AllowSharedEquipment_PriorityMedic), ELSTRING(common,No)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(convertItems), @@ -69,7 +69,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2], [ELSTRING(common,Enabled), LSTRING(ConvertItems_RemoveOnly), ELSTRING(common,Disabled)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(treatmentTimeAutoinjector), @@ -78,7 +78,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0.1, 60, 5, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(treatmentTimeTourniquet), @@ -87,7 +87,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0.1, 60, 7, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(treatmentTimeSplint), @@ -96,7 +96,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0.1, 60, 7, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(treatmentTimeBodyBag), @@ -105,7 +105,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0.1, 60, 15, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(medicEpinephrine), @@ -114,7 +114,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(locationEpinephrine), @@ -123,7 +123,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(medicPAK), @@ -132,7 +132,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(locationPAK), @@ -141,7 +141,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 3], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(consumePAK), @@ -150,7 +150,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowSelfPAK), @@ -159,7 +159,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(timeCoefficientPAK), @@ -168,7 +168,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0, 5, 1, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(medicSurgicalKit), @@ -177,7 +177,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(locationSurgicalKit), @@ -186,7 +186,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 2], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(consumeSurgicalKit), @@ -195,7 +195,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowSelfStitch), @@ -204,7 +204,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(woundStitchTime), @@ -213,7 +213,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0.1, 60, 5, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(medicIV), @@ -222,7 +222,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2], [LSTRING(Anyone), LSTRING(Medics), LSTRING(Doctors)], 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowSelfIV), @@ -231,7 +231,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(treatmentTimeIV), @@ -240,7 +240,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0.1, 60, 12, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(cprSuccessChance), @@ -249,7 +249,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0, 1, 0.4, 2, true], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(treatmentTimeCPR), @@ -258,7 +258,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [0.1, 60, 15, 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowBodyBagUnconscious), @@ -267,7 +267,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], false, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(holsterRequired), @@ -276,7 +276,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [[0, 1, 2, 3, 4], [ELSTRING(common,Disabled), LSTRING(HolsterRequired_Lowered), LSTRING(HolsterRequired_LoweredExam), LSTRING(HolsterRequired_Holstered), LSTRING(HolsterRequired_HolsteredExam)], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowLitterCreation), @@ -285,7 +285,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], true, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(maxLitterObjects), @@ -294,7 +294,7 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], [[50, 100, 200, 300, 400, 500, 1000, 2000, 3000, 4000, 5000], [/* settings function will auto create names */], 5], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(litterCleanupDelay), @@ -303,4 +303,4 @@ [ELSTRING(medical,Category), LSTRING(SubCategory_Litter)], [-1, 3600, 600, 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/microdagr/initSettings.sqf b/addons/microdagr/initSettings.sqf index 5138637645..85614c9821 100644 --- a/addons/microdagr/initSettings.sqf +++ b/addons/microdagr/initSettings.sqf @@ -8,7 +8,7 @@ true, // isGlobal {[QGVAR(mapDataAvailable), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // require mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(waypointPrecision), "LIST", @@ -18,4 +18,4 @@ true, // isGlobal {[QGVAR(waypointPrecision), _this] call EFUNC(common,cbaSettings_settingChanged)}, false // require mission restart -] call cba_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/mk6mortar/initSettings.sqf b/addons/mk6mortar/initSettings.sqf index 1e48575b97..1b22600cbe 100644 --- a/addons/mk6mortar/initSettings.sqf +++ b/addons/mk6mortar/initSettings.sqf @@ -11,7 +11,7 @@ private _category = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"], l true, // isGlobal {[QGVAR(airResistanceEnabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowComputerRangefinder), "CHECKBOX", @@ -21,7 +21,7 @@ private _category = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"], l true, // isGlobal {[QGVAR(allowComputerRangefinder), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(allowCompass), "CHECKBOX", @@ -31,7 +31,7 @@ private _category = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"], l true, // isGlobal {[QGVAR(allowCompass), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(useAmmoHandling), "CHECKBOX", @@ -41,4 +41,4 @@ private _category = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"], l true, // isGlobal {[QGVAR(useAmmoHandling), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/nametags/initSettings.sqf b/addons/nametags/initSettings.sqf index b2cf482ce1..edabaa002f 100644 --- a/addons/nametags/initSettings.sqf +++ b/addons/nametags/initSettings.sqf @@ -7,7 +7,7 @@ [0.77, 0.51, 0.08, 1], false, // isGlobal {[QGVAR(defaultNametagColor), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(nametagColorMain), "COLOR", @@ -16,7 +16,7 @@ [1.00, 1.00, 1.00, 1], false, // isGlobal {[QGVAR(nametagColorMain), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(nametagColorRed), "COLOR", @@ -25,7 +25,7 @@ [1.00, 0.67, 0.67, 1], false, // isGlobal {[QGVAR(nametagColorRed), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(nametagColorGreen), "COLOR", @@ -34,7 +34,7 @@ [0.67, 1.00, 0.67, 1], false, // isGlobal {[QGVAR(nametagColorGreen), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(nametagColorBlue), "COLOR", @@ -43,7 +43,7 @@ [0.67, 0.67, 1.00, 1], false, // isGlobal {[QGVAR(nametagColorBlue), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(nametagColorYellow), @@ -53,4 +53,4 @@ [1.00, 1.00, 0.67, 1], false, // isGlobal {[QGVAR(nametagColorYellow), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/nightvision/initSettings.sqf b/addons/nightvision/initSettings.sqf index 9ccf2cc7f9..1a42c74863 100644 --- a/addons/nightvision/initSettings.sqf +++ b/addons/nightvision/initSettings.sqf @@ -44,14 +44,14 @@ }; }; } -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(fogScaling), "SLIDER", [LSTRING(fogScaling_DisplayName), LSTRING(fogScaling_Description)], localize LSTRING(Category), [0,2,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true // isGlobal -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(noiseScaling), "SLIDER", @@ -59,7 +59,7 @@ localize LSTRING(Category), [0,2,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true // isGlobal -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(aimDownSightsBlur), "SLIDER", @@ -67,7 +67,7 @@ localize LSTRING(Category), [0,2,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true // isGlobal -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(disableNVGsWithSights), "CHECKBOX", @@ -75,7 +75,7 @@ localize LSTRING(Category), false, // default value true // isGlobal -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(shutterEffects), "CHECKBOX", @@ -83,4 +83,4 @@ localize LSTRING(Category), true, // default value false // isGlobal -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/noradio/XEH_preInit.sqf b/addons/noradio/XEH_preInit.sqf index 61492aa36d..48463b70ef 100644 --- a/addons/noradio/XEH_preInit.sqf +++ b/addons/noradio/XEH_preInit.sqf @@ -36,4 +36,4 @@ if (hasInterface) then { [ACE_player, "isPlayer"] call EFUNC(common,unmuteUnit); }; }, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/parachute/XEH_preInit.sqf b/addons/parachute/XEH_preInit.sqf index 5a10c0bd83..b01263d60b 100644 --- a/addons/parachute/XEH_preInit.sqf +++ b/addons/parachute/XEH_preInit.sqf @@ -16,6 +16,6 @@ PREP_RECOMPILE_END; true, false, {[QGVAR(hideAltimeter), _this, false] call EFUNC(common,cbaSettings_settingChanged)} -] call cba_settings_fnc_init; +] call CBA_fnc_addSetting; ADDON = true; diff --git a/addons/pylons/initSettings.sqf b/addons/pylons/initSettings.sqf index 57a2a79efb..70b158957f 100644 --- a/addons/pylons/initSettings.sqf +++ b/addons/pylons/initSettings.sqf @@ -5,7 +5,7 @@ LSTRING(Category_Pylons), [true], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(enabledForZeus), @@ -14,7 +14,7 @@ LSTRING(Category_Pylons), [true], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(rearmNewPylons), @@ -23,7 +23,7 @@ LSTRING(Category_Pylons), [false], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(requireEngineer), @@ -32,7 +32,7 @@ LSTRING(Category_Pylons), [false], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(requireToolkit), @@ -41,7 +41,7 @@ LSTRING(Category_Pylons), [true], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(searchDistance), @@ -54,7 +54,7 @@ params ["_searchDistance"]; GVAR(searchDistanceSqr) = _searchDistance ^ 2; } -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(timePerPylon), @@ -63,4 +63,4 @@ LSTRING(Category_Pylons), [1, 10, 5, 0], true -] call CBA_Settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/quickmount/initSettings.sqf b/addons/quickmount/initSettings.sqf index 742a45cb7e..88fa78bd64 100644 --- a/addons/quickmount/initSettings.sqf +++ b/addons/quickmount/initSettings.sqf @@ -5,7 +5,7 @@ format ["ACE %1", LLSTRING(Category)], true, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(distance), @@ -14,7 +14,7 @@ format ["ACE %1", LLSTRING(Category)], [0, 10, DEFAULT_DISTANCE, 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(speed), @@ -23,7 +23,7 @@ format ["ACE %1", LLSTRING(Category)], [0, 30, DEFAULT_SPEED, 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(priority), @@ -32,7 +32,7 @@ format ["ACE %1", LLSTRING(Category)], [[0, 1, 2, 3], ["str_getin_pos_driver", "str_getin_pos_gunn", "str_getin_pos_comm", "str_getin_pos_passenger"], DEFAULT_PRIORITY], false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(enableMenu), @@ -49,4 +49,4 @@ ], 3 ] -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/rearm/initSettings.sqf b/addons/rearm/initSettings.sqf index 3cac2fead7..08494ae582 100644 --- a/addons/rearm/initSettings.sqf +++ b/addons/rearm/initSettings.sqf @@ -7,7 +7,7 @@ [[0,1,2],[LSTRING(RearmSettings_vehicle), LSTRING(RearmSettings_magazine), LSTRING(RearmSettings_caliber)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(level), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(supply), "LIST", @@ -16,7 +16,7 @@ [[0,1,2],[LSTRING(RearmSettings_unlimited), LSTRING(RearmSettings_limited), LSTRING(RearmSettings_magazineSupply)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(supply), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(distance), "SLIDER", @@ -25,4 +25,4 @@ [10, 50, 20, 0], true, // isGlobal {[QGVAR(supply), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/refuel/initSettings.sqf b/addons/refuel/initSettings.sqf index b16cff3230..deb6c2adee 100644 --- a/addons/refuel/initSettings.sqf +++ b/addons/refuel/initSettings.sqf @@ -7,7 +7,7 @@ [0,25,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true, // isGlobal {[QGVAR(rate), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(hoseLength), "SLIDER", @@ -16,4 +16,4 @@ [0,50,12,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true, // isGlobal {[QGVAR(hoseLength), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/repair/initSettings.sqf b/addons/repair/initSettings.sqf index 38e9e19e97..2e64f01208 100644 --- a/addons/repair/initSettings.sqf +++ b/addons/repair/initSettings.sqf @@ -5,7 +5,7 @@ true, // default value false, // isGlobal {[QGVAR(displayTextOnRepair), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(engineerSetting_repair), "LIST", @@ -14,7 +14,7 @@ [[0,1,2],[LSTRING(engineerSetting_anyone), LSTRING(engineerSetting_EngineerOnly), LSTRING(engineerSetting_AdvancedOnly)],1], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(engineerSetting_repair), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(engineerSetting_wheel), "LIST", @@ -23,7 +23,7 @@ [[0,1,2],[LSTRING(engineerSetting_anyone), LSTRING(engineerSetting_EngineerOnly), LSTRING(engineerSetting_AdvancedOnly)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(engineerSetting_wheel), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(repairDamageThreshold), "SLIDER", @@ -32,7 +32,7 @@ [0,1,0.6,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true, // isGlobal {[QGVAR(repairDamageThreshold), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(repairDamageThreshold_engineer), "SLIDER", @@ -41,7 +41,7 @@ [0,1,0.4,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true, // isGlobal {[QGVAR(repairDamageThreshold_engineer), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(consumeItem_toolKit), "LIST", // fnc_repair expects number @@ -50,7 +50,7 @@ [[0,1],[ELSTRING(common,No), ELSTRING(common,Yes)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(consumeItem_toolKit), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(fullRepairLocation), "LIST", @@ -59,7 +59,7 @@ [[0,1,2,3,4],[LSTRING(useAnywhere), LSTRING(repairVehicleOnly), LSTRING(repairFacilityOnly), LSTRING(vehicleAndFacility), ELSTRING(common,Disabled)],2], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(fullRepairLocation), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(engineerSetting_fullRepair), "LIST", @@ -68,7 +68,7 @@ [[0,1,2],[LSTRING(engineerSetting_anyone), LSTRING(engineerSetting_EngineerOnly), LSTRING(engineerSetting_AdvancedOnly)],2], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(engineerSetting_fullRepair), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(addSpareParts), "CHECKBOX", @@ -78,7 +78,7 @@ true, // isGlobal {[QGVAR(addSpareParts), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(wheelRepairRequiredItems), @@ -87,7 +87,7 @@ [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 0], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(miscRepairRequiredItems), @@ -96,7 +96,7 @@ [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(fullRepairRequiredItems), @@ -105,7 +105,7 @@ [localize ELSTRING(OptionsMenu,CategoryLogistics), localize "str_state_repair"], [[[], ["ToolKit"]], ["STR_A3_None", "STR_A3_CfgWeapons_Toolkit0"], 1], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(autoShutOffEngineWhenStartingRepair), "CHECKBOX", @@ -114,4 +114,4 @@ false, // default value true, // isGlobal {[QGVAR(autoShutOffEngineWhenStartingRepair), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/spectator/initSettings.sqf b/addons/spectator/initSettings.sqf index c970fe77c7..6663d5a908 100644 --- a/addons/spectator/initSettings.sqf +++ b/addons/spectator/initSettings.sqf @@ -5,7 +5,7 @@ LSTRING(Settings_DisplayName), false, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(restrictModes), @@ -16,7 +16,7 @@ true, {}, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(restrictVisions), @@ -27,7 +27,7 @@ true, {}, true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(maxFollowDistance), @@ -36,4 +36,4 @@ LSTRING(Settings_DisplayName), [5, 25, 5, 1], false -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/tagging/initSettings.sqf b/addons/tagging/initSettings.sqf index c5d0fbfa42..72672032ff 100644 --- a/addons/tagging/initSettings.sqf +++ b/addons/tagging/initSettings.sqf @@ -6,4 +6,4 @@ false, // isGlobal {[QGVAR(quickTag), _this] call EFUNC(common,cbaSettings_settingChanged)}, false // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/vehiclelock/initSettings.sqf b/addons/vehiclelock/initSettings.sqf index 30de8a692c..6c71d6b24f 100644 --- a/addons/vehiclelock/initSettings.sqf +++ b/addons/vehiclelock/initSettings.sqf @@ -7,7 +7,7 @@ [-1,60,10,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] true, // isGlobal {[QGVAR(defaultLockpickStrength), _this] call EFUNC(common,cbaSettings_settingChanged)} -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(lockVehicleInventory), "CHECKBOX", @@ -17,7 +17,7 @@ true, // isGlobal {[QGVAR(lockVehicleInventory), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(vehicleStartingLockState), "LIST", @@ -27,4 +27,4 @@ true, // isGlobal {[QGVAR(vehicleStartingLockState), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/weaponselect/initSettings.sqf b/addons/weaponselect/initSettings.sqf index d4fc725783..b39251d0b8 100644 --- a/addons/weaponselect/initSettings.sqf +++ b/addons/weaponselect/initSettings.sqf @@ -5,4 +5,4 @@ localize ELSTRING(common,ACEKeybindCategoryWeapons), true, // default value false, // isGlobal -{[QGVAR(displayText), _this] call EFUNC(common,cbaSettings_settingChanged)}] call CBA_settings_fnc_init; +{[QGVAR(displayText), _this] call EFUNC(common,cbaSettings_settingChanged)}] call CBA_fnc_addSetting; diff --git a/addons/weather/initSettings.sqf b/addons/weather/initSettings.sqf index 00aa324db0..fb11e31e75 100644 --- a/addons/weather/initSettings.sqf +++ b/addons/weather/initSettings.sqf @@ -8,7 +8,7 @@ private _category = [format ["ACE %1", LLSTRING(Module_DisplayName)]]; true, // isGlobal {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(updateInterval), "SLIDER", @@ -18,7 +18,7 @@ private _category = [format ["ACE %1", LLSTRING(Module_DisplayName)]]; true, // isGlobal {[QGVAR(updateInterval), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(windSimulation), "CHECKBOX", @@ -28,7 +28,7 @@ private _category = [format ["ACE %1", LLSTRING(Module_DisplayName)]]; true, // isGlobal {[QGVAR(windSimulation), _this] call EFUNC(common,cbaSettings_settingChanged)}, true // Needs mission restart -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; [ QGVAR(showCheckAirTemperature), "CHECKBOX", @@ -36,4 +36,4 @@ private _category = [format ["ACE %1", LLSTRING(Module_DisplayName)]]; _category, true, // default value false // isGlobal -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; diff --git a/addons/zeus/initSettings.sqf b/addons/zeus/initSettings.sqf index 1db3fe5205..a9645b5917 100644 --- a/addons/zeus/initSettings.sqf +++ b/addons/zeus/initSettings.sqf @@ -19,4 +19,4 @@ 0 ], true -] call CBA_settings_fnc_init; +] call CBA_fnc_addSetting; From 0570c0b86101820bd4ee50c6ff30f1fa6e323bed Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 19 Feb 2021 11:18:21 -0600 Subject: [PATCH 072/335] Update fnc_cbaSettings_loadFromConfig.sqf (#8118) --- addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf b/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf index d6ded9969e..a28d419981 100644 --- a/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf +++ b/addons/common/functions/fnc_cbaSettings_loadFromConfig.sqf @@ -100,6 +100,6 @@ TRACE_2("setting",_cbaSettingType,_cbaValueInfo); TRACE_4("",_isForced,_cbaIsGlobal,_category,_cbaValueInfo); private _return = [_varName, _cbaSettingType, [_localizedName, _localizedDescription], _category, _cbaValueInfo, _cbaIsGlobal, _code, _warnIfChangedMidMission] call CBA_fnc_addSetting; TRACE_1("returned",_return); -if ((isNil "_return") || {_return != 0}) then {ERROR_1("Setting [%1] - CBA Error",_varName);}; +if ((isNil "_return") || {!_return}) then {ERROR_1("Setting [%1] - CBA Error",_varName);}; _return From 5bc43fe2474e3dbe74dd19217925d3a374f67596 Mon Sep 17 00:00:00 2001 From: mharis001 <34453221+mharis001@users.noreply.github.com> Date: Tue, 23 Feb 2021 11:57:57 -0500 Subject: [PATCH 073/335] Common - Improve getPylonTurret by using getAllPylonsInfo (#8087) * Improve getPylonTurret by using getAllPylonsInfo * Fix indentation Co-authored-by: PabstMirror --- .../common/functions/fnc_getPylonTurret.sqf | 48 ++----------------- addons/main/script_mod.hpp | 2 +- .../functions/fnc_getNeedRearmMagazines.sqf | 2 +- 3 files changed, 5 insertions(+), 47 deletions(-) diff --git a/addons/common/functions/fnc_getPylonTurret.sqf b/addons/common/functions/fnc_getPylonTurret.sqf index e82df1912a..cc6d3c6635 100644 --- a/addons/common/functions/fnc_getPylonTurret.sqf +++ b/addons/common/functions/fnc_getPylonTurret.sqf @@ -1,14 +1,14 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Finds turret owner of a pylon. + * Returns the turret path that owns the given pylon. * * Arguments: * 0: Vehicle * 1: Pylon Index (starting at 0) * * Return Value: - * * Turret index (either [-1] or [0]) + * Turret Path (either [-1] or [0]) * * Example: * [cursorObject, 0] call ace_common_fnc_getPylonTurret @@ -18,46 +18,4 @@ params ["_vehicle", "_pylonIndex"]; -// See if index is in ace_pylonTurrets setVar on vehicle -private _pylonTurrets = _vehicle getVariable ["ace_pylonTurrets", []]; -private _returnValue = _pylonTurrets param [_pylonIndex, []]; - -if (!(_returnValue isEqualTo [])) then { - TRACE_1("Using ace_pylonTurrets value",_returnValue); -} else { - // Attempt to determine turret owner based on magazines in the vehicle - private _pyMags = getPylonMagazines _vehicle; - private _pylonConfigs = configProperties [configOf _vehicle >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]; - if (_pylonIndex >= (count _pyMags)) exitWith {ERROR("out of bounds");}; - if (_pylonIndex >= (count _pylonConfigs)) exitWith {ERROR("out of bounds");}; - - private _targetMag = _pyMags select _pylonIndex; - private _inPilot = _targetMag in (_vehicle magazinesTurret [-1]); - private _inGunner = _targetMag in (_vehicle magazinesTurret [0]); - - if (_inPilot) then { - if (_inGunner) then { - TRACE_3("ambiguous - in both",_targetMag,_inPilot,_inGunner); - } else { - TRACE_3("Pilot Mag",_targetMag,_inPilot,_inGunner); - _returnValue = [-1]; - }; - } else { - if (_inGunner) then { - TRACE_3("Gunner Mag",_targetMag,_inPilot,_inGunner); - _returnValue = [0]; - } else { - TRACE_3("ambiguous - in neither",_targetMag,_inPilot,_inGunner); - }; - }; - - if (_returnValue isEqualTo []) then { // If not sure, just use config value - _returnValue = getArray ((_pylonConfigs select _pylonIndex) >> "turret"); - if (_returnValue isEqualTo []) then { - _returnValue = [-1]; - }; - }; -}; - -TRACE_3("",_vehicle,_pylonIndex,_returnValue); -_returnValue +getAllPylonsInfo _vehicle param [_pylonIndex, []] param [2, [-1]] diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index d3a54e131e..36015f36ac 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -10,7 +10,7 @@ #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD // MINIMAL required version for the Mod. Components can specify others.. -#define REQUIRED_VERSION 2.00 +#define REQUIRED_VERSION 2.02 #define REQUIRED_CBA_VERSION {3,15,0} #ifdef COMPONENT_BEAUTIFIED diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf index 19802c0140..ca583e482a 100644 --- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf +++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf @@ -48,7 +48,7 @@ private _pylonConfigs = configProperties [configOf _vehicle >> "Components" >> " if (_currentRounds < _maxRounds) then { // getPylonTurret expects 0 based index, and returns driver turret as [-1] - private _pylonTurret = [_vehicle, (_pylonIndex - 1)] call EFUNC(common,getPylonTurret); + private _pylonTurret = [_vehicle, _forEachIndex] call EFUNC(common,getPylonTurret); _magazineInfo pushBack [_pylonMagazine, _pylonTurret, true, _pylonIndex, 1, 1, _maxRounds, [_currentRounds]]; }; From 61e8ae3c8b58cae52536f7d8fd4ca60f77b6d41f Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Tue, 23 Feb 2021 18:03:55 +0100 Subject: [PATCH 074/335] Wirecutter - Replace fences with destroyed models when cut (#8106) * Add more fence types for wirecutter * Replace fences with destroyed models when cut * Move fence destruction to server side --- .../logistics_wirecutter/CfgEventHandlers.hpp | 2 +- addons/logistics_wirecutter/CfgVehicles.hpp | 15 +++++++ addons/logistics_wirecutter/XEH_PREP.hpp | 1 + .../logistics_wirecutter/XEH_clientInit.sqf | 5 --- addons/logistics_wirecutter/XEH_postInit.sqf | 9 ++++ addons/logistics_wirecutter/XEH_preInit.sqf | 24 +++++++++++ .../functions/fnc_cutDownFence.sqf | 2 +- .../functions/fnc_destroyFence.sqf | 42 +++++++++++++++++++ .../logistics_wirecutter/script_component.hpp | 1 + 9 files changed, 94 insertions(+), 7 deletions(-) delete mode 100644 addons/logistics_wirecutter/XEH_clientInit.sqf create mode 100644 addons/logistics_wirecutter/XEH_postInit.sqf create mode 100644 addons/logistics_wirecutter/functions/fnc_destroyFence.sqf diff --git a/addons/logistics_wirecutter/CfgEventHandlers.hpp b/addons/logistics_wirecutter/CfgEventHandlers.hpp index 36c0fca8a3..0d3301d6e0 100644 --- a/addons/logistics_wirecutter/CfgEventHandlers.hpp +++ b/addons/logistics_wirecutter/CfgEventHandlers.hpp @@ -12,6 +12,6 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; diff --git a/addons/logistics_wirecutter/CfgVehicles.hpp b/addons/logistics_wirecutter/CfgVehicles.hpp index 7dd57f207f..ab27440384 100644 --- a/addons/logistics_wirecutter/CfgVehicles.hpp +++ b/addons/logistics_wirecutter/CfgVehicles.hpp @@ -80,4 +80,19 @@ class CfgVehicles { class Land_BackAlley_01_l_1m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_GameProofFence_01_l_5m_F: Wall_F { + GVAR(isFence) = 1; + }; + class Land_NetFence_03_m_3m_F: Wall_F { + GVAR(isFence) = 1; + }; + class Land_NetFence_03_m_3m_corner_F: Wall_F { + GVAR(isFence) = 1; + }; + class Land_NetFence_03_m_3m_hole_F: Wall_F { + GVAR(isFence) = 1; + }; + class Land_NetFence_03_m_9m_F: Wall_F { + GVAR(isFence) = 1; + }; }; diff --git a/addons/logistics_wirecutter/XEH_PREP.hpp b/addons/logistics_wirecutter/XEH_PREP.hpp index 6ab95824ff..09cbc1c05d 100644 --- a/addons/logistics_wirecutter/XEH_PREP.hpp +++ b/addons/logistics_wirecutter/XEH_PREP.hpp @@ -1,3 +1,4 @@ PREP(cutDownFence); +PREP(destroyFence); PREP(interactEH); PREP(isFence); diff --git a/addons/logistics_wirecutter/XEH_clientInit.sqf b/addons/logistics_wirecutter/XEH_clientInit.sqf deleted file mode 100644 index 45e93bc6bd..0000000000 --- a/addons/logistics_wirecutter/XEH_clientInit.sqf +++ /dev/null @@ -1,5 +0,0 @@ -#include "script_component.hpp" - -if (!hasInterface) exitWith {}; - -["ace_interactMenuOpened", {_this call FUNC(interactEH)}] call CBA_fnc_addEventHandler; diff --git a/addons/logistics_wirecutter/XEH_postInit.sqf b/addons/logistics_wirecutter/XEH_postInit.sqf new file mode 100644 index 0000000000..a22479e7e1 --- /dev/null +++ b/addons/logistics_wirecutter/XEH_postInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +if (hasInterface) then { + ["ace_interactMenuOpened", {_this call FUNC(interactEH)}] call CBA_fnc_addEventHandler; +}; + +if (isServer) then { + [QGVAR(destroyFence), {_this call FUNC(destroyFence)}] call CBA_fnc_addEventHandler; +}; diff --git a/addons/logistics_wirecutter/XEH_preInit.sqf b/addons/logistics_wirecutter/XEH_preInit.sqf index b47cf6628d..cd05369d60 100644 --- a/addons/logistics_wirecutter/XEH_preInit.sqf +++ b/addons/logistics_wirecutter/XEH_preInit.sqf @@ -6,4 +6,28 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +if (isServer) then { + GVAR(replacements) = createHashMapFromArray [ + ["gameprooffence_01_l_5m_f.p3d", [["Land_GameProofFence_01_l_d_F", [0, 0, 0], 0]]], + ["indfnc_3_f.p3d", [["Land_IndFnc_3_D_F", [0.039, -0.221, 0], 0]]], + ["indfnc_3_hole_f.p3d", [["Land_IndFnc_3_D_F", [0.042, -0.252, 0], 0]]], + ["indfnc_9_f.p3d", [["Land_IndFnc_3_F", [-3, -0.06, 0], 0], ["Land_IndFnc_3_D_F", [0.039, -0.281, 0], 0], ["Land_IndFnc_3_F", [3, -0.06, 0], 0]]], + ["indfnc_corner_f.p3d", [["Land_IndFnc_3_D_F", [0.116, -0.223, 0], 0]]], + ["mil_wiredfence_f.p3d", [["Land_Mil_WiredFenceD_F", [0, 0, 0], 0]]], + ["net_fence_8m_f.p3d", [["Land_Net_FenceD_8m_F", [0, 0.1, 0], 0]]], + ["netfence_01_m_4m_f.p3d", [["Land_NetFence_01_m_d_F", [0, 0, 0], 0]]], + ["netfence_01_m_8m_f.p3d", [["Land_NetFence_01_m_4m_F", [-2, 0, 0], 0], ["Land_NetFence_01_m_d_F", [2, 0, 0], 0]]], + ["netfence_03_m_3m_corner_f.p3d", [["Land_NetFence_03_m_3m_d_F", [0.104, -0.183, 0], 0]]], + ["netfence_03_m_3m_f.p3d", [["Land_NetFence_03_m_3m_d_F", [0.042, -0.236, 0], 0]]], + ["netfence_03_m_3m_hole_f.p3d", [["Land_NetFence_03_m_3m_d_F", [0.045, -0.273, 0], 0]]], + ["netfence_03_m_9m_f.p3d", [["Land_NetFence_03_m_3m_F", [-3.006, -0.073, 0], 0], ["Land_NetFence_03_m_3m_d_F", [0.038, -0.309, 0], 0], ["Land_NetFence_03_m_3m_F", [2.995, -0.073, 0], 0]]], + ["plasticnetfence_01_long_f.p3d", [["Land_PlasticNetFence_01_long_d_F", [0, 0, -0.1], 0]]], + ["wired_fence_4m_f.p3d", [["Land_Wired_Fence_4mD_F", [0, 0, 0], 0]]], + ["wired_fence_8m_f.p3d", [["Land_Wired_Fence_4m_F", [-2, 0, 0], 0], ["Land_Wired_Fence_4mD_F", [3, 0, 0], 0]]], + ["wiredfence_01_16m_f.p3d", [["Land_WiredFence_01_4m_F", [-6, 0, 0], 0], ["Land_WiredFence_01_8m_d_F", [0.34, -0.1, 0], 0]]], + ["wiredfence_01_4m_f.p3d", [["Land_WiredFence_01_pole_F", [-2, 0, 0], 150]]], + ["wiredfence_01_8m_f.p3d", [["Land_WiredFence_01_4m_F", [-2, 0, 0], 0], ["Land_WiredFence_01_pole_F", [0, 0, 0], 0]]] + ]; +}; + ADDON = true; diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf index 79da93cf79..170c628d18 100644 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf @@ -35,7 +35,7 @@ if !(_unit call EFUNC(common,isSwimming)) then { TRACE_1("Fence cutting successful",_this); (_this select 0) params ["_unit", "_fence"]; - _fence setDamage 1; + [QGVAR(destroyFence), [_fence]] call CBA_fnc_serverEvent; if !(_unit call EFUNC(common,isSwimming)) then { [_unit, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); }; diff --git a/addons/logistics_wirecutter/functions/fnc_destroyFence.sqf b/addons/logistics_wirecutter/functions/fnc_destroyFence.sqf new file mode 100644 index 0000000000..9098acb743 --- /dev/null +++ b/addons/logistics_wirecutter/functions/fnc_destroyFence.sqf @@ -0,0 +1,42 @@ +#include "script_component.hpp" +/* + * Author: BaerMitUmlaut + * Destroys the given fence and replaces it with a destroyed fence if possible. + * + * Arguments: + * 0: Fence + * + * Return Value: + * None + * + * Example: + * [fence] call ace_logistics_wirecutter_fnc_destroyFence + * + * Public: No + */ + +params ["_fence"]; + +private _fenceModel = toLower ((getModelInfo _fence)#0); + +// If fence cannot be replaced with destroyed model, just knock it over +if !(_fenceModel in GVAR(replacements)) exitWith { + _fence setDamage 1; +}; + +// Remove old fence +if ([_fence] call CBA_fnc_isTerrainObject) then { + _fence setDamage 1; + _fence hideObjectGlobal true; +} else { + deleteVehicle _fence; +}; + +// Create replacement(s) +{ + _x params ["_type", "_position", "_dir"]; + + private _replacement = _type createVehicle [0, 0, 0]; + _replacement setPosWorld (_fence modelToWorldWorld _position); + _replacement setDir (direction _fence + _dir); +} forEach (GVAR(replacements) get _fenceModel); diff --git a/addons/logistics_wirecutter/script_component.hpp b/addons/logistics_wirecutter/script_component.hpp index be397a8519..38ed1dd077 100644 --- a/addons/logistics_wirecutter/script_component.hpp +++ b/addons/logistics_wirecutter/script_component.hpp @@ -70,6 +70,7 @@ "gm_gc_g501_sm70_02.p3d",\ "gm_gc_g501_sm70_03.p3d",\ "netfence_03_m_3m_f.p3d",\ + "netfence_03_m_3m_hole_f.p3d",\ "netfence_03_m_3m_corner_f.p3d",\ "netfence_03_m_9m_f.p3d",\ "vineyardfence_01_f.p3d",\ From d00e7a17a18f3c672b77c300348595e56157bac7 Mon Sep 17 00:00:00 2001 From: Vdauphin Date: Tue, 23 Feb 2021 18:42:15 +0100 Subject: [PATCH 075/335] cookOff - Fix: Disable ammunition cookoff and turret effect when skipping destruction effects (#8122) * Disable ammunition cookoff and turret effect when skiping destruction effects * Improve readability --- addons/cookoff/XEH_postInit.sqf | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf index 94fe8899de..f714a4c2f3 100644 --- a/addons/cookoff/XEH_postInit.sqf +++ b/addons/cookoff/XEH_postInit.sqf @@ -73,8 +73,11 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; // secondary explosions ["AllVehicles", "killed", { - params ["_vehicle"]; - if (_vehicle getVariable [QGVAR(enableAmmoCookoff), GVAR(enableAmmoCookoff)]) then { + params ["_vehicle", "", "", "_useEffects"]; + if ( + _useEffects && + _vehicle getVariable [QGVAR(enableAmmoCookoff), GVAR(enableAmmoCookoff)] + ) then { if (GVAR(ammoCookoffDuration) == 0) exitWith {}; ([_vehicle] call FUNC(getVehicleAmmo)) params ["_mags", "_total"]; [_vehicle, _mags, _total] call FUNC(detonateAmmunition); @@ -83,9 +86,13 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; // blow off turret effect ["Tank", "killed", { - if ((_this select 0) getVariable [QGVAR(enable), GVAR(enable)] in [1, 2, true]) then { + params ["_vehicle", "", "", "_useEffects"]; + if ( + _useEffects && + _vehicle getVariable [QGVAR(enable), GVAR(enable)] in [1, 2, true] + ) then { if (random 1 < 0.15) then { - (_this select 0) call FUNC(blowOffTurret); + _vehicle call FUNC(blowOffTurret); }; }; }] call CBA_fnc_addClassEventHandler; From ad98ae479cb8c757095faf13144cd05a7346e63d Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 24 Feb 2021 11:41:32 -0600 Subject: [PATCH 076/335] Flashsuppresssors - Update configs for 2.02 (#8105) --- addons/flashsuppressors/CfgWeapons.hpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/addons/flashsuppressors/CfgWeapons.hpp b/addons/flashsuppressors/CfgWeapons.hpp index 957bbd7def..aba24e1809 100644 --- a/addons/flashsuppressors/CfgWeapons.hpp +++ b/addons/flashsuppressors/CfgWeapons.hpp @@ -70,20 +70,6 @@ class MuzzleSlot_762: MuzzleSlot { }; class CfgWeapons { - class Rifle_Base_F; - class Rifle_Long_Base_F: Rifle_Base_F { - class WeaponSlotsInfo; - }; - /* Other */ - class LMG_Mk200_F: Rifle_Long_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot_65 { - compatibleItems[] += {"ACE_muzzle_mzls_H"}; // uses array instead of inherited class - }; - }; - }; - - /* Flashsuppressors */ class ItemCore; From 1f691be4e95e1f954ae5ebb6bf456e33b6931a41 Mon Sep 17 00:00:00 2001 From: Toni Vicente Date: Fri, 26 Feb 2021 19:29:46 +0100 Subject: [PATCH 077/335] Update AUTHORS.txt (#8125) Contributing in spanish strings --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 4781fdb531..402b13b8e6 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -47,6 +47,7 @@ Anthariel Arcanum417 Anton Arkhir +ARV187 aka Spark23 Asgar Serran BaerMitUmlaut Bamse From bac47bb2920f05dda47a90ec0e7f8006289a6207 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 26 Feb 2021 13:28:42 -0600 Subject: [PATCH 078/335] Chery pick 6868fa5600841a3e929531367e6c500306a39c65 (#8139) Co-Authored-By: Toni Vicente Co-authored-by: Toni Vicente --- addons/medical_statemachine/stringtable.xml | 9 ++++ addons/medical_treatment/stringtable.xml | 53 +++++++++++++++++++++ addons/microdagr/stringtable.xml | 5 ++ addons/mk6mortar/stringtable.xml | 1 + addons/nightvision/stringtable.xml | 1 + addons/nlaw/stringtable.xml | 3 ++ addons/noradio/stringtable.xml | 2 + addons/quickmount/stringtable.xml | 13 +++++ addons/realisticnames/stringtable.xml | 3 ++ addons/rearm/stringtable.xml | 15 ++++++ addons/refuel/stringtable.xml | 5 ++ addons/reload/stringtable.xml | 2 + addons/respawn/stringtable.xml | 2 + addons/zeus/stringtable.xml | 1 + 14 files changed, 115 insertions(+) diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml index 31a91d1413..a3ec9b9d5d 100644 --- a/addons/medical_statemachine/stringtable.xml +++ b/addons/medical_statemachine/stringtable.xml @@ -13,6 +13,7 @@ Stavy Stany Devletler + Estados Player Fatal Injuries @@ -26,6 +27,7 @@ Oyuncu Ölümcül Yaralanmaları Tödliche Spielerverletzungen Смертельные травмы игрока + Heridas mortales del jugador Controls when players can receive fatal injuries. A fatal injury is caused by significant damage to the head or torso. @@ -39,6 +41,7 @@ Definiuje, kiedy gracze mogą otrzymać śmiertelne obrażenia. Śmiertelne obrażenia są spowodowane znacznym uszkodzeniem głowy lub torsu. Legt fest, wann Spieler tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Torso verursacht. Определяет, могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища. + Controla cuándo los jugadores pueden sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. AI Fatal Injuries @@ -52,6 +55,7 @@ AI Ölümcül Yaralanmaları Tödliche KI-Verletzungen Смертельные травмы ИИ + Heridas mortales IA Controls when AI can receive fatal injuries. A fatal injury is caused by significant damage to the head or troso.\nWhen set to "Always", this effectively produces "AI Instant Death" behaviour as AI will immediately die from any fatal injury.\nNOTE: Any mode other than "Always" requires AI Unconsciousness to be enabled. @@ -65,6 +69,7 @@ Definiuje, kiedy AI może otrzymać śmiertelne obrażenia. Śmiertelne obrażenia są spowodowane znacznym uszkodzeniem głowy lub torsu.\n Ustawienie "Zawsze" powoduje "Natychmiastową śmierć AI", ponieważ AI natychmiast umiera z powodu śmiertelnych obrażeń.\n UWAGA: Każdy inny tryb niż "Zawsze" wymaga włączenia nieprzytomności AI. Legt fest, wann KI-Einheiten tödliche Verletzungen erleiden können. Eine tödliche Verletzung wird bei erheblichem Schaden an Kopf oder Körper verursacht.\nWenn "Immer" eingestellt ist, erzeugt diese Einstellung das "KI Sofort-Tod" Verhalten. KI-Einheiten sterben sofort durch jede tödliche Verletzung.\nBEACHTE: Eine andere Einstellung als "Immer" bedingt, dass "KI-Bewusstlosigkeit" verwendet wird. Определяет могут ли игроки получить смертельные травмы. Смертельная травма вызывается значительным повреждением головы или туловища.\nКогда установлено «Всегда», это вызывает поведение «Мгновенной смерти ИИ», так как ИИ немедленно умрет от любой смертельной травмы.\nПРИМЕЧАНИЕ: Любой режим, кроме «Всегда», требует включения функции «Потеря сознания». + Controla cuándo la IA puede sufrir lesiones fatales. Una lesión fatal es causada por un daño significativo en la cabeza o el cuerpo. \n Cuando se establece en "Siempre", esto produce efectivamente un comportamiento de "Muerte instantánea de IA", ya que la IA morirá inmediatamente por cualquier lesión fatal. \n NOTA: Cualquier modo que no sea "Siempre" requiere que la inconsciencia de la IA esté habilitada. AI Unconsciousness @@ -95,6 +100,7 @@ Kontrolliert, ob KI bewusstlos werden kann anstatt sofort zu sterben.\nDiese Einstellung funktioniert zusammen mit der Einstellung "Tödliche KI-Verletzungen". Denn wenn eine Einheit einen Herzstillstand erleiden soll, muss diese auch in der Lage sein, bewusstlos zu werden.\nDennoch sind diese beiden Einstellungen voneinander getrennt, da Einheiten auch durch kritische Vitalwerte bewusstlos werden können, die durch nicht tödliche Verletzungen aufgetreten sind.\nZusammengefasst bedeutet das, dass wenn KI-Einheiten einen Herzstillstand erleiden sollen, diese Einstellung aktiviert sein muss. Управляет тем, может ли ИИ потерять сознание, вместо того, чтобы немедленно умереть.\nЭтот параметр работает вместе с параметром «Смертельные раны ИИ», поскольку при остановке сердца требуется, чтобы юнит мог потерять сознание.\nОднако эти настройки разделены, потому что юниты могут потерять сознание из-за критических ранений жизненно важных органов, полученных в результате несмертельных травм.\nВ сущности, это означает, что для включения остановки сердца для ИИ этот параметр должен быть включен. Yapay zekanın hemen ölmek yerine bilinçsiz duruma geçip geçemeyeceğini kontrol eder. \ Bu ayar, "Yapay Zeka Ölümcül Yaralanmalar" ayarı ile birlikte çalışır, çünkü kalp durması, ünitenin bilinçsiz duruma geçebilmesini gerektirir. \ Özünde, bunun anlamı şudur: AI birimleri için kalp durmasını etkinleştirirseniz, bu ayar etkinleştirilmelidir. + Controla si la IA puede quedar inconsciente en lugar de morir de inmediato. \n Esta configuración funciona junto con la configuración de "Heridas mortales IA", ya que, sufrir un paro cardíaco requiere que la unidad pueda quedar inconsciente. \n Sin embargo, estas configuraciones están separadas porque las unidades pueden perder el conocimiento de los signos vitales críticos como resultado de lesiones no mortales. \n En esencia, esto significa que para habilitar el paro cardíaco en las unidades de IA, esta configuración debe estar habilitada. Cardiac Arrest Time @@ -108,6 +114,7 @@ Délka srdeční zástavy Czas Zatrzymania Akcji Serca Kalp Durma Süresi + Tiempo de paro cardíaco Controls how long it takes to die from cardiac arrest. @@ -121,6 +128,7 @@ Definiuje czas potrzebny na śmierć z powodu zatrzymania akcji serca. Bestimmt die Dauer bis zum Tod durch Herzstillstand. Ne kadar süre de kalbi durarak ölmesini belirleyin. + Controla cuanto tiempo dura el paro cardiaco antes de morir. In Cardiac Arrest @@ -134,6 +142,7 @@ V srdeční zástavě Zatrzymanie Akcji Serca Kalbi Durdu + En parada cardíaca Bleedout During Cardiac Arrest diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 514a4795e6..4bf6cafb16 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -13,6 +13,7 @@ Léčba Leczenie Tedavi + Tratamiento Litter @@ -26,6 +27,7 @@ Śmieci Abfall Cöp + Basura Advanced Diagnose @@ -39,6 +41,7 @@ Pokročilá diagnóza Zaawansowana Diagnoza Gelişmiş Teşhis + Diagnóstico avanzado Enables the Check Pulse, Check Blood Pressure, and Check Response treatment actions instead of the generic Diagnose action.\nWhen disabled, the CPR action will only be shown when performing CPR is appropriate.\nThe actions this setting enables are needed to determine whether a person is unconscious or in cardiac arrest. @@ -52,6 +55,7 @@ Włącza opcje sprawdzania Pulsu, Ciśnienia Tętniczego Krwi i Reakcje Na Ból, zamiast bardziej ogólnej akcji Diagnozuj.\n Po wyłączeniu tej opcji akcja RKO będzie wyświetlana tylko wtedy, gdy jej wykonanie będzie odpowiednie.\n Opcja, która włącza to ustawienie jest potrzebna do ustalenia, czy osoba jest nieprzytomna lub ma zatrzymanie krążenia. Ermöglicht die 'Überprüfe Puls', 'Überprüfe Blutdruck' und 'Überprüfe Reaktionen' Behandlungsaktionen anstatt der einfachen 'Diagnose' Behandlungsaktion.\nWenn diese Einstellung nicht aktiviert ist, wird die "HLW"-Aktion nur angezeigt, wenn die Anwendung von HLW angemessen ist.\nDie Aktionen, die das Aktivieren dieser Einstellung ermöglicht, werden benötigt um zu bestimmen, ob eine Person bewusstlos ist oder einen Herzstillstand erleidet. Genel Teşhis eylemi yerine Nabzı Kontrol Et, Kan Basıncını Kontrol Et ve Yanıtı Kontrol Et tedavi eylemlerini etkinleştirir. \ Devre dışı bırakıldığında, CPR eylemi yalnızca CPR gerçekleştirilmesi uygun olduğunda gösterilecektir. + Habilita la comprobación del pulso, presión sanguinea y rsepuesta a las acciones del tratamiento en lugar de la acción de diagnóstico genérico. \n Cuando se deshabilita, la acción RCP solo se mostrará cuando realizar un RCP sea apropiado. \n Las acciones activadas de este ajuste son necesarias para determinar si una persona está inconsciente o en parada cardiaca. Advanced Medication @@ -90,6 +94,7 @@ Pokročilé obvazy Zaawansowane Bandaże Gelişmiş Bandajlar + Vendaje avanzado Enables treatment actions for different bandage types instead of the generic Bandage action.\nAdditionally, the reopening of bandaged wounds can also be enabled. @@ -103,6 +108,7 @@ Povoluje specifické obvazy s různými vlastnostmi namísto jednoho univerzálního obvazu. Umożliwia wybranie konkretnego rodzaju bandaża zamiast ogólnej akcji bandażowania. Genel Bandaj eylemi yerine farklı bandaj türleri için tedavi eylemlerini etkinleştirir. \ Ek olarak, bandajlı yaraların yeniden açılması da etkinleştirilebilir. + Habilita las acciones de ttratamiento para distintos tipos de vendajes en lugar de la acción de vendaje genérico Enabled & Can Reopen @@ -144,6 +150,7 @@ Entferne Trauma nach Bandagierung. Удалять травму после перевязки Bandaj Sonrası Travmayı Temizle + Quitar trauma despues de vendaje Controls whether fully bandaged body parts are healed. @@ -156,6 +163,7 @@ Nastavuje zda jsou plně obvázané části těla vyléčena. Контролирует то, что полностью перевязанные раны целиком исцеляют часть тела. Tamamen sargılı vücut kısımlarının iyileşip iyileşmediğini kontrol eder. + Controla si las partes del cuerpo completamente vendadas se curan. Locations Boost Training @@ -185,6 +193,7 @@ Zwiększ wyszkolenie medyczne w pojazdach lub obiektach medycznych. Niewytrenowana jednostka zostaje medykiem, medyk zostaje lekarzem. Verbessere 'Fähigkeiten-Level' in medizinischen Fahrzeugen oder Einrichtungen. Untrainiert wird zu Sanitäter, Sanitäter wird zu Arzt. Tıbbi araçlar veya tesislerdeyken tıbbi müdaheleyi artırın. Eğitimsizler sıhhiye olur, sıhhiyeler doktor olur. + Aumente la formación médica cuando se encuentre en vehículos o instalaciones médicas. Sin entrenamiento se convierte en médico, médico se convierte en médico. Allow Shared Equipment @@ -198,6 +207,7 @@ Zezwalaj na współdzielenie sprzętu Erlaube geteilte Ausrüstung Paylaşılan Ekipmana İzin Ver + Permite compartir material médico. Controls whether medical equipment can be shared between the patient and the medic. @@ -211,6 +221,7 @@ Kontroluje, czy sprzęt medyczny ma być dzielony między pacjentem a medykiem. Legt fest, ob medizinische Ausrüstung zwischen Patient und Sanitäter geteilt werden kann. Tıbbi ekipmanın hasta ve sağlık görevlisi arasında paylaşılıp paylaşılamayacağını kontrol eder. + Controla si el equipo médico se puede compartir entre el paciente y el médico. Patient's Equipment First @@ -224,6 +235,7 @@ Najpierw sprzęt pacjenta Ausrüstung des Patienten zuerst Önce Hastanın Ekipmanı + Usar equipo médico del paciente en primer lugar. Medic's Equipment First @@ -237,6 +249,7 @@ Najpierw sprzęt medyka Ausrüstung des Sanitäters zuerst İlk Sıhhiyenin Ekipmanı + Usar equipo médico del santiario en primer lugar. Autoinjector Treatment Time @@ -314,6 +327,7 @@ Poziom wyszkolenia wymagany do korzystania z epinefryny. 'Fähigkeiten-Level', das benötigt wird, um Epinephrin zu nutzen. Epinefrin kullanmak için gerekli eğitim seviyesi. + Nivel de entrenamiento médico requerido para usar Epinefrina. Locations Epinephrine @@ -343,6 +357,7 @@ Kontroluje, gdzie można stosować epinefrynę. Legt fest, wo Epinephrin genutzt werden kann. Epinefrinin nerelerde kullanılabileceğini kontrol eder + Controla donde puede sr usada la Epinefrina. Allow PAK @@ -373,6 +388,7 @@ Poziom wyszkolenia wymagany do korzystania z apteczek osobistych. 'Fähigkeiten-Level', das benötigt wird, um ein Erste-Hilfe-Set zu nutzen. PAK kullanmak için gerekli eğitim seviyesi. + Nivel de entrenamiento requerido para usar EPA Locations PAK @@ -403,6 +419,7 @@ Kontroluje, gdzie można korzystać z apteczek osobistych. Kontrolliert, wo ein Erste-Hilfe-Set benutzt werden kann. PAK'ın nerelerde kullanılabileceğini kontrol eder + Controla donde puede usarse el EPA Consume PAK @@ -416,6 +433,7 @@ Zużycie apteczek osobistych Verbrauche Erste-Hilfe-Set PAK Tüketimi + Consumir EPA Controls whether a PAK should be consumed after use. @@ -429,6 +447,7 @@ Kontroluje, czy apteczka osobista powinna być zużyta po użyciu. Kontrolliert, ob ein Erste-Hilfe-Set nach der Benutzung verbraucht werden soll. Kullanımdan sonra bir PAK tüketilip tüketilmeyeceğini kontrol eder. + Controla si se debe consumir un EPA después de su uso. Self PAK Usage @@ -466,6 +485,7 @@ Współczynnik czasu apteczek osobistych Zeit-Koeffizient Erste-Hilfe-Set PAK Zaman Katsayısı + EPA coheficiente de tiempo Modifies how long a PAK takes to apply.\nThe treatment time is based on the total body part damage multiplied by this coefficient, with a minimum of 10 seconds. @@ -479,6 +499,7 @@ Zmienia czas potrzebny na zastosowanie apteczki osobistej.\n Czas leczenia jest oparty na całkowitym uszkodzeniu części ciała pomnożonym przez ten współczynnik, wynosi minimum 10 sekund. Modifiziert, wie lange ein Erste-Hilfe-Set für die Anwendung benötigt.\nDie Behandlungszeit basiert auf der Anzahl des Gesamtkörperschadens multipliziert mit diesem Koeffizienten, mit einen Minimum von 10 Sekunden. Bir PAK'ın uygulanmasının ne kadar süreceğini değiştirir. \ Tedavi süresi, toplam vücut parçası hasarının bu katsayı ile en az 10 saniye çarpımına dayanır. + Modifica el tiempo que tarda en aplicarse un EPA. \n El tiempo de tratamiento se basa en el daño total de la parte del cuerpo multiplicado por este coeficiente, con un mínimo de 10 segundos. Allow Surgical Kit @@ -492,6 +513,7 @@ Ograniczenia Użycia Zestawu Chirurgicznego Erlaube Operations-Set Cerrahi Kitine İzin Ver + Permitir kit quirúrjico Training level required to use a surgical kit. @@ -505,6 +527,7 @@ Poziom wyszkolenia wymagany do korzystania z Zestawu Chirurgicznego. 'Fähigkeiten-Level', das benötigt wird um ein Operations-Set zu nutzen. Cerrahi kit kullanmak için gerekli eğitim seviyesi. + Nivel de entrenamiento requerido para usar el kit quirúrgico Locations Surgical Kit @@ -518,6 +541,7 @@ Miejsca użycia Zestawu Chirurgicznego Orte für Operations-Set Cerrahi Kitin kullanılabileceği yerler + Localización de los kits quirúrgicos Controls where a surgical kit can be used. @@ -531,6 +555,7 @@ Kontroluje, gdzie można użyć Zestawu Chirurgicznego. Legt fest, wo ein Operations-Set genutzt werden kann. Cerrahi Kitin nerelerde kullanılabileceğini kontrol eder + Controla donde puede usarse un kit quirúrgico. Consume Surgical Kit @@ -543,6 +568,7 @@ Spotřebuj sešívací sadu Zużycie Zestawów Chirurgicznych Verbrauche Operations-Set + Consumir kit quirúrgico Controls whether a surgical kit should be consumed after use. @@ -555,6 +581,7 @@ Nastavuje Kontroluje, czy Zestaw Chirurgiczny powinien być zużyty po użyciu. Legt fest, ob ein Operations-Set nach der Anwendung verbraucht werden soll. + Controla si un kit quirúrgico debería ser consumido tras su uso Self Stitching @@ -567,6 +594,7 @@ Zszywanie własnych ran Selbstnähen Зашивание своей раны + Auto cosido Enables the use of surgical kits to stitch oneself. @@ -579,6 +607,7 @@ Permette l'uso di kit chirurgici per ricucirsi. Ermöglicht die Benutzung des Operations-Sets, um sich selbst zu nähen. Включает использование хирургического набора на себе. + Permite el uso de kits quirúrgicos sobre uno mismo Wound Stitch Time @@ -599,6 +628,7 @@ Samoaplikace IV transfuze Samotransfuzja IV Trasfusione endovena su se stessi + Autotransfusión intravenosa (IV) Enables the use of IV transfusions on oneself. @@ -611,6 +641,7 @@ Umožňuje aplikovat IV transfuze na sama sebe. Pozwala przetoczyć płyny IV samemu sobie Abilita la trasfusione in endovena su se stessi. + Habilita el uso de las transfusiones IV sobre uno mismo Allow Unconscious Body Bag @@ -651,6 +682,7 @@ Converti oggetti vanilla Přeměnit zdravotnické předměty ze základní hry Konwertuj przedmioty z vanili + Convierte los objetos estándars de A3 en objetos ACE Controls whether vanilla medical items are converted to ACE Medical items, removed only, or ignored. @@ -663,6 +695,7 @@ Controlla se gli articoli medicali vanilla vengono convertiti in articoli medicali ACE, rimossi o ignorati. Nastavuje zda zdravotnické předměty ze základní hry budou přeměněny na ACE předměty, odstraněny nebo ignorovány. Kontroluje, czy podstawowe przedmioty medyczne z Arma są konwertowane na przedmioty medyczne ACE, tylko usuwane lub ignorowane. + Controla si los artículos médicos básicos se convierten en artículos médicos de ACE, solo se eliminan o se ignoran. Remove Only @@ -675,6 +708,7 @@ Pouze odstranit Tylko Usuwaj Nur Entfernen + Solo eliminar Enable Litter @@ -702,6 +736,7 @@ Umožňuje vytvořit odpadky při léčbě. Umożliwia tworzenie śmieci po przeprowadzaniu zabiegu. Ermöglicht das Produzieren von Abfall während einer Behandlung. + Habilita la opción de basura durante el tratamiento Max Litter Objects @@ -715,6 +750,7 @@ Maksymalna Ilość Śmieci Maximale Anzahl an Abfall-Objekten Maks. Çöp Objesi + Número máximo de objetos de basura Sets the maximum number of litter objects which can be spawned, excessive amounts can cause FPS lag. @@ -727,6 +763,7 @@ Nastavuje maximum odpadků, které se mohou objevit. Vysoká hodnota m§že negativně ovlivnit FPS. Definiuje maksymalną liczbę śmieci, które mogą zostać stworzone, nadmierne ilości mogą powodować spadki FPS. Bestimmt die maximal Anzahl an Abfall-Objekten, die erstellt werden können. Eine zu hohe Anzahl kann Lag verursachen. + Establece el número máximo de objetos de basura que se pueden generar, cantidades excesivas pueden causar saltos de FPS. Litter Lifetime @@ -740,6 +777,7 @@ Czas trwania Śmieci Abfall Anzeigedauer Cöp Silinme Süresi + Tiempo de vida de la basura Controls the lifetime of litter objects, in seconds. -1 is forever. @@ -752,6 +790,7 @@ Nastavuje za jak dlouho zdravotnické odpadky zmizí. -1 je navždy. Kontroluje czas trwania śmieci w sekundach. -1 pozostawia je na zawsze. Kontrolliert die Anzeigedauer von Abfall-Objekten in Sekunden. -1 ist für immer. + Controla el tiempo de vida de la basura (segundos). -1 es igual a permanentes Anyone @@ -782,6 +821,7 @@ Medycy Sanitäter Sıhhiye + Médicos Doctors @@ -795,6 +835,7 @@ Doktorzy Ärzte Doktor + Doctores Medical Facilities @@ -808,6 +849,7 @@ Obiekty Medyczne Medizinische Einrichtungen Tıbbi tesisler + Instalaciones médicas Vehicles & Facilities @@ -821,6 +863,7 @@ Pojazdy i Obiekty Fahrzeuge und Einrichtungen Araçlar ve Tesisler + Vehículos e instalaciones médicas CPR Success Chance @@ -834,6 +877,7 @@ Szansa powodzenia RKO HLW Erfolgsrate CPR Başarı Şansı + Probabilidad de éxito del RCP Probability that CPR will be successful in restoring heart rhythm. @@ -847,6 +891,7 @@ Prawdopodobieństwo przwyrócenia akcji serca poprzez wykonanie RKO Wahrscheinlichkeit, dass HLW bei der Wiederherstellung des Herzrhythmus erfolgreich sein wird. Kalp ritmini geri kazanmada CPR'nin başarılı olma olasılığı. + Probabilidad de que el RCP sea exitoso restaurando el ritmo cardíaco. CPR Treatment Time @@ -866,6 +911,7 @@ Wymagana broń w kaburze Holstern benötigt Необходимость убирать оружие + Requiere enfundar Controls whether weapons must be holstered / lowered in order to perform medical actions.\nExcept Exam options allow examination actions (checking pulse, blood pressure, response) at all times regardless of this setting. @@ -877,6 +923,7 @@ Controlla se le armi devono essere tenute nella fondina / abbassate per poter eseguire le azioni mediche.\Except Exam - Permette azioni di esame (controllo del polso, della pressione sanguigna, della risposta) in ogni momento indipendentemente dall'impostazione della fondina richiesta. Kontrolliert, ob Waffen geholstert/gesenkt werden müssen, um medizinische Aktionen durchzuführen.\nAusgenommen die eingestellten Untersuchungsoptionen erlauben Diagnose-Aktionen (Überprüfung von Puls, Blutdruck, Reaktion) jederzeit. Нужно ли убирать оружие для проведения медицинских действий.\nОпция «Проверка разрешена» разрешает проверять пульс, кровяное давление или реакцию независимо от этого параметра. + Controla si las armas deben estar enfundadas / bajadas para realizar acciones médicas. \n Excepto Las opciones de examen permiten acciones de examen (control del pulso, presión arterial, respuesta) en todo momento, independientemente de esta configuración. Lowered or Holstered @@ -888,6 +935,7 @@ Opuszczona lub w kaburze Gesenkt oder Geholstert Опущено или убрано + Bajada o enfundada Lowered or Holstered (Except Exam) @@ -899,6 +947,7 @@ Opuszczona lub w kaburze (oprócz diagnozowania) Gesenkt oder Geholstert (Ausnahme Untersuchung) Опущено или убрано (Проверка разрешена) + Bajada o enfundada (excepto examen) Holstered Only @@ -910,6 +959,7 @@ Tylko w Kaburze Nur geholstert Только убрано + Solo enfundada Holstered Only (Except Exam) @@ -921,6 +971,7 @@ Tylko w Kaburze (oprócz diagnozowania) Nur geholstert (Ausnahme Untersuchung) Только убрано (Проверка разрешена) + Solo enfundada (excepto examen) [ACE] Medical Supply Crate (Basic) @@ -1355,6 +1406,7 @@ Schiene 夹板 Atel + Férula Stabilizes a fractured limb @@ -1369,6 +1421,7 @@ Stabilisiere einen Bruch 用于固定骨折的肢体 Kırık bir uzvu stabilize eder + Estabilizar un hueso roto Morphine Autoinjector diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 63672ca1a2..f34315d59c 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -511,6 +511,7 @@ Précision des points de passage 微型軍用GPS接收器 - 導航精確度 MicroDAGR - přesnost Waypointů + Micro DAGR - precisión del waypoint Controls how precise the waypointdistance can be displayed @@ -523,6 +524,7 @@ Définit la précision d'affichage des points de passage. 控制顯示的導航點精確度為多少 Nastavuje jak přesně je vzdálenost waypointů zobrazena. + Controla cómo de precisa se mostrará la distancia al waypoint 100m @@ -536,6 +538,7 @@ 一百公尺 100 m 100m + 100m 10m @@ -549,6 +552,7 @@ 十公尺 10 m 10m + 10m 1m @@ -562,6 +566,7 @@ 一公尺 1 m 1m + 1m Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap. diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index dcf83627ca..15d8f0b4bc 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -82,6 +82,7 @@ Morteiro Mk6 Minomet Mk6 Mk6 Havan + Mortero MK6 Mk6 Settings diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index 555f346c81..af3d048f1e 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -14,6 +14,7 @@ ACE Visão Noturna ACE Noční vidění ACE Gece Görüşü + ACE visión nocturna NV Goggles (Gen1) diff --git a/addons/nlaw/stringtable.xml b/addons/nlaw/stringtable.xml index a53d21050c..6ac169dcc8 100644 --- a/addons/nlaw/stringtable.xml +++ b/addons/nlaw/stringtable.xml @@ -15,6 +15,7 @@ NLAW suivre la cible (maintenir) NLAW sledování cíle (držet) NLAW Track Target (Basılı Tut) + NLAW Seguir objetivo (Mantener) Direct Attack @@ -30,6 +31,7 @@ Attaque directe Přímý útok Doğrudan Saldırı + Ataque directo Overfly Top Attack @@ -45,6 +47,7 @@ Attaque par le haut Útok zvrchu při přeletu Yüksek Uçuş Saldırı + Ataque desde arriba diff --git a/addons/noradio/stringtable.xml b/addons/noradio/stringtable.xml index 7e788a9f3f..affc778e6a 100644 --- a/addons/noradio/stringtable.xml +++ b/addons/noradio/stringtable.xml @@ -14,6 +14,7 @@ Joueur en sourdine Ztlumit hráče Oyuncuyu Sustur + Ensordecer jugador Mutes the controlled player avatar. @@ -28,6 +29,7 @@ Met en sourdine l'avatar du joueur. Vypne hlas charakteru hráče. Oyuncuları Susturur + Ensordecer el avatar del jugador controlado diff --git a/addons/quickmount/stringtable.xml b/addons/quickmount/stringtable.xml index d53a4b2b10..58c4f56e09 100644 --- a/addons/quickmount/stringtable.xml +++ b/addons/quickmount/stringtable.xml @@ -14,6 +14,7 @@ Entrada Rápida Entrée rapide Rychlé nastoupení + Entrada rápida Vehicle quick mount @@ -28,6 +29,7 @@ Entrada Rápida em Veículo Entrée rapide véhicules Rychlé nastoupení do vozidla + Entrada rápida vehículo Quickly enter the vehicle you are directly looking at. @@ -43,6 +45,7 @@ Permet d'entrer rapidement dans le véhicule que vous regardez. Rychle nastoupit do vozidla na které se díváte. Doğrudan bakmakta olduğunuz araca hızla girin. + Entrar rápidamente al vehículo al que estás mirando Vehicle Full @@ -58,6 +61,7 @@ Véhicule plein Vozidlo je plné Araç Dolu + Vehículo completo This option allows quick entry into the vehicle you are directly looking at. @@ -70,6 +74,7 @@ Bu seçenek, doğrudan bakmakta olduğunuz araca hızlı giriş sağlar. Tato možnost umožňuje rychle nastoupit do vozidla na které se díváte. Эта опция разрешает быстро залезть в транспорт, на который вы смотрите. + Esta opción permite entrar rápidamente al vehículo al que estás mirando Distance @@ -85,6 +90,7 @@ Distance Vzdálenost Mesafe + Distancia Maximum distance to check for vehicles. @@ -100,6 +106,7 @@ Distance de vérification maximale des véhicules. Maximální vzdálenost od vozidel. Araçların kontrol edilmesi için maksimum mesafe. + Distancia máxima para comprobar vehículos Vehicle Locked @@ -115,6 +122,7 @@ Véhicule verrouillé Vozidlo je zamčeno Araç Kilitli + Vehículo bloqueado Maximum Speed (km/h) @@ -130,6 +138,7 @@ Vitesse maximale (km/h) Maximální rychlost (km/h) Yüksek Hız (km/h) + Velocidad máxima (km/h) Maximum vehicle speed (km/h) allowed for player entry @@ -145,6 +154,7 @@ Définit la vitesse maximale que peut avoir un véhicule en mouvement pour qu'un joueur réussisse à y entrer. Maximální rychlost vozidla (km/h) při které hráči mohou nastoupit do vozidla Oyuncu binmesi için izin verilen maksimum araç hızı (km / s) + Máxima velocidad del vehículo (km/h) para permitir la entrada de jugadores Prioritize Seat @@ -160,6 +170,7 @@ Place prioritaire Priorita sedadel Koltuğa Öncelik Ver + Asiento prioritario Seat priority on entry @@ -175,6 +186,7 @@ Définit à quel poste s'asseoir en priorité lors de l'embarquement. Priorita sedadla při nástupu Araça binerken koltuk önceliği + Asiento prioritario en entrada Change seat @@ -188,6 +200,7 @@ Changer de place Změnit sedadlo Koltuk Değiştir + Cambiar asiento diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 658868a026..0340620ff5 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1787,6 +1787,7 @@ Metis-M Metis-M Metis-M + Metis-M Metis-M (Brown) @@ -2885,6 +2886,7 @@ Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) Jeep Wrangler (SPG-9) + Jeep Wrangler (SPG-9) Jeep Wrangler (LMG) @@ -2899,6 +2901,7 @@ Jeep Wrangler (LMG) Jeep Wrangler (LMG) Jeep Wrangler (LMG) + Jeep Wrangler (LMG) Cessna TTx diff --git a/addons/rearm/stringtable.xml b/addons/rearm/stringtable.xml index bed3517f83..4aae2a1aeb 100644 --- a/addons/rearm/stringtable.xml +++ b/addons/rearm/stringtable.xml @@ -13,6 +13,7 @@ Перевооружение Rearme Přezbrojení + Rearmar Rearm Settings @@ -132,6 +133,7 @@ Запас боеприпасов Suprimento de Munições Zásoba munice + Suministro de munición How much ammunition does an ammo truck carry? @@ -146,6 +148,7 @@ Какой боезапас перевозит грузовик с боеприпасами? Quanta munição um caminhão de munições carrega? Kolik munice naklaďák uveze? + ¿Cuánta munición carga el camión de armamento? Unlimited ammo supply @@ -160,6 +163,7 @@ Неограниченный боезапас Suprimento Ilimitado de Munição Nekonečná zásoba + Suministro de munición ilimitado Limited ammo supply based on caliber @@ -174,6 +178,7 @@ Ограниченный боезапас в зависимости от калибра Munição Limitada ao Calibre Konečná zásoba v závislosti na kalibru + Suministro de munición limitado en base al calibre Only specific Magazines @@ -188,6 +193,7 @@ Только определенные магазины Apenas carregadores específicos Pouze specifické zásobníky + Únicamente cargadores específicos Check remaining ammunition @@ -202,6 +208,7 @@ Проверить остаток БК Checar munição restante Zkontrolovat zbývající munici + Comprobar munición restante Checking remaining ammunition... @@ -216,6 +223,7 @@ Проверка остатка боекомплекта... Checando Munição... Kontroluji zbývající munici... + Comprobando munición restante... There is ammunition worth %1 points left. @@ -230,6 +238,7 @@ Остаток единиц БК: %1 Possui munição equivalente a %1 pontos restantes. Zbývá ještě %1 muničních bodů. + Queda munición equivalente a un 1% The following ammunition is left:%1 @@ -244,6 +253,7 @@ Оставшийся боекомплект: %1 A munição que restou: %1 Zbývá následující munice:%1 + Queda la siguiente munición: 1% There is no ammunition left. @@ -258,6 +268,7 @@ Запас боекомплекта пуст Não há munição sobrando. Už nezbývá žádná munice. + No queda munición Rearm @@ -647,6 +658,7 @@ 整裝用貨物 Stock de munitions Sklad munice + Cargar munición The cargo for rearming (-1 disable) @@ -659,6 +671,7 @@ 貨物可以提高多少次整裝(-1為停用) Le quantité de munitions (en points), qui est disponible pour du réarmement (-1 pour désactiver). Objekt pro přezbrojování (-1 pro vypnutí) + Cantidad de munición restante para rearmado (-1 para deshabilitar) Rearm distance @@ -671,6 +684,7 @@ Přezbrojovací vzdálenost Odległość przezbrojenia Дистанция перевооружения + Distancia de rearmado The maximum distance a vehicle can be rearmed at @@ -683,6 +697,7 @@ Maximální vzdálenost na jakou může být vozidlo přezbrojeno Maksymalna odległość na jakiej pojazd może zostać przezbrojony Максимальная дистанция для перевооружения + Máxima distancia a la que un vehículo puede ser rearmado diff --git a/addons/refuel/stringtable.xml b/addons/refuel/stringtable.xml index eb6002c54e..01459451d2 100644 --- a/addons/refuel/stringtable.xml +++ b/addons/refuel/stringtable.xml @@ -303,6 +303,7 @@ Impossible de démarrer la pompe Nepodařilo se zapnout trysku Yakıt pompası başlatılamadı + No se pudo activar la boquilla de la manguera %1 Liters fueled @@ -494,6 +495,7 @@ Volume de la citerne Objem palivové cisterny Doldurma Hız + Volumen del depósito @@ -509,6 +511,7 @@ Quantidade de combustível disponível para abastecer (-1 para desativar, -10 para infinito) Le volume de carburant disponible pour le ravitaillement (-1 pour désactiver, -10 pour quantité illimitée). Objem paliva k tankování (-1 pro vypnutí, -10 pro nekonečno) + El volumen de combustible disponible para llenar (-1 desactivado, -10 es infinito) Refuel Hose attach coordinates @@ -523,6 +526,7 @@ Coords. do encaixe para Mangueira Coordonnées du pistolet Souřadnice pro připojení hadice na palivo + Coordenadas de la boquilla de la manguera Model coordinates used to attach refuel hose @@ -537,6 +541,7 @@ As coordenadas do modelo usado para conectar a mangueira ao veículo Coordonnées du modèle 3D où est attaché le tuyau ravitaillement. Souřadnice na modelu pro připojení hadice na palivo. + Coordenadas del modelo usado para la boquilla de la manguera diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index deecdd5cdd..07d8cd605a 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -43,6 +43,7 @@ Toujours afficher l'action de vérification des munitions Sempre mostrar a opção de checar a própria munição Всегда показывать проверку боеприпасов в меню взаимодействия с собой + Mostrar siempre la autointeracción de comprobar munición Shows check ammo self interaction even when not in static weapons. @@ -54,6 +55,7 @@ Permet d'afficher l'action de vérification des munitions du menu d'interaction personnel, même si le joueur n'utilise pas d'arme statique. Mostra a opção de ver sua própria munição mesmo quando não em armas estáticas. Показывать проверку боеприпасов даже вне стационарного орудия + Mostrar la comprobación de la munición incluso cuando no está en armas estáticas Check Ammo diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 9311f2a351..558a47df02 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -14,6 +14,7 @@ Réapparition Znovuzrození Yeniden Doğma + Reaparición Deploy in 5 seconds... @@ -304,6 +305,7 @@ Minuterie enlèvement corps Časovač odstranění mrtvol Bedenin Silinme Süresi + Temporizador para eliminar cuerpos This module enables you to configure ACE functionality specific to respawns. diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 081ee545aa..350fa15856 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -15,6 +15,7 @@ Zeus Zeus Zeus + Zeus Zeus Settings From 50578a2463acf652b7e5bdb7be8947690eadf146 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 27 Feb 2021 00:17:00 +0100 Subject: [PATCH 079/335] Fix Multiple Issues With Timestamps (#8034) * Fix Multiple Issues With Timestamps * simplify * improve parsing of timestamps Co-authored-by: PabstMirror --- addons/markers/XEH_PREP.hpp | 1 + .../functions/fnc_initInsertMarker.sqf | 98 +++++++++---------- .../functions/fnc_onButtonClickConfirm.sqf | 37 ++++--- .../fnc_onCheckedChangedTimestamp.sqf | 13 +-- .../functions/fnc_onLBSelChangedColor.sqf | 1 - .../functions/fnc_onLBSelChangedShape.sqf | 1 - .../markers/functions/fnc_removeTimestamp.sqf | 70 +++++++++++++ addons/markers/initSettings.sqf | 26 +---- addons/markers/script_component.hpp | 28 +++--- addons/markers/stringtable.xml | 4 +- 10 files changed, 164 insertions(+), 115 deletions(-) create mode 100644 addons/markers/functions/fnc_removeTimestamp.sqf diff --git a/addons/markers/XEH_PREP.hpp b/addons/markers/XEH_PREP.hpp index 3cf9dfc600..9d358e2f8a 100644 --- a/addons/markers/XEH_PREP.hpp +++ b/addons/markers/XEH_PREP.hpp @@ -17,3 +17,4 @@ PREP(movePFH); PREP(canTimestamp); PREP(onButtonClickConfirm); PREP(onCheckedChangedTimestamp); +PREP(removeTimestamp); diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index 1560040bc9..7d91173c87 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -1,5 +1,4 @@ #include "script_component.hpp" -#include "\A3\ui_f\hpp\defineResincl.inc" /* * Author: BIS, commy2, Timi007 * Sets up the marker placement @@ -26,30 +25,28 @@ //Can't place markers when can't interact if !([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith { - _display closeDisplay 2; //emulate "Cancel" button + _display closeDisplay 2; //emulate "Cancel" button }; //BIS Controls: - private _text = _display displayctrl IDC_INSERT_MARKER; - private _picture = _display displayctrl IDC_INSERT_MARKER_PICTURE; - private _channel = _display displayctrl IDC_INSERT_MARKER_CHANNELS; - private _buttonOK = _display displayctrl IDC_OK; - private _buttonCancel = _display displayctrl IDC_CANCEL; - private _description = _display displayctrl 1100; - private _title = _display displayctrl 1001; - private _descriptionChannel = _display displayctrl 1101; + private _text = _display displayctrl IDC_INSERT_MARKER; + private _picture = _display displayctrl IDC_INSERT_MARKER_PICTURE; + private _channel = _display displayctrl IDC_INSERT_MARKER_CHANNELS; + private _buttonOK = _display displayctrl IDC_OK; + private _buttonCancel = _display displayctrl IDC_CANCEL; + private _description = _display displayctrl 1100; + private _title = _display displayctrl 1001; + private _descriptionChannel = _display displayctrl 1101; //ACE Controls: - // _sizeX = _display displayctrl 1200; - // _sizeY = _display displayctrl 1201; - private _aceTimestamp = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP; - private _aceTimestampText = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP_TEXT; - private _aceShapeLB = _display displayctrl IDC_ACE_INSERT_MARKER_SHAPE; - private _aceColorLB = _display displayctrl IDC_ACE_INSERT_MARKER_COLOR; - private _aceAngleSlider = _display displayctrl IDC_ACE_INSERT_MARKER_ANGLE; - private _aceAngleSliderText = _display displayctrl IDC_ACE_INSERT_MARKER_ANGLE_TEXT; + private _ctrlTimestamp = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP; + private _ctrlTimestampText = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP_TEXT; + private _aceShapeLB = _display displayctrl IDC_ACE_INSERT_MARKER_SHAPE; + private _aceColorLB = _display displayctrl IDC_ACE_INSERT_MARKER_COLOR; + private _aceAngleSlider = _display displayctrl IDC_ACE_INSERT_MARKER_ANGLE; + private _aceAngleSliderText = _display displayctrl IDC_ACE_INSERT_MARKER_ANGLE_TEXT; - private _mapDisplay = displayParent _display; + private _mapDisplay = displayParent _display; if (isNull _mapDisplay) exitWith {ERROR("No Map");}; private _mapCtrl = _mapDisplay displayCtrl IDC_MAP; @@ -92,19 +89,11 @@ // prevent vanilla key input _display displayAddEventHandler ["KeyDown", {(_this select 1) in [200, 208]}]; - private _hasTimestamp = false; - if !((markerText GVAR(editingMarker)) isEqualTo "") then { + private _markerText = markerText GVAR(editingMarker); + if (_markerText != "") then { // fill text input with text from marker which is being edited - - private _originalText = markerText GVAR(editingMarker); - private _timeIndex = _originalText find (TIMESTAMP_SPACE + "["); - if (_timeIndex > 0 ) then { - // Shave off timestamp - _hasTimestamp = true; - _originalText = _originalText select [0,_timeIndex]; - }; - - _text ctrlSetText _originalText; + _markerText = _markerText call FUNC(removeTimestamp); + _text ctrlSetText _markerText; }; //Focus on the text input @@ -114,7 +103,7 @@ private _pos = ctrlposition _text; _pos params ["_posX", "_posY", "_posW", "_posH"]; _posX = _posX + 0.01; - _posY = _posY min ((safeZoneH + safeZoneY) - (8 * _posH + 8 * BORDER)); //prevent buttons being placed below bottom edge of screen + _posY = _posY min ((safeZoneH + safeZoneY) - (8 * _posH + 8 * BORDER)); //prevent buttons being placed below bottom edge of screen _pos set [0, _posX]; _pos set [1, _posY]; _text ctrlSetPosition _pos; @@ -143,31 +132,33 @@ if (GVAR(timestampEnabled)) then { _timestampOffset = _posH + BORDER; - _pos set [0, _posX]; - _pos set [1, _posY + 1 * _posH + 2 * BORDER]; - _pos set [2, _posW - _posH]; - _pos set [3, _posH]; - _aceTimestampText ctrlSetStructuredText parseText format ["%1", LLSTRING(Timestamp)]; - _aceTimestampText ctrlSetPosition _pos; - _aceTimestampText ctrlCommit 0; + private _left = _posX; + private _top = _posY + 1 * _posH + 2 * BORDER; + private _width = _posH * safeZoneH / safeZoneW; + private _height = _posH; - _pos set [0, _posX + _posW - _posH]; - _pos set [2, _posH]; - _pos set [3, _posH]; - _aceTimestamp ctrlSetPosition _pos; - _aceTimestamp ctrlCommit 0; + _ctrlTimestamp ctrlSetPosition [_left, _top, _width, _height]; + _ctrlTimestamp ctrlCommit 0; + + _ctrlTimestampText ctrlSetStructuredText parseText format ["%1", LLSTRING(Timestamp)]; + + _left = _left + _width; + _width = _posW - _width; + _top = _top + 0.1 * _height; + _ctrlTimestampText ctrlSetPosition [_left, _top, _width, _height]; + _ctrlTimestampText ctrlCommit 0; if !([ACE_player] call FUNC(canTimestamp)) then { - _aceTimestamp ctrlEnable false; - _aceTimestamp ctrlSetTooltip LLSTRING(TimestampTooltipNoWatch); + _ctrlTimestamp ctrlEnable false; + _ctrlTimestamp ctrlSetTooltip LLSTRING(TimestampTooltipNoWatch); } else { - _aceTimestamp cbSetChecked (GETUVAR(GVAR(timestampChecked),false) || _hasTimestamp); + _ctrlTimestamp cbSetChecked (uiNamespace getVariable [QGVAR(timestampChecked), false]); }; } else { - _aceTimestampText ctrlEnable false; - _aceTimestampText ctrlShow false; - _aceTimestamp ctrlEnable false; - _aceTimestamp ctrlShow false; + _ctrlTimestampText ctrlEnable false; + _ctrlTimestampText ctrlShow false; + _ctrlTimestamp ctrlEnable false; + _ctrlTimestamp ctrlShow false; }; //--- Shape @@ -268,9 +259,8 @@ //////////////////// // init marker timestamp cb - - _buttonOK ctrlAddEventHandler ['ButtonClick', FUNC(onButtonClickConfirm)]; - _aceTimestamp ctrlAddEventHandler ['CheckedChanged', FUNC(onCheckedChangedTimestamp)]; + _buttonOK ctrlAddEventHandler ["ButtonClick", FUNC(onButtonClickConfirm)]; + _ctrlTimestamp ctrlAddEventHandler ["CheckedChanged", FUNC(onCheckedChangedTimestamp)]; //////////////////// // init marker shape lb diff --git a/addons/markers/functions/fnc_onButtonClickConfirm.sqf b/addons/markers/functions/fnc_onButtonClickConfirm.sqf index caa49a0e1c..12c6f37d06 100644 --- a/addons/markers/functions/fnc_onButtonClickConfirm.sqf +++ b/addons/markers/functions/fnc_onButtonClickConfirm.sqf @@ -1,5 +1,4 @@ #include "script_component.hpp" -#include "\a3\ui_f\hpp\defineResincl.inc" /* * Author: Freddo * When the confirm button is pressed. @@ -21,22 +20,34 @@ private _display = ctrlParent _buttonOk; private _description = _display displayctrl IDC_INSERT_MARKER; private _aceTimestamp = _display displayCtrl IDC_ACE_INSERT_MARKER_TIMESTAMP; -// Handle timestamp -if (cbChecked _aceTimestamp && {[ACE_player] call FUNC(canTimestamp)}) then { +// handle timestamp +if (cbChecked _aceTimestamp && {ACE_player call FUNC(canTimestamp)}) then { private _time = daytime; - private _ampm = switch (true) do { - case (GVAR(timestampHourFormat) == 24): {""}; - case (_time < 12): {" am"}; - case (_time > 12): {SUB(_time,12); " pm"}; + + // add timestamp suffix + private _periodPostfix = ""; + if (GVAR(timestampHourFormat) == 12) then { + if (floor _time == 0) exitWith { + _time = _time + 12; + _periodPostfix = " am"; + }; + + if (floor _time == 12) exitWith { + _periodPostfix = " pm"; + }; + + if (_time < 12) then { + _periodPostfix = " am"; + } else { + _time = _time - 12; + _periodPostfix = " pm"; + }; }; - _description ctrlSetText format [ // Add timestamp suffix - "%1%2[%2%3]", + _description ctrlSetText format [ + "%1 [%2%3]", ctrlText _description, - TIMESTAMP_SPACE, [_time, GVAR(timestampFormat)] call BIS_fnc_timeToString, - _ampm + _periodPostfix ]; }; - -nil diff --git a/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf b/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf index 23a3b8c73d..5980e875cd 100644 --- a/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf +++ b/addons/markers/functions/fnc_onCheckedChangedTimestamp.sqf @@ -1,8 +1,7 @@ #include "script_component.hpp" -#include "\a3\ui_f\hpp\defineResincl.inc" /* - * Author: Freddo - * When the timestamp checkbox is toggled + * Author: Freddo, commy2 + * When the timestamp checkbox is toggled. * * Arguments: * 0: Checkbox @@ -12,12 +11,10 @@ * None * * Example: - * [_cbTimestamp,1] call ACE_markers_fnc_onCheckedChangedTimestamp + * [controlNull, 1] call ACE_markers_fnc_onCheckedChangedTimestamp; * * Public: No */ -params ["_cbTimestamp", "_checked"]; +params ["", "_checked"]; -SETUVAR(GVAR(timestampChecked),(_checked == 1)); - -nil +uiNamespace setVariable [QGVAR(timestampChecked), _checked == 1] diff --git a/addons/markers/functions/fnc_onLBSelChangedColor.sqf b/addons/markers/functions/fnc_onLBSelChangedColor.sqf index df45213b8e..ceb3cfe0b5 100644 --- a/addons/markers/functions/fnc_onLBSelChangedColor.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedColor.sqf @@ -1,5 +1,4 @@ #include "script_component.hpp" -#include "\a3\ui_f\hpp\defineResincl.inc" /* * Author: commy2 * When the color list box is changed. diff --git a/addons/markers/functions/fnc_onLBSelChangedShape.sqf b/addons/markers/functions/fnc_onLBSelChangedShape.sqf index 25e6b54468..5dfbbabd01 100644 --- a/addons/markers/functions/fnc_onLBSelChangedShape.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedShape.sqf @@ -1,5 +1,4 @@ #include "script_component.hpp" -#include "\a3\ui_f\hpp\defineResincl.inc" /* * Author: commy2 * When the shape list box is changed. diff --git a/addons/markers/functions/fnc_removeTimestamp.sqf b/addons/markers/functions/fnc_removeTimestamp.sqf new file mode 100644 index 0000000000..9f9d6ab438 --- /dev/null +++ b/addons/markers/functions/fnc_removeTimestamp.sqf @@ -0,0 +1,70 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Removes timestamp from end of a string. + * + * Arguments: + * 0: Marker text string + * + * Return Value: + * Input with timestamp removed + * + * Example: + * "abc [12:00 am]" call ace_markers_fnc_removeTimestamp // "abc" + * "[13:37]" call ace_markers_fnc_removeTimestamp // "" + * "xyz [123]" call ace_markers_fnc_removeTimestamp // "xyz [123]" + * "xyz [12]" call ace_markers_fnc_removeTimestamp // "xyz" + * "xyz [12 pm]" call ace_markers_fnc_removeTimestamp // "xyz" + * + * Public: No + */ +#define DIGITS "0123456789" + +params ["_original"]; + +// @todo, 2.02 reverse command will support STRING types +private _string = toArray _original; +reverse _string; +_string = toString _string; + +if (_string select [0, 1] != "]") exitWith {_original}; + +private _timestampLength = (_string find "[") + 1; +_string = _string select [0, _timestampLength]; + +// @todo +_string = toArray _string; +reverse _string; +_string = toString _string; + +if (_string select [0, 1] != "[") exitWith {_original}; + +private _index = 1; +private _keepCheckingDigits = true; +private _validTimestamp = true; +while {_keepCheckingDigits} do { + if (!(_string select [_index, 1] in DIGITS)) exitWith { _validTimestamp = false; }; + if (!(_string select [_index+1, 1] in DIGITS)) exitWith { _validTimestamp = false; }; + switch (_string select [_index+2, 1]) do { + case (":"): { + _index = _index + 3; + }; + case ("]"): { + _keepCheckingDigits = false; + }; + case (" "): { + _keepCheckingDigits = false; + if (!(_string select [_index+3, 3] in ["am]", "pm]"])) then {_validTimestamp = false; }; + }; + default { + _keepCheckingDigits = false; + _validTimestamp = false; + }; + }; +}; + +if (_validTimestamp) then { + [_original select [0, count _original - _timestampLength], " "] call CBA_fnc_rightTrim // return +} else { + _original // return +} diff --git a/addons/markers/initSettings.sqf b/addons/markers/initSettings.sqf index b7bd72efca..ce8e8e0473 100644 --- a/addons/markers/initSettings.sqf +++ b/addons/markers/initSettings.sqf @@ -37,14 +37,8 @@ private _categoryName = format ["ACE %1", localize ELSTRING(map,Module_DisplayNa [LSTRING(TimestampHourFormat), LSTRING(TimestampHourFormatDescription)], [_categoryName, LLSTRING(Module_DisplayName)], [ - [ - 24, - 12 - ], - [ - LSTRING(TimestampHourFormat24), - LSTRING(TimestampHourFormat12) - ], + [24, 12], + [LSTRING(TimestampHourFormat24), LSTRING(TimestampHourFormat12)], 0 ] ] call CBA_fnc_addSetting; @@ -55,25 +49,15 @@ private _formatDescription = [ LLSTRING(TimestampFormatDescription2), LLSTRING(TimestampFormatDescription3), LLSTRING(TimestampFormatDescription4) -] joinString "\n"; +] joinString endl; [ QGVAR(timestampFormat), "LIST", [LSTRING(timestampFormat), _formatDescription], [_categoryName, LLSTRING(Module_DisplayName)], [ - [ - "HH", - "HH:MM", - "HH:MM:SS", - "HH:MM:SS:MM" - ], - [ - "HH", - "HH:MM", - "HH:MM:SS", - "HH:MM:SS:MM" - ], + ["HH", "HH:MM", "HH:MM:SS", "HH:MM:SS:MM"], + ["HH", "HH:MM", "HH:MM:SS", "HH:MM:SS:MM"], 1 ] ] call CBA_fnc_addSetting; diff --git a/addons/markers/script_component.hpp b/addons/markers/script_component.hpp index a40e557135..ab0a10961b 100644 --- a/addons/markers/script_component.hpp +++ b/addons/markers/script_component.hpp @@ -15,6 +15,7 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" #define CHANNEL_NAMES [ \ localize "str_channel_global", \ @@ -24,19 +25,16 @@ localize "str_channel_vehicle" \ ] -// 129 just looks like a space -#define TIMESTAMP_SPACE (toString [129]) +#define MOVE_RESTRICTION_NOBODY -1 +#define MOVE_RESTRICTION_ALL 0 +#define MOVE_RESTRICTION_ADMINS 1 +#define MOVE_RESTRICTION_GROUP_LEADERS 2 +#define MOVE_RESTRICTION_GROUP_LEADERS_ADMINS 3 +#define MOVE_RESTRICTION_OWNER 4 -#define MOVE_RESTRICTION_NOBODY -1 -#define MOVE_RESTRICTION_ALL 0 -#define MOVE_RESTRICTION_ADMINS 1 -#define MOVE_RESTRICTION_GROUP_LEADERS 2 -#define MOVE_RESTRICTION_GROUP_LEADERS_ADMINS 3 -#define MOVE_RESTRICTION_OWNER 4 - -#define IDC_ACE_INSERT_MARKER_TIMESTAMP 1210 -#define IDC_ACE_INSERT_MARKER_TIMESTAMP_TEXT 1211 -#define IDC_ACE_INSERT_MARKER_SHAPE 1220 -#define IDC_ACE_INSERT_MARKER_COLOR 1221 -#define IDC_ACE_INSERT_MARKER_ANGLE 1230 -#define IDC_ACE_INSERT_MARKER_ANGLE_TEXT 1231 +#define IDC_ACE_INSERT_MARKER_TIMESTAMP 1210 +#define IDC_ACE_INSERT_MARKER_TIMESTAMP_TEXT 1211 +#define IDC_ACE_INSERT_MARKER_SHAPE 1220 +#define IDC_ACE_INSERT_MARKER_COLOR 1221 +#define IDC_ACE_INSERT_MARKER_ANGLE 1230 +#define IDC_ACE_INSERT_MARKER_ANGLE_TEXT 1231 diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index 3b0fed2a04..1848e4fa41 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -159,8 +159,8 @@ Active une interface permettant d'apposer un horodatage sur les marqueurs. - Add Timestamp: - Ajouter l'horodatage + Timestamp + Horodatage Watch Required From d55529041a55310acc95aeca0f82425360f7d6e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Dahlgren?= Date: Sat, 27 Feb 2021 02:55:01 +0100 Subject: [PATCH 080/335] Apply needed pboProject settings in make.py via Windows Registry (#8128) --- tools/make.py | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/tools/make.py b/tools/make.py index d7ef417996..ca37369638 100644 --- a/tools/make.py +++ b/tools/make.py @@ -227,6 +227,17 @@ def find_bi_tools(work_drive): else: raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") +def mikero_windows_registry(path, access=winreg.KEY_READ): + try: + return winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Mikero\{}".format(path), access=access) + except FileNotFoundError: + try: + return winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"Software\Mikero\{}".format(path), access=access) + except FileNotFoundError: + try: + return winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Wow6432Node\Mikero\{}".format(path), access=access) + except FileNotFoundError: + return winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"Software\Wow6432Node\Mikero\{}".format(path), access=access) def find_depbo_tools(): """Use registry entries to find DePBO-based tools.""" @@ -235,20 +246,8 @@ def find_depbo_tools(): for tool in requiredToolPaths: try: - try: - k = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Mikero\{}".format(tool)) - path = winreg.QueryValueEx(k, "exe")[0] - except FileNotFoundError: - try: - k = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"Software\Mikero\{}".format(tool)) - path = winreg.QueryValueEx(k, "exe")[0] - except FileNotFoundError: - try: - k = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Wow6432Node\Mikero\{}".format(tool)) - path = winreg.QueryValueEx(k, "exe")[0] - except FileNotFoundError: - k = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"Software\Wow6432Node\Mikero\{}".format(tool)) - path = winreg.QueryValueEx(k, "exe")[0] + k = mikero_windows_registry(tool) + path = winreg.QueryValueEx(k, "exe")[0] except FileNotFoundError: print_error("Could not find {}".format(tool)) failed = True @@ -264,6 +263,17 @@ def find_depbo_tools(): return requiredToolPaths +def pboproject_settings(): + """Use registry entries to configure needed pboproject settings.""" + value_exclude = "thumbs.db,*.txt,*.h,*.dep,*.cpp,*.bak,*.png,*.log,*.pew,source,*.tga" + + try: + k = mikero_windows_registry(r"pboProject\Settings", access=winreg.KEY_SET_VALUE) + winreg.SetValueEx(k, "m_exclude", 0, winreg.REG_SZ, value_exclude) + winreg.SetValueEx(k, "m_exclude2", 0, winreg.REG_SZ, value_exclude) + except: + raise Exception("BadDePBO", "pboProject not installed correctly, make sure to run it at least once") + def color(color): """Set the color. Works on Win32 and normal terminals.""" @@ -1031,6 +1041,8 @@ See the make.cfg file for additional build options. pboproject = depbo_tools["pboProject"] rapifyTool = depbo_tools["rapify"] makepboTool = depbo_tools["MakePbo"] + + pboproject_settings() except: raise print_error("Could not find dePBO tools. Download the needed tools from: https://dev.withsix.com/projects/mikero-pbodll/files") From b151148542a44237445581f96609325689c3d096 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Sat, 27 Feb 2021 20:26:12 +0400 Subject: [PATCH 081/335] Replace canAdd with CBA_fnc_canAddItem (#8012) --- addons/attach/functions/fnc_detach.sqf | 2 +- addons/common/functions/fnc_addToInventory.sqf | 8 ++++---- addons/csw/functions/fnc_reload_handleReturnAmmo.sqf | 4 ++-- addons/hearing/functions/fnc_removeEarplugs.sqf | 2 +- addons/interaction/functions/fnc_canPassMagazine.sqf | 2 +- addons/interaction/functions/fnc_passMagazine.sqf | 2 +- addons/magazinerepack/functions/fnc_canRepackMagazine.sqf | 2 +- .../magazinerepack/functions/fnc_getMagazineChildren.sqf | 2 +- .../functions/fnc_startRepackingMagazine.sqf | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index 5ff12967ce..38acbc1883 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -46,7 +46,7 @@ if (isNull _attachedObject || {_itemName == ""}) exitWith {ERROR("Could not find private _isChemlight = _attachedObject isKindOf "Chemlight_base"; // Exit if can't add the item -if (!(_unit canAdd _itemName) && {!_isChemlight}) exitWith { +if (!([_unit, _itemName] call CBA_fnc_canAddItem) && {!_isChemlight}) exitWith { [localize LSTRING(Inventory_Full)] call EFUNC(common,displayTextStructured); }; diff --git a/addons/common/functions/fnc_addToInventory.sqf b/addons/common/functions/fnc_addToInventory.sqf index b8b5f93635..de5eb9b4af 100644 --- a/addons/common/functions/fnc_addToInventory.sqf +++ b/addons/common/functions/fnc_addToInventory.sqf @@ -28,16 +28,16 @@ private _addedToUnit = false; switch (_container) do { case "vest": { - _canAdd = _unit canAddItemToVest _classname; + _canAdd = [_unit, _classname, 1, false, true, false] call CBA_fnc_canAddItem; }; case "backpack": { - _canAdd = _unit canAddItemToBackpack _classname; + _canAdd = [_unit, _classname, 1, false, false, true] call CBA_fnc_canAddItem; }; case "uniform": { - _canAdd = _unit canAddItemToUniform _classname; + _canAdd = [_unit, _classname, 1, true, false, false] call CBA_fnc_canAddItem; }; default { - _canAdd = _unit canAdd _classname; + _canAdd = [_unit, _classname] call CBA_fnc_canAddItem; }; }; diff --git a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf index 1d288b863f..464a7fc65d 100644 --- a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf +++ b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf @@ -25,11 +25,11 @@ private _fullMagazines = floor (_ammo / _carryMaxAmmo); private _bulletsRemaining = _ammo % _carryMaxAmmo; if (_unloadTo isKindOf "CaManBase") then { - while {(_fullMagazines > 0) && {_unloadTo canAdd _carryMag}} do { + while {(_fullMagazines > 0) && {[_unloadTo, _carryMag] call CBA_fnc_canAddItem}} do { _unloadTo addMagazine [_carryMag, _carryMaxAmmo]; _fullMagazines = _fullMagazines - 1; }; - if ((_bulletsRemaining > 0) && {_unloadTo canAdd _carryMag}) then { + if ((_bulletsRemaining > 0) && {[_unloadTo, _carryMag] call CBA_fnc_canAddItem}) then { _unloadTo addMagazine [_carryMag, _bulletsRemaining]; _bulletsRemaining = 0; }; diff --git a/addons/hearing/functions/fnc_removeEarplugs.sqf b/addons/hearing/functions/fnc_removeEarplugs.sqf index 5e8064e767..55ba422beb 100644 --- a/addons/hearing/functions/fnc_removeEarplugs.sqf +++ b/addons/hearing/functions/fnc_removeEarplugs.sqf @@ -20,7 +20,7 @@ params ["_player", ["_displayHint", false, [false]]]; if (!GVAR(EnableCombatDeafness)) exitWith {}; -if !(_player canAdd "ACE_EarPlugs") exitWith { // inventory full +if !([_player, "ACE_EarPlugs"] call CBA_fnc_canAddItem) exitWith { // inventory full [localize LSTRING(Inventory_Full)] call EFUNC(common,displayTextStructured); }; diff --git a/addons/interaction/functions/fnc_canPassMagazine.sqf b/addons/interaction/functions/fnc_canPassMagazine.sqf index 5cc1ed96e2..a76e7fb409 100644 --- a/addons/interaction/functions/fnc_canPassMagazine.sqf +++ b/addons/interaction/functions/fnc_canPassMagazine.sqf @@ -26,5 +26,5 @@ private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; (magazinesAmmoFull _player) findIf { _x params ["_className", "", "_loaded"]; - (_className in _compatibleMags) && {!_loaded} && {_target canAdd _className} + (_className in _compatibleMags) && {!_loaded} && {[_target, _className] call CBA_fnc_canAddItem} } > -1 diff --git a/addons/interaction/functions/fnc_passMagazine.sqf b/addons/interaction/functions/fnc_passMagazine.sqf index 07db3dba3c..f6438211fa 100644 --- a/addons/interaction/functions/fnc_passMagazine.sqf +++ b/addons/interaction/functions/fnc_passMagazine.sqf @@ -21,7 +21,7 @@ params ["_player", "_target", "_weapon"]; private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; private _filteredMags = magazinesAmmoFull _player select { _x params ["_className", "", "_loaded"]; - (_className in _compatibleMags) && {!_loaded} && {_target canAdd _className} + (_className in _compatibleMags) && {!_loaded} && {[_target, _className] call CBA_fnc_canAddItem} }; //select magazine with most ammo diff --git a/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf b/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf index 034de578be..f448b91b64 100644 --- a/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_canRepackMagazine.sqf @@ -25,5 +25,5 @@ private _maxAmmoCount = getNumber (configFile >> "CfgMagazines" >> _magazine >> _magazineType == _magazine // Magazine is of given type && {_ammoCount > 0 && {_ammoCount < _maxAmmoCount}} // Is a partial magazine - && {!_isLoaded || {_unit canAdd _magazineType}} // In inventory or can be moved into it + && {!_isLoaded || {[_unit, _magazineType] call CBA_fnc_canAddItem}} // In inventory or can be moved into it } count magazinesAmmoFull _unit > 1 diff --git a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf index b1cdef9829..3c87b434a7 100644 --- a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf +++ b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf @@ -27,7 +27,7 @@ private _unitMagCounts = []; private _xFullMagazineCount = getNumber (configFile >> "CfgMagazines" >> _xClassname >> "count"); //for every partial magazine, that is either in inventory or can be moved there - if ((_xCount < _xFullMagazineCount) && {_xCount > 0} && {(!_xLoaded) || {_player canAdd _xClassname}}) then { + if ((_xCount < _xFullMagazineCount) && {_xCount > 0} && {(!_xLoaded) || {[_player, _xClassname] call CBA_fnc_canAddItem}}) then { private _index = _unitMagazines find _xClassname; if (_index == -1) then { _unitMagazines pushBack _xClassname; diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf index cd9df9b2a9..b776d4bcdb 100644 --- a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -39,7 +39,7 @@ private _startingAmmoCounts = []; if (_xClassname == _magazineClassname && {_xCount != _fullMagazineCount && {_xCount > 0}}) then { if (_xLoaded) then { //Try to Remove from weapon and add to inventory, otherwise ignore - if (_player canAdd _magazineClassname) then { + if ([_player, _magazineClassname] call CBA_fnc_canAddItem) then { switch (_xType) do { case (1): {_player removePrimaryWeaponItem _magazineClassname}; case (2): {_player removeHandgunItem _magazineClassname}; From 13bce729ee9b0e222f6d3bf2ca28f2a82d3843b0 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Sat, 27 Feb 2021 11:36:10 -0500 Subject: [PATCH 082/335] add icon for quickmount change seat (#8126) alpha-inverted version of "\a3\ui_f\data\GUI\Cfg\Hints\Seats_ca.paa" --- addons/quickmount/CfgVehicles.hpp | 1 + addons/quickmount/UI/Seats_ca.paa | Bin 0 -> 22016 bytes 2 files changed, 1 insertion(+) create mode 100644 addons/quickmount/UI/Seats_ca.paa diff --git a/addons/quickmount/CfgVehicles.hpp b/addons/quickmount/CfgVehicles.hpp index f58cb5df33..a52f17cf5a 100644 --- a/addons/quickmount/CfgVehicles.hpp +++ b/addons/quickmount/CfgVehicles.hpp @@ -50,6 +50,7 @@ class CfgVehicles { class ACE_SelfActions { \ class GVAR(ChangeSeat) { \ displayName = CSTRING(ChangeSeat); \ + icon = QPATHTOF(UI\Seats_ca.paa); \ condition = QUOTE(call DFUNC(canShowFreeSeats)); \ insertChildren = QUOTE(call DFUNC(addFreeSeatsActions)); \ }; \ diff --git a/addons/quickmount/UI/Seats_ca.paa b/addons/quickmount/UI/Seats_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..8e4678d5ca8f89c29510267bedda6973be439455 GIT binary patch literal 22016 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 Ui<6&rU9;f)`BghWEf7=sKVG0bNB{r; literal 0 HcmV?d00001 From 5a36d1a7710f82f891c3cd110ff59e08823105ba Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 27 Feb 2021 18:04:43 +0100 Subject: [PATCH 083/335] Advanced Throwing - Add object variable to disable pick up of attached throwables (#8031) * Advanced Throwing - Add object variable to disable pick up Use: `OBJECT setVariable ["ace_advanced_throwing_disablePickUp", true]` * Documentation - Add Advanced Throwing Framework * Update addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf * Update advanced-throwing-framework.md Co-authored-by: PabstMirror --- .../functions/fnc_renderPickUpInteraction.sqf | 2 +- .../framework/advanced-throwing-framework.md | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 docs/wiki/framework/advanced-throwing-framework.md diff --git a/addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf b/addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf index 5b7d2c9f0b..920f4d1781 100644 --- a/addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf +++ b/addons/advanced_throwing/functions/fnc_renderPickUpInteraction.sqf @@ -31,7 +31,7 @@ _nearThrowables append (ACE_player nearObjects ["ACE_Chemlight_IR_Dummy", PICK_UP_DISTANCE]); { - if (!(_x in _throwablesHelped) && + if (!(_x in _throwablesHelped) && {!((attachedTo _x) getVariable [QGVAR(disablePickUp), false])} && {!(_x isKindOf "SmokeShellArty")} && {!(_x isKindOf "G_40mm_Smoke")} && // All smokes inherit from "GrenadeHand" >> "SmokeShell" {GVAR(enablePickUpAttached) || {!GVAR(enablePickUpAttached) && {isNull (attachedTo _x)}}} ) then { diff --git a/docs/wiki/framework/advanced-throwing-framework.md b/docs/wiki/framework/advanced-throwing-framework.md new file mode 100644 index 0000000000..925b9c9779 --- /dev/null +++ b/docs/wiki/framework/advanced-throwing-framework.md @@ -0,0 +1,20 @@ +--- +layout: wiki +title: Advanced Throwing Framework +description: Explains how to interact with the Advanced Throwing API. +group: framework +parent: wiki +mod: ace +version: + major: 3 + minor: 7 + patch: 0 +--- + +## 1. Disabling pick up of ammo attached to an object + +Pick-up interaction can be disabled for ammo (e.g. chemlights) attached to an object. + +```js +OBJECT setVariable ["ace_advanced_throwing_disablePickUp", true, true]; +``` From 75f7ed75329e7f842a79087570ffb9cfba5dc3ff Mon Sep 17 00:00:00 2001 From: Neviothr Date: Sat, 27 Feb 2021 19:05:05 +0200 Subject: [PATCH 084/335] Utilize isNotEqualTo (#7929) * Utilize isNotEqualTo * undo changes to some files * redo some changes, fix based on @Vdauphin 's comment * fix validator issues Co-authored-by: PabstMirror --- .../functions/fnc_readAmmoDataFromConfig.sqf | 8 ++++---- addons/advanced_throwing/functions/fnc_drawArc.sqf | 2 +- addons/arsenal/functions/fnc_addListBoxItem.sqf | 4 ++-- addons/arsenal/functions/fnc_addSort.sqf | 4 ++-- .../arsenal/functions/fnc_buttonLoadoutsSave.sqf | 2 +- addons/arsenal/functions/fnc_compileSorts.sqf | 4 ++-- addons/arsenal/functions/fnc_fillLeftPanel.sqf | 2 +- addons/arsenal/functions/fnc_fillRightPanel.sqf | 10 +++++----- addons/arsenal/functions/fnc_handleStats.sqf | 2 +- addons/arsenal/functions/fnc_onArsenalOpen.sqf | 12 ++++++------ addons/arsenal/functions/fnc_onKeyDown.sqf | 4 ++-- addons/arsenal/functions/fnc_onSelChangedLeft.sqf | 6 +++--- .../arsenal/functions/fnc_removeVirtualItems.sqf | 4 ++-- addons/arsenal/functions/fnc_sortPanel.sqf | 4 ++-- addons/arsenal/functions/fnc_sortStatement_mod.sqf | 4 ++-- addons/artillerytables/dev/checkConfigs.sqf | 2 +- .../functions/fnc_calculate_truing_drop.sqf | 2 +- addons/attach/functions/fnc_attach.sqf | 2 +- addons/ballistics/ACE_Arsenal_Stats.hpp | 2 +- addons/captives/functions/fnc_handleGetIn.sqf | 2 +- addons/common/XEH_postInit.sqf | 2 +- .../fnc_cbaSettings_transferUserSettings.sqf | 2 +- addons/common/functions/fnc_checkFiles.sqf | 4 ++-- addons/common/functions/fnc_claim.sqf | 2 +- addons/common/functions/fnc_claimSafeServer.sqf | 2 +- addons/common/functions/fnc_findUnloadPosition.sqf | 6 +++--- addons/common/functions/fnc_getAwakeAnim.sqf | 2 +- .../functions/fnc_getDefinedVariableDefault.sqf | 2 +- addons/common/functions/fnc_getMGRSdata.sqf | 2 +- .../functions/fnc_registerItemReplacement.sqf | 2 +- addons/common/functions/fnc_runTests.sqf | 4 ++-- addons/common/functions/fnc_setVariablePublic.sqf | 2 +- .../common/functions/fnc_statusEffect_addType.sqf | 2 +- addons/cookoff/functions/fnc_cookOff.sqf | 6 +++--- addons/csw/functions/fnc_assemble_pickupWeapon.sqf | 4 ++-- .../functions/fnc_reload_handleRemoveTurretMag.sqf | 2 +- addons/disarming/functions/fnc_disarmDropItems.sqf | 6 +++--- addons/dragging/functions/fnc_carryObject.sqf | 2 +- addons/dragging/functions/fnc_dragObject.sqf | 2 +- addons/explosives/functions/fnc_interactEH.sqf | 2 +- addons/explosives/functions/fnc_setupExplosive.sqf | 4 ++-- addons/fastroping/functions/fnc_canCutRopes.sqf | 2 +- addons/fastroping/functions/fnc_canFastRope.sqf | 2 +- addons/fastroping/functions/fnc_cutRopes.sqf | 2 +- addons/fastroping/functions/fnc_deployAI.sqf | 2 +- .../fastroping/functions/fnc_deployAIWaypoint.sqf | 2 +- addons/fastroping/functions/fnc_unequipFRIES.sqf | 2 +- addons/fcs/dev/test_debugConfigs.sqf | 2 +- addons/fcs/functions/fnc_firedEH.sqf | 2 +- addons/finger/functions/fnc_keyPress.sqf | 2 +- addons/frag/functions/fnc_dev_trackTrace.sqf | 2 +- addons/frag/functions/fnc_frago.sqf | 2 +- addons/grenades/functions/fnc_throwGrenade.sqf | 2 +- addons/gunbag/XEH_preInit.sqf | 4 ++-- addons/gunbag/functions/fnc_canInteract.sqf | 4 ++-- .../functions/fnc_updatePlayerVehAttenuation.sqf | 2 +- addons/hellfire/functions/fnc_attackProfile.sqf | 4 ++-- .../functions/fnc_collectActiveActionTree.sqf | 4 ++-- addons/interact_menu/functions/fnc_isSubPath.sqf | 2 +- addons/interact_menu/functions/fnc_render.sqf | 2 +- addons/interact_menu/functions/fnc_renderMenu.sqf | 2 +- addons/interaction/ACE_ZeusActions.hpp | 8 ++++---- .../interaction/functions/fnc_canPullOutBody.sqf | 2 +- addons/interaction/functions/fnc_pullOutBody.sqf | 2 +- addons/javelin/functions/fnc_getTarget.sqf | 4 ++-- .../functions/fnc_handleLaserTargetCreation.sqf | 2 +- addons/laser/functions/fnc_shootRay.sqf | 2 +- addons/map/XEH_postInitClient.sqf | 2 +- addons/map/functions/fnc_determineMapLight.sqf | 4 ++-- addons/map/functions/fnc_flashlightGlow.sqf | 2 +- .../maptools/functions/fnc_drawLinesOnRoamer.sqf | 2 +- addons/markers/functions/fnc_initInsertMarker.sqf | 8 ++++---- addons/markers/functions/fnc_onMouseButtonDown.sqf | 2 +- addons/markers/functions/fnc_placeMarker.sqf | 4 ++-- addons/medical/dev/reportSettings.sqf | 2 +- addons/medical_ai/functions/fnc_wasRequested.sqf | 2 +- .../functions/fnc_parseConfigForInjuries.sqf | 2 +- .../medical_treatment/functions/fnc_canStitch.sqf | 2 +- .../functions/fnc_onMedicationUsage.sqf | 2 +- .../functions/fnc_handleUnitVitals.sqf | 4 ++-- addons/microdagr/functions/fnc_updateDisplay.sqf | 8 ++++---- addons/minedetector/functions/fnc_hasDetector.sqf | 2 +- .../functions/fnc_attackProfile_WIRE.sqf | 2 +- .../functions/fnc_doSeekerSearch.sqf | 2 +- .../missileguidance/functions/fnc_guidancePFH.sqf | 2 +- .../functions/fnc_seekerType_SACLOS.sqf | 2 +- addons/nametags/functions/fnc_initIsSpeaking.sqf | 2 +- addons/nametags/functions/fnc_onDraw3d.sqf | 2 +- addons/nightvision/functions/fnc_pfeh.sqf | 4 ++-- addons/nlaw/functions/fnc_attackProfile.sqf | 2 +- addons/nlaw/functions/fnc_seeker.sqf | 4 ++-- .../quickmount/functions/fnc_canShowFreeSeats.sqf | 2 +- addons/quickmount/functions/fnc_getInNearest.sqf | 4 ++-- addons/rearm/functions/fnc_addMagazineToSupply.sqf | 2 +- addons/rearm/functions/fnc_addRearmActions.sqf | 4 ++-- .../rearm/functions/fnc_getNeedRearmMagazines.sqf | 2 +- .../functions/fnc_removeMagazineFromSupply.sqf | 2 +- .../rearm/functions/fnc_setTurretMagazineAmmo.sqf | 2 +- addons/refuel/Cfg3DEN.hpp | 2 +- .../refuel/functions/fnc_startNozzleInHandsPFH.sqf | 6 +++--- addons/repair/functions/fnc_addRepairActions.sqf | 2 +- addons/repair/functions/fnc_canRepair.sqf | 2 +- addons/repair/functions/fnc_repair.sqf | 2 +- addons/safemode/functions/fnc_setWeaponSafety.sqf | 2 +- addons/scopes/ACE_Arsenal_Stats.hpp | 2 +- addons/scopes/functions/fnc_inventoryCheck.sqf | 14 +++++++------- addons/spectator/functions/fnc_cam_toggleSlow.sqf | 2 +- addons/spectator/functions/fnc_ui_draw3D.sqf | 4 ++-- .../functions/fnc_ui_updateListEntities.sqf | 4 ++-- addons/tagging/functions/fnc_compileConfigTags.sqf | 4 ++-- addons/tagging/functions/fnc_quickTag.sqf | 2 +- addons/tagging/functions/fnc_tag.sqf | 2 +- addons/zeus/functions/fnc_moduleSuicideBomber.sqf | 2 +- .../zeus/functions/fnc_moduleToggleFlashlight.sqf | 6 +++--- addons/zeus/functions/fnc_moduleToggleNvg.sqf | 8 ++++---- addons/zeus/functions/fnc_ui_toggleNvg.sqf | 2 +- .../functions/fnc_exportConfig.sqf | 4 ++-- 117 files changed, 186 insertions(+), 186 deletions(-) diff --git a/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf b/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf index 13b4692452..845045e1cb 100644 --- a/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf +++ b/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf @@ -60,8 +60,8 @@ private _barrelLengthTable = getArray(_ammoConfig >> "ACE_barrelLengths"); //Handle subsonic ammo that would have a huge muzzle velocity shift (when ballistic configs not explicitly defined) private _typicalSpeed = getNumber (_ammoConfig >> "typicalSpeed"); if ((_typicalSpeed > 0) && {_typicalSpeed < 360}) then { - private _inheritedBarrelConfig = (!(_muzzleVelocityTable isEqualTo [])) && {(configProperties [_ammoConfig, "(configName _x) == 'ACE_muzzleVelocities'", false]) isEqualTo []}; - private _inheritedTempConfig = (!(_ammoTempMuzzleVelocityShifts isEqualTo [])) && {(configProperties [_ammoConfig, "(configName _x) == 'ACE_ammoTempMuzzleVelocityShifts'", false]) isEqualTo []}; + private _inheritedBarrelConfig = (_muzzleVelocityTable isNotEqualTo []) && {(configProperties [_ammoConfig, "(configName _x) == 'ACE_muzzleVelocities'", false]) isEqualTo []}; + private _inheritedTempConfig = (_ammoTempMuzzleVelocityShifts isNotEqualTo []) && {(configProperties [_ammoConfig, "(configName _x) == 'ACE_ammoTempMuzzleVelocityShifts'", false]) isEqualTo []}; TRACE_3("subsonic",_typicalSpeed,_inheritedBarrelConfig,_inheritedTempConfig); if (_inheritedBarrelConfig || _inheritedTempConfig) then { private _parentConfig = inheritsFrom _ammoConfig; @@ -73,7 +73,7 @@ if ((_typicalSpeed > 0) && {_typicalSpeed < 360}) then { }; private _linearMuliplier = _typicalSpeed / _parentSpeed; if (_inheritedBarrelConfig) then { - if (!((configProperties [_parentConfig, "(configName _x) == 'ACE_muzzleVelocities'", false]) isEqualTo [])) then { + if ((configProperties [_parentConfig, "(configName _x) == 'ACE_muzzleVelocities'", false]) isNotEqualTo []) then { TRACE_2("Parent Has Defined Barrel MV",_linearMuliplier,_muzzleVelocityTable); { _muzzleVelocityTable set [_forEachIndex, (_x * _linearMuliplier)]; } forEach _muzzleVelocityTable; } else { @@ -82,7 +82,7 @@ if ((_typicalSpeed > 0) && {_typicalSpeed < 360}) then { }; }; if (_inheritedTempConfig) then { - if (!((configProperties [_parentConfig, "(configName _x) == 'ACE_ammoTempMuzzleVelocityShifts'", false]) isEqualTo [])) then { + if ((configProperties [_parentConfig, "(configName _x) == 'ACE_ammoTempMuzzleVelocityShifts'", false]) isNotEqualTo []) then { TRACE_2("Parent Has Defined Ammo Temp Shifts",_linearMuliplier,_muzzleVelocityTable); { _ammoTempMuzzleVelocityShifts set [_forEachIndex, (_x * _linearMuliplier)]; } forEach _ammoTempMuzzleVelocityShifts; } else { diff --git a/addons/advanced_throwing/functions/fnc_drawArc.sqf b/addons/advanced_throwing/functions/fnc_drawArc.sqf index bd7bc7a661..0782c4b46c 100644 --- a/addons/advanced_throwing/functions/fnc_drawArc.sqf +++ b/addons/advanced_throwing/functions/fnc_drawArc.sqf @@ -53,7 +53,7 @@ for "_i" from 0.05 to 1.45 step 0.1 do { if (lineIntersects [_prevTrajASL, _newTrajASL]) then { // Checks the "VIEW" LOD _cross = 2; // 2: View LOD Block (Red) } else { - if !((lineIntersectsSurfaces [_prevTrajASL, _newTrajASL, _activeThrowable, ACE_player, true, 1, "GEOM", "FIRE"]) isEqualTo []) then { + if ((lineIntersectsSurfaces [_prevTrajASL, _newTrajASL, _activeThrowable, ACE_player, true, 1, "GEOM", "FIRE"]) isNotEqualTo []) then { _cross = 3; // 3: GEOM/FIRE LOD Block (Yellow) - pass a3 bulding glass, but blocked on some CUP glass }; }; diff --git a/addons/arsenal/functions/fnc_addListBoxItem.sqf b/addons/arsenal/functions/fnc_addListBoxItem.sqf index 35cde798ee..53bf321baf 100644 --- a/addons/arsenal/functions/fnc_addListBoxItem.sqf +++ b/addons/arsenal/functions/fnc_addListBoxItem.sqf @@ -32,9 +32,9 @@ if (_cachedItemInfo isEqualTo []) then {//Not in cache. So get info and put into //get name of DLC private _dlcName = ""; private _addons = configsourceaddonlist _configPath; - if !(_addons isEqualTo []) then { + if (_addons isNotEqualTo []) then { private _mods = configsourcemodlist (configfile >> "CfgPatches" >> _addons select 0); - if !(_mods isEqualTo []) then { + if (_mods isNotEqualTo []) then { _dlcName = _mods select 0; }; }; diff --git a/addons/arsenal/functions/fnc_addSort.sqf b/addons/arsenal/functions/fnc_addSort.sqf index 5ef5a8fc90..6d88713c10 100644 --- a/addons/arsenal/functions/fnc_addSort.sqf +++ b/addons/arsenal/functions/fnc_addSort.sqf @@ -61,11 +61,11 @@ private _fnc_addToTabs = { _finalArray = ["", _displayName, _statement, _condition]; -if !(_leftTabs isEqualTo []) then { +if (_leftTabs isNotEqualTo []) then { [GVAR(sortListLeftPanel), _leftTabs, "L", 0] call _fnc_addToTabs; }; -if !(_rightTabs isEqualTo []) then { +if (_rightTabs isNotEqualTo []) then { [GVAR(sortListRightPanel), _rightTabs, "R", 1] call _fnc_addToTabs; }; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf index 17c89b5f36..0827ec2c31 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf @@ -124,7 +124,7 @@ switch (GVAR(currentLoadoutsTab)) do { }; }; - if (GVAR(shiftState) && {is3DEN} && {!(_loadoutName isEqualTo "")} && {_cursSelRow != -1} && {!(_loadoutIndex isEqualto -1)}) exitwith { + if (GVAR(shiftState) && {is3DEN} && {_loadoutName isNotEqualTo ""} && {_cursSelRow != -1} && {_loadoutIndex isNotEqualTo -1}) exitwith { private _defaultLoadoutsSearch = GVAR(defaultLoadoutsList) findIf {(_x select 0) == _loadoutName}; if (_defaultLoadoutsSearch isEqualto -1) then { GVAR(defaultLoadoutsList) pushBack [_loadoutName, _curSelLoadout]; diff --git a/addons/arsenal/functions/fnc_compileSorts.sqf b/addons/arsenal/functions/fnc_compileSorts.sqf index e810f64a9b..a5a3e5693a 100644 --- a/addons/arsenal/functions/fnc_compileSorts.sqf +++ b/addons/arsenal/functions/fnc_compileSorts.sqf @@ -77,11 +77,11 @@ private _configEntries = "(getNumber (_x >> 'scope')) == 2" configClasses (confi _finalArray = ["", _displayName, _statement, _condition]; - if !(_leftTabsList isEqualTo []) then { + if (_leftTabsList isNotEqualTo []) then { [_sortListLeftPanel, _leftTabsList, "L"] call _fnc_addToTabs; }; - if !(_rightTabsList isEqualTo []) then { + if (_rightTabsList isNotEqualTo []) then { [_sortListRightPanel, _rightTabsList, "R"] call _fnc_addToTabs; }; } foreach _configEntries; diff --git a/addons/arsenal/functions/fnc_fillLeftPanel.sqf b/addons/arsenal/functions/fnc_fillLeftPanel.sqf index 37cbd4e431..179b6a2ed3 100644 --- a/addons/arsenal/functions/fnc_fillLeftPanel.sqf +++ b/addons/arsenal/functions/fnc_fillLeftPanel.sqf @@ -199,7 +199,7 @@ private _itemsToCheck = ((GVAR(currentItems) select [0,15]) + [GVAR(currentFace) for "_lbIndex" from 0 to (lbSize _ctrlPanel - 1) do { private _currentData = _ctrlPanel lbData _lbIndex; - if (!(_currentData isEqualTo "") && {tolower _currentData in _itemsToCheck}) exitWith { + if ((_currentData isNotEqualTo "") && {tolower _currentData in _itemsToCheck}) exitWith { _ctrlPanel lbSetCurSel _lbIndex; }; }; diff --git a/addons/arsenal/functions/fnc_fillRightPanel.sqf b/addons/arsenal/functions/fnc_fillRightPanel.sqf index b4c7e2695a..f9326c6c97 100644 --- a/addons/arsenal/functions/fnc_fillRightPanel.sqf +++ b/addons/arsenal/functions/fnc_fillRightPanel.sqf @@ -282,11 +282,11 @@ switch (_ctrlIDC) do { }; } forEach GVAR(customRightPanelButtons); }; - + { ["CfgWeapons", _x, false] call _fnc_fill_right_Container; } forEach ((GVAR(virtualItems) select 17) select {!((toLower _x) in _blockItems)}); - + { ["CfgWeapons", _x, false, true] call _fnc_fill_right_Container; } foreach ((GVAR(virtualItems) select 18) select {!((toLower _x) in _blockItems)}); @@ -297,12 +297,12 @@ switch (_ctrlIDC) do { ["CfgGlasses", _x, false, true] call _fnc_fill_right_Container; } foreach ((GVAR(virtualItems) select 24) select {!((toLower _x) in _blockItems)}); }; - + default { private _index = [RIGHT_PANEL_CUSTOM_BUTTONS] find _ctrlIDC; if (_index != -1) then { private _data = GVAR(customRightPanelButtons) param [_index]; - + if (!isNil "_data") then { private _items = _data select 0; { @@ -366,7 +366,7 @@ private _sortRightCtrl = _display displayCtrl IDC_sortRightTab; [_sortRightCtrl] call FUNC(sortPanel); // Select current data if not in a container -if !(_itemsToCheck isEqualTo []) then { +if (_itemsToCheck isNotEqualTo []) then { for "_lbIndex" from 0 to (lbSize _ctrlPanel - 1) do { private _currentData = _ctrlPanel lbData _lbIndex; diff --git a/addons/arsenal/functions/fnc_handleStats.sqf b/addons/arsenal/functions/fnc_handleStats.sqf index 0d071740b7..16cdc1c7e1 100644 --- a/addons/arsenal/functions/fnc_handleStats.sqf +++ b/addons/arsenal/functions/fnc_handleStats.sqf @@ -64,7 +64,7 @@ if (!isNil "_itemCfg") then { // Handle titles, bars and text _statsList = _statsList select [0, 5]; - if !(_statsList isEqualTo []) then { + if (_statsList isNotEqualTo []) then { { _x params ["_ID", "_configEntry", "_title", "_bools", "_statements"]; _bools params ["_showBar", "_showText"]; diff --git a/addons/arsenal/functions/fnc_onArsenalOpen.sqf b/addons/arsenal/functions/fnc_onArsenalOpen.sqf index b59d1b28a9..84ae2b28cb 100644 --- a/addons/arsenal/functions/fnc_onArsenalOpen.sqf +++ b/addons/arsenal/functions/fnc_onArsenalOpen.sqf @@ -67,15 +67,15 @@ for "_index" from 0 to 10 do { case 0: { private _array = LIST_DEFAULTS select _index; - if !((_array select 0) isEqualTo "") then { + if ((_array select 0) isNotEqualTo "") then { ((GVAR(virtualItems) select _index) select 0) pushBackUnique (_array select 0); }; - if !((_array select 1) isEqualTo "") then { + if ((_array select 1) isNotEqualTo "") then { ((GVAR(virtualItems) select _index) select 1) pushBackUnique (_array select 1); }; - if !((_array select 2) isEqualTo "") then { + if ((_array select 2) isNotEqualTo "") then { ((GVAR(virtualItems) select _index) select 2) pushBackUnique (_array select 2); }; }; @@ -96,7 +96,7 @@ for "_index" from 0 to 10 do { } forEach _accsArray; { - if !(_x isEqualTo []) then { + if (_x isNotEqualTo []) then { if (_x select 0 != "") then { (GVAR(virtualItems) select 2) pushBackUnique (_x select 0); @@ -116,8 +116,8 @@ for "_index" from 0 to 10 do { // The rest default { - private _array = (LIST_DEFAULTS select _index) select {!(_x isEqualTo "")}; - if !(_array isEqualTo []) then { + private _array = (LIST_DEFAULTS select _index) select {_x isNotEqualTo ""}; + if (_array isNotEqualTo []) then { {(GVAR(virtualItems) select _index) pushBackUnique _x} forEach _array; }; }; diff --git a/addons/arsenal/functions/fnc_onKeyDown.sqf b/addons/arsenal/functions/fnc_onKeyDown.sqf index 0c265873eb..2bd8e0ac7b 100644 --- a/addons/arsenal/functions/fnc_onKeyDown.sqf +++ b/addons/arsenal/functions/fnc_onKeyDown.sqf @@ -25,7 +25,7 @@ GVAR(shiftState) = _shiftState; private _return = true; private _loadoutsDisplay = findDisplay IDD_loadouts_display; -if !(_loadoutsDisplay isEqualTo displayNull) then { +if (_loadoutsDisplay isNotEqualTo displayNull) then { if !(GVAR(loadoutsSearchbarFocus)) then { switch true do { // Close button @@ -171,7 +171,7 @@ if !(_loadoutsDisplay isEqualTo displayNull) then { case (_keyPressed == DIK_RETURN): { if (GVAR(leftSearchbarFocus)) then { [_display, _display displayCtrl IDC_leftSearchbar] call FUNC(handleSearchBar); - }; + }; if (GVAR(rightSearchbarFocus)) then { [_display, _display displayCtrl IDC_rightSearchbar] call FUNC(handleSearchBar); }; diff --git a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf index 1e6c851f0f..3f1ca14b87 100644 --- a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf @@ -60,7 +60,7 @@ switch (GVAR(currentLeftPanel)) do { private _cfgMags = configFile >> "CfgMagazines"; private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; GVAR(center) addWeapon _item; - if !(_compatibleMags isEqualTo []) then { + if (_compatibleMags isNotEqualTo []) then { GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; }; @@ -102,7 +102,7 @@ switch (GVAR(currentLeftPanel)) do { private _cfgMags = configFile >> "CfgMagazines"; private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; GVAR(center) addWeapon _item; - if !(_compatibleMags isEqualTo []) then { + if (_compatibleMags isNotEqualTo []) then { GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; }; @@ -143,7 +143,7 @@ switch (GVAR(currentLeftPanel)) do { private _cfgMags = configFile >> "CfgMagazines"; private _compatibleMags = ([_item, true] call CBA_fnc_compatibleMagazines) select { getNumber (_cfgMags >> _x >> "scope") == 2 }; GVAR(center) addWeapon _item; - if !(_compatibleMags isEqualTo []) then { + if (_compatibleMags isNotEqualTo []) then { GVAR(center) addWeaponItem [_item, [_compatibleMags select 0]]; }; diff --git a/addons/arsenal/functions/fnc_removeVirtualItems.sqf b/addons/arsenal/functions/fnc_removeVirtualItems.sqf index d96d16e3d6..ad9ff7f89e 100644 --- a/addons/arsenal/functions/fnc_removeVirtualItems.sqf +++ b/addons/arsenal/functions/fnc_removeVirtualItems.sqf @@ -68,9 +68,9 @@ if (_items isEqualType true) then { private _itemCount = { if (_x isEqualTo (_cargo select 0) || {_x isEqualTo (_cargo select 1)}) then { - !(_x isEqualTo [[],[],[]] || {_x isEqualTo [[],[],[],[]]}) + (_x isNotEqualTo [[],[],[]] || {_x isEqualTo [[],[],[],[]]}) } else { - !(_x isEqualTo []) + (_x isNotEqualTo []) }; } count _cargo; diff --git a/addons/arsenal/functions/fnc_sortPanel.sqf b/addons/arsenal/functions/fnc_sortPanel.sqf index e840b11c07..8ed3ec0fc7 100644 --- a/addons/arsenal/functions/fnc_sortPanel.sqf +++ b/addons/arsenal/functions/fnc_sortPanel.sqf @@ -134,7 +134,7 @@ _for do { if (_right) then { _panel lnbSetText [[_i, 1], format ["%1%2", _value, _panel lnbText [_i, 1]]]; } else { - if !(_item isEqualTo "") then { + if (_item isNotEqualTo "") then { _panel lbSetText [_i, format ["%1%2", _value, _panel lbText _i]]; }; }; @@ -159,7 +159,7 @@ if (_right) then { if (_data == _selected) then {_panel lbSetCurSel _i}; }; private _name = getText (_cfgClass >> _data >> "displayName"); - if !(_name isEqualTo "") then { + if (_name isNotEqualTo "") then { _panel lbSetText [_i, _name]; }; }; diff --git a/addons/arsenal/functions/fnc_sortStatement_mod.sqf b/addons/arsenal/functions/fnc_sortStatement_mod.sqf index 3fabb7f4ce..9a6e12c2d6 100644 --- a/addons/arsenal/functions/fnc_sortStatement_mod.sqf +++ b/addons/arsenal/functions/fnc_sortStatement_mod.sqf @@ -16,9 +16,9 @@ params ["_config"]; private _dlc = ""; private _addons = configSourceAddonList _config; -if !(_addons isEqualTo []) then { +if (_addons isNotEqualTo []) then { private _mods = configSourceModList (configfile >> "CfgPatches" >> _addons select 0); - if !(_mods isEqualTo []) then { + if (_mods isNotEqualTo []) then { _dlc = _mods select 0; }; }; diff --git a/addons/artillerytables/dev/checkConfigs.sqf b/addons/artillerytables/dev/checkConfigs.sqf index 91627edbf6..533aecf656 100644 --- a/addons/artillerytables/dev/checkConfigs.sqf +++ b/addons/artillerytables/dev/checkConfigs.sqf @@ -7,7 +7,7 @@ private _fnc_showPropertyDefined = { params ["_configBase", "_configProperty"]; private _customAll = configProperties [_configBase, 'isClass _x && {isNumber (_x >> _configProperty)}', true]; - private _customExplicit = _customAll select {!([] isEqualTo configProperties [_x, 'configName _x == _configProperty', false])}; + private _customExplicit = _customAll select {[] isNotEqualTo configProperties [_x, 'configName _x == _configProperty', false]}; diag_log text format ["%1 with custom %2: %3 Explicit, %4 Total]", configName _configBase, _configProperty, count _customExplicit, count _customAll]; diag_log text format [" - Defined: %1", _customExplicit apply {configName _x}]; diag_log text format [" - Inherited: %1", _customAll apply {[configName _x, getNumber (_x >> _configProperty)]}]; diff --git a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf index be6ebd1eda..e3dfe5b6a4 100644 --- a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf +++ b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf @@ -60,7 +60,7 @@ if (_parseInput) then { _subsonicDrop = _transonicDrop max _subsonicDrop; }; -if ((GVAR(truingDropDropData) select 0) == 0 || {!([_transonicRange, _subsonicRange] isEqualTo GVAR(truingDropRangeData))}) then { +if ((GVAR(truingDropDropData) select 0) == 0 || {[_transonicRange, _subsonicRange] isNotEqualTo GVAR(truingDropRangeData)}) then { if (isNil QGVAR(targetSolutionInput)) then { call FUNC(calculate_target_solution); }; diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index 4d43cf47e9..0a13ed9afb 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -74,7 +74,7 @@ if (_unit == _attachToVehicle) then { //Self Attachment _virtualPosASL = _virtualPosASL vectorAdd ((positionCameraToWorld [0.3,0,0]) vectorDiff (positionCameraToWorld [0,0,0])); }; private _virtualPos = _virtualPosASL call EFUNC(common,ASLToPosition); - private _lineInterection = !((lineIntersectsSurfaces [eyePos ACE_player, _virtualPosASL, ACE_player]) isEqualTo []); + private _lineInterection = ((lineIntersectsSurfaces [eyePos ACE_player, _virtualPosASL, ACE_player]) isNotEqualTo []); //Don't allow placing in a bad position: if (_lineInterection && {GVAR(placeAction) == PLACE_APPROVE}) then {GVAR(placeAction) = PLACE_WAITING;}; diff --git a/addons/ballistics/ACE_Arsenal_Stats.hpp b/addons/ballistics/ACE_Arsenal_Stats.hpp index 34a8b561e5..9e4982656b 100644 --- a/addons/ballistics/ACE_Arsenal_Stats.hpp +++ b/addons/ballistics/ACE_Arsenal_Stats.hpp @@ -34,7 +34,7 @@ class EGVAR(arsenal,stats) { displayName= CSTRING(statBallisticCoef); showText= 1; textStatement = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); private _ballisticCoef = getArray (_ammoCfg >> _stat select 1); _ballisticCoef sort false; format [ARR_4('%1 G%2 (%3)', _ballisticCoef select 0 ,getNumber (_ammoCfg >> _stat select 0), getText (_ammoCfg >> _stat select 2))]); - condition = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); !(getArray (_ammoCfg >> _stat select 1) isEqualTo [])); + condition = QUOTE(params[ARR_2('_stat', '_config')]; private _ammoCfg = (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo'))); (getArray (_ammoCfg >> _stat select 1) isNotEqualTo [])); tabs[] ={{}, {4}}; }; class ACE_bulletMass: statBase { diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf index 96a32031af..3fc2db1711 100644 --- a/addons/captives/functions/fnc_handleGetIn.sqf +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -36,7 +36,7 @@ if (local _unit) then { _x params ["_xUnit", "", "", "_xTurretPath"]; if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; } forEach (fullCrew (vehicle _unit)); - if (!(_turretPath isEqualTo [])) then { + if (_turretPath isNotEqualTo []) then { TRACE_1("Setting FFV Handcuffed Animation",_turretPath); [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 181b7099c6..2af7d0c601 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -253,7 +253,7 @@ enableCamShake true; //FUNC(showHud) needs to be refreshed if it was set during mission init ["ace_infoDisplayChanged", { GVAR(showHudHash) params ["", "", "_masks"]; - if !(_masks isEqualTo []) then { + if (_masks isNotEqualTo []) then { [] call FUNC(showHud); }; }] call CBA_fnc_addEventHandler; diff --git a/addons/common/functions/fnc_cbaSettings_transferUserSettings.sqf b/addons/common/functions/fnc_cbaSettings_transferUserSettings.sqf index 703e0263dc..869668cc21 100644 --- a/addons/common/functions/fnc_cbaSettings_transferUserSettings.sqf +++ b/addons/common/functions/fnc_cbaSettings_transferUserSettings.sqf @@ -31,7 +31,7 @@ private _aceSettings = configProperties [configFile >> "ACE_Settings", "isClass if (!isNil "_profileVar") then { private _currentValue = [_settingName, "client"] call CBA_settings_fnc_get; - if (_isClientSettable && {!(_currentValue isEqualTo _profileVar)}) then { + if (_isClientSettable && {_currentValue isNotEqualTo _profileVar}) then { // CBA_settings_fnc_set will do type checking for the old profile var private _ret = [_settingName, _profileVar, 0, "client", true] call CBA_settings_fnc_set; INFO_3("Transfering setting [%1: %2] returned %3", _settingName, _profileVar, _ret); diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 3b6a02f33f..463ee20f0b 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -57,7 +57,7 @@ private _oldCompats = []; }; false } count _addons; -if (!(_oldCompats isEqualTo [])) then { +if (_oldCompats isNotEqualTo []) then { [{ // Lasts for ~10 seconds ERROR_WITH_TITLE_1("The following ACE compatiblity PBOs are outdated", "%1", _this); @@ -138,7 +138,7 @@ if (isMultiplayer) then { }; _addons = _addons - GVAR(ServerAddons); - if !(_addons isEqualTo []) then { + if (_addons isNotEqualTo []) then { private _errorMsg = format ["Client/Server Addon Mismatch. Client has extra addons: %1.",_addons]; ERROR(_errorMsg); diff --git a/addons/common/functions/fnc_claim.sqf b/addons/common/functions/fnc_claim.sqf index f29f4622a0..130bbac79b 100644 --- a/addons/common/functions/fnc_claim.sqf +++ b/addons/common/functions/fnc_claim.sqf @@ -30,7 +30,7 @@ _target setVariable [QGVAR(owner), _unit, true]; // lock target object if (_lockTarget) then { - private _canBeDisassembled = !([] isEqualTo getArray (configOf _target >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; + private _canBeDisassembled = ([] isNotEqualTo getArray (configOf _target >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; if (!isNull _unit) then { [QGVAR(lockVehicle), _target, _target] call CBA_fnc_targetEvent; if (_canBeDisassembled) then { diff --git a/addons/common/functions/fnc_claimSafeServer.sqf b/addons/common/functions/fnc_claimSafeServer.sqf index 1cf1d1385e..e6520aad87 100644 --- a/addons/common/functions/fnc_claimSafeServer.sqf +++ b/addons/common/functions/fnc_claimSafeServer.sqf @@ -36,7 +36,7 @@ _target setVariable [QGVAR(owner), _unit, true]; // lock target object if (_lockTarget) then { - private _canBeDisassembled = !([] isEqualTo getArray (configOf _target >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; + private _canBeDisassembled = ([] isNotEqualTo getArray (configOf _target >> "assembleInfo" >> "dissasembleTo")) && { !([false, true] select (_target getVariable [QEGVAR(csw,assemblyMode), 0])) }; if (!isNull _unit) then { [QGVAR(lockVehicle), _target, _target] call CBA_fnc_targetEvent; if (_canBeDisassembled) then { diff --git a/addons/common/functions/fnc_findUnloadPosition.sqf b/addons/common/functions/fnc_findUnloadPosition.sqf index 22e23c7f2b..50727b438f 100644 --- a/addons/common/functions/fnc_findUnloadPosition.sqf +++ b/addons/common/functions/fnc_findUnloadPosition.sqf @@ -78,7 +78,7 @@ while {_rangeToCheck < _maxDistance} do { //Shoot a ray down, and make sure we hit something solid like a building or the ground: private _belowRoundArray = lineIntersectsSurfaces [(AGLtoASL _roundAGL) vectorAdd [0,0,0.5], (AGLtoASL _roundAGL) vectorAdd [0,0,-1]]; TRACE_4("Testing for solid",_roundDistance,_roundAngle,_roundAGL,_belowRoundArray); - if (!(_belowRoundArray isEqualTo [])) then { + if (_belowRoundArray isNotEqualTo []) then { private _aboveBuilding = (_belowRoundArray select 0) select 2; //Point is above something: Terrain(null) or Building if ((isNull _aboveBuilding) || {_aboveBuilding isKindOf "Building"}) then { @@ -110,14 +110,14 @@ while {_rangeToCheck < _maxDistance} do { _testIntersections = []; }; }; - if (!(_testIntersections isEqualTo [])) exitWith { + if (_testIntersections isNotEqualTo []) exitWith { TRACE_2("collision low/high",_roundAGL,_testIntersections); _roundPointIsValid = false; }; _point1ASL = (AGLtoASL _roundAGL) vectorAdd [_radiusOfItem * cos _angle, _radiusOfItem * sin _angle, 0.5]; _point2ASL = (AGLtoASL _roundAGL) vectorAdd [-_radiusOfItem * cos _angle, -_radiusOfItem * sin _angle, 1]; _testIntersections = lineIntersectsSurfaces [_point1ASL, _point2ASL]; - if (!(_testIntersections isEqualTo [])) exitWith { + if (_testIntersections isNotEqualTo []) exitWith { TRACE_2("collision mid",_roundAGL,_testIntersections); _roundPointIsValid = false; }; diff --git a/addons/common/functions/fnc_getAwakeAnim.sqf b/addons/common/functions/fnc_getAwakeAnim.sqf index aa7a28c3c5..f494db8c55 100644 --- a/addons/common/functions/fnc_getAwakeAnim.sqf +++ b/addons/common/functions/fnc_getAwakeAnim.sqf @@ -32,7 +32,7 @@ if (_unit == driver _vehicle) exitWith { // --- turret private _turret = _unit call CBA_fnc_turretPath; -if !(_turret isEqualTo []) exitWith { +if (_turret isNotEqualTo []) exitWith { private _turretConfig = [_vehicle, _turret] call CBA_fnc_getTurret; getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getText (_turretConfig >> "gunnerAction")) // return diff --git a/addons/common/functions/fnc_getDefinedVariableDefault.sqf b/addons/common/functions/fnc_getDefinedVariableDefault.sqf index edae4ef3ef..fc6108469a 100644 --- a/addons/common/functions/fnc_getDefinedVariableDefault.sqf +++ b/addons/common/functions/fnc_getDefinedVariableDefault.sqf @@ -19,7 +19,7 @@ params ["_varName"]; private _variableDefinition = _varName call FUNC(getDefinedVariableInfo); -if !(_variableDefinition isEqualTo []) exitWith { +if (_variableDefinition isNotEqualTo []) exitWith { _variableDefinition select 1; }; diff --git a/addons/common/functions/fnc_getMGRSdata.sqf b/addons/common/functions/fnc_getMGRSdata.sqf index f6ca81175b..cbea1511eb 100644 --- a/addons/common/functions/fnc_getMGRSdata.sqf +++ b/addons/common/functions/fnc_getMGRSdata.sqf @@ -26,7 +26,7 @@ private _lat = -1 * getNumber (configFile >> "CfgWorlds" >> _map >> "latitude"); private _altitude = getNumber (configFile >> "CfgWorlds" >> _map >> "elevationOffset"); private _mapData = _map call FUNC(getMapData); -if (!(_mapData isEqualTo [])) then { +if (_mapData isNotEqualTo []) then { _lat = _mapData select 0; _altitude = _mapData select 1; }; diff --git a/addons/common/functions/fnc_registerItemReplacement.sqf b/addons/common/functions/fnc_registerItemReplacement.sqf index d70a718193..0e101b8b37 100644 --- a/addons/common/functions/fnc_registerItemReplacement.sqf +++ b/addons/common/functions/fnc_registerItemReplacement.sqf @@ -62,7 +62,7 @@ private _fnc_replaceItems = { }; // Replace all items of current class in list - if !(_replacements isEqualTo []) then { + if (_replacements isNotEqualTo []) then { TRACE_3("replace",_item,_count,_replacements); _unit removeItems _item; diff --git a/addons/common/functions/fnc_runTests.sqf b/addons/common/functions/fnc_runTests.sqf index 4e937d87b6..019055443c 100644 --- a/addons/common/functions/fnc_runTests.sqf +++ b/addons/common/functions/fnc_runTests.sqf @@ -31,7 +31,7 @@ INFO_1("ace_common_fnc_runTests starting for [%1]", _specificTest); private _testFile = getText _x; diag_log text format ["----- Starting Testing %1 [%2] -----", _testName, _testFile]; private _return = ([nil] apply (compile preProcessFileLineNumbers _testFile)) select 0; - if ((isNil "_return") || {!(_return isEqualTo true)}) then { + if ((isNil "_return") || {_return isNotEqualTo true}) then { systemChat format ["Test [%1] Failed", _testName]; diag_log text format ["----- Finished Testing %1 [Failed] -----", _testName]; _fails pushBack _testName; @@ -43,6 +43,6 @@ INFO_1("ace_common_fnc_runTests starting for [%1]", _specificTest); INFO_1("ace_common_fnc_runTests finished in %1 ms", (1000 * (diag_tickTime - _startTime)) toFixed 1); INFO_2("[%1 / %2] Tests Passed", (_total - (count _fails)), _total); -if (!(_fails isEqualTo [])) then { +if (_fails isNotEqualTo []) then { INFO_1("Failed: %1", _fails); }; diff --git a/addons/common/functions/fnc_setVariablePublic.sqf b/addons/common/functions/fnc_setVariablePublic.sqf index 067765fc27..ba58308243 100644 --- a/addons/common/functions/fnc_setVariablePublic.sqf +++ b/addons/common/functions/fnc_setVariablePublic.sqf @@ -46,7 +46,7 @@ TRACE_2("Starting Embargo", _varName, _delay); TRACE_4("End of embargo", _object, _varName, _value, _curValue); //If value at start of embargo doesn't equal current, then broadcast and start new embargo - if (!(_value isEqualTo _curValue)) then { + if (_value isNotEqualTo _curValue) then { _this set [2, _curValue]; _this call FUNC(setVariablePublic); }; diff --git a/addons/common/functions/fnc_statusEffect_addType.sqf b/addons/common/functions/fnc_statusEffect_addType.sqf index 6be61967d9..2a1efdc9d8 100644 --- a/addons/common/functions/fnc_statusEffect_addType.sqf +++ b/addons/common/functions/fnc_statusEffect_addType.sqf @@ -27,7 +27,7 @@ GVAR(statusEffect_Names) pushBack _name; GVAR(statusEffect_isGlobal) pushBack _isGlobal; //We add reasons at any time, but more efficenet to add all common ones at one time during init -if (isServer && {!(_commonReasonsArray isEqualTo [])}) then { +if (isServer && {_commonReasonsArray isNotEqualTo []}) then { //Switch case to lower: _commonReasonsArray = _commonReasonsArray apply { toLower _x }; missionNamespace setVariable [(format [QGVAR(statusEffects_%1), _name]), _commonReasonsArray, true]; diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf index 51f35ea813..aae23a3bd3 100644 --- a/addons/cookoff/functions/fnc_cookOff.sqf +++ b/addons/cookoff/functions/fnc_cookOff.sqf @@ -28,7 +28,7 @@ if (local _vehicle) then { params ["_vehicle"]; private _config = _vehicle call CBA_fnc_getObjectConfig; - private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {!((_vehicle selectionPosition _x) isEqualTo [0,0,0])}; + private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {(_vehicle selectionPosition _x) isNotEqualTo [0,0,0]}; if (_positions isEqualTo []) then { WARNING_1("no valid selection for cookoff found. %1", typeOf _vehicle); @@ -48,7 +48,7 @@ if (local _vehicle) then { { private _position = [0,-2,0]; - if !(_x isEqualTo "#noselection") then { + if (_x isNotEqualTo "#noselection") then { _position = _vehicle selectionPosition _x; }; @@ -79,7 +79,7 @@ if (local _vehicle) then { { private _position = [0,-2,0]; - if !(_x isEqualTo "#noselection") then { + if (_x isNotEqualTo "#noselection") then { _position = _vehicle selectionPosition _x; }; diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf index 381cd0186a..4763f646ad 100644 --- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -26,7 +26,7 @@ TRACE_4("",typeOf _staticWeapon,_carryWeaponClassname,_turretClassname,_pickupTime); if (!isClass (configFile >> "CfgWeapons" >> _carryWeaponClassname)) exitWith {ERROR_1("bad weapon classname [%1]",_carryWeaponClassname);}; // Turret classname can equal nothing if the deploy bag is the "whole" weapon. e.g Kornet, Metis, other ATGMs - if (!(_turretClassname isEqualTo "") && {!isClass (configFile >> "CfgVehicles" >> _turretClassname)}) exitWith {ERROR_1("bad turret classname [%1]",_turretClassname);}; + if ((_turretClassname isNotEqualTo "") && {!isClass (configFile >> "CfgVehicles" >> _turretClassname)}) exitWith {ERROR_1("bad turret classname [%1]",_turretClassname);}; private _onFinish = { params ["_args"]; @@ -54,7 +54,7 @@ }; } forEach (magazinesAllTurrets _staticWeapon); - if !(_turretClassname isEqualTo "") then { + if (_turretClassname isNotEqualTo "") then { private _cswTripod = createVehicle [_turretClassname, [0, 0, 0], [], 0, "NONE"]; // Delay a frame so weapon has a chance to be deleted [{ diff --git a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf index 1a88c7f115..313e65dc9b 100644 --- a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf +++ b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf @@ -37,7 +37,7 @@ TRACE_1("",_magsInWeapon); // Remove any empty mags from start: private _ammoInFirstMag = 0; -while {(!(_magsInWeapon isEqualTo [])) && {_ammoInFirstMag = _magsInWeapon deleteAt 0; (_ammoInFirstMag == 0)}} do { +while {(_magsInWeapon isNotEqualTo []) && {_ammoInFirstMag = _magsInWeapon deleteAt 0; (_ammoInFirstMag == 0)}} do { TRACE_1("Removing empty mag",_ammoInFirstMag); _vehicle removeMagazineTurret [_vehMag, _turretPath]; }; diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf index f46c06b280..8f358e8b43 100644 --- a/addons/disarming/functions/fnc_disarmDropItems.sqf +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -219,7 +219,7 @@ if (_holderIsEmpty) then { }; //If we added a dummy item, remove it now - if (_holderIsEmpty && {!((getItemCargo _holder) isEqualTo [[DUMMY_ITEM],[1]])}) exitWith { + if (_holderIsEmpty && {(getItemCargo _holder) isNotEqualTo [[DUMMY_ITEM],[1]]}) exitWith { _holder setVariable [QGVAR(holderInUse), false]; [_caller, _target, "Debug: Holder should only have dummy item"] call FUNC(eventTargetFinish); }; @@ -237,7 +237,7 @@ if (_holderIsEmpty) then { _holder setVariable [QGVAR(holderInUse), false]; [_caller, _target, "Debug: Target cannot be disarmed"] call FUNC(eventTargetFinish); }; - if (_needToRemoveVest && {!((vestItems _target) isEqualTo [])}) exitWith { + if (_needToRemoveVest && {(vestItems _target) isNotEqualTo []}) exitWith { _holder setVariable [QGVAR(holderInUse), false]; [_caller, _target, "Debug: Vest Not Empty"] call FUNC(eventTargetFinish); }; @@ -245,7 +245,7 @@ if (_holderIsEmpty) then { _holder addItemCargoGlobal [(vest _target), 1]; removeVest _target; }; - if (_needToRemoveUniform && {!((uniformItems _target) isEqualTo [])}) exitWith { + if (_needToRemoveUniform && {(uniformItems _target) isNotEqualTo []}) exitWith { _holder setVariable [QGVAR(holderInUse), false]; [_caller, _target, "Debug: Uniform Not Empty"] call FUNC(eventTargetFinish); }; diff --git a/addons/dragging/functions/fnc_carryObject.sqf b/addons/dragging/functions/fnc_carryObject.sqf index e3f8c2b61e..312f446c27 100644 --- a/addons/dragging/functions/fnc_carryObject.sqf +++ b/addons/dragging/functions/fnc_carryObject.sqf @@ -75,7 +75,7 @@ GVAR(currentHeightChange) = 0; // prevent UAVs from firing private _UAVCrew = _target call EFUNC(common,getVehicleUAVCrew); -if !(_UAVCrew isEqualTo []) then { +if (_UAVCrew isNotEqualTo []) then { {_target deleteVehicleCrew _x} count _UAVCrew; _target setVariable [QGVAR(isUAV), true, true]; }; diff --git a/addons/dragging/functions/fnc_dragObject.sqf b/addons/dragging/functions/fnc_dragObject.sqf index ae52838e9b..0aa56c2a1d 100644 --- a/addons/dragging/functions/fnc_dragObject.sqf +++ b/addons/dragging/functions/fnc_dragObject.sqf @@ -67,7 +67,7 @@ private _UAVCrew = _target call EFUNC(common,getVehicleUAVCrew); // fixes not being able to move when in combat pace [_unit, "forceWalk", "ACE_dragging", true] call EFUNC(common,statusEffect_set); -if !(_UAVCrew isEqualTo []) then { +if (_UAVCrew isNotEqualTo []) then { {_target deleteVehicleCrew _x} count _UAVCrew; _target setVariable [QGVAR(isUAV), true, true]; }; diff --git a/addons/explosives/functions/fnc_interactEH.sqf b/addons/explosives/functions/fnc_interactEH.sqf index 59ddaff432..950c376400 100644 --- a/addons/explosives/functions/fnc_interactEH.sqf +++ b/addons/explosives/functions/fnc_interactEH.sqf @@ -47,7 +47,7 @@ if ( if (_playerPos distanceSqr _setPosition > 25) then { private _cfgAmmo = configFile >> "CfgAmmo"; { - if (_x distanceSqr _player < 225 && {!(_x in _minesHelped)} && {!(getModelInfo _x select 0 isEqualTo "empty.p3d")}) then { + if (_x distanceSqr _player < 225 && {!(_x in _minesHelped)} && {getModelInfo _x select 0 isNotEqualTo "empty.p3d"}) then { private _config = _cfgAmmo >> typeOf _x; private _size = getNumber (_config >> QGVAR(size)); private _defuseClass = ["ACE_DefuseObject", "ACE_DefuseObject_Large"] select (_size == 1); diff --git a/addons/explosives/functions/fnc_setupExplosive.sqf b/addons/explosives/functions/fnc_setupExplosive.sqf index 96fc4820e4..2961c8d101 100644 --- a/addons/explosives/functions/fnc_setupExplosive.sqf +++ b/addons/explosives/functions/fnc_setupExplosive.sqf @@ -80,7 +80,7 @@ GVAR(TweakedAngle) = 0; #ifdef DEBUG_MODE_FULL drawLine3d [(eyePos _unit) call EFUNC(common,ASLToPosition), (_testPos) call EFUNC(common,ASLToPosition), [1,0,0,1]]; #endif - if !((lineIntersectsSurfaces [eyePos _unit, _testPos, _unit]) isEqualTo []) exitWith {_return = false;}; + if ((lineIntersectsSurfaces [eyePos _unit, _testPos, _unit]) isNotEqualTo []) exitWith {_return = false;}; } forEach [[0,0], [-1,-1], [1,-1], [-1,1], [1,1]]; _return }; @@ -95,7 +95,7 @@ GVAR(TweakedAngle) = 0; { private _testPos = _testBase vectorAdd [0.1 * (_x select 0) * (cos _cameraAngle), 0.1 * (_x select 0) * (sin _cameraAngle), 0.1 * (_x select 1)]; private _intersectObject = ((lineIntersectsSurfaces [eyePos _unit, _testPos, _unit]) param [0, objNull]) param [3, objNull]; - if !(_intersectObject isEqualTo objNull) exitWith {_attachVehicle = _intersectObject}; + if (_intersectObject isNotEqualTo objNull) exitWith {_attachVehicle = _intersectObject}; } forEach [[0,0], [-1,-1], [1,-1], [-1,1], [1,1]]; if ((!isNull _attachVehicle) && {[PLACE_RANGE_MIN] call _testPositionIsValid} && {(_attachVehicle isKindOf "Car") || {_attachVehicle isKindOf "Tank"} || {_attachVehicle isKindOf "Air"} || {_attachVehicle isKindOf "Ship"}}) then { diff --git a/addons/fastroping/functions/fnc_canCutRopes.sqf b/addons/fastroping/functions/fnc_canCutRopes.sqf index 8107b8066b..f65f2ef89a 100644 --- a/addons/fastroping/functions/fnc_canCutRopes.sqf +++ b/addons/fastroping/functions/fnc_canCutRopes.sqf @@ -18,5 +18,5 @@ params ["_vehicle"]; private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []]; -!(_deployedRopes isEqualTo []) && +(_deployedRopes isNotEqualTo []) && {{(_x select 5)} count (_deployedRopes) == 0} diff --git a/addons/fastroping/functions/fnc_canFastRope.sqf b/addons/fastroping/functions/fnc_canFastRope.sqf index b4f5e20474..a071160821 100644 --- a/addons/fastroping/functions/fnc_canFastRope.sqf +++ b/addons/fastroping/functions/fnc_canFastRope.sqf @@ -20,6 +20,6 @@ params ["_unit", "_vehicle"]; private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []]; ((driver _vehicle != _unit) && -{!(_deployedRopes isEqualTo [])} && +{_deployedRopes isNotEqualTo []} && {{!(_x select 5) && !(_x select 6)} count (_deployedRopes) > 0} && {getPos _vehicle select 2 > 2}) diff --git a/addons/fastroping/functions/fnc_cutRopes.sqf b/addons/fastroping/functions/fnc_cutRopes.sqf index 8c4633ca8e..f17d08dc18 100644 --- a/addons/fastroping/functions/fnc_cutRopes.sqf +++ b/addons/fastroping/functions/fnc_cutRopes.sqf @@ -25,7 +25,7 @@ private _deployedRopes = _vehicle getVariable [QGVAR(deployedRopes), []]; private _attachedObjects = attachedObjects _dummy; //Rope is considered occupied when it's broken as well, so check if array is empty //Note: ropes are not considered attached objects by Arma - if !(_attachedObjects isEqualTo []) then { + if (_attachedObjects isNotEqualTo []) then { detach ((attachedObjects _dummy) select 0); }; }; diff --git a/addons/fastroping/functions/fnc_deployAI.sqf b/addons/fastroping/functions/fnc_deployAI.sqf index d769fd6723..d1546aad63 100644 --- a/addons/fastroping/functions/fnc_deployAI.sqf +++ b/addons/fastroping/functions/fnc_deployAI.sqf @@ -75,7 +75,7 @@ DFUNC(deployAIRecursive) = { unassignVehicle _unit; [_unit, _vehicle] call FUNC(fastRope); - if !(_unitsToDeploy isEqualTo []) then { + if (_unitsToDeploy isNotEqualTo []) then { [{ [{ params ["_vehicle"]; diff --git a/addons/fastroping/functions/fnc_deployAIWaypoint.sqf b/addons/fastroping/functions/fnc_deployAIWaypoint.sqf index 73dbee6ea4..273d148329 100644 --- a/addons/fastroping/functions/fnc_deployAIWaypoint.sqf +++ b/addons/fastroping/functions/fnc_deployAIWaypoint.sqf @@ -33,7 +33,7 @@ if (_vehicle distance2D _position > 50) then { // - Deployment --------------------------------------------------------------- [_vehicle] call FUNC(deployAI); -waitUntil {!((_vehicle getVariable [QGVAR(deployedRopes), []]) isEqualTo [])}; +waitUntil {(_vehicle getVariable [QGVAR(deployedRopes), []]) isNotEqualTo []}; waitUntil {(_vehicle getVariable [QGVAR(deployedRopes), []]) isEqualTo []}; _group setSpeedMode _speedMode; diff --git a/addons/fastroping/functions/fnc_unequipFRIES.sqf b/addons/fastroping/functions/fnc_unequipFRIES.sqf index 7fade927b6..540ebb2f3f 100644 --- a/addons/fastroping/functions/fnc_unequipFRIES.sqf +++ b/addons/fastroping/functions/fnc_unequipFRIES.sqf @@ -20,6 +20,6 @@ params ["_vehicle"]; deleteVehicle (_vehicle getVariable [QGVAR(FRIES), objNull]); _vehicle setVariable [QGVAR(FRIES), nil, true]; -if !(_vehicle getVariable [QGVAR(deployedRopes), []] isEqualTo []) then { +if (_vehicle getVariable [QGVAR(deployedRopes), []] isNotEqualTo []) then { [_vehicle] call FUNC(cutRopes); }; diff --git a/addons/fcs/dev/test_debugConfigs.sqf b/addons/fcs/dev/test_debugConfigs.sqf index 89fa6b0d31..c373912363 100644 --- a/addons/fcs/dev/test_debugConfigs.sqf +++ b/addons/fcs/dev/test_debugConfigs.sqf @@ -30,7 +30,7 @@ private _problemUIs = []; }; } forEach _weapons; - if (!(_weapons isEqualTo [])) then { + if (_weapons isNotEqualTo []) then { private _fcsMsg = switch (true) do { // case ((!_vanillaFCS) && {!_aceFCS}): {"No FCS"}; // case ((_vanillaFCS) && {_aceFCS}): {"CONFLICT FCS"}; diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index 0959708bb0..e432944855 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -39,7 +39,7 @@ private _initSpeed = 0; private _zeroDistance = currentZeroing _gunner; if (_zeroDistance > 0) then { private _weaponCombo = [_weapon, _magazine, _ammo, _zeroDistance]; - if !(_weaponCombo isEqualTo (_gunner getVariable [QGVAR(lastWeaponCombo), []])) then { + if (_weaponCombo isNotEqualTo (_gunner getVariable [QGVAR(lastWeaponCombo), []])) then { private _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); private _antiOffset = "ace_fcs" callExtension format ["%1,%2,%3,%4", _initSpeed, _airFriction, 0, _zeroDistance]; _antiOffset = parseNumber _antiOffset; diff --git a/addons/finger/functions/fnc_keyPress.sqf b/addons/finger/functions/fnc_keyPress.sqf index faef2f00a3..4278bec2cb 100644 --- a/addons/finger/functions/fnc_keyPress.sqf +++ b/addons/finger/functions/fnc_keyPress.sqf @@ -32,7 +32,7 @@ GVAR(lastFPTime) = diag_tickTime; private _originASL = AGLtoASL positionCameraToWorld [0, 0, 0]; private _fingerPosASL = AGLtoASL positionCameraToWorld [0, 0, FP_DISTANCE]; private _intersections = lineIntersectsSurfaces [_originASL, _fingerPosASL, ACE_player, vehicle ACE_player, true, 1]; -if !(_intersections isEqualTo []) then { +if (_intersections isNotEqualTo []) then { _fingerPosASL = _intersections select 0 select 0; }; diff --git a/addons/frag/functions/fnc_dev_trackTrace.sqf b/addons/frag/functions/fnc_dev_trackTrace.sqf index 6481b89310..5d8ee3dee0 100644 --- a/addons/frag/functions/fnc_dev_trackTrace.sqf +++ b/addons/frag/functions/fnc_dev_trackTrace.sqf @@ -18,7 +18,7 @@ params ["_args", "_pfhID"]; _args params ["_tracerObj", "_index"]; -if (alive _tracerObj && {!(GVAR(traces) isEqualTo [])}) then { +if (alive _tracerObj && {GVAR(traces) isNotEqualTo []}) then { private _data = GVAR(traces) select _index; private _positions = _data select 4; _positions pushBack [getPos _tracerObj, vectorMagnitude (velocity _tracerObj)]; diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index 8c90445411..a2744d60fd 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -95,7 +95,7 @@ private _fragArcs = []; _fragArcs set [360, 0]; private _doRandom = true; -if (!(_objects isEqualTo [])) then { +if (_objects isNotEqualTo []) then { if (GVAR(reflectionsEnabled)) then { [_lastPos, _shellType] call FUNC(doReflections); }; diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 1c8066dec2..3a8c8ef5bf 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -31,7 +31,7 @@ private _config = configFile >> "CfgAmmo" >> _ammo; if (local _unit) then { // handle priming sound, if present private _soundConfig = getArray (configFile >> "CfgAmmo" >> _ammo >> QGVAR(pullPinSound)); - if !(_soundConfig isEqualTo []) then { + if (_soundConfig isNotEqualTo []) then { _soundConfig params ["_file", "_volume", "_pitch", "_distance"]; playSound3D [_file, objNull, false, getPosASL _projectile, _volume, _pitch, _distance]; }; diff --git a/addons/gunbag/XEH_preInit.sqf b/addons/gunbag/XEH_preInit.sqf index 582d64f7e5..63968a30f8 100644 --- a/addons/gunbag/XEH_preInit.sqf +++ b/addons/gunbag/XEH_preInit.sqf @@ -16,11 +16,11 @@ PREP_RECOMPILE_END; private _newBackpack = backpackContainer _unit; private _oldBackpack = backpackContainer _corpse; - if !(typeOf _newBackpack isEqualTo typeOf _oldBackpack) exitWith {}; + if (typeOf _newBackpack isNotEqualTo typeOf _oldBackpack) exitWith {}; private _state = _oldBackpack getVariable [QGVAR(gunbagWeapon), []]; - if !(_state isEqualTo []) then { + if (_state isNotEqualTo []) then { _newBackpack setVariable [QGVAR(gunbagWeapon), _state, true]; }; }, _this] call CBA_fnc_execNextFrame; diff --git a/addons/gunbag/functions/fnc_canInteract.sqf b/addons/gunbag/functions/fnc_canInteract.sqf index 04313f6741..a003afce86 100644 --- a/addons/gunbag/functions/fnc_canInteract.sqf +++ b/addons/gunbag/functions/fnc_canInteract.sqf @@ -26,10 +26,10 @@ if ((_gunbag getVariable [QGVAR(gunbagWeapon), []]) isEqualTo [] && {_weapon != _result = 0; }; -if (!((_gunbag getVariable [QGVAR(gunbagWeapon), []]) isEqualTo []) && {_weapon == ""}) then { +if ((_gunbag getVariable [QGVAR(gunbagWeapon), []] isNotEqualTo []) && {_weapon == ""}) then { _result = 1; }; -if (!((_gunbag getVariable [QGVAR(gunbagWeapon), []]) isEqualTo []) && {_weapon != ""}) then { +if ((_gunbag getVariable [QGVAR(gunbagWeapon), []] isNotEqualTo []) && {_weapon != ""}) then { _result = 2; }; _result diff --git a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf index 849c0c29a1..76f685df81 100644 --- a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf +++ b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf @@ -24,7 +24,7 @@ if (ACE_player != _vehicle) then { private _turretPath = [ACE_player] call EFUNC(common,getTurretIndex); private _effectType = getText (configOf _vehicle >> "attenuationEffectType"); - if (!(_turretPath isEqualTo [])) then { + if (_turretPath isNotEqualTo []) then { private _turretConfig = [(configOf _vehicle), _turretPath] call EFUNC(common,getTurretConfigPath); if ((getNumber (_turretConfig >> "disableSoundAttenuation")) == 1) then { diff --git a/addons/hellfire/functions/fnc_attackProfile.sqf b/addons/hellfire/functions/fnc_attackProfile.sqf index 7d4980a1b3..b2a08f24a3 100644 --- a/addons/hellfire/functions/fnc_attackProfile.sqf +++ b/addons/hellfire/functions/fnc_attackProfile.sqf @@ -56,7 +56,7 @@ switch (_attackStage) do { _returnTargetPos = _projectilePos getPos [100, getDir _projectile]; _returnTargetPos set [2, (_projectilePos select 2) + _cruiseHeight]; - if (!(_seekerTargetPos isEqualTo [0,0,0])) then { + if (_seekerTargetPos isNotEqualTo [0,0,0]) then { _attackProfileStateParams set [0, STAGE_ATTACK_CRUISE]; TRACE_1("New Stage: STAGE_ATTACK_CRUISE",_distanceFromLaunch2d); }; @@ -67,7 +67,7 @@ switch (_attackStage) do { private _distToGoRatio = _distanceToTarget2d / (_launchPos distance2d _seekerTargetPos); // arcing up at 7 degrees to start until 50% left, then smooth curve to a downward attack - private _gainSlope = linearConversion [0.5, 0.1, _distToGoRatio, 7, -7, true]; + private _gainSlope = linearConversion [0.5, 0.1, _distToGoRatio, 7, -7, true]; _returnTargetPos = +_seekerTargetPos; _returnTargetPos set [2, ((_projectilePos select 2) + (_distanceToTarget2d * sin _gainSlope)) max (_seekerTargetPos select 2)]; diff --git a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf index a59a7ff787..892c26f1d0 100644 --- a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf +++ b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf @@ -25,7 +25,7 @@ private _target = _object; private _player = ACE_player; // Check if the function should be modified first -if !((_origActionData select 10) isEqualTo {}) then { +if ((_origActionData select 10) isNotEqualTo {}) then { // It should, so make a copy and pass it to the modifierFunction _origActionData = +_origActionData; [_target, ACE_player, _origActionData select 6, _origActionData] call (_origActionData select 10); @@ -58,7 +58,7 @@ _fullPath pushBack _actionName; private _activeChildren = []; // If there's a statement to dynamically insert children then execute it -if !({} isEqualTo _insertChildrenCode) then { +if (_insertChildrenCode isNotEqualTo {}) then { private _dynamicChildren = [_target, ACE_player, _customParams] call _insertChildrenCode; // Collect dynamic children class actions diff --git a/addons/interact_menu/functions/fnc_isSubPath.sqf b/addons/interact_menu/functions/fnc_isSubPath.sqf index 72857f3070..2a0cbe664b 100644 --- a/addons/interact_menu/functions/fnc_isSubPath.sqf +++ b/addons/interact_menu/functions/fnc_isSubPath.sqf @@ -24,7 +24,7 @@ if (count _shortPath > count _longPath) exitWith {false}; //IGNORE_PRIVATE_WARNING ["_i"]; for [{private _i = 0},{_i < count _shortPath},{_i = _i + 1}] do { - if !((_longPath select _i) isEqualTo (_shortPath select _i)) exitWith { + if ((_longPath select _i) isNotEqualTo (_shortPath select _i)) exitWith { _isSubPath = false; }; }; diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 36e86cd9b3..651aaef47d 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -62,7 +62,7 @@ if (GVAR(openedMenuType) >= 0) then { GVAR(selectedAction) = _action select 1; GVAR(selectedTarget) = (GVAR(selectedAction)) select 2; - private _misMatch = !(GVAR(lastPath) isEqualTo _hoverPath); + private _misMatch = (GVAR(lastPath) isNotEqualTo _hoverPath); if(_misMatch && {diag_tickTime-GVAR(expandedTime) > linearConversion [0, 2, GVAR(menuAnimationSpeed), 0.25, 0.08333333]}) then { GVAR(startHoverTime) = diag_tickTime; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index d51766548f..17f9ad5145 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -36,7 +36,7 @@ private _menuInSelectedPath = true; if (_forEachIndex >= (count GVAR(menuDepthPath))) exitWith { _menuInSelectedPath = false; }; - if !(_x isEqualTo (GVAR(menuDepthPath) select _forEachIndex)) exitWith { + if (_x isNotEqualTo (GVAR(menuDepthPath) select _forEachIndex)) exitWith { _menuInSelectedPath = false; }; } forEach _path; diff --git a/addons/interaction/ACE_ZeusActions.hpp b/addons/interaction/ACE_ZeusActions.hpp index c05b6fe973..8cc386fbc1 100644 --- a/addons/interaction/ACE_ZeusActions.hpp +++ b/addons/interaction/ACE_ZeusActions.hpp @@ -3,7 +3,7 @@ class ACE_ZeusActions { class ZeusUnits { displayName = "$STR_A3_RscDisplayCurator_ModeUnits_tooltip"; icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeUnits_ca.paa"; - condition = QUOTE(!([] isEqualTo (curatorSelected select 0))); + condition = QUOTE([] isNotEqualTo (curatorSelected select 0)); class stance { displayName = "$STR_A3_RscAttributeUnitPos_Title"; @@ -49,7 +49,7 @@ class ACE_ZeusActions { class ZeusGroups { displayName = "$STR_A3_RscDisplayCurator_ModeGroups_tooltip"; icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeGroups_ca.paa"; - condition = QUOTE(!([] isEqualTo (curatorSelected select 1))); + condition = QUOTE([] isNotEqualTo (curatorSelected select 1)); class behaviour { displayName = "$STR_Combat_Mode"; @@ -157,7 +157,7 @@ class ACE_ZeusActions { class ZeusWaypoints { displayName = "Waypoints"; icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeRecent_ca.paa"; - condition = QUOTE(!([] isEqualTo (curatorSelected select 2))); + condition = QUOTE([] isNotEqualTo (curatorSelected select 2)); class behaviour { displayName = "$STR_Combat_Mode"; @@ -265,6 +265,6 @@ class ACE_ZeusActions { class ZeusMarkers { displayName = "$STR_A3_RscDisplayCurator_ModeMarkers_tooltip"; icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeMarkers_ca.paa"; - condition = QUOTE(!([] isEqualTo (curatorSelected select 3))); + condition = QUOTE([] isNotEqualTo (curatorSelected select 3)); }; }; diff --git a/addons/interaction/functions/fnc_canPullOutBody.sqf b/addons/interaction/functions/fnc_canPullOutBody.sqf index bb61cb2545..7b7d93418c 100644 --- a/addons/interaction/functions/fnc_canPullOutBody.sqf +++ b/addons/interaction/functions/fnc_canPullOutBody.sqf @@ -34,7 +34,7 @@ if ( ((fullCrew [_vehicle, ""] select {_body == _x select 0}) select 0) params ["", "", "_cargoIndex", "_turretPath"]; -private _locked = if (!(_turretPath isEqualTo [])) then { +private _locked = if (_turretPath isNotEqualTo []) then { _vehicle lockedTurret _turretPath; } else { if (_cargoIndex > -1) then { diff --git a/addons/interaction/functions/fnc_pullOutBody.sqf b/addons/interaction/functions/fnc_pullOutBody.sqf index 6f754eae67..0ab901c916 100644 --- a/addons/interaction/functions/fnc_pullOutBody.sqf +++ b/addons/interaction/functions/fnc_pullOutBody.sqf @@ -37,7 +37,7 @@ TRACE_3("",_cargoIndex,_cargoNumber,_turretPath); private _preserveEngineOn = false; // first get in to target seat -if (!(_turretPath isEqualTo [])) then { +if (_turretPath isNotEqualTo []) then { _unit action ["GetInTurret", _vehicle, _turretPath]; } else { if (_cargoIndex > -1) then { diff --git a/addons/javelin/functions/fnc_getTarget.sqf b/addons/javelin/functions/fnc_getTarget.sqf index 7230aae64a..e51790e212 100644 --- a/addons/javelin/functions/fnc_getTarget.sqf +++ b/addons/javelin/functions/fnc_getTarget.sqf @@ -38,7 +38,7 @@ if (!isNull _lastTarget) then { private _testPosASL = AGLtoASL (_lastTarget modelToWorld [_xOffset * - cos _relAngle, _xOffset * sin _relAngle, _yOffset]); private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, _testPosASL, ace_player, vehicle ace_player, true, 1]; // drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [[0,1,1,1], [1,0,1,1]] select (count _intersectionsToCursorTarget), (ASLtoAGL _testPosASL), 0.25, 0.25, 0, "", 0.5, 0.025, "TahomaB"]; - if (!(_intersectionsToCursorTarget isEqualTo [])) then { + if (_intersectionsToCursorTarget isNotEqualTo []) then { (_intersectionsToCursorTarget select 0) params ["", "", "_intersectedObject"]; if (_intersectedObject isKindOf "AllVehicles") then { _intersectedObject breakOut "main"; @@ -68,7 +68,7 @@ for "_xOffset" from -14 to 14 step 2 do { private _testPosASL = AGLtoASL (positionCameraToWorld [_xOffset, _yOffset, _maxRange]); private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, _testPosASL, ace_player, vehicle ace_player, true, 1]; // drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [[0,1,0,1], [1,0,0,1]] select (count _intersectionsToCursorTarget), (ASLtoAGL _testPosASL), 0.25, 0.25, 0, "", 0.5, 0.025, "TahomaB"]; - if (!(_intersectionsToCursorTarget isEqualTo [])) then { + if (_intersectionsToCursorTarget isNotEqualTo []) then { (_intersectionsToCursorTarget select 0) params ["", "", "_intersectedObject"]; if (_intersectedObject isKindOf "AllVehicles") then { _intersectedObject breakOut "main"; diff --git a/addons/laser/functions/fnc_handleLaserTargetCreation.sqf b/addons/laser/functions/fnc_handleLaserTargetCreation.sqf index c619024ed4..3a797d28c8 100644 --- a/addons/laser/functions/fnc_handleLaserTargetCreation.sqf +++ b/addons/laser/functions/fnc_handleLaserTargetCreation.sqf @@ -42,7 +42,7 @@ TRACE_1("params",_this); if ((alive ACE_player) && {_vehicle != ACE_player}) then { private _turretPath = if (ACE_player == (driver _vehicle)) then {[-1]} else {ACE_player call CBA_fnc_turretPath}; TRACE_1("",_turretPath); - if (!(_turretPath isEqualTo [])) then { + if (_turretPath isNotEqualTo []) then { private _currentWeapon = _vehicle currentWeaponTurret _turretPath; TRACE_1("",_currentWeapon); if ((getNumber (configFile >> "CfgWeapons" >> _currentWeapon >> "laser")) == 1) then { diff --git a/addons/laser/functions/fnc_shootRay.sqf b/addons/laser/functions/fnc_shootRay.sqf index 1fff8d5718..03c3afd69a 100644 --- a/addons/laser/functions/fnc_shootRay.sqf +++ b/addons/laser/functions/fnc_shootRay.sqf @@ -36,7 +36,7 @@ if (_intersects isEqualTo []) then { }; }; -if (!(_intersects isEqualTo [])) then { +if (_intersects isNotEqualTo []) then { (_intersects select 0) params ["_intersectPosASL", "", "_intersectObject"]; // Move back slightly to prevents issues with it going below terrain _distance = (_posASL vectorDistance _intersectPosASL) - 0.005; diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index d837367b59..3ff3567cef 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -47,7 +47,7 @@ GVAR(flashlights) = [] call CBA_fnc_createNamespace; private _unitLight = _player getVariable [QGVAR(flashlight), ["", objNull]]; _unitLight params ["_flashlight", "_glow"]; if (_mapOn) then { - if (!(_flashlight isEqualTo "") && {isNull _glow}) then { + if (_flashlight isNotEqualTo "" && {isNull _glow}) then { [_player, _flashlight] call FUNC(flashlightGlow); if ([_player, _flashlight] call FUNC(needPlaySound)) then {playSound QGVAR(flashlightClick)}; }; diff --git a/addons/map/functions/fnc_determineMapLight.sqf b/addons/map/functions/fnc_determineMapLight.sqf index d6a0f09a08..f1844e95e5 100644 --- a/addons/map/functions/fnc_determineMapLight.sqf +++ b/addons/map/functions/fnc_determineMapLight.sqf @@ -48,7 +48,7 @@ private _vehicle = vehicle _unit; // Do not obscure the map if the player is on a enclosed vehicle (assume internal illumination) if ((_vehicle != _unit) && {(!isTurnedOut _unit)} && GVAR(vehicleLightCondition) && {!((_unit call CBA_fnc_turretPath) in GVAR(vehicleExteriorTurrets))}) exitWith { TRACE_1("Player in a enclosed vehicle",GVAR(vehicleLightColor)); - [!(GVAR(vehicleLightColor) isEqualTo [1,1,1,0]), GVAR(vehicleLightColor)] + [GVAR(vehicleLightColor) isNotEqualTo [1,1,1,0], GVAR(vehicleLightColor)] }; // Player is not in a vehicle @@ -64,7 +64,7 @@ TRACE_1("Player is on foot or in an open vehicle",""); // Using chemlights private _nearObjects = (_unit nearObjects ["Chemlight_base", 4]) select {alive _x}; -if !(_nearObjects isEqualTo []) then { +if (_nearObjects isNotEqualTo []) then { private _nearestlight = _nearObjects select 0; private _lightLevelTemp = (1 - ((((_unit distance _nearestlight) - 2) / 2) max 0)) * 0.4; if (_lightLevelTemp > _lightLevel) then { diff --git a/addons/map/functions/fnc_flashlightGlow.sqf b/addons/map/functions/fnc_flashlightGlow.sqf index 32615d014b..9457865bc2 100644 --- a/addons/map/functions/fnc_flashlightGlow.sqf +++ b/addons/map/functions/fnc_flashlightGlow.sqf @@ -27,7 +27,7 @@ if (!isNull _glow) then { deleteVehicle _glow; }; -if !(_flashlightType isEqualTo "") then { +if (_flashlightType isNotEqualTo "") 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]; diff --git a/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf b/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf index a2ec5bfe78..334ecb4d5c 100644 --- a/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf +++ b/addons/maptools/functions/fnc_drawLinesOnRoamer.sqf @@ -137,7 +137,7 @@ _theMap drawIcon ['iconStaticMG',[1,0,0,1],_posTopRight,24,24,getDir player,'1,1 _theMap drawIcon ['iconStaticMG',[1,0,0,1],_posTopLeft,24,24,getDir player,'-1,1',1,0.03,'TahomaB','right']; _theMap drawIcon ['iconStaticMG',[1,0,0,1],_posBottomLeft,24,24,getDir player,'-1,-1',1,0.03,'TahomaB','right']; _theMap drawIcon ['iconStaticMG',[1,0,0,1],_posBottomRight,24,24,getDir player,'1,-1',1,0.03,'TahomaB','right']; -if !(GVAR(freeDrawingData) isEqualTo []) then { +if (GVAR(freeDrawingData) isNotEqualTo []) then { _theMap drawIcon ['iconStaticMG',[0,0,1,1],GVAR(freeDrawingData) select 1,24,24,getDir player,'1,-1',1,0.03,'TahomaB','right']; _theMap drawIcon ['iconStaticMG',[0,0,1,1],GVAR(freeDrawingData) select 2,24,24,getDir player,'1,-1',1,0.03,'TahomaB','right']; }; diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index 7d91173c87..2fc71c2a39 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -55,7 +55,7 @@ //check if entity under mouse is a user marker if (_mouseOverType isEqualTo "marker") then { - if (!((_marker find "_USER_DEFINED") isEqualTo -1) && ((markerShape _marker) isEqualTo "ICON")) then { + if (((_marker find "_USER_DEFINED") isNotEqualTo -1) && ((markerShape _marker) isEqualTo "ICON")) then { GVAR(editingMarker) = _marker; //hide marker which is being edited because if the user cancels editing, it will still exist unchanged GVAR(editingMarker) setMarkerAlphaLocal 0; @@ -71,7 +71,7 @@ //////////////////// // Calculate center position of the marker placement ctrl - if !(GVAR(editingMarker) isEqualTo "") then { + if (GVAR(editingMarker) isNotEqualTo "") then { //prevent changing the original marker position GVAR(currentMarkerPosition) = markerPos GVAR(editingMarker); } else { @@ -216,7 +216,7 @@ }; }; - private _selectChannel = if !(GVAR(editingMarker) isEqualTo "") then { + private _selectChannel = if (GVAR(editingMarker) isNotEqualTo "") then { //get the channel where the marker was placed in parseNumber ((GVAR(editingMarker) splitString "/") param [2, "3"]) } else { @@ -310,7 +310,7 @@ // init marker angle slider _aceAngleSlider sliderSetRange [-180, 180]; - if !(GVAR(editingMarker) isEqualTo "") then { + if (GVAR(editingMarker) isNotEqualTo "") then { //get the original direction GVAR(currentMarkerAngle) = markerDir GVAR(editingMarker); }; diff --git a/addons/markers/functions/fnc_onMouseButtonDown.sqf b/addons/markers/functions/fnc_onMouseButtonDown.sqf index ce6f99ee00..df56154ad6 100644 --- a/addons/markers/functions/fnc_onMouseButtonDown.sqf +++ b/addons/markers/functions/fnc_onMouseButtonDown.sqf @@ -23,7 +23,7 @@ params ["_ctrlMap", "_button", "_x", "_y", "_shift", "_ctrl", "_alt"]; -if (_button != 0 || {!([_shift, _ctrl, _alt] isEqualTo [false, false, true])}) exitWith {}; +if (_button != 0 || {[_shift, _ctrl, _alt] isNotEqualTo [false, false, true]}) exitWith {}; ctrlMapMouseOver _ctrlMap params [["_type", ""], "_marker"]; diff --git a/addons/markers/functions/fnc_placeMarker.sqf b/addons/markers/functions/fnc_placeMarker.sqf index a1b136aad5..61f18a30d8 100644 --- a/addons/markers/functions/fnc_placeMarker.sqf +++ b/addons/markers/functions/fnc_placeMarker.sqf @@ -19,7 +19,7 @@ params ["_display", "_closeNum"]; TRACE_2("params",_display,_closeNum); -private _editingMarker = !(GVAR(editingMarker) isEqualTo ""); +private _editingMarker = (GVAR(editingMarker) isNotEqualTo ""); if (_closeNum isEqualTo 1) then { if (_editingMarker) then { @@ -48,7 +48,7 @@ if (_closeNum isEqualTo 1) then { // provide hook for external scripts [QGVAR(markerPlaced),[_newestMarker, _editingMarker]] call CBA_fnc_localEvent; - + // Add to list of user placed markers, and then filter for deleted GVAR(userPlacedMarkers) pushBack _newestMarker; GVAR(userPlacedMarkers) = GVAR(userPlacedMarkers) select {!((getMarkerPos _x) isEqualTo [0,0,0])}; diff --git a/addons/medical/dev/reportSettings.sqf b/addons/medical/dev/reportSettings.sqf index 97350121a3..eb489fab6a 100644 --- a/addons/medical/dev/reportSettings.sqf +++ b/addons/medical/dev/reportSettings.sqf @@ -7,7 +7,7 @@ { private _currentValue = missionNamespace getVariable [_x, "$"]; private _defaultValue = (cba_settings_default getVariable [_x, []]) param [0, "#"]; - if !(_currentValue isEqualTo _defaultValue) then { + if (_currentValue isNotEqualTo _defaultValue) then { diag_log text format ["%1: [Current %2] [Default: %3]", _x, _currentValue, _defaultValue]; }; } forEach _medicalSettings; diff --git a/addons/medical_ai/functions/fnc_wasRequested.sqf b/addons/medical_ai/functions/fnc_wasRequested.sqf index 479dc0c880..38efdd8121 100644 --- a/addons/medical_ai/functions/fnc_wasRequested.sqf +++ b/addons/medical_ai/functions/fnc_wasRequested.sqf @@ -16,4 +16,4 @@ */ private _healQueue = _this getVariable [QGVAR(healQueue), []]; -!(_healQueue isEqualTo []) +(_healQueue isNotEqualTo []) diff --git a/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf index 8618a41b5d..af932581be 100644 --- a/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical_damage/functions/fnc_parseConfigForInjuries.sqf @@ -38,7 +38,7 @@ private _classID = 0; private _causeLimping = GET_NUMBER(_entry >> "causeLimping",0) == 1; private _causeFracture = GET_NUMBER(_entry >> "causeFracture",0) == 1; - if !(_causes isEqualTo []) then { + if (_causes isNotEqualTo []) then { GVAR(woundClassNames) pushBack _className; GVAR(woundsData) pushBack [_classID, _selections, _bleeding, _pain, [_minDamage, _maxDamage], _causes, _className, _causeLimping, _causeFracture]; { diff --git a/addons/medical_treatment/functions/fnc_canStitch.sqf b/addons/medical_treatment/functions/fnc_canStitch.sqf index ea4318874d..a542de23f1 100644 --- a/addons/medical_treatment/functions/fnc_canStitch.sqf +++ b/addons/medical_treatment/functions/fnc_canStitch.sqf @@ -18,4 +18,4 @@ params ["", "_patient"]; -!(_patient call FUNC(getStitchableWounds) isEqualTo []) +(_patient call FUNC(getStitchableWounds) isNotEqualTo []) diff --git a/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf index 1f9ef981dd..da2253ca18 100644 --- a/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf +++ b/addons/medical_treatment/functions/fnc_onMedicationUsage.sqf @@ -41,7 +41,7 @@ if (_maxDosage > 0) then { }; } forEach _incompatibleMedication; -if !(_overdosedMedications isEqualTo []) then { +if (_overdosedMedications isNotEqualTo []) then { private _medicationConfig = (configFile >> "ace_medical_treatment" >> "Medication"); private _onOverDose = getText (_medicationConfig >> "onOverDose"); if (isClass (_medicationConfig >> _className)) then { diff --git a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf index cdb57b3dfe..850ff41607 100644 --- a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf @@ -53,7 +53,7 @@ if (_hemorrhage != GET_HEMORRHAGE(_unit)) then { private _woundBloodLoss = GET_WOUND_BLEEDING(_unit); private _inPain = GET_PAIN_PERCEIVED(_unit) > 0; -if !(_inPain isEqualTo IS_IN_PAIN(_unit)) then { +if (_inPain isNotEqualTo IS_IN_PAIN(_unit)) then { _unit setVariable [VAR_IN_PAIN, _inPain, true]; }; @@ -75,7 +75,7 @@ private _painSupressAdjustment = 0; private _peripheralResistanceAdjustment = 0; private _adjustments = _unit getVariable [VAR_MEDICATIONS,[]]; -if !(_adjustments isEqualTo []) then { +if (_adjustments isNotEqualTo []) then { private _deleted = false; { _x params ["_medication", "_timeAdded", "_timeTillMaxEffect", "_maxTimeInSystem", "_hrAdjust", "_painAdjust", "_flowAdjust"]; diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf index 877bbb2bcc..d4cc5000c3 100644 --- a/addons/microdagr/functions/fnc_updateDisplay.sqf +++ b/addons/microdagr/functions/fnc_updateDisplay.sqf @@ -70,7 +70,7 @@ case (APP_MODE_INFODISPLAY): { _aboveSeaLevelText = "----"; if (GVAR(currentWaypoint) == -2) then { - if (!(GVAR(rangeFinderPositionASL) isEqualTo [])) then { + if (GVAR(rangeFinderPositionASL) isNotEqualTo []) then { private _targetPos = [GVAR(rangeFinderPositionASL)] call EFUNC(common,getMapGridFromPos); _targetPosName = format ["[%1 %2 %3]", EGVAR(common,MGRS_data) select 1, _targetPos select 0, _targetPos select 1]; _targetPosLocationASL = GVAR(rangeFinderPositionASL); @@ -81,7 +81,7 @@ case (APP_MODE_INFODISPLAY): { _targetPosLocationASL = (_waypoints select GVAR(currentWaypoint)) select 1; }; - if (!(_targetPosLocationASL isEqualTo [])) then { + if (_targetPosLocationASL isNotEqualTo []) then { private _bearing = [(getPosASL ACE_player), _targetPosLocationASL] call BIS_fnc_dirTo; _bearingText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; @@ -123,7 +123,7 @@ case (APP_MODE_COMPASS): { private _targetPosLocationASL = []; if (GVAR(currentWaypoint) == -2) then { - if (!(GVAR(rangeFinderPositionASL) isEqualTo [])) then { + if (GVAR(rangeFinderPositionASL) isNotEqualTo []) then { private _targetPos = [GVAR(rangeFinderPositionASL)] call EFUNC(common,getMapGridFromPos); _targetPosName = format ["[%1 %2 %3]", EGVAR(common,MGRS_data) select 1, _targetPos select 0, _targetPos select 1]; _targetPosLocationASL = GVAR(rangeFinderPositionASL); @@ -137,7 +137,7 @@ case (APP_MODE_COMPASS): { _bearingText = "---"; _rangeText = "---"; - if (!(_targetPosLocationASL isEqualTo [])) then { + if (_targetPosLocationASL isNotEqualTo []) then { private _bearing = [(getPosASL ACE_player), _targetPosLocationASL] call BIS_fnc_dirTo; _bearingText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; diff --git a/addons/minedetector/functions/fnc_hasDetector.sqf b/addons/minedetector/functions/fnc_hasDetector.sqf index 4752284196..c7ebd5b9f0 100644 --- a/addons/minedetector/functions/fnc_hasDetector.sqf +++ b/addons/minedetector/functions/fnc_hasDetector.sqf @@ -17,4 +17,4 @@ params ["_unit"]; -!(([currentWeapon _unit] call FUNC(getDetectorConfig)) isEqualTo []); +([currentWeapon _unit] call FUNC(getDetectorConfig)) isNotEqualTo []; diff --git a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf index 6d88197819..4f0324597f 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf @@ -41,7 +41,7 @@ if ((_distanceToProjectile > _seekerMaxRangeSqr) || { _wireCut }) exitWith { if (_seekerTargetPos isEqualTo [0, 0, 0] || { _distanceToProjectile < _seekerMinRangeSqr }) exitWith { // cut wire if its caught on terrain - /*if !(lineIntersectsSurfaces [getPosASL _shooter, _projectilePos, _shooter] isEqualTo []) then { + /*if (lineIntersectsSurfaces [getPosASL _shooter, _projectilePos, _shooter] isNotEqualTo []) then { _attackProfileStateParams set [1, true]; };*/ // return position 50m infront of projectile diff --git a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf index e107805496..de01b476b6 100644 --- a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf +++ b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf @@ -27,7 +27,7 @@ private _seekerFunction = getText (configFile >> QGVAR(SeekerTypes) >> _seekerTy private _seekerTargetPos = _this call (missionNamespace getVariable _seekerFunction); if ((isNil "_seekerTargetPos") || {_seekerTargetPos isEqualTo [0,0,0]}) then { // A return of nil or [0,0,0] indicates the seeker has no target - if (_seekLastTargetPos && {!(_lastKnownPos isEqualTo [0,0,0])}) then { // if enabled for the ammo, use last known position if we have one stored + if (_seekLastTargetPos && {_lastKnownPos isNotEqualTo [0,0,0]}) then { // if enabled for the ammo, use last known position if we have one stored TRACE_2("seeker returned bad pos - using last known",_seekLastTargetPos,_lastKnownPos); _seekerTargetPos = _lastKnownPos; #ifdef DRAW_GUIDANCE_INFO diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf index e218e27e54..8050dfcff5 100644 --- a/addons/missileguidance/functions/fnc_guidancePFH.sqf +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -56,7 +56,7 @@ private _profileAdjustedTargetPos = [_seekerTargetPos, _args, _attackProfileStat // If we have no seeker target, then do not change anything // If there is no deflection on the missile, this cannot change and therefore is redundant. Avoid calculations for missiles without any deflection -if ((_minDeflection != 0 || {_maxDeflection != 0}) && {!(_profileAdjustedTargetPos isEqualTo [0,0,0])}) then { +if ((_minDeflection != 0 || {_maxDeflection != 0}) && {_profileAdjustedTargetPos isNotEqualTo [0,0,0]}) then { private _targetVector = _projectilePos vectorFromTo _profileAdjustedTargetPos; private _adjustVector = _targetVector vectorDiff (vectorDir _projectile); diff --git a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf index 9f470c1960..2d0a1e9170 100644 --- a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf @@ -53,7 +53,7 @@ private _testDotProduct = (_lookDirection vectorDotProduct _testPointVector); private _testIntersections = lineIntersectsSurfaces [_shooterPos, _projPos, _shooter]; -if ((_testDotProduct < (cos _seekerAngle)) || { !(_testIntersections isEqualTo []) }) exitWith { +if ((_testDotProduct < (cos _seekerAngle)) || {_testIntersections isNotEqualTo []}) exitWith { // out of LOS of seeker [0, 0, 0] }; diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index b400e2d6fa..a3d7f80ed2 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -56,7 +56,7 @@ if (isClass (configFile >> "CfgPatches" >> "acre_api")) then { [{ private _oldSetting = ACE_player getVariable [QGVAR(isSpeakingInGame), false]; private _newSetting = (!(isNull findDisplay 55)); - if (!(_oldSetting isEqualTo _newSetting)) then { + if (_oldSetting isNotEqualTo _newSetting) then { ACE_player setVariable [QGVAR(isSpeakingInGame), _newSetting, true]; }; } , 0.1, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index fb5d29807a..3b348fa824 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -113,7 +113,7 @@ if (_enabledTagsNearby) then { private _centerOffsetFactor = 1; if (GVAR(showPlayerNames) == 5) then { private _screenPos = worldToScreen (_target modelToWorld (_target selectionPosition "head")); - if !(_screenPos isEqualTo []) then { + if (_screenPos isNotEqualTo []) then { // Distance from center / half of screen width _centerOffsetFactor = 1 - ((_screenPos distance2D [0.5, 0.5]) / (safezoneW / 3)); } else { diff --git a/addons/nightvision/functions/fnc_pfeh.sqf b/addons/nightvision/functions/fnc_pfeh.sqf index 82e6a3cf34..794fe9b555 100644 --- a/addons/nightvision/functions/fnc_pfeh.sqf +++ b/addons/nightvision/functions/fnc_pfeh.sqf @@ -45,7 +45,7 @@ if (!GVAR(running)) then { // Scale Border / Hex BEGIN_COUNTER(borderScaling); private _scale = (call EFUNC(common,getZoom)) * 1.12513; -if (!(GVAR(defaultPositionBorder) isEqualTo [])) then { +if (GVAR(defaultPositionBorder) isNotEqualTo []) then { // Prevents issues when "zooming out" on ultra wide monitors - The square mask would be narrower than the screen if ((GVAR(defaultPositionBorder) select 2) * _scale < safeZoneW) then { _scale = safeZoneW / (GVAR(defaultPositionBorder) select 2); @@ -57,7 +57,7 @@ if (!(GVAR(defaultPositionBorder) isEqualTo [])) then { }; END_COUNTER(borderScaling); -if !(IS_MAGNIFIED isEqualTo GVAR(isUsingMagnification)) then { +if (IS_MAGNIFIED isNotEqualTo GVAR(isUsingMagnification)) then { GVAR(isUsingMagnification) = IS_MAGNIFIED; GVAR(nextEffectsUpdate) = -1; }; diff --git a/addons/nlaw/functions/fnc_attackProfile.sqf b/addons/nlaw/functions/fnc_attackProfile.sqf index acc4330083..21f77f0ff5 100644 --- a/addons/nlaw/functions/fnc_attackProfile.sqf +++ b/addons/nlaw/functions/fnc_attackProfile.sqf @@ -24,7 +24,7 @@ _targetLaunchParams params ["", "", "_launchPos"]; _firedEH params ["","","","","","","_projectile"]; // Use seeker (if terminal) -if (!(_seekerTargetPos isEqualTo [0,0,0])) exitWith {_seekerTargetPos}; +if (_seekerTargetPos isNotEqualTo [0,0,0]) exitWith {_seekerTargetPos}; _attackProfileStateParams params ["_startTime", "_startLOS", "_yawChange", "_pitchChange"]; (_startLOS call CBA_fnc_vect2Polar) params ["", "_yaw", "_pitch"]; diff --git a/addons/nlaw/functions/fnc_seeker.sqf b/addons/nlaw/functions/fnc_seeker.sqf index eeb2e0794c..af9b349cc2 100644 --- a/addons/nlaw/functions/fnc_seeker.sqf +++ b/addons/nlaw/functions/fnc_seeker.sqf @@ -54,7 +54,7 @@ if ((_projPos distance _launchPos) >= 20) then { // Limit scan to 5 meters directly down (shaped charge jet has a very limited range) private _res = lineIntersectsSurfaces [_virtualPos, (_virtualPos vectorAdd [0,0,-5]), _projectile]; - if (!(_res isEqualTo [])) then { + if (_res isNotEqualTo []) then { (_res select 0) params ["_targetPos", "", "_target"]; if ((_target isKindOf "Tank") || {_target isKindOf "Car"} || {_target isKindOf "Air"}) exitWith { TRACE_3("Firing shaped charge down",_target,_targetPos distance _virtualPos,_frameDistance); @@ -74,7 +74,7 @@ if ((_projPos distance _launchPos) >= 20) then { _shapedCharage setVelocity [0,0,-300]; _seekerStateParams set [1, true]; - + END_COUNTER(targetScan); breakOut "targetScan"; }; diff --git a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf index 8fd2f9c840..94f5ff6de5 100644 --- a/addons/quickmount/functions/fnc_canShowFreeSeats.sqf +++ b/addons/quickmount/functions/fnc_canShowFreeSeats.sqf @@ -45,6 +45,6 @@ GVAR(enabled) // we have to cache subactions in args and reuse them in insertChildren code private _subActions = _this call FUNC(addFreeSeatsActions); _args set [0, _subActions]; - !([] isEqualTo _subActions) + [] isNotEqualTo _subActions } } diff --git a/addons/quickmount/functions/fnc_getInNearest.sqf b/addons/quickmount/functions/fnc_getInNearest.sqf index 341568e24a..f947765d78 100644 --- a/addons/quickmount/functions/fnc_getInNearest.sqf +++ b/addons/quickmount/functions/fnc_getInNearest.sqf @@ -77,7 +77,7 @@ if (!isNull _target && // Seats can be locked independently of the main vehicle if ((_role == "driver") && {lockedDriver _target}) exitWith {TRACE_1("lockedDriver",_x);}; if ((_cargoIndex >= 0) && {_target lockedCargo _cargoIndex}) exitWith {TRACE_1("lockedCargo",_x);}; - if ((!(_turretPath isEqualTo [])) && {_target lockedTurret _turretPath}) exitWith {TRACE_1("lockedTurret",_x);}; + if ((_turretPath isNotEqualTo []) && {_target lockedTurret _turretPath}) exitWith {TRACE_1("lockedTurret",_x);}; if (_effectiveRole == "turret") then { private _turretConfig = [_target, _turretPath] call CBA_fnc_getTurret; @@ -95,7 +95,7 @@ if (!isNull _target && TRACE_2("",_effectiveRole,_x); if (_effectiveRole != _desiredRole) exitWith {}; - if (!(_turretPath isEqualTo [])) then { + if (_turretPath isNotEqualTo []) then { // Using GetInTurret seems to solve problems with incorrect GetInEH params when gunner/commander ACE_player action ["GetInTurret", _target, _turretPath]; TRACE_3("Geting In Turret",_x,_role,_turretPath); diff --git a/addons/rearm/functions/fnc_addMagazineToSupply.sqf b/addons/rearm/functions/fnc_addMagazineToSupply.sqf index 1f646e3598..cb9156ef9a 100644 --- a/addons/rearm/functions/fnc_addMagazineToSupply.sqf +++ b/addons/rearm/functions/fnc_addMagazineToSupply.sqf @@ -49,7 +49,7 @@ if (GVAR(supply) == 2) then { private _magazineIdx = -1; { _x params ["_magazine", "_rounds"]; - if ((_magazine isEqualTo _magazineClass)) exitWith { + if (_magazine isEqualTo _magazineClass) exitWith { _magazineIdx = _forEachIndex; }; } forEach _magazineSupply; diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index 4557532f56..86db3eef78 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -43,7 +43,7 @@ private _vehicleActions = []; TRACE_2("can add",_x,_magazineHelper); - if (!(_magazineHelper isEqualTo [])) then { + if (_magazineHelper isNotEqualTo []) then { private _icon = getText(configOf _vehicle >> "Icon"); if !((_icon select [0, 1]) == "\") then { _icon = ""; @@ -92,7 +92,7 @@ private _vehicleActions = []; }; } forEach _vehicles; -if (!(_cswCarryMagazines isEqualTo [])) then { +if (_cswCarryMagazines isNotEqualTo []) then { _cswCarryMagazines = _cswCarryMagazines arrayIntersect _cswCarryMagazines; _cswCarryMagazines = _cswCarryMagazines select {[_truck, _x] call FUNC(hasEnoughSupply)}; private _baseAction = [QGVAR(cswTake), "CSW", "", {}, {true}] call EFUNC(interact_menu,createAction); diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf index ca583e482a..2dce270741 100644 --- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf +++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf @@ -41,7 +41,7 @@ private _pylonConfigs = configProperties [configOf _vehicle >> "Components" >> " private _pylonMagazine = (getPylonMagazines _vehicle) select (_pylonIndex - 1); // Only care about pylons that have a magazine. - if (!(_pylonMagazine isEqualTo "")) then { + if (_pylonMagazine isNotEqualTo "") then { private _maxRounds = getNumber (configFile >> "CfgMagazines" >> _pylonMagazine >> "count"); private _currentRounds = _vehicle ammoOnPylon _pylonIndex; diff --git a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf index b6e6c4d0d2..af18dd8c47 100644 --- a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf +++ b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf @@ -57,7 +57,7 @@ if (GVAR(supply) == 2) then { private _magazineIdx = -1; { _x params ["_magazine"]; - if ((_magazine isEqualTo _magazineClass)) exitWith { + if (_magazine isEqualTo _magazineClass) exitWith { _magazineIdx = _forEachIndex; }; } forEach _magazineSupply; diff --git a/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf b/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf index a8b83c723a..a999077d57 100644 --- a/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf +++ b/addons/rearm/functions/fnc_setTurretMagazineAmmo.sqf @@ -77,7 +77,7 @@ if (!_magLoadedInWeapon) then { { _x params ["_loopMagClass", "_loopAmmoCounts"]; - if (!(_loopMagClass isEqualTo _magazineClass)) then { + if (_loopMagClass isNotEqualTo _magazineClass) then { { _vehicle addMagazineTurret [_loopMagClass, _turretPath, _x]; } forEach _loopAmmoCounts; diff --git a/addons/refuel/Cfg3DEN.hpp b/addons/refuel/Cfg3DEN.hpp index e8ed2790f8..3383107995 100644 --- a/addons/refuel/Cfg3DEN.hpp +++ b/addons/refuel/Cfg3DEN.hpp @@ -25,7 +25,7 @@ class Cfg3DEN { tooltip = CSTRING(hooks_edenDesc); property = QGVAR(hooks); control = "EditXYZ"; - expression = QUOTE(if !(_value isEqualTo DEFAULT_HOOKS) then {_this setVariable [ARR_3('%s',[_value],true)]}); + expression = QUOTE(if (_value isNotEqualTo DEFAULT_HOOKS) then {_this setVariable [ARR_3('%s',[_value],true)]}); defaultValue = QUOTE(DEFAULT_HOOKS); condition = "(1-objectBrain)*(1-objectAgent)"; }; diff --git a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf index d33bb4f100..7922a9cb91 100644 --- a/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf +++ b/addons/refuel/functions/fnc_startNozzleInHandsPFH.sqf @@ -38,7 +38,7 @@ TRACE_2("start",_unit,_nozzle); alive _unit && {"" isEqualTo currentWeapon _unit || {_unit call EFUNC(common,isSwimming)}} && {[_unit, objNull, [INTERACT_EXCEPTIONS, "notOnMap"]] call EFUNC(common,canInteractWith)} - && {!("unconscious" isEqualTo toLower animationState _unit)} + && {"unconscious" isNotEqualTo toLower animationState _unit} && {!(_unit getVariable ["ACE_isUnconscious", false])} ) exitWith { TRACE_3("stop dead/weapon/interact/uncon",_unit,alive _unit,currentWeapon _unit); @@ -71,7 +71,7 @@ TRACE_2("start",_unit,_nozzle); END_PFH }; - if !(_unit == vehicle _unit && {_unit isEqualTo ACE_player}) exitWith { + if (_unit == vehicle _unit && {_unit isNotEqualTo ACE_player}) exitWith { TRACE_2("stop vehicle/player",_unit,vehicle _unit); DROP_NOZZLE UNHOLSTER_WEAPON @@ -107,7 +107,7 @@ TRACE_2("start",_unit,_nozzle); }; private _hint = [_hintLMB, _hintRMB]; - if !(_hint isEqualTo (_unit getVariable [QGVAR(hint), []])) then { + if (_hint isNotEqualTo (_unit getVariable [QGVAR(hint), []])) then { _unit setVariable [QGVAR(hint), _hint]; _hint call EFUNC(interaction,showMouseHint); }; diff --git a/addons/repair/functions/fnc_addRepairActions.sqf b/addons/repair/functions/fnc_addRepairActions.sqf index 96eff28d4a..af9c78361e 100644 --- a/addons/repair/functions/fnc_addRepairActions.sqf +++ b/addons/repair/functions/fnc_addRepairActions.sqf @@ -92,7 +92,7 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi { private _turretHitpointCfg = ([_vehCfg, _x] call CBA_fnc_getTurret) >> "HitPoints"; private _hitpointsCfg = "configName _x == _hitpoint" configClasses _turretHitpointCfg; - if (!(_hitpointsCfg isEqualTo [])) exitWith { + if (_hitpointsCfg isNotEqualTo []) exitWith { TRACE_2("turret hitpoint configFound",_hitpoint,_x); // only do turret hitpoints for now or we get some weird stuff if ((_hitpoint in ["hitturret", "hitgun"]) || {(getNumber (_hitpointsCfg # 0 >> "isGun")) == 1} || {(getNumber (_hitpointsCfg # 0 >> "isTurret")) == 1}) then { diff --git a/addons/repair/functions/fnc_canRepair.sqf b/addons/repair/functions/fnc_canRepair.sqf index 2b9ac71364..e6873649cb 100644 --- a/addons/repair/functions/fnc_canRepair.sqf +++ b/addons/repair/functions/fnc_canRepair.sqf @@ -95,7 +95,7 @@ if (!_return) exitWith {false}; //Check that there are required objects nearby private _requiredObjects = getArray (_config >> "claimObjects"); -if (!(_requiredObjects isEqualTo [])) then { +if (_requiredObjects isNotEqualTo []) then { private _objectsAvailable = [_caller, 5, _requiredObjects] call FUNC(getClaimObjects); if (_objectsAvailable isEqualTo []) then { TRACE_2("Missing Required Objects",_requiredObjects,_objectsAvailable); diff --git a/addons/repair/functions/fnc_repair.sqf b/addons/repair/functions/fnc_repair.sqf index 826187f6cc..6b5094fb28 100644 --- a/addons/repair/functions/fnc_repair.sqf +++ b/addons/repair/functions/fnc_repair.sqf @@ -99,7 +99,7 @@ if (!("All" in _repairLocations)) then { private _requiredObjects = getArray (_config >> "claimObjects"); private _claimObjectsAvailable = []; -if (!(_requiredObjects isEqualTo [])) then { +if (_requiredObjects isNotEqualTo []) then { _claimObjectsAvailable = [_caller, 5, _requiredObjects] call FUNC(getClaimObjects); if (_claimObjectsAvailable isEqualTo []) then { TRACE_2("Missing Required Objects",_requiredObjects,_claimObjectsAvailable); diff --git a/addons/safemode/functions/fnc_setWeaponSafety.sqf b/addons/safemode/functions/fnc_setWeaponSafety.sqf index 4ad0174b20..54732857af 100644 --- a/addons/safemode/functions/fnc_setWeaponSafety.sqf +++ b/addons/safemode/functions/fnc_setWeaponSafety.sqf @@ -31,6 +31,6 @@ _weapon = configName (configFile >> "CfgWeapons" >> _weapon); private _muzzle = currentMuzzle _unit; -if !(_state isEqualTo (_weapon in _safedWeapons)) then { +if (_state isNotEqualTo (_weapon in _safedWeapons)) then { [_unit, _weapon, _muzzle] call FUNC(lockSafety); }; diff --git a/addons/scopes/ACE_Arsenal_Stats.hpp b/addons/scopes/ACE_Arsenal_Stats.hpp index 1e2ebd91ea..06143be886 100644 --- a/addons/scopes/ACE_Arsenal_Stats.hpp +++ b/addons/scopes/ACE_Arsenal_Stats.hpp @@ -7,7 +7,7 @@ class EGVAR(arsenal,stats) { displayName = CSTRING(statHorizontalLimits); showText = 1; textStatement = QUOTE(params[ARR_2('_stat','_config')]; private _limits = getArray (_config >> _stat select 0); format [ARR_4('%1 / %2 MIL (∆ %3 MIL)', _limits select 0, _limits select 1, getNumber (_config >> _stat select 1))]); - condition = QUOTE(params[ARR_2('_stat', '_config')]; !((getArray (_config >> _stat select 0)) isEqualTo [])); + condition = QUOTE(params[ARR_2('_stat', '_config')]; (getArray (_config >> _stat select 0)) isNotEqualTo []); tabs[] = {{}, {0}}; }; class ACE_scopeVerticalLimits: ACE_scopeHorizontalLimits { diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index 68a76e6ffe..f295103d03 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -74,8 +74,8 @@ private _newOptics = [_player] call FUNC(getOptics); (GVAR(scopeAdjust) select _forEachIndex) set [1, _verticalIncrement]; (GVAR(scopeAdjust) select _forEachIndex) set [2, _maxHorizontal]; (GVAR(scopeAdjust) select _forEachIndex) set [3, _horizontalIncrement]; - GVAR(canAdjustElevation) set [_forEachIndex, (_verticalIncrement > 0) && !(_maxVertical isEqualTo [0, 0])]; - GVAR(canAdjustWindage) set [_forEachIndex, (_horizontalIncrement > 0) && !(_maxHorizontal isEqualTo [0, 0])]; + GVAR(canAdjustElevation) set [_forEachIndex, (_verticalIncrement > 0) && (_maxVertical isNotEqualTo [0, 0])]; + GVAR(canAdjustWindage) set [_forEachIndex, (_horizontalIncrement > 0) && (_maxHorizontal isNotEqualTo [0, 0])]; }; } forEach GVAR(Optics); @@ -112,8 +112,8 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo (GVAR(scopeAdjust) select _x) set [1, _verticalIncrement]; (GVAR(scopeAdjust) select _x) set [2, _maxHorizontal]; (GVAR(scopeAdjust) select _x) set [3, _horizontalIncrement]; - GVAR(canAdjustElevation) set [_x, (_verticalIncrement > 0) && !(_maxVertical isEqualTo [0, 0])]; - GVAR(canAdjustWindage) set [_x, (_horizontalIncrement > 0) && !(_maxHorizontal isEqualTo [0, 0])]; + GVAR(canAdjustElevation) set [_x, (_verticalIncrement > 0) && (_maxVertical isNotEqualTo [0, 0])]; + GVAR(canAdjustWindage) set [_x, (_horizontalIncrement > 0) && (_maxHorizontal isNotEqualTo [0, 0])]; }; // The optic or the weapon changed, reset the adjustment @@ -123,7 +123,7 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo _persistentZero = 0; }; private _defaultElevation = [0, 300] select GVAR(simplifiedZeroing); - if (!((_adjustment select _forEachIndex) isEqualTo [_defaultElevation, 0, _persistentZero])) then { + if ((_adjustment select _forEachIndex) isNotEqualTo [_defaultElevation, 0, _persistentZero]) then { _adjustment set [_forEachIndex, [_defaultElevation, 0, _persistentZero]]; _updateAdjustment = true; }; @@ -131,11 +131,11 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo } forEach [0, 1, 2]; if (GVAR(correctZeroing) || GVAR(simplifiedZeroing)) then { - if (!(_unitBaseAngle isEqualTo (_player getVariable [QGVAR(baseAngle), [0,0,0]]))) then { + if (_unitBaseAngle isNotEqualTo (_player getVariable [QGVAR(baseAngle), [0,0,0]])) then { TRACE_2("syncing",_unitBaseAngle,_player getVariable QGVAR(baseAngle)); _player setVariable [QGVAR(baseAngle), _unitBaseAngle, true]; }; - if (!(_unitBoreHeight isEqualTo (_player getVariable [QGVAR(boreHeight), [0,0,0]]))) then { + if (_unitBoreHeight isNotEqualTo (_player getVariable [QGVAR(boreHeight), [0,0,0]])) then { TRACE_2("syncing",_unitBoreHeight,_player getVariable QGVAR(boreHeight)); _player setVariable [QGVAR(boreHeight), _unitBoreHeight, true]; }; diff --git a/addons/spectator/functions/fnc_cam_toggleSlow.sqf b/addons/spectator/functions/fnc_cam_toggleSlow.sqf index 47ad2a2106..e6b8732cdb 100644 --- a/addons/spectator/functions/fnc_cam_toggleSlow.sqf +++ b/addons/spectator/functions/fnc_cam_toggleSlow.sqf @@ -17,7 +17,7 @@ params ["_slowSpeed"]; -if !(GVAR(camSlow) isEqualTo _slowSpeed) then { +if (GVAR(camSlow) isNotEqualTo _slowSpeed) then { private _camera = GVAR(camera); if (GVAR(camMode) == MODE_FREE) then { diff --git a/addons/spectator/functions/fnc_ui_draw3D.sqf b/addons/spectator/functions/fnc_ui_draw3D.sqf index 744e1bfe5e..6affd3f8b6 100644 --- a/addons/spectator/functions/fnc_ui_draw3D.sqf +++ b/addons/spectator/functions/fnc_ui_draw3D.sqf @@ -30,7 +30,7 @@ private _end = AGLToASL screenToWorld getMousePosition; if ((_start distanceSqr _end) <= DISTANCE_NAMES_SQR) then { private _intersections = lineIntersectsSurfaces [_start, _end, _camTarget, _camTargetVeh]; - if !(_intersections isEqualTo []) then { + if (_intersections isNotEqualTo []) then { _cursorObject = effectiveCommander ((_intersections select 0) select 3); }; }; @@ -112,7 +112,7 @@ if !(GVAR(uiMapVisible)) then { private _oldLoc = []; { _x params ["_locNew", "_colorNew"]; - if !(_oldLoc isEqualTo []) then { + if (_oldLoc isNotEqualTo []) then { drawLine3D [_oldLoc, _locNew, _colorNew]; }; _oldLoc = _locNew; diff --git a/addons/spectator/functions/fnc_ui_updateListEntities.sqf b/addons/spectator/functions/fnc_ui_updateListEntities.sqf index 640f860ec0..228dd86a27 100644 --- a/addons/spectator/functions/fnc_ui_updateListEntities.sqf +++ b/addons/spectator/functions/fnc_ui_updateListEntities.sqf @@ -35,7 +35,7 @@ private _entities = [true] call FUNC(getTargetEntities); // Include the group if it contains valid entities private _entitiesGroup = units _group arrayIntersect _entities; - if !(_entitiesGroup isEqualTo []) then { + if (_entitiesGroup isNotEqualTo []) then { // Cache the info of valid units in the group private _unitsInfo = []; { @@ -81,7 +81,7 @@ private _entities = [true] call FUNC(getTargetEntities); } forEach allGroups; // Whether an update to the list is required (really only if something changed) -if !(GVAR(curList) isEqualTo _newList) then { +if (GVAR(curList) isNotEqualTo _newList) then { private _ctrl = CTRL_LIST; // Remove groups/units that are no longer there diff --git a/addons/tagging/functions/fnc_compileConfigTags.sqf b/addons/tagging/functions/fnc_compileConfigTags.sqf index be88a3df62..0fea0693b8 100644 --- a/addons/tagging/functions/fnc_compileConfigTags.sqf +++ b/addons/tagging/functions/fnc_compileConfigTags.sqf @@ -19,7 +19,7 @@ private _class = configName _x; private _result = [_x, false] call FUNC(parseConfigTag); - if !(_result isEqualTo []) then { + if (_result isNotEqualTo []) then { _result params ["_tagInfo", "_requiredItem"]; GVAR(cachedTags) pushBack _tagInfo; @@ -31,7 +31,7 @@ private _class = configName _x; private _result = [_x, true] call FUNC(parseConfigTag); - if !(_result isEqualTo []) then { + if (_result isNotEqualTo []) then { _result params ["_tagInfo", "_requiredItem"]; GVAR(cachedTags) pushBack _tagInfo; diff --git a/addons/tagging/functions/fnc_quickTag.sqf b/addons/tagging/functions/fnc_quickTag.sqf index 7c61dc7b37..0ba5cbb338 100644 --- a/addons/tagging/functions/fnc_quickTag.sqf +++ b/addons/tagging/functions/fnc_quickTag.sqf @@ -47,7 +47,7 @@ if (GVAR(quickTag) == 3) then { }; // Tag -if !(_possibleTags isEqualTo []) then { +if (_possibleTags isNotEqualTo []) then { private _availableTags = _possibleTags select {(_x select 2) in (_unit call EFUNC(common,uniqueItems))}; (selectRandom _availableTags) params ["", "", "", "_textures", "", "_materials", "_tagModel"]; diff --git a/addons/tagging/functions/fnc_tag.sqf b/addons/tagging/functions/fnc_tag.sqf index ce3aa86bbc..b476145c57 100644 --- a/addons/tagging/functions/fnc_tag.sqf +++ b/addons/tagging/functions/fnc_tag.sqf @@ -95,7 +95,7 @@ private _fnc_isOk = { // If there's no intersections if (_intersections isEqualTo []) exitWith {false;}; - if !(((_intersections select 0) select 3) isEqualTo _object) exitWith {false;}; + if (((_intersections select 0) select 3) isNotEqualTo _object) exitWith {false;}; true }; diff --git a/addons/zeus/functions/fnc_moduleSuicideBomber.sqf b/addons/zeus/functions/fnc_moduleSuicideBomber.sqf index 47ada09c00..9e37b65389 100644 --- a/addons/zeus/functions/fnc_moduleSuicideBomber.sqf +++ b/addons/zeus/functions/fnc_moduleSuicideBomber.sqf @@ -61,7 +61,7 @@ if (_autoSeek) then { // Detonation private _nearObjects = (_unit nearObjects _activationRadius) select {side _x == _activationSide && {_x != _unit} && {alive _x}}; - if !(_nearObjects isEqualTo []) then { + if (_nearObjects isNotEqualTo []) then { createVehicle [EXPLOSIVES select _explosionSize, _unit, [], 0, "CAN_COLLIDE"]; [_pfhID] call CBA_fnc_removePerFrameHandler; LOG("Explosion created, PFH removed"); diff --git a/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf b/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf index 3f169028a5..331c458a07 100644 --- a/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf +++ b/addons/zeus/functions/fnc_moduleToggleFlashlight.sqf @@ -25,10 +25,10 @@ TRACE_1("params",_this); private _units = []; if (_target == -1) then { - _units = (units attachedTo _logic) select {alive _x && {!([_x] call EFUNC(common,isPlayer))} && {!(currentWeapon _x isEqualTo "")}}; + _units = (units attachedTo _logic) select {alive _x && {!([_x] call EFUNC(common,isPlayer))} && {currentWeapon _x isNotEqualTo ""}}; } else { private _side = [west, east, independent, civilian] select _target; - _units = allUnits select {alive _x && {side _x == _side} && {!([_x] call EFUNC(common,isPlayer))} && {!(currentWeapon _x isEqualTo "")}}; + _units = allUnits select {alive _x && {side _x == _side} && {!([_x] call EFUNC(common,isPlayer))} && {currentWeapon _x isNotEqualTo ""}}; }; // Toggle flashlights for units @@ -38,7 +38,7 @@ if (_toggle) then { private _weapon = currentWeapon _x; private _pointer = (_x weaponAccessories _weapon) select 1; - if (!(_pointer isEqualTo "") && {getNumber (_cfgWeapons >> _pointer >> "ItemInfo" >> "FlashLight" >> "size") > 0}) then { + if ((_pointer isNotEqualTo "") && {getNumber (_cfgWeapons >> _pointer >> "ItemInfo" >> "FlashLight" >> "size") > 0}) then { [QEGVAR(ai,enableGunLights), [_x, "forceOn"], _x] call CBA_fnc_targetEvent; } else { if (_addGear) then { diff --git a/addons/zeus/functions/fnc_moduleToggleNvg.sqf b/addons/zeus/functions/fnc_moduleToggleNvg.sqf index 3f91286534..68fda8edb3 100644 --- a/addons/zeus/functions/fnc_moduleToggleNvg.sqf +++ b/addons/zeus/functions/fnc_moduleToggleNvg.sqf @@ -39,15 +39,15 @@ if (_toggle) then { // Get NVG item and helmet from unit config private _linkedItems = getArray (configOf _x >> "linkedItems"); private _nvgItem = _linkedItems select {_x isKindOf ["NVGoggles", _cfgWeapons]}; - private _nvgHelmet = _linkedItems select {!(getArray (_cfgWeapons >> _x >> "subItems") isEqualTo [])}; + private _nvgHelmet = _linkedItems select {getArray (_cfgWeapons >> _x >> "subItems") isNotEqualTo []}; // Add NVG helmet if defined - if !(_nvgHelmet isEqualTo []) exitWith { + if (_nvgHelmet isNotEqualTo []) exitWith { _x addHeadgear (_nvgHelmet select 0); }; // Add NVGs if defined - if !(_nvgItem isEqualTo []) exitWith { + if (_nvgItem isNotEqualTo []) exitWith { _x linkItem (_nvgItem select 0); }; @@ -66,7 +66,7 @@ if (_toggle) then { removeHeadgear _x; }; - if !(_nvgItem isEqualTo "") then { + if (_nvgItem isNotEqualTo "") then { _x unlinkItem _nvgItem; }; } forEach _units; diff --git a/addons/zeus/functions/fnc_ui_toggleNvg.sqf b/addons/zeus/functions/fnc_ui_toggleNvg.sqf index 037c216205..e32ee9f715 100644 --- a/addons/zeus/functions/fnc_ui_toggleNvg.sqf +++ b/addons/zeus/functions/fnc_ui_toggleNvg.sqf @@ -53,7 +53,7 @@ if !(isNull _unit) then { if (isNull _unit) then { (_display displayCtrl 92856) lbDelete 0; } else { - (_display displayCtrl 92855) lbSetCurSel ([0, 1] select !(hmd _unit isEqualTo "")); + (_display displayCtrl 92855) lbSetCurSel ([0, 1] select (hmd _unit isNotEqualTo "")); }; private _fnc_onUnload = { diff --git a/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf b/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf index b43a530728..ada3609895 100644 --- a/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf +++ b/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf @@ -27,8 +27,8 @@ private _baseClasses = []; } count ( ("!isNull (_x >> 'modelSides') &&" + "{(_x >> 'modelSides') in (configProperties [_x, 'true', false])} &&" + - "{!(getArray (_x >> 'modelSides') isEqualTo [6])} &&" + - "{!(getArray (_x >> 'modelSides') isEqualTo [0,1,2,3])}") + "{getArray (_x >> 'modelSides') isNotEqualTo [6]} &&" + + "{getArray (_x >> 'modelSides') isNotEqualTo [0,1,2,3]}") configClasses (configFile >> "CfgVehicles") ); From b2da1792e15943dfbf8ec361d27b676a495845cb Mon Sep 17 00:00:00 2001 From: pterolatypus Date: Sat, 27 Feb 2021 17:06:37 +0000 Subject: [PATCH 085/335] Medical Treatment - Settings to limit IVs to certain locations (#8116) * Settings to limit IVs to certain locations * Changed to one setting * Reworded settings for consistency --- .../medical_treatment/ACE_Medical_Treatment_Actions.hpp | 1 + addons/medical_treatment/initSettings.sqf | 9 +++++++++ addons/medical_treatment/stringtable.xml | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index 1308f4bcea..d821fe5e16 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -150,6 +150,7 @@ class GVAR(actions) { medicRequired = QGVAR(medicIV); treatmentTime = QGVAR(treatmentTimeIV); items[] = {"ACE_bloodIV"}; + treatmentLocations = QGVAR(locationIV); condition = ""; callbackSuccess = QFUNC(ivBag); animationMedic = "AinvPknlMstpSnonWnonDnon_medic1"; diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf index b7b559594b..5352f7545f 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -224,6 +224,15 @@ true ] call CBA_fnc_addSetting; +[ + QGVAR(locationIV), + "LIST", + [LSTRING(LocationIV_DisplayName), LSTRING(LocationIV_Description)], + [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], + [[0, 1, 2, 3, 4], [ELSTRING(common,Anywhere), ELSTRING(common,Vehicle), LSTRING(MedicalFacilities), LSTRING(VehiclesAndFacilities), ELSTRING(common,Disabled)], 0], + 1 +] call CBA_fnc_addSetting; + [ QGVAR(allowSelfIV), "LIST", diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 4bf6cafb16..971110a990 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -671,6 +671,12 @@ Úroveň výcviku nutná pro IV transfuzi. Уровень навыка требуемый для переливания крови IV группы. + + Locations IV Transfusion + + + Controls where IV transfusions can be performed. + Convert Vanilla Items Standard Arma-Equipment in ACE-Items umwandeln From 4d71607e81177fd73b1229487957e863f6b33956 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Sat, 27 Feb 2021 18:21:26 +0100 Subject: [PATCH 086/335] Arsenal - Less magic numbers (#8089) * Add macro for virtualItems index 0 (weapons) * Add macro for virtualItems index 1 (attachments) * Add macro for virtualItems index 2 (all items) * Add macro for virtualItems index 3 (headgear) * Add macro for virtualItems index 4 (uniform) * Add macro for virtualItems index 5 (vest) * Add macro for virtualItems index 6 (backpack) * Add macro for virtualItems index 7 (goggles) --- addons/arsenal/defines.hpp | 12 ++++++++++++ addons/arsenal/functions/fnc_fillLeftPanel.sqf | 12 ++++++------ addons/arsenal/functions/fnc_fillRightPanel.sqf | 8 ++++---- addons/arsenal/functions/fnc_onArsenalOpen.sqf | 10 +++++----- .../arsenal/functions/fnc_updateUniqueItemsList.sqf | 12 ++++++------ addons/arsenal/functions/fnc_verifyLoadout.sqf | 12 ++++++------ 6 files changed, 39 insertions(+), 27 deletions(-) diff --git a/addons/arsenal/defines.hpp b/addons/arsenal/defines.hpp index fd71c5eaee..5e1bda07d1 100644 --- a/addons/arsenal/defines.hpp +++ b/addons/arsenal/defines.hpp @@ -165,6 +165,18 @@ #define IDC_ATTRIBUTE_IMPORT_BUTTON 8109 #define IDC_ATTRIBUTE_ADD_COMPATIBLE 8110 +// Indexes of virtual items array +#define IDX_VIRT_WEAPONS 0 +#define IDX_VIRT_ATTACHEMENTS 1 + +#define IDX_VIRT_ITEMS_ALL 2 + +#define IDX_VIRT_HEADGEAR 3 +#define IDX_VIRT_UNIFORM 4 +#define IDX_VIRT_VEST 5 +#define IDX_VIRT_BACKPACK 6 +#define IDX_VIRT_GOGGLES 7 + #define SYMBOL_ITEM_NONE "−" #define SYMBOL_ITEM_REMOVE "×" #define SYMBOL_ITEM_VIRTUAL "∞" diff --git a/addons/arsenal/functions/fnc_fillLeftPanel.sqf b/addons/arsenal/functions/fnc_fillLeftPanel.sqf index 179b6a2ed3..42c693615c 100644 --- a/addons/arsenal/functions/fnc_fillLeftPanel.sqf +++ b/addons/arsenal/functions/fnc_fillLeftPanel.sqf @@ -51,7 +51,7 @@ switch true do { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach ((GVAR(virtualItems) select 0) select ([IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun] find _ctrlIDC)); + } foreach ((GVAR(virtualItems) select IDX_VIRT_WEAPONS) select ([IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun] find _ctrlIDC)); }; case (_ctrlIDC in [IDC_buttonUniform, IDC_buttonVest, IDC_buttonBackpack]) : { @@ -65,19 +65,19 @@ switch true do { case IDC_buttonUniform : { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 4); + } foreach (GVAR(virtualItems) select IDX_VIRT_UNIFORM); }; case IDC_buttonVest : { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 5); + } foreach (GVAR(virtualItems) select IDX_VIRT_VEST); }; case IDC_buttonBackpack : { { ["CfgVehicles", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 6); + } foreach (GVAR(virtualItems) select IDX_VIRT_BACKPACK); }; }; }; @@ -96,12 +96,12 @@ switch true do { case IDC_buttonHeadgear: { { ["CfgWeapons", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 3); + } foreach (GVAR(virtualItems) select IDX_VIRT_HEADGEAR); }; case IDC_buttonGoggles : { { ["CfgGlasses", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach (GVAR(virtualItems) select 7); + } foreach (GVAR(virtualItems) select IDX_VIRT_GOGGLES); }; case IDC_buttonNVG : { { diff --git a/addons/arsenal/functions/fnc_fillRightPanel.sqf b/addons/arsenal/functions/fnc_fillRightPanel.sqf index f9326c6c97..509f8b6a43 100644 --- a/addons/arsenal/functions/fnc_fillRightPanel.sqf +++ b/addons/arsenal/functions/fnc_fillRightPanel.sqf @@ -224,7 +224,7 @@ switch (_ctrlIDC) do { if (_leftPanelState) then { { ["CfgMagazines", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach ((GVAR(virtualItems) select 2) arrayIntersect _compatibleMagsPrimaryMuzzle); + } foreach ((GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) arrayIntersect _compatibleMagsPrimaryMuzzle); }; }; @@ -232,14 +232,14 @@ switch (_ctrlIDC) do { if (_leftPanelState) then { { ["CfgMagazines", _x, _ctrlPanel] call FUNC(addListBoxItem); - } foreach ((GVAR(virtualItems) select 2) arrayIntersect _compatibleMagsSecondaryMuzzle); + } foreach ((GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) arrayIntersect _compatibleMagsSecondaryMuzzle); }; }; case IDC_buttonMag : { { ["CfgMagazines", _x, true] call _fnc_fill_right_Container; - } foreach ((GVAR(virtualItems) select 2) arrayIntersect _allCompatibleMags); + } foreach ((GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) arrayIntersect _allCompatibleMags); { ["CfgMagazines", _x, true, true] call _fnc_fill_right_Container; } foreach ((GVAR(virtualItems) select 19) arrayIntersect _allCompatibleMags); @@ -248,7 +248,7 @@ switch (_ctrlIDC) do { case IDC_buttonMagALL : { { ["CfgMagazines", _x, true] call _fnc_fill_right_Container; - } foreach (GVAR(virtualItems) select 2); + } foreach (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL); { ["CfgMagazines", _x, true, true] call _fnc_fill_right_Container; } foreach (GVAR(virtualItems) select 19); diff --git a/addons/arsenal/functions/fnc_onArsenalOpen.sqf b/addons/arsenal/functions/fnc_onArsenalOpen.sqf index 84ae2b28cb..51dca2c08c 100644 --- a/addons/arsenal/functions/fnc_onArsenalOpen.sqf +++ b/addons/arsenal/functions/fnc_onArsenalOpen.sqf @@ -64,7 +64,7 @@ GVAR(statsInfo) = [true, 0, controlNull, nil, nil]; for "_index" from 0 to 10 do { switch (_index) do { // primary, secondary, handgun weapons - case 0: { + case IDX_VIRT_WEAPONS: { private _array = LIST_DEFAULTS select _index; if ((_array select 0) isNotEqualTo "") then { @@ -81,7 +81,7 @@ for "_index" from 0 to 10 do { }; // Accs for the weapons above - case 1: { + case IDX_VIRT_ATTACHEMENTS: { private _array = LIST_DEFAULTS select _index; _array params ["_accsArray", "_magsArray"]; @@ -99,18 +99,18 @@ for "_index" from 0 to 10 do { if (_x isNotEqualTo []) then { if (_x select 0 != "") then { - (GVAR(virtualItems) select 2) pushBackUnique (_x select 0); + (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) pushBackUnique (_x select 0); }; if (count _x > 1 && {_x select 1 != ""}) then { - (GVAR(virtualItems) select 2) pushBackUnique (_x select 1); + (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) pushBackUnique (_x select 1); }; }; } forEach _magsArray; }; // Inventory items - case 2: { + case IDX_VIRT_ITEMS_ALL: { call FUNC(updateUniqueItemsList); }; diff --git a/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf b/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf index 7405950631..617ffde6f4 100644 --- a/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf +++ b/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf @@ -21,7 +21,7 @@ GVAR(virtualItems) set [22, [[], [], [], []]]; GVAR(virtualItems) set [23, []]; GVAR(virtualItems) set [24, []]; -private _array = LIST_DEFAULTS select 2; +private _array = LIST_DEFAULTS select IDX_VIRT_ITEMS_ALL; private _itemsCache = uiNamespace getVariable QGVAR(configItems); private _configCfgWeapons = configFile >> "CfgWeapons"; @@ -35,7 +35,7 @@ private _configGlasses = configFile >> "CfgGlasses"; case ( isClass (_configMagazines >> _x) && {_x in (_itemsCache select 2)} && - {!(_x in (GVAR(virtualItems) select 2))} + {!(_x in (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL))} ): { (GVAR(virtualItems) select 19) pushBackUnique _x; }; @@ -61,7 +61,7 @@ private _configGlasses = configFile >> "CfgGlasses"; // acc case ( isClass (_configCfgWeapons >> _x) && - {!(_x in ((GVAR(virtualItems) select 1) select 0))} && + {!(_x in ((GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS) select 0))} && {_x in ((_itemsCache select 1) select 0)} ): { ((GVAR(virtualItems) select 22) select 0) pushBackUnique _x; @@ -70,7 +70,7 @@ private _configGlasses = configFile >> "CfgGlasses"; // acc case ( isClass (_configCfgWeapons >> _x) && - {!(_x in ((GVAR(virtualItems) select 1) select 1))} && + {!(_x in ((GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS) select 1))} && {_x in ((_itemsCache select 1) select 1)} ): { ((GVAR(virtualItems) select 22) select 1) pushBackUnique _x; @@ -79,7 +79,7 @@ private _configGlasses = configFile >> "CfgGlasses"; // acc case ( isClass (_configCfgWeapons >> _x) && - {!(_x in ((GVAR(virtualItems) select 1) select 2))} && + {!(_x in ((GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS) select 2))} && {_x in ((_itemsCache select 1) select 2)} ): { ((GVAR(virtualItems) select 22) select 2) pushBackUnique _x; @@ -87,7 +87,7 @@ private _configGlasses = configFile >> "CfgGlasses"; // acc case ( isClass (_configCfgWeapons >> _x) && - {!(_x in ((GVAR(virtualItems) select 1) select 3))} && + {!(_x in ((GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS) select 3))} && {_x in ((_itemsCache select 1) select 3)} ): { ((GVAR(virtualItems) select 22) select 3) pushBackUnique _x; diff --git a/addons/arsenal/functions/fnc_verifyLoadout.sqf b/addons/arsenal/functions/fnc_verifyLoadout.sqf index 12509333bb..bacd6a11b3 100644 --- a/addons/arsenal/functions/fnc_verifyLoadout.sqf +++ b/addons/arsenal/functions/fnc_verifyLoadout.sqf @@ -19,8 +19,8 @@ private _weaponCfg = configFile >> "CfgWeapons"; private _magCfg = configFile >> "CfgMagazines"; private _vehcCfg = configFile >> "CfgVehicles"; private _glassesCfg = configFile >> "CfgGlasses"; -private _weaponsArray = GVAR(virtualItems) select 0; -private _accsArray = GVAR(virtualItems) select 1; +private _weaponsArray = GVAR(virtualItems) select IDX_VIRT_WEAPONS; +private _accsArray = GVAR(virtualItems) select IDX_VIRT_ATTACHEMENTS; private _nullItemsAmount = 0; private _unavailableItemsAmount = 0; @@ -58,7 +58,7 @@ private _fnc_weaponCheck = { private _mag = _x select 0; if (isClass (_magCfg >> _mag)) then { - if !(_mag in (GVAR(virtualItems) select 2)) then { + if !(_mag in (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL)) then { _unavailableItemsList pushBackUnique _mag; _dataPath set [_forEachIndex, []]; @@ -137,7 +137,7 @@ for "_dataIndex" from 0 to 9 do { if (isClass (_magCfg >> _item)) then { if !( - _item in (GVAR(virtualItems) select 2) || + _item in (GVAR(virtualItems) select IDX_VIRT_ITEMS_ALL) || _item in (GVAR(virtualItems) select 15) || _item in (GVAR(virtualItems) select 16) ) then { @@ -173,7 +173,7 @@ for "_dataIndex" from 0 to 9 do { if (isClass (_weaponCfg >> _item)) then { - if !(_item in (GVAR(virtualItems) select 3)) then { + if !(_item in (GVAR(virtualItems) select IDX_VIRT_HEADGEAR)) then { _unavailableItemsList pushBackUnique _item; _loadout set [_dataIndex, ""]; @@ -195,7 +195,7 @@ for "_dataIndex" from 0 to 9 do { if (isClass (_glassesCfg >> _item)) then { - if !(_item in (GVAR(virtualItems) select 7)) then { + if !(_item in (GVAR(virtualItems) select IDX_VIRT_GOGGLES)) then { _unavailableItemsList pushBackUnique _item; _loadout set [_dataIndex, ""]; From 98e74ab3d1246cb3077e8ba40f75ea09b76c5748 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Sat, 27 Feb 2021 21:50:09 +0400 Subject: [PATCH 087/335] Cook off - Fix ammo box cook off when setting is Players only (#8066) * Fix ammo box cook off when setting is Players only * Update addons/cookoff/functions/fnc_handleDamage.sqf Co-authored-by: PabstMirror --- addons/cookoff/functions/fnc_handleDamage.sqf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/cookoff/functions/fnc_handleDamage.sqf b/addons/cookoff/functions/fnc_handleDamage.sqf index 88ea717d90..8e1cd8dd17 100644 --- a/addons/cookoff/functions/fnc_handleDamage.sqf +++ b/addons/cookoff/functions/fnc_handleDamage.sqf @@ -25,7 +25,11 @@ if (damage _vehicle >= 1) exitWith {}; if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] in [0, false]) exitWith {}; // Check for players and exit if none found and the enable for players only setting is true -if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] isEqualTo 1 && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} == -1}) exitWith {}; +if ( + _vehicle getVariable [QGVAR(enable), GVAR(enable)] isEqualTo 1 + && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} == -1} + && {_simulationType isNotEqualTo "box"} +) exitWith {}; // get hitpoint name private _hitpoint = "#structural"; From 496a6d800ad084c0d07cb4d66a0a28660a566bb7 Mon Sep 17 00:00:00 2001 From: Salluci <69561145+Salluci@users.noreply.github.com> Date: Wed, 3 Mar 2021 18:30:49 -0300 Subject: [PATCH 088/335] Medical - Show "Inventory" action on unconscious units (#8083) * Update XEH_preInit.sqf * Style pass, remove double localize * only run if (hasInterface) { Co-authored-by: PabstMirror --- addons/medical_status/XEH_preInit.sqf | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/addons/medical_status/XEH_preInit.sqf b/addons/medical_status/XEH_preInit.sqf index c6343dcb63..c3e97b8ed1 100644 --- a/addons/medical_status/XEH_preInit.sqf +++ b/addons/medical_status/XEH_preInit.sqf @@ -25,4 +25,20 @@ PREP_RECOMPILE_END; addMissionEventHandler ["EntityKilled", {_this call FUNC(handleKilledMission)}]; +if (hasInterface) { + //Add Inventory action to uncon units + ["CAManBase", "init", { + params ["_unit"]; + + private _id = _unit addAction ["", { + params ["_target", "_caller", "_actionId", "_arguments"]; + + _caller action ["Gear", _target]; + }, nil, 5.1, true, true, "gear", "_target getVariable ['ACE_isUnconscious',false] && {alive _target}", 3.5]; + + _unit setUserActionText [_id, localize "STR_ACTION_GEAR", ""]; + + }, nil, nil, true] call CBA_fnc_addClassEventHandler; +}; + ADDON = true; From 22faa5123388ef48719f473b94d8b8ff8547a769 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 3 Mar 2021 15:31:07 -0600 Subject: [PATCH 089/335] Common - Fix Gesture mutex for scroll-wheel reloads (#8142) * Common - Fix Gesture mutex for scroll-wheel reloads * simplify gvars and add comments --- addons/common/XEH_postInit.sqf | 70 +++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 2af7d0c601..eec6bb45e2 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -397,45 +397,53 @@ addMissionEventHandler ["PlayerViewChanged", { ////////////////////////////////////////////////// GVAR(isReloading) = false; +GVAR(reloadMutex_lastMagazines) = []; +// When reloading, the new magazine is removed from inventory, an animation plays and then the old magazine is added +// If the animation is interrupted, the new magazine will be lost +["loadout", { + params ["_unit", "_newLoadout"]; + private _mags = magazines _unit; + // if our magazine count dropped by 1, we might be reloading + if ((count GVAR(reloadMutex_lastMagazines)) - (count _mags) == 1) then { + private _weapon = currentWeapon _unit; + private _muzzle = currentMuzzle _unit; + if (_weapon == "") exitWith {}; + private _wpnMzlConfig = configFile >> "CfgWeapons" >> _weapon; + if (_muzzle != _weapon) then { _wpnMzlConfig = _wpnMzlConfig >> _muzzle; }; -["keyDown", { - if ((_this select 1) in actionKeys "ReloadMagazine" && {alive ACE_player}) then { - //Ignore mounted (except ffv) - if (!(player call CBA_fnc_canUseWeapon)) exitWith {}; - private _weapon = currentWeapon ACE_player; + private _compatMags = [_wpnMzlConfig] call CBA_fnc_compatibleMagazines; + private _lastCompatMagCount = {_x in _compatMags} count GVAR(reloadMutex_lastMagazines); + private _curCompatMagCount = {_x in _compatMags} count _mags; + TRACE_3("",_wpnMzlConfig,_lastCompatMagCount,_curCompatMagCount); + if (_lastCompatMagCount - _curCompatMagCount != 1) exitWith {}; // check if magazines for our specific muzzle dropped by 1 - if (_weapon != "") then { - private _muzzle = currentMuzzle ACE_player; - private _wpnConfig = configFile >> "CfgWeapons" >> _weapon; - private _gesture = getText ([_wpnConfig >> _muzzle, _wpnConfig] select (_weapon isEqualTo _muzzle) >> "reloadAction"); - if (_gesture == "") exitWith {}; //Ignore weapons with no reload gesture (binoculars) - private _isLauncher = _weapon isKindOf ["Launcher", configFile >> "CfgWeapons"]; - private _config = ["CfgGesturesMale", "CfgMovesMaleSdr"] select _isLauncher; - private _duration = getNumber (configfile >> _config >> "States" >> _gesture >> "speed"); + private _gesture = getText (_wpnMzlConfig >> "reloadAction"); + if (_gesture == "") exitWith {}; //Ignore weapons with no reload gesture (binoculars) + private _isLauncher = _weapon isKindOf ["Launcher", configFile >> "CfgWeapons"]; + private _animConfig = ["CfgGesturesMale", "CfgMovesMaleSdr"] select _isLauncher; + private _duration = getNumber (configfile >> _animConfig >> "States" >> _gesture >> "speed"); - if (_duration != 0) then { - _duration = if (_duration < 0) then { abs _duration } else { 1 / _duration }; - } else { - _duration = 3; - }; + if (_duration != 0) then { + _duration = if (_duration < 0) then { abs _duration } else { 1 / _duration }; + } else { + _duration = 3; + }; - TRACE_2("Reloading, blocking gestures",_weapon,_duration); - GVAR(reloadingETA) = CBA_missionTime + _duration; + TRACE_2("Reloading, blocking gestures",_weapon,_duration); + GVAR(reloadingETA) = CBA_missionTime + _duration; - if (!GVAR(isReloading)) then { - GVAR(isReloading) = true; + if (!GVAR(isReloading)) then { + GVAR(isReloading) = true; - [{ - CBA_missionTime > GVAR(reloadingETA) - },{ - GVAR(isReloading) = false; - }] call CBA_fnc_waitUntilAndExecute; - }; + [{ + CBA_missionTime > GVAR(reloadingETA) + },{ + GVAR(isReloading) = false; + }] call CBA_fnc_waitUntilAndExecute; }; }; - - false -}] call CBA_fnc_addDisplayHandler; + GVAR(reloadMutex_lastMagazines) = _mags; +}, true] call CBA_fnc_addPlayerEventHandler; ////////////////////////////////////////////////// // Set up PlayerJIP eventhandler From fab4664b73518281361002c15b0ed046e4ab1db0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 3 Mar 2021 15:50:08 -0600 Subject: [PATCH 090/335] Update XEH_preInit.sqf (#8143) --- addons/medical_status/XEH_preInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_status/XEH_preInit.sqf b/addons/medical_status/XEH_preInit.sqf index c3e97b8ed1..89386bf4fa 100644 --- a/addons/medical_status/XEH_preInit.sqf +++ b/addons/medical_status/XEH_preInit.sqf @@ -25,7 +25,7 @@ PREP_RECOMPILE_END; addMissionEventHandler ["EntityKilled", {_this call FUNC(handleKilledMission)}]; -if (hasInterface) { +if (hasInterface) then { //Add Inventory action to uncon units ["CAManBase", "init", { params ["_unit"]; From 2458e87333970accb9467a26418269ca1e933a79 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 3 Mar 2021 16:04:10 -0600 Subject: [PATCH 091/335] Prep 3.13.6 Build 58 --- README.md | 2 +- addons/main/script_mod.hpp | 2 +- addons/main/script_version.hpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 21c9e3cf9d..e62725bc6c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Issues diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 36015f36ac..b8e9bcf69c 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -11,7 +11,7 @@ // MINIMAL required version for the Mod. Components can specify others.. #define REQUIRED_VERSION 2.02 -#define REQUIRED_CBA_VERSION {3,15,0} +#define REQUIRED_CBA_VERSION {3,15,2} #ifdef COMPONENT_BEAUTIFIED #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 01da94555c..e49f3d5f88 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 13 -#define PATCHLVL 5 -#define BUILD 57 +#define PATCHLVL 6 +#define BUILD 58 From d64050554d3ea61b4c6ca578ebd60e7d536a702c Mon Sep 17 00:00:00 2001 From: Neil Evers Date: Thu, 4 Mar 2021 05:11:24 +0100 Subject: [PATCH 092/335] Arsenal - Fix Zeus UI lockup after closing arsenal (#8102) * Fix Zeus UI lockup after closing arsenal * Removed redundant line * use ACE_player * Always reset cameraview --- addons/arsenal/functions/fnc_onArsenalClose.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/arsenal/functions/fnc_onArsenalClose.sqf b/addons/arsenal/functions/fnc_onArsenalClose.sqf index 9132ea1bc2..2388986ba7 100644 --- a/addons/arsenal/functions/fnc_onArsenalClose.sqf +++ b/addons/arsenal/functions/fnc_onArsenalClose.sqf @@ -59,7 +59,6 @@ if (is3DEN) then { curatorcamera cameraEffect ["internal","back"]; } else { GVAR(camera) cameraEffect ["terminate","back"]; - ACE_player switchCamera GVAR(cameraView); }; }; @@ -71,6 +70,8 @@ if (!isNil QGVAR(moduleUsed)) then { objNull remoteControl GVAR(center); }; +ACE_player switchCamera GVAR(cameraView); + if (isMultiplayer) then { [QGVAR(broadcastFace), [GVAR(center), GVAR(currentFace)], QGVAR(center) + "_face"] call CBA_fnc_globalEventJIP; From c60e4111d82b4396ec152459cda2b6fe0e20b4ed Mon Sep 17 00:00:00 2001 From: classic Date: Fri, 5 Mar 2021 02:27:06 +0900 Subject: [PATCH 093/335] Update Japanese translation (#8146) --- addons/arsenal/stringtable.xml | 4 ++- addons/explosives/stringtable.xml | 6 ++++ addons/flashlights/stringtable.xml | 2 +- addons/interact_menu/stringtable.xml | 2 ++ addons/markers/stringtable.xml | 14 ++++++++ addons/medical_damage/stringtable.xml | 2 ++ addons/medical_gui/stringtable.xml | 2 ++ addons/medical_statemachine/stringtable.xml | 2 ++ addons/medical_treatment/stringtable.xml | 37 ++++++++++++++++----- 9 files changed, 60 insertions(+), 11 deletions(-) diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index ebb9d7a5c8..8c7731c7d9 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -419,10 +419,12 @@ Sort by ballistic protection Trier par protection balistique + 防弾性能で並び替え Sort by explosive protection Trier par résistance aux explosifs + 防爆性能で並び替え Share or stop sharing the selected loadout @@ -1092,7 +1094,6 @@ Niveles de potasio Kaliumspiegel Taux de potassium - カリウム レベル 钾水平 鉀水平 Ilvello di potassio @@ -1101,6 +1102,7 @@ Níveis de Potássio Úrovně draslíku Potasyum seviyeleri + カリウム含有量 Magnification diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 684b0f8b1a..9185d46d56 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -1115,26 +1115,32 @@ Minimum Time Durée minimale + 最短時間 Maximum Time Durée maximale + 最長時間 Default Time Durée par défaut + 標準時間 Minimum time value (in seconds) for the explosive timer. Définit la durée minimale paramétrable sur le minuteur. + 起爆タイマーの最低時間 (秒) を設定します。 Maximum time value (in seconds) for the explosive timer. Définit la durée maximale paramétrable sur le minuteur. + 起爆タイマーの最長時間 (秒) を設定します。 Default time value (in seconds) for the explosive timer. Définit la durée paramétrée par défaut sur le minuteur. + 起爆タイマーの標準時間 (秒) を設定します。 diff --git a/addons/flashlights/stringtable.xml b/addons/flashlights/stringtable.xml index 478b1da2c8..16aaea33e4 100644 --- a/addons/flashlights/stringtable.xml +++ b/addons/flashlights/stringtable.xml @@ -133,7 +133,7 @@ Torcia a LED ad alta potenza Silná LED svítilna. Puissante lampe torche à LED. - 協力な LED のフラッシュライト。 + 強力な LED のフラッシュライト。 Güçlü LED el feneri Linterna LED potente Мощный светодиодный фонарь. diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 4da4d9ae35..de7be129ae 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -492,10 +492,12 @@ Consolidate single child actions Объединять с единственным дочерним действием + サブ動作を統合 Combines parent action with only one child action together. Объединять родительское действие с единственным дочерним действием в одно. + メインの動作とサブ動作一つを統合して表示します。 diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index 1848e4fa41..bf5fcb6d78 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -153,58 +153,72 @@ Allow Timestamps Permettre l'horodatage + タイムスタンプ許可 Whether to allow timestamps to be automatically applied to markers Active une interface permettant d'apposer un horodatage sur les marqueurs. + マーカーへ自動的にタイムスタンプを付与するかどうかを設定できます。 Timestamp Horodatage + タイムスタンプ Watch Required Une montre est requise. + 時計の要求 Timestamp Format Horodatage - Format + タイムスタンプ形式 Changes the timestamp format Modifie le format de l'horodatage. + タイムスタンプの形式を変更します "HH" - Hour "HH" - Heures + "HH" - 時間 "MM" - Minute "MM" - Minutes + "MM" - 分 "SS" - Seconds "SS" - Secondes + "SS" - 秒 "MM" - Milliseconds "MS" - Millisecondes + "MM" - ミリ秒 Timestamp Hour Format Horodatage - Système horaire + タイムスタンプ時刻形式 24-Hour Clock Format 24 heures + 24 時間表記 12-Hour Clock Format 12 heures + 12 時間表記 Changes timestamp to use either 24-hour or 12-hour clock format Permet de choisir le système d'horodatage souhaité, au format 12 ou 24 heures. + タイムスタンプの時刻を 24 時間か 12 時間表記のどちらかに変更できます。 diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index 0baee24c91..4c74c96db1 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -690,10 +690,12 @@ Pain Unconscious Chance Szansa na nieprzytomność przez ból + 気絶確立 The probability of a person falling unconscious when their pain is above the tolerance threshold upon receiving damage. Szansa że osoba straci przytomność gdy jej ból jest powyżej tolerowalnego progu podczas otrzymywania obrażeń. + ユニットがダメージを受けた時に痛みが許容しきい値を超えた場合、気絶をする確立を設定します。 diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml index 709b03fc25..7020c0fe99 100644 --- a/addons/medical_gui/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -192,10 +192,12 @@ Show Triage Level in Interaction Menu Couleur de triage dans le menu d'interaction + インタラクションにトリアージ レベル表示 Shows the patient's triage level by changing the color of the main and medical menu actions. Modifie la couleur du menu d'interactions et du sous-menu médical en fonction de la fiche de triage du patient. + メニューと医療メニューの色を変更し、患者のトリアージ レベルを表示します。 Medical diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml index a3ec9b9d5d..2518b25c96 100644 --- a/addons/medical_statemachine/stringtable.xml +++ b/addons/medical_statemachine/stringtable.xml @@ -148,11 +148,13 @@ Bleedout During Cardiac Arrest Ausbluten im Herzstillstand Saignement durant l'arrêt cardiaque + 心停止中の失血 Controls whether a person can die in cardiac arrest by blood loss before the cardiac arrest time runs out. Legt fest, ob man während des Herzstillstands durch Blutverlust sterben kann, auch wenn die Überlebenszeit im Herzstillstand noch nicht ausgelaufen ist. Définit si un joueur en arrêt cardiaque peut mourir par exsanguination, avant que la durée de l'arrêt cardiaque définie ci-dessus ne soit écoulée. + 心停止時間を超え死亡する前に、失血による心停止で死亡するかどうかを決定します。 diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 971110a990..70b361fd66 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -254,50 +254,60 @@ Autoinjector Treatment Time Durée d'interaction - Auto-injecteurs + 注射器の使用時間 Time, in seconds, required to administer medication using an autoinjector. Définit le temps nécessaire à l'administration d'une substance auto-injectable (en secondes). + 注射器の使用に掛かる時間 (秒) を決定します。 Tourniquet Treatment Time Durée d'interaction - Garrots Tourniquet-Behandlungszeit + 止血帯の使用時間 Time, in seconds, required to apply/remove a tourniquet. Définit le temps nécessaire à l'application ou au retrait d'un garrot (en secondes). Zeit in Sekunden, die benötigt wird, um ein Tourniquet anzuwenden. + 止血帯の使用/排除に掛かる時間 (秒) を決定します。 IV Bag Treatment Time Durée d'interaction - IVs IV Beutelbehandlungszeit + 点滴の使用時間 Time, in seconds, required to administer an IV bag. Définit le temps nécessaire à la pose d'une perfusion IV (en secondes). Zeit in Sekunden, die benötigt wird, um einen Infusionsbeutel aufzutragen. + 点滴の投与に掛かる時間 (秒) を決定します。 Splint Treatment Time Durée d'interaction - Attelles Schienenbehandlungszeit + 添え木の使用時間 Time, in seconds, required to apply a splint. Définit le temps nécessaire à l'application d'une attelle (en secondes). Zeit in Sekunden, die zum Anbringen einer Schiene benötigt wird. + 添え木の使用に掛かる時間 (秒) を決定します。 Body Bag Use Time Durée d'interaction - Housses mortuaires Anwendungszeit für Leichensack + 死体袋の使用時間 Time, in seconds, required to put a patient in a body bag. Définit le temps nécessaire à la mise en housse d'un corps (en secondes). Zeit in Sekunden, die benötigt wird, um einen Leichensack aufzutragen. + 死体袋の使用に掛かる時間 (秒) を決定します。 Allow Epinephrine @@ -612,10 +622,12 @@ Wound Stitch Time Durée d'interaction - Sutures + 縫合時間 Time, in seconds, required to stitch a single wound. Définit le temps nécessaire à la suture d'une plaie (en secondes). + 縫合に掛かる時間 (秒) を決定します。 Self IV Transfusion @@ -646,10 +658,12 @@ Allow Unconscious Body Bag Housse mortuaire - Autoriser patients inconscients + 無意識者を死体袋に Enables placing an unconscious patient in a body bag. Active la possibilité de placer des patients inconscients dans les housses mortuaires.\nAttention : le cas échéant cela provoquera la mort du patient. + 気絶しているプレイヤーを死体袋へ入れられるかどうかを決定します。 Allow IV Transfusion @@ -673,9 +687,11 @@ Locations IV Transfusion + IV 輸血の場所制限 Controls where IV transfusions can be performed. + IV 輸血を行える場所を決定できます。 Convert Vanilla Items @@ -902,10 +918,12 @@ CPR Treatment Time Durée d'interaction - RCP + CPR の動作時間 Time, in seconds, required to perform CPR on a patient. Définit le temps nécessaire à la mise en œuvre d'une RCP (en secondes). + 心肺蘇生にかかる時間 (秒) を決定します。 Holster Required @@ -2541,7 +2559,7 @@ Zárókötszer Bendaggio rapido Curativo de Campo - 緊急圧迫包帯 + 緊急圧迫包帯を巻く 필드 드레싱 绷带 (基础型) 基礎繃帶 @@ -2557,7 +2575,7 @@ Bandage compressif Bandagem de Compressão Obvaz Tlakový - 弾性包帯 + 弾性包帯を巻く 거즈 붕대 绷带 (包扎型) 包紮繃帶 @@ -2574,7 +2592,7 @@ Rögzitő kötszer Bendaggio elastico Bandagem Elástica - 伸縮包帯 + 伸縮包帯を巻く 압박 붕대 绷带 (弹性型) 彈性繃帶 @@ -2591,7 +2609,7 @@ QuikClot QuikClot (polvere emostatica) QuikClot - クイッククロット + クイッククロットを巻く 퀵 클롯 绷带 (止血型) 止血粉 @@ -3759,7 +3777,7 @@ Valamennyi vért vesztett Ztratil trochu krve Ele perdeu um pouco de sangue - 彼は出血している + 患者は出血している 적은 양의 피를 잃었다 他轻微失血 他流失一些血液 @@ -3776,7 +3794,7 @@ Ztratil hodně krve Ele perdeu muito sangue Ha perso molto sangue - 彼は大量失血している + 患者は大量失血している 많은 양의 피를 잃었다 他大量失血 他流失大量血液 @@ -3793,7 +3811,7 @@ Nem vesztett vért Neztratil žádnou krev Ele não perdeu sangue - 彼は失血していない + 患者は失血していない 피를 잃지 않았다 他没有失血 他並沒有失血 @@ -3810,7 +3828,7 @@ Fájdalmai vannak Je v bolestech Ele está com dor - 彼には痛みがあるようだ + 患者は痛いようだ 통증이 있다 他感到疼痛 他感到疼痛中 @@ -3827,7 +3845,7 @@ Nincsenek fájdalmai Nemá žádné bolesti Ele não está com dor - 彼には痛みがないようだ + 患者は痛くないようだ 통증이 없다 他没有感到疼痛 他沒感到疼痛中 @@ -4366,6 +4384,7 @@ The body twitched and may not be dead! L'unité a bougé et n'est peut-être pas morte ! + 身体が動き死んでないようだ! From 69c3d2bb658293710631af795ad657ac7d60d9b8 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Thu, 4 Mar 2021 21:43:11 +0400 Subject: [PATCH 094/335] Add Weapon Attachments interaction (#7706) * Add Weapon Attachments interaction * Apply recommended changes * Format addPEH Co-authored-by: mharis001 <34453221+mharis001@users.noreply.github.com> * Remove toLower * Update required CBA version * Rename category to Accessories * Change setting var name * Add setting description * Fix notification size * Optimize with new commands Co-authored-by: mharis001 <34453221+mharis001@users.noreply.github.com> --- addons/attach/functions/fnc_detach.sqf | 2 +- addons/attach/stringtable.xml | 17 ----- addons/chemlights/stringtable.xml | 17 ----- .../fnc_cbaSettings_convertHelper.sqf | 2 +- addons/common/stringtable.xml | 17 +++++ .../hearing/functions/fnc_removeEarplugs.sqf | 2 +- addons/hearing/stringtable.xml | 17 ----- addons/interaction/ACE_Settings.hpp | 18 +---- addons/interaction/CfgVehicles.hpp | 8 +++ addons/interaction/XEH_PREP.hpp | 4 ++ addons/interaction/XEH_postInit.sqf | 6 ++ addons/interaction/XEH_preInit.sqf | 2 + .../fnc_getWeaponAttachmentsActions.sqf | 68 +++++++++++++++++++ .../functions/fnc_switchWeaponAttachment.sqf | 59 ++++++++++++++++ addons/interaction/initSettings.sqf | 31 +++++++++ addons/interaction/stringtable.xml | 12 ++++ addons/main/script_mod.hpp | 2 +- 17 files changed, 214 insertions(+), 70 deletions(-) create mode 100644 addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf create mode 100644 addons/interaction/functions/fnc_switchWeaponAttachment.sqf create mode 100644 addons/interaction/initSettings.sqf diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index 38acbc1883..7c68831f36 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -47,7 +47,7 @@ private _isChemlight = _attachedObject isKindOf "Chemlight_base"; // Exit if can't add the item if (!([_unit, _itemName] call CBA_fnc_canAddItem) && {!_isChemlight}) exitWith { - [localize LSTRING(Inventory_Full)] call EFUNC(common,displayTextStructured); + [LELSTRING(common,Inventory_Full)] call EFUNC(common,displayTextStructured); }; // Add item to inventory (unless it's a chemlight) diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 44af699017..831c4384e4 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -154,23 +154,6 @@ 已取下萤光棒 Işık Çubuğu Söküldü - - No inventory space - Kein Platz im Inventar - Sin espacio en inventario - Brak miejsca w ekwipunku - Pas de place dans l'inventaire - Nedostatek místa v inventáři - Sem espaço no inventário - Non hai più spazio - Nincs több hely - В инвентаре нет места - インベントリに空きがない - 넣을 공간이 없음 - 無可用空間 - 无可用空间 - Envanter de alan yok - IR Strobe IR-Stroboskop diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml index 86deea0380..c1c6c930d8 100644 --- a/addons/chemlights/stringtable.xml +++ b/addons/chemlights/stringtable.xml @@ -49,23 +49,6 @@ %1<br/>Preparado %1<br/> Hazırlandı - - No inventory space - Kein Platz im Inventar - Sin espacio en inventario - Brak miejsca w ekwipunku - Pas de place dans l'inventaire - Nedostatek místa v inventáři - Sem espaço no inventário - Nessuno spazio nell'inventario - Nincs több hely - В инвентаре нет места - インベントリに空きがありません - 소지품 공간이 없음 - 已無存放空間 - 已无存放空间 - Envanter de alan yok - [ACE] Chemlights [ACE] ケミライト diff --git a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf index b2b23eec91..6e7a4456c7 100644 --- a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf +++ b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf @@ -110,7 +110,6 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x private _gvarName = _varName select [_addonSearchCount]; - _output pushBack ""; _output pushBack format ["["]; _output pushBack format [" QGVAR(%1), ""%2"",", _gvarName, _cbaSettingType]; _output pushBack format [" [LSTRING(), LSTRING()], // %1, %2", _localizedName, _localizedDescription]; //IGNORE_STRING_WARNING(str_ace_common_); @@ -124,6 +123,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x }; _output pushBack format [" %1 // Needs mission restart", _warnIfChangedMidMission]; _output pushBack "] call CBA_fnc_addSetting;"; + _output pushBack ""; } forEach _settings; copyToClipboard (_output joinString endl); diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index fb94add8b6..4325f152bf 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -1296,6 +1296,23 @@ 没有空间可卸载 언로드 할 공간이 없습니다. + + No inventory space + Kein Platz im Inventar + Sin espacio en inventario + Brak miejsca w ekwipunku + Pas de place dans l'inventaire + Nedostatek místa v inventáři + Sem espaço no inventário + Non hai più spazio + Nincs több hely + В инвентаре нет места + インベントリに空きがない + 넣을 공간이 없음 + 無可用空間 + 无可用空间 + Envanter de alan yok + Toggle переключить diff --git a/addons/hearing/functions/fnc_removeEarplugs.sqf b/addons/hearing/functions/fnc_removeEarplugs.sqf index 55ba422beb..8399a3a84f 100644 --- a/addons/hearing/functions/fnc_removeEarplugs.sqf +++ b/addons/hearing/functions/fnc_removeEarplugs.sqf @@ -21,7 +21,7 @@ params ["_player", ["_displayHint", false, [false]]]; if (!GVAR(EnableCombatDeafness)) exitWith {}; if !([_player, "ACE_EarPlugs"] call CBA_fnc_canAddItem) exitWith { // inventory full - [localize LSTRING(Inventory_Full)] call EFUNC(common,displayTextStructured); + [LELSTRING(common,Inventory_Full)] call EFUNC(common,displayTextStructured); }; // Plugs already in and removing them. diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index e5a8ca2bab..b67f363b00 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -119,23 +119,6 @@ 你沒有耳塞 Kulak Tıkacın Yok - - No inventory space - Kein Platz im Inventar - Sin espacio en el inventario - Brak miejsca w ekwipunku - Il n'y a plus de place dans l'inventaire. - Není místo v inventáři - Non hai abbastanza spazio - Não há espaço no inventário - Nincs több hely - Нет места в инвентаре - インベントリに空きがありません - 넣을 공간이 없습니다 - 无可用空间 - 無可用空間 - Envanterin de alan yok - Disable ear ringing Désactiver les bourdonnements diff --git a/addons/interaction/ACE_Settings.hpp b/addons/interaction/ACE_Settings.hpp index 3efb745a6b..67497ec23b 100644 --- a/addons/interaction/ACE_Settings.hpp +++ b/addons/interaction/ACE_Settings.hpp @@ -1,24 +1,12 @@ class ACE_Settings { class GVAR(enableTeamManagement) { - category = CSTRING(DisplayName); - displayName = CSTRING(EnableTeamManagement_DisplayName); - description = CSTRING(EnableTeamManagement_Description); - value = 1; - typeName = "BOOL"; + movedToSQF = 1; }; class GVAR(enableMagazinePassing) { - category = CSTRING(DisplayName); - value = 1; - typeName = "BOOL"; - isClientSettable = 1; - displayName = CSTRING(PassMagazineSetting); + movedToSQF = 1; }; class GVAR(disableNegativeRating) { - category = CSTRING(DisplayName); - displayName = CSTRING(DisableNegativeRating_DisplayName); - description = CSTRING(DisableNegativeRating_Description); - value = 0; - typeName = "BOOL"; + movedToSQF = 1; }; }; diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 3b53bf925c..de80f3e1e1 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -312,6 +312,14 @@ class CfgVehicles { statement = ""; showDisabled = 1; icon = ""; // @todo + + class GVAR(weaponAttachments) { + displayName = "$STR_A3_CfgEditorSubcategories_EdSubcat_SideSlot0"; + condition = QGVAR(enableWeaponAttachments); + exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; + insertChildren = QUOTE(call DFUNC(getWeaponAttachmentsActions)); + modifierFunction = QUOTE(_this select 3 set [ARR_2(2, getText (configFile >> 'CfgWeapons' >> currentWeapon (_this select 0) >> 'picture'))];); + }; }; }; }; diff --git a/addons/interaction/XEH_PREP.hpp b/addons/interaction/XEH_PREP.hpp index a63bfc48f8..8eada17e3d 100644 --- a/addons/interaction/XEH_PREP.hpp +++ b/addons/interaction/XEH_PREP.hpp @@ -33,6 +33,10 @@ PREP(pardon); PREP(canPullOutBody); PREP(pullOutBody); +// Weapon Attachments +PREP(getWeaponAttachmentsActions); +PREP(switchWeaponAttachment); + // interaction with doors PREP(getDoor); PREP(getGlassDoor); diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf index 7a9f2b6572..933cead137 100644 --- a/addons/interaction/XEH_postInit.sqf +++ b/addons/interaction/XEH_postInit.sqf @@ -135,3 +135,9 @@ GVAR(isOpeningDoor) = false; }]; }; }] call CBA_fnc_addEventHandler; + +{ + [_x, { + [QGVAR(clearWeaponAttachmentsActionsCache)] call CBA_fnc_localEvent; + }] call CBA_fnc_addPlayerEventHandler; +} forEach ["loadout", "weapon"]; diff --git a/addons/interaction/XEH_preInit.sqf b/addons/interaction/XEH_preInit.sqf index dbc37e2bb6..855d651d55 100644 --- a/addons/interaction/XEH_preInit.sqf +++ b/addons/interaction/XEH_preInit.sqf @@ -6,6 +6,8 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + DFUNC(repair_Statement) = { // moved from config because of build problems TRACE_1("repair_Statement",_this); { diff --git a/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf b/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf new file mode 100644 index 0000000000..cd0e8f9730 --- /dev/null +++ b/addons/interaction/functions/fnc_getWeaponAttachmentsActions.sqf @@ -0,0 +1,68 @@ +#include "script_component.hpp" +/* + * Author: mharis001, Dystopian + * Returns children actions for weapon attachment switching. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Actions + * + * Example: + * player call ace_interaction_fnc_getWeaponAttachmentsActions + * + * Public: No + */ + +params ["_unit"]; + +[_unit, { + params ["_unit"]; + + private _currentWeapon = currentWeapon _unit; + if (_currentWeapon isEqualTo "") exitWith {[]}; + private _weaponItems = _unit weaponAccessories _currentWeapon; + private _cfgWeapons = configFile >> "CfgWeapons"; + private _actions = []; + + // "attach" actions + private _items = _unit call EFUNC(common,uniqueItems); + private _compatibleItems = _currentWeapon call CBA_fnc_compatibleItems; + { + private _config = _cfgWeapons >> _x; + private _name = format [LLSTRING(weaponAttachmentsAttach), getText (_config >> "displayName")]; + private _picture = getText (_config >> "picture"); + private _type = getNumber (_config >> "itemInfo" >> "type"); + private _oldAttachment = _weaponItems select ([TYPE_MUZZLE, TYPE_FLASHLIGHT, TYPE_OPTICS, TYPE_BIPOD] find _type); + + private _action = [ + _x, _name, _picture, + LINKFUNC(switchWeaponAttachment), + {true}, + {}, + [_currentWeapon, _x, _oldAttachment] + ] call EFUNC(interact_menu,createAction); + _actions pushBack [_action, [], _unit]; + } forEach ((_items arrayIntersect _compatibleItems) - _weaponItems); + + // "detach" actions + { + if (_x isEqualTo "") then {continue}; + + private _config = _cfgWeapons >> _x; + private _name = format [LLSTRING(weaponAttachmentsDetach), getText (_config >> "displayName")]; + private _picture = getText (_config >> "picture"); + + private _action = [ + _x, _name, _picture, + LINKFUNC(switchWeaponAttachment), + {true}, + {}, + [_currentWeapon, "", _x] + ] call EFUNC(interact_menu,createAction); + _actions pushBack [_action, [], _unit]; + } forEach _weaponItems; + + _actions +}, _unit, QGVAR(weaponAttachmentsActions), 5, QGVAR(clearWeaponAttachmentsActionsCache)] call EFUNC(common,cachedCall); diff --git a/addons/interaction/functions/fnc_switchWeaponAttachment.sqf b/addons/interaction/functions/fnc_switchWeaponAttachment.sqf new file mode 100644 index 0000000000..4f9a9f2514 --- /dev/null +++ b/addons/interaction/functions/fnc_switchWeaponAttachment.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" +/* + * Author: mharis001, Dystopian + * Switches weapon attachment. + * + * Arguments: + * 0: Target + * 1: Player (not used) + * 2: Action params + * + * Return Value: + * None + * + * Example: + * [player, player, [currentWeapon player, "acc_flashlight", ""]] call ace_interaction_fnc_switchWeaponAttachment + * + * Public: No + */ + +params ["_unit", "", "_actionParams"]; +_actionParams params ["_weapon", "_newAttachment", "_oldAttachment"]; +TRACE_3("Switching attachment",_weapon,_newAttachment,_oldAttachment); + +[_unit, "Gear"] call EFUNC(common,doGesture); + +private _addNew = _newAttachment isNotEqualTo ""; +private _removeOld = _oldAttachment isNotEqualTo ""; + +if (_addNew) then { + _unit removeItem _newAttachment; +}; + +if (_removeOld && {!([_unit, _oldAttachment] call CBA_fnc_canAddItem)}) exitWith { + LOG("no space"); + [LELSTRING(common,Inventory_Full)] call EFUNC(common,displayTextStructured); + if (_addNew) then { + _unit addItem _newAttachment; + }; +}; + +if (_removeOld) then { + [{ + params ["_unit", "_weapon", "_oldAttachment"]; + switch (_weapon) do { + case (primaryWeapon _unit): {_unit removePrimaryWeaponItem _oldAttachment;}; + case (handgunWeapon _unit): {_unit removeHandgunItem _oldAttachment;}; + default {_unit removeSecondaryWeaponItem _oldAttachment;}; + }; + _unit addItem _oldAttachment; + }, [_unit, _weapon, _oldAttachment], 0.3] call CBA_fnc_waitAndExecute; +}; + +if (!_addNew) exitWith {}; + +[{ + params ["_unit", "_weapon", "_newAttachment"]; + _unit addWeaponItem [_weapon, _newAttachment]; + [[getText (configFile >> "CfgWeapons" >> _newAttachment >> "picture"), 4], true] call CBA_fnc_notify; +}, [_unit, _weapon, _newAttachment], 1] call CBA_fnc_waitAndExecute; diff --git a/addons/interaction/initSettings.sqf b/addons/interaction/initSettings.sqf new file mode 100644 index 0000000000..0500cd5c43 --- /dev/null +++ b/addons/interaction/initSettings.sqf @@ -0,0 +1,31 @@ +[ + QGVAR(enableTeamManagement), "CHECKBOX", + [LSTRING(EnableTeamManagement_DisplayName), LSTRING(EnableTeamManagement_Description)], + format ["ACE %1", LLSTRING(DisplayName)], + true, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableMagazinePassing), "CHECKBOX", + LSTRING(PassMagazineSetting), + format ["ACE %1", LLSTRING(DisplayName)], + true +] call CBA_fnc_addSetting; + +[ + QGVAR(disableNegativeRating), "CHECKBOX", + [LSTRING(DisableNegativeRating_DisplayName), LSTRING(DisableNegativeRating_Description)], + format ["ACE %1", LLSTRING(DisplayName)], + false, + true, + {[QGVAR(disableNegativeRating), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true +] call CBA_fnc_addSetting; + +[ + QGVAR(enableWeaponAttachments), "CHECKBOX", + ["str_a3_cfgeditorcategories_edcat_weaponattachments0", LSTRING(weaponAttachments_Description)], + format ["ACE %1", LLSTRING(DisplayName)], + true +] call CBA_fnc_addSetting; diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 06c18cbaf0..6d28384798 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -1203,5 +1203,17 @@ Romper parabrisas Ön camı parçala + + Attach %1 + Установить %1 + + + Detach %1 + Снять %1 + + + Enables attach/detach weapon attachment actions for current weapon. + Включает действия Установить/Снять для приспособлений текущего оружия. + diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 36015f36ac..b8e9bcf69c 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -11,7 +11,7 @@ // MINIMAL required version for the Mod. Components can specify others.. #define REQUIRED_VERSION 2.02 -#define REQUIRED_CBA_VERSION {3,15,0} +#define REQUIRED_CBA_VERSION {3,15,2} #ifdef COMPONENT_BEAUTIFIED #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) From 7112bebaa7e9e9176afd662f960a80e40f765e93 Mon Sep 17 00:00:00 2001 From: classic Date: Sun, 7 Mar 2021 05:27:35 +0900 Subject: [PATCH 095/335] Update Japanese translation (#8150) --- addons/interaction/stringtable.xml | 3 +++ addons/javelin/stringtable.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 6d28384798..fae143bde2 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -1206,14 +1206,17 @@ Attach %1 Установить %1 + %1 を取り付け Detach %1 Снять %1 + %1 を外す Enables attach/detach weapon attachment actions for current weapon. Включает действия Установить/Снять для приспособлений текущего оружия. + インタラクションから使用中の武器に対してのアタッチメント取り外しを可能にします。 diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index 77b6d4a623..4200722da0 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -12,7 +12,7 @@ Aggangia il bersaglio Fijar objetivo (Mantener) Travar Alvo(Segurar) - 目標を捕捉 (押しっぱ) + 目標を捕捉 (長押し) 표적 획득 (누르기) 锁定目标 (按住) 鎖定目標 (按住) From 05ab4ba6773b0ea38c96e1baa09bd75c4f50e3b5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 7 Mar 2021 13:25:14 -0600 Subject: [PATCH 096/335] Javelin - reduce soft-launch motor delay (#8152) --- addons/missileguidance/CfgAmmo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index d2d5c1ecf0..a2b07b7fff 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -63,7 +63,7 @@ class CfgAmmo { //trackOversteer = 1; //trackLead = 0; - initTime = 2; + initTime = 0.5; // Begin ACE guidance Configs class ADDON { From dcfb5aa22415c30866cb7067efe21659bac561ce Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Tue, 9 Mar 2021 00:14:19 +0100 Subject: [PATCH 097/335] Enable forgotten unconscious fade in/out effects (#8156) --- addons/medical_feedback/XEH_postInit.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/medical_feedback/XEH_postInit.sqf b/addons/medical_feedback/XEH_postInit.sqf index f57478f88c..60dae8f04e 100644 --- a/addons/medical_feedback/XEH_postInit.sqf +++ b/addons/medical_feedback/XEH_postInit.sqf @@ -49,6 +49,7 @@ GVAR(bloodTickCounter) = 0; private _volume = missionNamespace getVariable [QEGVAR(hearing,unconsciousnessVolume), VOL_UNCONSCIOUS]; [QUOTE(ADDON), _volume, _unconscious] call EFUNC(common,setHearingCapability); + [_unconscious, 1] call FUNC(effectUnconscious); [true] call FUNC(handleEffects); ["unconscious", _unconscious] call EFUNC(common,setDisableUserInputStatus); }] call CBA_fnc_addEventHandler; From 9bc5d6af2737e17834782db4403c25b097297b57 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 8 Mar 2021 22:12:36 -0600 Subject: [PATCH 098/335] Prep 3.13.6 Build 59 --- addons/main/script_version.hpp | 2 +- docs/_config.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index e49f3d5f88..bb5bf47c89 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 13 #define PATCHLVL 6 -#define BUILD 58 +#define BUILD 59 diff --git a/docs/_config.yml b/docs/_config.yml index 533a2e325d..245b4e8be1 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -9,8 +9,8 @@ ace: version: major: 3 minor: 13 - patch: 5 - build: 57 + patch: 6 + build: 59 acex: githubUrl: https://github.com/acemod/ACEX From c0db53770a70ef456eea7777f637b6e5c4c644ef Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Tue, 9 Mar 2021 18:04:17 -0500 Subject: [PATCH 099/335] Add descriptions for hellfire variants (#8157) --- addons/hellfire/CfgMagazines.hpp | 22 +++++++++++----------- addons/hellfire/stringtable.xml | 9 +++++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/addons/hellfire/CfgMagazines.hpp b/addons/hellfire/CfgMagazines.hpp index 51dba52661..6d1651604f 100644 --- a/addons/hellfire/CfgMagazines.hpp +++ b/addons/hellfire/CfgMagazines.hpp @@ -7,7 +7,7 @@ class CfgMagazines { ammo = "ACE_Hellfire_AGM114K"; displayName = "AGM-114K [ACE]"; displayNameShort = "AGM-114K"; - descriptionShort = "AGM-114K"; + descriptionShort = CSTRING(KDescriptionShort); }; // 1.70 pylon magazines: @@ -52,35 +52,35 @@ class CfgMagazines { ammo = "ACE_Hellfire_AGM114N"; displayName = "AGM-114N [ACE]"; displayNameShort = "AGM-114N"; - descriptionShort = "AGM-114N"; + descriptionShort = CSTRING(NDescriptionShort); }; // 1.70 pylon magazines: class PylonMissile_1Rnd_ACE_Hellfire_AGM114N: PylonMissile_1Rnd_ACE_Hellfire_AGM114K { // Bare missle displayName = "1x AGM-114N [ACE]"; displayNameShort = "AGM-114N"; - descriptionShort = "AGM-114N"; + descriptionShort = CSTRING(NDescriptionShort); ammo = "ACE_Hellfire_AGM114N"; pylonWeapon = QGVAR(launcher_N); }; class PylonRack_1Rnd_ACE_Hellfire_AGM114N: PylonRack_1Rnd_ACE_Hellfire_AGM114K { // 1x Launcher Support Rack displayName = "1x AGM-114N [ACE]"; displayNameShort = "AGM-114N"; - descriptionShort = "AGM-114N"; + descriptionShort = CSTRING(NDescriptionShort); ammo = "ACE_Hellfire_AGM114N"; pylonWeapon = QGVAR(launcher_N); }; class PylonRack_3Rnd_ACE_Hellfire_AGM114N: PylonRack_3Rnd_ACE_Hellfire_AGM114K { // 3x Launcher Support Rack displayName = "3x AGM-114N [ACE]"; displayNameShort = "AGM-114N"; - descriptionShort = "AGM-114N"; + descriptionShort = CSTRING(NDescriptionShort); ammo = "ACE_Hellfire_AGM114N"; pylonWeapon = QGVAR(launcher_N); }; class PylonRack_4Rnd_ACE_Hellfire_AGM114N: PylonRack_4Rnd_ACE_Hellfire_AGM114K { // 4x Launcher Support Rack displayName = "4x AGM-114N [ACE]"; displayNameShort = "AGM-114N"; - descriptionShort = "AGM-114N"; + descriptionShort = CSTRING(NDescriptionShort); ammo = "ACE_Hellfire_AGM114N"; pylonWeapon = QGVAR(launcher_N); }; @@ -91,35 +91,35 @@ class CfgMagazines { ammo = "ACE_Hellfire_AGM114L"; displayName = "AGM-114L [ACE]"; displayNameShort = "AGM-114L"; - descriptionShort = "AGM-114L"; + descriptionShort = CSTRING(LDescriptionShort); }; // 1.70 pylon magazines: class PylonMissile_1Rnd_ACE_Hellfire_AGM114L: PylonMissile_1Rnd_ACE_Hellfire_AGM114K { // Bare missle displayName = "1x AGM-114L [ACE]"; displayNameShort = "AGM-114L"; - descriptionShort = "AGM-114L"; + descriptionShort = CSTRING(LDescriptionShort); ammo = "ACE_Hellfire_AGM114L"; pylonWeapon = QGVAR(launcher_L); }; class PylonRack_1Rnd_ACE_Hellfire_AGM114L: PylonRack_1Rnd_ACE_Hellfire_AGM114K { // 1x Launcher Support Rack displayName = "1x AGM-114L [ACE]"; displayNameShort = "AGM-114L"; - descriptionShort = "AGM-114L"; + descriptionShort = CSTRING(LDescriptionShort); ammo = "ACE_Hellfire_AGM114L"; pylonWeapon = QGVAR(launcher_L); }; class PylonRack_3Rnd_ACE_Hellfire_AGM114L: PylonRack_3Rnd_ACE_Hellfire_AGM114K { // 3x Launcher Support Rack displayName = "3x AGM-114L [ACE]"; displayNameShort = "AGM-114L"; - descriptionShort = "AGM-114L"; + descriptionShort = CSTRING(LDescriptionShort); ammo = "ACE_Hellfire_AGM114L"; pylonWeapon = QGVAR(launcher_L); }; class PylonRack_4Rnd_ACE_Hellfire_AGM114L: PylonRack_4Rnd_ACE_Hellfire_AGM114K { // 4x Launcher Support Rack displayName = "4x AGM-114L [ACE]"; displayNameShort = "AGM-114L"; - descriptionShort = "AGM-114L"; + descriptionShort = CSTRING(LDescriptionShort); ammo = "ACE_Hellfire_AGM114L"; pylonWeapon = QGVAR(launcher_L); }; diff --git a/addons/hellfire/stringtable.xml b/addons/hellfire/stringtable.xml index c621e6ddb4..98ef38732d 100644 --- a/addons/hellfire/stringtable.xml +++ b/addons/hellfire/stringtable.xml @@ -17,5 +17,14 @@ Hellfire modunu ayarla Ajustar modo Hellfire + + Semi-active laser homing missile with high explosive anti-tank warhead + + + Millimeter-wave radar guided missile with high explosive anti-tank warhead + + + Semi-active laser homing missile with metal augmented charge anti-personnel warhead + From 8bd4922fccc86b53bae25d43a8c95b77c9b75f54 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 9 Mar 2021 17:06:50 -0600 Subject: [PATCH 100/335] Prep 3.13.6 Build 60 --- addons/main/script_version.hpp | 2 +- docs/_config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index bb5bf47c89..861a028d34 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 13 #define PATCHLVL 6 -#define BUILD 59 +#define BUILD 60 diff --git a/docs/_config.yml b/docs/_config.yml index 245b4e8be1..2072a7255a 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -10,7 +10,7 @@ ace: major: 3 minor: 13 patch: 6 - build: 59 + build: 60 acex: githubUrl: https://github.com/acemod/ACEX From 8ac8da3188d9185029ad83ea4c7a9b1170f40609 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 10 Mar 2021 10:12:50 -0600 Subject: [PATCH 101/335] Spectator - Fix displayUnloaded event (#8158) --- addons/spectator/XEH_PREP.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/spectator/XEH_PREP.hpp b/addons/spectator/XEH_PREP.hpp index ddca0c226c..74e8c8e388 100644 --- a/addons/spectator/XEH_PREP.hpp +++ b/addons/spectator/XEH_PREP.hpp @@ -24,6 +24,7 @@ PREP(ui_handleMouseButtonDblClick); PREP(ui_handleMouseButtonDown); PREP(ui_handleMouseMoving); PREP(ui_handleMouseZChanged); +PREP(ui_handleUnload); PREP(ui_toggleMap); PREP(ui_toggleUI); PREP(ui_updateCamButtons); From b167dff81a2b69283da44b3a9d2950769e9e0b22 Mon Sep 17 00:00:00 2001 From: Spindler Torsten Date: Fri, 12 Mar 2021 19:57:56 +0100 Subject: [PATCH 102/335] Change displayShortName to MAVL for Maverick L (#8161) Co-authored-by: TeTeT Nimitz --- addons/maverick/stringtable.xml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/addons/maverick/stringtable.xml b/addons/maverick/stringtable.xml index 45d50ef5a8..a0af914c3c 100644 --- a/addons/maverick/stringtable.xml +++ b/addons/maverick/stringtable.xml @@ -63,19 +63,7 @@ 3x AGM-65 Maverick L [ACE] - Laser Guided - Lasergelenkt - Guida Laser - レーザー誘導 - 雷射導引 - 雷射导引 - 레이저 유도 - Kierowany laserowo - С лазерным наведением - Guiado a laser - Guidage Laser - Laserem naváděná - Lazer Güdümlü + MAVL Kh-25ML, Laser Guided Air-to-Ground-Missile From a90911a7fcb37fb9ffb93a55d0cd7e6c6862b459 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 17 Mar 2021 15:48:47 -0500 Subject: [PATCH 103/335] Various - Add missing units/weapons to cfgPatches (#8175) * Various - Add missing units/weapons to cfgPatches * Update config.cpp --- addons/artillerytables/config.cpp | 2 +- addons/dragon/config.cpp | 4 ++-- addons/fastroping/config.cpp | 4 ++-- addons/medical_treatment/config.cpp | 4 ++-- addons/tacticalladder/config.cpp | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/artillerytables/config.cpp b/addons/artillerytables/config.cpp index 4f5048e5ae..eadb5c2a24 100644 --- a/addons/artillerytables/config.cpp +++ b/addons/artillerytables/config.cpp @@ -4,7 +4,7 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; units[] = {}; - weapons[] = {}; + weapons[] = {"ACE_artilleryTable"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); diff --git a/addons/dragon/config.cpp b/addons/dragon/config.cpp index 78d836936e..9d329f6be7 100644 --- a/addons/dragon/config.cpp +++ b/addons/dragon/config.cpp @@ -3,8 +3,8 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {}; - weapons[] = {}; + units[] = {"ace_dragon_staticAssembled"}; + weapons[] = {"ace_dragon_super","ace_dragon_sight"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_hot","ace_csw"}; author = ECSTRING(common,ACETeam); diff --git a/addons/fastroping/config.cpp b/addons/fastroping/config.cpp index 98dfd26742..bdbd92c3b0 100644 --- a/addons/fastroping/config.cpp +++ b/addons/fastroping/config.cpp @@ -3,8 +3,8 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {}; - weapons[] = {}; + units[] = {"ACE_fastropingSupplyCrate"}; + weapons[] = {"ACE_rope12","ACE_rope15","ACE_rope18","ACE_rope27","ACE_rope36"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author = ECSTRING(common,ACETeam); diff --git a/addons/medical_treatment/config.cpp b/addons/medical_treatment/config.cpp index 29c11c18ad..7506903b46 100644 --- a/addons/medical_treatment/config.cpp +++ b/addons/medical_treatment/config.cpp @@ -3,8 +3,8 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {}; - weapons[] = {}; + units[] = {"ACE_fieldDressingItem","ACE_packingBandageItem","ACE_elasticBandageItem","ACE_tourniquetItem","ACE_splintItem","ACE_morphineItem","ACE_adenosineItem","ACE_epinephrineItem","ACE_plasmaIVItem","ACE_bloodIVItem","ACE_salineIVItem","ACE_quikClotItem","ACE_personalAidKitItem","ACE_surgicalKitItem","ACE_bodyBagItem","ACE_medicalSupplyCrate","ACE_medicalSupplyCrate_advanced"}; + weapons[] = {"ACE_fieldDressing","ACE_packingBandage","ACE_elasticBandage","ACE_tourniquet","ACE_splint","ACE_morphine","ACE_adenosine","ACE_epinephrine","ACE_plasmaIV","ACE_plasmaIV_500","ACE_plasmaIV_250","ACE_bloodIV","ACE_bloodIV_500","ACE_bloodIV_250","ACE_salineIV","ACE_salineIV_500","ACE_salineIV_250","ACE_quikclot","ACE_personalAidKit","ACE_surgicalKit","ACE_bodyBag"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_medical_status", "ace_medical_damage", "ace_apl"}; author = ECSTRING(common,ACETeam); diff --git a/addons/tacticalladder/config.cpp b/addons/tacticalladder/config.cpp index def7b0ce96..1060300de5 100644 --- a/addons/tacticalladder/config.cpp +++ b/addons/tacticalladder/config.cpp @@ -3,7 +3,7 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - units[] = {}; + units[] = {"ACE_TacticalLadder_Pack"}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_apl", "ace_interaction"}; From 14481e9be4b88dffd07240b0f3913b0ebd351f35 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 17 Mar 2021 21:52:17 +0100 Subject: [PATCH 104/335] Documentation - Add Mikero binarization note (#8172) --- docs/wiki/development/setting-up-the-development-environment.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/wiki/development/setting-up-the-development-environment.md b/docs/wiki/development/setting-up-the-development-environment.md index 5a39f5fb1a..3351e8eaae 100644 --- a/docs/wiki/development/setting-up-the-development-environment.md +++ b/docs/wiki/development/setting-up-the-development-environment.md @@ -20,6 +20,7 @@ This page describes how you can setup your development environment for ACE3, all - [Mikero Tools](https://mikero.bytex.digital/Downloads): DePbo, DeOgg, DeTex, Rapify, MakePbo, PboProject >=1.70 - `*.hpp` removed from PboProject's "Exclude From Pbo" list - `-F rebuild RequiredAddons` disabled + - `-B Don't binarise cpp or sqm` enabled - Python, Mikero Tools and Git in PATH environment variable - [CBA](https://github.com/CBATeam/CBA_A3/releases/latest) mod (release or development version) From 34cb48b3fe476420c24221c0e24fb285e73c0e23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Mar 2021 19:11:54 -0500 Subject: [PATCH 105/335] Bump is-svg from 4.2.1 to 4.3.1 in /docs/src (#8177) Bumps [is-svg](https://github.com/sindresorhus/is-svg) from 4.2.1 to 4.3.1. - [Release notes](https://github.com/sindresorhus/is-svg/releases) - [Commits](https://github.com/sindresorhus/is-svg/compare/v4.2.1...v4.3.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/src/package-lock.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/src/package-lock.json b/docs/src/package-lock.json index 7a26357f29..a915c30e8e 100644 --- a/docs/src/package-lock.json +++ b/docs/src/package-lock.json @@ -1678,6 +1678,13 @@ "micromatch": "^3.1.10" } }, + "fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", + "dev": true, + "optional": true + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -2455,13 +2462,6 @@ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true, - "optional": true - }, "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -2809,13 +2809,13 @@ "optional": true }, "is-svg": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.2.1.tgz", - "integrity": "sha512-PHx3ANecKsKNl5y5+Jvt53Y4J7MfMpbNZkv384QNiswMKAWIbvcqbPz+sYbFKJI8Xv3be01GSFniPmoaP+Ai5A==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.1.tgz", + "integrity": "sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA==", "dev": true, "optional": true, "requires": { - "html-comment-regex": "^1.1.2" + "fast-xml-parser": "^3.19.0" } }, "is-symbol": { From 76676eee462cb0bbe400a482561c148d8652b550 Mon Sep 17 00:00:00 2001 From: Jo David Date: Wed, 24 Mar 2021 16:18:59 +0100 Subject: [PATCH 106/335] Adjust "New issue" link to lead to template selection page (#8182) We want people to choose a template when creating a new issue --- docs/wiki/user/how-to-report-an-issue.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/user/how-to-report-an-issue.md b/docs/wiki/user/how-to-report-an-issue.md index fefbf8a73e..9e4962ef76 100644 --- a/docs/wiki/user/how-to-report-an-issue.md +++ b/docs/wiki/user/how-to-report-an-issue.md @@ -26,6 +26,6 @@ Indicate if the issue appears on stable or development version. In case it is th ### Reporting the issue -Head over to the [ACE3 GitHub issue tracker]({{ site.ace.githubUrl }}/issues){:target="_blank"} and press the ["New Issue"]({{ site.ace.githubUrl }}/issues/new){:target="_blank"} button in the top right corner. Fill out the issue template. Add a link ([gist](https://gist.github.com){:target="_blank"} or [pastebin](http://pastebin.com){:target="_blank"}) to the client and/or server RPT file. An instruction to find your RPT files can be found [here](https://community.bistudio.com/wiki/Crash_Files#Arma_3){:target="_blank"}. +Head over to the [ACE3 GitHub issue tracker]({{ site.ace.githubUrl }}/issues){:target="_blank"} and press the ["New Issue"]({{ site.ace.githubUrl }}/issues/new/choose){:target="_blank"} button in the top right corner. Fill out the issue template. Add a link ([gist](https://gist.github.com){:target="_blank"} or [pastebin](http://pastebin.com){:target="_blank"}) to the client and/or server RPT file. An instruction to find your RPT files can be found [here](https://community.bistudio.com/wiki/Crash_Files#Arma_3){:target="_blank"}. A short video clip of the issue might be helpful in resolving it faster. From dceab7afa51cabaf6d9c5d043b6969b6e471ed64 Mon Sep 17 00:00:00 2001 From: Filip Maciejewski Date: Thu, 8 Apr 2021 14:20:14 +0200 Subject: [PATCH 107/335] Update linguist settings (#8151) --- .gitattributes | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.gitattributes b/.gitattributes index 3c59efe684..2462fa3c3b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,3 +2,13 @@ *.png binary *.jpg binary *.paa binary + +# Change GitHub language categorization +addons/**/*.cpp linguist-language=SQF +addons/**/*.hpp linguist-language=SQF + +optionals/**/*.cpp linguist-language=SQF +optionals/**/*.hpp linguist-language=SQF + +# Do not count hemtt includes in language usage stats +include/* linguist-vendored From 94d5e934858a0a8e99bd67d5eac297f4dda95ad4 Mon Sep 17 00:00:00 2001 From: Pascal Dunaj <32539404+t-zilla@users.noreply.github.com> Date: Thu, 8 Apr 2021 20:35:10 +0200 Subject: [PATCH 108/335] Typo in usage example (#8201) --- addons/captives/functions/fnc_doEscortCaptive.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index 86d597aabe..700a68c42e 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -12,7 +12,7 @@ * The return value * * Example: - * [player, bob, true] call ACE_captives_fnc_doEscorteCaptive; + * [player, bob, true] call ACE_captives_fnc_doEscortCaptive; * * Public: No */ From f37f8bbe809901068aa081449b94c4fdc7523abe Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 9 Apr 2021 20:15:40 +0200 Subject: [PATCH 109/335] Mk6 Mortar - Fix README.md typo (#8205) --- addons/mk6mortar/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/mk6mortar/README.md b/addons/mk6mortar/README.md index 3e5109f38f..072fdf7f15 100644 --- a/addons/mk6mortar/README.md +++ b/addons/mk6mortar/README.md @@ -1,7 +1,7 @@ ace_mk6mortar ========== -Tweaks the Nk6 Mortar system. +Tweaks the Mk6 Mortar system. ## Maintainers From 6970bf78e74f1ac8b529275c14fe083d0c38339f Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Mon, 12 Apr 2021 08:52:53 +0200 Subject: [PATCH 110/335] Overhaul CSW docs (#8206) --- .../crew-served-weapons-framework.md | 245 ++++++++++-------- 1 file changed, 144 insertions(+), 101 deletions(-) diff --git a/docs/wiki/framework/crew-served-weapons-framework.md b/docs/wiki/framework/crew-served-weapons-framework.md index 3f64b09587..9b3ef28d4f 100644 --- a/docs/wiki/framework/crew-served-weapons-framework.md +++ b/docs/wiki/framework/crew-served-weapons-framework.md @@ -14,133 +14,176 @@ version: ## 1. Making a new Crew Served Weapon -### 1.1 CfgVehicles +To convert a static weapon into a crew served weapon, you need to create the following: -```cpp -class CfgVehicles { - class LandVehicle; - class StaticWeapon: LandVehicle { - class ACE_Actions; - }; - class StaticMGWeapon: StaticWeapon { - class Turrets { - class MainTurret; - }; - class ACE_Actions: ACE_Actions { - class ACE_MainActions; - }; - }; - class banana_csw: StaticMGWeapon { - class ace_csw { - enabled = 1; // whether or not the weapon is affected by CSW - proxyWeapon = QGVAR(HMG_Static); // The weapon that will be added to the CSW on initialization. Used to ensure lower ammo-reload time when using Ammo Handling - magazineLocation = "_target selectionPosition 'magazine'"; // The location of the magazine. Where the action for ammo-handling will appear on the weapon - disassembleWeapon = QGVAR(staticHMGCarry); // What the weapon will disassemble to - disassembleTurret = QGVAR(m3TripodLow); // Which tripod will appear when weapon has been disassembled - ammoLoadTime = 7; // How long it takes in seconds to load ammo into the weapon - ammoUnloadTime = 5; // How long it takes in seconds to unload ammo from the weapon - desiredAmmo = 69; // When the weapon is reloaded it will try and reload to this ammo capacity - disassembleFunc = "myCoolFunction.sqf"; // A callback function for when the CSW gets disassembled. Arguments: [tripod, staticWeapon] - }; - }; -}; -``` +- A proxy weapon +- A carryable weapon that can be mounted on a tripod +- Carryable weapon magazines +- The CSW config in the static weapon -### 1.2 CfgMagazines +For the following examples, we are going to assume you are modifying your existing static weapon named `prefix_hmg` and that you are using the same prefix. If you are making a compatibility patch for a third party mod, you should use your own prefix. Do not use `ace` as your prefix. -```cpp -class CfgMagazines { - class 100Rnd_127x99_mag; // Example magazine used - does not have to be this - class banana_ammo: 100Rnd_127x99_mag { - scope=2; // Needs to be 2 to make sure it shows up in Arsenal - type=256; // Must be 256 to show up in Arsenal - count = 100; // How much ammo gets added per "Load Ammo" selection - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; // default ammo box model - //ace_isbelt = 1; // Needed if your magazine has belt linking - }; -}; -``` +### 1.1 Proxy Weapon -### 1.3 CfgWeapons +Because the magazine loading time is already handled by the ACE interaction, a proxy weapon with a very low loading time is used. It automatically replaces the default weapon of the turret when CSW is enabled. ```cpp class CfgWeapons { - class Launcher_Base_F; - class banana_carry_weapon: Launcher_Base_F { - class ACE_CSW { - type = "weapon"; // What type of carry it is. Must always be "weapon" for the carry weapon - deployTime = 4; // How long it takes to deploy the weapon onto the tripod - pickupTime = 4; // How long it takes to disassemble weapon from the tripod - class assembleTo { - ace_csw_m3Tripod = "banana_csw_mod1"; // What tripod can this weapon deploy onto, and what vehicle will it spawn when it is deployed - banana_tripod = "banana_csw"; - }; - }; - }; - - class HMG_Static; - class banana_proxy_weapon: HMG_Static { - magazineReloadTime = 0.5; // Proxy weapons are spawned onto the CSW when it is assembled. Because ammo loading times use defined values in the magazine, this number needs to be low to ensure low latency + class prefix_hmg_weapon; + class prefix_hmg_weapon_proxy: prefix_hmg_weapon { + magazineReloadTime = 0.5; }; }; ``` -### 1.4 CfgMagazineGroups +### 1.2 Carryable Weapon + +Carried CSW weapons are technically rocket launchers. This allows the player to carry both a CSW weapon and a backpack with magazines for the CSW. ```cpp - class ace_csw_groups { // Ammo that can be loaded into this CSW - class banana_ammo { // The magazine which the player can place into their inventory - banana_dummy_ammo = 1; // Magazine that is loaded into the weapon as per CfgWeapons >> weapon >> magazines - }; - - // Optional - class ace_csw_100Rnd_127x99_mag { // default magazine that CSW already implements - banana_dummy_ammo = 1; - }; - - /* - Ammo types already defined by CSW: - - ace_csw_100Rnd_127x99_mag - - ace_csw_100Rnd_127x99_mag_red - - ace_csw_100Rnd_127x99_mag_green - - ace_csw_100Rnd_127x99_mag_yellow - - ace_csw_50Rnd_127x108_mag - - ace_csw_20Rnd_20mm_G_belt - - ACE_1Rnd_82mm_Mo_HE - - ACE_1Rnd_82mm_Mo_Smoke - - ACE_1Rnd_82mm_Mo_Illum - - ACE_1Rnd_82mm_Mo_HE_Guided - - ACE_1Rnd_82mm_Mo_HE_LaserGuided - - Titan_AT - - Titan_AA - */ +class CfgWeapons { + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; }; + + class prefix_hmg_carry: Launcher_Base_F { + // displayName, author, model and picture are omitted and up to you + scope = 2; + modes[] = {}; + + class ACE_CSW { + type = "weapon"; // Use "weapon" for weapons or "mount" for tripods - see below + deployTime = 4; // How long it takes to deploy the weapon onto the tripod + pickupTime = 4; // How long it takes to disassemble weapon from the tripod + class assembleTo { + // What tripod can this weapon deploy onto, and what vehicle will it spawn when it is deployed + ace_csw_m3Tripod = "prefix_hmg"; + }; + }; + + class WeaponSlotsInfo: WeaponSlotsInfo { + // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method + // Required, because the inventory icon has no accessory variants + class MuzzleSlot { + iconScale = 0.1; + }; + + // Don't forget to set mass to a reasonable value + // We use mass in pounds * 10 + mass = 840; // 84 lb / 38 kg + }; + }; +}; +``` + +### 1.3 Carryable Magazines + +Vehicle magazines usually don't have inventory pictures or a 3D model. Because of this, carryable magazines need to be created for the CSW. If one of the existing CSW magazines or an infantry weapon magazine would fit your weapon, you don't need to create another magazine. Using one of the existing CSW magazines is preferred to prevent confusing players and mission makers. + +```cpp +class CfgMagazines { + class prefix_100rnd_hmg_mag; + class prefix_100rnd_hmg_csw_mag: prefix_100rnd_hmg_mag { + scope = 2; + type = 256; // Must be 256 to show up in Arsenal + count = 100; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + ACE_isBelt = 1; // Enables belt linking for this magazine + }; +}; +``` + +ACE converts the carryable magazines to the vehicle magazines when loading them. To enable this conversion, the ACE_CSW_Groups config needs to be extended. + +```cpp +class ACE_CSW_Groups { + // Using a custom carryable magazine + class prefix_100rnd_hmg_csw_mag { // Same name as the carryable magazine + prefix_100rnd_hmg_mag = 1; // Vehicle magazine that will be loaded when loading this magazine + }; + + // Using an existing CSW magazine + class ace_csw_100Rnd_127x99_mag { + banana_dummy_ammo = 1; + }; + + /* + Carryable magazines already defined by ACE: + - ace_csw_100Rnd_127x99_mag + - ace_csw_100Rnd_127x99_mag_red + - ace_csw_100Rnd_127x99_mag_green + - ace_csw_100Rnd_127x99_mag_yellow + - ace_csw_50Rnd_127x108_mag + - ace_csw_20Rnd_20mm_G_belt + - ace_1Rnd_82mm_Mo_HE + - ace_1Rnd_82mm_Mo_Smoke + - ace_1Rnd_82mm_Mo_Illum + - ace_1Rnd_82mm_Mo_HE_Guided + - ace_1Rnd_82mm_Mo_HE_LaserGuided + */ +}; +``` + +### 1.4 CSW Config + +The final step is to let ACE know how to disassemble and load the static weapon. + +```cpp +class CfgVehicles { + class StaticMGWeapon; + class prefix_hmg: StaticMGWeapon { + class ACE_CSW { + enabled = 1; // Enables ACE CSW for this weapon + proxyWeapon = "prefix_hmg_weapon_proxy"; // The proxy weapon created above + magazineLocation = "_target selectionPosition 'magazine'"; // Ammo handling interaction point location + disassembleWeapon = "prefix_hmg_carry"; // Carryable weapon created above + disassembleTurret = "ace_csw_m3Tripod"; // Which static tripod will appear when weapon is disassembled + ammoLoadTime = 7; // How long it takes in seconds to load ammo into the weapon + ammoUnloadTime = 5; // How long it takes in seconds to unload ammo from the weapon + desiredAmmo = 100; // When the weapon is reloaded it will try and reload to this ammo capacity + // Optional callback function for when the CSW gets disassembled, called with [tripod, staticWeapon] + disassembleFunc = "prefix_fnc_handleDisassembly"; + }; + }; +}; ``` ## 2. Making a new Tripod -### 2.1 CfgVehicles +If none of the existing ACE tripods fit your weapon, you can create your own. Creating a tripod is similar to creating a crew served weapon and consists of two parts: -```cpp -class CfgVehicles { - class ace_csw_baseTripod; - class banana_tripod: ace_csw_baseTripod { - class ace_csw { disassembleTo = "banana_carry_tripod"; }; // What will be spawned when "Pickup Tripod" is selected - }; -}; -``` +- A carryable tripod +- A placeable static tripod -### 2.2 CfgWeapons +### 2.2 Carryable Tripod + +Creating the carryable tripod is similar to [creating a carryable weapon](#12-carryable-weapon). The config besides the `ACE_CSW` class has been omitted for brevity and is the same as above. ```cpp class CfgWeapons { class Launcher_Base_F; - class banana_carry_tripod: Launcher_Base_F { + class prefix_tripod_carry: Launcher_Base_F { class ACE_CSW { - type = "mount"; // What type of carry it is. Must always be "mount" for the tripod + type = "mount"; // Use "mount" for tripods deployTime = 4; // How long it takes to deploy the tripod - pickupTime = 4; // How long it takes to pickup the tripod - deploy = "banana_tripod"; // what vehicle will spawn when the tripod is deployed + pickupTime = 4; // How long it takes to disassemble the tripod + deploy = "prefix_tripod"; // what vehicle will spawn when the tripod is deployed + }; + }; +}; +``` + +### 2.1 CfgVehicles + +When deploying a tripod, a static vehicle is spawned to mount weapons onto. Make sure this vehicles interaction point is in a suitable position. + +```cpp +class CfgVehicles { + class ace_csw_baseTripod; + class prefix_tripod: ace_csw_baseTripod { + class ACE_CSW { + disassembleTo = "prefix_tripod_carry"; }; }; }; From eeba8a8dbf9b3d3932bdfaee24e892781a145ad5 Mon Sep 17 00:00:00 2001 From: Brett Date: Thu, 15 Apr 2021 03:54:00 -0600 Subject: [PATCH 111/335] Medical - Add Alternative Survival Chance (#8192) Co-authored-by: TyroneMF Co-authored-by: Filip Maciejewski Co-authored-by: Kyle Mckay <5459452+kymckay@users.noreply.github.com> --- addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf | 6 ++++-- addons/medical_damage/initSettings.sqf | 9 +++++++++ addons/medical_damage/stringtable.xml | 6 ++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf index 93472f1d7a..b0de1f6e4a 100644 --- a/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf +++ b/addons/medical_damage/functions/fnc_woundsHandlerSQF.sqf @@ -122,8 +122,10 @@ private _bodyPartVisParams = [_unit, false, false, false, false]; // params arra _critialDamage = true; }; if ([_unit, _bodyPartNToAdd, _bodyPartDamage, _woundDamage] call FUNC(determineIfFatal)) then { - TRACE_1("determineIfFatal returned true",_woundDamage); - [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + if (!isPlayer _unit || {random 1 < EGVAR(medical,deathChance)}) then { + TRACE_1("determineIfFatal returned true",_woundDamage); + [QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent; + }; }; #ifdef DEBUG_MODE_FULL diff --git a/addons/medical_damage/initSettings.sqf b/addons/medical_damage/initSettings.sqf index 12806a46a2..14dac50f1a 100644 --- a/addons/medical_damage/initSettings.sqf +++ b/addons/medical_damage/initSettings.sqf @@ -33,3 +33,12 @@ [0, 1, 0.1, 2, true], true ] call CBA_fnc_addSetting; + +[ + QEGVAR(medical,deathChance), + "SLIDER", + [LSTRING(deathChance_DisplayName), LSTRING(deathChance_Description)], + ELSTRING(medical,Category), + [0, 1, 1, 2, true], + true +] call CBA_fnc_addSetting; diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index 4c74c96db1..ae56dc79c8 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -697,5 +697,11 @@ Szansa że osoba straci przytomność gdy jej ból jest powyżej tolerowalnego progu podczas otrzymywania obrażeń. ユニットがダメージを受けた時に痛みが許容しきい値を超えた場合、気絶をする確立を設定します。 + + Fatal Injury Death Chance + + + The chance of dying to a fatal injury. + From 88e08dc130bcac445d661fc0ad0cb2a6bf9b8276 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Sat, 17 Apr 2021 21:08:18 +0400 Subject: [PATCH 112/335] Fix make.py temp files cleanup (#8189) --- tools/make.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/make.py b/tools/make.py index ca37369638..27c10529d7 100644 --- a/tools/make.py +++ b/tools/make.py @@ -592,7 +592,9 @@ def get_project_version(version_increments=[]): def replace_file(filePath, oldSubstring, newSubstring): - fh, absPath = mkstemp() + global work_drive + fh, absPath = mkstemp(None, None, work_drive + "temp") + os.close(fh) with open(absPath, "w", encoding="utf-8") as newFile: with open(filePath, encoding="utf-8") as oldFile: for line in oldFile: From 72b88cc6dc95124d30683c7fa710e74124267318 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 17 Apr 2021 22:28:52 +0200 Subject: [PATCH 113/335] Fix Injured Sounds Not Playing At Altitudes Above 70 (#8212) --- addons/medical_feedback/functions/fnc_playInjuredSound.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_feedback/functions/fnc_playInjuredSound.sqf b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf index 5773f904ff..44f60b496f 100644 --- a/addons/medical_feedback/functions/fnc_playInjuredSound.sqf +++ b/addons/medical_feedback/functions/fnc_playInjuredSound.sqf @@ -33,7 +33,7 @@ private _distance = if (_type == "hit") then { } else { [10, 15, 20] select _severity; }; -private _targets = allPlayers inAreaArray [getPosWorld _unit, _distance, _distance, 0, false, _distance]; +private _targets = allPlayers inAreaArray [ASLToAGL getPosASL _unit, _distance, _distance, 0, false, _distance]; if (_targets isEqualTo []) exitWith {}; // Handle timeout From 46c7bff1de26f81cdd109443592242b5a58116e7 Mon Sep 17 00:00:00 2001 From: TyroneMF Date: Mon, 19 Apr 2021 17:31:07 +0100 Subject: [PATCH 114/335] Particles - Fix macro (#8214) * initial push * Update script_component.hpp * Update script_component.hpp * Update script_component.hpp --- AUTHORS.txt | 1 + optionals/particles/script_component.hpp | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 402b13b8e6..722b357e04 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -158,6 +158,7 @@ Toaster Tonic Tourorist Tuupertunut +TyroneMF Valentin Torikian voiper VyMajoris(W-Cephei) diff --git a/optionals/particles/script_component.hpp b/optionals/particles/script_component.hpp index 53a4988a8d..f783f7bede 100644 --- a/optionals/particles/script_component.hpp +++ b/optionals/particles/script_component.hpp @@ -27,17 +27,18 @@ type = "ACE_SmokeBaseMedium"; \ }; \ } +#define MERGE(var1,var2) var1####var2 #define EFFECT_40MM(color) class ACE_40mmSmokeShell##color##Effect: ACE_40mmSmokeShellWhiteEffect { \ class SmokeShellUW { \ simulation = "particles"; \ - type = QUOTE(SmokeShell##color##UW); \ + type = QUOTE(MERGE(SmokeShell,MERGE(color,UW))); \ position[] = {0, 0, 0}; \ intensity = 1; \ interval = 1; \ }; \ class SmokeShell2UW { \ simulation = "particles"; \ - type = QUOTE(SmokeShell##color##2UW); \ + type = QUOTE(MERGE(SmokeShell,MERGE(color,2UW))); \ position[] = {0, 0, 0}; \ intensity = 1; \ interval = 1; \ @@ -45,11 +46,11 @@ } #define EFFECT_AFTER_WATER(color) class ACE_SmokeAfterWater##color: ACE_SmokeAfterWaterWhite { \ class SmokeAfterWater: SmokeAfterWater { \ - type = QUOTE(ACE_SmokeAfterWater##color); \ + type = QUOTE(MERGE(ACE_SmokeAfterWater,color)); \ }; \ } #define CLOUDLET_UNDERWATER(color) class SmokeShell##color##UW; \ class SmokeShell##color##2UW: SmokeShell##color##UW { \ - postEffects = QUOTE(ACE_SmokeAfterWater##color); \ + postEffects = QUOTE(MERGE(ACE_SmokeAfterWater,color)); \ } From 5f1724d9b9059ba10e03ec59d7df4a8ce572e754 Mon Sep 17 00:00:00 2001 From: R3voA3 Date: Tue, 20 Apr 2021 11:57:33 +0200 Subject: [PATCH 115/335] Map - Fix stuck map compass size (add 0.1 zoom duration) (#8176) Co-authored-by: jonpas --- addons/map/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map/config.cpp b/addons/map/config.cpp index aab52c3536..943a63c228 100644 --- a/addons/map/config.cpp +++ b/addons/map/config.cpp @@ -100,7 +100,7 @@ class RscDisplayMainMap { class objects { class Compass: RscObject { scale = 0.7; - zoomDuration = 0; + zoomDuration = 0.1; // 0 (instant transition) breaks Arma saving position/size }; }; }; From dd454bdfbe7022045a12be1061e4700cc8927171 Mon Sep 17 00:00:00 2001 From: Steve Zhao Date: Tue, 20 Apr 2021 05:59:11 -0400 Subject: [PATCH 116/335] Medical - Allow unconscious unit in Taru pods (#8168) Co-authored-by: Filip Maciejewski --- addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf index 27ed364bf5..f71c550add 100644 --- a/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf +++ b/addons/medical_engine/functions/fnc_setUnconsciousAnim.sqf @@ -27,7 +27,7 @@ _unit setUnconscious _isUnconscious; if (_isUnconscious) then { // eject from static weapon - if (vehicle _unit isKindOf "StaticWeapon") then { + if (vehicle _unit isKindOf "StaticWeapon" && {!(vehicle _unit isKindOf "Pod_Heli_Transport_04_crewed_base_F")}) then { TRACE_2("ejecting from static weapon",_unit,vehicle _unit); [_unit] call EFUNC(common,unloadPerson); }; From 5aa6e564e00ce84b45ab46ee8208ce493b6409c3 Mon Sep 17 00:00:00 2001 From: "Kyle J. McKeown" Date: Tue, 20 Apr 2021 06:00:36 -0400 Subject: [PATCH 117/335] Name Tags - Add ability to set custom rank icon (#8174) --- AUTHORS.txt | 1 + .../nametags/functions/fnc_drawNameTagIcon.sqf | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 722b357e04..46c795ed12 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -71,6 +71,7 @@ Dharma Bellamkonda Dimaslg diwako dixon13 +Drift_91 Drill Dudakov aka [OMCB]Kaban Drofseh diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index 55fb2d960f..338f8b37fc 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: commy2, esteldunedain + * Author: commy2, esteldunedain, Drift_91 * Draw the nametag and rank icon. * * Arguments: @@ -33,12 +33,15 @@ _fnc_parameters = { if (_drawSoundwave) then { _icon = format [QPATHTOF(UI\soundwave%1.paa), floor random 10]; } else { - if (_drawRank && {rank _target != ""}) then { - _icon = GVAR(factionRanks) getVariable (_target getVariable [QGVAR(faction), faction _target]); - if (!isNil "_icon") then { - _icon = _icon param [ALL_RANKS find rank _target, ""]; - } else { - _icon = format ["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa", rank _target]; + if (_drawRank) then { + _icon = _target getVariable "ace_nametags_rankIcon"; + if (isNil "_icon" && {rank _target != ""}) then { + _icon = GVAR(factionRanks) getVariable (_target getVariable [QGVAR(faction), faction _target]); + if (!isNil "_icon") then { + _icon = _icon param [ALL_RANKS find rank _target, ""]; + } else { + _icon = format ["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa", rank _target]; + }; }; }; }; From 28cad69947bb4491433730657533604cd12356fe Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 20 Apr 2021 05:28:11 -0500 Subject: [PATCH 118/335] Tools - Add script to update HEMTT include folder (#8134) --- .../data_f/penetration/metal_plate_thin.rvmat | Bin 310 -> 293 bytes include/a3/ui_f/hpp/defineCommonColors.inc | 9 ++++++- include/a3/ui_f/hpp/defineDIKCodes.inc | 1 + include/a3/ui_f/hpp/defineResincl.inc | 6 +++++ .../cba/addons/main/script_macros_common.hpp | 25 +++++------------- include/x/cba/addons/xeh/script_xeh.hpp | 8 ++++-- tools/updateIncludes.py | 21 +++++++++++++++ 7 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 tools/updateIncludes.py diff --git a/include/a3/data_f/penetration/metal_plate_thin.rvmat b/include/a3/data_f/penetration/metal_plate_thin.rvmat index 6027df8d27030a8c6d7f850cbcf39fce89904b82..8d479baa8e463b8307b4c94bbe4fd9f09814598b 100644 GIT binary patch literal 293 zcma)%PYZ%T5XJ9)49_A;kcD_Cym$#A=#n9$&f>uSk=?a~=)1S-p`c4|F2iqT-eb(D z8MIhPrZWGqsXDMwv#LaiR)ZxaD}fexJ#esC+n!|Dka1Uj>VaqorM=#=XB2MttAZ%p zMT=tBCdopRAbzD@M~saI|K4Xxx7g)hS3xwFvqB-r(0%n<=p0}MY)1}yN%*0qdZ5nY g)GKL1e(s?|UF4a6Qd$6a|6EX8oIZmi7-}7V12W%RfB*mh literal 310 zcmZ`#%L>9k49pe}diOg#*bgX*Ac9Ci@Kh+V&0=65lHICDzsN7qe{zfHK{Sv#%w&ck zAXq}0VcMxmFj5dY(b&++X%Dl!YB6H1tCAc=!N}fKmLi(^XfRS859}s;?oE)P-7~oe z1C{4_p&s{jp~kmmk&>@P*0R=Jpg*ei(onm2-(-EQZy;+q@F_)nD}DDY9I5FH%5PbH n^wOV6ptmR}`9fxUz?NjSfQ=W6Ceb^RNS6;k$H2|&L&^07u3bmm diff --git a/include/a3/ui_f/hpp/defineCommonColors.inc b/include/a3/ui_f/hpp/defineCommonColors.inc index 474b732f28..5370c07e6c 100644 --- a/include/a3/ui_f/hpp/defineCommonColors.inc +++ b/include/a3/ui_f/hpp/defineCommonColors.inc @@ -98,6 +98,14 @@ #define IGUI_ERROR_RGB IGUI_ERROR_RGB_R, IGUI_ERROR_RGB_G, IGUI_ERROR_RGB_B #define IGUI_ERROR_COLOR {IGUI_ERROR_RGB,IGUI_ERROR_RGB_A} +//--- IGUI Tactical ping color +#define IGUI_TACTPING_RGB_R "(profilenamespace getvariable ['IGUI_TACTPING_RGB_R',1.0])" +#define IGUI_TACTPING_RGB_G "(profilenamespace getvariable ['IGUI_TACTPING_RGB_G',0.8])" +#define IGUI_TACTPING_RGB_B "(profilenamespace getvariable ['IGUI_TACTPING_RGB_B',0.2])" +#define IGUI_TACTPING_RGB_A "(profilenamespace getvariable ['IGUI_TACTPING_RGB_A',1.0])" +#define IGUI_TACTPING_RGB IGUI_TACTPING_RGB_R, IGUI_TACTPING_RGB_G, IGUI_TACTPING_RGB_B +#define IGUI_TACTPING_COLOR {IGUI_TACTPING_RGB,IGUI_TACTPING_RGB_A} + //--- HUD Text color (obsolete defines; ToDo: Replace with IGUI_TEXT_COLOR and IGUI_BCG_COLOR) #define CA_UI_HUD IGUI_TEXT_COLOR @@ -213,7 +221,6 @@ #define COLOR_TASK_ICON_CUSTOM_A 0.5 #define COLOR_TASK_ICON_CUSTOM_RGBA COLOR_TASK_ICON_CUSTOM_RGB,COLOR_TASK_ICON_CUSTOM_A - #define COLOR_TASK_BACKGROUND_UNASSIGNED_RGB 1,1,1 #define COLOR_TASK_BACKGROUND_UNASSIGNED_A 1 #define COLOR_TASK_BACKGROUND_UNASSIGNED_RGBA COLOR_TASK_BACKGROUND_UNASSIGNED_RGB,COLOR_TASK_BACKGROUND_UNASSIGNED_A diff --git a/include/a3/ui_f/hpp/defineDIKCodes.inc b/include/a3/ui_f/hpp/defineDIKCodes.inc index eb914f9482..c641d60132 100644 --- a/include/a3/ui_f/hpp/defineDIKCodes.inc +++ b/include/a3/ui_f/hpp/defineDIKCodes.inc @@ -187,3 +187,4 @@ #endif /* DIK_ESCAPE */ + diff --git a/include/a3/ui_f/hpp/defineResincl.inc b/include/a3/ui_f/hpp/defineResincl.inc index 7a94b6b592..ee8ddd5dba 100644 --- a/include/a3/ui_f/hpp/defineResincl.inc +++ b/include/a3/ui_f/hpp/defineResincl.inc @@ -1,3 +1,6 @@ +#ifndef _RESINCL_HPP +#define _RESINCL_HPP + /*******************/ /* Tactical menu */ /*******************/ @@ -3168,3 +3171,6 @@ enum #define HZ_VEH_CMDTRRT_TOTAL 31 #define HZ_TANK_BOTH_TRACKS 32 + + +#endif \ No newline at end of file diff --git a/include/x/cba/addons/main/script_macros_common.hpp b/include/x/cba/addons/main/script_macros_common.hpp index 41a4faea75..d50a27f53d 100644 --- a/include/x/cba/addons/main/script_macros_common.hpp +++ b/include/x/cba/addons/main/script_macros_common.hpp @@ -197,7 +197,7 @@ Author: ------------------------------------------- */ #ifdef DEBUG_MODE_FULL -#define LOG(MESSAGE) LOG_SYS_FILELINENUMBERS('LOG',MESSAGE) +#define LOG(MESSAGE) LOG_SYS('LOG',MESSAGE) #define LOG_1(MESSAGE,ARG1) LOG(FORMAT_1(MESSAGE,ARG1)) #define LOG_2(MESSAGE,ARG1,ARG2) LOG(FORMAT_2(MESSAGE,ARG1,ARG2)) #define LOG_3(MESSAGE,ARG1,ARG2,ARG3) LOG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) @@ -265,7 +265,7 @@ Author: ------------------------------------------- */ #ifdef DEBUG_MODE_NORMAL -#define WARNING(MESSAGE) LOG_SYS_FILELINENUMBERS('WARNING',MESSAGE) +#define WARNING(MESSAGE) LOG_SYS('WARNING',MESSAGE) #define WARNING_1(MESSAGE,ARG1) WARNING(FORMAT_1(MESSAGE,ARG1)) #define WARNING_2(MESSAGE,ARG1,ARG2) WARNING(FORMAT_2(MESSAGE,ARG1,ARG2)) #define WARNING_3(MESSAGE,ARG1,ARG2,ARG3) WARNING(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) @@ -304,7 +304,7 @@ Example: Author: Spooner ------------------------------------------- */ -#define ERROR(MESSAGE) LOG_SYS_FILELINENUMBERS('ERROR',MESSAGE) +#define ERROR(MESSAGE) LOG_SYS('ERROR',MESSAGE) #define ERROR_1(MESSAGE,ARG1) ERROR(FORMAT_1(MESSAGE,ARG1)) #define ERROR_2(MESSAGE,ARG1,ARG2) ERROR(FORMAT_2(MESSAGE,ARG1,ARG2)) #define ERROR_3(MESSAGE,ARG1,ARG2,ARG3) ERROR(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) @@ -1812,9 +1812,9 @@ Author: /* ------------------------------------------- Macro: FILE_EXISTS - Check if a file exists on machines with interface + Check if a file exists - Reports "false" if the file does not exist and throws an error in RPT. + Reports "false" if the file does not exist. Parameters: FILE - Path to the file @@ -1828,17 +1828,4 @@ Example: Author: commy2 ------------------------------------------- */ -#define FILE_EXISTS(FILE) (call {\ - private _return = false;\ - isNil {\ - private _control = (uiNamespace getVariable ["RscDisplayMain", displayNull]) ctrlCreate ["RscHTML", -1];\ - if (isNull _control) then {\ - _return = loadFile (FILE) != "";\ - } else {\ - _control htmlLoad (FILE);\ - _return = ctrlHTMLLoaded _control;\ - ctrlDelete _control;\ - };\ - };\ - _return\ -}) +#define FILE_EXISTS(FILE) (fileExists (FILE)) diff --git a/include/x/cba/addons/xeh/script_xeh.hpp b/include/x/cba/addons/xeh/script_xeh.hpp index 6fe7465203..53d6c27859 100644 --- a/include/x/cba/addons/xeh/script_xeh.hpp +++ b/include/x/cba/addons/xeh/script_xeh.hpp @@ -54,7 +54,9 @@ reloaded = "call cba_xeh_fnc_reloaded"; \ firedMan = "call cba_xeh_fnc_firedMan"; \ turnIn = "call cba_xeh_fnc_turnIn"; \ turnOut = "call cba_xeh_fnc_turnOut"; \ -deleted = "call cba_xeh_fnc_deleted"; +deleted = "call cba_xeh_fnc_deleted"; \ +disassembled = "call cba_xeh_fnc_disassembled"; \ +Suppressed = "call cba_xeh_fnc_Suppressed"; /* MACRO: DELETE_EVENTHANDLERS @@ -107,4 +109,6 @@ reloaded = ""; \ firedMan = ""; \ turnIn = ""; \ turnOut = ""; \ -deleted = ""; +deleted = ""; \ +disassembled = ""; \ +Suppressed = ""; diff --git a/tools/updateIncludes.py b/tools/updateIncludes.py new file mode 100644 index 0000000000..721b6b363d --- /dev/null +++ b/tools/updateIncludes.py @@ -0,0 +1,21 @@ +# PabstMirror - Overwrites all files in /include with updated version from a p-drive + +import os +import shutil + +include_base_path = os.path.join(os.path.dirname(os.getcwd()), "include") +p_drive_path = "P:\\" + +if not os.path.exists(p_drive_path): + raise Exception("No P-drive") + +for root, _dirs, files in os.walk(include_base_path): + relative_path = os.path.relpath(root, include_base_path) + for file in files: + if file == "$PBOPREFIX$": + continue + file_r_path = os.path.join(include_base_path, relative_path, file) + file_v_path = os.path.join(p_drive_path, relative_path, file) + if not os.path.isfile(file_v_path): + raise Exception("Missing p-drive file {}".format(file_v_path)) + shutil.copyfile(file_v_path, file_r_path) From 88b1c5b91706643e889a19f1fb225730b1e43153 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 20 Apr 2021 05:39:05 -0500 Subject: [PATCH 119/335] Tools - Add script to check sqf/config with sqfvm (#8137) --- .gitignore | 1 + addons/artillerytables/dev/checkConfigs.sqf | 1 + addons/artillerytables/dev/showShotInfo.sqf | 1 + addons/common/config.cpp | 6 +- addons/medical_ai/stateMachine.sqf | 2 + addons/nametags/config.cpp | 2 +- addons/yardage450/initKeybinds.sqf | 1 - tools/sqfvmChecker.py | 89 +++++++++++++++++++++ 8 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 tools/sqfvmChecker.py diff --git a/.gitignore b/.gitignore index a8f6a13221..52645712a7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ texHeaders.bin *.biprivatekey Thumbs.db CHANGELOG.md +sqfvm.exe diff --git a/addons/artillerytables/dev/checkConfigs.sqf b/addons/artillerytables/dev/checkConfigs.sqf index 533aecf656..1dfcea7f9f 100644 --- a/addons/artillerytables/dev/checkConfigs.sqf +++ b/addons/artillerytables/dev/checkConfigs.sqf @@ -1,3 +1,4 @@ +//pragma SKIP_COMPILE diag_log text "-------------------------------------------"; INFO("Showing entries with custom configs"); diag_log text "-------------------------------------------"; diff --git a/addons/artillerytables/dev/showShotInfo.sqf b/addons/artillerytables/dev/showShotInfo.sqf index 81a29dca22..aab2f0ef5f 100644 --- a/addons/artillerytables/dev/showShotInfo.sqf +++ b/addons/artillerytables/dev/showShotInfo.sqf @@ -1,3 +1,4 @@ +//pragma SKIP_COMPILE // #include "\z\ace\addons\artillerytables\script_component.hpp" INFO("showing shot info"); diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 557b45b732..6416f244b8 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -61,9 +61,9 @@ class ACE_Rsc_Control_Base { #include "ACE_Settings.hpp" #include "define.hpp" -#include -#include -#include +#include "ProgressScreen.hpp" +#include "HintConfig.hpp" +#include "RscInfoType.hpp" #include "CompassControl.hpp" #include "CfgUIGrids.hpp" diff --git a/addons/medical_ai/stateMachine.sqf b/addons/medical_ai/stateMachine.sqf index 48d5a6ef8e..03483f4981 100644 --- a/addons/medical_ai/stateMachine.sqf +++ b/addons/medical_ai/stateMachine.sqf @@ -1,3 +1,5 @@ +//pragma SKIP_COMPILE - Inline file + GVAR(stateMachine) = [{call EFUNC(common,getLocalUnits)}, true] call CBA_statemachine_fnc_create; // Add states [statemachine, onState, onStateEntered, onStateLeaving, name] diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index 2db10c7eeb..30b8415787 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -19,4 +19,4 @@ class CfgPatches { #include "CfgFactionClasses.hpp" #include "CfgVehicles.hpp" -#include +#include "RscTitles.hpp" diff --git a/addons/yardage450/initKeybinds.sqf b/addons/yardage450/initKeybinds.sqf index fa4f52b6c5..210141a681 100644 --- a/addons/yardage450/initKeybinds.sqf +++ b/addons/yardage450/initKeybinds.sqf @@ -1,4 +1,3 @@ - ["ACE3 Equipment", QGVAR(DistanceKey), LLSTRING(PowerButtonKey), { // Conditions: canInteract diff --git a/tools/sqfvmChecker.py b/tools/sqfvmChecker.py new file mode 100644 index 0000000000..98216563f0 --- /dev/null +++ b/tools/sqfvmChecker.py @@ -0,0 +1,89 @@ +import os +import sys +import subprocess +import concurrent.futures + +addon_base_path = os.path.dirname(os.getcwd()) + +files_to_ignore_lower = [ + x.lower() for x in ["initSettings.sqf", "initKeybinds.sqf", "XEH_PREP.sqf"] +] +sqfvm_exe = os.path.join(addon_base_path, "sqfvm.exe") +virtual_paths = [ + # would need to add more even more to /include to use it + "P:/a3|/a3", # "{}|/a3".format(os.path.join(addon_base_path, "include", "a3")), + "P:/a3|/A3", + "P:/x/cba|/x/cba", + "{}|/z/ace".format(addon_base_path), +] + + +def get_files_to_process(basePath): + arma_files = [] + for root, _dirs, files in os.walk(os.path.join(addon_base_path, "addons")): + for file in files: + if file.endswith(".sqf") or file == "config.cpp": + if file.lower() in files_to_ignore_lower: + continue + filePath = os.path.join(root, file) + arma_files.append(filePath) + return arma_files + + +def process_file(filePath, skipA3Warnings=True): + with open(filePath, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if content.startswith("//pragma SKIP_COMPILE"): + return False + cmd = [sqfvm_exe, "--input", filePath, "--parse-only", "--automated"] + for v in virtual_paths: + cmd.append("-v") + cmd.append(v) + # cmd.append("-V") + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) + try: + ret = proc.wait(7) # max wait - seconds + except Exception as _e: + print("sqfvm timed out: {}".format(filePath)) + return True + # print("{} = {}".format(filePath, ret)) + + fileHasError = False + keepReadingLines = True + while keepReadingLines: + line = proc.stdout.readline() + if not line: + keepReadingLines = False + else: + line = line.rstrip() + if line.startswith("[ERR]"): + fileHasError = True + if not ( + skipA3Warnings + and line.startswith("[WRN]") + and ("a3/" in line) + and (("Unexpected IFDEF" in line) or ("defined twice" in line)) + ): + print(" {}".format(line)) + return fileHasError + + +def main(): + if not os.path.isfile(sqfvm_exe): + print("Error: sqfvm.exe not found in base folder [{}]".format(sqfvm_exe)) + return 1 + + error_count = 0 + arma_files = get_files_to_process(addon_base_path) + print("Checking {} files".format(len(arma_files))) + with concurrent.futures.ThreadPoolExecutor(max_workers=12) as executor: + for fileError in executor.map(process_file, arma_files): + if fileError: + error_count += 1 + + print("Errors: {}".format(error_count)) + return error_count + + +if __name__ == "__main__": + sys.exit(main()) From f6cefa76a215140617024eb0238f67be0e3952f7 Mon Sep 17 00:00:00 2001 From: Salluci <69561145+Salluci@users.noreply.github.com> Date: Tue, 20 Apr 2021 08:10:50 -0300 Subject: [PATCH 120/335] Medical - Add Vehicle Crashes setting (#8149) Co-authored-by: jonpas --- addons/medical_damage/initSettings.sqf | 9 +++++++++ addons/medical_damage/stringtable.xml | 6 ++++++ addons/medical_engine/functions/fnc_handleDamage.sqf | 7 ++++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/addons/medical_damage/initSettings.sqf b/addons/medical_damage/initSettings.sqf index 14dac50f1a..5d9003addf 100644 --- a/addons/medical_damage/initSettings.sqf +++ b/addons/medical_damage/initSettings.sqf @@ -42,3 +42,12 @@ [0, 1, 1, 2, true], true ] call CBA_fnc_addSetting; + +[ + QEGVAR(medical,enableVehicleCrashes), + "CHECKBOX", + [LSTRING(EnableVehicleCrashes_DisplayName), LSTRING(EnableVehicleCrashes_Description)], + ELSTRING(medical,Category), + true, + true +] call CBA_fnc_addSetting; diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index ae56dc79c8..453293e159 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -703,5 +703,11 @@ The chance of dying to a fatal injury. + + Enable Vehicle Crash Damage + + + Controls whether crew receives damage from vehicle collisions. + diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf index 1975bde0c5..9eb799cdcd 100644 --- a/addons/medical_engine/functions/fnc_handleDamage.sqf +++ b/addons/medical_engine/functions/fnc_handleDamage.sqf @@ -94,7 +94,7 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { // represents all incoming damage for selecting a non-selectionSpecific wound location, (used for selectRandomWeighted [value1,weight1,value2....]) private _damageSelectionArray = [ - HITPOINT_INDEX_HEAD, _damageHead select 1, HITPOINT_INDEX_BODY, _damageBody select 1, HITPOINT_INDEX_LARM, _damageLeftArm select 1, + HITPOINT_INDEX_HEAD, _damageHead select 1, HITPOINT_INDEX_BODY, _damageBody select 1, HITPOINT_INDEX_LARM, _damageLeftArm select 1, HITPOINT_INDEX_RARM, _damageRightArm select 1, HITPOINT_INDEX_LLEG, _damageLeftLeg select 1, HITPOINT_INDEX_RLEG, _damageRightLeg select 1 ]; @@ -204,14 +204,15 @@ if ( // It does fire the EH multiple times, but this seems to scale with the intensity of the crash private _vehicle = vehicle _unit; if ( - _hitPoint isEqualTo "#structural" && + EGVAR(medical,enableVehicleCrashes) && + {_hitPoint isEqualTo "#structural"} && {_ammo isEqualTo ""} && {_vehicle != _unit} && {vectorMagnitude (velocity _vehicle) > 5} // todo: no way to detect if stationary and another vehicle hits you ) exitWith { private _damageSelectionArray = [ - HITPOINT_INDEX_HEAD, 1, HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LARM, 1, + HITPOINT_INDEX_HEAD, 1, HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LARM, 1, HITPOINT_INDEX_RARM, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1 ]; [QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "vehiclecrash", _damageSelectionArray]] call CBA_fnc_localEvent; From af54808f675de1d2042783cb3d1296aa02e30356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Boros?= <43353942+Malbryn@users.noreply.github.com> Date: Tue, 20 Apr 2021 13:33:58 +0200 Subject: [PATCH 121/335] Dragging - Add new dragging animations (#7950) * New custom animation added * Adjusted CfgMoves and the script components * New drop animation and key handler * CBA settings and new ManActions added * Adjustments to the drop animation * Added translations and fixed some stuff * Update CfgMovesBasic.hpp * Fix translations Co-authored-by: Elgin675 Co-authored-by: Blutze <37950828+Blutze@users.noreply.github.com> * Use the same key to drop object * Update addons/dragging/stringtable.xml Co-authored-by: Jo David * Fix French translation Co-authored-by: Elgin675 * Lower the weapon accuracy of the drag animations * Removed auto-switch to handgun * Update fnc_startDrag.sqf - Holding a launcher breaks the firing animation. - Now the unit has to hold either a primary weapon or handgun. * Handle the unit's current weapon Co-authored-by: BaerMitUmlaut * Update addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf Co-authored-by: Filip Maciejewski * Update addons/dragging/initSettings.sqf Co-authored-by: Elgin675 Co-authored-by: Blutze <37950828+Blutze@users.noreply.github.com> Co-authored-by: Jo David Co-authored-by: BaerMitUmlaut Co-authored-by: Filip Maciejewski Co-authored-by: jonpas --- addons/dragging/CfgMovesBasic.hpp | 48 +++++++ addons/dragging/CfgMovesMaleSdr.hpp | 118 +++++++++++++++++- addons/dragging/XEH_preInit.sqf | 2 + addons/dragging/anim/ace_dragging.rtm | Bin 0 -> 318648 bytes addons/dragging/anim/ace_dragging_drop.rtm | Bin 0 -> 409836 bytes addons/dragging/config.cpp | 2 +- addons/dragging/functions/fnc_dragObject.sqf | 27 ++-- addons/dragging/functions/fnc_dropObject.sqf | 9 +- .../fnc_handlePlayerWeaponChanged.sqf | 4 +- addons/dragging/functions/fnc_startDrag.sqf | 42 +++++-- addons/dragging/initSettings.sqf | 8 ++ addons/dragging/script_component.hpp | 2 +- addons/dragging/stringtable.xml | 21 ++++ 13 files changed, 258 insertions(+), 25 deletions(-) create mode 100644 addons/dragging/anim/ace_dragging.rtm create mode 100644 addons/dragging/anim/ace_dragging_drop.rtm create mode 100644 addons/dragging/initSettings.sqf diff --git a/addons/dragging/CfgMovesBasic.hpp b/addons/dragging/CfgMovesBasic.hpp index de15271416..6b55e82c2d 100644 --- a/addons/dragging/CfgMovesBasic.hpp +++ b/addons/dragging/CfgMovesBasic.hpp @@ -1,8 +1,56 @@ class CfgMovesBasic { + class ManActions { + ACE_dragWithPistol = "ace_dragging"; + ACE_dragWithRifle = "AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_2"; + }; + class Actions { class MoveWithInjuredManDragger; class MoveWithInjuredManDraggerRfl: MoveWithInjuredManDragger { Up = "amovpercmstpsraswrfldnon"; }; + + class MoveWithInjuredManDraggerPst; + class ACE_MoveWithInjuredManDraggerPst: MoveWithInjuredManDraggerPst { + Default = "ace_dragging_static"; + FastB = "ace_dragging"; + FastLB = "ace_dragging"; + FastRB = "ace_dragging"; + grabDrag = "ace_dragging_static"; + grabCarry = "Helper_SwitchToCarrynon_pst"; + HandGunOn = "ace_dragging_static"; + PlayerSlowB = "ace_dragging"; + PlayerSlowLB = "ace_dragging"; + PlayerSlowRB = "ace_dragging"; + PlayerTactB = "AmovPknlMtacSrasWpstDb"; + PlayerTactF = "AmovPknlMtacSrasWpstDf"; + PlayerTactL = "AmovPknlMtacSrasWpstDl"; + PlayerTactLB = "AmovPknlMtacSrasWpstDbl"; + PlayerTactLF = "AmovPknlMtacSrasWpstDfl"; + PlayerTactR = "AmovPknlMtacSrasWpstDr"; + PlayerTactRB = "AmovPknlMtacSrasWpstDbr"; + PlayerTactRF = "AmovPknlMtacSrasWpstDfr"; + PlayerWalkB = "ace_dragging"; + PlayerWalkLB = "ace_dragging"; + PlayerWalkRB = "ace_dragging"; + released = "ace_dragging_drop"; + SlowB = "ace_dragging"; + SlowLB = "ace_dragging"; + SlowRB = "ace_dragging"; + Stop = "ace_dragging_static"; + StopRelaxed = "ace_dragging_static"; + TactB = "AmovPknlMtacSrasWpstDb"; + TactF = "AmovPknlMtacSrasWpstDf"; + TactL = "AmovPknlMtacSrasWpstDl"; + TactLB = "AmovPknlMtacSrasWpstDbl"; + TactLF = "AmovPknlMtacSrasWpstDfl"; + TactR = "AmovPknlMtacSrasWpstDr"; + TactRB = "AmovPknlMtacSrasWpstDbr"; + TactRF = "AmovPknlMtacSrasWpstDfr"; + Up = "ace_dragging_static"; + WalkB = "ace_dragging"; + WalkLB = "ace_dragging"; + WalkRB = "ace_dragging"; + }; }; }; diff --git a/addons/dragging/CfgMovesMaleSdr.hpp b/addons/dragging/CfgMovesMaleSdr.hpp index 715765679f..dc8a4c83a3 100644 --- a/addons/dragging/CfgMovesMaleSdr.hpp +++ b/addons/dragging/CfgMovesMaleSdr.hpp @@ -1,13 +1,127 @@ class CfgMovesMaleSdr: CfgMovesBasic { - class InjuredMovedBase; - class AgonyBaseRfl; + class InjuredMovedBase; + class AgonyBaseRfl; + class StandBase; + class AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1; + class DraggerBase; class States { class AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon: InjuredMovedBase { speed = -10; // 1/10 }; + class AinjPfalMstpSnonWrflDnon_carried_Up: AgonyBaseRfl { speed = -10; // 1/10 }; + + class AmovPercMstpSrasWpstDnon: StandBase { + ConnectTo[] = { + "AmovPercMstpSrasWpstDnon", + 0.02, + "AovrPercMstpSrasWpstDf", + 0.025, + "AmovPercMstpSrasWpstDnon_AidlPercMstpSlowWpstDnon", + 0.0099999998, + "PistolMagazineReloadStand", + 0.1, + "AmovPercMstpSrasWpstDnon_AmovPercMstpSlowWpstDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AmovPercMstpSrasWrflDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AwopPercMstpSoptWbinDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AmovPercMstpSnonWnonDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_SaluteIn", + 0.02, + "AwopPercMstpSgthWpstDnon_Part1", + 0.1, + "AmovPercMstpSrasWpstDnon_AinvPknlMstpSnonWnonDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AmovPercMstpSrasWlnrDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AadjPercMstpSrasWpstDup", + 0.02, + "AmovPercMstpSrasWpstDnon_AadjPercMstpSrasWpstDdown", + 0.02, + "AmovPercMstpSrasWpstDnon_AadjPercMstpSrasWpstDleft", + 0.02, + "AmovPercMstpSrasWpstDnon_AadjPercMstpSrasWpstDright", + 0.02, + "AmovPercMstpSrasWpstDnon_AmovPercMstpSrasWpstDnon_gear", + 0.02, + "Acts_starterPistol_in", + 0.001, + "Acts_PistolRaisedStand_Default", + 1, + "ace_dragging", + 0.1 + }; + }; + + class AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_2: AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1 { + aiming = "aimingDefault"; + aimingBody = "aimingUpDefault"; + aimPrecision = 5; // default: 1 + }; + + class ace_dragging: DraggerBase { + actions = "ace_MoveWithInjuredManDraggerPst"; + aiming = "aimingPistol"; + aimingBody = "aimingPistol"; + aimPrecision = 2; // default: 1 + canPullTrigger = 1; + canReload = 0; + ConnectTo[] = { + "ace_dragging", + 0.1, + "ace_dragging_drop", + 0.2 + }; + disableWeapons = 0; + duty = 0.6; + enableBinocular = 0; + file = QPATHTO_T(anim\ace_dragging.rtm); + InterpolateTo[] = { + "ace_dragging_static", + 0.1 + }; + interpolationSpeed = 5; + limitGunMovement = 0.2; + looped = 1; + showHandGun = 1; + turnSpeed = 0.5; + }; + + class ace_dragging_static: ace_dragging { + ConnectTo[] = { + "ace_dragging", + 0.1, + "ace_dragging_drop", + 0.2 + }; + InterpolateTo[] = { + "ace_dragging", + 0.1, + "ace_dragging_drop", + 0.2 + }; + looped = 1; + speed = 0; + }; + + class ace_dragging_drop: ace_dragging { + ConnectTo[] = { + "AmovPknlMstpSrasWpstDnon", + 0.1 + }; + file = QPATHTO_T(anim\ace_dragging_drop.rtm); + InterpolateTo[] = { + "Unconscious", + 0.02 + }; + interpolationSpeed = 5; + looped = 0; + }; }; }; diff --git a/addons/dragging/XEH_preInit.sqf b/addons/dragging/XEH_preInit.sqf index b47cf6628d..9361d05015 100644 --- a/addons/dragging/XEH_preInit.sqf +++ b/addons/dragging/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/dragging/anim/ace_dragging.rtm b/addons/dragging/anim/ace_dragging.rtm new file mode 100644 index 0000000000000000000000000000000000000000..e3f5f6f611323bca404ac7d20ca23b5f3cc8c411 GIT binary patch literal 318648 zcmagn2{={F8vyW|A|#QLq$0b75aOPBMF}C<5*1}lLefIYl7v)JN%2J`ZD=pWnNg{v zO{o+ul6DD|wDF(Rr+=T^`#sP1xbC>`IWuR@d1roi&dI^a)&tpb1Z%4c>m>NU2i$e^YagL^bcMf=65zdxI%^S7?}Kgzpr{?E^M-~6BD-8cWc+AmEUFA;x zix>f0PDpUje?Rs6cN-sHUfrAX zqr8W%+Zp6XIgjq$`FS4QyQ{p1?){(g?(O$u`#<9U{CxNJ`?tJ@?%fr?v%GuwKg+v^ z?<()1d;d}1y?1c_DF4gm|0w^<=DW&!=-z*p|78RJwom8h|FVI9%X{eFUGaP9-hY<& z5T8f)?)*HD?)~%pb`G)e`P;>X_R!ArqsP);XD>n!I{z0PtTyU+2Ov%n{G&L2(o z$1j0%76*Cx|21`X{T;tChPT@sVC9|`4~}lZ3DTz6D8UC@J+EPAP z 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
S?60E^7xx&D<>LU9 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 PIlU&+sw@yB*sY z-JSYG^WtDAq|cj6AtEsOeI!cjvkDS|8-Cp{f5-d%ZsBkgFIW=Mq8(i8s8JwYz7(rz z%_o*Sld+ew9DII!8mGIC1wo@WwgtEG^Kg6ewevPk98dEg=BBdKmW?D5uiv53 zdNM>HMHR%RQiC6y2AeG3|N6c?ESH>yAWvdMt?<}H0kCYYW##o2kaGV$*t_3X^mNMs z{N=qp1RoItmEr*~XBdC;jJ{NYD;HWrgN7K~Iz5t{R8u1CjweVfPaAg5;$o8rCU7jo z0A;`R=ty)pLI{5r z(E-!ZS^qW4KV0A`?c0#yw{$E&Fo;w=oryc?yMf1Vi?I0qP>?{|k`q(2@KbbNQ^W?`s;mf^ z;m`P*XM9;EIyUYRPNip|6WOD{!hj3*X2WszNCQ}t(ucgs69B#AkvN3rdFD6&$b;@> zx#YAhzkviCZ(##wDiIkv9~t%wgzFInSX*m0JR57kP73Noo@KOt6q~`m(;xVnr((Z( zaCSutcSPX@tgcpwvNn~VJEuJ1VWB44IxLLXJUf6mgG`w(^8wzzFyd>Tx?0o#r_d9| z`@2}R>@FKLBMuDwgt60*o9Lvu2CDkv2cIOhu-B;+nlD%P&wisv^Ypmx0w<$08D`l4 zB9~x~^@O9q%S9L0+4P0+EeR;l#1TrKq~YZ%E8xK5mp|h5Vx9^^Y4hWYip*z0adO(_ zA)7g2DP+7UXD!nELEF56Xl2VZXq7d_c@8VVll?j0p%?QE(+dLH4u+}y>l)Tje8@K2 z#et}#FrIL=8oldOM|HIKfUT1j-cpkSsVUcge7;`HGsY;4_GR^AhsK`4S?xv0sfeId zD-ZDTC}vvT%_FZS@Q`FUFp>@oBp&1PHP8O8vq2>#i8*zt125OUfEwq$LzT9ZKuCBU zwN7tx-{dli{HV=52?wZhYW=={>CHTqi-SOWCaqR>&A{NjfBs0RB<}} z+=Hg<{2s5D%gfnv+aF~69p`;Be1v7is?q2$+UspP?Pn=rgRTV6CXV0kque@eW=xtD z?A&yjuX(z>^n~Tsa#(?M;d8SNy$I-y}gabFZIDPSzo{*i@$k> z-0DYKFF!@=UXO*o6CKFuufpWk&9zuAAr2K>G9@BuYS6br9f~=6kR-f>jMRC@*E|&; z&VfGq9OiRw8!pVZ!&Nb%kgbt}B_eJi`8Bi*NNgHBQ*^iZ>TL@`jWT@A(>KTmYA0Xe zT^H-Zc5zd&Ps64Tib`U2q2!x9WG)EjX1q8c`eAHDhT1&8-f6&C@n11oW;8B(4kD zc4~BPyBTXanZDD_3gK&>w%21JBT$N4Upxhez5m4C9O^_H0MOcYt_o7QEd}m7(#65U$JEMQd4X!=B_aj~} zi7Q3aJP+ph;s}?~AVJOZphzK8U~UTQUiskXx1z}wYMwG%o0zy~bS~VOpLtH*M)})c z%GHnUxc1v7{EV8XA~nyo)I6tGCF1bhYP>JomR!*MK=(Hz$%183U>W_dJhmT)!ryjn zp42=Wsd+BidJyM~y~oH<^PF25NaA#qiCYRo)b>Xp-U)l+z@CFX7x|m#CpyFEAT>|t zKy8vp&C`~e=M!q4-(sXljJgw1vd~~YZ_p!qXB5HI3jXF9Ma{EyX&39XaS|YEp4+K; zW}T9Q`hZPXl$vMK?Hs0Yj~!zkz8ap#{%ZzL59WD{nr9U?&qQYz_}pPiDyex&st$yu zdj(0@CpyFEN*>R0H-}AVi-Zc7obKz}gL#gl=9yd`jlHwIK$MziCN=N6j{LQmV(3^DDzs92) z`{6uV+rEvO=h+*vLK&dIsp5E$#mOdN{<{DM+D>)I7&p(-}su ze$=*4$`}s5&Mw4m&Nn<%bQM0A?~3!l1l|q)S1*Jf%rjjs0nu_A5?Mj>-G7?rzGs%O zN?;~&pWBHsHP3UYL$GKl&D)G??Ed@c!92sLd4^pq$FkNM;Bd(o%Te=8vsQs=5zX_gxxvVO^MQb*tN(dE|0&P2UgcfH8=vXYcRLD@H*6#cDAFT= z8w=3BkCDs)D|fIzeTi?Lr=~y!FEmRB^28Z9tQbK8=ZE4q3mLSUn~7vU8j|-7>aeOr z5AXJQ1u~CE0l(Vz7$bEsy7B;zd7wx{*ZJTFvbqpbF@~J;HwVL~!{F|ie3U&>l&3A` z03A#kU-O)=Ckj=gF5|6Bfkd?KLv0TNVaI^w*!Sc__{`R_cA4_aS_ob^4#8N+5I(FEAn%t5f~;H|R(RwH`I~iqnMwCs z!T&`EsW*`YQ`01L>b?~bTx$wD#tk9C!%9)5n=_hWwF)+_qy05#f7R~g z_xA^&a^@hCUwGM~m>R*wVO?0sp5|2A9>ABSwcu;>5Hi8J9mP*Rh$0UQz>Y%x=6QIW z6Ly?TbFE5d0K3wNyqc&@*4&?qo^8~D9BT=ZdHEAsJ1~YRtI$A?&AV&mdooYG+b-BP z*^by)N|C*^pOM+5H|Sxz9T_7}=PTbmkLyGyBagPrOvSlW7;N`rhQi<9w}<7DbHtjm z=FkY-GRGh0F$!e-R}HeOnr1ZV>BFNKQ<70%&cwW%gw}h~nk2;EJnu$pA^#_@P^iBb z)Fw|RCvHE*;x*MMv0Mra`;8;DmotXlNwY63dx&^`CQC-dAYAqWH4WHFKop2R@0 z4VfLFJ*5_&K#eZu;AAnF9C~sNIryK#T@wUBMz;HY>B&52Y^ubkbH|aTE`3P-N^>ZD zmdBJ1&?8w2k`P4SC7(Ph46+>&Xws-uI6k|(|7%a?nM{8`%dOhn4KC`Sw>JTcThV%5 z<@Gq&Uk3bg%5b9mSh!L85~W`FjNW+hH&4Hf!MJnaIGF!Z4i5RyT#&3`#A%2CB>FLs zF>@8J&m939lG7MV_e$Q_V;lLJr)TMHZ0u%7R`q*=y+mz6^74H4+$LpGCEkfL7R!@h z+6${FXC*p0V-@6n>iqTh(Zh1d;fQ#VY@>bbtV5qsW9}{1$aFr@Q_I7)O7GF&PbcvB zZT4_<9G%^)DG95~x{b1jSA-lvTOQUMX$ei*5|FE+PU2=LlNin&bis6+3 z@91b`seHCXw5i)rdsr?x9U%&6MbjeuZoy*0d9;T)vLG5-bAs`7!8mw-S(R0|uZvd9 zk-#A%G@(O(|9_40_s0RJbHZ+9Y?6xMKoALE?1)9-*DkoF~cZ2QTVtZf-VmYM0m(abt5qofJayUbv;*m!jE+Gc#? zxI9=&zu{}1n?~(MSgR2qIOj%=`D+0!8iZ?|V%XJE4;;n`lbV`7@F+7LhZ#D9bE5wD z>)Xq6$(b_n7P5@4!_PKNCHEdKMkCS#p|9&v%)0qN#~@dBch?&fJJS-&*O)^7e9n*c zyq844@K|cYAtub@Iu`qVI)Dr+O3}X-S!l~Fo);;|JF_u^+>W-rCc&5hHb z*v^Idwn>73x&xkgHUb78nu&E*3W55IP3V@U1C$D;;L<+Ha3JRWkMG+HVojv`x}4ID zT!C^iqV}nY9dly|JkgZIE%!vAS=R&w51j_jSLx$1hnCYCj%z>S^e#=sC63w)+;IeH%GiF7{ugVIuM99gmg#5#WN*Lp#*5XW#ji#Uc2K7JHG zI)4PEOsGKW^&Sv?XAko}F@z*-D@U1qv>CU3^qs38fAiepI|s1qb|$U)1>OjysC~(6 zln+y2YX5a;+H)V0Dp`rVOk|k}BM_*{w(&L3y{W;lYegi9u zO#(CXFPfLRSrbnlmI&T^AASFPz1%LGWe^3D8wZz2on4L>_f6v_Z;6MQ?eurR_uO{GZ*KeBHGYtj4NQ4pGd3RRjCspKVa3rbtmSbTHSS{3?zrh7qa)2)o3HIyw*0wLJ z_J+l#V))F}cC1~!A8R;Cz@q}1=jneMJ>xlpz_~``^XdXuX5Y5o{lEti^BVyLY@LOS^Zl%e9dz+4uV4&6L3S&DXjnL z0~_(&2$}*6iLgc`vX<6^m5Pe+IDa>5w}kfJJbs?9dEQQ&2g9xj;18$iJ7hHt>_+zl ztga5(`XnD+(9;8zMQYG8)tN;D#sQ~YmalorPg(*~3;T1kg2!R|M;)x-eMc~$GmK`J z$)a)%X*i)~53U3EvvXC)KpT($45R!5q40K(2Y$a{2Oc%~1e>>18-n+9NlWkV9-&)QMrVFSu!FKrkJwTVKcq*(yYrRjruG{*Z1W|E4jCy~#d z_e|5tXs9~z_&;arf9|<||9ec2_D{X=3|CyzgjcKpDJi{;LY7!U&|pPkd36Gbt+Olb=yR}_@Hfv6YM%Ow>(EDP zo?EDSCQ$R-W5FdF)I9g9IT0a7gIS}mN0wha3F0h&^E9RAX`I-_4&5{fMo{x~n6w&M zpOyo2|4n$BTLdYn&tW8s9hv4wX|$e~zj>~w=4swBX^V~ws(^=XWHfMW~EvuK~K`PC(eeOHnXLdSKTGNjt6rSdZNz8y^ z`TsM@KRj3eHqT4cJP*rf>t#41~-a0XrCqd0~XH*Qyv{qp5q{Nav#UAL%^#t-XXaf|P@i$MP<~fwO z;zDYk)-=yEgPNz$Vh{2rB9|%7UPwBrd2SdJLM8?$LQ4jJ^DOFmjN3+sv*7FpZqz*U zJf7&ILY^ULkU&m41Zwa%&so$wM+|VoQm^b$%0UKqvXA>qt z47F=4CRy)Y0jcvh&%=sRXbv^cuhcvZsd>uM+V&=Do;gk~B;Ds5j-%$OsWlDzjx>fl zFZkzqPLWSQjgdg)E9K!UHP2|8=Nb6i5^6Xz$!`BnJnvEnmJ^i5JV$kKaOH2Fv#5DW zTq?)ssCmlP_~JVk%t2?II=l%mCoag#EC0^mu4rWM;uX$P(XuvL|J9zUrCGtf-0LPW;g7Qg2V!PWE zj+zXIY4U}LV>X&6dSePC7_aARo`>d(fc4^wxaylF*;=|7Z>FL? zVA+s_KMFfSmzm-Bc)cu_9Cuq`c>LfD<6h}bI8yEC`D}X#9nYeURVK7A`%rR2Cf1bH`O1O#ZOAgiT_6w$p#S)bt~Jq@E{5>6-~ zAr&0u>DtG~Jj8LkGNu}NKdNR*} zV$-mHgDtU_lOff07g0;$N3?y|1mYX-4@UDZ;f`Dfq#tvMNgI#~p5cYRzHd+FdBdv$ zi*HZF**E5Ze5eBPl2#>Fm!9GygY;n4L36?}Jk7L4IH9O7`Vged-#q7>8i^Fkn-O@= z2K|@zleGS7p9gkeqf8RpSfcOrP> zCAzW69zH0tX!s!$7$P*3yjfg|xXL_yhW3+;cJ01jdNR-0rx^DjoQrsNeGdV~Xlj{MEDqdEjfO|=AXJw-S{-)$>gkRk3H-XY^W za}c%Pgm)iO08_6N#`23J@5X@)zUDbTzaHZnwQj0-bx@DAR=kT^m^y+Ls2E7UKx%*T|xghhuE) zVctM-7Ymt1`GK90|;Ws0+AwBu= zf8+hZJQwbMfV|}g;G-VCWZ`{T65lo&ie}W}%XF=9dSndjkXguM$#(pa&TM^VBJlls z^imeVIcb@TY>wT>mmkd_&JVTW=0$TjVbjh&eyRo9U46-;c{E4o*a|$i$q6`>rr+cB zvRrbOovBCMTUW5#Ku6-kEJLBRmUv9|e*8_z8*1&6Sdo42kyFGZtY2#aj!MEm*56*t z^UjknxUzCNBPUvfi<#|c@u5qo?+`DLtC@&yBnFc!Duw8C-@eSN3k=LrH05ia^CLsR zZ-X$ifm?<3Rp`9Qhf%>7To5h{{iU}fPWTi+XOn5qyhIpO@Zm?iUJy%r>vVWF|Gq`> z=KkdH>ql&y*%A;nQ^vkUqRPRi&Aq3GZE?L(BFc8ZM%V?FH~0@V+0;N#V@{oR;*c;iPmKZ5l&^fv^VO$dNX$uP(`>5nDya(QnfEfNSro!JiC#c8 ztIn`DRYTzJq;hrvHRuTIobUH@FFzmW_S+B`Bpk_J99@o8j+|iv7A}KY>3F7E`W&(@ z3$1NB7T#TVaNiT>&}r*uXg8gmV$wc=o`d~J zb?!A(Fv#@(ZIhybcqtMZA(6_WN@9Q@k5aNjN zHP2fcd_is5KC`EZt+;=zJGQT%1CcMTRbhqL)V z?sV344rEMO&gQzm#EXR2U_n<4SbbHIB#D>No=dv0Ww0_d%HA?JTww=|A4Dwp)wb*F z%!Ym}2Onr_#n(gk;WRqqQ1hk@si`kOTC|_%&6!Q8wknyca9}#*+t~6o&ysc@U_O~+ zkH?Sjjm|mvnw2ITS!P0{6zY+VgE{==BL?%_-tzWMn+&CUPVqHQ+45je6tu#zFADLR zmUpa~=va8}Y)H`JGL#iWjdH9Kh^{%xMh&GsC1r+ukJro3$C=|F3e9KUu{y3r_@S)^ zHnlUQma9WHo93aJbOzM+J8DodER-!58wUyJck`Xw9({5Nb1+S?u>(?_LJc4owdO6MI*zqL+z3%I2|J^gZTi z2`-u0rwF~v9t%nO@=&W^!3H!;gv?2U_?qXH+;N~9n8qHbv!p(Hh>$UlIKYk=4dOXG z+#cpZ91jKL2WSFC`<jB)xY7+9nT#iHfF*vOse3uZxl!{xx!)HbrRI5rnrECuAv26?3YE`&=-iBG(m~Dh z^vD**{A(ge0{`0fs1NNJQS)3G@ndegRQW(!E0Ktg?ybh|)I4Wsf50}(Nb>6NV#rA5 zU)w&Hnx`){&m3x=C(Z6L;nX|_Tnr?l)I9I5U`XVF2-F#GPZrgc!l5<%&9jY~=U!@_ zX+hfLC^gRlYMxeHE{TekBJWh4$R?!0X!z)n^Pwj}GmXD__M_(6p4`QrrRFI@&9jM` z=Ot>Mt-hOZ`HTp%?@kUAeb%1&xFQYqujF6b9#744J2g+CX|!gNn&&xco+@es;msaF z^5%mFIbBWXwhMjYS;#B~FK_;}?Ozk`BAtq8{GOWU18Sbl)I7~-otl==Jsi}3E@^r& zf}LluhP_l954BG>{@4@!eZTZ@h^wXMd6$}J8#PZ=YMy~<%W)euPa*AhysgwcS5xz} z+>d$guG3-ZRQ|Q?>#2E4`llk#Y-jqM@+9S6sn{Z}0Sk_+V`8a!PJ3_`xm`3MH#`nQ zZvFqo`@@gIu=3F`@7-S)I7@% zFn9zt&sh#Jv9M8rzj?M(^TgCV4^Z>86>G=qsd@orslbxny39Z4cK|v7w@O$SxC*(o0{iBn?dAaaXE^fd5bx#PZzkXCec0ihS6x@LX#0)olq?KY`%-9-|&s;7*A`tM*Pf^=;aXSa6lcr?!@3r zs%Bu-aT6byrvur#@(`@8LS`8nka_*`kZ3<2X4*|Ra2j%fuX*l0VZi2`(}I;r2oz}^ zdhWz%yjo5R4KLe_mRui04kW6Br_eO4y5c2ho!91To|-zEP!Lsz1$QWs4_ia(=D`!TqQrFc|)tF`tUY zBq(3=j=l6%7G7RY!e@ujUWW4M=N`YuvIx$#euvQB>>Jp4t2?ue3=f?#b3_^1sc_%F{Qu(p{s8p*GK6ejJDay*`cybRf`>f!ftFVaB=oQnSzP}LZ)9|!GL1{*yAClq z%C2bD0wb7b%HKR2HYy>F;QI(|^MxU&rjoUZPjNx|S>&2N0CZ`8PanZ_)VIkDmoErH z1G2h*zaExL&T;_}c-4HFQB83pg3st2pa*s!`{4qbkueqqnGGiuMi^<`B{-^+15<`| z-!DCxr^w)o_(m3&$QFu|vFj16Xf0=UfhH-l76bRg+T_DzK@c%ngpB1w@qq zniG}tSs8|2r?V<24=2;Fyh7F36gH{v#Lcw|@X0=o;rKwfuelz%ul?18)Z z$&GR3P<9tyr8EiZW9`_*e~lms0nI2bPn9sk6yf5+l}LP9D!grJ{q=o&GS6duW|PLy zgKYlA*C^siD{F2ZLLOKWoT1Q$Dw-}}?v^P~Y9tOXouxn_h`)KdX_nxG5H1V|9t>PZ zZQ`z=LawkEP#Ne{9mK|{c*rqx_Up76b!$0oQS zX+9`;@4`0gLLswX3epK*fsRaAg!4_c;IwYrf8+iBIN)49`UvgL6T}ny`I7oD8M1P~ z80e^~!Bv6UaLkMPIA=aelHQHQ17ty|Oyv9Z=*>K%RgWPdsXN#weg71sruz(jXxUNolKbbF>o}$yt7n*UNIrY3JQVKGl_Yv6U0aeVc$To(=}Tq@6h0 z#|!cnY-NwE`-t4SoG_2h=F)NN$Jaa`=!Sz_cpk%TJc2(rryNuOz*$)~dA2IP)T_H|`gP)cpLI2r# zKYqVn&`$YCC~O#chCAmOi)+WUu{^&hST!{Sqx&b3m`XB=atnaFw@2Ua5xe55s+mzm%Vy;Bi^f;jtHHBS5N0R)zmfmon1^KEb|;#YlSa3uNTz2oe74(G|5hWbW)zlo3+TMYp(+ws7G0 zc=YT3!$H6OyDBvVDvnQKrMoJyZF)JQm%0?*t*>D!5qGUVc8#&PVe=*+Y+wd{K%QFD_z=)-HvKk@ZaZ1s>Yt+80}I4gpJ4%bF%9!P>)H ze*V4nY@Yi!M!_@rXS`vt^gUsmJGU*K&Zv@&WhLd4P@tk8GjDVh*qdr$DVpb*WAf^I zyk2e>4&zPpJOv(|)wrCDV|i)Z8FYq`x?&J>X?ZgGs<4RldmRZTBh~SNd^*4W?T>z= zy_sjm{6ILdZw)th&Mmy?Y6*H-)Pe$LI>N)`sc6qKKk^Z-poY!2xy2ZP7Vg7$hS8RB zv%zm02j9`4sI>ShxuX)Cq&4uSG%bA_b z9lWN_14q-mz&HJJaO-%C^uLy(%LeWsn7xGejo5&gQY+uN?fW13fx47D_nKWZKD%`m z<^{}wkEL~3=u{PodfJY}-`Rl}jVDlQ1D%RLyktPW&ccY7sR!v6 z%FsUY3>&b+1{#HJ_?oA6WhflI*T@bxD8dWg>*2oROkuR84#`qFh!!px4Fw+Ruw`O2 zD_Um_9N(6+{N}dH3dO;W>#p2ai^kyXqnp_PJtv5*k|ffz`y;=jQgBJv0hT*oVvl$l zLbOFDU-N8nnGfkVrs6X0W-Pk>0BhZ(LwiJ9knIL1(C#^7!8v^d7{=XZ2cn7K_*kB= zd74eN21Ea)Y{CQ$u)IoVTL1M8iQdbzsS<;iF7@t7WZOzO&kr*g$|5=OPi+Rp5 z7zSm>pWyj6y1=xE5}aF$wk%{|eUmKlQJG9EcWaq*UZyd}kUIq1{XA3ma)_Hu&C~aQ zFBWng4V$QWo|Y_RVySt)Z}Gv_)I2+>dCCua%!HgugnP}Gx=pNyL)^3X?KtVnCj60_ zrwh&VTtLlp2{q5)oN9byw=F57=9z^@l3ODdgT5C38Aj>UJTW!T*VH^~EbcM3)I3*E z^YqtJCMMK8l@3OrtpX0@@tRUdGv;reLbRW!Rb(A%q~=*q%~QtuCf-lY^HP))aiQj! z2^vhB#WM$L1C*iIZy%~R^NDG7_XhQg?MT2u4%q~@7=DUUa5yD)nyEdnI_ zX8&Kj-#4lKXr8BXWi>=uRrud{e|WB* zqUM=Q&GRxfPitzPVY6tSCpFKV6Y7|W)I2Xx^K7%D?^uQ$h8gkvXBf?<<{7~qz)tB* z=RVs$mDit|XDc<&d9DhK5j9Ww(;kScok;Fhrh|$GfAb8a=Gk<{6>p>Fxs;lx{)R-n zj+$r1(p*O4?>tXxo+?ctwD(p5TJhiBK9@GeDmr?UPLd{cRQ5x&|t_j-@&1a@l z^Q__)^3*#th`iT&ILP@|9&`_fxRumAYee1Xs91Y6oSLWOa{+vtny0<&d{h`3O`-~O z841+{!VyV=^o9Iq7!9W8>3HKcK1I#*F*VN{X5s9>+p%Oi-3zu-^OQ>zL$>vcN&d-c zP$k9RJduhN(x&DqZes~K)I6Q2c@|OgjCFJ&cov-l*l!j7)HWTjeqaQ)|L%AD{ZRP( zA+B^p0xF>9`GJ~eF*VN{)I7tec^>@cPAcYfVoRE5ME=f$>8}Rw_5Rh*_4}0v_{K_sN1WA zL7nbHzB=@Q@WZRIWT-v(?fKCkw3p?Qb39lSJ~TXFo==!TY-t_b!>oz$>TnJEtYidB zOXNtxVjc=MEyWEUf?%|M#`n+Hn|ZF^T!2||E;+wnnpj;_0N6Fs6;1`UU1k3l@AtnCh5o}x-marO&s7f4cfluIx?>{o%qqhPlShK*BSpd; z`xMQXk%u%ns8e_8$$m$Dmt0(g`UOfXx&9tI<77E09%XKvBq5y1vVMWY6eBrF(4Q%?>9_7ka zFjo6h;7sI?{$zjuemyLgoX$~K@Uii0u=Y}KxNE6M8dVfX+OfCz&>(GSzrc{#vpbm< znHgwWvI(4@&fh#g&R0NZ*;{CUoj-iM=}1oGJ;nJ`ijc$*2@p52BO|`7Mq5vrW106+ zsOxIC@%FG>at<4bLgtAF%<2_0NV>&qWLZBEz9!Y697`jZ7$-+|KPW*b=9FR477l3X zb>A;NnP+IjMZEQYgxz^qP22kb@FP8sec7DO zPsvj}|7$01r#wmba+KlD&O#4C;Zv2 z@^X3{d%V_es-{;ij|Wd(8EF5#7er=BHqYUq#q_`zbJ#zx7r=2{)-Fhmm0*p*6J6B7 z$~K9Plrx9>*EPxO>nDY}xf#F5E6zM^O$>?VvQhM{ek7~BR>!TL8w2vL#x!Md3`h@I z$H$df6Yq^`G^0TS(8PV%hFQ2bUo{WP_a*9Dgx zLr@HhB@S*|=}CbiI(X?cmV|CvkSK%@=dFC*{6P>@C(Y(p zN`u;=bZQcX`|#sOHOFgZx)dZ-))B)PMpbjCFb|bPl4%(TDYsYC`r7I6tt^L^DgH{b zW;xT1(Z*1{Pv+EWmul&HgNHAXPNzZ%iB+-ZB$((wBAa|AMp=>-n~=aafbe~9SQml|x2hx0kV#@h;t zY2;z9w5ka|w$~E6>_#F{>GO(c-*Up7$NgMIZ%-De`<(b)+#~G%#2gHQf+U)!bb=3j zt*hp^A9eKlhXcfa&QqfMa59+dtt4ADJXxpo5+akEC2W@|gf?T;C7S14!$44yZ_95i zFQb1slybKe;^2u*ZzAQ%h*lqcx?zStu-Gbo&YMIScq*;=es1OT37%s8(na@~sEy8X z+Esr)_n~7PEbG&s3=AwJ+u9h?P8|Y3aQzx@QI-fxxu5Y`xm^Tz{)z;hFXf`BHwje5 z-$3|nLpHHSQRpe!nFmUw}Eet*UIG;Sh)Cue|cL@B; z?P@2;&3Dew$&!ki{x;7$yhQVS`oagkjdv8zYI~Pf%yOe2XM2L6=@LCRw2TZs`;t7w z{RcfU-rwda_+PyLSeyUPJntrXgLgYezRcnwRos(CFPmGy5_1*yu6+?X)gSwzW~hVo zK7Ub^nGK{Xj1WrN=NVz^1t%k)@V5*e&?Ac5XrBgISPG+9#>+f1T+<%R@}CgFz2xGp zW>cZAF-W3$E~xQ@h!g{A>s?194BY9N;X3g8({QFT^8&H%ZVoC-+nhiHg-dwPAZF`R>;?8)NeMDDpB2|Po)fL`&t|6G#FPCVZ%WnsRf4~Gf^6qMC z(0&JRh4=3kWeXM-xu49{#d_|m20+pF$NcDCW1-=bo<#G!YBB=WDFpKEwrhd?wk~Yz zqb9PfN*4qw#Z)@XjrFt3Cs|21xgS2!@UG{tT=Z7VbNwXj?fT*_owq>`Tw}Yix59Je zx`_~a2lQoSWCEL1Q+eFlXd!p`j5CbZ_(v}K|8C%a{ppM58J_D!HPAe_pm}cUb(q_U z<|%mKLBCv%VmHt{vjw-fwB3m?PE^@qSYpgG3eB_fTL#sh>j;O?JinlMW}tcMZL6X| zXr7PIJY8mLu
AWe|=?|6T_wY^01v>JxF?dx->4Y|opK=V9^=6POQmF-Q&eV%BZ z1v~ASLtF`%?oDs0FDPaaHyX`TCGrw!GkY)_nAQ;xcIg>3Pfaw>^XikCgXJKuDp{Xp z_9=ks+`TRF#4O@Iqj{F4HS#0TJWbI&4~<_+Mxc3iotZ&DPK{uNXr6*_3vRMr8dSC2 z+cI7;i@1+yp6Ad!*Q0s5qIr7Gy+D?td9K?k#p*w~vZ&L0MNSpncsc(Fh^pK4uXul& zjvbok?8+#bf#x}Am@PZE_y}o4^K@-c^^%OkRIMG*Z1#uf1W6jk5!VCFGfORm&qwoIiRQUDD2EJFB^Xr3E-J|o&# z&vP`I=iQijtRlk!`uvD#i6>?e*Gr=(F+uYjj^^3*wG7*Z=6M;-vn!gXyW0;ci{=TD z&Qy*!f;}7ewT!np-XD(x!KDESQad!y3wC{} z(^C!bZU3uBP%DeLZD^hv)n$~Td2YSnMYGX7)zLiN&^(RMJm;Z#%9x$yLSx-wahIx} z$JdH^=AJbMGdFoUb<Ps(4%Kp7%*|j@_Hb$;8_Ndtye3*R|1piJ2}1k|?*Bw6EMruZN4(ew9Br8|(DbG=lV^!qF1ZDCue zKLBj=c2DS|a*ZZWu_Ir4o#fJUm%!?^`+kpC%ycOb_+Oxom(%Hefjg9_Dzo7NCAQV? zD~&SN0pDE0UjMb4+cMXMOj>RZZ|(kde1AUv1f7Z%$%Mx>B%;a}JT6UUtF;?wPM3VL z=1v!QvUWUcJd;A4g3V~=nT5otrp0*0OqYVSn>&G}=PPcl(^M9h`iAuBHwNNvTqH+( z4}(>9{aGJUOp=$D(KG$qz}|i>_lub6QZO$0G)-zUVS|?UU~BhSLTz|0XR%-)n?JN8 zB$*npd1Xzc);pBsbXx)@TU+YCikU72NA8Yca^dYo#oblFqcVlMTKTdUjro*2)(zJ0 zxl2W+!(hd*H)QR$ju8D?vUz5o@TYqc&0)2|Kvto>kd@UNS6$63ixAS|Sjw2lu2T{FL4M-nR zCeb{r({jn1k?z#5X*L_Xa4?;8EflKzt)|!J1VQoO1;i1*v3!t^qYvh4!`540{(rpx z_c%D$vVA*+7k%M%aQEix(aLlw zaG8aD5|pdyppa?IVVVw@z2HDC8@5DN0b%KrO)>6&26QQD;O>?|frb~f$ z=54ZM@looPZ_f&Y781wRL11|=g^qvk2GdMn0RR8HQD1h~8*%Wz-e({&-Fte*#)Ji3;=W{)g}^aU7+g|VC8uUgp%*tj|r z+&hGF&**M?dA$^U-8LHR!ba0&uGyqZwGWAV90)zm44`!v7GQ7G-|IoK8}|<9Ooazl z7r6)DrI``t#1~$T1-UCL`7zJhf!3`)WOmXt$e!;*)8;G$xu?JOT(p8%uN$0Ut9hER z@3;;uO)W#{5fcy9^)X!0=nimEEsl5aa)v;GI{(Tb0mya7pXaX?v>W?96h3tK<3=yq zNq0sx@zw*PVbbc+*o$!k`L@=ZOd1yi1H1O8%PSW^k>0QIwt`{<_n{G6l#0S$B+$=y z0!jYbPsHTXG^h!?z)dKc!J;R=BbEwA!mej6AR}*~Wb=IM3o*qtoK4PEs{A0A_R#BSx`6T3g1^M5e^o|G~dsyoIU~na1I>5{k_=r$5E=%V+S|>Sv2+$u_N|D zhe^YY=~Qu~Kg3ME&v!qU0KR9VfBoLX-Y$ZZYp^HUyuBhR>?^FYP+ItMPdvO%nanR5 zg!??3MsS_SM?$A@1~eS^1@E5mwK-lZw~N5lB@%z<<;B%+lIVix@xm+F@gVhe8aK8e ziG=FTrI!R|KG2he|ZhHZ#1Soz)XQ_0@g)(QzAP^|IhcMzN*jFVef0J^1Z- zLb{ncQe9)*=h@L4HvHeY z=rSd#63w%d$QL5L4TNKl-J(CvI?^HUJz=8PB|6%ylq|yU*B1ub!jB&UULY6+ui3A7 z|M9N&zn9+XAwH1p>cqz+-=in*E}<@GEMSU`3Oid~NRr}*0Ib!3mp(^Dog!`E^5eA< z%`>{j3&z(s@OOsXqiV8S=py&7P~tF(z3-PtUesb=DYs{2Y*IIoA=WWNISHS5{Sz5GUc>ztEEkgwdj3M-)0h5_jOhPap`p70#SYUmUU(f|}+h-L>G|wj=1Hl}> zvvzwYqBlC)QJ*>3*YKMT>sq*jG)^3fb>lUmEXRZI{AwgvmcEl{p4~0u;B4RP!cp5Vhq!-Dt{`0?bH}>{~SI6ui*teb^_1O@fDlod&%8i||$|s`C3*6<-F);hmulgvhEaDc6dV_819oli3K7^>rGV8`_G63r< z^bc2HOFm3s(pIV>xw0_sSf&e1UG)#6{I83Pf0v2oIpHra+8NE0qIoJQ9Ojmyc`m=} zL2sdXZb$PhTYr@ctxkk{i_2R~Ld+sgAI;MY&9f_-Xa55>Y+-pfNI>&6$M5R-xpx5@;w{=74OfN)EqR=HK(KK zTr|&6G|#I`j*#nUo|b}}bO@Sf&aM7@ZSh8aT~Iv4=r3!DCuR}14b8I%&C>zRGYrj> zUz|*{&^#U9Ha45*-}^j0O1_B(ymbWQ%zx}_6|;z2iso5`=6M6n^Wl6q_Rb}Ru0r#y zpL~g%j^%dP9zl_wE!X$&cz>QgfijwBS%D+XK=T~4^FFa#ok%yLd5%fh%?(5I z?1JWb#y*HO-AaHS1?yVkiCM(Sqj{PR2;opA6BVI(jz;tBiRSqb_jw*y4kqu=Jd4phAKpx0HA)Mi z+ez+U$M@%e1JOLsTzErQqIvqGd1`SXyfT{Sxn8(NMDrYu=6P^TBpZ#j^T&Eex5N{( zh&!&?lT1VN9DwE-i{>e1-Ww>IXZ1vTHr4e9eT%v6-*eq)w@$`j>6_OwUNPo*Ryl!4 zVGko|G|xUVFKH8+XEd5;8#GTlkGE6_&2wg=5}hzy6W*Wy^$y*Nc{ZSVb~sx`ccXc( zyW~a7(L6h&d3HndEVb&6HeN;^T&&=Pr`$ma`=>RpXygDY)JcGic__a#f;IS7VF*Jg;xtl=ePzCZ= zS_UypGh*M&2Ex_b3+VG@&*9rw1BvGO_4{DZvOPn)WT>zlm0)Vt$pBmm_1U-jVX$Uj zKe)VxCs8FG`3G~yLzKHz^O^yND`qwl2u?;ygHU}Ry)83_>5tz@{4;`J!x0O5f5%uz zHtI_ks3^k4_e*IJo@bS9lJ|KoiWHHKLL}`n+~;{k6&7iaf*ZjJy#6~qSk|!}iyqVt z!p^Rt!qD-c<^s*{%<6ioyLq%W+$#6Bgbx+ z(QSgZaA&XQ?|5RSOTiMagH-vN3EQQu$ik}C;b6}-q;ukMX8J`RA|I%-9sQ1yy7&p? znpFxs+Rpzg-XGJY!0dWornO&=f9yB`E>(Y}mA0c;PdHEar>Q_5Q)g_rdHx=+-0xkFa11uOZW#g?p8AZPoiL*S8qSflbSIrY~upx$3&u}Tfzn3SptRTfBhb> znCViWu6l*ik89}7AUCi)H-Ih0nx)Yh0(N^d6lhp= zL8oitV%s^gd2w&Zg1MvMW!vkdN9|Bp^L+ptXLXFIq8WAA-3E%$2pGNiE+>0dgQ;zA4+hGHOoM$RftDepdh8OY%dPx<{=`g|0{2eiSka*| zqU{?7!0TbDRIbUJeeZFUHni^wGx8tN6<-YD@SeA%)TlFbEtYJaD&7IqxPuwwWDSCa zU$vQ&WTJ%&!{}iu zaLRTCy|BR?O#2QbS!O1j?}D|zjaSTcDOg*}k-tvs)8M}%nNiSdZk|yr#Lrct^NvM> z@brGZLTwTm)?Swe;Wvkp%cuUoQU3Wj5KM^MOIEdWq(Nw&M)x#n`I#{2HDNi88x#bG z=0=i1rK^dhdjjpgK^rWG{`mj#{^R$tq1zKOQ*fT|E$fMW+k3Hx2TY;*ZW&Ekr3+GJ z`Vdi)MkdPaqECh?!uz^j&DW!q=~9rDQBHEtmeXxLrm+KKwBh+MfNQ)u|6W-WjP7(| zj@vuKyt5lq?ZBT(Ra{G5MVG0)x;!eNa6ZO%()Ew!kdLgqv@lD_?1Af<8+G1%$OCh+y- z&fUSslPSOrixkP`8666TIuvnfIXh@bSWim)V&G<4Uuv$uo|rTOaY_n?u!Gt(jgN=o zxHJEI-w=yfvX)Np;7|@H^61E7WS;OU1nWJXxh2|rr#&e3%HyW!IK%EShID4~LNM+6 zs}@!(h}BQl1#EWh6LxCXfnB#gCcH2hd(yPq%xMTZz_e?d`8TG{AbQc4&wLvXZzfLr zd3>#)om_n=BzP8ZW$U)lz$0>WM`8>tThW(Zcg-YHC4|V`3Wl-PT6EdbcsQf~YrL(X zn9PkxIIXEAT-G^(K6>R$GGBfr@`_Gy{7whra^0Q9RlOyG&K=DS2nSE&S2n+Iv~qa` z+BSYLGQW~@v%Wyxm+d0_si)-bV|&;mx%y%7EW*Q0pKNgUrcSni6M>17g;R6cS-te{E8Ex&Y>gs+*6mmCGyWb<`h9+h=kk z7o4RJ=kFo>q$ecrg+1g{MUzl@FE)2iB@skCHGN`+^>cOYB${W@V=w3=YT%b$x=Wje zZ=u48U17iLDCX{!M|Pf>0wLp{k@b6~&{EeX_-Y{8JaugPvMx;*iRO8IxTrCb-Jji+ zt@OyHkG8~;_s2|G=R=y1Vlfz;OiUr~Q6QV0>?6@Ur=9Z$b2E->t9PDSwXveY`S=~6 za3^h>SwuP=;EA+`E3_+7#V3^YWt*s~^t z|FUa5Nc$K{G|&Aj0^sUo4eEQhkm}_2p!3R&;plt=*3F}s^h(eNd4E+%DLuu1N*@I( zTkc9U&kv&l;nspIKFa+BO^J4)-t$dx4WrF`w(cNZ7Y~I`cA5~_*M(P#wgyYiLMUmU z=W}5k6q^gUGp`5Jgy1jy!%>r=tD+q48~wob_vr~EyG#Vlj*t1Ouwjrg+h3x2ezFLG zDm5D#%dMg>S8n5VErvjsu@+1(VlOd_HHHpl1E4tV2mhWM2O&p&B$}sAxFsYxPUJ6a z$NszhWSQ@-8+|4T2-}^oW`P z%zr4$2G>`U%1U#vIxf%d&$nfkgB3)T<{n%x7gsnKQT8)lD~q@SG*4eN&sy~Bt7x7R z&^)K0dFG>ew!IR?($G8;W}W5Y?k9q+R%uH-F^f1mG*25e&nnDq7ovG)qItTadAgx_ zPDb;LMDyI{Fp#y0oC|q@N&k-b$6MPxG|xIT&q_4UI5f|-Xr4A`o-t^izG$A^&^)JS zO=6pmm4IAF$>zBa&9iURC2|zaGX>2v6U{RU&6A;du0!)wL-TZx!upZ+1(4NFvU%#G zdG=V*$Unz=o~zJ2OVK>PVLi`xXr6D;Jj2jDYe9({ACQJ??OiS76|;!TK=WLT=Ed}2V>AC1@6VUi3uvAP(L9Htd9Fh9{D|h6 zhUV#k<~a$?vkcAC?!`|2z{Ys^Qu7aE6SIgriso61<~ab(a}}B=)_142Xr5cqJZ*8G z=T0=Uu7!nHvOyR_{1#Y_Mv$`M)TZ==Gg)Fd3JG4p;OU3J50I6C7^lkK=X{a zYsBu2$b)ky{uS?!yG0;KK=U+0^DM!Ao|=m%ik_l*=An67qj@@@c{X7^PtSP^S>gM1 zFs<}xF}uHy@6XdG7=h;b49#-}nx`+CryrW9Gn%I-nx`Y0=T*#Y7skwCojxSMq`I{& z@x+*?A)2QFn&$*G&!cFbO=zCI&^(u;c`iotyo2WHxmbr4rL6>&k&9Z+pO{75EHuv) zG|vDuPd_wIBQ(#AXr6b`Jms;6Q9PQbaxmud4_gTNJ%#@|zCQ=N63z1^nr9N4XEd5; zBAVxAtmpX_&2uxFXE!uYO^j>b)e&k7B3t5#S;XBy^9(}se1P>lSD<++qIs@F^L&ct z8H48ecRkOEBWF@26P#B%?r9mX81sCH=Gh<3vlesPjnF&?I=>{AXr5|lo^#MV8?c_| zK1EeJ&07;@hW?|TadW&s$J-A36|16o&O`G&gywk{&GQD<^VCN3yoTnfhUU3uE6+{* z;0~#gzn-V9EaGlv7(wN&Zj@SJ&%7Q6?8So`?)ZM}KV+^)GecvUf?177AiBVr|CIut zbJ)-Ewz7zOiVhatV>Zoxi8+6k_vpOn!LaL=0`9R;VQ$!SC}+_g5@OJkqj4?}*P&3N zd7d~M$FK6!hCV(3CtM>~jdvoof2%-#yvQKhLyVYr+CZqjxsbN$@&dvq8cH^+#fo};v4Yif&Qs6#T1}@%cOI&3g zm}&VNQp#CF*PJ@6NjDS%aIdT3mm)G~Kn2}=qb;m+_icX1|2v+T=~5uo?;!2JX*ipG zupb+mp#g=L){;$O#_T>GUtOIVOHnT*+2!MjdQJ-5O%weq-k%S^POB7|(hOBzj*W-> zr(Y>dwPxk?A{Epq!=$Sk?9}^vBzZ_a`Ci)t>W)h`&$tghblb8!#LsL79Cr}1QHB9*ij9J-ce$ouD&5cQ8MTIY98?zwePp-i1|b)&`@xo2JbD{mZ_RdYS~TVAJqZg zX$hHQ)Jzbj-K0_zCK2x!JSPJwaCTVU@9~P6E(P&TSLp!E)wN#k3cKkdAs|0@nMqAat(|Q`y{)?U;0v+>?k$-=W9{a|cQ$>!}4 zr8L3xSQY=jo@QdEOTol@`-s`fiF8Zn0JgPCjaE$!hs!h4=mzN^@D2|rQ%v!B^H(A* z*VBQlLv4PaKQYs#z&rUVvF=ySPpO&7RwwjiEBBZ|`n;1gt3Vg?&-7rs^$Le+d~>{3rc1%7tJQ=iG5YbN88sx6>!*VuFFt_Imv)6J#Rq)A$TnbI9ZC(C3?O$3-7yuxYCTS+&67)LS&eImJoTwrs5U$Sb7JJYqkN95*@60so6W2woM zXr5mVg@Bd)N3KnW9n`p7jm}*X3s)5@`0qnEkk}7$q~0$SZmXKmoazKH+EV=U_*zL; zwhMQH`!g4F{y80)Xmbwls~is{E2Kn9-8w>vtsNI8?+n8`^`@V+7sBbaziMH%f>_F1 zoPj+(Eu6o%1ABG*l2HB00;p3z!tKfF0QuLC@S{_lz~OygerH%bSe3c|Jib=YPIGD~ zn7{kP^}zjH<7TSS`AcK5PkjYHYUDa%aj_dQ>k$T8Y&cD+Nq~=?evP*k6mzhTgoimp zxt^mJ(rr?9q@Ukc^6{$^bX==R=8D|eih!47tFxx4^cI12N!iWs8?9Vk!Qk!w@TgZ2 z*JemHZMe0KXbpKml;7FI#r?_TLcvT{`uH^2TA?J0QRZOexxnUlt(m8FbO0E}n{ffD zr|5{)8@Q~A5uo=igX~Z#Ck;a~X<6+I=vCIpYt4uQfyU2z6^V|{{35^qI*v9 z5U!rijeEP0#Az+!pFW=l&*etbD~OTx2R)xkZV3L{o(0=Tpu-E& z@3lSbew0EUhs|Ua7L`QKLqW9Wz7QVA%#moGGlqM^y`*RSV&6OT^O{Yx%CjrhFdD_q zTji0S2dBUy`i!U-PNI<>O`zx8Mq+OJo<|ByKl?K2ma7kYZ;oUk1nYT9<$`9@c83wrmh<)(L8Sn0$`wOFD};X41EeFbjpw*=)EYHW|Pu|D*Qmvu}|@%K38Z%g*9Dq-xCZ@T%(H~ipZya zFUXS#cF+#v2`op0!vEs6VxI5T`9e+4P=3awI-2$z_XoRKfbm0B_U!#(VtH){B>d2T z2}=F=p=IMCYlh&bQU2G<#;;@5Oz{TYpcniP%v&oSl}#;op-Ijf&E{0(kb744F#hUO zQn0;9^g6jXr4a(yn$J6l`#d|p zmuQ};;Q>%ECzdvJ#IzlEk~fzhA>jvUaI-rqJEPCz$SHR%m!d%6caTsjeUrN7`+3x+|7y@y2e^cWrjZ}rE~ zw7sinzVjY_nYS(|ezjnBx_ikr=iwk%+aKh;+R=P@8*nO)m1v&+CoCbFGv^QCzJowb zSr*Vs01p%g!*IK!G-I3_Ym_S>PUXkB**dXs;=%u~7xy2xvtav(J`ihGM`4};O#dp& zN(;{te!e+eQIcot-rF)Qo9)LNvTe8>^{$|F>BP@Dsg*_CHZ;%L950&n%RHlc9_Bir zc_u&fpb==E*=U}Y!6n?sQ;Bf6^4A)@l||f3G*5!{Jj2mEuV8Nb2h43Bg68=RbK4)H zdFr8gUVJx*Va0D4E}PhLd_Nb3fBaJ9&^!Una~YcF4DKek9nJF{_H7@D^*nX3p6A~^ zj1)|!up^sFpkwfg7K8a2?~hfDADX8u?(>|B=4pWDc@=Zp_0T*w{;KEs5_=fw$q!@i zO$s16Fs~(^m_?i+n&<4)Mt&Qb=PWeOMVQ-u9L@6@=C+4oJNARp2x-Li0>Q^L#TZiRIO%gH_gymh1a>ygyH$U?ZC6sv<`^5Y4j*bK6f~Zo3qk zr+?yZE(*|vv)`uUxhu4loj*2eQ2Ip znA;wtsmrdjRQ1J=NLo)<5@q2Xwr!_hpqV{Usmn&%wMZTCR)EXN*3X|geF*i{Fp zO`g{hPs}22vwBbB*IR?FLGzSD^DM#Kb_X=i6wGb6!+M^F&^%9<%%TT>7=dBV&X)0t zS;S>xZhHqb&rCGW*_hkD0{3~o$G+{y&^&Fio@Wu7=k%;W^rJ5J!t4HP-~8XtD=~|> zQ@GEwE#|hHpm{ddc+op(o}1A;&!Ktl!QA!}*u%(jPd;Zx-Qkt|uWvrBEaFV>8NtKo z&UCBZFu3_rpJ_N>;=(IT;668)@*85AoPM6DWOq52`3_BIDgSf4tt{e1LJc@y;Y}Og z39;73JsR|6Fa(+_Ks8Zec`?IS70o4Er+yWtHo3q;>~lTMXJ$z7od23Re*WF@E%W(F z`a00(2myJu2-Z$-Azf0{k5oIXCFg91u`#-X!0hTGYIo`d%+Hi;p4)p32FJt-x=5tP zCajO6le-vzFh!5i<-jYv$Rdu>*{~wTaprjc2oq zw~!ZGg0ZfmGM&EC2Hvz8L~Hl;0WxhR?Q?M$NY(r_%GS&?@Ov3~?{a`{`0C2cWR)OL z)dtKD4(7vgpWWw-Htb~~TGR0jbb;157+v)~TvsI&flM~JWTcp`vQAe-pF;{7pQ3ZC~ z4Tk(sV(YcvkoDFv+>}MJM0Bjh0L4s~f&6bSaOj}2jSwFi$=1%Sa2f~G{`}~rk36UL3V$Ecdw-8t%ycPupn8?M=w{NL=UrizqB85b4|Ds=+c4YHTHxB- zl2uMh;$)oM$qR07@9+7zv~3KdA3YXkW9K< zGo_E7tRf>5TgEG9x)gNV*aaHC;Z@k}z>dy(OG16D!S(V@a%|*Kn9)~-z1?w?yqa1` zt?S#ur%`^t$17&K6r5jhno1QIvAp$tn4yIgcsM-d-g|1Ws(0<+#H3-Y&6zJmp;s`O zF+K%?vQPiNcz@n40s-O1vDb#4qS4a^K(2EdEj93FJ9UbwAW{}I&OM9Fbk|I;Mcbz=Y8N#aDD1!R8Wa9ZW6^g7L z{2s5E=~581&x>iCKFlj(&Sd(o&wQGzFRPq)nXY?uhq%k$q(7W(z^Djw+lMMa_I}Cc zd859Vy2hA*<0b`2IHk}0rl_;_9S#!b9A)_N*D9LsWDcp9)QCVgh%?TRY@TbP2{HYw zP2C?vvdfK)+#csxSXS4YmadP6gzZOpQRyVo_lh2!GbgM-G zt6ix^2TTu#b0gEJwN((b+Y?4kD6JvWjwMpdm4iWLXS?6$Pt0^FIO+0)C=RILPxbX= zpR;=R~?b-I+^Yc~WO&+6eGs^#QP@NQa6l)z!CVspG!rb~f?%0-fO;TSbMIhCnc zXhO|9E2s$d7M-7grduS<65_hRxzpRJf4ME}E_G~<*UEG$IClI#iJ!Wa+K-&ZN*xxG zG3`RZtK5z5dEyFtlV9>rpEVI5sk!vbc|+*x)aU2?+X{-6yUc}X$4YL#RVt-kBS_t- z&%}0$3mod{N=6vDv+H3GNloHDk>%78kXE`|qIn+q91J@9LIAv8}W4yv7o z@b~jJ5|0~{>s=TI4c=DtNpT|h?EjVb(u#Q=a&ZFNN)IkhS(=^Mm&`lj{y~A@sEOm% zj*#A7mYa6o3C?uxKn1ml@cQ+yJr}K*CyaCkU!QxztHV38?ThXSI~-X6tFp_v(%~IJ zZc8~o`qMN>mr~{}Wa7bPmH*H4*9zLbp&@Ycuf8PAESvg1)T2Aw#DR6!A$(NYI-;v6 z;>Iiw$NU8=>Q|BoO%1=^?^{8!bNTb&LE2i*JUfZ**la}%?Z1!$tao_Z*^)ITHA3 zy(sh{2l>O3C7NfxP5@+1Pvb%zPf?k{X`FvxDnLGk>}0i$OF@-Zz>Cd0N)DOZEUU713s%hM&jl|0JH3>I!fctw_k#}7@n8Vac(r{(1Xzd3f+}Bzn(L8%^ z_J-wWp7Zj#^;B(XHkHYig>3K9%&BuOQN?~ash6J;`56vC=lvjGz!D% zNt(b6=rgN8urSZ3_op5prfFp)VhQf^RGG;)DUX3W%8Shfx^;Y{?npsRLdlR23<3Q z@1N9J!=rf~0VE#;^dG=T^8~U8L;pg0_qIov+=#?TfINn>6Ro~e`Ov?0OK>tCIvjzK} z9UTdR!gPtb?Y(MZA+_3ui=H-=I(69@1 z8>$VU%S~BkY z`FC#nh|Y((%@&x8`P_qQT#aJ&Xr6b}4sj}T6Tw+WvUy5uH&`Y@T>^v6P(a;d}7Sg0_%CUH|z=~Xr3u1H@S^yp7Cg& zdDypo{$h^p*&RW?{IF*VHYH#+MzVQc?4-<^A}$dXG|vUt!^m#L6WCNpnvP{j% zYzjAsGrMENf*%})gVvJGQx(m#Frkqjf#%ty1WXb8wtJ&_PVvd0oKpmQP`jN=533T^ ze@lfQq1#)=D`pYrf%QE5VBhwIXr9-wZ+j2y+g_&84R&vrV#~g`vYP6>qSwhjd_(&P zsI-x6o^P>l`;hV|ItR`3EcP(!fqmQ8MtmY`+TWy~uy6a=+x_|Nh9&%5%ssHY^pAao zVis|`u!oU1_HB z3c0pr3iOP3V=5jgv@*7ix{yoUJ~YpoTg4=B9L^;dbD?e7zvBJJBJLTQr^1x3yw0n1 zq1T~_qE~317bCI0<%j`XF`DO%LRV6xlgut9r^EfRlFd^)$eWF2j`U7I6;(m=48gwb z>2qC~QN(U;9h#>inkTs*iv6?_AX!PWd2T`TTxJl$hoX5})O$0t`DuJOnrCO3eC{He zrvW)EYIr$>IrUo!$)hBjr`3T7=F-)PjzRPE&*A8E?Au;y8_l-%4knG5+ddZiwr@~R zV((8T!u&Oo%~Mrs2D7;KhQ^_J=3)<{Dw7cY&6OAyCHIV6z#c|!Xr7y|#j<2Q2M9Bk zY@RO4J;?+#Pi-{MUf9Fvt7&iOfabXh`?jz1_(3z#Jl&tnq0Y`m@U4?%^X!X#+sm<@ zCqeVP*y$y;#vVqi&^(I-E^N2YTe=3#)8&L7EnKVtF<77Ncl}Z^i#QI=v+i^meP}fZ zDyqEbaWv1#Xr2we=1gH!cczEtS?#o)i&b!k4bi{8A+@rI8|P>Y8}OT$meerdH{rgY zs9J8~Clcy;hGVY%@Pd=HJXoDg=$J&C?DfIJQ;#iNY6yW@17KrO z5qU4K$_Lj@0FR^E63tV;Z3lQTBa?pbYRk@E&n9~kLqM~%H`S%%!E%WXZMxVC46Df-9~D2 zWen7h9N8SNHS-j-?E+H$K66#tj%?ek_aq+cm@6)-B@?igok&-OIaC&rE@vvJ=zRx} zUNif5yr0wCpD&h)rUi7-G!s_%vM)>7t_~BzR}=DeIP;mU54X>&G0z`I$XJ8%Wa{-) zxa?p0uXukx06UKB%joKM{P3y?U>Dg$7j3a-8mrIISJEo5JyV0#ce+pZefW!*ru2l> zk0qPu=WXsZ=k9%?Q|k_|v0r%m&)7F+iy~RDO$|IVm6%TD8*&mnxe)6Z;_$B_}B6M`N>D{K2VYL>Rd${ z`}=_&XU`71KB9EnUxcsd1W%XQvNK_e$etWR*G8`*a@$+tiJ2}1PpUe@Tc)=Pvy4I5L2}5B@gEG_A!+oCdmGt}G_AsHa#mL2(r~R@j`ZCCved^Gg$!r(_ zvgy~k6CRo@vQK+>cixZ%zWPcg+Xa)7`zg>qIE$7GCQ#(1hiNpu6l9spu~Y*V}HAXr7f{eW>+EQwUVif)aln zHgdTl+pl<=Ou1|Xvg`NLE6WBz&Dx1vZHfhFt1j6*zeU}m`}=Y%yn8#A?l2xo2I=sN zZ2Gaa{x?WOur4dxp$H*glga71X`qF*SO2%~QJi`9054W1mB*(}c|ta?6wsJ=zO299 z1sbY&kG%L%OJi5rKtX92sO+W$adTGu9TpNQ}|vd4+l%IriZ5*i%cyb zSvD##MJAoz=x+`W=JY2aF9W$(`y`vEuCzIsy3K&TJRiv-u6*X)yTpP+p%RTOi-s(f zWBh>Owj_Cs9+f9rkQG!b(L58E=aC+NO{F!K0c>%hDqYbg92|Zuqu&k$fzGlp(${kp zDUVI0@8=AGk{v($tp9z#h?y=0M?D`ChsaC3QGh24+uW1chMGZR!%6xvZwRE_(}TT7 zQ^{G|-PB2W06gER)O_DfinhtmCUhq`=Ga0>N zE`2!I5TErcHN-)1LQYp=8E5i#1gniILn?ZuEk1sO&nPR;*YE z2~EH1^|xZ4rCLsq9OA=$@s(y}gQIz2ay(dyx(Fv)OM^$sIpL};PSB%ATWb3;5ne3$ zWvH!~XJi{^c(wJTP%g70J7j-Zczo{yIAd{|6YTB?riUu{)cw<-$U}#Jf%`n&@}qyA zzgEz0yKM-ZIb=Z6FJ;keZBwdn3CCM)V=;T&aCoh9HRmJ+j*T>Pu_ldBqTW$04wQ{=%7Td)@rhOVW zchYz||8!ga(#=?CnrlQ#hdYoTkG1KPnt4$0VjA6{JRgRS-rXFpmCGxLGw_E2-P;oL z>y@;@W*u=K@`{)wIf8fW8sh$O1`}+nAbSs76Xkhwp!_~VqIt^s_`r|OPx#XOoAk}$ zjWp{sK2HkAuzjm`kQ3Qlaj+iUkQM+( zHWbkAG>2G!JVmr++(7D1G~cvk3_dHy|Llt{_6`&X+*b!c%%Ta!O#ziO;|`(wu6cmZ zoV(PiUp~26`JSlWw}Upn;{E0EE8d^4roaCW(I5QaldmW5>voZvyqHf5<4hq!q{)hw z=Muir0CvyO0KaRK`HIoDu+F=$MDsLu^@ScI?(!AtwKQPd2I}S88Pes(vCeb1k~13} z;h9zgQL^gJuTOM_BB>mS=29^s7AV1WMeJ?*v&Y5r!cBKml zbJy|r57|P>IY)`+X*nbSOxDOy|6HDaI;u;nZyST?u^zjyypU`?U;ui?s^D9Ep1)K- z3OttHmS~rSdASBv^X9v+dx2`)T zDYxA@FcxbkCUGB4jcJ?S18BQBlOWNy8}s}>!tOjEr>$!M_#>2(q?9C08Z>E?hUe^+ zBqU-B3?U&QMS~ljvv&v~8Ol6`WKO0`;oBFl?)}_){<`uW*1ZKx(E!H@;A>LN+Te4$~C;)Odot}hmh&Qmr(I(Q|P}?ng~Za&~Mf! z%}c%I8QKMb{(B+mOw2Oi#U9rmW?`K`>BOgKIiwo>!VEj@=vY_}#})I1Hfw8*iNd9Zj2 z|2j{L3sxjgPYjw0N^zLpEvAT?=kwEHBuqz%jLBrk`dxA8?|j1Q5&^L#{LNF9nrBXI zGddWiMfPP1K@wcS_S8JZ7D*Cq_31>;T%Gwi&6re2R6%$mfAjpipXay*UF?aqQz3_% zr-^kodjHobSUWopPxOo&;Q%s-R3Nz^>I9*f6!i~PWdnkOf<2Hl_c z5mgG`!q!7VNoMP4wrUVrAC=*Sl=J}YKr*cRp4xr|Fd0aDdiJGS# zHBYNUrsS;W9++78|Kj~e5(oQePs}(m*62kp_f3lWs`}xMHNrmN0$^8uY$Xy|Iz!Qmn7~L zHP5@!9yqYW9*OK_u-MCfcnmeq^dWQ6ZEBwW2TPc+n`v|mOe%zM%zNrGdr9H~`}>oS zTd(mNYMx&eOwm-sXx4_B=X25LNROK5-DDB8bMg|x&_3_uxAQkoBUwqLPt9|ir3E~F zDN1Chc^0o53HO{`NMXo#98Jx0?e;ia6J|(f4e&QlxsfSo2{q5gQ*!WBr~{vI?LZRL zJU{jGB6YLh-~ei#LlTX!X8sr`vg2RpSv*}0tWMYCL~5RiCxh`eYMvdIYA_|tjNG*z zMiOf3QOomuCU>ka9G=d<&a-v-c(^Fb!Jgj@V0N@F*|YH;<0EVWnPbP|)>Df}cajuO z#$JgSnKaZ%DUeWNNF?5sp^MeK zxs8V2;2gu>JTtehX5B2c!KIW7r?<=_r%o@!IW}_W_Q3*lYP%jWPS5~e4b9cHU%^t~ z-_P@%yEbfEaSTg8QzjnAmthryaS+4NC0=jz=nP&(FlTB}k&-sMnQISWuQd6Z=Wazo z@IJf_kBPS@9_uzCr?1gqz)E17k<;MSy|K7?-f$?;U5oF~{@jtrCjWSc?yJsoFg4G9 z0lTq#sxP^@TneJzIzSMZvu1QZ>WR*eSW}z>PWub-0;wr5>k0ol&#;k$A$;^*rhBa` zS-<21s=RCkBP3dovxpvCPEaH}gm}oY{xtqDL>O!q@;A@Z8h_z(FB7u*>If1$R0UFB zW}{p8CXmoc+h$5T0Mt2 zG+L2v(X+VpfjoR)szS8l+fmioy(n2>7|iI`GlQqMI?twEUU=>Dr)W-*FPPnCh^xFB zQFKs7A}f^O`C>V;{{1^-R^`APsftAnIXwp0n|a1I1YnLCBD@kMVpVzzz3c7=_Yoaa zwLbtxEV+x*v!@CwC6AO6FCd>!v%qrD3^K*(J~o8P)!6sM>&-l6?~B08TX&e_S6s=Ni62nv(8=J{){ItZ>4C)r zMIs$}6s?FngL95kQ;6elo(WM+*vp!}pL9!*(yECdw3#s9>s5)#wf=B_wgC|>`HmbH z#vnnd74S0a;_vg(5VRe(E>jG5Axip-rL z{(IZEE^5Uxl?>^A-jD23v4eneUpAVW=ggtkkwmr@@raQFEBOp`V`UZ`^m+dKczanc zIhUpfld=J8*_p$iA;IfHxTz(SDCjog+|#Wn7G1?Pd+gx3{b1<2ITDr^@Hfwr`Wn3A zqZ!O?lY+`8dL(6tB3b8Di_+Q@;Ap@qy#KTrY@9j*Z5ZXk2o2(Io?TrN(9SL{e&@E3 zlzI$6S)PfsCxtrxv^@bjcb;J7)9sO%ur3}pQ4^e8Zt*qGCn0-~r2E`F)U_oRoEluP zM1~)9Z){^NY`Rc|-U2-Kv_5nIfAf56PUl>I;4#DPX@95>+GzZdk0>_V8yZWdqH$?{ zMA`fa;$4wq(;6*dK*3*p&2y>4TzF(Q5p_#!!d_ekd-*Pc`pue5KgZ1|dSfPcWBWW1 zZ+F69IcYG^_g76rALhB?jypIBM=&-mgNV=MSoT{+G6dWT;_f|7&C_)U_p_@9bPW{1 z`>A=JVh{X$-{=Fegb#XvmA?=ZAv%bBjXK4(-<|}jmFJl?T7%$CLIZoq#T_^w4B3e* zlVRz;biU>}TPPa-O14B~J_2bVvnB6m zygpED^ZWTQvgH+%QJsQ?d^J(mfi83u`M_trV5H~dN9Kq;MAGAASyzuqFl5;wzUC=R z`-KN2Z)PqWK7zmL7ND0G+mMZp2RN<_LlwFqMCWb;GLs*~?i>OTPWw#${Y|AW^Azuj zgpF(wqfYnm$j#McI+o6Zv}J|p#kx9_S-$}v$_;=IUq|3vlO&K`qxIu{?#nzaJHsKW zU?(G{c^b>_FkxOCmMerf?kUWI z8)jH7=@L(=k@o1TwL_~fO+ruPCgFQY3t-h=M{IpE2?j>y|M-1ao(JJT%AmF$x>z0j;HL(8fD~WOlzgRJds%O9~iBoUxg&c|MGq1@k|)vV*T)!;Q-} z;q5^p&^CA~d4IJC9ZYwHK^jlck)zY_CF!q_7}1}vd1lFuCOO-$q0b*QA@isOd8JDC zf{odSWj4%1tIWoe>qryW@9I!^d;*k4gpkr<`FzcDT22(WM-O0*iyy|GZaP?YegtSb z)L;j%o#^o72DG)whwg39V84B*b)NS$_?l_18hlJeIeT9;RY^U zk5TOzRrZ327btJq&DT7i%glt0L)CEUjTXE|AP`Hbs)5=FLzY@Y^np8k z%`@43HheBT#p^P^j33Em;oAHOu#LWpznHca<$4%E^Ixja60XI5-eU!v4yPmh%=3=y zA~=1gfXSa|f{*HG;E${WxV@qMJo_~>(>kTV=)65d4WJchLE}M2#e=VT8VAR~>IoC^ z#;6=DwroEeC8+_^A0blkj?Po~XbQVBM}f>*2|DY-4ytq0`I={%lLg3E4Pa}AXhLDW z7`gj~1BWMSK-aoz9Qw+eSf$mXi(Xrps;P@;uYsnY&-^};xbb2mV3y=He8^KDW=akr z9OGuBy4Mt@sEi;&&+G~BnLO7iLzFq9?+p!7Cw|83qj2T@4Sk5-5R7L~^V~(v)9qa) z6K`e$=f4KvZ`3>ksCoLxZe=Xbq`-xp|1i{E%(Je$15fC`4sVZjh2hjZ&(sYCE;Y~b zW#_P8u{Ala@d-PCHer}~p!Vz^b!amNX-v&iQ&)+! ztYApc&N!5x>_(ys3HUtXZ=TBrDG;ORW~52Yvu(K$oMEouYBMhRyjYSnj-5^}ny53z z0Taka<0>e6z~4M&sCizG=wh{~d1_JfjGUB>=2G)KKPL~nd&Lo-t8|9Z!3EqWPAg#R zi+`9-FG<|SiZ{q%U?Fy<<{AFVgj}6-2|XP%6pH9Ks1;wmNyFtbUds6lHgkV0e~~+q#7hj&GRDN$F)l=l+@iH&Bk(D*bg(8fQ$qGex4j^ zo?9n%;V4OC7*y;{Jo3`<7R5(MubS3*QuEwE%~NLnTz2_07s#yn^4(2bjFN`tL_1e`1kYNPR(;bff#H3 zG?!cO!I8J^xi^knkU)liAI(JlZJyQM$R}bM$-BCm*2?kk=ead1gcMzH#e=DN8f<@v zf>)+uYigc3GfEio?Xl!uT`>}$8AnvhlVST2{^mL3!vpMOAI%P-<~jNv?VVPb#fHCc z!`9C#m_TZttrM$wopbfb<2kD!z3$gL<=^M8mn5$IKpgQ_@W8<@?NQY}2AjR=hyAA| zkj(?z4WV^E8x_L~7JLKTouPrWc~bYJwDurRHfq!-eb(`;LwOHqW>5 z_#-vKv*{&0_w$dW>yO6)M^8Eh*--Peq~<9r*nz`lbfAS#EWoC}7ipXG1`nd{{8mg@2JJ30sNzGwi)MRkdf##81E{f3m9tc54+SVW?C*Bli+R>C~kmI>UY zzrG>$k;Ey8sDRi4cf3*>!9JaKY<@%=>OV`t98CohOlNy7IZ}qi(=)jmTHb&I`R{E% z?NrFheAfnLItPAm&OCD1VL2||C4&O#OaV(;m)g8Z6BcIY<9TJTV07I$zIC2Qw(CIr z@;V%NU5OM<&%mA&bU@&)E@@w*3zP3Dfl5s+YKSvs2OPJDv4{EBc|PF?fspKa+}b>i zgqvNtN!+MoNcdF)HrhWJw9R@9tC!`Hb7jsEe08fSd15U^roK~wseWmQ zEioaDtF>WD%oq}$fKl#lCuA9v1*W@tX43SsTyh$dMiL9f^G94SOaro3fE@W?MT*Mm zafa$>c;Kf(V)LG(n3%n&>B0~wI?2DzGjNzYUh|<7#oX`)qZL4I>=;81J^5nqoyGT*L8=d@MLAGT0L$~vN zTtC_qNmZU<2G7X?^`|vIuJ7NEzh0J0&VcFH@R57z_|QB*IJ#1q80C*7!G#}j)+kkY zUTaCjGb$MO$DYV)t2v|`>@mt-mP<}Ury|O6yMmn4WhgU{%j=VUrNrU^Y=JPvABDUyz) zI@GrMES}{n0tY7Y-`g&@=MomA?!+OnE|pTFMB^Zh;>BHp>5yF^F2Oll+Kw)}7(#VS84kIk2s?e{nU7%{=Clp} z8Ai|AAL8OTL~i7L!$b7!z~^x;tK1|@8eCh@GFwe@R7?SaA1p_$`B{LYI({E-FUut- zw>X$w{1n1ketn7r>*TpFqEH@hNMvb=6NEl5|0o- zFiA`jg7OT=owssiXEG19ewT;Q5;-{elR1Q13`3dnx{OvE|GDj{Qzsw+F?;;ing#S4 zi=klu1W*<>#!W5>;1hj`&Cqi~N2T@f2A(#AncU`Uo;p`bk<#KgypGH!-Mhr`x3e)| zHGLyCuZn^hrnAx3f>r2&!BRX--T-n&iTpl)y_qKzwxa{*2jQ}UKoa9BPQvGyg2nvv zID5Yyd{5H>4dGPuGG{kl_+1&|^7)%*`^?)&VL08}?mmO$>ng*J)X5-s{map+H?EF4UQ`5O;U!LsB#Uz3m;13t?Y=9kbm(3SSjcK^dbypt?Ce@b>*=r1s2@d`o}RHAep#mu0!lhyv{!vy+OS&Kyp4zjF^1i<~p8~B>1)5<6augYZf zwj9D^KUH$)WyZtZq&T!V_An~E5P|2Igu((tbv$*#QmFXq^y7Z+W>y#)ZzY3>ri3% zP4s4>H*62gLXUK3k~N++s8&vf{dSar{$mRHnrEzYDCq3H$x6&_!5ITL;xj?QU_pKD zh~gG>Y?2$KynT$G+_J?fr@LXvXa44?xJ{n?HRT!_U#0=v?LdwUl_2?_%JBU97^JY# zh-6A?!Fu1Zunn1jzjH82f3%gadAij`!72L=Zou?foZL7TKfM?M8B442t<0S$spb^2 zQ}l&?iYtGZCujH6!~FKP8$F1GXq`qg@iE7-+)XoF)Di%@r$4}Fh3VX;EALRq7$*>* z@%}bXwc=m#{^MQkf99zV;ZVeLW8;oB;yD-NaX8(#)>*Gcx-EAiUY0&Isi}hU$5__6 z)*eI_4dH8^=L$k$LfS3XMY9?Erxjp1Jz;1IwR|1>RZsO6Na#3o(cqP9nVgfMfb`(y{hGBo|lCeLA=&_2EYt+ zzG~3EqxSHZuLRjJ{R*>o_6XQkPU}PR+gQ!k@n9p(-#mvD#=t?3i8%0T7RF!pu;H7= z!VzB}wzqa5_nBre&1n=cNm5wjvmF#Er|>n;^?nwBrbx19IyInRkQk9=`awXd1_+8D z!g@!&Nv=>WDtwU7m~sZEAdZkR@9 zEeYg0X}sqi3iN_%-BUd||Nm~_|M$=5)I81dg7GTnpL^TqJga1KO-L0=(jX7-}y`+_-Oazv;krcwLMu1njdVIbJLul_v7fNy zEFBUyh1PjK`G@KBlEm#kZ$-Z7h{5XoQp_21i}^y$Q}a|9c}(XPFUw}gY5GDOy~~{> zZYK~K!heR*FlwGkQO#&ps1}(>&C{2A1z$1ck~>L~Bu;ZWku_FlOfpP}47Un$1NqM| zGNtBe9n{5IubB!Rqkz1$$VO#{M#1%%Je)>ngw(baGes&o+$y&fQ1Mzg2p-eD)lECJ_fSv~Q3N#guu2Y{$$7tWV3 zhUe5gzvZW6Z-qxF`uPXma^gk?QS+S9nZmZbr?U^M%KjbiKc1`mr+mkI{WH;~EzWQ% z)rWkE$i#!Fd1el4W`d}B#@#xC%3hfhL(M&Kle_=l@%|(+jzL*65&cVyEq|2Doioyj zx8sF3o;p8)@LESRUDP}`Re7VTZ_9|&t<~@~EwHEV@$cjPlf*b_b3;hrHCJpGeh$YM zJw$RjshFAPP2}j1^h9c&A4oC!m_45y{3{tMO!Ir<{Ybk0Jm6+(p1EGp>^sL0I84p+ z>b@*?#k)3q{$>SpotkIeq$*xWzCP(cZxvj|89m3_OA?oTFph+&dti|l_9%QmgF|2U zqrFfQNa(jH^p%?Dz={&)`G<58B1`)vUEn{%NKDY59C-K|`&095lQ%`)TG6ayb0SF= ze2%QCdB!J+ps3VjVt>mS0;1!4j`v5B^yl$bi%TK{YMvt0JnuXgC7X<;ATDnt?4-T& zc1C{37ll^f>#LXG%OZ4LS^AIO1-+Q(2FVm;M9p*YNjX?IpaVO&bf9&QEudt87kLr$ z28W%Az=pFK9A`2HK0UwMbN+fs;;Nn0VCC_8Y)s9w{%|lZrRI5fq8cbhn31`*!$@Wo zona)sj8Sd$0pT|%f5z*>JOya)7vF;evD+1WIDA5fnB{aaS$d{$THgqNv{*#zw4;xf zuHMc#YGy*m^{5yJ1ZWe1Cu??X}`aDL?LuJ_FFBDt`+2?mt%DaAT3Zf*@(xze+42D zI(*I3O?n(uuByXZJe7!?Mh1?%OigyG9?4gseQ#`)fqSJE?Nqa5gPzek&wYwNat3<1 z|8EuQ`A@Z2At<-b$41W6h``eg=%IKFNUa=!uV&f7+Eq$e?64G=OkIbYCKy77o6WCx z{NBxTZyD{!iuT~E$d_n!OM>G|M_9Dghh0}`0_wBg;ak%V+b5MANu3>{cU!=ESH?= z*LYa9)12&EJB(zXRRNJV^HGYq8L<)9hMm#MB&Fm8YKwJ7{>QW6Ea};++{<#w+0{+o z0|L{yqt)yIRrM!9TGr(BejeUhEe9p{lu6}{PSo(C6y?7ahQtf}%~Q3~8B4DFgqo^6 zVVj->+3;M6JU(ZF7R4yQY&t*t;^}Wl!&93%aLf~ByzHqP{jnVV`8eQ|rbOa5dn^fO z{3vqs%3UPz{w>c}Dhq7VLR?OysL`r4PFfVJ}QRBG@5U5!Gd#`dY%Oz*Nhbjumyn}Z6 z1OpvDNmfs}f<3ekp&Ky+;X$B1DSDNUp0wLylk;h){X)<2_Oe`ZW_%U_xdH2$q&hbe zuJ;wK-)#*ki%+2w-*sT+N(J&L_ay2nIg8g9i$c+vo|#vF$NP`d#}N>3!MAfvi6a&z zYZ@m4Z+s#%Wse$hj_*fnn01MJ#z3&$zX18HS^+90Kldj7?~~(yESH=H#)e$gm0}Le zRDdT@`FQfxStLWf81HKy43+M8@im(XK$gBhWncQkyk`F98T-ivucUkKo68g+E>?$J z$Q?%HVqT(JcS8vIv>RXlsst9v!i=Kl4z9twg5TGpm*tWpW7&?gCs`1iM_qVEtu2JP zSFq1t$`b1h%_zQ6oveDP1jFhw(c)uS5VGs-@B5{f<&v`@jLvP3)o0zQ{X6WD!UlQa zWbAexJENPi=0v*y; zfRfw{Y|_kyG7C|3-BEzqvN!Md@%FM@avnW5M8@L-aBlg0BA6+Gf}G=_x!DG{xzc`~ z&6nAR9gfJ#R~IKt*M-i__xPG;x8iQp|3Dg+qVLQ${fFR5NzrgwqL}s+p9{G|!_gLQ zHk#g?ipd@$82fGT@AKEoa>-ew|A@|08-;ZZ0_oFeC=paMfma)vvDM@|8)vwoR(AhdY26EgA}n zANS(UfetYCR^X3#eJqz8D7lLs*lom7w>`;5)j4R+x>y+6=#AU2`9ZVPCHACA7rLkr zk4;7xfL<#9I?qPGc!)`gok_hny+u@do7vfKZknraI?hZT*ROl|&-wY-?gJUM@f{hG?)aC&s}Z(HXcaDGipM|5by~ z2VzZ)cY~t6vCQ^&A|$|P9=mvHGDI7! zmyJ6N{W_9)t}8++H&=6KtWJUmofbwbOaz>p&azu>yF$FeWR@IFhMnxMI@CVUZqkux zkR9NKbXu2VY4yoi?|uTv7Bn%L+g77=Fl6oNEL&9MiZhbaU~JylvARS-*G?k_52+atvHD-oL~jK2M76@XNgM`)V!kRS$GJC z$!tVhm!3oN(thwX%MCe+g%gx|5ZzrkmbF-m;6PFyU-LW^9ZlyPm@*s5-fD<>|4Cm!iP?&m&EA16_EF2u3sjAM8W<~&?so|w7> z&MX&0U!ER99wmY}`fwz4=NRGPmdn6#TiUO`x8C=*Cpad;JvAX#tp5!BvEdWFbsEBzk4yv^`o870JOc{e^WWR4zj6E36LJ4jt{z}gI2??AHT1U%gbpW6$v?mUNbETJX|MMfcBZ5M^Pevuwh#= zT2K&1rljmc3KeQ>YB~dSGZ$a;99$j>UZZZYw=Z7CgO3+r7$XdBk+!6ZDMVYs-Qa!q zW8}DGDxP?@8@^i);9KXJJ6)bc_+Ljgn>Apbx&@Ik8%9Fr@5i4kqtL0>Mr7pxEvQ(p z4#)S=I?tA15_otwU-KO19|eIP8Qh7>j^J<~dAvg{66_Re@FwX!bePmhbZvzXHP1CH zr)~aH3Q6D&b*>3(BrQB_csOl18MXkEkG zPkiULe+mzUd$i_$&x~eVyeJ>fb`b`NblL~;@fHLV-C*tV$H*YegiUzv3FSvN@ik9t z&6!YMrHL;VH{*q~ees-)s-S9OPMX?JA^98x=Y|Z1(wV#2A{PhPaDw4$p6?GvKxvH_ z-nI7#7KqZqZ#Nl&>~wunGpZU{wj03aXaz_gbcelm)f!r}j`B56)8^S=Yb?!5ZoGig zMlYlFl*UkYL5)aPZ9`Qv4Ph0d0=fEjtdIC)NO8A3%FjHv(Aw%zFXl4^$IWqpiy~g| z$sS@$CCI+7?M!s&2v`t24K6M0Wb>Dehj^DzzIC2MXT-qcZIf}eRW>%;RKh0tjD_1p zKq?RHLT>J6kl!W?r+Csh|CJp?TgLD;&$a3k!OGT{?R+v8tiBBKod^fDe$^%QQRi74J^~iryo3GdjKo2yLgdTs8))TYb11(sifFjo z5{|?!Zjt(VZkdcHY^^`rlk@kamH+-Xy0`t_%3z#B-=W^nI!|tEB@<#|0@Y%H*!yNY znMKXByKn`g{5b_88-L~eeI#*LzIWg>p>^0e+7(XiwI!Z-D0H4m#XGCc;fcGf$r|-f zc*wN$V&OrYjz>(RxI&YcPusCh=BY;>Sz6c{YX!_R%;ICZf8QxT z{_Fh60g!Fcg_DLE!?zvYQep4^QU>;v@BuLhH}_MyBUyvr@ZI)^^(Mi zQS;>bWg_Q7XXsi=`*}uZ;1F_Bnic+e6frm5QIlc#{DWN|@orv7`|fBbBZNq<&xutUAHpJQF`Yz$szT>~eegFOjx{gq!X8U4Vyrw6of&BkUUw|< zl-xw3=<)qXZRZwd{+#8owES1RK9V>`+AF7%1Yx=7TsSP(ik(*IK#1oE$ZA(48qx;D zPj){lIw`}A)%OCTahR`pu9Mls-lDS>(A=vl6VX`U`o4)0vZ{ z_MrDkjIVjVYZrvB69t$PHjT9H--wnpN5jf!S)6gq4!#{$!iAAiz-yx4)RYZjZ`$&{bf2$1XL&8x@1D9wX)&b=t1(H4gGz#-|LOUm9!@~YoejINf z%O&T$=Liy=)X7bp=m4>v{Ylgr8=~S|iA7e+!<;Myvby~p+EcI#tr{Z;EmM2U?&t6O z^Lem1!~qZO*AK`NchG!^h<2wESvr3jT41XL566!n!|69%(Ze!~?O_|Vm+6W3V>$Yd z_h>hzIrxp5H3_MZCf_`7qK(2YQQ;$NQllRLleXQ)N8|(1gF$DR(b3ru-FWQx@%FM@ za+YOZ#!F>G@xo7m;7~M%NF~aX1okp^L{@bR+WW*2mw3!ai~IK+Z*S%~NJAK$?nW`4 z`W{4cZ8vgon+gLAdB|g@E|jdJ_sgU+C_3&8o?lL91WlOv`*?diw=U<3*ykw&nw^|r}ba){(PEpIBuLN#J1doxqns> zDzw*QlY3z#A-DjaYa0TqY_8xD0VXi-z*98*IR}Ji^55HT%_3q6)*UGlz`$3b4oXAT$BV#K4-de{R zO39Hc0@sn$gE8cFyb2hHEl09q*`RFn<@fRSvRrZmLV`%HvOIfr$1CI)A&ITaBT0&D zC004`0M(2-j;lsHL4}tvprBz88NT|rQTDQ2awLvdVDk-=V0fq~I7jFcTNp`#f*R32 z0VN0+oru-ixNvot2+Eb*&Mn)z_IJEqmP?M@3>|bneIDM>5=WfV2P4~h2p6w`m2%aqIN*YEf!v4`yXs^s#-UPR?kR2dE)_xxX zZI}08&M_uo4!m1P^7bZN0_fCD|BI=KSWwYqoTq7M6~ucIxgYJUYKPC@umCu zny16XDEP2CpINrD8q00lh&;6Gk>E~$Sf(%y6&{Kpr8WD|o+(D`lp73e8I;A>JWFF^ z;elr^*GFk5-cTdMTiHhEqGz^p2RrUW4O%>2aBwWd7FgiV1DC^!t{p%AKKeL)oR!OC z;N9$eZd~*pT)I_(cj_UnuWfk14KCV)#;!cdD~hN4V1`-XSb^o>ulF-vAGZr<_n8C` z-4MnO%As`<3j~?6u}P5L@SK&e@I@c5U1Qo8#=}ixDO{SC0p}|D&oDZ8JOQri?c_P0 z@W=K0S8|$Vm zQ;XBqY(R&UP9oz%f0%cD7K&;MCnZ(8k^VUY_P7cIpBu9InrHsfP-vdk#+JXmj7!S$ zakHH;?4-VS+-55RO*in%e2jKT*x&_C-7vz1zj>C)$`P}hx6qg@P55GON%Y=|kKK#_ZKq>T6uu4d0xLa2hJ?WGZQppad4RgE|?q%9O3d6(*6on>bx}B<9PHZUA);a5Gn>d#AUC_ zP~hCR=+j$A==UpLNAj^OBjezs5;+IQFzBk}F%dWS18+3hIg z#sqfOUQfu~u$HfR=I#yw9iBes&TPT^Bfap+t*Wpi!kpH8pGA9=5KK)HfuiEwEJw)! zQY6OlHP3A(5fBhI0>5xSii@LFakh>Tc#Y5}M_&DfKHZ~LuSp8vQP#@t_Ou2?nRR^4 zvvm7x5Piz9gS#%^wx$#ue18I@i>r|iyPYWZgg!jDPt9|rC;Lf=?rkq0&f{mEs-bjG zc(o1_%y99vgkji9*bzo4(K=7lZ;X|@G)UlSu<-PEHUJxe;jB+jbCd8N}B-1%_C{3(pXCP$`{}FGy}{_vzdRBNoRwdJ)UKzfgnlN@lTo0!(;*?O!?d|L(be{&Ur`5%Aa2hj<-F2kgi8 zCl^-TMZ2~#&=#UV^cGGbR|W5Lqu-WtiwfLf{iX{)4cd_qQO@$I_o~(H`s;(Xd4T*W!*DsE2 zx=77auiI4ZuIm^e!qHt|9w4v#QQU6#mP5OUUfXqDD;CLbFkx9~#AP_pyU zXx2#X4ZFfV339Vm^<0l$k~mFjo*k$Qhlv}5%r0*-Xj?i~k$Z$L2Y=+59&;mWR|u2t z?d#d@OEVzl^{@UxfB(K-lDGit@3`D26A5m12EBA2vN$di-&uGY$GyGG#BP~Gu3x8h zp6Q58D%b;!i3k7v`~D+|tK6SVBD=*{?K`>L9l=gK?kjKX9-BZ^wvA@Ovl5B&0dLek zbva3#k_#c*gL|&;-@otA)5oce2_cK0Q1c8sheuKKT(g4qrj7O{qUt5gerldYY%#j2 z98bh-QsDKJf}VK2BylRA9$=G&(X5<(2)Nx3AyXT(Sc5lhcFS4_Z4$_+S5c^#nkR2x3F9#-gCu37 z!aZshzi0aNlEm2y`;+T0UgJCWgmHgro(^=zy!FLIV##@q8e9TN^kNaTLNt{)RJp*K zm5Dv^dP(9mgd|ZiHP3B`_S}3bN`mO#N(%>5y2Js)%!I3`H>+EIQEaa z;2-h+yuiw0DaewVXVM8dNblEyEvI)Nt49{_NXUzHCDOU=rz5b)sVTTllFl&FxYcw1 zdP(AjQ}g`H*5iqw4!8FQW7$(?a1GR8VU!t(b{IxB9;inRO##faQeVi{J^M3WA4!~; zy(#Q>kjE3#b>NHbSQ4u@4CQedxI5AnFDXhOoM){j)6N$%aXA^V?c%Tg&3%|>`4biR zJZuhbuQG@5mpAaYsBs{(P6l42E0btHJ#tf`9Hq!Mnuj^lZ=z3le9bezbR|2@WgNV3 zFoW~DaYVE|6fZl5M!^9;Aw22sCyETpJRPQFRU z^0GQ0VnO?Yj@Ac(TZ#}g=@4p=v1D0adq`Q(&HdX@`>OMl4HN`&Y7;)IJB>7t*^FNM zM#J!X3OM$%9nC3~@J(MS=zg#c2PqjsXN&zmbLxLClfVCc0WHqkJ<{;4AfztM%I&~xB#p8YC?Kz^1TGepCa?C|}Bj7+9M!ICOe z)~yef-(<+EhDJ0s`V@}(k(nTMeIPDEHn z50Jvy7g)(O#BIj_lAdoH2hY5vrFUe&<@ylk_L3;LucZvpEoAldfO` zn;^Q6zK-$WWrK$2&wgURm$yF;mt)g?9v}SfjlWa}Lr$JDITNHz8o#z;!!PRa*$9Yo z&MT(loDJHbst0RVR{S=nUY1Kv{#i}5ZFDF4?Cb}ul{0y3Mcr>lJ<<~qfz@g@U) zjl*+>fR%Re@9W#ka>+41a0#oewjhG9`;#RD0LJpBF#V-8$>s<_c(8sfQIQq_ldQRD ztVb3|zj^epc>i(wIR4)zlW^gQ%;(Qakasc{Hws1&Tdh@iZLm0qtUiZZwN2sJmB&aY z^DEkUiobcLcDiGgWNWx)J`%p@Xiy^`O3IDCqANouK-PeKyl%WQXz7VCoWpyMMzZUF zUyojvOAc56A=Wx>O*EIZ;UTOIm>fL8S`8mfWF+sRO@w|E$WR06qvo%@u}qbhhjC$dP0qw*@tHD}zPuOx$^a3mr#9k>W#1ZtK=HzvK0?Tyoxf zYoJvDsd$A@9Jwg|mAQIl0UX^BjU!^|Y>~CwSw_+dg%V91Zf^j&lF#^>=d#>lbY%Bh zZ0#OO8oA0id|M>ERI9>X!{4ZowmwV|zJt#v>4NDu0~lCskK(&`V&_P8_&A5Zd3MG%qa*K+U;_g;GC4^e z23gyH&n`(eca9b)_;JW_c~KBqyBnYWZU+bGEWcmtM{mT&3EOZT)xFq)t5#Yteo>C2zT1g*E|iZVqnR8U*zbq6mx4$@#cbfuo$I)q%N&S z`EKV~JI^>UG`7Q0*=evTaLNDPH+n7H3w!DcVakh{`D8Gu+aJN6Oil*zmR`_j&{ zFUPq;(Fs>}_qSvyO{CYEk9i)R6$>iU1Ca2D7`)gK;qHKVukA;yawIbB7l6ma_Cv*S9jIbL0I02wLZ7Yu$!z8}vKj2k z+7(+thxJ~*=4m`}F1X2OFzy4ZaJ2G9)ERgRt>yZ|UZctARcHh`5Kw`hn3=N@u?(o? zr0_LQRoa`N%-M`5>9h&!J)6Ok)}?iiCfnHsQ#K(9-gX8}ng^k)tnhci<*<+T1p3t< zwAcH2d(b@EhgE}DSF#mzl;-fx8zh5((KdF>nysiKtB9#u9}BhBR`@zK&+tR!N4&nw zQ-s!5dFrobIr8?{M*1EX*(5^TELVIr&K>dI*&;uQ`S9SaEEc<&4i?!0Kb}{8+%B9v zIxqgZqcHpVl{*#>8ppl6FbOnv-et1`ywLS0EzHdW@ld=}3%jZ>gTnVe`%Cw6c{!#v zQ84e(CWiB%8mkT2h)k1Cp%pYL=;go1$i0ZT@L2GxQ?8Ee%O3owN zN6nBOa?le#KhEK6p5tso;GL`~)(mOEWwYGy!Dv;;yK7Fi9c@HA=(mbj4}_u8qJ%Xz zrRI5l3}5q}#XZ89; zkU#S-H`~D+iyZHd$G17c_#?x}>yJX{Zjcl_lA^iRrh)jOl@X+KGWnY4_+*-6)wp1( z=4>n@y@5T%Q-=ay3t};OAL@Q>3b8jv!hREJyn4tqkU8tl*E~D(Eg`#TIh%M|4IX|M zB&(tZz`B##;Jfh{&iD5uL!ALy9HLlmfm9WVp;L_L+}tK##m+<6vk1?EfF{kGIt1b5=xBQw(n8m155!w;0iDr?Knt zFw$YHM8eiEPczFdR*0IXJvGlNlWg>)iq0@f&co&Yaip<{n&+4I zM}miE0dK%R_Gb5Do|gOHAd_#K@iluFaC>P&oI@_5LyAMeqC$Y=4)7r#Tg!N*%l5Ey z4dX!h?$)03*Gm$oN6oYGKs=7$><3e*dDg|&Am2H(54*xGEF%?4L?4f4o!@k^70+oe z>(Jbuc)cWX-ZBH=Bex4@3^fMn5^v(QBORZYeT0g3edN8Q=J`ESm<(97iB+U^zK!QA z{~hl?o~zN5zvH`JnW%fCGuSTkA;Jlncpx>;tq(3UXQ_GCUps<6%LA!?vIshS^TMpiXbB5tBeJCXQx4QuC}V_eMbl%Sr6|T5_1=5L;*)I7&7 zr+eG&Lf{KEPr0P6 zqfJr0LNqIOA(5=@euk{6d9GU|g8aNviHhS47_?|nPrP1|xSD>FD3zLLF+=-#J`p8Z zMpDq4I}+A=xe%ko@7R@^=V$F@I4{izW^MULUGR^1e_r5^A}L6gnrHcOIoSODCBE(0 zfo8N>zye|V3`l;1hg0+1Ze)w&4yr)$z&kznOD{=WuA>@QAFam;NFC&M2V-?=p2Mkm zDo2}(R z;UPuw#6sK1ymii2=FEv@aLfAFT=_oCbGd*j+{<2oPh2;H=up~|C`cFT=Z=K?W^@Mk z=5eGPm;WDOcOF;M_5}d^k_MENLwPuwRuCJLH#VA z${#=*brP}QxfaZStw)Q88^GfF{&1f=KyoUE^EFYUAYJCEQ1fg$AO@37a&Xeqk@Viv zY%)KO^|?Jc2+0UXcxTiX%Y)@XbwehWEgj1G#tJvj%4YMyUEjn(o3Xu>nVJ#)(s>pf7G9AXSx*F`W-^O1vWI^N{n`G?GF)BL8Rg> z(AAClAbY(xHI2PMcE#EerH!fJ(*O3a*Vo1tpK$<*HxEpdMSv>P-T08X?>~W4?~TMhh``+|?Z_Kbg@`FI9SBX)u|drUqtB z(sWz@PSCn?Ag5lTMUr!N{xY4m%+q&45QbDZ(knXM>9!NqBrW?PiE?+O!7sT|!|ZyVF4Afw}Xtf+NI!&MXEgxLW4WTYBRbgRQpHwJ+V;iyiZ zZ`|?(Te8GM8$QGdH_t_l8l<25d!owf_ojDYwQjCoLvzKmM5GtXnbBo_S{%HVD&qK1FM%&WMrWd9blvha*Gm4xnC;y-R|&f{IxM% z3a)hxqP3}d{L!(^WN}zWZ2B^dHm7aHSw2rmZc`DyyD$cl?Il2PxEp)E5}xPT8h-#i zYi+#ktvJu zk@E~1KjjJcX~IkxetjN}FJU%ub}2vQg%vrrWH8=IFo0x*Mxo{zDYKP4KE4M1)&|q0 zM?+A2z!VU{Qv94A0TM>ZBw*%jviEu%4tZq^N|&X7jh8m2OTo;ByTn(M!~0JI>2qg! z8eFLZk>&O1_D~yka;$&f&Jm;nS&myD4anLkyq>4d(~G1;6!GvDPrAgaA8fa`hieaP z`OzJ<;rN196gTJ!6D7A}KXineA;SB%H?OHB`RQBnZPHj;{B$ar%lcgBADV&JZ32OG zJHflsHzd4b2Hu};0E+v1|CrCeBg`K+`9FT$1=0g+9+8_7BYDT<5g@s~K&W}%eK8#-PY57ZlV;=OB|~vR;w)&@CdA))8Oat% zpm*^M7+7qL#j_Ve!L7)@pEuex&(?WtFG?zb`!ZIN8s4AG`_GMo*S+pplqO2De6y|= z247f>F)D)U8j0}v)72mG+Ci*yW}dL4(UeOm=t>>(mst#oSOAjwcR5u#N$5E5A}@Ey z9h$xT`TPCiAvx;j9(6m3iV~lqAb)lsF-i-;IHFg_mfa+HMop)b28&?PI6G# zd4^E)4E`7mPfG^!<~A8vbV;Pld?l-I`9d8dvNOp(#epPg{d5Q#Z-t!-7l9SqPZMUI zo3f%oMzS{_`D8U#?KUiXzI7f{d{D)W9oCYD=gOp$J*&l+FanFVFM>5QYQD#7&peNH zoeK}Dckveo8e#G}5pE`{k6Qj^87dsNA(PyaiS4oJaF+F0N}Q7jN@bmeny0zgT)0p= zf>*1v!l)Tu7DsF5Lgw;eI55VZ44bM?>Uz(D7V#n2sbnDx*>?B)>ub+Ecc)H+dd`M3 zY%Io)kJgdC`PD>rp&zVmwIC*DVN~%{86me#c(-R9>+@)V6smY1-xirST8RqgHEdywn1_77I7eE0Vow@Tv!-v|tG64zr~lD!R}t z)gAb>D1h`?ZcMu@9Sk};Do`*>560Vu(GP~lg_@^*(Nvi6c5GQxXT-RH;_R$JIMlv5 zjDqrgMDg$`B6Y@x_47{Szinn`+v8n?nrEQlR4^R5tW4jp9R15Q@o=vo*jCkmF)w$M zCVWeJ+-BzaGv2$npYi@rvr93hJCngqo-KqhOfqBZABNUBQTeRmkgih5^2gG-Km7;#cMYD~~sj-n)nJ zs#nLtomHC&-fT6{T-(&92pBqJbLHB3RvEFhp4AcII z({?^0BR&8`PgA3xJgw-6!2>u;{bUPU4-d#w`k6QS*P`psAb=mKNem8`lgh2dWFloW#YYX53tW4 zNxL7Bh9S&6Ptr;}vD21rQ~iW%iuLF!n;1~q`-kbYv4~q+VNLTiyMZY)PYJPG+)!qo z^NxkGUPA+@X$D6VH$;<~7d~`mPB|QQTlw2y+DKfHXXe>F@d|l4VF;a?Bn~}|uVSN- z1)Z{_2kmGuhGq`Z;2bZR({S?=uy@(>J6;=$xEstoCk}hhyDW2n*NQ+d7^M<>W}cEs z8F()+n%ZAr=IP$^sOZ=fc(eBp(`jQ77rvYIFlyO=(#$+}JU5|*LDfWqnP=d>j?_rZ zk6JeDF01k>;G@c-A$)1h@9XhB-oFzOHZHhHjQ7N1-go>_;vmoIbOH%+Ba zt{owgrmP*upaSskc;KJ${$mkG|1wWoX+G;}x`knpOWDLXz6g=C=|u0o+|<-LbnzZv za&+4gT3?$Ey(dokeSQCWzyJRD1j}YH7yaykEy0y&vGD4Dol9y)YnS6gD-Tg9!U;VlPC$HYib?X~Pdpqqf zi@Rq?ZK76y{i5Z+-)|d>xcLX7X}Y5~zIr%{*d5@IeCdG1b~aVH6G2Wf^BlM{j|<CHP?nvxlrUs{r z?)?7z+E~PiGxIDeJ&CtD4LFiB0S7YkTtw6%f4UisaFwA`3Qv;AC=V{Xisg13{F#^8 zj(G<3H3y>5do}0|aTY1AAzvDv9bG%?7AHdwy z=cy?u-i)RVRkLv{Q6$>Z=|sm^mkwU11&@@MVWG+!STR6TsCf?083GatmH7OGGKGo- zXtqiVE}he-HRlYV#H~L__c}nFGJtR1I|_>Q>xG)9Xo5IwtKW|Ahy&fBw~2IYih$lr z4bf=+NJ#uFkN22}{{tulv~| ze(YLPkSTbDd)V3RZYApw53zGYQ-s&^EUy#;^&$;!_SLa;(%rYju6#7q78a10MTXEY zL5>FcSCjs^C$WBq6w5pG`~LdcGtcpP2k`52Tl&0|)vjYbt>@SK6AhNf7kb42PV4ug zBQ-9O&0}oIp|n((5Fp$)I)1j{z=P{bbB4y6}M1+d9z$$rB)Q?|EEp5JG|!4ss&f zQsGFIaP#b1Ux6c6uwD={lR&UQnXYeSedRN5pke)B7@}f9^_oP8gR?CuUpxeQ=nFT` z{0w!H`Rx;_KkW;vyj-Yl!gYLPTR{SbNkPgIYiiM9C%NwDgm-Km$^E$B@3)QVQqZtk z3|^;ca5vbV%;Y_9$;@Y?VQ?JlA+^I0h8xMz#_B3^+W9nI43>o4TfV=>%U|*SW4aWq zzHuG{)>~7ZE#FX)5Qtw5oYKd^^p0z12!5qPB`-??QJYM(#-+gfHNwqv?s^+aZdr3P z!Usa)s1%$xc`EIal7#DK$wC*caT?#%|1yajKLtdi)J5qPy z3-827(no?ERH%MN_VT+CtzF^Hbk_6wj1)Xb6mFg~M;^j0A-15>EDBZuTJ-1*1v=8< z77=w-g@dC<;n?vU44&AN2<(cFK1ul9=AjF1!~-C05_zOnT3Rs80!a z_xc%c$ea4 z(oh(MSG9)1Ohe)IJbPu&fx@0gx$!T|u-NP^=iKmyw5|*Q-wuNb9~MYs$z$S_Y|Zbv zI0E_|&KGK)shgr8>6|~Y`Wk^-KMckJsx!fQMF4R$P9-{@hM-196xb*6*r7fC z$MZ`&h^1QY4mV#Ua)%Z$f2=2{EN!q!7k%jbx1@K7z0oThy3dWwg#CLk>29c(d_+ta&K{4g$^L;z! z8NPW2j5*~`Hpu#;rlbyD6`2Y1LIOx;hlS+OEge){!)ly4b9h>1Arzet`0;+*L9tN* zvtW~TKXT-PE1u4I%xOEbTEQ)Wu%>6e@g@9A#}!y_ z5Mw^=@@&|%DgX;0gA_@55Nr2o@G{>Vw-zjf!_hx#kF@jg2~1*RU|CQkKhj`1Mh@$9 zbY|x{Fz}EsUUy$fZjE&#K8L1(bv42H84Ka$z8|L8&TtVFKAsDe;#YWwOLDk|3*@5X zXTYAM4LCGQn~1&3Bm$}FAeJnOxqLjFXccarPgLf?ZJk|ZHaB$f^|oF|MT=RDG}+E* zJ3yZ#g^80bw`N27SU@fBM5z68`1|*_oy#k5|1u47EjCyj78K*8xf{r$Q4dH+l^2W( z)gd!ICsC_`mq~cN9)HRT;8ts}Q1dKl35IZM5gd8!GRkGG!s!02UrvxC9U{J+@)I7`XPKERniDhf0cOdm=738an=r_oDyLc>ndV z@zaTdY$t=q+Vy!bkQo>CVZ5&j)V-O+$KPZ1N4{(qYM#M8 zL!f@YC$WGyS0p5s?&pF=+A0q*7A#knR(_*3pLM&tZ#czLJaTkU4`jgXQJ<9Q@B4v zjgGf2ATAGdK{`kcLSshq+pJlh=bi$g=4oFr7e?GqvhaFrhL?9Y^CH?Vu=J`7{bJdT zG|Bgb?wv=$`wt?xnKJ~Fpw&XnvuJxH=-GJTj>$_=xqcbHRaFB93x?D1F9jsl)C}IQ zRe<+pGN``F398uK@ZA90IjncB#tOzY=I}&a9ZFtxq6Vs>udUv1AUG9l>+q9AEwiWc|P0KL|%X1fZk4SV8YC^ zHlUhp?Jo`QiaXMo;(oOB(eASB(0smt&8^PmxxY=P4fC{N=2=h>i;vd%!*phzNmCDy z$SEI5ca2+kv{wiXeA1U!uX)E;J&FTc)*IxPX}7V66JzFCVfr3TnRyoM@TKDllCZk> zL$bd6r?RdmJgEjV&)q@mc*`lCP`CHsKjZz!ef7?WZ`k0KOro+}q3aSqIx#*OFT~WL z@|nw=Co|8%%si)jCX^dr0A{9#{u%GzBqkWLH;$eUl;&SvPPdp==~AZCC9n#rt$o^ipy&8`jeglJZCQ{aga%sjKRACRy`EN6MDFAe>)ojb@Ni~^yR;*9}-EnS|PxywXMVI39$4OW>-w0O6{gD^^ zJ>I`BaD`|*xxvhH_Aw=x)A9n-MzKl@_u0Amu0GU%NfTN!^Yq;1fR9;Coq3Pze~*_o z7IAx>)#1*;lQ^20r*byyQ^3sgE2j<@qs-`SHyOHW4?A1pF_se@5dcXqe%11d8EzstpCamZ>kXCLRLR_7P!@mCWaRbbvMWom~e8CQG|CJ=zw&`cR(RLPbTUlS5 zSJDZnD{TgY$6Uh6w{@Xsjv~C2R;Tqc+EnY+9ul8_)7(eb8|HOCCDc3@zh2CzY|@2M zd8RP@Wi;)5Yc_&zZ}MUE3bN^=4t>?C1$)+|;hn%YFyx`SQ1g7=I0TmXoW~?-WqP7; zE*9Bq0eBhEvPuK^Y~CNzf)9}9uwi`GS7x5GDukNnpmK3A^(?@zYW8$O!DbRUDgwss zwLrbjBOxQY2gc|3hV-IU*j#4_hI@pYXQSZGe68Ge}w^csW)wP+J#kfHK6?tSH8@~~= zd(eP&Rit&(aa>j*1%hbrU-5oSZ~wjlEkfL|8I>EI( zW$tWxf6_7Vw*j_go)HTIF|)HXm6DZW`^e`>;K_Rg^G4A*3KL--uze-l2_*mRVeaCd zRB+X*{Plj@m@WmI;?7{?Wk*~h8w{!Ml&N9023_ZK72i)D0^U2#Y1lduBEg(!hxTB| zbrx=(-SdVJ?d%pZ{j3ixiXKfxdR@o6E*FX7z;5v2(g;dzcM=KP(HL87Lvo+*_+`9p zOqT+4X;IKRCC|<4HxkAMyS@S_FdK z3#{qq5@$~SpbDf;Ou>|AQ)wuxIpz7Z2Rw=A@u8v_oIdo3?;m_nlM61-qM5cFL&xSRnu%S>MUu5a0vd1l_YgBa#WJ9n=| zk9a$7>K+n4xUYtAa?1uQMNH%3Pigc#LnV&@IFQq)ZKGf& zl603?l&eAOJv)4|zyc0F?m=?a^)9x00_G|h>VvEq)CO1MAF!TPhV~g z5k|tzvnh23C=d4~Gj5H?0kl6BPm6}a`3dBycrvkTb;aV|)4{1g4>PM0A=-D$kLQJP=cdf;M(zE_@h9fTfy=>8T-yF_Ah_>lZne}M0$+E)uzA2T*X(Kx`9PjFz;?14|AOOAMx5jJDr4R z$R$3c{*)`8avg{>y`o`GNCM#p$CKpK9$48a3JSOCW8TR`7_Bt=N4$1Wtl`ouc;2ZW z*_J*M52s$|24uV>Wsd?u+c=Dru)0jobMBCc8#a8^D;v?LHDTaRrUpV@PO803B0vk1SrN&O5aNgr1!w)I6Vx#lWU%rToe_Y1p!4mqnIN zEGP||gRdWFknlBOq?YxGr}Oo3>&FB*F!sUs@!ZbGCy;cV3BgKP{1UCjxUELr!f{vSk=lG=(ySxx0A2AJX?;D276$x;@`2NrDTbpUYg6d`SV9vbPykn0i{N}73+_?@h zuyew4)cMq%SeGmzFeDmO-S6@>`{TjH{YTz>JHtg_JAOVG^@u1Fx01n4F?}p_FUP@h zMLC||Cqqv3km5dZ^TA@9DQ=mZ00ZtV{Qmmdxx9jTrjd|(wMSV+LlGLgZX_15@5szZ zS9WG=AbGt#ka8y;6YtJy{J3tz!7agGsCkwT34v{Kq8O7^jdqJy;@|`cux7p{Xxc`q zKYGB_^arG8cPq5t(gI-?qC$HZT@C6@y$l|cVvWI2H`-b}9~o?Td; zr)4}l+injZ`$r2k&(XP4Vdu`XW&K(H{E|i$9CtZ@^^kdrUbu^NF!@N9oppweKjYp1 zJKnz^O@BT2u3s`4LRB{M3&PLgghP|C@Rl*0D;`9zFW5=WsTx3EEfvUA_u|J{Iz#fl zY@y~E=Nke+y+v_FO%?7+Nyp_867WRdiJslNl}yp_1hKjYq~ewgKOxHp^iIVKHBX1l z6JgA8wojyX8ShJu!J46J;1X>?PvxB_TWVN7@SDzXeQ72ybI}<>y~Tu@=j=C=VSYzd zRPT8NPi#`ejB$qGmZ(oB?LA6*e$j(Y!TsU+$V+@w2|L^F_t4yV(u67Pe0&1K`C%Xy z7R?(Uyo7gO$6%F$Da2H%(V2-m$y!rA5DZg;(hL)R7LI_btYV?&xp~1{D3i{xNDCsk zHslMh$GN~-)+_S!!0x1|MGln3N5Rn0&-|)chLBdaUZ{DdK8u7ap6=+mJsG#kDh=%n0b0K^Sr*dm~&$0Im0*z z=iQB^wah$S_9k%W-4h|O;o^_i*N%B!6nlk>Wil~hiU(LR^K@YSEGIGZe0Z`Fi+0)4 zam+m5UecvE9A?69tv^hs4f9-m&YC_`XY(yH&qFOYxfRSjrI>konGc|QR&&&9T{Nj< zITUFFkHI8^Rlg0Ujl`9y%sf8?T_N@3htLFOo}HL^mKa)4jg%fV*l-LzsHVZCJTqf; z8cX1`PT}u(Z7kv>VijT2p!a-lW}aEhJPi#}i3KyyhNT&}YJ4>PT*1uKI@?UQE(H{{ z|1h047ICYXc|QNN0eMF^c=F7I#<090BW9ikCCoe}{AhXO?y`wiTlt9NF;FV@v!2dh z*W-JF@u~DF5Te zFpZh#7tdsJd95q#W9C_%n2h$!JU#I;m&wd?@zo<_k_Vv`y9yvHuJoU;?>`oC%b0oA zM@#c(tI{p@)w`74Wae2MF`Gtf_2u-_=Fn}se2M4KC3KO`N_a3Jqk4`!Zv z@{#<4^K)oH^HXBM%=7f@E=2Z2Jnepi)h>`)@H<``i@4@@vSbA_&(-FZ;Ka=HxIs_w zX67mH??$<#Z@8G5r_x{jCRtCcZ>RpKUC@SkYIlk!mza6Blq*5rtDQg1S{FUd)%=5?$Gy26{ zhSu&r$VCv)XAxI@TNNDkBx2nGQ+VI;5-w)@$F>vtKuJ$^+RI0qt~#`v zBWWL9Da>`(7rn1c=znR&Vx&}aSz5I(LytlD&t)N&g9T{CAWFE}F9 zJbR25hxHToV0EP(&DyYqn3PQg{RzXdpveJFJnVro>k5L5(i3(KnaqJ~M_9cV+20`wOJUOp0BYku^rU{)*R@d9E=zjG9yJ>0`YP zbZK56ICgm~+4pq>Z89=~jKZFD@32a8K4T=gaw-+(I{nBC`91yq`+g9;OoqO{?!f8w zb%jz^E4lM57dqtITHJV))vfK{lg3AVB7?teBrEQGChGl!pKX8q#0HyfIHCX8 zc?z6)^z7I8`zzkRM~gt9lxal`yj;18cWU4?Bo&XFMbKqlb1~6W9(LY8iY7ZvAQ~T# z_S5vLIqCXXT+`qHk22-J;eZM?Caj+4STVSB$sGLeEW+!y%AotQ7gs*9zU;(S z;pVA~^_cbCk%p_+V4ngTNIq1-Hyu-^CUVbMnL-8H8mtL(hA$)%Q&OS)ipVd6ZezL> zWKZ{}mg+kEoLyhZ;KKq`T``^3&RCDlgPX~H!+eyx-~wm2i-GPfmUlb-_gVC|%+q!9 zezYEA2X~%|LiU+KbX|}FowJ~UWQl8n=U!_(zsC%eo27}eje1$u^WS~o+n6o|>34gR zOnw<&YmK7Kh8MZ=)$Hu)oFy2GbHUqi694v=E~#1A7hT5>g^wR^2sKZ2?G0q{{cNm$ z5lpLs%u$gG1Jz}S#cI>wpuuv|dN+uaE}DUnNy9+GQ~cL>X=Az+gde<4o{HF`#+dQ6 zv!o)uwsQ!myVRqMg*Nn=I}EzK97F;lHlf5^4XDp$-4s~;=60q_LHto9YF$pF@=9-7 z#rom;@34i>LEHJp1U*=>@hj@9ioD99WA<9^@HbSZdYc8wG{?ZenmFM9XG zbh5o60y2ju3+iTs8 zrkz-0Au(d# zQ6MSfMcjA!(hJXCkzM=b`Pt0a#=>}^<{5e?8j{D}=cR_G;PXH|uA4|KtZAB!lKV5r zNbL#4A}RvTo2sA|>j`{zneaSMQ*IU!<6;>rUe(r-APPile4 zF~ZH$-&TQMk$p_|PaFi^`)z38xUMvOl2$Avi0PE-R`N zYMu+cBA{yr?J|?IM^G`P3m#RR0ud7tKc}+(q)RHunnga)DJPt7rS>3^6D!m_C*@29 zbNPxgJ1NAu-Bs|qTp$QeJVA}tT}00219>Yl8pM9ad%yW-y#H96|9$WJv}H0}*|DAv z>V6L2kx95|#4tGHG>De;+DWvJ>w{vk3LN=j#f!~x2IXn%g_@`Jnh+T8*%3vc3W-xX zTECQlNsk?Ae0DCWd+h-j{*WXO{8HAv!UrNI2{+HomWgm=qzOi)RU>X0gFTL@!TY!7 zblu$w@^w20{cd!D-F{2?>=tKu-K~>Q^IWVq1v)w@WBB&N7;CJAS#gH2-a(&s?01CN zNbAF!ll`Gcp_?@ zd-nR+moJ!X4fUIZ=XuuJ%>^riJr=JMt*~fmN4!75g?;yBX!1E3GKI>)bLCO6{KXS~ zO^qRVi)9Nn&y{A=A#Q*RHpnMq;<)R%6L_B; zCe%C+-?M^|=L>k9*J_X_D@vuOih!G#E{GjIh5l>CQu<&Y$+^6pvo4H<#A@N@xp+}8 zkPm!|{T66|=lxeGoA#J=^|FF;F-@w})so6p=yH~aFIv18^?;zTKhAdkJ%Io3=W%A9 zC!;3d$x*D&E;G-)yNkIuLrp-*Gzjl7^Ss8)Gk$&wS9mZH(nSC0iPXj-Zlw4tG?LB4 zPRu-|nRzxIl7_*|JiDK+M2+3H^vl3c=zCCy_LG_g0%zgoIi8v4GG?AnSLS2h=bPMK zW}dk;ls;qTX}N}@+p?m`=U3iTFXbN$e(=*P_SEHlrK z%sh)#HMj%SrgUWg15j%$+&mSSc`i_Y&ts|sq%rfHs-H^U?CS%=QZw)?Gf#hJp5-6* zn|C9rFxpwTd4@Cd3})u($ISB#GtaZ*s#!fjX{cr9*|D=9t$MP%tUP)>-*fRy_^2V= zJU`B7=D8ylZ)N#|Iy2Ai%slm&c|IL{3)K}uXc9Bei+3OM3Y+7h<38c$8N;H`MKkloh%si8sc}`{K**V#d z$|teD?a_63=kR5&jG1SDW}a)zIT|Ik3$Eq-U%dZV#GPQ~X&oocJ6}q-h=1l%X7<(> zEtz?i4(!W?GV@eo=9!$gm`awd1X}~)=BXAlk@k@A#9hohKW%tG2s6*C;l7lAww*I# z=4r>wQ~vf$da5h|j!O$S&rVdZW2nR)t7j;FHOo}kuGxOpyZmL(gQ zd73cu?8MA7otdW$GtUfWo~sspLmy_IJ;M|5Y>hFH$HL7sKqQ`2GxIED=GmQ@=SpUt zlFU5arF^JmY7=HL^Xyb&h4mdZ;FYs*^9*3-d5P5-S<1}w=9&rU#>|s2^E8e&qnREu zG=!O_y?G3`WqlyLbr)`)7q?r0Q>ryC@z!8@PRewV-Cz<@Y6XQF2`Jh)lPZ7NX*RLy zFgNOP5*WW0Zl1j#t3vbJg?Mg;DToza!bV>mFdwP}pRcJ=h0Z!u=TQO4Z%nYz`RWb6 z8_ozd&s?R|{Q3PlQ0K+^)9;C*eP?51z835sYCxaw)d&0d{?P4WDG|Kw$xE(a&qJGz3N=rV6Nj@o zMfil+(e%o#DpPUnLSzTN2nw*uu*wYLIi?VBe*C%RSrJJv zJ&vxU{iwIA0^C?R5}Fn6@U{-7ASKm|cTK*LNlRAZNq0vOoHzZo=Ks%N>>sDU6F`)B zZ|->DINC$yJ?Zw%1-ACtLf$qH1MZ+K9WPQrG;frlq)|7B{^0m4UK`V;pnAa(EDW-z z7cK}W?Vw_zY5Rul(Voz`BxIqF~AKjFB(P#{%Ukt zW+Ji69}KdFk~Drx2k`Fl(IR`iGLbC(ZGdfT5ekeChoZp@XX=sDl{QJ7B(f~eQ}*0w znmu2{w8aq>r9z=;#y}dDs7bY#Uc@(>wP0H} zb2{+VOV0U|5lLjPcb=MX^SowiPW+C2B`tYl;giHD>eX@`^XjgVn(^Ji*3d<&fx}CQ!dbmadw9j)buC z=ULArSswK7@zR!g`pm1wUEOVImc<7YS#Jv7;%40R4tn(7MJd=~IFJtT?*i3Ik)-ZS z3Jfj~p697PdN@6e_MH11w&&xLiWe*+Xt$y{*l?j2RJ=Zl9zMe$!0|q5seVs}pm6hi zG{zI(<~o22^n{e~fiz^hG`+_9IBgihfp6g=ym+7=oV+f>DQ~?{X6PZ@JktyAVL`Ja z-79qkpG8}P<(pId#xVow8U2@JuB-yBvebaqK1n1ZKNWUa3OCQ0k>jXd{V;ySA_0_o zcfgtj)2Zgs^|*cK2Qq1DK3W_Z4VemJ&~i`;PAwL0o?(NE(WJ!|!mo(IvK&pi_qqbj z&VNK469<8TqcwigA5U^NW*i%GwAu0(_9|1JkM@RFtPVM zC|3#Khe&FYBiDQ3yo8~wK5~^%^E7|BmaM$G0X6bMsOASi;t~b}q&K`9*YJT z!{XcB{xG)xzT+QloCC6&SGgk{w6SsNdG5)uX3{G)0Mgdzl7`6vbWoS4WVxpjzungc z>|*nTn&(B`7?A7fLh5{7Fc3uX;mc_-f6I1a@3fF8$gM<|mEq7YT^>6{B|!L4-5;;7 z9mHBO#0?75W^z3rN>f!)D?W>vXRU$)H^Hbol-Dmk`goxmq~(3&`;JKjfK!>Al**%4-3vKKGEzW9RikKVIfv8MuN{{UrY6^mwqW_?ZLKj(N`h z5(8JF*cqgZ5$Km9hUpL4+2zdb#PiT>a?x@XJ{vw2q(8}H+V})G7Oefp_4v=>B6zqe z7S^p%AgsL$R$e^8t*Cs>)((M?H8qe-$@QnlXWb{xbt=457&FfYTfZA+JEScL>mLCH zHP0=2F!Nj_kwqRp6@%qB9Kp5MII?ZpSelphp1gR_kw3`tiWW%+2sKZY)@b;4LIijA zS%jrKmUDj9u`o_57^zk|dB4$tJPV725wE0C@@72vnBMw6p4<8O1VM_ip#S(hpS3+0 zx7>E&P9B{NrCoh-&C{8r+Y)=y>@fpiavw}ji-*+`KjO7BTm)9S3!sC@VSbg>CjQ2U zP24)oc|dCWqH{fYOlhwgZj zd$C6JkhvBlsSJWU8G4{XLh0lrwl*!jKjSsU{fze?YxBQf@$#9IL1aV*-+gEWwp52;nzRXQG1jDxgLjex z;`(r5rYcO09K=_rJA-w{T%qRqWornC#kBCxw^pJ2`*dtM-x;17IMNeGwvbE79x!Fu zV^SVh!RjUWz-I;FXWJtkC&A&+p;%&7jcM_&ICic&3^O&S($?pQs~zj_{jw{FiOl80 zdb3*o4xNRXXLjNg=B|Bl&z4fuE9rwiZ<%@C)T7U{ONr!hJ;-0G3H)*`H|&$tU{2pr8(z{ehY16bqr|d6!y2zGNZq)m0sC zZV;s-26TiDt99X2)k!QI<3p7l_7XwSKJLk^*cnP(_7&mv}?kC}PaGV@HDXhNG;9)PMQ z;b+_XF!L1Cc+a0_=9$UNb0ss+7G|Cz%siWzc}D+bo(@J9MMbI5mHg3nyp251Im|rc znR!lT=2^wevyqwSXJ($|%sgMSJkKI#p3l3i;Qgk|f|6cae}8^$}+;fj_|YX3CujBnR$jX^Gs&uxtE#eI%b{| ztv;2NF!Ri2=2;{f&)?tS4f^83^E^i~^UPu9IggpAfSG6G!es2o@;tX3xy&75=Bdlf zbHYV)+CP35WTgLJy#Fvy%FHu+zBE6RnWyU$mog(}o}-z0daL&3CNc9gVCMPk)goG^ zvkG(ygr9Bi%gl4HxF?n{^X$y>JUy6sK4j(@|9m?)l$oa|Gtb&-F*HUu5e`=hKil5Q z@;n=NNAfz%Jad?NS~BzO&dl=#GtU>yJOi0|#?8{Fr_ZLtwH_;fU*9$oS45e4PG;tr z$;{J{nWq>tPd8?sH<)?KGxNN~%=7${B)WU*LKyi$_}TW|%slm(c}6nx{K(AHkC~?; zGtVc?JoT7)E@tLAGbE12BzS@J8sTT#E0}p^GxM}#<|)g}b2Br~KFmCmn0ZcO<{8M$ zQ(0v`_Bt|*Io=<80^b*1|GvOU%sj6#^E}GTQwnoN9#3|dMFpZ!Mk@q z`^vYoh|9R83Tp>0!in~#Ft4c!-}*Su zS8XRVlENWxwj(~$aDcqqvZ!}c0kWi*VVR2w)ULAr{tVsDbSWq>+e>mbp2D7wSk8uw z5=2b1hvCk5`MRKCFvI^N8ruqhi(7#v!$yI-t*e+`#E=iEPkms05f#x1(sT*Gm+ z^}st~knRFnAGVV8Ps2dNqz9FoeU>bGauh#*k%Bq(w!h-FWu7`>M{s109Zgi}NG}ai zgo2epr z_A{ruw?5)#>@*>b;aXrdq41YcwlQ4_?zNf{_twwkSdtG6mL5fG3UA<2$*aU?MtA7H zaRl9Em`fh*@xY`tPQ=bfxOtX76F~g~U2aV1IGPvtjtnbvfjnmU4GJdApnK4eM`uW< zlRWC|l7!4@zsE~k=9wv|MzOIrRQbgxJjR>C$j_s=si$;l%mpdP`8<#+&Fl>MnbS${ zXDM(*{YRe8U!PxFd7hCm!)eY+Bks}!Ha_m9;Npiq= zXMP0ljhzPWiOWfG<~Z_tTR7I+vOLe;AO0Ed-^V}%{*5)H?lR!G$rGrSb|2bLUke7O z-NKH&wZS@d81x@9gvfW;faguwIS1B9L0F#W-RKhXIqMvXyd6uuZVUh?4|Ybp8hQMt z2RRZQXpwIxxKxmVA}OOGaOjUb{C1{G!P@K^lB8CO-2y#n-P&1XXZBR^O<0c0Rs}+( z!CpQy`wa=65rF+-hJlGpmml+aJ1C|YF$bR9tLGfS5TBDP+R_HD{&3oNCpKkZd`ki(5w%30C=NTrUF=3AQ z)t%?;uBu?r7CC}sno^NcVlf`k5CnNK{c)CK67>5h|J(KWZ}Xg|8v~6K6wve&R=7p$ z923^|2CdWgg>jbxkeTsJa_`h5w6>%l%bR5bqayj6rvx?6vl0r-)Q|KWzLJmXzxIP8 zM<;=Ec>u~P_aGTlJ|ek_%RCWcLEm3y@-@#E-AH(-KM2>GB;ul^lgzg7u`pr0HQs+F z3$3zIL*G9xg7%0G_Ta>&(5cWhbEucEkF#rk44g=4Wv`35VR7d|=8$k4jJ6nuJKF=$ zic6}fX;2jHYcGuBza)W>CjS{mzKscREIyU>&RWd|oef}I?!-gu%a^R>fg(n0Lo*{? z7!Of3l6Yy=QmAe?@$27jFSiS4_^3qi4P13p_}O+g$)eND=2RjKd!@xl`fq1^Uum-! z-X}nHhXsy|Oa!w_0l(Jk%{&99ECT-*dF)rwt@wcMMs%7d2=0lKX&<8NO!IJ0GS{Xr z?0N144%l-%9uFX>cGQhZ8)`N3^d&e zBojSe@ik9T&k&e2>8#m+3k0W04Z}JI=EE|@8hkmr5#Owe1havfmQzK&;4) zuX$?C3x-=U$-H`|4mbW7g(to71)tz%?EbzIZJN@7IwTxHgs#^~*Him@y zj4m$Fhvz&E2ojWGGaRhJ*UXErc}iQwLC&0w+|~W5d0zd&W|cU@B|i!BwNM7NeUOIR zwhqwjc%7ZS!U)>G^Y7=mG<6~D-eHTUG-u+{4QpBBl96z@0+IP^cA|IhO(AEM0=P7M zVD|(}0ow&Oe9g1+n+954gA*K=8>ESoE1EITTlpg6Yzw(HB z3F3bC^SnW8+m&c-yBjsnomJJ0m!T<~HJXLzQ1iS>%~Q-|3v;z01w_vBpJ7x%Yui0( zZF>?mPiJbLvuSO62sO__THC&6j|~Z?=J{4pm)2&*f`fEU*BSTo^K}J+V)Pp&%9u2p4X^(ddv-B#a~Z{JGcMp zasGGE^&ijGCDc6SX+O_L)I2xR+V&J$+dh?==VEf1SwYQnH8s!h9plM;)iOW<2fDw% z9)h?eYM!=>Bv`>qx!k6^PQ25!w!My;XPe$|MvIzfH8s!co@r$J<<(G|&wqx|aa!B{ zM9>}opytV?=836!I)r$U%r`rkKGZzRsd;X+jv$^_l3|bqfAg%T=4nt8#uicY^rq(d zTwpmHO3l+Dsgl`8&9jKswueqJAX&kyU|#EQ{cd|O&pouZJ2h~pU#C{5x&!)V$EX|#fx=PqiVzSKM~QuFku=J}cS^L&-^17}h59JV+H z&+Rh~iuP1>U*8_gGl4-A}^_V8hWf`KAxHl3x@uc z*U*c3u7A#js{*#z=bQ#OQ}aBmp^Pr-PJlsv30OiSnrKxC@a~Miz?fZ41MU8Q^;_;G zh-;<2fkKSZ@x3#q&~AMRH%y{)(ccV*;gaekW1BwNJ9QVz#rL=i4|)PB;NQ>l*}9GF zz&c&H)}IUFwBPXa;1v8VK@ufgS%vOxFdzdOw4vfrCN_v`hl2aseDgfzKo45$>ha;7 zie%cfNL=ha3Qk=gP3ne@h9d?_P@};^VV%!-sKgP9Bwp|}&s$pkz^U*cK62fftPd_m z_QQjrR>=t$53+*;AcY4Hl!x}OSy--g9N>dpF>r6@`IxCdUgf7TyVZ-#u2qDkK{jB} z{}y|1iV++c`yJQb;Xs4z3Vh1I5yYKF|6^>wJLm6z+Zzf%ZihVs@!mwv{yi!^=?I@P zN|4t~6Bs;NhOpO8Bjr&%>^Vvtij=!dw)=Sd^8xrw>o9hVv>}U)1&O2DFhF5}Xl3vO zf=Y~F7)O@O+IkXAz37O(_-2FFq^>!y-Ru2vTypFcX^qQc3C66z1=fG;#6m%i#6@Q_ z7NiEj+!#Vew7)~rLyJ&YhyeKfHfO!-`27<(Iv-f!kefnqO4?bGe}wf4b#?wNA`|=GGA;vO|M}j&8zp=jpI!2Rqi4^EFQuUt@GH@FVJX)C;(~r;z)fZ(*MACDiyx0w()ek+lnpP|ZeX zy#AFNnrXw|JO_X81DCJbGYZw-KC!?cq=k|L??DzKOWX=&Sqpz>XD(Gfw0P0jZC>H0+Y8cLheS(Azb|7 z|E>4u-NNDcn_H6S>r|Mj*&4tr&%#lYLr6ctG^|)V1P0k2!^f@}LlS<1?%H;us!1FF z`Tl->zCZ644(FiCbo@4TB7AR@g&m{l47WHbGGL7$%y8yHFrASk!79Su3nQ7@3=5vJ zJb&|)&Uk=ZeC2W z+J~+CSwjG~Ka8I^k{n++j3oFzKrJa+P-W$arD+e1j~z0IGp^FCC9r$FU&qm(j|0wW zTUk_ApN4JqB8c+CGmKz)6fj|lxb=1%d^$Oob$OwSQleyWfXrA(Dm?uEM)@BXST(!= z?KD_}&76ZsV-I!uy&R;o*dM7Z55ZS$O(1Fh%l}{RKQ8bFvFpec zo8lo8{fPKtdE!ZH+MCDU!scS5;E<3Bj4d=oqvH#4{RB-A`6Te`dh~K!a*hjEqrvCS zVgp@I5=Lj;I~7~P)X^+ExkeubDD)-o1O?$OPlIg4YVPX*G+@pUwtD_0O#RiFmk}-lyyH^^&;vO~nOvlrLq5I7yMzuMVuu zl0>jAS73y8NCBs9^wG>r7sz$!WQWX5rstMGS1+Po5UcT|3k*|oV`M8O$>j2-+$!4y zSd{#nL5vi9nsbF6uHg)IS3+3fgd~t0``7zbFKBnQEgUAvPe!UU=HX8Vj}<#3==?IfvPrOZY8cvJ z;XyN&J|L?-t9jErEMf5kf4=7VK_C*|hbZ9+x5fBKzz4=(CJxFb564IQWT4Bp+nG+e zNSc@4z#bGxhJ~qTf8Ec$e0`k00rOJJs>B=*A7Q1YfXOl5Ek zTqta1EeVv#zKbVHRa!8gKDW zfZaL#&2#hqMKG(iiamT}BYnnfM7Og9p}b%+$c{e5+L@8x^2yp0c1J!(wSXK91sWL>y&+z?7-gNUl`N51A6s~ik7w%Ty} z?mdZ1EH!Yv{d_RIa0su6*@xzAKZDXUrqem=($pyJLBU*(uX(1+%m=ACPQ1#EXYoMV z>s7Sa7wRh><7aF4qeUU_QOc1i(D$$P#Q$FJKhC1R-+Ki&2EpMw8SHkcD|kXqG|r7Q zg_ao_B>QwZimf$(xTEkLYjeZ}25N|ttj%(0U!)XZZAZ|_ZequZ(Yb`v z^4MQ9TBZgqhz#}*SoHTr{q4WviVLB9(?oo4a5k14vxWTG%G30H;E+lJj3Loy! z*%P&?yM6` z=!rP!yzy6FW-mdU!Yw+(Vekh$-%cH7Y&~IYEJonds3n&*wNJD8P; zsSy0BzS|^vNL+bNXBfHC8AhY%45K`1o^8}T&r|cfLT4D=r8A5M(z)&8i8{ozXfXtv zXZ?G_(1GIRX0*<#zWM z>>-HTOwCiA&M*q~(;*kBc^;2Aa&{g(|QesqRW2AyFfS!hh^S`Wgg{bk+j{R+DN zd@!`o8Ai|bKCnlrdG4m>nKgDfI!(1(}?-L+N{kmot39?D-2)V_yf9U3at@r0ksx~#xd31)+ zcWRzq)I4qI45Q_AhLJ6uVRVenF!H7|jFPk(S(PB#yI}iodAB{7XFD~|B09s!j?OUJ zLuVMRrZbFMsChcbeC7#K^E9M0j68z<*cw+a&=CDCZ?A_S?ie*s9yQPO^)4Vr&2v4S zVf28S=a5sE8GCA;rgVl;v*390;#wJ`CKkgO|M}?Z_gV_?S{FPkpLG|@sCi2FamPt?hS5@Lo)hT| zqfgX4r+wPV9H29dtmq7*%{#-%`t%fdm%Xlgy=1rCZ*M|dPsKn_3a^u`#HmCEuCTXoto!CI>Ttt_da+j zoncgZJrp%k^E9F}jH(1v$?dvSFpPzNeZD{Mmq0qhXe*szR6@;jDm705I>X5M{9^Yo@OjNWdHCoTG(U@jNey+`&C_(oRPvn8 zFuF|5Q{_t}b_^U3k8hTD@3#l@TtjCVoulTNNzK!V&M*q1GmL~Dn?qk}o;h@ekt>~H zRMKRGz1C>MMT_5l^Xb7ni>P^4(-}s-bcRuNp&wSK<|#_&w%?&MjN0i8qn&hyk%D_Z zlc?(tO%wn6&8L?jE@TZuf9JQu%^m8nsZEJQM=PLrcPGHZcS~@(Su}B~)8Rchca15D zO$TIfqiest1aT!}G(cf`25zsUF)8hVt$tVslBAVj+-fz#e$*!ocXpwAiyz#)%U&Ss zQpdNpeN|Z=`|>lLJ9Li=Q}rY0NR|}bPhc?0$9YJ?Wi(;7j)b+RQm}YTJ9xI~@-@#4 z?NLzuxE?FlE0IXQ7(B6Z6ewGcCI?$a!`icokd%A`JxJs6US~LgWMQ9QF$3N1??=%8 z{p~(R82XqT#Lw2)kgFGHp694w$p7qwm))>~hBZ=HS7<2o*^-I1sP|ZfkN-WU{=aqp z{vS&^tMcG2+AmJun>d|U0>karu;f}3d;f|dBq?%;Xg?0bI%eab04I=R^nR_^%W=v1 zep>)a6a$#K9BNokJCMx~M|d))3>_0OfyJFNB)akxQXJ01dWGVk^`_gfdN?jQ`B61^ z!8~iSg(FN3;$e_BJ_I!-TatM$MsVh=EQt!KL&sPrH1kY0BpYA;=ks-~_vZsJwpNN9 z-13s^Jl+LL*LPy`;|`=_=r&w^Q3DoVkR_js-=ag0x1uqELf|ud_dkZ!!*R(GSUM4( z&=-Wh@7>_qP*Yleq(N@9E>uyTZrW@Sia zqzSO+WJvWedcV+oN>RIkps=j_e(B-31P4@}+Fjh!ONR%opg$Nd@A4PYt{k z(oz4?Y$)II`Jesva9nbVvSt#=_p{mhvTsPlf?Cl21tj^wPCU792ZG&u@!ZD_a5hi` z#*Y~U1u5M|*^_w&N$%J4KW6>D3V=_u4r|P$L?$S4CsjBXN)!aPPWbuZHV?l1y zf&Vwk|G2>3=L=DN@hW_;IEaY(aq&g3`JkG+4^RFc3bPHe(dU%8C_Fa=TVS?1J1R`8z{VGG>*3QBPZnK$woOnn7Q%>c52rJq3y*rnAI1y++2yn(pseAu5u%LJL1tR-4O8Hx&kM#J~U1|$W~47Kvmm3@v%$eU{2ld#`gD#@&Er- zO^JaQx`JrTWJkRG`6EX6S|1QU?+I=4o~TC6lPo&cfs}m%c)>*zq4w<_zImP*q7fim z?0_0Z&cQNMHnO5gv*6H}*C=Sm8g!1ijmug+p>okBcE3n0$hERv@oF!K^?tiMv|eA! zs4}92Yna7m*(XBo%OBiV3q^r*Uz3~TJPoqT`{Si_9z)I)k*@c(Ud*#${xmo?+L?J$ z)t~GO;BbX9=?tUjTTIO)Q4o)*Weo?rL&@buY~t)BuycOi_5RWe+KFFS2otrYpi8=G zIAZ()*73?L5Sa8DCCuN6zQQdWKE(spuQ|q6tHpx3U47Sndr1ULo*V@Qx3!S>teMy| z{SIT2$f5NMUhru`5{mSkPCku%h0KK#c~OgOL73hB>wTja(&l_!7Yw(b%wQZ>9m7S( z)}R*X4^jv1Avi7$sqdOb?&iHm%9+wU!+8@Ru^{x*extbe$JLwMQL0ymAwkTe<}~JQsvE z-Xt(E*~5GZnoa~Gg&=0I2v16VB0TGK0DRlS~3F^Q%XvhRqEP`0bwi_n#Nz=fY>~$(wxn64s?T`FG@e!9lMXD{eW0 zY-v5iic^z7imu10odiLDulHxD`p>d^B?6(bIEyXWbrWw$OTsy{rs+LLgB;GNMtY{y zvW|~{dlI?4Mqg*BNx#R}Ja-=QhfOa&va(C=Vn_3hxFA6kwr{p2N+)-rJS{gEx0%-d zj6Qj!Eqn$PDX!vco(n(ChP-2=F;2XVJ%VQ8GiNkG|Gg=Zskwlj8*<^3-~gzP8_7CF zID_0cO}^%7d}Qe6@flXT;KI0%{#j9kmUZ)f3nK zx+a@tZckm2~E!<1t)8%~ND`1(HiR!^~-30-vP#o9AFrh z1|OEc#Fye9pcg}|Vf6+L;^JXJS~``Ol6_;DMf0Wun)%mU;9i2b{nR`sFZRQ-j{2ZY z%~SAbHM7{r6gqWhVGU}YKW7+47#A}ZL(^d8my_Kl(L)d?LCsT9A|GF*=J|!1=T_PW zM*ZYce7N=;mZIiaM9p&%(jiN(#=&IEjDN59$6MQ^vsT1ROB_b$mEa+Qw;63}o}tHr zh}F0eq&SZuUWE~8cB~tD^z;P8e_GjXFg*lu52$&X`(HuL)I1GR`@wRfCVZEg=kts~ zBxsB?(Hg1Aw0ato2g!#(^!=Xh^?ESROVm7L3_q||Id*WCn&%foI>Tt+Fc_1ThZU)L zN}u1xDBmsQRutuc+=SiT`|Tl!Qz?6kYQGj@fhkiVl$vKN%`s6>mVl>w1xTK-H{m=f zu}ap zy@74-lLARQe>1k9LDD}@z3x98WCbC8{0DrVnx`5y&qXDvc=ymJ=-Rtaye-Gw$#QC* zT7EvPd!{$&i~W|@+CvbhYxM)?dt@Tz4K5Is?oB)sGV$!FJJ_l5G9yLJ^BOhJs=9GR zXkj^It@+n_f7~q`PGdzP;W|mMDowfEki$;Aj5l6bKP;B$Iu2(RQ}YZc_d-R_Q^`2x zeArb!yZie7{Ct0YeVhZ~{v`988~#Ae^EEZkKIu#GhEOkZiBrrhqUL#-n&&J3aPnL^ z74Z4B-Ru1dlKwnMbg6kN7lg6jsd;Xq<|+Ixi_M|txi7bp8A8o7ck(`-WeELE>F{b; zEVr!t`t}gS?K}`c9!~MVXP-<#r3V zzdqle8(t^oL%1K`;A7N0*HiNxEFZ=SH!dbZpPr)}YMwW!d5U?*lWqQ9P_`kqd%Yfl zII*wNXdyMv3)DPapNf$%YM$1)Lt&QpRI)zt2bL6GhWmevz@rMy;NI=h?)~;)p7Q;Y zP!lyz&T$1W{r(aQIlMx-)I3Mix$R@p-s1f~=eA!q#G}sWK-+}ho_{@<=QV1c9f#`h zRcfA{oBgmfHP1L|o_(l!K6Q~I?iF=N%yTXC&L;rg+WqyLPcK27aV3KFfwtKFxEhQ< ztw>4+4nsC~tl(N&9QK$RO;XhrcpUY+jFv_QJgB?YwclQXxbGL}{M+>zc(|@HolV$) zJ@@Ls0C8nl`#_c4ctg!|XDMor9mu?V>ka-BPw+L*r~WA{caILtaAP3)mzp?;mMKTb{2 zjYEch_=a|?WMSog&X6!x_t$#89G9HHLjv$TDVBNq!;989b)aue4lu}}g3gyWf&M0g z$rO>3$gST|>^n>XBxCvKc_xe2;MI?;$k8@ol8`eD%s(tdCQ~fQv~@<1FCa%W$Z>S? zt1~K_m;?0_F8%ZQdNR+AJEh3eqbIp`(_CP+Y$v|9%z+%??7-=AnqZ|ZN7BEwqvDEf z=*5_Rpq9qpJeOUVh{J~Vh1rGf5O~RijJDGxqeq6I0p~`7`$7p)HK!AO@Epx7nlb?$ zujX%_$^L#=ZHGPCQXoZgR8AuUiI?c}gGnTCWB~MSKZiHhI-mf}My6QBuk&h(z&|ue7hO(e{_jaDzQY~o5sQ|#NRw~)5fCD&)y*I zz!~u7>=dG_cn{mBo=5%KsCgP$lU9?BNbTJu9HtqBoG$Y>Pmd%48dt?K;?z8|M|B_* zAxCIXtw3oZCNQDzVA2|1huU87aQK;laIb&&{nEp6$+;(X0sHYRN%`qM#8SWvUizmp z7Q^+3IGwp8L)3|(d_TDHA_C3T$OhTI{LQnb%#yU-|H923r2*ILm*FL8!KB4;Ij##D z0?vngUG;mlja?jhgMgR-yeX!ix=h-nEwFk~6wbvM2&6^Lm_4nfDwov$Po{feE%|n$d=Hpv^Ou>}P-#kTK zZ=ewubaCklKceYJ%`;dJo|Ij~b%%5zf15GXZ3Q$Vp#aMXYC-FB{^prFwGv$yI)fP{ zFLGT@9ft8NAnf}=b|{_I_exQSB<2gi467BmVBSEd zaUo#fpM#_4`$F8V!>sw9Hz-Bd9oHp~hs+FtuJgAS6#K%Bh6LSj%!E^O@yf0JQDSpn z;O+H*`8s~6pUQNy!S(}^ytMS_#`CsNe6_qQ9_$6h6z+$^v_>2UOXTZH_wzunNdriW=A$F+O`~-PHp5C=|n-0$$IvXehS=m z-TUi#)yvn%*|s1C=3l3^>!OZW?9?|#uOc4mKY6ex9b8d+)eY_vkHwI8`v@!Ck__RW zyVmRFcH#6Hnh1BUsj>-u*Ri7e#2IgsM5yvw$x7L6WWv@hV|=Mmk|<4TZ%g6xx~|?b zy%0GkXf*Ama4X;Jjp;VF_PxUR0BWAYx2H01;(y#sY za(Ow+XD@^YymM?2ZyO$zvjes75`uhW50y`<8P}U0JHyl2T+ylTTdh&HRiV}&r9bFl%vN_VH`xrdtPWNM!4_?lZ<$Lsc$O2 z*<=F3vFfB@_aPK*HyRX?GDKX^;+4*F0eQ(bzUKMD!VeBceP^-AWBhhm5q?K=Z}qQC zB;PjB8B4?5V0FhsRc^9$=f*K{&2X6YkA7C3y#~ zpuMtO*tEMp=t+sO+vdB#gLFN<=6USITo`#t7n^-!@r^M{8F>3q%8$7>!~O|N3NSe?Na#oe)es2O;^S0|l&DpBq?U6>}M33uES zS&4*+khDdeuX!#mUJR>KY`K^2I$~ZV2W!{4z~aLLN!WNbWEn*B`->f5xGG^eLrmdL zMrPMDwHNc;ymA4pA+y67ch=xXeU7l#Uu#2XKZfQMR-jLZOu%>TFyOvyV0Bt(ZvZLU z594Q^ST8}`ic>b=+O(f78$JT;)BBLOTR2c$H5Mwa68uKqiT2DB1;IDow zy##Sh)I6Kx{ctEXPXlV6O~%VhMH$q zavl!%rM08fJRex@(B9yQO**_Ti-HP4bN0kT!d zn}|Fv{<0CAnCXMU+ew(Qhth>=bVZdELu1dTB&)Kg&jcGsd>7q+{TjBJU=}h z&fYnDhUF|sfsPly8CwtLd6AlDwb=)(BVi1?ioM8y;#AC)e}Zl`e&S7`=6RZ$=Z#WN zHhlIBsB-x&ueFCD?i4l8vgw&o2ywiA1Xah5BjNYT zLHN$U*8Agb;c#-Pc~*_5we8n)xp%fZ@%mEptfuB!=Qo@IYM!DMUg&LIDrwEh2TkW$ z-DcN=c{0>I=Y4d;R)Obm>ZZr&BQ;O)1zx0Dw3xA{=E?B3p?O2Y$*L8puv&?~dA|Mp z2pg^nW8)|JgDW*pxo25yJ2g*KSjjw5NF-sC_VG9>`b0}J53bEj@4mi01aSt`JacV5 za8%0_v~@p&gTM5_mDD`%JP1WcsCn+#UCb2V6!N4Y4IXXccJH@`Ag+FZ4=Lz)gO5}5 z?4;&ds}RPnpysLf9ybTla{v0xrx)`)Uk>n4iT3k6tqR%ahm-VZd1O^;4MP^j;%iaS zL^$4`|ZU%r-zJ$-QzN_H8zBzhBNr?a~m+%q3;_) zQhd#G!VLk)?6(geOtmAtmaS;-xnNqW;exd*zjOu7$wgkH`2bM=#WgT8tDvo_UZg%CjY$f z{p*jG%>rOGIF&K`?nU;jc!xgUaDa0mm2^I&3FOKTCZ}ZTP+iDjoS7m47Y(fcS+9rV zk|Sz$h&r|vX^ZYhG-nQjmD!OGl6ZVC59fD1&!cYJ5H1F2QsiC>0m!ZJ-cf`!`ACygEG#U&AVyMw=ZF5GX6hx!P> z>>utB6=p)_-_j)cA@h-k3Y`f=&C@deJ8BwX&UmWYq0ZO*%`>8L7S5VxPsZv>la}OD z=xFIHp za+)a#mldtaL4iUvXQ?gTW)p(e3U}|fhvSkX7bF1DeN!2avED@2^&JWoafAe`O4M}H z1Z-Ml$kL<}=$6k>EJojP3aa^==S#;%Y`fNyJenjx3Z9LJh^5OJff0J72?oN!tLg-= z6$an4QE1ruY`DJj&OhJZ&(HVg-NNB~+-gZK7T)7-nxFx7S7}d+m|$|HAR8N(4*|vI zlh}EW5%`rpLt94+!FoIX<~b41z$fah;6j@`oN7@aTWn>B__;n1Wx@rS&pEhEOcBy( zeH7=GGIy#?-amQ9zmB8-h`a1-?%^^~J0kMz0oJ7E8RS&J2853w4y)Tx?AGC=C0i9* zcVr;bsvIb^=5L+{XU`;=ZHesc)8A10(T}X%$OYupn%(&R=MI$2*^d*4I)HR~f8d=M z0v~Jmo2QBS0o=065~3BwVATgLB5`Cm(SC9Z!E`N%U*Unz366uvA&Th1p&Q(T(frM` zf{{lWH{)>hut?IDQOA5a7!Bpm7T|3c;-DllkX>S>hxS)Vfq^?2@LX|8b z`RsmnO|d>K5fUP)`U0^0YBtXJI2Fzg=5L<;zg|X~r3Z1G>@*TD6^Eor2o#OT#vcy( z!j-n8tXNn(YAbQU4ui~~bT)tUyebw2E`fI$YpG;BJ5~q1xy}I@q3NJ;(ifG-dJ&bt zSExv+#7y1T4t&Q~bj5?cnCC>ZaHzG=qVpy*@W!X-c~gx1Kp^J@`mD7DDf!>QcVBsc zqfR+%KP3)0UNv3uYA=X&=#)3O%<)HiN?UQ3Wgs?`j)kBETPF2A&CQO8W{j)-z#j7P z`GqNv<^8qmeWMq|TI%Qvw~nf!+`3kLRiK&W(HS?3h5DhlQtjwWM=D!H^HS4e4e&R+ zWSF)6ubGa$pxx_bVX#h50~y;DVDk$nkItFt2PzX@p!-IZ$X@9VHhSy^?@MWqafdi~ zUw@)&zrCPXT6+X2&JjRSO=@~Z9~@-_KkHv5=0q(>+6HBWnW z+K)0<4F`MVVs9l?)LFCyZaja&`$qevYlW`m)g(uPjma|BYnc@Q$5}1q1FL_N-kBd{!&|wO%i`3ny195$Zmw zvQmQ!SY?o8>K$o6&MhhIz1N!=j|FjzCr*F``I=Z(o6ayAe(u+Lz1%JwMQvK!?!M8i zq~A`K^X1jJwbVSzvQwFlPCFUB(Wz{otqIUjX^(HwJkRMm%YLob%jM-UZ=UDr>cM1v=6%$k=Aj!Z+Yr^X zf#jq1W{h9NAl>~&MAu>@6!+JGi%O=DUOu1Py&}TbJnwo1LF2u+bNWm_Edb zyH6pl1@F<}R69BcJDK-`uJ`5d_5S1R{rlB7Y=%EbyL#`f#j%7N8MR!Z!#bFn&*3k*^uMT!5QvP@r}^!c(2$1=+j_BCfuz+SGKvr zm~jtLkDTZyLl~N^SqYj3*M=Qc*N0WY@!f~S1D+LWvK}P zf#itOe9cqKWG)=b-^K2D--x$toQ*eCkB3=Uop_$ui#TngU|765D1U9`DHqxTr&@kI zzdX;qMvGy_m_n{b`4d*URfuzhbcDvy?;K;^zJyUxz z&)L^Q;fa<#)|W59k51OH(o=OnE165S9NUZTPc{J~y;;xNejg2eVGWOR)rpn{eHT7#$`p-tVmQmZVAuM;V(MPZQ}Nbl@JRN< z`P4jJsd>WLYDU)B6r4uP!ot)%gQ$5buP9?WuBSnBW^K1g^bo{N>iZg7i{;}qYMz0+ z?Mcm12}q>odFSXk99v>TRH%7sgliK8*LbkMxb)xa{qb79@0=B})E0+QYMu=PZ!>1p zJck|+BJYhykmywm+4j>sD_zO0U3K8TaYeVmbbY=*5bzE)&yv6^D1e%$S6V-iGi|~P zsCoLP4I)zwoXI^MO{Ou|h*VqFz?b!<-Rt#`=h^(BN6;3ulajq`%Ckx)V;ThCCeK$WwV>6dxYigc*h7>c_)I8&;d2ZUUh>Uue z3i%7ybg$P#5O4idzhN18Z}RcyIHKnn`ZoVS0!_knx~fiK3>>1Jvu8W4;B}v zbpQM4!8{xHN07;u9{3J5&w_mne)FjhZl&fa_%sx~q~|dYn z&kcVT^&y3C-r$|oJQIhHLkpC{*z?pp-+X(H;-=0b^Qd`pbC-~5PrO04ms-C)*WtxJ?0Gp$&pp)frJ)wHghH@iX7u>o_M_t8wNU1A&6k=fqbiBt z@CJcZL=v8_$Ax*3UHvzEIW9RB9(z#8xnp=k;tW!CKoK67+dx!G1A9%x7?uWe$l=bf z=+(Lmyy~_ytQf#Q&oj6~0C?OCX4i2q@`AiYoM#Sj#JmcPFQ>K2pJm7o?>cn1UkzR+ zD+!Zt^EXd(*Mpc>YDH#W?nlxJhC!)%G}66gLCQZH!RwQrHA8^b2Z>RK9X-qvPuQWSsgPNc5?;O*f@&JV+KOv zIdyVnhcI-w#vIdD~c z^ur6(I87M*4f&hrjKw}UyV?r$AIgKmdlga?BSWSn_knM;f3Sa94&FCa5k`y+U}|kV zxrgoen`aB{_mnAVNAjy4;x z>YuN>Jsg*u%vCc7-^g-81hy=aq1Iu?T$8!x`;bKYGZ(O|`mz-_kSJ7*q12~d1jck9r z1ZBSpfph(`a1io^TwX1E=7cX}ptMXk; z=xv%u>b3(bnxujN?RWm`{iPSga-KaMqPRZj%cKwZht7Cha3K~}%=^UTKKzdAw;F5{g&?5BmKuvlh=soaX_o_KpY;o3Vs_a3BRT7H$0X zyz1raU1&IW>7`mFTd44&x0D>Zq zv*n-5@R(6$s9}>J{BXB}5%K4l=*`o~SUS_}Q_gg*f0Z3v@tw`rJOd49Lj#wCvwpPT zM_abz@Nc3}amj|9HLOHNt6gE9%0r|%$O9+2e}`it{LNE#<{%<_`#wr;Hh`EN6G`nD zF_L3ih`-duq0}N{GP+X}#ylMf$j21yM}?4c^jzkb=P9r<5T*@dxPr9TgI)D#e8(Xe z-t#K)pwQDuwy6$vqIdDD zz;kHx*f;3mMmx}?>-8y`44402?>}Pmzs>Vuf*%}yy^dX0_7u0dr{lFRXzfC=3d!tO zi<0~3L&{`j@Qvpk*+A!|wU&S9Yo1jevw(O12g}ZQj%^0-#0@@T;Fe}hMxwoFK>bvB zlK%*aC1!B1OqdBC0UP+5r%$U7R4gBZtJXfn4tEz~IpL8|l4?w13~r!gaWnYl+Mnh& zALpfHxq!zpE?@H;Xc`0=tOkxbd;G%{aar{t?PWz1lrNip*;QSt*%}i>ZOE&N| z&*08j__DH*d*iz&e(xfU6~8${)A@mfFzTp)nrEN8Q{cWq5u3Yc9IU?-!rwe06yjp- z@z$-Iu=dS!Y`%pq?8q`B8|UvwM*?YmeAF-yRHtUFf4Z0k$|;fHM3ne_9evIp~Y6nKrdi{|4y)I3qCJ!$7j zKq)oP!H3V${^>TvlbUC0+em`9#Y3u7!oS!10|C<;tjIzgacH6D88qlNV@u6*E;Y~X zMk9!6E<>z0MW8byU5Vv|I!Jt*(`_(4nCGH?N~CD+6||L_r)YXVSU0W-@1y3~mNJN_ z=sOdaQJTy>Q6tiCUJdOvzPo$99)h@^GmK0peP9Q#u!9HGJe|yzqp#FFwU^}4{Fn&h zdV%Knb53z}(pSL3kz2d>`)j>Fw#%7T@fLmkQHWnq^VEE0N}A?eLiN-<=L@RNP6;b56u3Ui~q5BCxDKsYmwg zwW%{9^6hVVtvv*B={7%bws$5PRNw+vQ@zQh$V|+MzJps{UuIrV^L$3lb5VpT(e$W* z({a1H_xp3bKfgZC1Zti;ge2Itw{p3w7dY{RsCmM|Skk<9IP)=UG3lV@*=~_a#)_l_pIp zN~NL@rBb1k=8`5Mb4ZdXN|Na8wUQ+BOq4lODhZkOTNhXN%ja}{f8oAf_j&EL&pv0Z z_1@2Vo?TB+xA|TN%VkS^L0~ zM?U1nl@!*3ny2^CVy23kXMx2Lp7cnXx0AC0!oJ6JkC)FT&Y7BLfuRfbd~Smll``1z zgAg_}4<{k50ca@g+g?J=bCF>@(Kb(l_E!BruJ7*wi&69RZF_?=sdd?@-8o%5<5lUX2#zRWfVf@6g;IB58gwa0h!KR1NJLd^Z0R4VX z-cAIX=YW1%tf`k8)HNZvGbV)W*%FJlr0bv*w;c$fN#u-=64c(BfnzSU1MmDqf##XJ zQyFv$&SFJ(Wr9UkW7}g|Fc@hON%_gZ@f`&p5)UDc#V&(!*Bxl@AvuBOIZs&#n0>`~ zi8DR#T)h*m30wlfdiFRo(iR*fq_BVGAdqxgg=IPofjf5mk2Q1;(~M^vgJSAt6Dy zRo{`fHrL1Vke z%V)ae_{jBwO%oECs#9(x`^y`|SlNL=b1{-Ap8^%DWk^Ru4QiA;j-wVxKHFZxF!f9;I&`!T>>MT7Jj>_I#lfFUA=GU+ zM2%A*;dU~_K2Qh}D-6N(N*We@O8baKE@O!AZ+sFN)8N)&9KNzLUrc!e?89v=V>gT|4@&!b4x^*gBlITc!y z!x@j>tq&C~%E%}|n2}x}*gP|Zgo7nz_JR0sTG);^V~;AbZb~l`EQn zMjaN%)8cgDMf$P-Yn1T%yTHg3CjW?vmqUMO9i0n zqds_SnLgNGef59i{k=Tkgx9jFDydAIPC+v+e&e+mrKGeKr& zH{qds$3a$jumAo&|Iem0OC}vg6Dq2)v8p?nH9`?yJTwOH^xbSc9uJpmdK1=42(H(q z;Kq7K*wi%XN4y@UOHSW`w@}OHQmj0}nasT%g)UnLKuJ*&F0Awfm9J-5h48lsci3Y` zCqvr1Rd7Ae+Jq1gb&qFqR&2xJYgeJMmUqz34<7K|j*Bw&782jJGOWPeu~crHFl*9A0`if*N@RQ!OqHFM3CF=f=$dVf_S5W+cLv=5s&e^?-Iua{?eS z@C&2qcL>WzY4bD`Lcm%z2f58Sj-L2#z~mD(sV7(2T+>8wuGan;uLtvdViy9}udHQE zq_^W`$&u*U+InO+#S{D=Peq<)3yEcC4bm=3I3R|mM}+eHDZ)!6U+XukcL?-H)Ry9Q5P@RJRPqEf%4m7ctpu| z-1$-ytr!vsc`c(DuJa}&DptlO9SngfOdy+dARZosd6b(1L$FPP0 zyV;6C63jUNXmGi$7f!WoG|llVI??xj zAsgy@-cU9(8g4&d!aQDF$mmT9WNY_F!3K9Tth6)=3QTtVh}Xl%%b8(C&C})>drzhW zo3ZzS9E8@qJPP&GXZ{1z@PUo-16`h`oz-@LIbiuzuNo zT)*Zlx^s)=j`56mO?XJcRP6Y09=uDb#}?t2 zQRd?o)VIMBCeU~sujx>H@>jeb%+tPR9^D6QX6LVI#>uynu=rdA2K02WJFbV*OJzfn#StUfd{0v&ZU!1R4pA@<-W}5?gRtA0^N{&wsT5`#hFy zr04v`7JtLV*mb>F-gH6HD05%gA<$7~I6RQ@CV$oHRM1 zIfF!vr@id*bcoli3TOtw=J|!@d0uktWJ{=ds*VJ*nMp;lWg{RvYy(#G2qjrpXrAZI zYuuKl8E}2^pFM~E8ZPH6HP2|FY`osq5e`xFeC~S{!5DfEi-gHkVRz!&Nb7mNoXgg? zMZ#Fq%`2P5~cLm23kRm!{_VbQJ3{53}2@ z$3y#t|K#2B*~B$a^K>xk#2S*5;d>sfN4p~dKOFHCS(tp}Sy1!zqUQPVf(e_Y?g3XO z<#k^lpG};(c^7V(lZ>jVd5Tl>3=U4lY1BN|f4#;OQ}f(Ye*%3Ss7Inq55Wlbk9dFI zKF*Va(M02=IO}vTlRMGDo~QHL4T}Va6V=jD%tmUSZN+YAxp)G3{4NW;jOTQl-9Oj& z_wD2CU+P1+O*3&X-}Cq_HP51ySZo#KMr^h7nJ2lyB$&-bmkO5>-}ebHS5~lja;bUB z1O~C!sd$qUI z7dGe{?aR9Sy%6SDgp;nf0Z5dZ=ib76=62tB(ljXvo@D5CkM~EszX#kV>PhOG-{76p zJd>z-W~l_R@2Poi6n=$*sd?H&_D45&M-Wl*IS@yC%l>#T|JxM*o;YXrmqsHow-Q(qBo_!=^P$4x>n^PmClEmo*F@1Usoa=PV*Sf_~EeUns~($O(^&K)o1ULWAhky;e~K*>92P_J(y?Tp+<0jvMJsltN{CD<%p}ZBzpaL z8l;3T#WwF&5Z^*~UUKqlrp7xN0)j679B&VsIMpZWkde6tFMU4&`c~Iq3te>(8K?k{ zfG%Y~4(b1^tpaSEDsdIu6; zqeI#sDZpR{E8OqUYe>`66=&8P9o2&m>;aAa|oDL&oWm;E9S6 z=e(O?X3h-Y98wl&p1Ii^h<#Ovox`n(+SeT@?d=ktVX&%)HVI-ucBc$~JDKeP{>rr+uFL-YrJC=2M`mP=?5pT9l@I45to|0zD~< z-|_gFr;Ec;TsdMIX-nu!Lfl5ey7*Ak95R($-KYzlVMED=pcx9Ve8JOR+7gR(dokyeGHfgvO01JQP)5#vH0?z{@QN2~o|E-$aZHUc zhy~1o`^i(t@y{y6^_(vf-Zc(<+r>%Xw=TqOT*BCz+8~qX-3G|dJlnR-!B#vg!V?`t zTEps)s!$u!rsjD}e?C;LJcpl}I-?Ip7N}^V#aG{;L`-`#zq297k37KZ$DBtQ z8j`@JXHMk3cc6d~49=Xg6osmFkC)GM$#LJ-3%1=!u6NxR(^8y9=j4 zFwKEHpjnFwrH31%)|jXTTyNwaereMc}DEN~6JRz4Z( zU$&vCK7AmyuVC}^JT@2OvD4s!+;GrHP#|W5WXK+4A(-iH2uiJK_@(h^*d!gnaB_XP z+KPhB^Kn-rcJ;R;X3Qfz`LG#WvE0tiw3jD23a`+`F{8+eR7I!@NMzfwipAqla8+NdFAQ8J)fU911AlFN!*!zPmoc%BWIz(kbCqS@yx=%ZXD{75l zh~@wg^&Lm#4~`=02ksyjHx+1@Gz+gEOzTGOR7E*S-?*I?g3Yt}-DuQ)dll|m6-u_; ztzl$#tbm0nOYy*s5g@NHm+jL!37vZ)jvrpq1-syzPVKg$y9bq)niC-amgAojb0EGbO#rO4_%5+8y29>V z-GR1t+TpWcKzsiP&hxzK6%2FqXEE=$iJ|=)pWK4+9MG*va@MsFIBZ!*F(aB=~B2vFg*5z-N>MDw|{kMp3DFqFxd>Ret^% zuLs0hZDU09`?8stLGxqdIg13&pYNz#p zc4Pf$&#b{WnXGpw@eoBZwt991L<|9x>sg0HLdW7J+PA)6)pz!*-5MwuvHa)t^?+iM zH-n-6;yA{lGzT|bPDd4!Fk0L&4~F#`g%&PdLMEgfLfkp~xUj(l4i^Z{^E|KU3wEk0 zO!xrW%l2tL%82d-nwryLOMNoZ{@_Z^7(78MS@_3*fGHV>tFo(*LN ze$$KCx=44!cblVOg!KYOR;!44uxA0gt2hdbH(BD^gecHF@$>9`4<9clXlnpOJ}>$oyj=CC-=SD<+YJn(|1FJIYHUM;xD zF(1c07zh_8nUXszj-cHY4lt{%3H4g&hGn$BgFQX><3D#~KGF=k9iVg}Vxg=IImB1VvEuQ-upQ`Y>%<04b0fBG5cv+b@9VeNEi? zk`HhnFD_otv;T2r|#Hl0L9?X92Iy`2~Lc zzywcP?+v%4Zeopl*U$i_8S!WwT^diQ$`YQ8`W5f*t=sQsd(gmnFd|?h`_{b`Pm@c= z<MDK?2RwXqp$SGW*K%O55-o^?i8cLvdJb zWJVt2uU7d&z0hXX{nIs^aoHP7uLh77l_!bgk0PO)s&KHD=A}Nq z%Ilb63NiY_4F#F!dRoKx>wsEr%0?&r-f#eZ=j;R{%lZ?o*0HEvSc3LMvWK@O1#JGt z$>8#OjzIHNrgSz>652hD$ryN9r$`;mn=OwB2@v>W~XR=a3#YaZ%Jf zk7asei5cU;mYQcetrh%$nrHNYxj5o(7-^yA8N)4Sux}#F99YpEkIyFVU{@Qi?~{eI z182gHLMviIBw#Z&&$QC>SZS{rd8qse&*6?EHQ|v^urK(}cz-F@V``q|n&L2eV*&OX z-N4+xbp|Wc_>zE$W5~#KhH!F1k!OS>sW+$rlc=$#4ovyo>B8OUfmaL zxHqw~9+w2iNR#0jGl={|6-Lcnhb+H&43r}Zy5sTL#NDFi*=J5Co3_@H_74T}6;cr# z9RbCm8}LW>P@;V;m+^Yqz;$a+ht)H;caQf+yuXIaNht0>gL-A-SUX2hdaXx9{jQ>B zYMzSpEL#Qb6>M~;i1*Qb4*UL91f0-H|0CYtrgM{;=Y`{8SZ{|1lvDGJT6q*D1b##f zG7WgI)I##&$tbpZB#+f}p!GZhR&~eYvxy5CE<*cZcjB+qJcm>BjNY1nWk)?l=LUY{ z?W&qZnyGnm7+|YZ=RlO)fAU)SY~tQh^K|k|Mitu~U{E~mOCOMoox>XO@c!4C8Pq&? z-Z_D`pPoY2o;nEC`~Hac_wD02Q1jF~C(c$s%;c__V9(QPbHgJ;!b$SwQA~eoo+gLg z(C3%&WOis4m{quSf4=`*-`}^7Qyb(%${J^49yQOroG0jUYAiNiO7lEXKC_&frwgWi z+vhDMw?h*k+Hpg7JU)4z6(4Cm&v`-YV;dj1@z95u98F=5cQj#xYsF0ah-hLl?FcW< zUz1pfZ2%*uUu(dBzQ26T^J-}*Ii=x(OJ3R_^I`_Oz7@iQEyKy{&jIKGJ=@+~MEj3D zi6fpz5@Dyvls~TT?*Xsx>q#CxdxNW}d3I9s9H1V=N?%<`!h63$XQ+8ft)h9JE)itl zKzE4D3+|4`C(rYUxHKxI=1FI3D1RkJj#KlLT|W$zogK-Qz%JZG&C}_HKc35Qp{+H$ z`}yNzp2>q^&~a*>Vl^XSrbru(b8JHosClaPaV5i+b>L=dp4BHcu&|#7B+vTQXT1mW z6rG_A=T6q()6_ggk9lJkYM%B+%8=r3K$>Z;L)2kfpK(z>W7;(z_PU?=d3`;YXM-1j z!8#MHHcJs|CyXXndH$(}(#@FJH!Ky^QBN^AH zX@ifD1}VKc8ANA~gpXduDCVY@VVIabXj@DXXr7Y69Oyl_087}}kYL#zs53MGHW?e^ z4~!jb^O41Y6QrPTX$0m@(1-OZKkIMyFkNzvy)Hx#5|3f|bWdXcek5#;v4EJX#jNL| zDIhXah^&kY@@cr=@-(w=6y(NaZbjp>KigqB~_qH%vJWsaUu=q@uoSEm!@XME`WZLJx#12M5`STFue8z}GzSDv1 zx}jv|#nY(QZ5Nc?F9R+-yZrn5e#ZOz2XNpHX)%L2*u4OcrT>5SSb0+PR*57e-NPUEX+WC0A*p`Z$c!BA zh!mW4VP|s@`S&dFk9dFo{BfEy)sWDxH^{bS4xCQ1B?HACV9nKMky5$@T<8_*!j_n120S&0>hl4xVJ|(~t}6=9Wh2qu zrZjlu^K;Mo&(GgK@&0~VIGo2irbN`Dnd|AJ2>Sb1VgQ^n23e_F4{H+h+h#+38s0<7mix z5Y5CWX>+$U3+`cLd%O`BPqZY$c8_tZjXCIP?qIJZjV3a)UZUyVqew!#B3NXmpqNjz z{_Bg*-_Hx5>5}8R$&*y|k6?#x{)kM!y14)VFemwe1J9_MK1kdobg9R(ZK&N#4PQt?IC*c`|Ugmw>LQ;d^i<<-7#rxW*b-wIjXjwwPI@2kjl-f9?l+NCcdqz7%F4OGf9(emu-| z3rdzPM6Pdqz;TTnN_rPWs!F$_Nbe)uREw!_cX#p6{a_C$HY(j8w3;t4t6O>4&#j!@ zcq9tMDu5C3z_bsZ8t>xnCD6N29_!6Zg-)8w_^Xx<-^9JwOQ*oB8{^r>dJ{=~(s_2j zbp(t(p^Vj7Z8$Ikp@Cl~Lfzm+xVR(%E^h4ebG_CBV&(MJ1GP3yc3jQ`QX4*q{kSa( z7ADuRPb(%s)yHbuw{tR-)TrPEi|BfC$*Z5&*8|#JSnLZz71@kw|LZtxQapQGKN{r6 z=`aK3Z=i>}=I}H=`a*^F5F8+#3OfCE{fyTGirKgZ!-FYfxc-fK*e!D_LLZ8dpSKT; zKiST(uY*XlVJ_mipWyZ~G6J1BhkvX$diZ!b^EwuQ%g(KgNXi|2$+QsF45fYGgREhF zLMp1h;!YAw?;@|%?Of5TQ{lY!8iD3%^(g@IK6SCZhZbR#D@q5+7?c+Et35Ct08rb`s4E*MzG&&a_0a44|FdM}a(KC~g zc;K*5P~EnZO*|b3TiKuSdNR*N)I9ay^ko&s?_p!^baGD=M}z1&c~)fKUMACZ2-8mc zxYtY@kFSZug45)OKd!Hb$AwcjC>lPhjN$HUDPn_GY^gjK9}P=gBbbRd4>Hv^!&nY| zew-{F@WJ=1U{+1hk9a+Nyc{{VC9vj0Je&89hl6~|kOuc7+SqChNehM1A}ddF;mjMP zL$bLXt7#B4DqNs>y3FA6{t( zkWCT81)Arsi1|SLM>6wd9^;1_%y8tlC6Kfr2WN?0Ky^8ls2|rEL>?ORx}q(hy{p+! zka;d0>kaij>Ac6iTd=f`C4PdvA+7Iqd^__dy1eTpQk!B4S~Q*zT?=pgH(n3sxyfoS z)SO<=`p;^|H$qczZ5S6aFUb*epEJmMh6a3lFAp4Ri;D7(HZW;|nn3fsd(0Cq)qiEP zj<@4=7YcB4r#OT)8k3zLk0Li&>HxGSvWUiduDg&cJS;dY&^&`$Jz&1b1Z=bW6?Pi7 z413;DgEQ1TrQI8lO?2DaXPGow@anX#&kNa@rDDR%3(JmgeFMw=S>+d0J3BU7t879Y^2qPlA!p zN5YoRmF%T*nrFN-OQ3n)xorW)FIjf5mmHMd{f3RYx=>uFE;QI;ykWK*5iz5Ap8mHO zHZ}qV_WE@evxiMw^~e!$HoF6FiBbgPgtxfZ`!2fk+7y;VD3CqFO^Ge}#w}5u!{mOM z4VH#ye$F91m}fFI&k38n@f~WOy3{;BzAj}h=;^@|;knr5P8hjM&68_V&g33RfH1$Z z?s$AQapS(X;R7OBxHxDgxE5KFwN(~T`EHk><&f3)I8TFodW$$soe&{$2_l5 z^DGR!j*cu)C#}>x&oMXgKz%L=q5Vaj)n*Wmt_riqO^3*iIR>y{Uw1q{o48VHp0W!& z+2xs*u#KAMHse&(r+fq~3fh2=yM>Y$*K?VYuMJ#FLu#H!Hg}Jg&n8Z(qyt?P$;PYf z9ifDpr^k}3Xy;f7kSP!*;$1Yi=q5eeZas&Uh+7FcX>0z7_xC2wF!nBzV8gJx71(y{2FoLNbYCBzOfAVDcY~m`5qDf?dI2+ZJ$sHqZ&y#6&!{(vk zB}=4nQ9k<#3ylDQHvZL!XYMz;UQ`p?MO*rFmG2>6o z)60aKr=KQy?Ytg}B!0c;@4-Bu9S$X?iY|EQD;pGekilYagfL@8jaN7j9j4}Kc_^Pr zejG=FyAq(6j_x1V_xJNMx{oJGfBXhFQ}c`(t&gs21+f;_R+4l&cw@h04M?FtO*PvxBV#IICV7NlfbKguyvfZx>TlHOo$s>O(cEbQ} zOyAo5yzntkv%xXwJT=c-)I8tyZo@@RZRpH1BRDGJN^S&o;G{Zgo+mW$Mj>_BSN5OZ zzaR1b9&Zpe&rvn>Y`c*PwDG(#qUI?!RT)J542Yg5_v`snrYwS)o`%k)X#W5Y~pSm zRR`^iHTaXlL~y0o+2NxO6K{=$J2S@;rMu%v^34*YI9-hii+7{-49f+YXQGENJ48bj zblw|5op}g3CmV&eUg#kgwH@e0wJwR=KNjY!Gs7vDTEWauU!ZxqzEY%Xlrz}!yejz| zy#{xLYlGTHbz-461-39FY5o&E+y3~O!Nq5`kX-2?&^*0TsG&*a<4ff>B=^{MWOXk9 zvTG3Dw$u*foMo}t3rR>Ex(ag>ra;p(r5|hP9;Qpq%R@zILHtpib=i{$SB-#<2urwP zc#u70N^8u=amaAyJu17Ngd_J^!|*8iAMtvaE;*lu_klfk6B)Qao5Wpzg9h8$LbPoe zT2rnIy{``@@A{lY4UcFKqX*(3?$KSJkn&>!9tXbQ)PA<)qv8SF zp{4|<9?6pOW$%yzDMDh)MWMi=;J4}UnJzim+B5Otr$SJYJPWET={va1D&%Uz9Mp71 z1;R8X$>Kgjv_nP=!%4S52)YfB&veOIw#OA~T(=~hYo!S{`Xbt=@fr;)v?LC;J}|lX z0`AOrMc1#?GXv$)A#Z5K@6UtJbjg|dwho^?y$D->_J;Ozqe-%y5}EqtA-*$M1D4er z5}j}NnYAI#Xm*nhEFUJ=JbfCKP=EK=Xh5|G7%i|P%)sO6sZ7C0x|S*J5B|x@#LrC>iu5DUeT6hQ+2{7} z`^RUxl`Y@nwcd6fMO>A1)d$Ipr|YGw+uMCs79yyN$H`I)Dwj~9`= z9l-`4e2-+FzhPH41`x}dLY&gO4LvD5ib=H{q(}^e@56@x=W*Ka@$xgzj=dGwAlw+X zDhz-NqtwaN)uYIuk{hUys|52Wx#OlahLHP84S6j(&)u+Iuz7C$rivtM!*TiUP?9Wj zmHB#p1?)NHhifGx;L3pz_S7Q=IUbV1S1l$%$(Td`*C_v5J##p&4|9=pQ5tU5@g*@L zdN{z)A2y1YVAuI8;oTc$6@m78g;h51eYH{RdVC1>lf2k2!#Rcxa)k9j^8EA8qKD~{WBK_ys++VQtE`_*VkWFW zrSAfv(LWNWpY($Jl2=$!^co50+TpgNlR@OrTY=_T{~-|8jB#S(-AeEQ-(ASxU=LcN zIUg3Zj7I6^!9oEPx}ttk_+*w9p3C-LaN>kYoof=!QMo;GXaKn6fIcYyLE#p4UeO8S0=YK{M!3L5~W+0*I9^{J1HI%HC z$9=z?=D)UO{fO5CX>)cgrRS3GUSzpW6`1FsMECmPu=w;KB)+`}-O4w?JG=a#|K?Qo zi%T5%Tn_s2Joj+>I65Z5kbnI!D?e`+u6;r4qE1)|F>}WtwmJ)~zcCHly$poAt$W!; z%5mU&@MpZ9%rl}j3bckzVBNpxv3K4nF_(7JJk1&jmbtf&@j5TW1PMoj(*-4*%FsN| zv}ZrAuZPElQ%`#$S$r`ztZ+EQW`0vN{J4VF2R#?h__-cpM62T2%WI+_OV1idT1P>} zi6cMa_3-g>=9l}yH%nD^?A}@|F{A=*Tk;lZq}f2*h!JSeM=xS^DLR(rfs4bx!;Fc7>A+ zDYAc1J=&q%9o@ZN* z56tn=XEtj-#nyN2@YX|1z{_$MzQ67wa;oJa(Ot7ZG{>IS^E8K!T}yt}%lzYA{D1$s z*PiBO?wQ9ss7ue>TG`{L0p8GZc$ECD3cjYlTvNEv_XG6o^d*!w6^Pa_Gv-~ zE<1PtTlmnm)qP{Kuc{o)3UPp(aZgZLeIi$K;%qn}bW)&s+HLiKxhp4O3EvjnGIcpV zXQ~E8Uv)@;cOyF1pbySg{h%PbfoFQj24p!Y0?kuP$rlv&jK`r$r?KhhVOV*s9vsxr zB+sdNHZ-V1+<7|Q$n9*~6f@et>*rbd9&R6J<)uYnbgGhd&^V8`+t}k?c?@JXDUkYk zv|gr%8k`7L1^Ea~_Wb}8(9XLg&^*oRSHgh48C=tn={Tl~gM~$%p!oa%5;oNLjw?Yj z@>gDF51Y7a`NN_A-PbszT?vky@5JZD8jxj$3A{c$mPFT>63>^Pxb32|nDuJ2!OiRB z&pD)rP25&$o=)4nafZWqP@v|?ekx^h^!4DyXD>XnK8(~*^ORg(#>75|huMK8-SPNr z;%dIO;r+r{xM1l_kUnTd&YhHiL)1K73eV$^Tr*Ov`Ux9_jw2q6!$D**JyZWrPmmrq zagLWw$vACsSih+NZ_sF9=27!huk|I5wZ@PGYZ#)nClo0kbtJk+sv&E0O1HuA*~D4( z8%>Tcy^atV zP$z4)&Jr4^dCE*nMHSRMm-%nN+g(FR@XcH%sOAQD;=(krI`(J%&A%6^)zmzL`eb8| z8ICZeU5{)Hq-Wa|BtR=)m}Jmi!7r{A@l>0<*b#Tbz&bOr`~Lm7zP}f#`>1)2s0zcH zyF6eyHP8FeN719D9}yO7z}4alNz9{B?D9t}YkM{p>L&zr$NOhf^WPuRUw^Nm<|#U@ z6Ym^EbCq-5$dL63IA!!xWWD19&ykwvS8ASNJY%;1P*<23^B=?dC*J?~VOVC_h3Cvm zMtgTSfNZQgX<3krUs3a{RKCvSQ1jf@a00b_pF*k(i(qlTZU6WB{=R)2E;UcdHR5dj z^Gt3_s~u0d#SPmm3n!5S<(RJImE^?{H`KpR0&!_w55~>T-JdU?O9^~TEpPxq$o4CSL3>=Hl$2(rrxDUpVfz4uQXS*@DJY0Z_H-!<| z18zL7-&5wH_G+-Sz(3>lu!*~|i`Gd?T8*#nmpc98vY2rk(x2{&d%<701i zVXWThA8Y6yrc2ITg<|yGtPJ1V;7JbCUed#KtsuDnK6bv39@uX0!ZFUBNVzr{^LkAO zTk{b=;`K0HauU*M4d{k+W?_>H5gzjfMHbq?v!NBpz)9OiT!;?*MY;$!NGTAskImr>&94PlB%5!^qx+XHekwnJ6+k4f@l4 zz`uElKjZ!V12`28A)UpE+zB+FP+9Z~zT}M~Fg~ zO}A0s zshws8xDesM`y9`cs+k!=XS(F% z1p4Ar^(L@<3_a^IUzxm5mm$MnenM>ydLYui4yTrmfl7xYhBNV&VUxOG^9)jIz+%VD zNuO^o@HSIRXqvT&9j!WwluI=s1-H>;!(&CbwssBbh)shr<63{;KR(kX$6(4_QvWH2 zotV*qxO-o-quc{XN7*6lDE$gGkE_6+Xg>Ol^#kF>!ol#YF!lF%`I%?Pz!SLU+Eh^9 zFaYjj$ zV4$~QX+P^N_b^>@Ty1DB(}8_BF=aN{@qHPRXM$kc z>~Nfy&$aKw;*U-1-X$mRFq?Xr3*r7D2956f>FT{J1BI;<~dd;e6>Z`uAF-lVF10 z-CY1i!hk(Y*1)~BHUF+R_?qW%`tC1smM&hLt3g6_F0uON0ie}!1UK%`hLzQOkPFT4 z_r2_n+orDs@qi&e*K0i>)@hpO8FXs`UTm*H9`;dWeXfOqzhM^k**^gmRRp2OleK8S z5II~uDH_)F`jt1@1KJIG=L7kbH@SEAH{qg!dX^g=0a@yDcx}dg)b}=nHfPU;lfjd4 z{;6d6UR(Ebygi^;z2#CEu}GE;;2gly)bi1o(Fak2;yftM&SlCggUArK{Yb;*0@rB) z7p_b^%lz~G=+Qh~>AP&VGUnd*$9RQY89GkSeZU?Yu$Zw9J#+IUDtYIT_LzO#xyb;z zk$FGj^<Se)+`|ws$(5~ z{9g5N`#6VJ27-}DBCB%$Fm}R{NQ()B5IJjfynZizJ--xJtXmAjXB}YuoMU0g^BF(l z^<IsY%&GQWMspZvV@1r%?3b?96qCstjB36ov1tHy+KjQW9 zxNv-=qk)rg$>4kaL3ZTAoreC?qT$o1ZH)bvgG|PPZEQO=?z`60@yyI9uw7C9BVG?5 zFK64^MX)X_jkl-xGG05W63v^?j`Ggi&>o;VsHNXL^7Pn!By(XecfP7Id@tWF&^(`6 zc!Ia@ch=Uh13T6qz;E1XoxBIeL{IJ*8ZyTLG)6x`tG;;QRJ-pm5Cog2+&f7US9Tk* z?z*tr$b!5(Fn}EWx)t~9orn%B*C*m33NZSWGFTbwf$w!c5@M$y&^$NY@P?>r#1xpm zz*1Q=vFnH>5OyU858iVbS!EJ*I%X#AVYGned7494G*6&;R&SaMr@vV8;@-c(Qj2Hd z&*$es;EU_ntF<1TozsexC!2#djVBai4$uCL_doXL|1Q$IIz7RvJ(GQC{~nJlU5n9F zL$Dq^nrz>H77gC72@&Vz;GzGx%Cg=zkX^J`pn1O7?Ey=4g)r+%Ycxg`;iEeTLae9> zDXl+-)-^f6kzEhbi#Pta^ zU^Hy;&1XN)F@t*Br2_Lj+h)-3sLUm{@&J8@Y;A!>Ww|iWLYWlxE<-o4I^0rJfiw*} zR>zN;XUj-NP@ZSox0MjtKZUDt#RB{5bFk`52e3{WNc6{yM2_R7Kxm>Jcv_!kRa|vI z`^J6V4`b`0Z+rYje+UqDz)tmhu-U-NEU!ir8l>ns$E%fS>;fIA+dcvkV(M6t?N-oq zrCgwSmbY5KSchWvL5dtWy#0n<&k8|$z78CD!s3<)SF)w$D5|hI$CQ_bgWvmKc}YEN z;;Mp%)1FVQc+?0Lcz*sPPG8W7HkBH~C55phUUwQjOD)1|Nws43J$HeM@c-1`{PzL= z`;<_E0@u3ui~aWN(BS7wtKvMHgPi!cc5#1vvF?+M>t5$ zGkob)bc~v3cAhYq@zssETq)w^oLkI(zqA5WhyJJjCZA1Q@3_0@XmuFAPtEfZHBZU7 zqo^|YBTDGkfO7{fBw-Inv068)*&35r2!;9G*T-iQXFpN|+|4@icrS&{_S+gGo%!Xlo|6^EuHgUtPy6`sdWHe)^1I&zZC+EGBap=lM zY&`Kg<3-KWrtt(ivO|yTDK7-u%s=A&^|Wv}HwvT4jR0|WadRej*)=nk@bwLF}- zE6Xw4sd+Y*xuFR&6G(>ddKi9aX7}gIXA?Iwz=v$For(8T^SnsSGiz-u{!Gm?XJJ0$ zO3ky1n&(`-VDi>C4jOGUyW{aO&$-k*O}RmA4K+^f% z!izD{B8$5+K}XS}`}5$li3=zRCAS8N9H8dePR(B7&bd5&j-aN`&~aJluL z`m}sDalMAeAkGRPQne%DoM;=yv)a(a7e+8c*p=*C)PcjOd4>$u#>RH45J%JHe!o-U zW1iX$%Aj6XgHKTNlsw~&Rj7Gt8!JPUuK{^(CPiY)YEatIUCiM}bD?0`p`Y=3*u;Hv zV&G}sB)s&73OLZ-hSwD(&?PO}&k_2Bi+k+5p&eq^*wzOvwk4HPX-`LSo{$vovQbfG@ea&bzdEjciGD-wzi zgj>B0aITF#yo{8^7W*W?@JkHV=%Wi|8)bj3@%h*DoEUZ(U3+;LU*G6Sa$!YfTz&?%~$b32r_N(iYO~X~mf@L$1XofP#eUT)c zM}_EmEt$DxZ;r|)cgN#1U2^8#b;RS&S&-Tdg9$hMDiUKl(8&sOB6GzX&dFcI(MogC z;>L4~*|0Q7bu9TkUOv+$Mr-=vgn1bjit<6M`Jg zG-lLBM`Gpk2C2NVhW1^>=yr=1Jl2vRl7p&I`8|U5hKWFyCHlQy9_f-JEmehuMj4YW z4gE=K5Wq0abmo@e1oAatAO!gVAOKZVl z&9q1RLJFH4C`FzJKS6Fw$C1~46+k&S0W~-#gTVElHTpl_Umod_2nkLv>= zDD4-c@nF#ktDis5={Dj z2dm9dg?DuCkMC4xG)HAO&Jtjs7}^I;`*j2ZZS(nWOIEEJsz_J+&) z=6J=%wQ$|y*V#9G5G!o97KG)G!wOR;6TRi5@GG(q-Z4d3DswW_yevd=BV=Iz!&vNa zXa&r_G5F{E8Xv@J4x#%Ch7HBfUQH${ZiLl)u?(JlOv64uXg*3_hep%iOLy;@foG(y zhK7w_e!dU!LA!HwM$v$x(Ofz58ZX@PhP_l13es-&I9~D@vgo%2^?xuA#B&XB`-?S@ z?f>iibv`Keq9Yha-&17I?mmj6*5n}V%yQH^iq4Y1SIo$L3MBW$%g~mz3*5#^F7#h^ zr~7?_pLs^C_J%g;LPpu88QU&CgWPjIpp@Cxz}dDL1(&#!q>-19heI|u!5?6jNnv+9 ze&*?TZvo(I#;p0BE4b*p6e>8k98~TsMl+w6BiE@Lu#meKENb7)>V!r^!`Po^HSqcP zIL8(S!o!71Y=6^pv0eKeFPYIJ`;_&hG0 ztuN`hnmZ@6Yh82Lx5AptkP2#+oo|X0A%}_HU{UI(6a`%!3V6x;7_iZ$eTUSH`8+P1 zFlwZt57rpwtjlFT+)FmRMCZQeeyC>J<8qm(&(*9!{c7;vX^l74MZ$$$C%fbExxJiV z>P?|t_YK8P-^SNPS>!IB5w`0mQRdsaNyV8|n>rq}7=t!LP9S z0SBDy8wf+D?Z-QUt|KjrbLdd#Ea;OJTh{esI&|$3_-TNDIL^QS)%=AA#CO@0T@Cwy z4I*9egYTY@G4K{P4{JoZ0qrQ_{xld)=pLK+_sO{^7An)&?pK` zCZ=Tgk0LaNp6PdX)P1B^WX2t}(+TPV9`|aVYI&|u_C+7x+}4I$qeAh?DHC8+jW%&w z@c<1AqVpL{2Y|uT{_JT%8wf1T?bSRLNBD#F5Ci;n;5jU5HXL93Lg!yjnM6JfszJB! zsKGOXaq#}?2{!RGos(Alvu~8o$H!T)F92F*-es4YoyRg2M%e$EAvg?HB8x&!qYbB2 z;m|N8u$mmqI%iY!Y%uB7JeNv@gN}15H~fkj?w`cL*Gy-^^A%#`=E6~Enba^?f7Ax% znANaOO}cSgzRG%h zwuA_cs$R{L(XfDRQb*ZN3u!p@@*6(zLI8eD(Slu?7pD{ zm&C_BhiH$6YhzyF2_nicxZfA-`QaW~d)FA2Ka(Yb-qXm8_Cd@LMK1G6&I!J@{n{JB zr--{k&C_q6H(o@|QUxp;0c%%bKgl~aSaWSNl?YMxeiRfw%gQ^{ye zF<3~=GeYMsGm)C7`$d1^tR_qJ6Bsi7KnU7Db`CKUtbnoZi9H6xqll9h9!CZ&uSYZd zRmpy8o?DD>;(OFQZ?76o+!gJ~1Vbg}?ssjneRl!)&)eS2D^O%#PO>O@wk#(*6y^D)d^b(5ss_=i1+tPYA`iV&iPR6nB@i&r&yDI@de0s zStq*LpZ0l*`jOlRV_BWCmsp=sF|cL9yqVu z#iz1ZYM#5OdHSn4vD`C`pp*G8!{SlIVQQYGK8dKBn&r%#R~9|eDf)c;=JUr!5%vz?k}praVO`E?4nwA8k&y2Sq)j#^UVGjL0q#Pz{fYBCmxR? z?t}Djw4a*iBoiZ;{6>`M>W_e_TSkHX%vt2M=MOwsXdPbZz6=Lk)`ftD$vx}kVV-Zt zL?b0?p3A6tejiBB(Qs%(yQq1F^>HR0^XXm*YMueQQ!x3W1i3d#{)qSYdQ+)+)?cc` z5++I@S>uhhsCllT=DFF=fRs)fN+b&C-1bG=ne)k>aI5j~&v<-_xE(*Zu-s)5HjGpT zVLG>X{=i|VDbpAr-V5Jo3MCmjyGk=Q-(swF6W}U2^)nuyBF=^Ob$(Kf$0M(40*B6P zG5t0X^5@8arm-9uHAkJ8i=08CsshaI%T6FM^H8tmY1w?H%;M|>NH_qXZM}>v5HADg}Wja!_=2Z0Y%dHt->Sdw0#i&phRHza!VZyK#iG9eL1_fhwLXhFaw* z*i_yg&WlUqEDQ3bOvnhN@i!2 z>4C@WA9(MMk93aCM%*Q50o=ff z5yUc-&iL*m_{ITIsG7udU*A9Rc%(~?&(1t7cixmN+AcyAm&ibD>uQv2!w~7bDX`j5 zl5~k&LOMSz5tJl@b6CY6@&5h;Xg6~tQENBhwz}Ftqt7SotYt%d;*aAgsq#=;BuO$> zbs%@YV`$i0At=-BF*_dVlH+#U6AQX>;PHXE;ILeeo`s@Jwk@+qZ$y<~w#X17EiC{M z6>AxlDs$v>`@nA_;*l;nX2=$o>syfH^G6V`M|G&W^d0J3GM(6J`#^G2HEww9h3N6$ zj6h;CNO6z0_%vJ{)MqmoBKmIB`SbHoBRSvT;Om zUfM9SfA8j5^iC4Fs<)!%m+tWJr7aOy^O(*BA!vHF7;N;NMxOiZK~X~5SnymRnt8Bi zy*$z-=dGg`SO3_{r$9X zI8yS{iN~}(+?*B}_!Jq3HG~66^gKF)^6gNNoKl4??(4z$?QhXt-F_hI(z|)0O~Lq~ zt0^RW8Vw)&DUvHiBS_%bPPC~Hor`&P6K0a+z}z%};i&fIHrVuTp5dmqafquqG52V} z@sll~ou%hrkCP(DRy{>YXQWAms{$B!#3RwVWVmzn#qagVth#!@%Fi zi(PMFfnImW;iJrCFsJjHdoxex5rLQU#W*V2ezd8>f$TOF|Saz=NT zWZ}1q6d=Xr=S(C%>5^lUO_0pZLR@vwg^ZS!gOA43p!t~&8*zOi^jX-SJk;t7s&!lO zLUU`#nJM3WfBB?K&Th+FXtVuZye86_*lUKP#4o|{ZiYV=e&Y@;ZOv?5XFCcraKi-+ zQ()?Y#$L@6GeHnBB!Ln0W%0!P-AK>00jY>NLrJ_7@(l7LQ{S^lZ(0^NN5~jBM$dXR z&nYYY!Ro<$#xdds{yKU*9um6(27GeERWmOj4eYhPLgcYHtmeBa=MSZB8?17|@U zokMR#tiDO$=K>M%c}gWa`4txuCukxy+QVk_GzvSU#KHH2zxJ*1LA$O|UXb3r&T!9| zcC0h`J3BpeC5%t<#Wj1Lqbkuj77{cSN}B!o)3y?e+Y&*>xJ0IlDYV@ zYBsvM?H+O*>IlKM?M&XD`K0LcO{A7z$hD6{@VK(2`+b9-d4|v)xa(ranDuclar~wd zbZ18gJv-Y9ygzJ4CD!hw>vT2xP@K+{?q>x34^?%?<7b{{Hv2);^tENFqZ_fh*eH~6 zVksow*o4me*P`6h*|=`PJP0^(h&5A-gcl)$x}Rr0A0Ov})dF}|Zdmr^ z{|E_YYGE#uBA~#^Jc@+k4kerz5DR`njotD1JT9Cqf^=^C$Nt>-pp&eTREVKd=4xnK zBZ5)~pJHCvi(s@j0&dcC2mQ`R!sBxXyW{b>y`0vUzVPgU5VLB{L#(TfkzLVy)IQh> zh74GO#((x8K?ygIUHDe+SPNq~9b4I}dFoGggC%SFVwCd{E34(5{Qcey^x^6SRI!fE zZ!6Cz`~Jfmx_&73YMwXUJYe!+=Q8KT9XLPC9bY%{1R<#geEG;-6t40fxt*K}vNRrt zV*#)KKOP^ni)wQNv3GQCdvzy{6-&b|>-6F2Oc_#lxduu5O@b3@bU)YEkEQu3Ho)1R z(W`k%)w;sDef_auP6yt*DGxWui^9%*resBHF{(T~3-)*1MeUJ8xavEdA!)_?Ud=Od zwJUgSWbl%VHoPxnB{r^52FV#ZWNF+(RJPp!jMMvrq?;t0^TGzMkHWp0=UzpB&<_G! z=YJM|SUU*I*XV##{v;xCsRsERQ-ium2u=6ZIw%v5kBKE0Z!v0gZg7hc2lHlB*5-h5>* zPn-z?Wnv^tR+66aGYp<&+rX7gH`qa`+Q7+??$tc4lI0{NDUgEDZ6JWu?uei(q0h&$scBVg&nZ>V_=Ip~ecsCg<-^XxO^6eDV=2bwQEur)Q$ zdDJ``mhWeBUE|=|nteU-cocE>KDS|$t~6}FYz{P2^E_2K7?P=Z*6ypp7xtKuVJe?- z%raFnFd!5nwp#od@2}T#xocC&4{Dx8)I8e^?lR-3dDc+#G*p!(ifbA2fSPA);T)nl zr2=ldCiEB#k0NdjHP6Hq^(d2?=lG-nkZW=i8yIrQuF&CRu7W+u;wmwj={jWDt?3lA33ccN(7U7(yHy=-&3yE!-8))=ud9I=6`EE@Cs-xzqC3qJ<7ojtZ?vG{l9$sc2Opk$D*V#SscocE-#tOm( z^A6nlPoHO&3sFmo$EnmjN6UXIn?%j?IyKMEJTF#N+zGtW|7BP_ia3WEKk!Z8M5MWA zCTLUh-0PNzrNf)Bs98NDOU)DAD?w#H^hsRlQP?!@Uo)HjiTBsj!r?ej^NcqUV*}e# zxT_A>mKjp>9K3QBxnU>G$W!xFEp$P5`mG`Ff;I!Q!oKJJ{uA%-kB{R*%~QN=4mMj@ zgZu4&g5pzS@RNVcGdzb8qUO1Sny2ITWyEYzEQn9p*b|S3dA{g)jH@ODvn(~wt<*fd zS0u6Lsd=i4=QEbnJhPZnWnKFxkr{%iFx$ks=YH@g;-aW|J{5Mv+uN*>^&vWHtfdeB zLCy2wsKsbAHP4IGJdbt7kwM4e;N4lZKd$fZ1rMj@`S9jX^PD8BkE9HPS+$#CWcRRF zD3h9J2Q|->4Xep^jw6(K`S--*VV52)zDI^V>e_3|*!t7D^)4K>e7YMzQBZ8*iT4Sk{Jd5Ggo=K8$DPpNr6P1nY) z4$AQK%CGY`|3Rnjcz>_Am73>*no8_V%~OcZ)B|dsSE+gC%{L(1rVb@rsCmB5-NLMU z=?Q~x9{72Ee2O?#J1(5hR>O9|6F}qBc(UP@INEy22&|mEu-wB?Qf}U-wCVd5Mm{Y8 zPG|k<8|72P?Y^c8c`M@Z63r>lZhj7DHmXC^#&M8)QjWA|OeA$iMabjPW3G+0Gf3v_ z>(xBvmhUYyFi?SU0N@p|jOb2YhFNn{cntr|qOsEvg(;fj#yP0;#QrzvJ;pmz*ZIV_2=AAdgAd&mmHzPRycow1-a@zf~=6Zh8pO+>~FiK z6AgNvr}(Q&IPj1UYVkYGL`!Ud;|6)Z*UKYaavmyO!RnWmU_A>jkRLFXcpXz96++K( z%gBi!Qer?5ddaN2FbCZW)Pc6bo|#SE@&5jEz>!)cL3>zRQQ9kaSasKy$f75BwJOHThhAsBACjX5&Gk$4S%jhII^aDW2ff z$XU~V&!GY6gheuFI@kUu-rr9PeHC0VorFei z%E7Aqc!o1}D!2Gm%I|nQ(j~`P;uaph-<;rB+UL2N_8H7fWQUv|LlW0MMc4eKi9wD6 zj2;q;ZZF$F_oP4nyx>JrW`iBf z8!QUSuSbGb|K82>HX?N9gc02TDhx)ps^q-iIHKxt1#M6q4`J(E@bdW#(0Q4t+_jw> ze6iwrwa(`rw1t#nAKHCpxoLf-{i8A|<@RO%vL~ zH~-ft|HlpfGX4nK@*)xIt@I-T_6FFW_H;-U<>8L3Ksc|v5qYkNN9C6zu+v5zFuz~@ z-+2Gy`{8)!87iz9hX>YskX!MRWX4)`Xvw;ZWjZFnNON6yIMD^Q(HZ9{VTusk+R`15 zPrBrcl{<^18&BZQx${V>o-C+Hn?ZWT2zIftIt;wppX@OZfaHJ-EdA07=H~r8Z<$ZJ zgd%x6~6d`cvv*E zpyC>iR#d>P^(#O$&jD`^JBM;QU^$NhX`X#V`Q4}=e5oqDeXF4W}CDHxNC zP8Zxn=XjeLD&Z|U`f%&kI#gCF2Tsm=@g9|Ec$V<%eTW}oZC8f2U|C0s z=qw$9<|Vk3J;U12jX9azwNH$|Jm_2Z`vyPrOfmPO`vLYcpT54r+rrDxs83&zjfo}5 z985#0x^5(@?F!O}isgoB8N=+$jotD1nP<^!9~ioED_8f+Q!M>zI5Ln}49oluq8rZ} zklTeq+)ri>T(3LH7XAo>;JTlE)qFla&UL%_phA1ZMGPL`3kHMG;cJWFtJ4v*diV__ zC0c}64w(xsoKiNkAPnTa>wbOTcpinoiH?hehg@B@U||&--{ipTr2UshnfsYmnQ|sX zH;;8_U;WQ->exdt4#MwOcmF-*_qe#!(EmRZX{h3Mf#v9Va20C8A#ko9y1cHE$*kAI zLo>plU*~ij^g0qaFEYC0@wvSm{TbeHJtl^cn)?#3y1}A_A3vid#+I-xay|NX!;SQ7 zy@nE>#d6cP7{iH_JH49cl83Iq3GRU|fzSo#rdrt<|x(s+Gnyia?6 z#p8o^-#@znez=ph59`E&;%T_FN)M7I$&##$8YCyL0T=woz|&_2W#+oJpmpl#&+Gdi zx#<6|avPlwskdq%K2iG->oy$2_uNIG!Eq|7;*_8nVssvlXCul|PBZkH<^uC2`l9Zc zP5&bo{eL`-ldiDpvk}&pZ^a=IA^3}uGH^%flG|$^BKy|{AT8G)YR{{&B-$2qhFt5_ zJZ~iX!|U_Y@Tn#i4`ln{xo@-~?}G+?x2i#RWG9099cp>#DqA<%9Hzd=?{#l`dfh?@ zO73DCZk6HwPbT1fdWJB=c>=Mb=enb#s$el$iSGH?%f5R$6~37!^=h6mA#^U@Qd?vwYV!Q|9!2~^@e3{tn*K*qdBtZNlD&--^udfVH6nZ6Sg44#K22k*nL z{VLg#a5|SN$dH^a!AO~&*)>&lG;E&nlx?uLf_Yqk&p}Ug-9r4BkXHNn}YM%WiPB8)0 zJOiG3;Bz-a38LnirL>R9pmV)%wD0MO$D@cFLCtgc_cY8>^YlAzNmid943*S8&+Vl4oncl=H)I5_`4kv-~_N0?hVh)w- zkSi4hptK^pCmxR??w`HwDeF7fE^40Fsd+kEt*3q2V_=?V8ZL4OAyRj!c}8#I`ZcbH zIK8-@_3|jKEP6UoFdYZknv=4rIz8rnh4vn@-2Bz<-vb=A3L95#kkIJ*)urrbCHXVI>mx zNMi!(Jz=O(_Rs6%Q^cK=HiQiQ30UK^3d98|kmrvi(7QzdcSd^R-S0vPXXDPI2-+|3 zsWJi9DgNpkuuxy?>1ZS#|wQYJ3@lFa(tL#S{N7=Fm6Kx^IsieDR;Aft* zJ7~?3nSt#TW|D;k+mWA7Fu2((;GkT4sP8)gA6qU8GQMlE{V^?QIWN@x4$UWBax&~n zP}j{IT-WSQK7E#iWFIRK%`s=qt#u*hCWl-O`Gl@)--4IjH;2$yKMj?id3J^l1l7h2 zrhke984%fuie6YlVR0#Hpna#IBPB?qR4ua0J%^KZ#2{Z<@3+D5NS7Q7!#wA4u`yTqqo< zPwe(8lh_z5^hQe&wp9)xWj+E>h(9@D)hIg>X)(vYLS*UKYaa^{`Bil2;FhHV=>;TfHoEqO$q ztZaILuTED3ix@+Kc0OlvpU*)DopfQRSnuZ9U@C#$-hPEbJw2dyogMi);W56nfJGYz zi-EwiX=Hx<9yEBH9(FWcj=Bc*td~c+${lF~c^gZSMuip( zc`||=Nv%PtQRlJZ15wy-sr!4qJklkdD}NquQ#2;2rw0%PTO(+T$YhSaRwC+B1L3rZ z5-}S#5Tu+Iph5?F{_E4K|HS+IX`$qKc{=g&-o;HGB?D!3aoGRFLPCtvapC77@c244 zXbpXs_5BT+BQ^j&oAz#=ogbFqn#rcHQ)CQmy`o5L4v!!U6gvQt)t{@i1%4 zY9{(J|Tu_dnLV zoX(Ew+ANKuj(d>DTSt<6p_9N-{Vw)PRDq-=I#9rMN9mgT>AV$1Xz26gm%()ZCN*<$ zVBjCs2Zytxyb?_)%fq!w^GHFX3miyLcKN6Bi9nY<|5T@G(!n8}#hJ zK9`s#+L!q*V-`-9p*Ai(i;cfw09i@Kh)h<7L)&-Z%WAPOzdrWo`wJh$y1bdbwM{8{$CK@8M=dGqu0p^n}?awhj~eL;2gi@5iu!TENY(ThN&Y^T@Z{dL$`o!bKm9p*p9v`~8K_?d2Ty_6BzmGiLR(m)Oy7 z2nufx026793K|}u+{R0|@r@1mRTZ*M^dy9TlWW_)< zbxQ!0E1yMucQzsoiyAEU%@(TX6Sn{8m9X^HhF{+|-sXAg+iKWa5Xsgpxz7q0?_^%c zt_Hz1eNj|K4P*IM7;8C4z|yvXxIHEg+_Z|jzi)gV7mn1XNO*d0ZrQ+Dw^?_ck<6@- ztDq7VpozXUjLOS}ctqVwxF)8FEuYX?Mwb)1FKa&HWdri?ItLNhNqudY zZ3!~{It%7F(EZ-8eXz^&?;x7cyLtM0iV^d7_fTfMHr$(NL3ags)_DJw}38K*{gZh7NNNo%gt;pDR{U@_-!Ud)VS^0~#;;3Dr!U3PRC8 z<9+%6czn!rOp!ZuVhTR2p$FxQ<;aW))o9`o4RA0Y1A&F{W$!cTJ3hC( zSMwYZ<^~Ha2ho!(-{ZW=NAdIP!k}qCjqJTqjKoZ4gBN=Tao}O`up=%YAU3F1^ISd9 z4Z>DU!%tdUaMa|*xL=VH-BYMbu4Fz$X9NxDSq=SQ-e)6r{~cS1h%Bo(?^GZx0h$abPo%}QS zyR{4+C#MhU+G<3+;3OIzHW8#xE5Mqm`K+?K8PtUw?A1IkmW0FI+*ZSnqYd!Og^yVy z)*hY<(|7S)ag@+93^?{SkeT|L^?Ria(I49ldo$0QO@WZS$`#9;*@Hu`7PD6U)F7iD zm%QvKLpQXv>3hd$I=8xw4J)yNi0j{bHO~U|=^(a#FI&_p12w=QVOITMxzc1<-OdLceWd6)a|HR`_#GUPI!+XD_VX=@okVwt5n3`uhHP0_uHMo4Y8977Ev)DqF zn5l#UH^cDHcz?aMl~eQVqUOnD9Ky;*cbTr67x5Zuo_8n6k{j_15k44#A~wt+j>9V; zdH0$ggW*xcwNdjl46R2B3sgxyHP1)XJa16*l&0n>O3jl+^gPcX9g=jc0KVj>!^BhRcvsT!TwBH-cwx!jwYm{Q3(&Jyo#-oUPNzGHjvIECa^ZdHUg_tJ9 z;}B||8J{}J3aNSOQ1kR3=D~*7JHoqdYkIDaM-kUW&2xxfB6>{CGmM(&W|u^qN6mAY zeLeGRXAt>7&2#N7eX@P$Q5YlpuRhs-;{Elsa5$YuqDYal7(4oH3b!E1wk(vI=N)RE zp$nv$bJRSg&$uALxADZuW-|nSvhKOR|HS+I{alvdHHBSXnQM`=BYF92VP3ebI8c$*oO82iTM5Nd|Dpn z*-p*Vmzt+7HO~-go{`i%GpKoPr{<~T`3@UV^K@&|!fQt=LsH%Gp3kp4-rwt;PR&#Q zawUFA%`>Ck8*5YZw5H~nO3hP?nx{WCPoFPanXE&eP;_he&v<;yGyjM_C>bc?wo)~S zlT#vlwo0O%cWJMWpa<3vSVhXKQVi-;&of<56JYND_s#Pu;)WfZ0G0AF*!`$BgxWkyalf z2wzY(+J@(zHV4hoBHi)$q)X1#Hv{2tdOD*#!-1#?y+whpR#5edMZsgIK!BzssnxGR zZz3yk)=e=8-k|wA9*=a%F%CF^kCYper!j-bYHc}Kq!NJw-W!rd0h8gwo6+=q?kcou zss&P0+W=!@e%2s8>G$tHfX9|f5*rsgZeEf#$O(MKE=pG9)iXNNVuBo4FC0TsB|4DS zhofkVf(Tsq-T&Kkc%)0tiGvIfN}8<5l_N3dTX1Nc3ar;;$o%rh%;9+s$mEqS zyjAF#Q{Nr$?>`5e4}PQ2;DIku^H&eBI&DveYdye+YD&@E@uDEVemc1=yc;R!8{#a3 zaC9QFXT3bqCFfGfK+s;9&Q!!Xkb&3Q(ZY>ZpnzFq3sWHe+ejjKv>Kh9egVrR4T6@M zpXa;%bANfHOO8Z!6<)OqNbw0F(tg?qM2xpE{uxSSo%aA}m6||iMG1kDQ4q=;mJH?e zIsE^<&pgs4=j8k8B;N5XcirQ05ceYiqcilpl1&--McrVCr9HIiv|oEr`5QF*et$4p zp8orJ;gK#mp$-e_?{6j${bLMdyDAfIkvKW0_JN*RuLEi#={Qn!JnT>RW3uwLaU~Rb zH&4mXMyzXQMl4sgVbo{|DNSkY5~VR@@~8*s82#Pb^_n~+UyDQSbZ)zI)`Q>c<&iEq zc4=Nj!#bKhySf#bH?^}iaX~~v`V_ui^9)^#EyJ7*cJQH21Ptp(!u^26-|Ov;_dlK& zGwV`3i0*BlM4ylQl@p1P}2w!H)k?*KBwn-j#C3yIwwrg${XoL@5j+|m7ogW`eiV@%~L||5*o1X z7_RVjA&`u%md#R%aZw?M1#|8<)-9Edq!BQ*GIX0^M{_;te90`Ma=#bQQ z9M3ott+Q*8bMg}4^qGMJhq%IpAYm-+)rpd|m*SU|Q=s-@Rj=l`!e$Yq1|DaE>kDvF z*jn_oS`gZ&+d=G)7f_gJgk)Z+L@~D;xX|2MUQ2_&#^erOXgVC$q%GPCYrXNiG`Gk88&-n)r}246$oa34=jvj+9=rEKe% z5O6G<{OkM1^Ks#{-d#=mi1)LT*Ii+aL~9toidA3}ZjLr-A7-RQ>~U-1Drmj+n0>xF z4y^X??*6{R&*au9y-`5kTuIEqCs3WFo{wJQ=O=%nUsIDGsLdUDPa zKeGG|)5iAcwa@d(o55tT`~!5pWeQk3n-lqAVq~{l3QoO{h(7vglLAd8SQsk{_%NMu zB;-j(d+PUUo?~|SfPJ{k59!JI!zW#qaKIR!E z;R&-O@>rFQH`sgVdK_D?3++Pkr10fMwC}zKgkKl~@`Fy69VxSgfWZ1*&2#ZAclh#g z7}hdP6tv91=R#lL zD{trHxZ6rl9i~SvvKs9wQ-?hcW8qxc0~V!NzzdnXy_)C!$Uv|-ER451oxvU*vRKDa7oPT2 zCzA6{q8+A_VC0MOP>J$bL1sEszGQnf&rA2ip{VwOVay<1tlV;+UF~WQmyZr16QqYB zp^)JqCTas0hQDE>g>`_Vx{BMId1`6~!NxJ3`2505T-0!sjXt6ZZ5y~`^QbaZX`&4- zYexgx*uhG5S;08j0Y7sbpCazSATzLfm(A{Z+D@gcX} zQj&S#=?qU7Wc|z`e2TcUbZ>j(A#XgNn&-Qr8YE!&Ddq|_&j-&u@P2BZ$<#a#%|60x zFpPs)+5eiu&7+8uqJ5sOw9iw6n&(Hlx4l0#&jFWWuwM4hKF`9JZhc`==<(W+UGfznrGUV*~D&W1(}bF*F*VN)y0`r!HBUm#Gm4sL7&XrWjoM`6(E_M?oYfPLM-gX3&C_OG z2fKipXFN5}lo{($GBrvH+37|-@pu$*A=Eq-XrE^`HBU*}=Xsp=d2XiW znJM4c^b9NWyjVz!ugZGeplvG#Q9M3)TMo%LRm9mCpFIju8H_QHBa#w^-Lu- zPf_~)s5I3lySE>OH-`V}ljTvwJ)q_}Pe+VBN&7rEZ?i2+rsml{l=gYflV(m(^VFi| zdHP^H;abr?&v>hz`^%$F?nhk350=Gi14%pRfUIfk0&hTtSNm73?RQTa?0HP1R~o{wLslc2{bP!^`& zb3b?#ajn!mj|_0cxzs#8XrHGW?epxQ=IJ1{7)_;po|u|vR8|~uULOb1bxMC+-`_>e zENY$-H{N0wYMy4)JRi}$?JBpzNIacuyOx^g7HXcuu0@dPtOLX@@$QMoqlh~=emIJw z=IKn$Q-+#n1Kr!MOwIG3KF`gx&vPp^Pme20aZR%>l=ofTvtAxW+&<}Oq)5%vk9t}p z-P?Ye?rkrl=GjcmGllkfCQ&o*Y{}D4M5;_0`m2s-H438!LrIY~(`U zwO;trJ-WAj(-#BzrIk#_?F8t&{L4`J6mjibWtguYgPS|(IocoS{I)|HFkV~=o_&=k zwUg9Hp4L^&D9QWZfquoh+l_cE*X9YV%#aOd5^!!bqK4jMWFKEY( z46HN3913j)bib4HNtYaruLI#+<|ZcG!GWBe^#Ot1449^cQRU~!a3yaPnOjNEXUwX^ z?Ry4;a_z+5@pz<5j?AvpIIYEqC}a;JJ9o;#+S4nM##ckK!ic_0`bm*gw<`2%rZsBq zvjGD7pZO!+-}$4>UXqNxlgN$SL(S8!3%?#VgDA_L#_u_FMopCz8GZO8`WA5%rIZUp z#hrb>O@~LiE(Mp^cl=gx2t6t3gb#suo zV2=UvNSB<7%`Q0iy%}+`9Z5Q3ZX>5xZ&8Mp8L{g01bzP-IA*X9x`ECy2dH_je!uVc zdb{KOyR|jf&=XR}%8+udnBvNVV`TTgK zOHN(oK)ADf6LUJ%fjk@g0d0$=XCet=BrT;0ilL*(GRe&6;fm-1gX|bklvH^kn_IhECe3ul9PFR zI;oR*!!_<42VN!Xan|SnlG&Vr8%GQVmE(2zyzoeuoXDF# z_=K)0*dQs8N|`_=gbgR;{(E$ve&4qHZpT+!Mfs-eGc zdnn*8!9^f(?+8}87X()oQ8|$3Et>|%6`01P#Ns5*Z%wO^Z)GgywIl>tz?hl&=D>~>9!2a z-e(2@eN4)HVpPGYYXBLvm(I@GyazuXU4o^AWW}XFM0Z^bIfV7@hV7x;eKX46)`!^1;^#Ubm z%%#C7xoROqyfnwrcVnOx|2pf3PoL+bL}iekew*og6_L*41MuKut3gJjge#EG!07`= znf|nIQ(9~pcJC7h_USG^--q}h*76h;*gWX~<6gy(6$`w%bEG0+ZgB^*?LPgDba^p* zQ*Z(l85gthPorV4PJ6HBS#jA94DD|+%KNTkdxtT2h*SjFs2*cyw^pNvHex7ZmOp5n zHNxq;Vn8%w{m<*;gJRbtm%_U9F3fqw{dn@0)#&uNe$X_{9{TQcK#_*dME~0d#1U=Q z+jx5__@9tMy_x4Hjz1{hJ;UU!uE%?q?L~>V`#=<(VWc9Lg7Sl0h{ByFbgPUB z7)1(q$Kz+70n!U#tDzTjG4C4oL&MS2KHhM=?ICJ&xq#xnv|zR4Rv-|b!-kYCg{