mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
c8404f496e
* 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>
253 lines
8.6 KiB
Plaintext
253 lines
8.6 KiB
Plaintext
#include "script_component.hpp"
|
|
#include "..\defines.hpp"
|
|
/*
|
|
* Author: Alganthe
|
|
* Handles the stats control group.
|
|
*
|
|
* Arguments:
|
|
* 0: Arsenal display <DISPLAY>
|
|
* 1: Current panel control <CONTROL>
|
|
* 2: Current panel selection <NUMBER>
|
|
* 3: Item config entry <CONFIG>
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*
|
|
* Public: No
|
|
*/
|
|
|
|
params ["_display", "_control", "_curSel", "_itemCfg"];
|
|
|
|
private _statsBoxCtrl = _display displayCtrl IDC_statsBox;
|
|
private _statsPreviousPageCtrl = _display displayCtrl IDC_statsPreviousPage;
|
|
private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage;
|
|
private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage;
|
|
|
|
private _hideUnusedFnc = {
|
|
params ["_numbers"];
|
|
|
|
{
|
|
private _statsTitleCtrl = _display displayCtrl (IDC_statsTitle1 + ((_x - 1) * 4));
|
|
private _statsTitleIDC = ctrlIDC _statsTitleCtrl;
|
|
|
|
private _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1);
|
|
private _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2);
|
|
private _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3);
|
|
|
|
{
|
|
_x ctrlSetFade 1;
|
|
_x ctrlCommit 0;
|
|
} forEach [
|
|
_statsTitleCtrl,
|
|
_statsBackgroundCtrl,
|
|
_statsBarCtrl,
|
|
_statsTextCtrl
|
|
];
|
|
} forEach _numbers;
|
|
};
|
|
|
|
if (!isNil "_itemCfg") then {
|
|
private _handleStatsFnc = {
|
|
params ["_statsIndex", "_leftPanel"];
|
|
|
|
// Get the proper list and page
|
|
if (_leftPanel) then {
|
|
[(GVAR(statsListLeftPanel)) select _statsIndex, GVAR(statsPagesLeft) select _statsIndex]
|
|
} else {
|
|
[(GVAR(statsListRightPanel)) select _statsIndex, GVAR(statsPagesRight) select _statsIndex]
|
|
} params ["_statsArray", "_currentPage"];
|
|
|
|
private _statsList = _statsArray select _currentPage;
|
|
private _statsCount = 0;
|
|
|
|
// Handle titles, bars and text
|
|
_statsList = _statsList select [0, 5];
|
|
|
|
if (_statsList isNotEqualTo []) then {
|
|
private _statsTitleCtrl = controlNull;
|
|
private _statsTitleIDC = -1;
|
|
private _statsBackgroundCtrl = controlNull;
|
|
private _statsBarCtrl = controlNull;
|
|
private _statsTextCtrl = controlNull;
|
|
private _textStatementResult = "";
|
|
|
|
{
|
|
_x params ["_ID", "_configEntry", "_title", "_bools", "_statements"];
|
|
_bools params ["_showBar", "_showText"];
|
|
_statements params [["_barStatement", {}, [{}]], ["_textStatement", {}, [{}]], ["_condition", {true}, [{}]]];
|
|
|
|
_statsTitleCtrl = _display displayCtrl (IDC_statsTitle1 + _forEachIndex * 4);
|
|
_statsTitleIDC = ctrlIDC _statsTitleCtrl;
|
|
_statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1);
|
|
_statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2);
|
|
_statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3);
|
|
|
|
_statsCount = _statsCount + 1;
|
|
_statsTitleCtrl ctrlSetText _title;
|
|
_statsTitleCtrl ctrlSetFade 0;
|
|
|
|
// Handle bars
|
|
if (_showBar) then {
|
|
_statsBarCtrl progressSetPosition ([_configEntry, _itemCfg] call _barStatement);
|
|
_statsBackgroundCtrl ctrlSetFade 0;
|
|
_statsBarCtrl ctrlSetFade 0;
|
|
} else {
|
|
_statsBackgroundCtrl ctrlSetFade 1;
|
|
_statsBarCtrl ctrlSetFade 1;
|
|
};
|
|
|
|
// Handle text entries
|
|
if (_showText) then {
|
|
_textStatementResult = [_configEntry, _itemCfg] call _textStatement;
|
|
|
|
if !(_textStatementResult isEqualtype "") then {
|
|
_textStatementResult = str _textStatementResult;
|
|
};
|
|
|
|
_statsTextCtrl ctrlSetText _textStatementResult;
|
|
_statsTextCtrl ctrlSetTextColor ([[1, 1, 1, 1], [0, 0, 0, 1]] select (_showBar));
|
|
_statsTextCtrl ctrlSetFade 0;
|
|
} else {
|
|
_statsTextCtrl ctrlSetFade 1;
|
|
};
|
|
|
|
{
|
|
_x ctrlCommit 0;
|
|
} forEach [
|
|
_statsTitleCtrl,
|
|
_statsBackgroundCtrl,
|
|
_statsBarCtrl,
|
|
_statsTextCtrl
|
|
];
|
|
} forEach (_statsList select {
|
|
_x params ["", "_configEntry", "", "", "_statements"];
|
|
_statements params ["", "", ["_condition", {true}, [{}]]];
|
|
|
|
([_configEntry, _itemCfg] call _condition)
|
|
});
|
|
};
|
|
|
|
// Resize the window
|
|
[[1, 2, 3, 4, 5] select [_statsCount, 5]] call _hideUnusedFnc;
|
|
_statsBoxCtrl ctrlSetPosition [
|
|
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
|
|
safezoneY + 1.8 * GRID_H,
|
|
47 * GRID_W,
|
|
([11, (10 * _statsCount) + 5] select (_statsCount > 0)) * GRID_H
|
|
];
|
|
_statsBoxCtrl ctrlCommit 0;
|
|
|
|
GVAR(statsInfo) = [_leftPanel, _statsIndex, _control, _curSel, _itemCfg];
|
|
|
|
// Toggle page buttons
|
|
_statsPreviousPageCtrl ctrlEnable (_currentPage > 0);
|
|
_statsNextPageCtrl ctrlEnable (_currentPage + 1 < count _statsArray);
|
|
_statsCurrentPageCtrl ctrlSetText ([LLSTRING(page), str (_currentPage + 1)] joinString " ");
|
|
|
|
{
|
|
_x ctrlSetFade 0;
|
|
_x ctrlCommit 0;
|
|
} forEach [
|
|
_statsPreviousPageCtrl,
|
|
_statsNextPageCtrl,
|
|
_statsCurrentPageCtrl
|
|
];
|
|
};
|
|
|
|
// Check if in left or right panel
|
|
if (ctrlIDC _control == IDC_leftTabContent) then {
|
|
// Faces, voices and insigna do not have stats
|
|
if ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia] find GVAR(currentLeftPanel) > -1) then {
|
|
[[1, 2, 3, 4, 5]] call _hideUnusedFnc;
|
|
_statsBoxCtrl ctrlSetPosition [
|
|
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
|
|
safezoneY + 1.8 * GRID_H,
|
|
47 * GRID_W,
|
|
11 * GRID_H
|
|
];
|
|
_statsBoxCtrl ctrlCommit 0;
|
|
|
|
{
|
|
_x ctrlSetFade 1;
|
|
_x ctrlCommit 0;
|
|
} forEach [
|
|
_statsPreviousPageCtrl,
|
|
_statsNextPageCtrl,
|
|
_statsCurrentPageCtrl
|
|
];
|
|
} else {
|
|
[[
|
|
IDC_buttonPrimaryWeapon,
|
|
IDC_buttonHandgun,
|
|
IDC_buttonSecondaryWeapon,
|
|
IDC_buttonUniform,
|
|
IDC_buttonVest,
|
|
IDC_buttonBackpack,
|
|
IDC_buttonHeadgear,
|
|
IDC_buttonGoggles,
|
|
IDC_buttonNVG,
|
|
IDC_buttonBinoculars,
|
|
IDC_buttonMap,
|
|
IDC_buttonGPS,
|
|
IDC_buttonRadio,
|
|
IDC_buttonCompass,
|
|
IDC_buttonWatch
|
|
] find GVAR(currentLeftPanel), true] call _handleStatsFnc;
|
|
};
|
|
} else {
|
|
switch (GVAR(currentRightPanel)) do {
|
|
case IDC_buttonOptic: {
|
|
[0, false] call _handleStatsFnc;
|
|
};
|
|
case IDC_buttonItemAcc: {
|
|
[1, false] call _handleStatsFnc;
|
|
};
|
|
case IDC_buttonMuzzle: {
|
|
[2, false] call _handleStatsFnc;
|
|
};
|
|
case IDC_buttonBipod: {
|
|
[3, false] call _handleStatsFnc;
|
|
};
|
|
case IDC_buttonCurrentMag;
|
|
case IDC_buttonCurrentMag2;
|
|
case IDC_buttonMag;
|
|
case IDC_buttonMagALL: {
|
|
[4, false] call _handleStatsFnc;
|
|
};
|
|
case IDC_buttonThrow: {
|
|
[5, false] call _handleStatsFnc;
|
|
};
|
|
case IDC_buttonPut: {
|
|
[6, false] call _handleStatsFnc;
|
|
};
|
|
case IDC_buttonMisc: {
|
|
[7, false] call _handleStatsFnc;
|
|
};
|
|
default {
|
|
if (GVAR(currentRightPanel) in [RIGHT_PANEL_CUSTOM_BUTTONS]) then {
|
|
[7, false] call _handleStatsFnc;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
} else {
|
|
// If nothing is chosen, hide stats
|
|
[[1, 2, 3, 4, 5]] call _hideUnusedFnc;
|
|
_statsBoxCtrl ctrlSetPosition [
|
|
(0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP,
|
|
safezoneY + 1.8 * GRID_H,
|
|
47 * GRID_W,
|
|
11 * GRID_H
|
|
];
|
|
_statsBoxCtrl ctrlCommit 0;
|
|
|
|
{
|
|
_x ctrlSetFade 1;
|
|
_x ctrlCommit 0;
|
|
} forEach [
|
|
_statsPreviousPageCtrl,
|
|
_statsNextPageCtrl,
|
|
_statsCurrentPageCtrl
|
|
];
|
|
};
|