ACE3/addons/arsenal/functions/fnc_addStat.sqf
johnb432 c8404f496e
Arsenal - Add/Fix/Improve/Change numerous aspects (#9040)
* Arsenal update

* Fixes

* Update fnc_onSelChangedLeft.sqf

* Update fnc_updateUniqueItemsList.sqf

* Header fixes

* Fix for defines.hpp

Co-authored-by: Dystopian <sddex@ya.ru>

* Moved fnc_baseWeapon, filtered invalid items

* Update addons/arsenal/functions/fnc_scanConfig.sqf

Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>

* Fixes and tweaks

- Sorting is guaranteed to give a fixed order
- Dog tags no longer throw errors when reloading the ACE arsenal mission when you had some saved in your loadout before quitting the last time you played.

* Cleanup, bug fixes and additions

- Added the ability to add items from "CfgMagazines" into the "Misc. items" or custom tabs.
- Added "baseWeapon" class support for weapon attachments. If a weapon attachment has the config property "baseWeapon" defined, it will take that item and show that in the arsenal.
- Added stronger filtering on item scopes (scope > 0 at least for every item)
- Added "descending" (default, as it is now) and "ascending" sort order as a drop down menu,
- Unique backpacks in containers can now be removed with either the "-" or "clear all items" button.
- When sorting by a number, 2 decimal points have been added, so that when you sort by weight it returns the correct order.

* More fixes and tweaks

- Converted the arsenal to partially work with hashmaps instead of arrays (for configItems and virtualItems, currentItems is still an array).
- Because of the above, performance of FUNC(addVirtualItems) and FUNC(removeVirtualItems) has improved immensely.
- Sorting now caches results, reducing repeated sorting times drastically.
- CBA disposable launchers are handled differently now: Within the arsenal, you can change weapon attachments on disposable launchers, but you can't change their magazines (primary or secondary). Item info on the right and the stats show correct information.
- FUNC(addSort) now checks if the new sorting method already exists and doesn't add it if it does.
- FUNC(removeSort) now exists. You can't remove the default sort type (alphabetically) to avoid problems with the arsenal.
- Both FUNC(addStat) and FUNC(compileStats) actually taken priority into account now. Because of that priority on several stats needed to be tweaked.
- FUNC(removeStat) ensures that there are no gaps within the stat array (so if there is an empty spot in the stats page, it's because there is a stat, but the condition for it being shown hasn't been met).

* Update fnc_replaceUniqueItemsLoadout.sqf

* Update fnc_onSelChangedLeft.sqf

* Update fnc_scanConfig.sqf

* Update docs/wiki/framework/arsenal-framework.md

Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>

* Minor cleanup

* Baseweapon filtering

* Improvements + better unique items support

* Update fnc_fillRightPanel.sqf

* Update fnc_onSelChangedLeft.sqf

Fixed: Switching between weapons with incompatible primary magazines while a compatible secondary magazine is loaded doesn't equip the new weapon's primary magazine.

* Update addons/common/functions/fnc_uniqueUnitItems.sqf

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

* undefined variable

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

* fix undefined loadout var

* Update fnc_fillLoadoutsList.sqf

---------

Co-authored-by: Dystopian <sddex@ya.ru>
Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>
Co-authored-by: PabstMirror <pabstmirror@gmail.com>
2023-07-21 21:25:25 +03:00

157 lines
4.0 KiB
Plaintext

#include "script_component.hpp"
/*
* Author: Alganthe, johnb43
* Adds a stat to ACE Arsenal.
*
* Arguments:
* 0: Tabs to add the stat to <ARRAY of ARRAYS>
* 0.0: Left tab indexes <ARRAY of NUMBERS>
* 0.1: Right tab indexes <ARRAY of NUMBERS>
* 1: Stat class (unique string for each stat) <STRING>
* 2: Config entries to pass <ARRAY of STRINGS>
* 3: Title <STRING>
* 4: Show bar / show text bools <ARRAY of BOOLS>
* 4.0: Show bar <BOOL> (default: false)
* 4.1: Show text <BOOL> (default: false)
* 5: Array of statements <ARRAY of CODE>
* 5.0: Bar code <CODE> (default: {})
* 5.1: Text code <CODE> (default: {})
* 5.2: Condition code <CODE> (default: {true})
* 6: Priority <NUMBER> (default: 0)
*
* Return Value:
* 0: Array of IDs <ARRAY of STRINGS>
*
* Example:
* [[[0, 1, 2], [7]], "scopeStat", ["scope"], "Scope", [false, true], [{}, {
* params ["_statsArray", "_itemCfg"];
* getNumber (_itemCfg >> _statsArray select 0)
* }, {true}]] call ace_arsenal_fnc_addStat
*
* Public: Yes
*/
params [
["_tabs", [[], []], [[]], 2],
["_class", "", [""]],
["_stats", [], [[]]],
["_title", "", [""]],
["_bools", [false, false], [[]], 2],
["_statements", [{}, {}, {true}], [[]], 3],
["_priority", 0, [0]]
];
_tabs params [
["_leftTabs", [], [[]]],
["_rightTabs", [], [[]]]
];
_bools params [
["_showBar", false, [false]],
["_showText", false, [false]]
];
_statements params [
["_barStatement", {}, [{}]],
["_textStatement", {}, [{}]],
["_condition", {true}, [{}]]
];
// Compile stats from config (in case this is called before preInit)
call FUNC(compileStats);
private _return = [];
private _changes = [];
private _fnc_addToTabs = {
params ["_tabsList", "_tabsToAddTo", "_tabSide"];
private _statName = "";
private _currentTab = [];
private _stat = [];
{
// Make stat name
_statName = [_class, _tabSide, [str _x, format ["0%1", _x]] select (_x < 10)] joinString "";
_currentTab = _tabsList select _x;
// Find if there is an entry with same ID
if (_currentTab findIf {_x findIf {_x select 0 == _statName} != -1} != -1) then {
TRACE_1("A stat with this ID already exists", _statName);
} else {
_stat = +_finalArray;
_stat set [0, _statName];
_index = _currentTab findIf {count _x < 5};
// Add to existing page if there's enough space, otherwise create a new page
if (_index != -1) then {
(_currentTab select _index) pushBack _stat;
} else {
_currentTab pushBack [_stat];
};
_return pushBack _statName;
// Store information, so that only tabs that were changed can be sorted again
_changes pushBackUnique [_x, _tabSide];
};
} forEach _tabsToAddTo;
};
private _finalArray = ["", _stats, _title, [_showBar, _showText], [_barStatement, _textStatement, _condition], _priority];
if (_leftTabs isNotEqualTo []) then {
[GVAR(statsListLeftPanel), _leftTabs, "L"] call _fnc_addToTabs;
};
if (_rightTabs isNotEqualTo []) then {
[GVAR(statsListRightPanel), _rightTabs, "R"] call _fnc_addToTabs;
};
private _statsFlat = [];
private _stats = [];
private _tabToChange = [];
// Ensure priority is kept
{
_x params ["_tab", "_tabSide"];
_tabToChange = if (_tabSide == "R") then {
GVAR(statsListRightPanel)
} else {
GVAR(statsListLeftPanel)
};
_statsFlat = [];
// Get all stats of a tab into a single array
{
_statsFlat append _x;
} forEach (_tabToChange select _tab);
// Put priority up front
{
reverse _x;
} forEach _statsFlat;
// Sort numerically
_statsFlat sort false;
// Put it back at the rear
{
reverse _x;
} forEach _statsFlat;
_stats = [];
// Group stats into groups of 5
for "_index" from 0 to count _statsFlat - 1 step 5 do {
_stats pushBack (_statsFlat select [_index, _index + 5]);
};
_tabToChange set [_tab, _stats];
} forEach _changes;
_return