Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Common - Optimize CBA_fnc_compatibleMagazines #1585

Merged
merged 5 commits into from
Sep 7, 2023
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 32 additions & 30 deletions addons/common/fnc_compatibleMagazines.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@ Description:
Retrieves a list of magazines that are compatible with a weapon.

Parameters:
_weapon - Weapon configName or config
_allMuzzles - Get magazines for all muzzles on this weapon (default: false)
_weapon - Weapon class name or config <STRING, CONFIG>
_allMuzzles - Get magazines for all muzzles on this weapon (optional, default: false) <BOOLEAN>
johnb432 marked this conversation as resolved.
Show resolved Hide resolved

Example:
Returns:
Array of magazine classnames in config capitalization <ARRAY>

Examples:
(begin example)
_mags = ["arifle_MX_SW_F"] call CBA_fnc_compatibleMagazines
_mags = [configFile >> "CfgWeapons" >> _rifle >> _glMuzzle] call CBA_fnc_compatibleMagazines
_mags = ["arifle_MX_SW_F"] call CBA_fnc_compatibleMagazines;
_mags = [configFile >> "CfgWeapons" >> _rifle >> _glMuzzle] call CBA_fnc_compatibleMagazines;
(end)

Returns:
Array of magazine classnames in config capitalization <ARRAY>

Author:
PabstMirror, based on code from Dedmen
PabstMirror, johnb43, based on code from Dedmen
---------------------------------------------------------------------------- */
SCRIPT(compatibleMagazines);

Expand All @@ -29,37 +29,39 @@ if (_weapon isEqualType "") then {
_weapon = configFile >> "CfgWeapons" >> _weapon;
};

private _cacheKey = format ["%1#%2",_weapon,_allMuzzles];
if (isNil QGVAR(magNamespace)) then { GVAR(magNamespace) = call CBA_fnc_createNamespace; };

private _returnMags = GVAR(magNamespace) getVariable _cacheKey;
if (isNil QGVAR(magNamespace)) then {
GVAR(magNamespace) = createHashMap;
};

if (isNil "_returnMags") then {
+(GVAR(magNamespace) getOrDefaultCall [format ["%1#%2", _weapon, _allMuzzles], {
if (_allMuzzles) then {
_returnMags = []; // get all mags from all muzzles
// Get all mags from all muzzles
private _returnMags = createHashMap;

{
if (_x == "this") then {
_returnMags append (_weapon call CBA_fnc_compatibleMagazines);
_returnMags insert [true, _weapon call CBA_fnc_compatibleMagazines, []];
} else {
_returnMags append ((_weapon >> _x) call CBA_fnc_compatibleMagazines);
_returnMags insert [true, (_weapon >> _x) call CBA_fnc_compatibleMagazines, []];
};
} forEach getArray (_weapon >> "muzzles");
_returnMags = _returnMags arrayIntersect _returnMags;

keys _returnMags
} else {
_returnMags = getArray (_weapon >> "magazines"); // get mags just for a specific muzzle
// Get mags just for a specific muzzle
private _cfgMagazines = configFile >> "CfgMagazines";
private _cfgMagazineWells = configFile >> "CfgMagazineWells";
private _returnMags = getArray (_weapon >> "magazines") createHashMapFromArray [];

{
private _wellConfig = configFile >> "CfgMagazineWells" >> _x;
{
_returnMags append getArray _x;
} forEach configProperties [_wellConfig, "isArray _x", false];
_returnMags insert [true, (getArray _x) apply {configName (_cfgMagazines >> _x)}, []];
} forEach configProperties [_cfgMagazineWells >> _x, "isArray _x", false];
} forEach (getArray (_weapon >> "magazineWell"));

private _cfgMagazines = configFile >> "CfgMagazines";
_returnMags = _returnMags select {isClass (_cfgMagazines >> _x)};
_returnMags = _returnMags apply {configName (_cfgMagazines >> _x)};
_returnMags = _returnMags arrayIntersect _returnMags;
};
GVAR(magNamespace) setVariable [_cacheKey, _returnMags];
};
// Delete invalid entry
_returnMags deleteAt "";

+_returnMags
keys _returnMags
};
}, true])