From fb49dce2d73a0fcdc52ef5075adecce98c0e7458 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 27 Aug 2023 12:51:00 -0500 Subject: [PATCH 1/5] Accessory - Add conditional blocking of switchable attachments --- addons/accessory/CfgFunctions.hpp | 1 + addons/accessory/XEH_preInit.sqf | 2 ++ .../accessory/fnc_addAttachementCondition.sqf | 29 +++++++++++++++ addons/accessory/fnc_switchAttachment.sqf | 35 ++++++++++++------- .../accessory/fnc_switchableAttachments.sqf | 8 ++++- 5 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 addons/accessory/fnc_addAttachementCondition.sqf diff --git a/addons/accessory/CfgFunctions.hpp b/addons/accessory/CfgFunctions.hpp index 0554973a96..b6747a329c 100644 --- a/addons/accessory/CfgFunctions.hpp +++ b/addons/accessory/CfgFunctions.hpp @@ -1,6 +1,7 @@ class CfgFunctions { class CBA { class Inventory { + PATHTO_FNC(addAttachementCondition); PATHTO_FNC(switchableAttachments); }; }; diff --git a/addons/accessory/XEH_preInit.sqf b/addons/accessory/XEH_preInit.sqf index 9f6bf1f758..07b57c31f4 100644 --- a/addons/accessory/XEH_preInit.sqf +++ b/addons/accessory/XEH_preInit.sqf @@ -4,6 +4,8 @@ if (!hasInterface) exitWith {}; #include "XEH_PREP.sqf" +GVAR(usageHash) = createHashMap; + [ELSTRING(common,WeaponsCategory), "MRT_SwitchItemNextClass_R", [LSTRING(railNext), LSTRING(railNext_tooltip)], { [1, "next"] call FUNC(switchAttachment) // return }, {}, [DIK_L, [false, true, false]]] call CBA_fnc_addKeybind; diff --git a/addons/accessory/fnc_addAttachementCondition.sqf b/addons/accessory/fnc_addAttachementCondition.sqf new file mode 100644 index 0000000000..77da5d11ac --- /dev/null +++ b/addons/accessory/fnc_addAttachementCondition.sqf @@ -0,0 +1,29 @@ +#include "script_component.hpp" +/* ---------------------------------------------------------------------------- +Function: CBA_fnc_addAttachementCondition + +Description: + Adds condition to be able to swtich to a attachement. + +Parameters: + 0: _item - Attachment classname + 1: _condition - Code (return false if not allowed) + +Returns: + None + +Examples: + (begin example) + ["ACE_acc_pointer_red", { false }] call CBA_fnc_addAttachementCondition + (end) + +Author: + PabstMirror +---------------------------------------------------------------------------- */ + +params [["_item", "", [""]], ["_condition", {true}, [{}]]]; + +if (!isClass (configfile >> "CfgWeapons" >> _item)) exitWith { ERROR_1("Item not found [%1]", _item); }; + +private _useageArray = GVAR(usageHash) getOrDefault [_item, [], true]; +_useageArray pushBack _condition; diff --git a/addons/accessory/fnc_switchAttachment.sqf b/addons/accessory/fnc_switchAttachment.sqf index bb82e15dc8..17c7a1dc8c 100644 --- a/addons/accessory/fnc_switchAttachment.sqf +++ b/addons/accessory/fnc_switchAttachment.sqf @@ -41,17 +41,28 @@ private _currWeaponType = call { }; if (_currWeaponType < 0) exitWith {false}; -#define __cfgWeapons configfile >> "CfgWeapons" -#define __currItem __cfgWeapons >> _currItem +private _cfgWeapons = configfile >> "CfgWeapons"; -// Get the next/previous item from the attachement's config, but ignore inherited values -private _configs = if (_switchTo == "next") then { - configProperties [__currItem, "configName _x == 'MRT_SwitchItemNextClass'", false]; -} else { - configProperties [__currItem, "configName _x == 'MRT_SwitchItemPrevClass'", false]; -}; -if (_configs isNotEqualTo []) then { - _switchItem = getText (_configs select 0); +private _testItem = _currItem; +while {_testItem != ""} do { + // Get the next/previous item from the attachement's config, but ignore inherited values + private _configs = if (_switchTo == "next") then { + configProperties [_cfgWeapons >> _testItem, "configName _x == 'MRT_SwitchItemNextClass'", false]; + } else { + configProperties [_cfgWeapons >> _testItem, "configName _x == 'MRT_SwitchItemPrevClass'", false]; + }; + + if (_configs isEqualTo []) then { + _testItem = ""; + } else { + _testItem = getText (_configs select 0); + if (_testItem == "") exitWith {}; + if (_testItem == _currItem) exitWith { _testItem = ""; }; // same as start (full loop) + private _useageArray = GVAR(usageHash) getOrDefault [_testItem, []]; + if ((_useageArray findIf {([_testItem] call _x) isEqualTo false}) == -1) then { // none returned false + _switchItem = _testItem; + }; + }; }; TRACE_3("",_currItem,_switchTo,_switchItem); @@ -82,8 +93,8 @@ if (!isNil "_switchItem") then { }, [_unit, _currItem, _switchItem, _currWeaponType]] call CBA_fnc_execNextFrame; }; }; - private _switchItemHintText = getText (__cfgWeapons >> _switchItem >> "MRT_SwitchItemHintText"); - private _switchItemHintImage = getText (__cfgWeapons >> _switchItem >> "picture"); + private _switchItemHintText = getText (_cfgWeapons >> _switchItem >> "MRT_SwitchItemHintText"); + private _switchItemHintImage = getText (_cfgWeapons >> _switchItem >> "picture"); if (_switchItemHintText isNotEqualTo "") then { [[_switchItemHintImage, 2.0], [_switchItemHintText], true] call CBA_fnc_notify; }; diff --git a/addons/accessory/fnc_switchableAttachments.sqf b/addons/accessory/fnc_switchableAttachments.sqf index 1f118ad871..93b74d1933 100644 --- a/addons/accessory/fnc_switchableAttachments.sqf +++ b/addons/accessory/fnc_switchableAttachments.sqf @@ -39,4 +39,10 @@ while { } do {}; _forward = _forward + _backward; -_forward arrayIntersect _forward // return +_forward = _forward arrayIntersect _forward; +_forward select { + private _item = _x; + private _useageArray = GVAR(usageHash) getOrDefault [_x, []]; + (_useageArray findIf {([_item] call _x) isEqualTo false}) == -1 // none returned false +} // return + From 08bffe980af264b026e8ea845a90287ef91ef785 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 27 Aug 2023 17:31:36 -0500 Subject: [PATCH 2/5] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/accessory/fnc_addAttachementCondition.sqf | 6 +++--- addons/accessory/fnc_switchAttachment.sqf | 5 +++-- addons/accessory/fnc_switchableAttachments.sqf | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/addons/accessory/fnc_addAttachementCondition.sqf b/addons/accessory/fnc_addAttachementCondition.sqf index 77da5d11ac..3f99e6696c 100644 --- a/addons/accessory/fnc_addAttachementCondition.sqf +++ b/addons/accessory/fnc_addAttachementCondition.sqf @@ -3,7 +3,7 @@ Function: CBA_fnc_addAttachementCondition Description: - Adds condition to be able to swtich to a attachement. + Adds condition to be able to switch to an attachment. Parameters: 0: _item - Attachment classname @@ -25,5 +25,5 @@ params [["_item", "", [""]], ["_condition", {true}, [{}]]]; if (!isClass (configfile >> "CfgWeapons" >> _item)) exitWith { ERROR_1("Item not found [%1]", _item); }; -private _useageArray = GVAR(usageHash) getOrDefault [_item, [], true]; -_useageArray pushBack _condition; +private _usageArray = GVAR(usageHash) getOrDefault [_item, [], true]; +_usageArray pushBack _condition; diff --git a/addons/accessory/fnc_switchAttachment.sqf b/addons/accessory/fnc_switchAttachment.sqf index 17c7a1dc8c..bd6c423092 100644 --- a/addons/accessory/fnc_switchAttachment.sqf +++ b/addons/accessory/fnc_switchAttachment.sqf @@ -93,8 +93,9 @@ if (!isNil "_switchItem") then { }, [_unit, _currItem, _switchItem, _currWeaponType]] call CBA_fnc_execNextFrame; }; }; - private _switchItemHintText = getText (_cfgWeapons >> _switchItem >> "MRT_SwitchItemHintText"); - private _switchItemHintImage = getText (_cfgWeapons >> _switchItem >> "picture"); + private _configSwitchItem = _cfgWeapons >> _switchItem; + private _switchItemHintText = getText (_configSwitchItem >> "MRT_SwitchItemHintText"); + private _switchItemHintImage = getText (_configSwitchItem >> "picture"); if (_switchItemHintText isNotEqualTo "") then { [[_switchItemHintImage, 2.0], [_switchItemHintText], true] call CBA_fnc_notify; }; diff --git a/addons/accessory/fnc_switchableAttachments.sqf b/addons/accessory/fnc_switchableAttachments.sqf index 93b74d1933..9078721e66 100644 --- a/addons/accessory/fnc_switchableAttachments.sqf +++ b/addons/accessory/fnc_switchableAttachments.sqf @@ -42,7 +42,7 @@ _forward = _forward + _backward; _forward = _forward arrayIntersect _forward; _forward select { private _item = _x; - private _useageArray = GVAR(usageHash) getOrDefault [_x, []]; - (_useageArray findIf {([_item] call _x) isEqualTo false}) == -1 // none returned false + private _usageArray = GVAR(usageHash) getOrDefault [_x, []]; + (_usageArray findIf {([_item] call _x) isEqualTo false}) == -1 // none returned false } // return From c20c40e6b1a47a6ce39137f3259f4fa648788902 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 29 Aug 2023 14:08:17 -0500 Subject: [PATCH 3/5] Update fnc_switchAttachment.sqf --- addons/accessory/fnc_switchAttachment.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/accessory/fnc_switchAttachment.sqf b/addons/accessory/fnc_switchAttachment.sqf index bd6c423092..a6053f4662 100644 --- a/addons/accessory/fnc_switchAttachment.sqf +++ b/addons/accessory/fnc_switchAttachment.sqf @@ -58,8 +58,8 @@ while {_testItem != ""} do { _testItem = getText (_configs select 0); if (_testItem == "") exitWith {}; if (_testItem == _currItem) exitWith { _testItem = ""; }; // same as start (full loop) - private _useageArray = GVAR(usageHash) getOrDefault [_testItem, []]; - if ((_useageArray findIf {([_testItem] call _x) isEqualTo false}) == -1) then { // none returned false + private _usageArray = GVAR(usageHash) getOrDefault [_testItem, []]; + if ((_usageArray findIf {([_testItem] call _x) isEqualTo false}) == -1) then { // none returned false _switchItem = _testItem; }; }; From e14d11d05a1beafa4b8d713744c8788ab5899c49 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 6 Sep 2023 02:37:29 +0200 Subject: [PATCH 4/5] Apply suggestions from code review --- addons/accessory/CfgFunctions.hpp | 2 +- addons/accessory/fnc_addAttachementCondition.sqf | 4 ++-- addons/accessory/fnc_switchAttachment.sqf | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/accessory/CfgFunctions.hpp b/addons/accessory/CfgFunctions.hpp index b6747a329c..15795c644e 100644 --- a/addons/accessory/CfgFunctions.hpp +++ b/addons/accessory/CfgFunctions.hpp @@ -1,7 +1,7 @@ class CfgFunctions { class CBA { class Inventory { - PATHTO_FNC(addAttachementCondition); + PATHTO_FNC(addAttachmentCondition); PATHTO_FNC(switchableAttachments); }; }; diff --git a/addons/accessory/fnc_addAttachementCondition.sqf b/addons/accessory/fnc_addAttachementCondition.sqf index 3f99e6696c..fa0169aba2 100644 --- a/addons/accessory/fnc_addAttachementCondition.sqf +++ b/addons/accessory/fnc_addAttachementCondition.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* ---------------------------------------------------------------------------- -Function: CBA_fnc_addAttachementCondition +Function: CBA_fnc_addAttachmentCondition Description: Adds condition to be able to switch to an attachment. @@ -14,7 +14,7 @@ Returns: Examples: (begin example) - ["ACE_acc_pointer_red", { false }] call CBA_fnc_addAttachementCondition + ["ACE_acc_pointer_red", { false }] call CBA_fnc_addAttachmentCondition (end) Author: diff --git a/addons/accessory/fnc_switchAttachment.sqf b/addons/accessory/fnc_switchAttachment.sqf index a6053f4662..f08b9ee2ab 100644 --- a/addons/accessory/fnc_switchAttachment.sqf +++ b/addons/accessory/fnc_switchAttachment.sqf @@ -45,7 +45,7 @@ private _cfgWeapons = configfile >> "CfgWeapons"; private _testItem = _currItem; while {_testItem != ""} do { - // Get the next/previous item from the attachement's config, but ignore inherited values + // Get the next/previous item from the attachment's config, but ignore inherited values private _configs = if (_switchTo == "next") then { configProperties [_cfgWeapons >> _testItem, "configName _x == 'MRT_SwitchItemNextClass'", false]; } else { From 7b1ea1bd5aa731c0e7afab7f816dd5391d64d033 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 6 Sep 2023 02:37:56 +0200 Subject: [PATCH 5/5] Rename fnc_addAttachementCondition.sqf to fnc_addAttachmentCondition.sqf --- ...addAttachementCondition.sqf => fnc_addAttachmentCondition.sqf} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename addons/accessory/{fnc_addAttachementCondition.sqf => fnc_addAttachmentCondition.sqf} (100%) diff --git a/addons/accessory/fnc_addAttachementCondition.sqf b/addons/accessory/fnc_addAttachmentCondition.sqf similarity index 100% rename from addons/accessory/fnc_addAttachementCondition.sqf rename to addons/accessory/fnc_addAttachmentCondition.sqf