CSW - Add primary weapon support (#10284)

* Add primary weapon support for CSW

* Update addons/csw/functions/fnc_assemble_deployWeapon.sqf

Co-authored-by: PabstMirror <pabstmirror@gmail.com>

* Update crew-served-weapons-framework.md

---------

Co-authored-by: PabstMirror <pabstmirror@gmail.com>
This commit is contained in:
johnb432
2024-09-08 09:15:50 +02:00
committed by GitHub
parent 6bc3277c54
commit 067f5f8cf2
6 changed files with 43 additions and 16 deletions

View File

@ -20,4 +20,7 @@ params ["_target", "_player"];
// If the current launcher has a config-value that defines the tripod, it is a CSW
(alive _target) &&
{(getText (configFile >> "CfgWeapons" >> secondaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> typeOf _target)) != ""}
{
(getText (configFile >> "CfgWeapons" >> secondaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> typeOf _target)) != "" ||
{(getText (configFile >> "CfgWeapons" >> primaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> typeOf _target)) != ""}
}

View File

@ -21,8 +21,19 @@
[{
params ["_tripod", "_player"];
private _tripodClassname = typeOf _tripod;
private _assembledClassname = getText (configFile >> "CfgWeapons" >> secondaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname);
private _index = 1;
if (_assembledClassname == "") then {
_assembledClassname = getText (configFile >> "CfgWeapons" >> primaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname);
_index = 0;
};
if (!isClass (configFile >> "CfgVehicles" >> _assembledClassname)) exitWith {ERROR_1("bad static classname [%1]",_assembledClassname);};
// Save magazines and attachments (handle loaded launchers which can become csw like CUP Metis)
private _carryWeaponInfo = (getUnitLoadout _player) select 1;
private _carryWeaponInfo = (getUnitLoadout _player) select _index;
private _carryWeaponClassname = _carryWeaponInfo deleteAt 0;
// Remove empty entries
@ -30,15 +41,9 @@
TRACE_3("assemble_deployWeapon_carryWeaponClassname",_tripod,_player,_carryWeaponClassname);
private _tripodClassname = typeOf _tripod;
private _weaponConfig = configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON);
private _assembledClassname = getText (_weaponConfig >> "assembleTo" >> _tripodClassname);
if (!isClass (configFile >> "CfgVehicles" >> _assembledClassname)) exitWith {ERROR_1("bad static classname [%1]",_assembledClassname);};
_player removeWeaponGlobal _carryWeaponClassname;
private _deployTime = getNumber (_weaponConfig >> "deployTime");
private _deployTime = getNumber (configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "deployTime");
TRACE_4("",_carryWeaponClassname,_tripodClassname,_assembledClassname,_deployTime);

View File

@ -20,9 +20,14 @@
params ["_target", "_player", "", "_actionData"];
private _carryWeaponClassname = secondaryWeapon _player;
private _assembleTo = getText (configFile >> "CfgWeapons" >> _carryWeaponClassname >> QUOTE(ADDON) >> "assembleTo" >> typeOf _target);
private _icon = getText (configFile >> "CfgVehicles" >> _assembleTo >> "picture");
TRACE_2("",_assembleTo,_icon);
private _tripodClassname = typeOf _target;
private _assembledClassname = getText (configFile >> "CfgWeapons" >> secondaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname);
if (_assembledClassname == "") then {
_assembledClassname = getText (configFile >> "CfgWeapons" >> primaryWeapon _player >> QUOTE(ADDON) >> "assembleTo" >> _tripodClassname);
};
private _icon = getText (configFile >> "CfgVehicles" >> _assembledClassname >> "picture");
TRACE_2("",_assembledClassname,_icon);
_actionData set [2, _icon];

View File

@ -58,7 +58,9 @@
if (_carryWeaponMag isEqualTo [] && {_carryMag in _carryWeaponMags}) then {
TRACE_3("Adding mag to secondary weapon",_xMag,_xAmmo,_carryMag);
_carryWeaponMag = [_carryMag, _xAmmo];
DEC(_xAmmo);
// Do not return this magazine, as it will be put into the weapon
continue;
};
if ((_xAmmo > 0) && {_carryMag != ""}) then {
TRACE_2("Removing ammo",_xMag,_carryMag);
@ -82,8 +84,19 @@
[{
params ["_player", "_weaponPos", "_carryWeaponClassname", "_carryWeaponMag", "_turretClassname"];
private _carryWeaponType = _carryWeaponClassname call EFUNC(common,getWeaponType);
if !(_carryWeaponType in [1, 2]) exitWith {
ERROR_1("bad carry weapon type [%1]",_carryWeaponClassname);
if (_carryWeaponMag isEqualTo []) exitWith {};
// Return the ammo, so it doesn't vanish
[_player, _carryWeaponMag select 0, _carryWeaponMag select 1] call FUNC(reload_handleReturnAmmo);
};
// Give the weapon to the player if possible
if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith {
if ((alive _player) && {([primaryWeapon _player, secondaryWeapon _player] select (_carryWeaponType - 1)) == ""}) exitWith {
[_player, _carryWeaponClassname] call CBA_fnc_addWeaponWithoutItems;
if (_carryWeaponMag isNotEqualTo []) then {

View File

@ -37,7 +37,7 @@ private _bestMagCount = -1;
_bestMagCount = _xAmmo;
};
};
} forEach (getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines"));
} forEach (compatibleMagazines _weapon);
} forEach (_vehicle weaponsTurret _turret);
TRACE_3("best fit",_desiredAmmo,_bestMag,_bestMagCount);

View File

@ -39,6 +39,7 @@ class CfgWeapons {
### 1.2 Carryable Weapon
Carried CSW weapons are technically rocket launchers. This allows the player to carry both a CSW weapon and a backpack with magazines for the CSW.
ACE 3.18.0 added support for primary weapons to be used as CSW weapons, but not tripods.
```cpp
class CfgWeapons {