From a3a91d4f45b22fd487ecbc954ad979be5d03efdd Mon Sep 17 00:00:00 2001 From: hybrid Date: Thu, 11 Jun 2026 19:38:09 +0300 Subject: init --- Client/GUI/GUI_GearAce.sqf | 1415 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1415 insertions(+) create mode 100644 Client/GUI/GUI_GearAce.sqf (limited to 'Client/GUI/GUI_GearAce.sqf') diff --git a/Client/GUI/GUI_GearAce.sqf b/Client/GUI/GUI_GearAce.sqf new file mode 100644 index 0000000..e92a7e2 --- /dev/null +++ b/Client/GUI/GUI_GearAce.sqf @@ -0,0 +1,1415 @@ +private ["_indexWeapons", "_indexMagazines", "_indexOnBack", "_indexRuckWeapons", "_indexRuckMags", "_indexPrimary", "_indexSecondary", "_indexSidearm", "_typesIFAK", "_filterNames", "_primary", "_secondary", "_sidearm", "_misc", "_magazine", "_all", "_primaryBackpack", "_secondaryBackpack", "_sidearmBackpack", "_miscBackpack", "_allBackpack", "_currentGear", "_currentWeaponUIState", "_currentMagazineUIState", "_getCompatibleMagazines", "_weapon", "_weaponMags", "_mags", "_muzzles", "_getItemDataByConfigType", "_data", "_configType", "_item", "_W", "_getItemDataByFilterType", "_filter", "_get", "_inventoryToGear", "_ret", "_unit", "_backwep", "_current", "_ruckmags", "_ruckweapons", "_safeArray", "_getItemCost", "_itemName", "_getItemWeight", "_getRuckItemsVolume", "_gear", "_volume", "_getGearCost", "_price", "_cost", "_getGearWeight", "_weight", "_totalWeight", "_fillInBlankImages", "_i", "_renderGear", "_pic", "_itemIndex", "_specialIndex", "_mainMagIndex", "_sideMagIndex", "_ifakCount", "_isIFAK", "_wob", "_weaponUIState", "_magazineUIState", "_magazineSpace", "_forEachIndex", "_getItemCountByType", "_count", "_itemType", "_countThisOne", "_renderRuckContents", "_u", "_capacity", "_getGearRuck", "_getMagazineCountByPool", "_handgunpool", "_addMagazineToGear", "_magCount", "_magLimit", "_magSize", "_oldMagazines", "_applyGearToUnit", "_maybeRuck", "_addItemToRuck", "_ruck", "_size", "_added", "_packable", "_currentUnit", "_initialCost", "_updateGear", "_updateMainList", "_updateSecondaryList", "_updateUnit", "_backpackSelected", "_selectedWeapon", "_currentFilter", "_defaultWeap", "_defaultAmmo", "_defaultLoadoutCost", "_lbSelChanged", "_mainCommand", "_inventoryClick", "_gearAction", "_weaponList", "_magazineList", "_funds", "_respawnCost", "_mag", "_ruckIndex", "_ruckItemClass", "_ruckItem", "_add", "_itemCount", "_temp", "_respawnPenalty","_divisor"]; + +_indexWeapons = 0; +_indexMagazines = 1; +_indexOnBack = 2; +_indexRuckWeapons = 3; +_indexRuckMags = 4; +_indexPrimary = 5; +_indexSecondary = 6; +_indexSidearm = 7; +_typesIFAK = [ "ACE_Morphine", "ACE_Bandage", "ACE_Epinephrine" ]; +_filterNames = [ "all", "primary", "secondary", "sidearm", "misc" ]; + +_primary = +(WF_Logic getVariable 'primaryClasses'); +_secondary = +(WF_Logic getVariable 'secondaryClasses'); +_sidearm = +(WF_Logic getVariable 'sidearmClasses'); +_misc = +(WF_Logic getVariable 'miscClasses'); +_magazine = +(WF_Logic getVariable 'magazineClasses'); + +_all = _primary + _secondary + _sidearm + _misc; + +_primaryBackpack = []; +_secondaryBackpack = []; +_sidearmBackpack = _sidearm; +_miscBackpack = _misc + _magazine; +_allBackpack = _misc + _sidearm + _magazine; + +// Gear Array. Many methods use this format. It is: +// 0: Weapons +// 1: Magazines +// 2: ACE weapon on back +// 3: Weapons in rucksack as a sequence of doubles: [ item, quantity ] +// 4: Magazines in rucksack as a sequence of doubles: [ item, quantity ] +// 5: Current primary weapon +// 6: Current secondary weapon +// 7: Current sidearm +_currentGear = [ [], [], "", [], [], "", "", "" ]; + +// The following twe are arrays of doubles. Each double is [id, index] that maps +// UI controls to gear in the _currentGear structure. +// +// id: Control ID of a control in the gear dialog. +// index: index into the magazine or weapon array in _currentGear that corresponds to the +// weapon or magazine represented by the control in question. +_currentWeaponUIState = []; +_currentMagazineUIState = []; + +// Given a weapon class, get the magazines that will fit in it. +_getCompatibleMagazines = +{ + private ["_weapon","_weaponMags","_mags","_muzzles","_supportedMags","_csw"]; + + _weapon = _this; + _weaponMags = []; + _supportedMags = _magazine + _misc; + + _csw = ""; + + if(isText(configFile >> "CfgWeapons" >> _weapon >> "ace_crewmgtype")) then + { + _csw = getText(configFile >> "CfgWeapons" >> _weapon >> "ace_crewmgtype"); + }; + + if(_csw == "" && isText(configFile >> "CfgWeapons" >> _weapon >> "ace_crewtripodtype")) then + { + _csw = getText(configFile >> "CfgWeapons" >> _weapon >> "ace_crewtripodtype"); + }; + + if(_csw != "") then + { + _mags = getArray(configFile >> "CfgVehicles" >> _csw >> "ace_crewdummymags"); + if(!isNil "_mags") then + { + { + if(!(_x in _weaponMags) && _x in _supportedMags) then + { + _weaponMags = _weaponMags + [ _x ]; + }; + } forEach(_mags); + }; + } + else + { + // Disposable weapons have no magazines. + if(getNumber(configFile >> "CfgWeapons" >> _weapon >> "ace_disposable") != 1) then + { + // Main muzzle magazines... + _mags = getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines"); + if (!isNil "_mags") then + { + { + if(!(_x in _weaponMags) && _x in _supportedMags) then + { + _weaponMags = _weaponMags + [ _x ]; + }; + } forEach(_mags); + }; + + _muzzles = getArray (configFile >> "CfgWeapons" >> _weapon >> "muzzles"); + if(!isNil "_muzzles") then + { + { + if ((typeName _x) == "STRING") then + { + _mags = getArray (configFile >> "CfgWeapons" >> _weapon >> _x >> "magazines"); + if (!isNil "_mags") then + { + { + if(!(_x in _weaponMags) && _x in _supportedMags) then + { + _weaponMags = _weaponMags + [_x]; + }; + } forEach(_mags); + }; + }; + } forEach(_muzzles); + }; + }; + }; + _weaponMags +}; + +// arg 0: item class +// arg 1: true if weapon, false if magazine +// returns item data +_getItemDataByConfigType = +{ + private ["_data", "_configType", "_item"]; + + _item = _this select 0; + _configType = _this select 1; + _data = nil; + if(_configType && !(isNil "_item")) then + { + _data = (_item+'_W') Call GetNamespace; + }; + if(isNil "_data") then + { + _data = _item Call GetNamespace; + }; + _data +}; + +// arg 0: item class +// arg 1: filter type e.g. "all" or "sidearm" +// returns item data +_getItemDataByFilterType = +{ + private [ "_item", "_filter", "_get" ]; + + _item = _this select 0; + _filter = _this select 1; + + if (_filter == 'secondary' || _filter == 'all') then { + _get = (_item+'_W') Call GetNamespace; + if (isNil '_get') then { + _get = _item Call GetNamespace; + }; + } else { + _get = _item Call GetNamespace; + }; + _get +}; + +// Argument 0: a unit +// +// Takes that unit's inventory and returns a gear array from it (see above). +_inventoryToGear = { + private ["_ret","_unit","_backwep","_get","_current","_ruckmags","_ruckweapons","_temp"]; + + _unit = _this select 0; + + _ret = [ [], [], "", [], [], "", "", "" ]; + + _backwep = _unit getVariable "ACE_weapononback"; + if (!isNil "_backwep") then + { + if ((typeName _backwep) == "STRING") then + { + _ret set [ _indexOnBack, _backwep ]; + }; + }; + + _temp = []; + { + _get = [ _x, true ] call _getItemDataByConfigType; + if(!isNil "_get") then + { + _temp = _temp + [_x]; + }; + } forEach(weapons _unit); + _ret set [ _indexWeapons, _temp ]; + + _temp = []; + { + _get = [ _x, false ] call _getItemDataByConfigType; + if(!isNil "_get") then + { + _temp = _temp + [_x]; + }; + } forEach(magazines _unit); + _ret set [ _indexMagazines, _temp ]; + + _get = [ primaryWeapon _unit, true ] call _getItemDataByConfigType; + if(!isNil "_get") then + { + _ret set [ _indexPrimary, primaryWeapon _unit ]; + } + else + { + _ret set [ _indexPrimary, "" ]; + }; + + _get = [ secondaryWeapon _unit, true ] call _getItemDataByConfigType; + if(!isNil "_get") then + { + _ret set [ _indexSecondary, secondaryWeapon _unit ]; + } + else + { + _ret set [ _indexSecondary, "" ]; + }; + + { + if (_x in _sidearm) exitWith + { + _ret set [ _indexSidearm, _x ]; + }; + } forEach(_ret select _indexWeapons); + + if ([_unit] call ACE_fnc_HasRuck) then { + _ruckmags = _unit getVariable "ACE_RuckMagContents"; + _ruckweapons = _unit getVariable "ACE_RuckWepContents"; + if(!isNil "_ruckweapons") then + { + _temp = []; + { + _get = [ _x select 0, true ] call _getItemDataByConfigType; + if(!isNil "_get") then + { + _temp = _temp + [_x]; + }; + } forEach(_ruckweapons); + _ret set [ _indexRuckWeapons, _temp ]; + }; + if(!isNil "_ruckmags") then + { + _temp = []; + { + _get = [ _x select 0, false ] call _getItemDataByConfigType; + if(!isNil "_get") then + { + _temp = _temp + [_x]; + }; + } forEach(_ruckmags); + _ret set [ _indexRuckMags, _temp ]; + }; + }; + + _ret +}; + +// Get an item's cost. +// Arguments [ item-name, is-weapon ] +// is-weapon is true for weapons or false for magazines +_getItemCost = +{ + private ["_itemName", "_configType","_ret","_get"]; + _itemName = _this select 0; + _configType = _this select 1; + _get = [ _itemName, _configType] call _getItemDataByConfigType; + _ret = 0; + if(!isNil "_get") then + { + _ret = _get select QUERYGEARCOST; + }; + _ret +}; + +// Get an item's weight +// Arguments [ item-name, config-type ] +// config-type is usually CfgWeapons or CfgMagazines. +_getItemWeight = +{ + private ["_itemName", "_configType","_ret"]; + _itemName = _this select 0; + _configType = _this select 1; + _ret = getNumber (configFile >> _configType >> _itemName >> "ACE_Weight"); + _ret +}; + +// arg: gear array +// returns: total volume of gear in ruck sack +_getRuckItemsVolume = +{ + private ["_gear", "_volume"]; + + _gear = _this; + _volume = 0; + + { + _volume = _volume + + (getNumber(configFile >> "CfgWeapons" >> (_x select 0) >> "ACE_size") * (_x select 1)); + } forEach(_gear select _indexRuckWeapons); + + { + _volume = _volume + + (getNumber(configFile >> "CfgMagazines" >> (_x select 0) >> "ACE_size") * (_x select 1)); + } forEach(_gear select _indexRuckMags); + _volume +}; + +// Takes a gear array for an argument and returns its cost. +_getGearCost = +{ + private ["_gear","_get","_price","_cost"]; + + _gear = _this; + _price = 0; + + { + _cost = [_x, true] call _getItemCost; + if(!isNil "_cost") then + { + _price = _price + _cost; + }; + } forEach(_gear select _indexWeapons); + + { + _cost = [_x, false] call _getItemCost; + if(!isNil "_cost") then + { + _price = _price + _cost; + }; + } forEach(_gear select _indexMagazines); + + if((_gear select _indexOnBack) != "") then + { + _cost = [_gear select _indexOnBack, true] call _getItemCost; + if(!isNil "_cost") then + { + _price = _price + _cost; + }; + }; + + { + _cost = [_x select 0, true] call _getItemCost; + if(!isNil "_cost") then + { + _price = _price + (_cost * (_x select 1)); + }; + } forEach(_gear select _indexRuckWeapons); + + { + _cost = [_x select 0, false] call _getItemCost; + if(!isNil "_cost") then + { + _price = _price + (_cost * (_x select 1)); + }; + } forEach(_gear select _indexRuckMags); + _price +}; + +// Takes a gear array for an argument and returns its totalweight. +_getGearWeight = +{ + private ["_gear","_get","_weight","_totalWeight"]; + + _gear = _this; + _totalWeight = 0; + + { + _weight = [_x, "CfgWeapons"] call _getItemWeight; + if(!isNil "_weight") then + { + _totalWeight = _totalWeight + _weight; + }; + } forEach(_gear select _indexWeapons); + + { + _weight = [_x, "CfgMagazines"] call _getItemWeight; + if(!isNil "_weight") then + { + _totalWeight = _totalWeight + _weight; + }; + } forEach(_gear select _indexMagazines); + + _weight = [_gear select _indexOnBack, "CfgWeapons"] call _getItemWeight; + if(!isNil "_weight") then + { + _totalWeight = _totalWeight + _weight; + }; + + { + _weight = [_x select 0, "CfgWeapons"] call _getItemWeight; + if(!isNil "_weight") then + { + _totalWeight = _totalWeight + (_weight * (_x select 1)); + }; + } forEach(_gear select _indexRuckWeapons); + + { + _weight = [_x select 0, "CfgMagazines"] call _getItemWeight; + if(!isNil "_weight") then + { + _totalWeight = _totalWeight + (_weight * (_x select 1)); + }; + } forEach(_gear select _indexRuckMags); + _totalWeight +}; + +// Fill in base blank-slot images to the UI +_fillInBlankImages = +{ + ctrlSetText [107, "\ca\ui\data\ui_gear_gun_gs.paa"]; + ctrlSetText [108, "\ca\ui\data\ui_gear_sec_gs.paa"]; + + for "_i" from 109 to 120 do + { + ctrlSetText [_i, "\ca\ui\data\ui_gear_mag_gs.paa"]; + }; + + ctrlSetText [121, "\ca\ui\data\ui_gear_hgun_gs.paa"]; + + for "_i" from 122 to 129 do + { + ctrlSetText [_i, "\ca\ui\data\ui_gear_hgunmag_gs.paa"]; + }; + + for "_i" from 130 to 131 do + { + ctrlSetText [_i, "\ca\ui\data\ui_gear_eq_gs.paa"]; + }; + + for "_i" from 134 to 145 do + { + ctrlSetText [_i, "\ca\ui\data\ui_gear_eq_gs.paa"]; + }; + + ctrlSetText [90020, "\ca\ui\data\ui_gear_gun_gs.paa"]; + ctrlSetText [90104, "\x\ace\addons\sys_wounds\data\equip\m_morphine_ca.paa"]; + ctrlSetText [90105, "\x\ace\addons\sys_wounds\data\equip\m_bandage_ca.paa"]; + ctrlSetText [90106, "\x\ace\addons\sys_wounds\data\equip\m_epi_ca.paa"]; +}; + +// Takes a gear array and renders it to the UI +// Returns an array of 2 arrays. The 2 arrays returned are of the format of +// _currentWeaponUIState and _currentMagazineUIState respectively. See top of file +// for details. +_renderGear = +{ + private ["_gear","_get","_pic","_itemIndex","_specialIndex","_mainMagIndex","_sideMagIndex","_ifakCount","_item","_isIFAK","_wob", + "_weight","_weaponUIState", "_magazineUIState","_magazineSpace"]; + _gear = _this; + + call _fillInBlankImages; + + _specialIndex = 0; + _mainMagIndex = 0; + _sideMagIndex = 0; + _itemIndex = 0; + _ifakCount = [ 0, 0, 0 ]; + _isIFAK = false; + _weaponUIState = []; + _magazineUIState = []; + + { + _get = [_x, true] call _getItemDataByConfigType; + if (!isNil "_get") then + { + _pic = _get select QUERYGEARPICTURE; + if((_get select QUERYGEARTYPE) == "Item" && _itemIndex < 12) then + { + ctrlSetText [134+_itemIndex, _pic]; + _weaponUIState = _weaponUIState + [ [134+_itemIndex, _forEachIndex] ]; + _itemIndex = _itemIndex + 1; + } + else + { + if (_x == (_gear select _indexPrimary)) then + { + ctrlSetText [107, _pic]; + _weaponUIState = _weaponUIState + [ [107, _forEachIndex] ]; + } + else + { + if(_x == (_gear select _indexSecondary)) then + { + _weaponUIState = _weaponUIState + [ [108, _forEachIndex] ]; + ctrlSetText [108, _pic]; + } + else + { + if(_x == (_gear select _indexSidearm)) then + { + _weaponUIState = _weaponUIState + [ [121, _forEachIndex] ]; + ctrlSetText [121, _pic]; + } + else + { + ctrlSetText [130+_specialIndex, _pic]; + _weaponUIState = _weaponUIState + [ [130+_specialIndex, _forEachIndex] ]; + _specialIndex = _specialIndex + 1; + }; + }; + }; + }; + }; + } forEach(_gear select _indexWeapons); + + { + _get = [_x, false] call _getItemDataByConfigType; + if (!isNil "_get") then + { + _item = _x; + _isIFAK = false; + { + if(_x == _item && + (_ifakCount select _forEachIndex) < 2) exitWith + { + _ifakCount set [_forEachIndex, (_ifakCount select _forEachIndex) + 1]; + _isIFAK = true; + }; + } forEach(_typesIFAK); + + if(!_isIFAK) then + { + _pic = _get select QUERYGEARPICTURE; + _magazineSpace = _get select QUERYGEARSPACE; + if(_magazineSpace < 1) then + { + _magazineSpace = 1; + }; + if(!(_get select QUERYGEARHANDGUNPOOL)) then + { + if((_mainMagIndex + _magazineSpace) <= 12) then + { + ctrlSetText [109+_mainMagIndex, _pic]; + _magazineUIState = _magazineUIState + [ [109+_mainMagIndex, _forEachIndex] ]; + _mainMagIndex = _mainMagIndex + 1; + + _magazineSpace = _magazineSpace - 1; + while { _magazineSpace > 0 } do + { + ctrlSetText [109+_mainMagIndex, ""]; + _magazineSpace = _magazineSpace - 1; + _mainMagIndex = _mainMagIndex + 1; + }; + }; + } + else + { + if((_sideMagIndex + _magazineSpace) <= 8) then + { + ctrlSetText [122+_sideMagIndex, _pic]; + _magazineUIState = _magazineUIState + [ [122+_sideMagIndex, _forEachIndex] ]; + _sideMagIndex = _sideMagIndex + 1; + + _magazineSpace = _magazineSpace - 1; + while { _magazineSpace > 0 } do + { + ctrlSetText [122+_sideMagIndex, ""]; + _magazineSpace = _magazineSpace - 1; + _sideMagIndex = _sideMagIndex + 1; + }; + }; + }; + }; + }; + } forEach(_gear select _indexMagazines); + + { + ctrlSetText [90107 + _forEachIndex, str _x]; + } forEach(_ifakCount); + + _wob = _gear select _indexOnBack; + + if(!isNil "_wob" && _wob != '') then + { + _get = [_wob, true] call _getItemDataByConfigType; + ctrlSetText [90020, _get select QUERYGEARPICTURE]; + }; + + _weight = _gear call _getGearWeight; + ctrlSetText [90009, format ["%1 kg", _weight]]; + + [ _weaponUIState, _magazineUIState ] +}; + +// Given a gear array, get the number of "special" items (binocs, rangefinder, etc.) in it. +// arg0: gear array +// arg1: type of item e.g. "Special" +// returns: number of that type contained in gear array. +_getItemCountByType = +{ + private [ "_gear", "_count", "_get", "_itemType", "_countThisOne" ]; + + _gear = _this select 0; + _itemType = _this select 1; + + _count = + { + _countThisOne = false; + _get = [ _x, true ] call _getItemDataByConfigType; + if (!isNil "_get" && (_get select QUERYGEARTYPE) == _itemType) then + { + _countThisOne = true; + } + else + { + _countThisOne = false; + }; + _countThisOne + } count (_gear select _indexWeapons); + _count +}; + +_renderRuckContents = +{ + private [ "_gear", "_get", "_i", "_u", "_capacity", "_volume" ]; + _gear = _this; + + lnbClear 3701; + _i = 0; + _u = 0; + _volume = 0; + { + _get = [ _x select 0, true ] call _getItemDataByConfigType; + if (!isNil "_get") then + { + lnbAddRow [3701,[str (_x select 1) + "x",(_get select QUERYGEARLABEL)]]; + lnbSetPicture [3701,[_i,0],_get select QUERYGEARPICTURE]; + lnbSetData [3701,[_i,0],"CfgWeapons"]; + lnbSetValue [3701,[_i,0],_u]; + _i = _i + 1; + _u = _u + 1; + _volume = _volume + getNumber(configFile >> "CfgWeapons" >> (_x select 0) >> "ACE_size") * (_x select 1); + }; + } forEach(_gear select _indexRuckWeapons); + + _u = 0; + { + _get = [ _x select 0, false ] call _getItemDataByConfigType; + if (!isNil "_get") then + { + lnbAddRow [3701,[str (_x select 1) + "x",(_get select QUERYGEARLABEL)]]; + lnbSetPicture [3701,[_i,0],_get select QUERYGEARPICTURE]; + lnbSetData [3701,[_i,0],"CfgMagazines"]; + lnbSetValue [3701,[_i,0],_u]; + _i = _i + 1; + _u = _u + 1; + _volume = _volume + getNumber(configFile >> "CfgMagazines" >> (_x select 0) >> "ACE_size") * (_x select 1); + }; + } forEach(_gear select _indexRuckMags); + + _capacity = getNumber(configFile >> "CfgWeapons" >> (_gear call _getGearRuck) >> "ACE_PackSize"); + ctrlSetText [90000, format [localize "STR_WF_Ruck_Space_Free", _capacity - _volume]]; +}; + +// arg0: gear array +// arg1: true if we are looking at handgun magazines +// returns number of magazines slots consumed (taking magazine size into account) +// in handgun pool or main pool (according to arg1) +_getMagazineCountByPool = +{ + private [ "_gear", "_get", "_handgunpool", "_count", "_isIFAK", "_ifakCount", "_item" ]; + + _gear = _this select 0; + _handgunpool = _this select 1; + _count = 0; + _ifakCount = [ 0, 0, 0 ]; + + { + _isIFAK = false; + _item = _x; + { + if(_x == _item && + (_ifakCount select _forEachIndex) < 2) exitWith + { + _ifakCount set [_forEachIndex, (_ifakCount select _forEachIndex) + 1]; + _isIFAK = true; + }; + } forEach(_typesIFAK); + + if (!_isIFAK) then + { + _get = [_item, false] call _getItemDataByConfigType; + if((_handgunpool && (_get select QUERYGEARHANDGUNPOOL)) || + (!_handgunpool && !(_get select QUERYGEARHANDGUNPOOL))) then + { + if((_get select QUERYGEARSPACE) == 0) then + { + _count = _count + 1; + } + else + { + _count = _count + (_get select QUERYGEARSPACE); + }; + }; + }; + } forEach(_gear select _indexMagazines); + _count +}; + +// arg0: gear array +// arg1: magazine to add +// arg2: (optional) item data on the magazine we are adding. +// Will only succeed if the magazine fits. +_addMagazineToGear = +{ + private [ "_gear", "_magazine", "_get", "_magCount", "_magLimit", "_magSize", "_oldMagazines" ]; + + _gear = _this select 0; + _magazine = _this select 1; + + if ((count _this) >= 3) then + { + _get = _this select 2; + } + else + { + _get = [_magazine, false] call _getItemDataByConfigType; + }; + + // Add magazines to a temporary copy of the gear array, and see if it's too much. + // This handles the IFAK stuff (infantry first aid kit) for us. + _oldMagazines = _gear select _indexMagazines; + _gear set [_indexMagazines, + _oldMagazines + [ _magazine ] ]; + _magCount = [ _gear, _get select QUERYGEARHANDGUNPOOL] call _getMagazineCountByPool; + _magLimit = if(_get select QUERYGEARHANDGUNPOOL) then { 8 } else { 12 }; + + // DEBUG + diag_log format ["WFBE (AceGear): magCount: %1 magLimit: %2 mag: ", _magCount, _magLimit, _magazine ]; + + if(_magCount > _magLimit) then + { + // Doesn't fit; revert back + _gear set [ _indexMagazines, _oldMagazines ]; + }; +}; + +// arg0: unit +// arg1: gear array +// equip that gear to the unit. +_applyGearToUnit = +{ + private ["_gear","_unit","_muzzles"]; + + _unit = _this select 0; + _gear = _this select 1; + + removeAllWeapons _unit; + removeAllItems _unit; + removeBackpack _unit; + {_unit addMagazine _x} foreach (_gear select _indexMagazines); + {_unit addWeapon _x} foreach (_gear select _indexWeapons); + if (primaryWeapon _unit != "") then + { + _unit selectWeapon (primaryWeapon _unit); + _muzzles = getArray(configFile>>"cfgWeapons" >> primaryWeapon _unit >> "muzzles"); + _unit selectWeapon (_muzzles select 0); + }; + + _safeArray = _gear select _indexRuckMags; + _unit setVariable ["ACE_RuckMagContents", +_safeArray]; + _safeArray = _gear select _indexRuckWeapons; + _unit setVariable ["ACE_RuckWepContents", +_safeArray]; + + if((_gear select _indexOnBack) != "") then + { + _unit setVariable ["ACE_weapononback", _gear select _indexOnBack]; + } + else + { + _unit setVariable ["ACE_weapononback", ""]; + }; +}; + +// arg: gear array +// returns: rucksack in gear or "" +_getGearRuck = +{ + private ["_gear","_maybeRuck"]; + + _gear = _this; + _maybeRuck = _gear select _indexSecondary; + if(!isNumber(configFile >> "CfgWeapons" >> _maybeRuck >> "ACE_PackSize")) then + { + _maybeRuck = _gear select _indexOnBack; + if(isClass(configFile >> "CfgWeapons" >> _maybeRuck)) then + { + if(!isNumber(configFile >> "CfgWeapons" >> _maybeRuck >> "ACE_PackSize")) then + { + _maybeRuck = ""; + }; + } + else + { + _maybeRuck = ""; + }; + }; + _maybeRuck +}; + +// arg 0: item +// arg 1: config type (CfgWeapons, etc.) +// arg 2: gear array +_addItemToRuck = +{ + private [ "_item", "_gear", "_configType", "_ruck", "_capacity", "_size", "_added", "_packable" ]; + + _item = _this select 0; + _configType = _this select 1; + _gear = _this select 2; + _packable = true; + + if(getNumber(configFile >> _configType >> _item >> "ACE_NoPack") == 1 || + getNumber(configFile >> _configType >> _item >> "ACE_disposable") == 1) then + { + _packable = false; + }; + + _ruck = _gear call _getGearRuck; + _capacity = 0; + if(_ruck != "") then + { + _capacity = getNumber(configFile >> "CfgWeapons" >> _ruck >> "ACE_PackSize"); + }; + _size = getNumber(configFile >> _configType >> _item >> "ACE_size"); + _size = _size + (_gear call _getRuckItemsVolume); + if(_packable && _size <= _capacity) then + { + if(_configType == "CfgWeapons") then + { + _added = false; + { + if((_x select 0) == _item) exitWith + { + _added = true; + _x set [1, (_x select 1) + 1]; + }; + } forEach(_gear select _indexRuckWeapons); + if(!_added) then + { + _gear set [_indexRuckWeapons, + (_gear select _indexRuckWeapons) + + [ [ _item, 1 ] ] ]; + }; + } + else + { + _added = false; + { + if((_x select 0) == _item) exitWith + { + _added = true; + _x set [1, (_x select 1) + 1]; + }; + } forEach(_gear select _indexRuckMags); + if(!_added) then + { + _gear set [_indexRuckMags, + (_gear select _indexRuckMags) + + [ [ _item, 1 ] ] ]; + }; + }; + }; +}; + +_currentUnit = 0; +{ + if(isPlayer _x) exitWith + { + _currentUnit = _forEachIndex; + }; +} forEach(units group player); + +_currentGear = [player] call _inventoryToGear; +_initialCost = _currentGear call _getGearCost; +_updateGear = true; +_updateMainList = true; +_updateSecondaryList = true; +_updateUnit = true; +_backpackSelected = false; +_selectedWeapon = ''; +_currentMagazineUIState = []; +_currentWeaponUIState = []; +_currentFilter = 0; +_updateCosts = true; + +_defaultWeap = Format ["WFBE_%1DEFAULTWEAPONS",sideJoinedText] Call GetNamespace; +_defaultAmmo = Format ["WFBE_%1DEFAULTAMMO",sideJoinedText] Call GetNamespace; + +if (paramAceWounds) then +{ + _defaultAmmo = _defaultAmmo + [ 'ACE_Morphine', 'ACE_Morphine', 'ACE_Bandage', 'ACE_Bandage' ]; + if(getNumber(configFile >> "CfgVehicles" >> (typeOf player) >> "attendant") == 1) then + { + _defaultAmmo = _defaultAmmo + [ 'ACE_Epinephrine', 'ACE_Epinephrine', 'ACE_Medkit', 'ACE_Medkit' ]; + }; +}; + +_defaultLoadoutCost = [ _defaultWeap, _defaultAmmo, "", [], [], "", "", "" ] call _getGearCost; + +WF_Logic setVariable ['InventoryClick',-1]; +WF_Logic setVariable ['lbMainAction','']; +WF_Logic setVariable ['lbChange',false]; +WF_Logic setVariable ['WF_Gear_Action',""]; + +call _fillInBlankImages; + +// And now the main UI loop. +while {alive player && dialog} do { + _lbSelChanged = WF_Logic getVariable 'lbChange'; + _mainCommand = WF_Logic getVariable 'lbMainAction'; + _inventoryClick = WF_Logic getVariable 'InventoryClick'; + _gearAction = WF_Logic getVariable 'WF_Gear_Action'; + + if (_lbSelChanged) then + { + WF_Logic setVariable ['lbChange',false]; + _weaponList = call compile format ["_%1%2", _filterNames select _currentFilter, + if(_backpackSelected) then { "Backpack" } else { "" }]; + _selectedWeapon = _weaponList select lnbValue [3700, [lnbCurSelRow 3700, 0]]; + _get = [_selectedWeapon, _filterNames select _currentFilter] call _getItemDataByFilterType; + _configType = _get select QUERYGEARCLASS; + + if(!_backpackSelected) then + { + _weight = getNumber(configFile >> _configType >> _selectedWeapon >> "ACE_weight"); + ctrlSetText [ 90005, format [ "%1 kg", _weight ]]; + _updateSecondaryList = true; + }; + }; + + if (_inventoryClick != -1) then + { + WF_Logic setVariable ['InventoryClick',-1]; + if(_inventoryClick == 90020) then + { + _currentGear set [_indexOnBack, ""]; + _updateGear = true; + } + else + { + { + if(_inventoryClick == (_x select 0)) exitWith + { + _weapon = (_currentGear select _indexWeapons) select (_x select 1); + + if (_weapon == (_currentGear select _indexPrimary)) then + { + _currentGear set [_indexPrimary, ""]; + }; + if (_weapon == (_currentGear select _indexSecondary)) then + { + _currentGear set [_indexSecondary, ""]; + }; + if (_weapon == (_currentGear select _indexSidearm)) then + { + _currentGear set [_indexSidearm, ""]; + }; + if (_weapon == (_currentGear select _indexOnBack)) then + { + _currentGear set [_indexOnBack, ""]; + }; + + (_currentGear select _indexWeapons) set [_x select 1, 0]; + _currentGear set [_indexWeapons, + (_currentGear select _indexWeapons) - [ 0 ]]; + }; + } forEach(_currentWeaponUIState); + }; + + { + if(_inventoryClick == (_x select 0)) exitWith + { + (_currentGear select _indexMagazines) set [_x select 1, 0]; + _currentGear set [_indexMagazines, + (_currentGear select _indexMagazines) - [ 0 ]]; + }; + } forEach(_currentMagazineUIState); + + // If ruck was removed, remove contents too. + if ((_currentGear call _getGearRuck) == "") then + { + _currentGear set [_indexRuckWeapons, []]; + _currentGear set [_indexRuckMags, []]; + if(_backpackSelected) then + { + _backpackSelected = false; + _updateSecondaryList = true; + }; + }; + _updateGear = true; + }; + + if (_mainCommand != '') then + { + WF_Logic setVariable ['lbMainAction','']; + _weaponList = call compile format ["_%1%2", _filterNames select _currentFilter, + if(_backpackSelected) then { "Backpack" } else { "" }]; + if (_selectedWeapon != '') then + { + _magazineList = _selectedWeapon call _getCompatibleMagazines; + } + else + { + _magazineList = []; + }; + + switch (_mainCommand) do + { + case 'unitPlus': { + _currentUnit = _currentUnit + 1; + if(_currentUnit >= (count units group player)) then + { + _currentUnit = 0; + }; + _updateUnit = true; + }; + + case 'unitMinus': { + _currentUnit = _currentUnit - 1; + if(_currentUnit < 0) then + { + _currentUnit = (count units group player) - 1; + }; + _updateUnit = true; + }; + + case 'filterPlus': { + _currentFilter = _currentFilter + 1; + if(_currentFilter >= 5) then + { + _currentFilter = 0; + }; + ctrlSetText [148, format ["\ca\ui\data\igui_gear_filter_%1_ca.paa", + _currentFilter+1]]; + _updateMainList = true; + }; + + case 'filterMinus': { + _currentFilter = _currentFilter - 1; + if(_currentFilter < 0) then + { + _currentFilter = 4; + }; + ctrlSetText [148, format ["\ca\ui\data\igui_gear_filter_%1_ca.paa", + _currentFilter+1]]; + _updateMainList = true; + }; + + case 'buy': { + _funds = call GetPlayerFunds; + _cost = (_currentGear call _getGearCost) - _initialCost; + if(_funds >= _cost) then + { + (-_cost) Call ChangePlayerFunds; + _unit = (units group player) select _currentUnit; + if(isNil "_unit" || !alive _unit) then + { + _currentUnit = 0; + _updateUnit = true; + } + else + { + [ _unit, _currentGear] call _applyGearToUnit; + if (isPlayer _unit) then + { + respawnGearCost = _respawnCost; + respawnWeapons = _currentGear select _indexWeapons; + respawnAmmo = _currentGear select _indexMagazines; + respawnWeaponOnBack = _currentGear select _indexOnBack; + respawnAceRuckContents = [ _currentGear select _indexRuckWeapons, + _currentGear select _indexRuckMags ]; + }; + _initialCost = (_currentGear call _getGearCost); + _updateGear = true; + }; + } + else + { + hint parseText(Format [localize "STR_WF_Funds_Missing_Gear",_cost - _funds]); + }; + }; + + case 'addMagazine': { + if(!_backpackSelected) then + { + _mag = _magazineList select lnbValue [3701, [lnbCurSelRow 3701, 0]]; + [ _currentGear, _mag ] call _addMagazineToGear; + _updateGear = true; + } + else + { + // A double click in ruck mode actually means remove from inventory. + _ruckIndex = lnbValue [3701, [lnbCurSelRow 3701, 0]]; + _ruckItemClass = lnbData [3701, [lnbCurSelRow 3701, 0]]; + + if(_ruckItemClass == "CfgWeapons") then + { + _ruckItem = (_currentGear select _indexRuckWeapons) select _ruckIndex; + if((_ruckItem select 1) > 1) then + { + _ruckItem set [1, (_ruckItem select 1) - 1]; + } + else + { + (_currentGear select _indexRuckWeapons) set [_ruckIndex, 0]; + _currentGear set [_indexRuckWeapons, + (_currentGear select _indexRuckWeapons) - [ 0 ]]; + }; + } + else + { + _ruckItem = (_currentGear select _indexRuckMags) select _ruckIndex; + if((_ruckItem select 1) > 1) then + { + _ruckItem set [1, (_ruckItem select 1) - 1]; + } + else + { + (_currentGear select _indexRuckMags) set [_ruckIndex, 0]; + _currentGear set [_indexRuckMags, + (_currentGear select _indexRuckMags) - [ 0 ]]; + }; + }; + _updateSecondaryList = true; + _updateCosts = true; + }; + }; + + case 'addMainItem': { + _weapon = _weaponList select lnbValue [3700, [lnbCurSelRow 3700, 0]]; + _get = [_weapon, _filterNames select _currentFilter] call _getItemDataByFilterType; + + if ((_get select QUERYGEARCLASS) == "CfgMagazines") then + { + if(_backpackSelected) then + { + [_weapon, "CfgMagazines", _currentGear] call _addItemToRuck; + _updateSecondaryList = true; + _updateCosts = true; + } + else + { + [_currentGear, _weapon, _get] call _addMagazineToGear; + _updateGear = true; + }; + } + else + { + if(_backpackSelected) then + { + [_weapon, "CfgWeapons", _currentGear] call _addItemToRuck; + _updateSecondaryList = true; + _updateCosts = true; + } + else + { + _add = false; + if (_weapon in _primary) then + { + if ((_currentGear select _indexPrimary) != '') then + { + _currentGear set [ _indexWeapons, + (_currentGear select _indexWeapons) - [ _currentGear select _indexPrimary ] ]; + }; + _currentGear set [_indexPrimary, _weapon]; + _add = true; + } + else + { + if (_weapon in _secondary) then + { + if ((_currentGear select _indexSecondary) != '') then + { + _currentGear set [ _indexWeapons, + (_currentGear select _indexWeapons) - [ _currentGear select _indexSecondary ] ]; + }; + _currentGear set [_indexSecondary, _weapon]; + _add = true; + } + else + { + if (_weapon in _sidearm) then + { + if ((_currentGear select _indexSidearm) != '') then + { + _currentGear set [ _indexWeapons, + (_currentGear select _indexWeapons) - [ _currentGear select _indexSidearm ] ]; + }; + _currentGear set [_indexSidearm, _weapon]; + _add = true; + } + else + { + if ((_get select QUERYGEARTYPE) == "Special") then + { + _itemCount = [_currentGear, "Special"] call _getItemCountByType; + if(_itemCount < 2) then + { + _add = true; + }; + }; + + if((_get select QUERYGEARTYPE) == "Item") then + { + _itemCount = [_currentGear, "Item"] call _getItemCountByType; + if(_itemCount < 12) then + { + _add = true; + }; + }; + }; + }; + }; + + if(_add) then + { + _currentGear set [ _indexWeapons, + (_currentGear select _indexWeapons) + [ _weapon ]]; + _updateGear = true; + }; + }; + }; + }; + }; + }; + + if(_gearAction != "") then + { + WF_Logic setVariable ["WF_Gear_Action",""]; + switch(_gearAction) do + { + case 'backpack': { + if(_backpackSelected) then + { + _backpackSelected = false; + _updateSecondaryList = true; + _updateMainList = true; + } + else + { + if((_currentGear call _getGearRuck) != "") then + { + _backpackSelected = true; + _updateSecondaryList = true; + _updateMainList = true; + }; + }; + }; + + case 'reload': { + if(!isNil "respawnWeapons") then + { + _currentGear set [_indexWeapons, respawnWeapons]; + _currentGear set [_indexMagazines, respawnAmmo]; + _currentGear set [_indexOnBack, respawnWeaponOnBack]; + _currentGear set [_indexRuckWeapons, respawnAceRuckContents select 0]; + _currentGear set [_indexRuckMags, respawnAceRuckContents select 1]; + } + else + { + _currentGear set [_indexWeapons, Format ["WFBE_%1DEFAULTWEAPONS",sideJoinedText] Call GetNamespace]; + _currentGear set [_indexMagazines, Format ["WFBE_%1DEFAULTAMMO",sideJoinedText] Call GetNamespace]; + _currentGear set [_indexOnBack, ""]; + _currentGear set [_indexRuckWeapons, []]; + _currentGear set [_indexRuckMags, []]; + }; + + { + if(_x in _primary) then + { + _currentGear set [_indexPrimary, _x]; + }; + + if(_x in _secondary) then + { + _currentGear set [_indexSecondary, _x]; + }; + + if(_x in _sidearm) then + { + _currentGear set [_indexSidearm, _x]; + }; + } forEach(_currentGear select _indexWeapons); + + _updateGear = true; + }; + + case 'clear': { + _currentGear = [ [], [], "", [], [], "", "", "" ]; + _updateGear = true; + }; + + case 'primary_onback': { + if ((_currentGear select _indexPrimary) != '') then + { + _weapon = _currentGear select _indexPrimary; + _currentGear set [ _indexWeapons, + (_currentGear select _indexWeapons) - [ _currentGear select _indexPrimary ] ]; + _currentGear set [_indexPrimary, ""]; + _currentGear set [_indexOnBack, _weapon]; + _updateGear = true; + }; + }; + + case 'secondary_onback': { + if ((_currentGear select _indexSecondary) != '') then + { + _weapon = _currentGear select _indexSecondary; + _currentGear set [ _indexWeapons, + (_currentGear select _indexWeapons) - [ _currentGear select _indexSecondary ] ]; + _currentGear set [_indexSecondary, ""]; + _currentGear set [_indexOnBack, _weapon]; + _updateGear = true; + }; + }; + }; + }; + + if (_updateUnit) then + { + _unit = (units group player) select _currentUnit; + _backpackSelected = false; + _currentGear = [_unit] call _inventoryToGear; + _updateGear = true; + _updateMainList = true; + _updateSecondaryList = true; + ctrlSetText [101, format ["[%1] " + name _unit, _currentUnit]]; + _initialCost = _currentGear call _getGearCost; + _updateUnit = false; + }; + + if (_updateGear) then + { + _temp = _currentGear call _renderGear; + _currentWeaponUIState = _temp select 0; + _currentMagazineUIState = _temp select 1; + _updateGear = false; + _updateCosts = true; + }; + + if(_updateCosts) then + { + _updateCosts = false; + _cost = _currentGear call _getGearCost; + ctrlSetText [152, (localize "STR_WF_GEAR_CostLabel") + " " + (format [localize "STR_WF_GEAR_Cost", _cost - _initialCost])]; + ctrlSetText [150, (localize "STR_WF_GEAR_CashLabel") + " " + (format [localize "STR_WF_GEAR_Cost", call GetPlayerFunds])]; + + _respawnCost = _cost - _defaultLoadoutCost; + if(_respawnCost < 0) then + { + _respawnCost = 0; + }; + + _respawnPenalty = 'WFBE_RESPAWNPENALTY' Call GetNamespace; + + if (isPlayer (units group player select _currentUnit) && _respawnPenalty in [2,3,4,5]) then + { + _divisor = 1; + switch (_respawnPenalty) do + { + case 3: {_divisor = 2}; + case 4: {_divisor = 4}; + }; + ctrlSetText [151, format [localize "STR_WF_Respawn_Cost", round (_respawnCost / _divisor) ]]; + } + else + { + ctrlSetText [151, ""]; + }; + }; + + if(_updateMainList) then + { + lnbClear 3700; + _weaponList = call compile format ["_%1%2", _filterNames select _currentFilter, + if(_backpackSelected) then { "Backpack" } else { "" }]; + [_weaponList, _filterNames select _currentFilter, 3700] call UIGearFillList; + _updateMainList = false; + _selectedWeapon = ""; + _updateSecondaryList = true; + }; + + if(_updateSecondaryList) then + { + lnbClear 3701; + if (_backpackSelected) then + { + _currentGear call _renderRuckContents; + ctrlSetText [90009, format ["%1 kg", _currentGear call _getGearWeight]]; + } + else + { + ctrlSetText [90000,localize "STR_WF_Magazines"]; + ctrlSetText [90005, ""]; + ctrlSetText [90007, ""]; + if (_selectedWeapon != '') then + { + _magazineList = _selectedWeapon call _getCompatibleMagazines; + [_magazineList, "magazine", 3701] call UIGearFillList; + }; + }; + _updateSecondaryList = false; + }; + sleep 0.05; +}; + +WF_Logic setVariable ['InventoryClick',nil]; +WF_Logic setVariable ['lbMainAction',nil]; +WF_Logic setVariable ['lbChange',nil]; \ No newline at end of file -- cgit v1.3.1