diff --git a/addons/arsenal/ACE_Arsenal_Sorts.hpp b/addons/arsenal/ACE_Arsenal_Sorts.hpp index db16192468..6ef0bdfa0e 100644 --- a/addons/arsenal/ACE_Arsenal_Sorts.hpp +++ b/addons/arsenal/ACE_Arsenal_Sorts.hpp @@ -10,7 +10,7 @@ class GVAR(sorts) { class ACE_alphabetically: sortBase { scope = 2; displayName = "$STR_a3_rscdisplayarsenal_sort_alphabet"; - tabs[] = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}, {0,1,2,3,4,5,6,7}}; + tabs[] = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}, {0,1,2,3,4,5,6,7}}; statement = QUOTE({}); }; diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp index ca34487c97..e9db2a65c1 100644 --- a/addons/arsenal/XEH_PREP.hpp +++ b/addons/arsenal/XEH_PREP.hpp @@ -39,6 +39,7 @@ PREP(fillLeftPanel); PREP(fillLoadoutsList); PREP(fillRightPanel); PREP(fillSort); +PREP(getNearbyInventories); PREP(getVirtualItems); PREP(handleActions); PREP(handleLoadoutsSearchbar); diff --git a/addons/arsenal/defines.hpp b/addons/arsenal/defines.hpp index 73116dde76..1cbaae744e 100644 --- a/addons/arsenal/defines.hpp +++ b/addons/arsenal/defines.hpp @@ -106,6 +106,8 @@ #define IDC_buttonVoice 2035 #define IDC_iconBackgroundInsigna 2036 #define IDC_buttonInsignia 2037 +#define IDC_iconBackgroundContainer 2038 +#define IDC_buttonContainer 2039 #define IDC_iconBackgroundOptic 21 #define IDC_buttonOptic 22 #define IDC_iconBackgroundItemAcc 23 diff --git a/addons/arsenal/functions/fnc_compileActions.sqf b/addons/arsenal/functions/fnc_compileActions.sqf index 6eda62ac65..0f77fd8ce6 100644 --- a/addons/arsenal/functions/fnc_compileActions.sqf +++ b/addons/arsenal/functions/fnc_compileActions.sqf @@ -32,7 +32,8 @@ private _actionList = [ [], // Watch 14 [], // Face 15 [], // Voice 16 - [] // Insignia 17 + [], // Insignia 17 + [] // Containers 18 ]; private _configGroupEntries = "true" configClasses (configFile >> QGVAR(actions)); diff --git a/addons/arsenal/functions/fnc_compileSorts.sqf b/addons/arsenal/functions/fnc_compileSorts.sqf index 0a1f7b781f..6c826cf6e2 100644 --- a/addons/arsenal/functions/fnc_compileSorts.sqf +++ b/addons/arsenal/functions/fnc_compileSorts.sqf @@ -49,7 +49,8 @@ private _sortListLeftPanel = [ [], // Watch 14 [], // Face 15 [], // Voice 16 - [] // Insignia 17 + [], // Insignia 17 + [] // Containers 18 ]; private _sortListRightPanel = [ diff --git a/addons/arsenal/functions/fnc_fillLeftPanel.sqf b/addons/arsenal/functions/fnc_fillLeftPanel.sqf index 26f872dfdf..507ddd5b73 100644 --- a/addons/arsenal/functions/fnc_fillLeftPanel.sqf +++ b/addons/arsenal/functions/fnc_fillLeftPanel.sqf @@ -233,6 +233,26 @@ private _selectedItem = switch (true) do { GVAR(currentInsignia) }; + case IDC_buttonContainer: { + private _vehicles = call FUNC(getNearbyInventories); + private _displayName = ""; + private _lbAdd = -1; + { + if (["ace_cargo"] call EFUNC(common,isModLoaded)) then { + _displayName = [_x, true] call EFUNC(cargo,getNameItem); + } else { + _displayName = getText (configOf _x >> "displayName"); + }; + + _lbAdd = _ctrlPanel lbAdd format ["%1 (%2m)", _displayName, (GVAR(center) distance _x) toFixed 1]; + // Since we can't refer to the object directly, we'll use its hashValue instead + _ctrlPanel lbSetData [_lbAdd, hashValue _x]; + _ctrlPanel lbSetPicture [_lbAdd, [_x] call EFUNC(common,getVehicleIcon)]; + _ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, typeOf _x]]; + } forEach _vehicles; + + GVAR(currentContainer) + }; // Unknown default {""}; }; diff --git a/addons/arsenal/functions/fnc_fillSort.sqf b/addons/arsenal/functions/fnc_fillSort.sqf index 6b14ee38e2..92d24edf76 100644 --- a/addons/arsenal/functions/fnc_fillSort.sqf +++ b/addons/arsenal/functions/fnc_fillSort.sqf @@ -106,7 +106,8 @@ private _sorts = if (_rightSort && {GVAR(currentLeftPanel) in [IDC_buttonUniform IDC_buttonWatch, IDC_buttonFace, IDC_buttonVoice, - IDC_buttonInsignia + IDC_buttonInsignia, + IDC_buttonContainer ] find _idc) }; } diff --git a/addons/arsenal/functions/fnc_getNearbyInventories.sqf b/addons/arsenal/functions/fnc_getNearbyInventories.sqf new file mode 100644 index 0000000000..8899ab7753 --- /dev/null +++ b/addons/arsenal/functions/fnc_getNearbyInventories.sqf @@ -0,0 +1,12 @@ +#include "..\script_component.hpp" + +if !(GVAR(enableInventoryEditing)) exitWith {[]}; + +private _typesToSkip = ["CAManBase", "WeaponHolder"]; +(GVAR(center) nearSupplies 10) select { + private _object = _x; + _object != GVAR(currentBox) && + {_typesToSkip findIf {_object isKindOf _x} == -1} && + {[GVAR(center), _x] call EFUNC(common,canInteractWith)} && + {GVAR(vehicleMap) set [hashValue _x, _x]; true} +} // return diff --git a/addons/arsenal/functions/fnc_handleActions.sqf b/addons/arsenal/functions/fnc_handleActions.sqf index f89b4f1259..41ebb5f321 100644 --- a/addons/arsenal/functions/fnc_handleActions.sqf +++ b/addons/arsenal/functions/fnc_handleActions.sqf @@ -38,7 +38,8 @@ private _panel = [ IDC_buttonWatch, IDC_buttonFace, IDC_buttonVoice, - IDC_buttonInsignia + IDC_buttonInsignia, + IDC_buttonContainer ] find GVAR(currentLeftPanel); private _groups = (GVAR(actionList) select _panel) select { diff --git a/addons/arsenal/functions/fnc_handleStats.sqf b/addons/arsenal/functions/fnc_handleStats.sqf index b5d435a101..ece187751c 100644 --- a/addons/arsenal/functions/fnc_handleStats.sqf +++ b/addons/arsenal/functions/fnc_handleStats.sqf @@ -201,8 +201,8 @@ private _fnc_handleStats = { // Check if in left or right panel if (ctrlIDC _control == IDC_leftTabContent) then { - // Faces, voices and insigna do not have stats - if ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia] find GVAR(currentLeftPanel) > -1) then { + // Faces, voices, insignia and containers do not have stats + if ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia, IDC_buttonContainer] find GVAR(currentLeftPanel) > -1) then { call _fnc_hideEverything; } else { [[ diff --git a/addons/arsenal/functions/fnc_onArsenalClose.sqf b/addons/arsenal/functions/fnc_onArsenalClose.sqf index 2cce9b13ee..0d72da6455 100644 --- a/addons/arsenal/functions/fnc_onArsenalClose.sqf +++ b/addons/arsenal/functions/fnc_onArsenalClose.sqf @@ -113,6 +113,8 @@ GVAR(currentItems) = nil; GVAR(currentFace) = nil; GVAR(currentVoice) = nil; GVAR(currentInsignia) = nil; +GVAR(currentContainer) = nil; +GVAR(vehicleMap) = nil; GVAR(currentAction) = nil; GVAR(currentStatPage) = nil; diff --git a/addons/arsenal/functions/fnc_onArsenalOpen.sqf b/addons/arsenal/functions/fnc_onArsenalOpen.sqf index 9077a13a7a..8ab4061a6f 100644 --- a/addons/arsenal/functions/fnc_onArsenalOpen.sqf +++ b/addons/arsenal/functions/fnc_onArsenalOpen.sqf @@ -70,6 +70,8 @@ GVAR(virtualItemsFlatAll) = +GVAR(virtualItemsFlat); GVAR(currentFace) = face GVAR(center); GVAR(currentVoice) = speaker GVAR(center); GVAR(currentInsignia) = GVAR(center) call BIS_fnc_getUnitInsignia; +GVAR(currentContainer) = ""; +GVAR(vehicleMap) = createHashMap; GVAR(currentAction) = "Stand"; GVAR(shiftState) = false; @@ -252,6 +254,14 @@ private _leftPanelIDC = [IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC [_display, _display displayCtrl _leftPanelIDC] call FUNC(fillLeftPanel); +if !(GVAR(enableInventory)) then { + { + private _ctrl = _display displayCtrl _x; + _ctrl ctrlShow false; + _ctrl ctrlEnable false; + } forEach [IDC_buttonContainer, IDC_iconBackgroundContainer]; +}; + //--------------- Init camera if (isNil QGVAR(cameraPosition)) then { GVAR(cameraPosition) = [5, 0, 0, [0, 0, 0.85]]; diff --git a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf index 3d356fc207..cd33565e94 100644 --- a/addons/arsenal/functions/fnc_onSelChangedLeft.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedLeft.sqf @@ -692,6 +692,16 @@ switch (GVAR(currentLeftPanel)) do { [_display, _control, _curSel, _unitInsigniaConfig] call FUNC(itemInfo); }; }; + // Container + case IDC_buttonContainer: { + GVAR(currentContainer) = _item; + + call FUNC(showItem); + + TOGGLE_RIGHT_PANEL_HIDE + // call FUNC(openInventoryMenu); + [_display, _control, _curSel, configNull] call FUNC(itemInfo); + }; }; (_display displayCtrl IDC_totalWeightText) ctrlSetText (format ["%1 (%2)", GVAR(center) call EFUNC(common,getWeight), [GVAR(center), 1] call EFUNC(common,getWeight)]); diff --git a/addons/arsenal/functions/fnc_sortPanel.sqf b/addons/arsenal/functions/fnc_sortPanel.sqf index bbe48d6e35..f1a527c080 100644 --- a/addons/arsenal/functions/fnc_sortPanel.sqf +++ b/addons/arsenal/functions/fnc_sortPanel.sqf @@ -92,7 +92,8 @@ if (_rightSort) then { IDC_buttonWatch, IDC_buttonFace, IDC_buttonVoice, - IDC_buttonInsignia + IDC_buttonInsignia, + IDC_buttonContainer ] find GVAR(currentLeftPanel))) ] } params ["_panel", "_cfgClass", "_sorts"]; diff --git a/addons/arsenal/initSettings.inc.sqf b/addons/arsenal/initSettings.inc.sqf index bc093eb522..9923e100db 100644 --- a/addons/arsenal/initSettings.inc.sqf +++ b/addons/arsenal/initSettings.inc.sqf @@ -8,6 +8,15 @@ private _category = LLSTRING(settingCategory); false ] call CBA_fnc_addSetting; +[ + QGVAR(enableInventoryEditing), + "CHECKBOX", + ["Enable Inventory Editing", "Allows editing the contents of nearby containers' inventory."], + _category, + true, + true +] call CBA_fnc_addSetting; + [ QGVAR(enableModIcons), "CHECKBOX", diff --git a/addons/arsenal/script_component.hpp b/addons/arsenal/script_component.hpp index 0f7348b9db..8f5a56021e 100644 --- a/addons/arsenal/script_component.hpp +++ b/addons/arsenal/script_component.hpp @@ -3,7 +3,7 @@ #include "\z\ace\addons\main\script_mod.hpp" // #define DEBUG_MODE_FULL -// #define DISABLE_COMPILE_CACHE +#define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS #ifdef DEBUG_ENABLED_ARSENAL diff --git a/addons/arsenal/ui/RscAttributes.hpp b/addons/arsenal/ui/RscAttributes.hpp index 0265e86f3f..24b8f5f967 100644 --- a/addons/arsenal/ui/RscAttributes.hpp +++ b/addons/arsenal/ui/RscAttributes.hpp @@ -866,6 +866,16 @@ class GVAR(display) { text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArsenal\Insignia_ca.paa"; y = QUOTE(170 * GRID_H); }; + class iconBackgroundContainer: iconBackgroundPrimaryWeapon { + idc = IDC_iconBackgroundContainer; + y = QUOTE(180 * GRID_H); + }; + class buttonContainer: buttonPrimaryWeapon { + idc = IDC_buttonContainer; + tooltip = "$STR_DN_Vehicles"; + text = "\A3\Ui_f\data\Map\VehicleIcons\iconCrateVeh_ca.paa"; + y = QUOTE(180 * GRID_H); + }; }; }; class iconBackgroundOptic: ctrlStaticBackground {