From d94cc9d8d55babb861be114caa11470394404eca Mon Sep 17 00:00:00 2001 From: Jacob Schmidt Date: Wed, 4 Feb 2026 22:46:24 -0600 Subject: [PATCH] feat: Implement client-side locker system with UI event handling, ACE Arsenal integration, and inventory management. --- .../addons/actor/functions/fnc_handleUIEvents.sqf | 4 ++-- arma/client/addons/locker/XEH_postInit.sqf | 6 +++--- .../addons/locker/functions/fnc_initLockerClass.sqf | 13 +++++++------ .../addons/locker/functions/fnc_initVAClass.sqf | 10 +++++----- .../addons/locker/functions/fnc_initLocker.sqf | 4 ++-- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf index 5a0f8b6..8c565e0 100644 --- a/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf +++ b/arma/client/addons/actor/functions/fnc_handleUIEvents.sqf @@ -4,7 +4,7 @@ * File: fnc_handleUIEvents.sqf * Author: IDSolutions * Date: 2026-01-28 - * Last Update: 2026-01-31 + * Last Update: 2026-02-04 * Public: No * * Description: @@ -38,7 +38,7 @@ switch (_event) do { case "actor::open::garage": { hint "Garage interaction is not yet implemented."; }; case "actor::open::vgarage": { [] spawn EFUNC(garage,openVG); }; case "actor::open::org": { [] spawn EFUNC(org,openUI); }; - case "actor::open::vlocker": { ["Open", [false, FORGE_Locker_Box, player]] spawn BFUNC(arsenal) }; + case "actor::open::vlocker": { [FORGE_Locker_Box, player, false] spawn AFUNC(arsenal,openBox) }; case "actor::open::phone": { hint "Phone interaction is not yet implemented."; }; case "actor::open::iplayer": { hint "Player interaction is not yet implemented." }; case "actor::open::store": { hint "Store interaction is not yet implemented."; }; diff --git a/arma/client/addons/locker/XEH_postInit.sqf b/arma/client/addons/locker/XEH_postInit.sqf index 55d776f..ba2da81 100644 --- a/arma/client/addons/locker/XEH_postInit.sqf +++ b/arma/client/addons/locker/XEH_postInit.sqf @@ -1,8 +1,8 @@ #include "script_component.hpp" -[missionNamespace, "arsenalOpened", { +["ace_arsenal_displayOpened", { disableSerialization; params ["_display"]; _display displayAddEventHandler ["KeyDown", "_this select 3"]; - { (_display displayCtrl _x) ctrlShow false } forEach [44151, 44150, 44146, 44147, 44148, 44149, 44346]; -}] call BIS_fnc_addScriptedEventHandler; + { (_display displayCtrl _x) ctrlShow false } forEach [1002, 1003, 1004, 1005, 1006]; +}] call CFUNC(addEventHandler); diff --git a/arma/client/addons/locker/functions/fnc_initLockerClass.sqf b/arma/client/addons/locker/functions/fnc_initLockerClass.sqf index 246d705..52f361d 100644 --- a/arma/client/addons/locker/functions/fnc_initLockerClass.sqf +++ b/arma/client/addons/locker/functions/fnc_initLockerClass.sqf @@ -4,7 +4,7 @@ * File: fnc_initLockerClass.sqf * Author: IDSolutions * Date: 2025-12-17 - * Last Update: 2026-01-31 + * Last Update: 2026-02-04 * Public: No * * Description: @@ -65,11 +65,12 @@ GVAR(LockerRepository) = compileFinal createHashMapFromArray [ { _x params ["_containerClass", "_containerObj"]; - private _isBackpack = isClass (configFile >> "CfgVehicles" >> _containerClass); + private _cfgVehicles = configFile >> "CfgVehicles" >> _containerClass; private _cfgWeapons = configFile >> "CfgWeapons" >> _containerClass; private _itemInfoType = getNumber (_cfgWeapons >> "ItemInfo" >> "type"); - private _isVest = isClass _cfgWeapons && {_itemInfoType == 701}; - private _isUniform = isClass _cfgWeapons && {_itemInfoType == 801}; + private _isBackpack = isClass _cfgVehicles; + private _isUniform = isClass _cfgWeapons && {_itemInfoType == TYPE_UNIFORM}; + private _isVest = isClass _cfgWeapons && {_itemInfoType == TYPE_VEST}; if (!_isBackpack && !_isVest && !_isUniform) then { continue; }; @@ -147,7 +148,7 @@ GVAR(LockerRepository) = compileFinal createHashMapFromArray [ } forEach _attachments; if (_primaryMag isNotEqualTo ["", 0]) then { - _primaryMag params ["_magClass", "_ammoCount"]; + _primaryMag params ["_magClass", "_ammoCount"]; // TODO: Add ammo count to locker if (_magClass != "") then { private _existing = _locker getOrDefault [_magClass, createHashMap]; private _existingCount = _existing getOrDefault ["amount", 0]; @@ -161,7 +162,7 @@ GVAR(LockerRepository) = compileFinal createHashMapFromArray [ }; if (_secondaryMag isNotEqualTo ["", 0]) then { - _secondaryMag params ["_magClass", "_ammoCount"]; + _secondaryMag params ["_magClass", "_ammoCount"]; // TODO: Add ammo count to locker if (_magClass != "") then { private _existing = _locker getOrDefault [_magClass, createHashMap]; private _existingCount = _existing getOrDefault ["amount", 0]; diff --git a/arma/client/addons/locker/functions/fnc_initVAClass.sqf b/arma/client/addons/locker/functions/fnc_initVAClass.sqf index 51fd158..db5a45c 100644 --- a/arma/client/addons/locker/functions/fnc_initVAClass.sqf +++ b/arma/client/addons/locker/functions/fnc_initVAClass.sqf @@ -4,7 +4,7 @@ * File: fnc_initVAClass.sqf * Author: IDSolutions * Date: 2025-12-16 - * Last Update: 2026-01-31 + * Last Update: 2026-02-04 * Public: No * * Description: @@ -78,19 +78,19 @@ GVAR(VArsenalClass) = createHashMapObject [[ }], ["applyItems", { private _items = _self call ["get", ["items", []]]; - [FORGE_Armory_Box, _items, false, true, 1, 0] call BFUNC(addVirtualItemCargo); + [FORGE_Locker_Box, _items] call AFUNC(arsenal,addVirtualItems); }], ["applyWeapons", { private _weapons = _self call ["get", ["weapons", []]]; - [FORGE_Armory_Box, _weapons, false, true, 1, 1] call BFUNC(addVirtualItemCargo); + [FORGE_Locker_Box,_weapons] call AFUNC(arsenal,addVirtualItems); }], ["applyMagazines", { private _magazines = _self call ["get", ["magazines", []]]; - [FORGE_Armory_Box, _magazines, false, true, 1, 2] call BFUNC(addVirtualItemCargo); + [FORGE_Locker_Box,_magazines] call AFUNC(arsenal,addVirtualItems); }], ["applyBackpacks", { private _backpacks = _self call ["get", ["backpacks", []]]; - [FORGE_Armory_Box, _backpacks, false, true, 1, 3] call BFUNC(addVirtualItemCargo); + [FORGE_Locker_Box,_backpacks] call AFUNC(arsenal,addVirtualItems); }] ]]; diff --git a/arma/server/addons/locker/functions/fnc_initLocker.sqf b/arma/server/addons/locker/functions/fnc_initLocker.sqf index 0a38b50..94bdd41 100644 --- a/arma/server/addons/locker/functions/fnc_initLocker.sqf +++ b/arma/server/addons/locker/functions/fnc_initLocker.sqf @@ -4,7 +4,7 @@ * File: fnc_initLocker.sqf * Author: IDSolutions * Date: 2025-12-17 - * Last Update: 2026-01-31 + * Last Update: 2026-02-04 * Public: No * * Description: @@ -23,7 +23,7 @@ private _lockers = (allVariables missionNamespace) select { private _var = missionNamespace getVariable _x; - ("locker" in _x) && { _var isEqualType objNull } && { !isNull _var } && { _x isNotEqualTo "forge_locker_box" } + ("locker" in _x) && { _var isEqualType objNull } && { !isNull _var } }; if (_lockers isEqualTo []) exitWith { ["INFO", "No editor-placed lockers found."] call EFUNC(common,log) };