#include "..\script_component.hpp" /* * Author: tcvm, PabstMirror * Dumps ammo to container. * * Arguments: * 0: CSW * 1: Using advanced assembly * 2: Empty weapon * * Return Value: * None * * Example: * [cursorObject, false] call ace_csw_fnc_staticWeaponInit_unloadExtraMags * * Public: No */ params ["_vehicle", "_assemblyMode", "_emptyWeapon"]; TRACE_3("staticWeaponInit_unloadExtraMags",_vehicle,_assemblyMode,_emptyWeapon); if (!_assemblyMode) exitWith {}; private _desiredAmmo = getNumber (configOf _vehicle >> QUOTE(ADDON) >> "desiredAmmo"); private _storeExtraMagazines = GVAR(handleExtraMagazines); if (_emptyWeapon) then { _desiredAmmo = 0; _storeExtraMagazines = false; }; TRACE_3("settings",_emptyWeapon,_desiredAmmo,_storeExtraMagazines); private _magsToRemove = []; private _loadedMagazineInfo = []; private _containerMagazineClassnames = []; private _containerMagazineCount = []; { _x params ["_xMag", "_xTurret", "_xAmmo"]; private _carryMag = _xMag call FUNC(getCarryMagazine); if (_carryMag != "") then { if ((_desiredAmmo > 0) && {_loadedMagazineInfo isEqualTo []}) then { private _loadedMagAmmo = _desiredAmmo min _xAmmo; _loadedMagazineInfo = [_xMag, _xTurret, _loadedMagAmmo]; _xAmmo = _xAmmo - _loadedMagAmmo; TRACE_1("",_loadedMagAmmo); }; if (_xAmmo > 0) then { _magsToRemove pushBackUnique [_xMag, _xTurret]; private _index = _containerMagazineClassnames find _carryMag; if (_index < 0) then { _index = _containerMagazineClassnames pushBack _carryMag; _containerMagazineCount pushBack 0; }; _containerMagazineCount set [_index, (_containerMagazineCount select _index) + _xAmmo]; }; } else { if ((_xMag select [0,4]) != "fake") then { WARNING_1("Unable to unload [%1] - No matching carry mag",_xMag); }; }; } forEach (magazinesAllTurrets _vehicle); TRACE_1("Remove all loaded magazines",_magsToRemove); { _vehicle removeMagazinesTurret _x; if ((_loadedMagazineInfo select [0,2]) isEqualTo _x) then { TRACE_1("Re-add the starting mag",_loadedMagazineInfo); _vehicle addMagazineTurret _loadedMagazineInfo; }; } forEach _magsToRemove; private _secondaryWeaponMagazines = _vehicle getVariable [QGVAR(secondaryWeaponMagazines), []]; if (_secondaryWeaponMagazines isNotEqualTo []) then { // Check if the static weapon can take magazines private _turret = (allTurrets _vehicle) param [0, []]; private _compatibleMagazinesTurret = flatten ((_vehicle weaponsTurret _turret) apply {compatibleMagazines _x}); private _container = objNull; { private _vehicleMag = [_vehicle, _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 { _vehicle addMagazineTurret [_vehicleMag, _turret, _x select 1]; } else { // Find a suitable container to place items in if necessary if (isNull _container) then { _container = (nearestObjects [_vehicle, ["GroundWeaponHolder"], 10]) param [0, objNull]; // Create ammo storage container if (isNull _container) then { _container = createVehicle ["GroundWeaponHolder", getPosATL _vehicle, [], 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; _vehicle setVariable [QGVAR(secondaryWeaponMagazines), nil, true]; }; if (_storeExtraMagazines) then { TRACE_1("saving extra mags to container",_containerMagazineCount); { [_vehicle, _x, _containerMagazineCount select _forEachIndex] call FUNC(reload_handleReturnAmmo); } forEach _containerMagazineClassnames; };