From 8332d3b8b96d6f5005abf84cd9bc4b158a0b727b Mon Sep 17 00:00:00 2001 From: johnb432 <58661205+johnb432@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:39:45 +0200 Subject: [PATCH 1/7] Remove secondary weapon only after deploying CSW part --- .../functions/fnc_assemble_deployTripod.sqf | 19 ++++------- .../functions/fnc_assemble_deployWeapon.sqf | 33 +++++++++---------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf index 9c2f3ef725c..b2fa2d71941 100644 --- a/addons/csw/functions/fnc_assemble_deployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf @@ -23,13 +23,17 @@ private _secondaryWeaponClassname = secondaryWeapon _player; // handle loaded launchers which can become csw like CUP Metis private _secondaryWeaponMagazine = secondaryWeaponMagazine _player param [0, ""]; - _player removeWeaponGlobal (secondaryWeapon _player); private _onFinish = { params ["_args"]; _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"]; TRACE_3("deployTripod finish",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine); + // If the weapon was removed during the progressbar, quit + if (_secondaryWeaponClassname != secondaryWeapon _player) exitWith {}; + + _player removeWeaponGlobal _secondaryWeaponClassname; + private _tripodClassname = getText(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy"); // Create a tripod @@ -63,17 +67,6 @@ }; }; - private _onFailure = { - params ["_args"]; - _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"]; - TRACE_3("deployTripod failure",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine); - - _player addWeaponGlobal _secondaryWeaponClassname; - if (_secondaryWeaponMagazine isNotEqualTo "") then { - _player addWeaponItem [_secondaryWeaponClassname, _secondaryWeaponMagazine, true]; - }; - }; - private _deployTime = getNumber(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime"); - [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname, _secondaryWeaponMagazine], _onFinish, _onFailure, localize LSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); + [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname, _secondaryWeaponMagazine], _onFinish, {}, localize LSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); }, _this] call CBA_fnc_execNextFrame; diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf index 772cad65d4c..b93b8f03ecf 100644 --- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -4,25 +4,27 @@ * Deploys the current CSW * * Arguments: - * 0: Unit + * 0: Target + * 1: Unit + * 2: Args + * 3: Action Data * * Return Value: * None * * Example: - * [player] call ace_csw_fnc_assemble_deployWeapon + * [cursorObject, player] call ace_csw_fnc_assemble_deployWeapon * * Public: No */ [{ - params ["_tripod", "_player", "", "_carryWeaponClassname"]; - if (isNil "_carryWeaponClassname") then { _carryWeaponClassname = secondaryWeapon _player }; + params ["_tripod", "_player"]; + + private _carryWeaponClassname = secondaryWeapon _player; TRACE_3("assemble_deployWeapon_carryWeaponClassname",_tripod,_player,_carryWeaponClassname); private _tripodClassname = typeOf _tripod; - _player removeWeaponGlobal _carryWeaponClassname; - private _assembledClassname = getText(configfile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname); private _deployTime = getNumber(configfile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "deployTime"); if (!isClass (configFile >> "CfgVehicles" >> _assembledClassname)) exitWith {ERROR_1("bad static classname [%1]",_assembledClassname);}; @@ -31,8 +33,13 @@ private _onFinish = { params ["_args"]; - _args params ["_tripod", "_player", "_assembledClassname"]; - TRACE_3("deployWeapon finish",_tripod,_player,_assembledClassname); + _args params ["_tripod", "_player", "_assembledClassname", "_carryWeaponClassname"]; + TRACE_4("deployWeapon finish",_tripod,_player,_assembledClassname,_carryWeaponClassname); + + // If the weapon was removed during the progressbar, quit + if (_secondaryWeaponClassname != secondaryWeapon _player) exitWith {}; + + _player removeWeaponGlobal _carryWeaponClassname; private _tripodPos = getPosATL _tripod; private _tripodDir = getDir _tripod; @@ -58,19 +65,11 @@ }, [_assembledClassname, _tripodDir, _tripodPos]] call CBA_fnc_execNextFrame; }; - private _onFailure = { - params ["_args"]; - _args params ["", "_player", "", "_carryWeaponClassname"]; - TRACE_2("deployWeapon failure",_player,_carryWeaponClassname); - - _player addWeaponGlobal _carryWeaponClassname; - }; - private _codeCheck = { params ["_args"]; _args params ["_tripod"]; !isNull _tripod; }; - [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _carryWeaponClassname], _onFinish, _onFailure, localize LSTRING(AssembleCSW_progressBar), _codeCheck] call EFUNC(common,progressBar); + [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _carryWeaponClassname], _onFinish, {}, localize LSTRING(AssembleCSW_progressBar), _codeCheck] call EFUNC(common,progressBar); }, _this] call CBA_fnc_execNextFrame; From ae15588a70c32c7c0120a729814bd44c58808588 Mon Sep 17 00:00:00 2001 From: johnb432 <58661205+johnb432@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:42:04 +0200 Subject: [PATCH 2/7] Deploy & pickup CSW parts only if they are not destroyed --- addons/csw/functions/fnc_assemble_canPickupWeapon.sqf | 2 +- addons/csw/functions/fnc_assemble_deployWeapon.sqf | 3 ++- addons/csw/functions/fnc_assemble_pickupTripod.sqf | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf index 40c6b527d39..6217d769dde 100644 --- a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf @@ -22,4 +22,4 @@ private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_ private _notCrewed = (crew _staticWeapon) isEqualTo []; private _deadCrew = !(alive (gunner _staticWeapon)); // need to eject body??? -_assemblyMode && {_notCrewed || _deadCrew} +_assemblyMode && {alive _staticWeapon} && {_notCrewed || _deadCrew} diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf index b93b8f03ecf..72bcb848124 100644 --- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -68,7 +68,8 @@ private _codeCheck = { params ["_args"]; _args params ["_tripod"]; - !isNull _tripod; + + alive _tripod }; [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _carryWeaponClassname], _onFinish, {}, localize LSTRING(AssembleCSW_progressBar), _codeCheck] call EFUNC(common,progressBar); diff --git a/addons/csw/functions/fnc_assemble_pickupTripod.sqf b/addons/csw/functions/fnc_assemble_pickupTripod.sqf index d85f9a3f831..6a3a0404ed5 100644 --- a/addons/csw/functions/fnc_assemble_pickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_pickupTripod.sqf @@ -37,7 +37,7 @@ params ["_args"]; _args params ["_tripod", "_player"]; - !(isNull _tripod) && { (secondaryWeapon _player) isEqualTo "" } + (alive _tripod) && { (secondaryWeapon _player) isEqualTo "" } }; From 1b9dd08187483c3eef666740ec8f0f186a7bdd78 Mon Sep 17 00:00:00 2001 From: johnb432 <58661205+johnb432@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:42:55 +0200 Subject: [PATCH 3/7] Revert "Deploy & pickup CSW parts only if they are not destroyed" This reverts commit ae15588a70c32c7c0120a729814bd44c58808588. --- addons/csw/functions/fnc_assemble_canPickupWeapon.sqf | 2 +- addons/csw/functions/fnc_assemble_deployWeapon.sqf | 3 +-- addons/csw/functions/fnc_assemble_pickupTripod.sqf | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf index 6217d769dde..40c6b527d39 100644 --- a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf @@ -22,4 +22,4 @@ private _assemblyMode = [false, true, true, GVAR(defaultAssemblyMode)] select (_ private _notCrewed = (crew _staticWeapon) isEqualTo []; private _deadCrew = !(alive (gunner _staticWeapon)); // need to eject body??? -_assemblyMode && {alive _staticWeapon} && {_notCrewed || _deadCrew} +_assemblyMode && {_notCrewed || _deadCrew} diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf index 72bcb848124..b93b8f03ecf 100644 --- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -68,8 +68,7 @@ private _codeCheck = { params ["_args"]; _args params ["_tripod"]; - - alive _tripod + !isNull _tripod; }; [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _carryWeaponClassname], _onFinish, {}, localize LSTRING(AssembleCSW_progressBar), _codeCheck] call EFUNC(common,progressBar); diff --git a/addons/csw/functions/fnc_assemble_pickupTripod.sqf b/addons/csw/functions/fnc_assemble_pickupTripod.sqf index 6a3a0404ed5..d85f9a3f831 100644 --- a/addons/csw/functions/fnc_assemble_pickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_pickupTripod.sqf @@ -37,7 +37,7 @@ params ["_args"]; _args params ["_tripod", "_player"]; - (alive _tripod) && { (secondaryWeapon _player) isEqualTo "" } + !(isNull _tripod) && { (secondaryWeapon _player) isEqualTo "" } }; From 798903b872980c625514752651b0f2ad445a8607 Mon Sep 17 00:00:00 2001 From: johnb432 <58661205+johnb432@users.noreply.github.com> Date: Tue, 2 Apr 2024 22:31:19 +0200 Subject: [PATCH 4/7] Handle weapon attachments --- .../functions/fnc_assemble_deployTripod.sqf | 48 ++++++++++++++----- .../functions/fnc_assemble_deployWeapon.sqf | 44 ++++++++++++++--- .../functions/fnc_assemble_pickupWeapon.sqf | 7 +-- .../fnc_staticWeaponInit_unloadExtraMags.sqf | 40 ++++++++++++---- 4 files changed, 108 insertions(+), 31 deletions(-) diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf index da2ed56c041..a9833078c92 100644 --- a/addons/csw/functions/fnc_assemble_deployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf @@ -19,16 +19,20 @@ params ["_player"]; TRACE_1("assemble_deployTripod",_player); + // Save magazines and attachments (handle loaded launchers which can become csw like CUP Metis) + private _secondaryWeaponInfo = (getUnitLoadout _player) select 1; + private _secondaryWeaponClassname = _secondaryWeaponInfo deleteAt 0; + + // Remove empty entries + _secondaryWeaponInfo = _secondaryWeaponInfo select {_x isNotEqualTo "" && {_x isNotEqualTo []}}; + // Remove the tripod from the launcher slot - private _secondaryWeaponClassname = secondaryWeapon _player; - // handle loaded launchers which can become csw like CUP Metis - private _secondaryWeaponMagazine = secondaryWeaponMagazine _player param [0, ""]; _player removeWeaponGlobal _secondaryWeaponClassname; private _onFinish = { params ["_args"]; - _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"]; - TRACE_3("deployTripod finish",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine); + _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponInfo"]; + TRACE_3("deployTripod finish",_player,_secondaryWeaponClassname,_secondaryWeaponInfo); private _tripodClassname = getText(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy"); @@ -36,9 +40,24 @@ private _cswTripod = createVehicle [_tripodClassname, [0, 0, 0], [], 0, "NONE"]; // Because the tripod can be a "full weapon" we disable any data that will allow it to be loaded _cswTripod setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set enabled&unload assembly mode and broadcast - if (_secondaryWeaponMagazine isNotEqualTo "") then { - _cswTripod setVariable [QGVAR(secondaryWeaponMagazine), _secondaryWeaponMagazine]; + + private _secondaryWeaponMagazines = []; + + { + // Magazines + if (_x isEqualType []) then { + _secondaryWeaponMagazines pushBack _x; + } else { + // Items + [_player, _x, true] call CBA_fnc_addItem; + }; + } forEach _secondaryWeaponInfo; + + // Only add magazines once the weapon is fully ready + if (_secondaryWeaponMagazines isNotEqualTo []) then { + _cswTripod setVariable [QGVAR(secondaryWeaponMagazines), _secondaryWeaponMagazines, true]; }; + if (!GVAR(defaultAssemblyMode)) then { [_cswTripod, "disableWeaponAssembly", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); }; @@ -65,15 +84,18 @@ private _onFailure = { params ["_args"]; - _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"]; - TRACE_3("deployTripod failure",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine); + _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponInfo"]; + TRACE_3("deployTripod failure",_player,_secondaryWeaponClassname,_secondaryWeaponInfo); + // Add tripod back _player addWeaponGlobal _secondaryWeaponClassname; - if (_secondaryWeaponMagazine isNotEqualTo "") then { - _player addWeaponItem [_secondaryWeaponClassname, _secondaryWeaponMagazine, true]; - }; + + // Add all attachments back + { + _player addWeaponItem [_secondaryWeaponClassname, _x, true]; + } forEach _secondaryWeaponInfo; }; private _deployTime = getNumber(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime"); - [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname, _secondaryWeaponMagazine], _onFinish, _onFailure, LLSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); + [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname, _secondaryWeaponInfo], _onFinish, _onFailure, LLSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); }, _this] call CBA_fnc_execNextFrame; diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf index 76e81b9d39d..35fd96d2f79 100644 --- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -21,7 +21,13 @@ [{ params ["_tripod", "_player"]; - private _carryWeaponClassname = secondaryWeapon _player; + // Save magazines and attachments (handle loaded launchers which can become csw like CUP Metis) + private _carryWeaponInfo = (getUnitLoadout _player) select 1; + private _carryWeaponClassname = _carryWeaponInfo deleteAt 0; + + // Remove empty entries + _carryWeaponInfo = _carryWeaponInfo select {_x isNotEqualTo "" && {_x isNotEqualTo []}}; + TRACE_3("assemble_deployWeapon_carryWeaponClassname",_tripod,_player,_carryWeaponClassname); private _tripodClassname = typeOf _tripod; @@ -38,8 +44,10 @@ private _onFinish = { params ["_args"]; - _args params ["_tripod", "_player", "_assembledClassname", "_carryWeaponClassname"]; - TRACE_4("deployWeapon finish",_tripod,_player,_assembledClassname,_carryWeaponClassname); + _args params ["_tripod", "_player", "_assembledClassname", "", "_carryWeaponInfo"]; + TRACE_3("deployWeapon finish",_tripod,_player,_assembledClassname); + + private _secondaryWeaponMagazines = _tripod getVariable [QGVAR(secondaryWeaponMagazines), []]; private _tripodPos = getPosATL _tripod; private _tripodDir = getDir _tripod; @@ -48,10 +56,26 @@ _tripodPos set [2, (_tripodPos select 2) + 0.1]; // Delay a frame so tripod has a chance to be deleted [{ - params ["_assembledClassname", "_tripodDir", "_tripodPos"]; + params ["_assembledClassname", "_tripodDir", "_tripodPos", "_player", "_carryWeaponInfo", "_secondaryWeaponMagazines"]; private _csw = createVehicle [_assembledClassname, [0, 0, 0], [], 0, "NONE"]; // Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default] _csw setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set advanced assembly mode + unload, and broadcast + + { + // Magazines + if (_x isEqualType []) then { + _secondaryWeaponMagazines pushBack _x; + } else { + // Items + [_player, _x, true] call CBA_fnc_addItem; + }; + } forEach _carryWeaponInfo; + + // Only add magazines once the weapon is fully ready + if (_secondaryWeaponMagazines isNotEqualTo []) then { + _csw setVariable [QGVAR(secondaryWeaponMagazines), _secondaryWeaponMagazines, true]; + }; + if (!GVAR(defaultAssemblyMode)) then { [_csw, "disableWeaponAssembly", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); }; @@ -62,15 +86,21 @@ }; [QGVAR(deployWeaponSucceeded), [_csw]] call CBA_fnc_localEvent; TRACE_2("csw placed",_csw,_assembledClassname); - }, [_assembledClassname, _tripodDir, _tripodPos]] call CBA_fnc_execNextFrame; + }, [_assembledClassname, _tripodDir, _tripodPos, _player, _carryWeaponInfo, _secondaryWeaponMagazines]] call CBA_fnc_execNextFrame; }; private _onFailure = { params ["_args"]; - _args params ["", "_player", "", "_carryWeaponClassname"]; + _args params ["", "_player", "", "_carryWeaponClassname", "_carryWeaponInfo"]; TRACE_2("deployWeapon failure",_player,_carryWeaponClassname); + // Add weapon back _player addWeaponGlobal _carryWeaponClassname; + + // Add all attachments back + { + _player addWeaponItem [_carryWeaponClassname, _x, true]; + } forEach _carryWeaponInfo; }; private _codeCheck = { @@ -80,5 +110,5 @@ alive _tripod }; - [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _carryWeaponClassname], _onFinish, _onFailure, LLSTRING(AssembleCSW_progressBar), _codeCheck] call EFUNC(common,progressBar); + [TIME_PROGRESSBAR(_deployTime), [_tripod, _player, _assembledClassname, _carryWeaponClassname, _carryWeaponInfo], _onFinish, _onFailure, LLSTRING(AssembleCSW_progressBar), _codeCheck] call EFUNC(common,progressBar); }, _this] call CBA_fnc_execNextFrame; diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf index 3034e2260ca..d91a5578ff9 100644 --- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -82,7 +82,7 @@ [{ params ["_player", "_weaponPos", "_carryWeaponClassname", "_carryWeaponMag"]; if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith { - _player addWeapon _carryWeaponClassname; + _player addWeaponGlobal _carryWeaponClassname; if (_carryWeaponMag isNotEqualTo "") then { _player addWeaponItem [_carryWeaponClassname, _carryWeaponMag, true]; }; @@ -106,8 +106,9 @@ private _condition = { params ["_args"]; - _args params ["_staticWeapon"]; - ((crew _staticWeapon) isEqualTo []) && (alive _staticWeapon) + _args params ["_staticWeapon", "_player"]; + + (alive _staticWeapon) && {(crew _staticWeapon) isEqualTo []} && {secondaryWeapon _player == ""} }; [TIME_PROGRESSBAR(_pickupTime), [_staticWeapon, _player, _carryWeaponClassname, _turretClassname, _onDisassembleFunc], _onFinish, {}, LLSTRING(DisassembleCSW_progressBar), _condition] call EFUNC(common,progressBar); diff --git a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf index 23155ead0bd..98200840a35 100644 --- a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf +++ b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf @@ -68,14 +68,38 @@ TRACE_1("Remove all loaded magazines",_magsToRemove); }; } forEach _magsToRemove; -if (_staticWeapon getVariable [QGVAR(secondaryWeaponMagazine), ""] isNotEqualTo "") then { - private _secondaryWeaponMagazine = _staticWeapon getVariable QGVAR(secondaryWeaponMagazine); - private _turret = allTurrets _staticWeapon param [0, []]; - private _vehicleMag = [_staticWeapon, _turret, _secondaryWeaponMagazine] call FUNC(reload_getVehicleMagazine); - TRACE_3("Re-add previous mag",_secondaryWeaponMagazine,_turret,_vehicleMag); - if (!isClass (configFile >> "CfgMagazines" >> _vehicleMag)) exitWith {}; - _staticWeapon addMagazineTurret [_vehicleMag, _turret, 1]; - _staticWeapon setVariable [QGVAR(secondaryWeaponMagazine), nil]; +private _secondaryWeaponMagazines = _staticWeapon getVariable [QGVAR(secondaryWeaponMagazines), []]; + +if (_secondaryWeaponMagazines isNotEqualTo []) then { + // Check if the static weapon can take magazines + private _turret = (allTurrets _staticWeapon) param [0, []]; + private _compatibleMagazinesTurret = flatten ((_staticWeapon weaponsTurret _turret) apply {compatibleMagazines _x}); + private _container = objNull; + + { + private _vehicleMag = [_staticWeapon, _turret, _x select 0] call FUNC(reload_getVehicleMagazine); + TRACE_3("Re-add previous mag",_x select 0,_turret,_vehicleMag); + + // If the magazine can be added to the static weapon, do it now + if (_vehicleMag in _compatibleMagazinesTurret) then { + _staticWeapon addMagazineTurret [_vehicleMag, _turret, _x select 1]; + } else { + // Find a suitable container to place items in if necessary + if (isNull _container) then { + _container = (nearestObjects [_staticWeapon, ["GroundWeaponHolder"], 10]) param [0, objNull]; + + // Create ammo storage container + if (isNull _container) then { + _container = createVehicle ["GroundWeaponHolder", getPosATL _staticWeapon, [], 0, "NONE"]; + }; + }; + + // If the mag can't be added to the static weapon, add it to the ground holder + _container addMagazineAmmoCargo [_x select 0, 1, _x select 1]; + }; + } forEach _secondaryWeaponMagazines; + + _staticWeapon setVariable [QGVAR(secondaryWeaponMagazines), nil, true]; }; if (_storeExtraMagazines) then { From 67ec2774546baa34fc09eb0844515e146a0bceba Mon Sep 17 00:00:00 2001 From: johnb432 <58661205+johnb432@users.noreply.github.com> Date: Wed, 3 Apr 2024 09:20:06 +0200 Subject: [PATCH 5/7] Revert pickup changes --- addons/csw/functions/fnc_assemble_pickupWeapon.sqf | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf index d91a5578ff9..9713019f1d6 100644 --- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -82,7 +82,7 @@ [{ params ["_player", "_weaponPos", "_carryWeaponClassname", "_carryWeaponMag"]; if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith { - _player addWeaponGlobal _carryWeaponClassname; + _player addWeapon _carryWeaponClassname; if (_carryWeaponMag isNotEqualTo "") then { _player addWeaponItem [_carryWeaponClassname, _carryWeaponMag, true]; }; @@ -106,9 +106,7 @@ private _condition = { params ["_args"]; - _args params ["_staticWeapon", "_player"]; - - (alive _staticWeapon) && {(crew _staticWeapon) isEqualTo []} && {secondaryWeapon _player == ""} + ((crew _staticWeapon) isEqualTo []) && (alive _staticWeapon) }; [TIME_PROGRESSBAR(_pickupTime), [_staticWeapon, _player, _carryWeaponClassname, _turretClassname, _onDisassembleFunc], _onFinish, {}, LLSTRING(DisassembleCSW_progressBar), _condition] call EFUNC(common,progressBar); From 260f7b5ef5a5eb431c01306ba63d1d03a512b4b1 Mon Sep 17 00:00:00 2001 From: johnb432 <58661205+johnb432@users.noreply.github.com> Date: Wed, 3 Apr 2024 09:20:29 +0200 Subject: [PATCH 6/7] Update fnc_assemble_pickupWeapon.sqf --- addons/csw/functions/fnc_assemble_pickupWeapon.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf index 9713019f1d6..3034e2260ca 100644 --- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -106,6 +106,7 @@ private _condition = { params ["_args"]; + _args params ["_staticWeapon"]; ((crew _staticWeapon) isEqualTo []) && (alive _staticWeapon) }; From a490b38c02241d1b3c2b3521fe684989baa270d3 Mon Sep 17 00:00:00 2001 From: johnb432 <58661205+johnb432@users.noreply.github.com> Date: Mon, 15 Apr 2024 11:54:34 +0200 Subject: [PATCH 7/7] Readd weapons without attachments and magazines --- addons/csw/functions/fnc_assemble_deployTripod.sqf | 2 +- addons/csw/functions/fnc_assemble_deployWeapon.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf index a9833078c92..29cc4b58763 100644 --- a/addons/csw/functions/fnc_assemble_deployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf @@ -88,7 +88,7 @@ TRACE_3("deployTripod failure",_player,_secondaryWeaponClassname,_secondaryWeaponInfo); // Add tripod back - _player addWeaponGlobal _secondaryWeaponClassname; + [_player, _secondaryWeaponClassname] call CBA_fnc_addWeaponWithoutItems; // Add all attachments back { diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf index 35fd96d2f79..ca45d64615a 100644 --- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -95,7 +95,7 @@ TRACE_2("deployWeapon failure",_player,_carryWeaponClassname); // Add weapon back - _player addWeaponGlobal _carryWeaponClassname; + [_player, _carryWeaponClassname] call CBA_fnc_addWeaponWithoutItems; // Add all attachments back {