2023-09-12 18:58:10 +00:00
|
|
|
#include "..\script_component.hpp"
|
2020-02-28 16:54:53 +00:00
|
|
|
/*
|
2023-09-23 17:07:06 +00:00
|
|
|
* Author: Pterolatypus, LinkIsGrim
|
|
|
|
* Returns the regular and scaled armor values the given item provides to a particular hitpoint, either from a cache or by reading the item config.
|
2020-02-28 16:54:53 +00:00
|
|
|
*
|
|
|
|
* Arguments:
|
|
|
|
* 0: Item Class <STRING>
|
|
|
|
* 1: Hitpoint <STRING>
|
|
|
|
*
|
|
|
|
* Return Value:
|
2023-09-23 17:07:06 +00:00
|
|
|
* Regular and scaled item armor for the given hitpoint <ARRAY of NUMBER>
|
2020-02-28 16:54:53 +00:00
|
|
|
*
|
|
|
|
* Example:
|
|
|
|
* ["V_PlateCarrier_rgr", "HitChest"] call ace_medical_engine_fnc_getItemArmor
|
|
|
|
*
|
|
|
|
* Public: No
|
|
|
|
*/
|
|
|
|
|
|
|
|
params ["_item", "_hitpoint"];
|
|
|
|
|
|
|
|
private _key = format ["%1$%2", _item, _hitpoint];
|
2023-09-23 17:07:06 +00:00
|
|
|
private _return = GVAR(armorCache) get _key;
|
2020-02-28 16:54:53 +00:00
|
|
|
|
2023-09-23 17:07:06 +00:00
|
|
|
if (isNil "_return") then {
|
|
|
|
private _armor = 0;
|
|
|
|
private _armorScaled = 0;
|
|
|
|
private _passThrough = 1;
|
2020-02-28 16:54:53 +00:00
|
|
|
TRACE_2("Cache miss",_item,_hitpoint);
|
|
|
|
if ("" in [_item, _hitpoint]) exitWith {
|
2023-09-23 17:07:06 +00:00
|
|
|
_return = [_armor, _armorScaled];
|
|
|
|
GVAR(armorCache) set [_key, _return];
|
2020-02-28 16:54:53 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
private _itemInfo = configFile >> "CfgWeapons" >> _item >> "ItemInfo";
|
2023-10-24 19:15:47 +00:00
|
|
|
private _itemType = getNumber (_itemInfo >> "type");
|
|
|
|
private _passThroughEffect = [1, 0.6] select (_itemType == TYPE_VEST);
|
2020-02-28 16:54:53 +00:00
|
|
|
|
2023-10-24 19:15:47 +00:00
|
|
|
if (_itemType == TYPE_UNIFORM) then {
|
2020-02-28 16:54:53 +00:00
|
|
|
private _unitCfg = configFile >> "CfgVehicles" >> getText (_itemInfo >> "uniformClass");
|
2022-02-17 20:03:12 +00:00
|
|
|
if (_hitpoint == "#structural") then {
|
|
|
|
// TODO: I'm not sure if this should be multiplied by the base armor value or not
|
|
|
|
_armor = getNumber (_unitCfg >> "armorStructural");
|
|
|
|
} else {
|
|
|
|
private _entry = _unitCfg >> "HitPoints" >> _hitpoint;
|
|
|
|
_armor = getNumber (_unitCfg >> "armor") * (1 max getNumber (_entry >> "armor"));
|
2023-09-23 17:07:06 +00:00
|
|
|
_passThrough = 0.1 max getNumber (_entry >> "passThrough") min 1; // prevent dividing by 0
|
2022-02-17 20:03:12 +00:00
|
|
|
};
|
2020-02-28 16:54:53 +00:00
|
|
|
} else {
|
|
|
|
private _condition = format ["getText (_x >> 'hitpointName') == '%1'", _hitpoint];
|
|
|
|
private _entry = configProperties [_itemInfo >> "HitpointsProtectionInfo", _condition] param [0, configNull];
|
2023-09-23 17:07:06 +00:00
|
|
|
if (!isNull _entry) then {
|
|
|
|
_armor = getNumber (_entry >> "armor");
|
|
|
|
_passThrough = 0.1 max getNumber (_entry >> "passThrough") min 1;
|
|
|
|
};
|
2020-02-28 16:54:53 +00:00
|
|
|
};
|
|
|
|
|
2023-09-23 17:07:06 +00:00
|
|
|
// Scale armor using passthrough to fix explosive-resistant armor (#9063)
|
2023-10-24 19:15:47 +00:00
|
|
|
// Skip scaling for uniforms and items that don't cover the hitpoint to prevent infinite armor
|
|
|
|
if (_armor > 0) then {
|
|
|
|
if (_itemType == TYPE_UNIFORM) then {
|
|
|
|
_armorScaled = _armor;
|
|
|
|
} else {
|
|
|
|
_armorScaled = (log (_armor / (_passThrough ^ _passThroughEffect))) * 10;
|
|
|
|
};
|
2023-09-23 17:07:06 +00:00
|
|
|
};
|
|
|
|
_return = [_armor, _armorScaled];
|
|
|
|
GVAR(armorCache) set [_key, _return];
|
2020-02-28 16:54:53 +00:00
|
|
|
};
|
|
|
|
|
2023-09-23 17:07:06 +00:00
|
|
|
_return // return
|