ACE3/addons/arsenal/functions/fnc_onSelChangedRight.sqf
Grim 12905a0702
Arsenal - Fix #9040 bugs/regressions (#9293)
* fix saving loadout with weapon in container

* readd magazine refill
2023-07-28 07:53:53 +03:00

207 lines
11 KiB
Plaintext

#include "script_component.hpp"
#include "..\defines.hpp"
/*
* Author: Alganthe, johnb43
* Handles selection changes on the right panel.
*
* Arguments:
* 0: Right panel control <CONTROL>
* 1: Right panel selection <NUMBER>
*
* Return Value:
* None
*
* Public: No
*/
params ["_control", "_curSel"];
if (_curSel < 0) exitwith {};
private _display = ctrlParent _control;
private _item = _control lbData _curSel;
private _currentItemsIndex = IDX_CURR_PRIMARY_WEAPON_ITEMS + ([IDC_buttonPrimaryWeapon, IDC_buttonSecondaryWeapon, IDC_buttonHandgun, IDC_buttonBinoculars] find GVAR(currentLeftPanel));
private _itemIndex = [IDC_buttonMuzzle, IDC_buttonItemAcc, IDC_buttonOptic, IDC_buttonBipod, IDC_buttonCurrentMag, IDC_buttonCurrentMag2] find GVAR(currentRightPanel);
// Check which right panel has changed
switch (_currentItemsIndex) do {
// Primary weapon
case IDX_CURR_PRIMARY_WEAPON_ITEMS: {
private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select _itemIndex;
// If removal
if (_item == "") then {
private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select 5;
// If secondary magazine, make sure to remove from correct muzzle
if (_itemIndex == 5 && {_secondaryMagazine != ""} && {((GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select 4) == _secondaryMagazine}) then {
// Remove both magazines
GVAR(center) removePrimaryWeaponItem _secondaryMagazine;
GVAR(center) removePrimaryWeaponItem _secondaryMagazine;
// Add magazine back into primary muzzle
GVAR(center) addWeaponItem [primaryWeapon GVAR(center), _secondaryMagazine, true];
} else {
GVAR(center) removePrimaryWeaponItem _currentItemInSlot;
};
} else {
// Don't add item if it isn't a magazine or a different item than what the unit already has
if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then {
// If magazine, make sure to add to correct muzzle
if (_itemIndex >= 4) then {
private _weapon = primaryWeapon GVAR(center);
GVAR(center) addWeaponItem [_weapon, [_item, nil, (_weapon call CBA_fnc_getMuzzles) param [_itemIndex - 4, ""]], true];
} else {
GVAR(center) addWeaponItem [primaryWeapon GVAR(center), _item, true];
};
};
};
// Update currentItems
(getUnitLoadout GVAR(center) select IDX_LOADOUT_PRIMARY_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"];
GVAR(currentItems) set [IDX_CURR_PRIMARY_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine param [0, ""], _secondaryMagazine param [0, ""]]];
[_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo);
};
// Secondary weapon
case IDX_CURR_SECONDARY_WEAPON_ITEMS: {
private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select _itemIndex;
private _isDisposable = CBA_disposable_replaceDisposableLauncher && {!isNil {CBA_disposable_loadedLaunchers getVariable (secondaryWeapon GVAR(center))}};
// If removal
if (_item == "") then {
// Don't unload magazines from diposable weapons
if (_isDisposable && {_itemIndex >= 4}) exitWith {
TRACE_1("Ignoring unload of magazine from disposable",secondaryWeapon GVAR(center));
};
private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select 5;
// If secondary magazine, make sure to remove from correct muzzle
if (_itemIndex == 5 && {_secondaryMagazine != ""} && {((GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select 4) == _secondaryMagazine}) then {
// Remove both magazines
GVAR(center) removeSecondaryWeaponItem _secondaryMagazine;
GVAR(center) removeSecondaryWeaponItem _secondaryMagazine;
// Add magazine back into primary muzzle
GVAR(center) addWeaponItem [secondaryWeapon GVAR(center), _secondaryMagazine, true];
} else {
GVAR(center) removeSecondaryWeaponItem _currentItemInSlot;
};
} else {
// Don't add item if it isn't a magazine or a different item than what the unit already has
if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then {
// If magazine, make sure to add to correct muzzle
if (_itemIndex >= 4) then {
private _weapon = secondaryWeapon GVAR(center);
GVAR(center) addWeaponItem [_weapon, [_item, nil, (_weapon call CBA_fnc_getMuzzles) param [_itemIndex - 4, ""]], true];
} else {
GVAR(center) addWeaponItem [secondaryWeapon GVAR(center), _item, true];
};
};
};
// Update currentItems
if !(_isDisposable && {_itemIndex >= 4}) then {
(getUnitLoadout GVAR(center) select IDX_LOADOUT_SECONDARY_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"];
GVAR(currentItems) set [IDX_CURR_SECONDARY_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine param [0, ""], _secondaryMagazine param [0, ""]]];
};
[_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo);
};
// Handgun weapon
case IDX_CURR_HANDGUN_WEAPON_ITEMS: {
private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select _itemIndex;
if (_item == "") then {
private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select 5;
// If secondary magazine, make sure to remove from correct muzzle
if (_itemIndex == 5 && {_secondaryMagazine != ""} && {((GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select 4) == _secondaryMagazine}) then {
// Remove both magazines
GVAR(center) removeHandgunItem _secondaryMagazine;
GVAR(center) removeHandgunItem _secondaryMagazine;
// Add magazine back into primary muzzle
GVAR(center) addWeaponItem [handgunWeapon GVAR(center), _secondaryMagazine, true];
} else {
GVAR(center) removeHandgunItem _currentItemInSlot;
};
} else {
// Don't add item if it isn't a magazine or a different item than what the unit already has
if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then {
// If magazine, make sure to add to correct muzzle
if (_itemIndex >= 4) then {
private _weapon = handgunWeapon GVAR(center);
GVAR(center) addWeaponItem [_weapon, [_item, nil, (_weapon call CBA_fnc_getMuzzles) param [_itemIndex - 4, ""]], true];
} else {
GVAR(center) addWeaponItem [handgunWeapon GVAR(center), _item, true];
};
};
};
// Update currentItems
(getUnitLoadout GVAR(center) select IDX_LOADOUT_HANDGUN_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"];
// https://feedback.bistudio.com/T173880
_primaryMagazine = _primaryMagazine param [0, ""];
private _handgunMagazines = handgunMagazine GVAR(center);
// Delete the first magazine (but keep one if both magazines are the same)
_handgunMagazines deleteAt (_handgunMagazines findIf {_x == _primaryMagazine});
GVAR(currentItems) set [IDX_CURR_HANDGUN_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine, _handgunMagazines param [0, ""]]];
[_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo);
};
// Binoculars
case IDX_CURR_BINO_ITEMS: {
private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select _itemIndex;
if (_item == "") then {
private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select 5;
// If secondary magazine, make sure to remove from correct muzzle
if (_itemIndex == 5 && {_secondaryMagazine != ""} && {((GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select 4) == _secondaryMagazine}) then {
// Remove both magazines
GVAR(center) removeBinocularItem _secondaryMagazine;
GVAR(center) removeBinocularItem _secondaryMagazine;
// Add magazine back into primary muzzle
GVAR(center) addWeaponItem [binocular GVAR(center), _secondaryMagazine, true];
} else {
GVAR(center) removeBinocularItem _currentItemInSlot;
};
} else {
// Don't add item if it isn't a magazine or a different item than what the unit already has
if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then {
// If magazine, make sure to add to correct muzzle
if (_itemIndex >= 4) then {
private _weapon = binocular GVAR(center);
GVAR(center) addWeaponItem [_weapon, [_item, nil, (_weapon call CBA_fnc_getMuzzles) param [_itemIndex - 4, ""]], true];
} else {
GVAR(center) addWeaponItem [binocular GVAR(center), _item, true];
};
};
};
// Update currentItems
(getUnitLoadout GVAR(center) select IDX_LOADOUT_BINO) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"];
// https://feedback.bistudio.com/T173880 (unsure if binocular weapons are affected by this)
_primaryMagazine = _primaryMagazine param [0, ""];
private _binocularMagazines = binocularMagazine GVAR(center);
// Delete the first magazine (but keep one if both magazines are the same)
_binocularMagazines deleteAt (_binocularMagazines findIf {_x == _primaryMagazine});
GVAR(currentItems) set [IDX_CURR_BINO_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine, _binocularMagazines param [0, ""]]];
[_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo);
};
};
// Update weight display
(_display displayCtrl IDC_totalWeightText) ctrlSetText (format ["%1 (%2)", GVAR(center) call EFUNC(common,getWeight), [GVAR(center), 1] call EFUNC(common,getWeight)]);