diff --git a/addons/wardrobe/XEH_preInit.sqf b/addons/wardrobe/XEH_preInit.sqf index efb54eea6b3..9b290223a96 100644 --- a/addons/wardrobe/XEH_preInit.sqf +++ b/addons/wardrobe/XEH_preInit.sqf @@ -10,6 +10,15 @@ PREP_RECOMPILE_END; GVAR(inProgress) = false; +GVAR(replaceHashmap) = createHashMapFromArray [ + [TYPE_HEADGEAR, LINKFUNC(replaceOther) ], + [TYPE_UNIFORM, LINKFUNC(replaceContainer)], + [TYPE_VEST, LINKFUNC(replaceContainer)], + [TYPE_BACKPACK, LINKFUNC(replaceContainer)], + [TYPE_HMD, LINKFUNC(replaceOther) ], + [TYPE_GOGGLE, LINKFUNC(replaceOther) ] +]; + // Cache Wardrobe Replace Exceptions private _map = createHashMap; { diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 758766c353e..62cf48252d5 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -30,40 +30,38 @@ private _cfgWardobeTarget = configFile >> QUOTE(ADDON) >> _classTarget; private _duration = getNumber (_cfgWardobeTarget >> "duration"); // replace the main Item -private _equipmentType = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); -private _replaceCode = switch (_typeNumber) do { - case TYPE_HEADGEAR: { _equipmentType = "HEADGEAR"; LINKFUNC(replaceOther) }; - case TYPE_UNIFORM: { _equipmentType = "UNIFORM"; LINKFUNC(replaceContainer) }; - case TYPE_VEST: { _equipmentType = "VEST"; LINKFUNC(replaceContainer) }; - case TYPE_BACKPACK: { _equipmentType = "BACKPACK"; LINKFUNC(replaceContainer) }; - case TYPE_HMD: { _equipmentType = "NVG"; LINKFUNC(replaceOther) }; - default { - // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber - switch (true) do { - case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { _equipmentType = "FACEWEAR"; LINKFUNC(replaceOther) }; - default { {} }; - }; + +if (_typeNumber isEqualTo 0) then { + + // Switch-statement incase there will be more edge cases like CfgGlassess + _typeNumber = switch (true) do { + // CfgGlasses items do not have a ItemInfo subclass and therefore, will return 0 + case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { TYPE_GOGGLE }; + default { 0 }; }; }; -if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; + +private _replaceCode = GVAR(replaceHashmap) get _typeNumber; + +if (isNil "_replaceCode") exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; private _extendedInfo = createHashMap; -[QGVAR(itemChangedStart), [_player, _classOrigin, _classTarget, _equipmentType, _extendedInfo]] call CBA_fnc_localEvent; +[QGVAR(itemChangedStart), [_player, _classOrigin, _classTarget, _typeNumber, _extendedInfo]] call CBA_fnc_localEvent; // temp action disabled GVAR(inProgress) = true; [{ - params ["_player", "_classOrigin", "_classTarget", "_equipmentType", "_replaceCode", "_extendedInfo"]; + params ["_player", "_classOrigin", "_classTarget", "_typeNumber", "_replaceCode", "_extendedInfo"]; - [QGVAR(itemChangedBegin), [_player, _classOrigin, _classTarget, _equipmentType, _extendedInfo]] call CBA_fnc_localEvent; + [QGVAR(itemChangedBegin), [_player, _classOrigin, _classTarget, _typeNumber, _extendedInfo]] call CBA_fnc_localEvent; - [_player, _classTarget, _equipmentType] call _replaceCode; + [_player, _classTarget, _typeNumber] call _replaceCode; - [QGVAR(itemChangedEnd), [_player, _classOrigin, _classTarget, _equipmentType, _extendedInfo]] call CBA_fnc_localEvent; + [QGVAR(itemChangedEnd), [_player, _classOrigin, _classTarget, _typeNumber, _extendedInfo]] call CBA_fnc_localEvent; -}, [_player, _classOrigin, _classTarget, _equipmentType, _replaceCode, _extendedInfo], _duration] call CBA_fnc_waitAndExecute; +}, [_player, _classOrigin, _classTarget, _typeNumber, _replaceCode, _extendedInfo], _duration] call CBA_fnc_waitAndExecute; // handle components [_classOrigin, _classTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index dde6004795f..f56590844ad 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -18,7 +18,7 @@ * Public: No */ -params ["_player", "_classTarget", "_equipmentType"]; +params ["_player", "_classTarget", "_typeNumber"]; private _allMags = (magazinesAmmoFull _player) apply { _x#0 }; @@ -51,10 +51,10 @@ private _containerVars = []; } forEach [uniformContainer _player, vestContainer _player, backpackContainer _player]; // Replace Wearable Container -switch (_equipmentType) do { - case "UNIFORM": { _loadout # 3 set [0, _classTarget]; }; - case "VEST": { _loadout # 4 set [0, _classTarget]; }; - case "BACKPACK": { _loadout # 5 set [0, _classTarget]; }; +switch (_typeNumber) do { + case TYPE_UNIFORM: { _loadout # 3 set [0, _classTarget]; }; + case TYPE_VEST: { _loadout # 4 set [0, _classTarget]; }; + case TYPE_BACKPACK: { _loadout # 5 set [0, _classTarget]; }; }; // Apply new loadout diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index 99b3f4cc211..1fc61b8429a 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -18,18 +18,18 @@ * Public: No */ -params ["_player", "_classTarget", "_equipmentType"]; +params ["_player", "_classTarget", "_typeNumber"]; -switch (_equipmentType) do { - case "HEADGEAR": { +switch (_typeNumber) do { + case TYPE_HEADGEAR: { removeHeadgear _player; _player addHeadgear _classTarget; }; - case "FACEWEAR": { + case TYPE_GOGGLE: { removeGoggles _player; _player addGoggles _classTarget; }; - case "NVG": { + case TYPE_HMD: { _player linkItem _classTarget; }; }; diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index b3b11ef2e0d..90090ce54d3 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -331,14 +331,14 @@ Therefore, the debug script found at `addons\wardrobe\dev\compareContainerMaxLoa ### 6.2.1 Listenable -`_itemType` is STRING ["UNIFORM", "VEST", "BACKPACK", "HEADGEAR", "FACEWEAR"] +`_typeNumber` is NUMBER, see [script_macros.hpp](https://github.com/acemod/ACE3/blob/master/addons/main/script_macros.hpp#L75-L114) `_extendedInfo` is HASHMAP will be passed between events (works similar to `CBA_loadoutSet` events) | Event Name | Description | Passed Parameter(s) | Locality | | ---------- | ----------- | ------------------- | -------- | -| `ace_wardrobe_itemChangedStart` | Raised when the action to change an item is taken, but before any changes. | `[_player, _oldItem, _newItem, _itemType, _extendedInfo]` | Local | -| `ace_wardrobe_itemChangedBegin` | Raised just before the item is changed. | `[_player, _oldItem, _newItem, _itemType, _extendedInfo]` | Local | -| `ace_wardrobe_itemChangedEnd` | Raised just after the item has been changed. | `[_player, _oldItem, _newItem, _itemType, _extendedInfo]` | Local | +| `ace_wardrobe_itemChangedStart` | Raised when the action to change an item is taken, but before any changes. | `[_player, _oldItem, _newItem, _typeNumber, _extendedInfo]` | Local | +| `ace_wardrobe_itemChangedBegin` | Raised just before the item is changed. | `[_player, _oldItem, _newItem, _typeNumber, _extendedInfo]` | Local | +| `ace_wardrobe_itemChangedEnd` | Raised just after the item has been changed. | `[_player, _oldItem, _newItem, _typeNumber, _extendedInfo]` | Local | ## 6.3 Container Variables