mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
8763184b6a
* Dragon work cleanup remove unused p3ds add pos_gunner_dir/pos_gunner to static add [csw] prefix to arsenal version add sight interaction icons * Update fnc_staticWeaponInit_unloadExtraMags.sqf * ace_rearm compat allows pulling carry mags out of rearm trucks * Update fnc_ai_handleFired.sqf * Re-add 3den attributes * cleanup and move A2 staticweapon strings to ace_csw
97 lines
3.8 KiB
Plaintext
97 lines
3.8 KiB
Plaintext
#include "script_component.hpp"
|
|
/*
|
|
* Author: PabstMirror
|
|
* Initializes weapon to disable weapon disassembling
|
|
*
|
|
* Arguments:
|
|
* 0: Weapon <OBJECT>
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*
|
|
* Example:
|
|
* [weapon] call ace_csw_fnc_ai_handleFired
|
|
*
|
|
* Public: No
|
|
*/
|
|
|
|
params ["_staticWeapon", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_gunner"];
|
|
TRACE_8("firedEH:",_staticWeapon, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _gunner);
|
|
|
|
if ((!local _gunner) || {[_gunner] call EFUNC(common,isPlayer)}) exitWith {};
|
|
if (someAmmo _staticWeapon) exitWith {};
|
|
|
|
TRACE_2("need ammo",someAmmo _staticWeapon,magazinesAllTurrets _staticWeapon);
|
|
|
|
private _turretPath = [_gunner] call EFUNC(common,getTurretIndex);
|
|
private _reloadSource = objNull;
|
|
private _reloadMag = "";
|
|
private _reloadNeededAmmo = -1;
|
|
|
|
// Find if there is anything we can reload with
|
|
{
|
|
scopeName "findSource";
|
|
private _xSource = _x;
|
|
|
|
private _cswMagazines = [];
|
|
{
|
|
if (isClass (configFile >> QGVAR(groups) >> _x)) then { _cswMagazines pushBackUnique _x; };
|
|
} forEach (if (_xSource isKindOf "CaManBase") then {magazines _x} else {magazineCargo _x});
|
|
TRACE_2("",_xSource,_cswMagazines);
|
|
|
|
private _compatibleMags = [_magazine] + ([_weapon] call CBA_fnc_compatibleMagazines); // Check current mag first
|
|
|
|
{
|
|
private _xWeaponMag = _x;
|
|
{
|
|
if ((getNumber (configFile >> QGVAR(groups) >> _x >> _xWeaponMag)) == 1) then {
|
|
private _loadInfo = [_staticWeapon, _turretPath, _reloadMag, objNull] call FUNC(reload_canLoadMagazine);
|
|
if (_loadInfo select 0) then {
|
|
_reloadMag = _x;
|
|
_reloadSource = _xSource;
|
|
_reloadNeededAmmo = _loadInfo select 2;
|
|
TRACE_3("found mag",_reloadMag,_reloadSource,_x);
|
|
breakOut "findSource";
|
|
};
|
|
};
|
|
} forEach _cswMagazines;
|
|
} forEach _compatibleMags;
|
|
} forEach ([_gunner] + (_staticWeapon nearEntities [["groundWeaponHolder", "ReammoBox_F"], 10]));
|
|
if (_reloadMag == "") exitWith {TRACE_1("could not find mag",_reloadMag);};
|
|
|
|
// Figure out what we can add from the magazines we have
|
|
private _bestAmmoToSend = -1;
|
|
{
|
|
_x params ["_xMag", "_xAmmo"];
|
|
TRACE_2("",_xMag,_xAmmo);
|
|
if (_xMag == _reloadMag) then {
|
|
if ((_bestAmmoToSend == -1) || {(_xAmmo > _bestAmmoToSend) && {_xAmmo <= _reloadNeededAmmo}}) then {
|
|
_bestAmmoToSend = _xAmmo;
|
|
};
|
|
};
|
|
} forEach (if (_reloadSource isKindOf "CaManBase") then {magazinesAmmo _reloadSource} else {magazinesAmmoCargo _reloadSource});
|
|
TRACE_4("",_reloadSource,_reloadMag,_reloadNeededAmmo,_bestAmmoToSend);
|
|
if (_bestAmmoToSend == -1) exitWith {ERROR("No ammo");};
|
|
|
|
// Remove the mag from the source
|
|
if (_reloadSource isKindOf "CaManBase") then {
|
|
[_reloadSource, _reloadMag, _bestAmmoToSend] call EFUNC(common,removeSpecificMagazine);
|
|
} else {
|
|
[_reloadSource, _reloadMag, 1, _bestAmmoToSend] call CBA_fnc_removeMagazineCargo;
|
|
};
|
|
|
|
private _timeToLoad = 1;
|
|
if (!isNull(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "ammoLoadTime")) then {
|
|
_timeToLoad = getNumber(configFile >> "CfgVehicles" >> (typeOf _staticWeapon) >> QUOTE(ADDON) >> "ammoLoadTime");
|
|
};
|
|
|
|
TRACE_1("Reloading in progress",_timeToLoad);
|
|
[{
|
|
params ["_staticWeapon", "_turretPath", "_gunner", "_reloadMag", "_bestAmmoToSend"];
|
|
if ((!alive _staticWeapon) || {!alive _gunner} || {(_staticWeapon distance _gunner) > 10}) exitWith {TRACE_1("invalid state",_this);};
|
|
|
|
// Reload the static weapon
|
|
TRACE_5("calling addTurretMag event",_staticWeapon, _turretPath, _gunner, _reloadMag, _bestAmmoToSend);
|
|
[QGVAR(addTurretMag), _this] call CBA_fnc_globalEvent;
|
|
}, [_staticWeapon, _turretPath, _gunner, _reloadMag, _bestAmmoToSend], _timeToLoad] call CBA_fnc_waitAndExecute;
|