Arsenal - Fix FUNC(removeVirtualItems) for JIP players (#9650)

* Fix removeItems for JIP

* Different approach

* Update fnc_addVirtualItems.sqf

* Refresh arsenal globally
This commit is contained in:
johnb432 2023-11-18 00:06:20 +01:00 committed by GitHub
parent 65c16b6a0a
commit 8f3129a02e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 34 additions and 33 deletions

View File

@ -18,6 +18,15 @@ GVAR(lastSortDirectionRight) = DESCENDING;
[QGVAR(removeDefaultLoadout), LINKFUNC(removeDefaultLoadout)] call CBA_fnc_addEventHandler; [QGVAR(removeDefaultLoadout), LINKFUNC(removeDefaultLoadout)] call CBA_fnc_addEventHandler;
[QGVAR(renameDefaultLoadout), LINKFUNC(renameDefaultLoadout)] call CBA_fnc_addEventHandler; [QGVAR(renameDefaultLoadout), LINKFUNC(renameDefaultLoadout)] call CBA_fnc_addEventHandler;
[QGVAR(refresh), {
params ["_object"];
// If the arsenal is already open, refresh arsenal display
if (!isNil QGVAR(currentBox) && {GVAR(currentBox) isEqualTo _object}) then {
[true, true] call FUNC(refresh);
};
}] call CBA_fnc_addEventHandler;
[QGVAR(broadcastFace), { [QGVAR(broadcastFace), {
params ["_unit", "_face"]; params ["_unit", "_face"];
_unit setFace _face; _unit setFace _face;

View File

@ -125,6 +125,8 @@ if (_items isEqualType true) then {
_object setVariable [QGVAR(virtualItems), _cargo, _global]; _object setVariable [QGVAR(virtualItems), _cargo, _global];
// If the arsenal is already open, refresh arsenal display // If the arsenal is already open, refresh arsenal display
if (!isNil QGVAR(currentBox) && {GVAR(currentBox) isEqualTo _object}) then { if (_global) then {
[true, true] call FUNC(refresh); [QGVAR(refresh), _object] call CBA_fnc_globalEvent;
} else {
[QGVAR(refresh), _object] call CBA_fnc_localEvent;
}; };

View File

@ -24,14 +24,12 @@ if (_mode > 0) then {
// Blacklist: add full arsenal and take items away // Blacklist: add full arsenal and take items away
[_object, true, true] call FUNC(initBox); [_object, true, true] call FUNC(initBox);
// Need to delay removal by 2 frames // Wait until all items have been added, so that the blacklisted items can be removed
[{ [{
[{ !isNil {(_this select 0) getVariable QGVAR(virtualItems)}
params ["_object", "_items"]; }, {
[_this select 0, _this select 1, true] call FUNC(removeVirtualItems);
[_object, _items, true] call FUNC(removeVirtualItems); }, [_object, _items], 20] call CBA_fnc_waitUntilAndExecute; // 20s timeout in case of failure
}, _this] call CBA_fnc_execNextFrame;
}, [_object, _items]] call CBA_fnc_execNextFrame;
} else { } else {
// Exit on whitelist mode with no items // Exit on whitelist mode with no items
if (_items isEqualTo []) exitWith {}; if (_items isEqualTo []) exitWith {};

View File

@ -51,7 +51,10 @@ if (_global && {isMultiplayer} && {isNil {_object getVariable QGVAR(initBoxJIP)}
] call EFUNC(interact_menu,createAction); ] call EFUNC(interact_menu,createAction);
[_object, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToObject); [_object, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToObject);
// If items were set globally, do not add items locally
if (isNil {_object getVariable QGVAR(virtualItems)}) then {
[_object, _items, false] call FUNC(addVirtualItems); [_object, _items, false] call FUNC(addVirtualItems);
};
[QGVAR(boxInitialized), [_object, _items]] call CBA_fnc_localEvent; [QGVAR(boxInitialized), [_object, _items]] call CBA_fnc_localEvent;
}; };

View File

@ -28,13 +28,15 @@ if (
) exitWith {}; ) exitWith {};
// If object has no arsenal and chosen option is to not ignore virtual items of object, exit // If object has no arsenal and chosen option is to not ignore virtual items of object, exit
if (isNil {_object getVariable QGVAR(virtualItems)} && {!_mode}) exitWith { private _virtualItems = _object getVariable QGVAR(virtualItems);
if (isNil "_virtualItems" && {!_mode}) exitWith {
[LLSTRING(noVirtualItems), false, 5, 1] call EFUNC(common,displayText); [LLSTRING(noVirtualItems), false, 5, 1] call EFUNC(common,displayText);
}; };
// Don't execute in scheduled environment // Don't execute in scheduled environment
if (canSuspend) exitWith { if (canSuspend) exitWith {
[{_this call FUNC(openBox)}, _this] call CBA_fnc_directCall; [FUNC(openBox), _this] call CBA_fnc_directCall;
}; };
private _displayToUse = findDisplay IDD_RSCDISPLAYCURATOR; private _displayToUse = findDisplay IDD_RSCDISPLAYCURATOR;
@ -46,6 +48,7 @@ if (isNull _displayToUse || {!isNil QGVAR(camera)}) exitWith {
[LLSTRING(CantOpenDisplay), false, 5, 1] call EFUNC(common,displayText); [LLSTRING(CantOpenDisplay), false, 5, 1] call EFUNC(common,displayText);
}; };
GVAR(center) = _center;
GVAR(currentBox) = _object; GVAR(currentBox) = _object;
if (_mode) then { if (_mode) then {
@ -56,29 +59,12 @@ if (_mode) then {
GVAR(ignoredVirtualItems) = true; GVAR(ignoredVirtualItems) = true;
} else { } else {
// Add only specified items to the arsenal // Add only specified items to the arsenal
private _virtualItems = _object getVariable QGVAR(virtualItems); GVAR(virtualItems) = +_virtualItems;
GVAR(virtualItems) = if (isNil "_virtualItems") then {
_virtualItems = [
[IDX_VIRT_WEAPONS, createHashMapFromArray [[IDX_VIRT_PRIMARY_WEAPONS, createHashMap], [IDX_VIRT_SECONDARY_WEAPONS, createHashMap], [IDX_VIRT_HANDGUN_WEAPONS, createHashMap]]],
[IDX_VIRT_ATTACHMENTS, createHashMapFromArray [[IDX_VIRT_OPTICS_ATTACHMENTS, createHashMap], [IDX_VIRT_FLASHLIGHT_ATTACHMENTS, createHashMap], [IDX_VIRT_MUZZLE_ATTACHMENTS, createHashMap], [IDX_VIRT_BIPOD_ATTACHMENTS, createHashMap]]]
];
_virtualItems = createHashMapFromArray _virtualItems;
for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do {
_virtualItems set [_index, createHashMap];
};
} else {
+_virtualItems
};
// Flatten out hashmaps for easy checking later // Flatten out hashmaps for easy checking later
call FUNC(updateVirtualItemsFlat); call FUNC(updateVirtualItemsFlat);
}; };
GVAR(center) = _center;
if (is3DEN) then { if (is3DEN) then {
_displayToUse createDisplay QGVAR(display); _displayToUse createDisplay QGVAR(display);
} else { } else {

View File

@ -25,7 +25,7 @@ private _id = _object getVariable QGVAR(initBoxJIP);
if (_global && {isMultiplayer} && {!isNil "_id"}) then { if (_global && {isMultiplayer} && {!isNil "_id"}) then {
// Remove event from JIP queue // Remove event from JIP queue
[_id] call CBA_fnc_removeGlobalEventJIP; _id call CBA_fnc_removeGlobalEventJIP;
// Reset JIP ID // Reset JIP ID
_object setVariable [QGVAR(initBoxJIP), nil, true]; _object setVariable [QGVAR(initBoxJIP), nil, true];

View File

@ -100,9 +100,12 @@ if (_items isEqualType true) then {
[_object, _global] call FUNC(removeBox); [_object, _global] call FUNC(removeBox);
} else { } else {
_object setVariable [QGVAR(virtualItems), _cargo, _global]; _object setVariable [QGVAR(virtualItems), _cargo, _global];
// If the arsenal is already open, refresh arsenal display // If the arsenal is already open, refresh arsenal display
if (!isNil QGVAR(currentBox) && {GVAR(currentBox) isEqualTo _object}) then { if (_global) then {
[true, true] call FUNC(refresh); [QGVAR(refresh), _object] call CBA_fnc_globalEvent;
} else {
[QGVAR(refresh), _object] call CBA_fnc_localEvent;
}; };
}; };
}; };