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

Medical Damage - Add alternate armor penetration #9217

Open
wants to merge 72 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
75f1cec
scale armor damage using passthrough
LinkIsGrim Jun 13, 2023
386eda6
add - to comment
LinkIsGrim Jun 14, 2023
510e6aa
improve condition
LinkIsGrim Jun 14, 2023
f290e28
remove extra brackets
LinkIsGrim Jun 14, 2023
9ad380d
remove extra brackets
LinkIsGrim Jun 14, 2023
0c82347
fix damage sorting
LinkIsGrim Jun 14, 2023
27ef26f
whitespace
LinkIsGrim Jun 14, 2023
0098ecb
comment
LinkIsGrim Jun 14, 2023
816c5e7
rework armor penetration
LinkIsGrim Jun 14, 2023
c232f7f
fix function header
LinkIsGrim Jun 14, 2023
92d636d
fix function header
LinkIsGrim Jun 14, 2023
33c3e9e
rework armor penetration
LinkIsGrim Jun 14, 2023
628c0c8
fix function header
LinkIsGrim Jun 14, 2023
7ad1d05
Merge branch 'rework-armor-penetration' of https://github.com/Salluci…
LinkIsGrim Jun 14, 2023
6991e8c
fix another function header
LinkIsGrim Jun 14, 2023
2d36e66
fix infinite armor when no item equipped
LinkIsGrim Jun 14, 2023
56ef3a3
remove extra return
LinkIsGrim Jun 14, 2023
cdf6520
fix infinite armor when no item equipped
LinkIsGrim Jun 14, 2023
1d1edbb
add private
LinkIsGrim Jun 14, 2023
73119fd
use math
LinkIsGrim Jun 15, 2023
8ef0af1
improve condition check
LinkIsGrim Jun 15, 2023
6035088
do it properly
LinkIsGrim Jun 15, 2023
434d5d5
improve macro, condition, remove unarmored bonus
LinkIsGrim Jun 16, 2023
dc39995
rework math again
LinkIsGrim Jun 17, 2023
34a4b24
cleanup
LinkIsGrim Jun 28, 2023
2b32870
more cleanup
LinkIsGrim Jun 28, 2023
aafef61
name
LinkIsGrim Jul 6, 2023
260e1c3
don't scale structural damage
LinkIsGrim Jul 9, 2023
e19bed4
Merge remote-tracking branch 'upstream' into rework-armor-penetration
LinkIsGrim Jul 24, 2023
2ed1058
Merge branch 'scale-armor-damage' of https://github.com/Salluci/ACE3 …
LinkIsGrim Jul 24, 2023
7b437b2
move to medical_damage component
LinkIsGrim Jul 24, 2023
82f1e41
revert changes to thresholds
LinkIsGrim Jul 24, 2023
60f0d77
fix stupid
LinkIsGrim Jul 24, 2023
6547fa0
finish moving to damage
LinkIsGrim Jul 24, 2023
0567367
fix double stupid
LinkIsGrim Jul 24, 2023
b77eca6
magic number
LinkIsGrim Jul 24, 2023
255ec5d
remove debug
LinkIsGrim Jul 24, 2023
6f706fe
remove debug pt2
LinkIsGrim Jul 24, 2023
e4e9345
final cleanup
LinkIsGrim Jul 24, 2023
ed9d6d6
did i say final? i meant pre-final.
LinkIsGrim Jul 24, 2023
46e21e9
remove 9216
LinkIsGrim Jul 24, 2023
bb53055
condition
LinkIsGrim Jul 25, 2023
d27f6f7
add default to ammo
LinkIsGrim Jul 28, 2023
97cdaf9
cleanup
LinkIsGrim Jul 28, 2023
383dda1
Merge branch 'rework-armor-penetration' of https://github.com/Salluci…
LinkIsGrim Jul 28, 2023
f1d5b80
remove debug
LinkIsGrim Jul 28, 2023
785502b
Merge remote-tracking branch 'upstream/master' into rework-armor-pene…
LinkIsGrim Aug 7, 2023
300d5fe
rework again (this time using armor class)
LinkIsGrim Aug 7, 2023
d227414
change default thickness
LinkIsGrim Aug 7, 2023
7e1821a
minor optimization, divide thickness by 2
LinkIsGrim Aug 7, 2023
540e479
fix missing bracket
LinkIsGrim Aug 7, 2023
84934a8
Merge branch 'master' of https://github.com/acemod/ACE3 into pr/LinkI…
LinkIsGrim Nov 16, 2024
6a449ca
fix script_component.hpp
LinkIsGrim Nov 16, 2024
5c09916
Fix macro
johnb432 Nov 17, 2024
5eba4c9
Use getOrDefaultCall
johnb432 Nov 17, 2024
d259ad1
Update docs
johnb432 Nov 17, 2024
d6cc11b
Update addons/medical_damage/functions/fnc_woundsHandlerArmorPenetrat…
LinkIsGrim Nov 17, 2024
a7eca55
Update addons/medical_damage/functions/fnc_getAmmoData.sqf
LinkIsGrim Nov 17, 2024
e29afd9
readd ammo if it was dropped
LinkIsGrim Nov 17, 2024
318f4b1
Merge branch 'master' into rework-armor-penetration
LinkIsGrim Nov 21, 2024
ef8d10d
Merge remote-tracking branch 'origin' into pr/LinkIsGrim/9217
LinkIsGrim Dec 19, 2024
26b3759
use scaling for stupid armor and nothing else, drop setting
LinkIsGrim Dec 19, 2024
54c9cb9
simplify armor thickness
LinkIsGrim Dec 19, 2024
18dc75d
no fun if it works the first time
LinkIsGrim Dec 19, 2024
2009431
fix undefined variable
LinkIsGrim Dec 19, 2024
ef0cdf7
fix logic
LinkIsGrim Dec 19, 2024
3fe5924
defer woundReceived changes to another PR
LinkIsGrim Dec 19, 2024
d566238
setting name/description
LinkIsGrim Dec 19, 2024
261c0a6
ammo fixes
LinkIsGrim Dec 19, 2024
7317266
drop doc change
LinkIsGrim Dec 19, 2024
a503f54
whitespace
LinkIsGrim Dec 19, 2024
833578e
round instead of floor to prevent floating point miscalc
LinkIsGrim Dec 19, 2024
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
3 changes: 3 additions & 0 deletions addons/medical_damage/ACE_Medical_Injuries.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ class ACE_Medical_Injuries {
// bullets only create multiple wounds when the damage is very high
thresholds[] = {{20, 10}, {4.5, 2}, {3, 1}, {0, 1}};
selectionSpecific = 1;
class woundHandlers: woundHandlers {
GVAR(armorPenetration) = QFUNC(woundsHandlerArmorPenetration);
};

class Avulsion {
// at damage, weight. between points, weight is interpolated then wound is chosen by weighted random.
Expand Down
2 changes: 2 additions & 0 deletions addons/medical_damage/XEH_PREP.hpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
PREP(debug_explosiveTest);
PREP(determineIfFatal);
PREP(getAmmoData);
PREP(getTypeOfDamage);
PREP(handleIncapacitation);
PREP(interpolatePoints);
PREP(parseConfigForInjuries);
PREP(parseWoundHandlersCfg);
PREP(woundReceived);
PREP(woundsHandlerArmorPenetration);
PREP(woundsHandlerBase);
PREP(woundsHandlerBurning);
PREP(woundsHandlerVehiclecrash);
Expand Down
3 changes: 3 additions & 0 deletions addons/medical_damage/XEH_preInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ PREP_RECOMPILE_END;

call FUNC(parseConfigForInjuries);

// Used for armor penetration calculation
GVAR(ammoCache) = createHashMap;

/*
addMissionEventHandler ["Loaded",{
INFO("Mission Loaded - Reloading medical configs for extension");
Expand Down
36 changes: 36 additions & 0 deletions addons/medical_damage/functions/fnc_getAmmoData.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include "..\script_component.hpp"
/*
* Author: LinkIsGrim
* Returns base damage value, penetration factor, and expected muzzle velocity of a given round, either from a cache or by reading the ammo config.
*
* Arguments:
* 0: Ammo <STRING>
*
* Return Value:
* Base damage value, penetration factor, muzzle velocity <ARRAY of NUMBER>
*
* Example:
* "B_556x45_Ball" call ace_medical_engine_fnc_getAmmoData
*
* Public: No
*/

// Baseline penetrability used for armor penetration calculation, see (https://community.bistudio.com/wiki/CfgAmmo_Config_Reference#caliber)
#define ARMOR_PENETRABILITY 0.015
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could be a setting? /shrug.


params ["_ammo"];

GVAR(ammoCache) getOrDefaultCall [toLowerANSI _ammo, {
TRACE_1("Cache miss",_ammo);
private _ammoConfig = configFile >> "CfgAmmo" >> _ammo;

if (isNull _ammoConfig) then {
[0, 0, 0] // return
} else {
private _hit = getNumber (_ammoConfig >> "hit");
private _caliber = (getNumber (_ammoConfig >> "caliber"));
private _typicalSpeed = getNumber (_ammoConfig >> "typicalSpeed");
private _penFactor = _caliber * ARMOR_PENETRABILITY;
[_hit, _penFactor, _typicalSpeed] // return
};
}, true]
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include "..\script_component.hpp"
/*
* Author: LinkIsGrim
* Custom wounds handler for armor penetration. Calculates damage based on round material penetration and unit armor
*
* Arguments:
* 0: Unit that was hit <OBJECT>
* 1: Damage done to each body part <ARRAY>
* 0: Engine damage <NUMBER>
* 1: Body part <STRING>
* 2: Real damage <NUMBER>
* 2: Type of the damage done <STRING>
* 3: Ammo <STRING>
*
* Return Value:
* None
*
* Example:
* [player, [[0.5, "Body", 1]], "bullet"] call ace_medical_damage_fnc_woundsHandlerArmorPenetration
*
* Public: No
*/

// This gets close to vanilla values on FMJ ammo
#define DAMAGE_SCALING_FACTOR 10

params ["_unit", "_allDamages", "_typeOfDamage", "_ammo"];
TRACE_4("woundsHandlerArmorPenetration",_unit,_allDamages,_typeOfDamage,_ammo);

if (!EGVAR(medical,alternateArmorPenetration)) exitWith {_this};

private _damageData = (_allDamages select 0); // selection specific
_damageData params ["_engineDamage", "_bodyPart", "_realDamage"];

private _ammoData = _ammo call FUNC(getAmmoData);

// See (https://community.bistudio.com/wiki/CfgAmmo_Config_Reference#caliber),
// _penFactor is ammo "caliber" * RHA penetrability, armor plates according to BI are just made of RHAe material
_ammoData params ["_hit", "_penFactor", "_typicalSpeed"];

// Skip bad ammo
if (_hit <= 0) exitWith {_this};

private _armorLevelStep = [2, 4] select (_bodyPart == "body");
private _armor = (_realDamage/_engineDamage) - 2; // remove base armor

// There's no need to calculate penetration if there is no armor to begin with, base damage handling is good enough in this case
if (_armor <= _armorLevelStep) exitWith {
TRACE_3("skipping no armor",_armor,_bodyPart,_armorLevelStep);
_this // return
};

// Cap at Armor Level V
// Jumping from no armor to armor level 1 is 2 steps
private _armorLevel = 0 max (round ((_armor - (_armorLevelStep * 2)) / _armorLevelStep)) min 4;
TRACE_3("gotArmorLevel",_armorLevel,_armor,_armorLevelStep);

// Armor RHA equivalent, non-linear, ref \a3\Data_F\Penetration\armour_plate/thin/medium/heavy.bisurf
// Divided by 2 to keep inline with vanilla caliber values
private _armorThickness = [
6,
15,
21,
40,
55
] select _armorLevel;
TRACE_1("gotArmorThickness",_armorThickness);

// Impact damage is hit * (impactSpeed / typicalSpeed): https://community.bistudio.com/wiki/CfgAmmo_Config_Reference#typicalSpeed
// Impact damage is already lowered by engine based on hit angle, so speed and therefore penetration are also naturally lowered
// Assume typicalSpeed < 1 means no damage dropoff
private _impactSpeed = (_realDamage/_hit) * (_typicalSpeed max 1);

private _penDepth = _penFactor * _impactSpeed;

// Max damage is the config value, go down from there based on armor penetration
private _finalDamage = (_hit * ((_penDepth/_armorThickness) min 1)) / DAMAGE_SCALING_FACTOR;
_damageData set [0, _finalDamage];

TRACE_3("Armor penetration handled, passing damage",_finalDamage,_damageData,_allDamages);

_this // return
9 changes: 9 additions & 0 deletions addons/medical_damage/initSettings.inc.sqf
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
[
QEGVAR(medical,alternateArmorPenetration),
"CHECKBOX",
[LSTRING(AlternateArmorPenetration_DisplayName), LSTRING(AlternateArmorPenetration_Description)],
ELSTRING(medical,Category),
true,
true
] call CBA_fnc_addSetting;

[
QEGVAR(medical,fatalDamageSource),
"LIST",
Expand Down
6 changes: 6 additions & 0 deletions addons/medical_damage/stringtable.xml
Original file line number Diff line number Diff line change
Expand Up @@ -871,5 +871,11 @@
<Korean>사지 피해 사용</Korean>
<French>Utiliser les dommages aux membres</French>
</Key>
<Key ID="STR_ACE_Medical_Damage_AlternateArmorPenetration_DisplayName">
<English>Use Custom Armor Penetration</English>
</Key>
<Key ID="STR_ACE_Medical_Damage_AlternateArmorPenetration_Description">
<English>Controls whether ammo material penetration is taken into account for damage handling.</English>
</Key>
</Package>
</Project>
12 changes: 4 additions & 8 deletions addons/medical_engine/functions/fnc_getHitpointArmor.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,19 @@ private _gear = [

private _rags = _gear joinString "$";
private _var = format [QGVAR(armorCache$%1), _hitpoint];
_unit getVariable [_var, ["", 0, 0]] params ["_prevRags", "_armor", "_armorScaled"];
_unit getVariable [_var, ["", 0]] params ["_prevRags", "_armor"];

if (_rags != _prevRags) then {
_armor = 0;
_armorScaled = 0;

{
([_x, _hitpoint] call FUNC(getItemArmor)) params ["_itemArmor", "_itemArmorScaled"];
_armor = _armor + _itemArmor;
_armorScaled = _armorScaled + _itemArmorScaled;
_armor = _armor + ([_x, _hitpoint] call FUNC(getItemArmor));
} forEach _gear;

// Armor should be at least 1 to prevent dividing by 0
_armor = _armor max 1;
_armorScaled = _armorScaled max 1;

_unit setVariable [_var, [_rags, _armor, _armorScaled]];
_unit setVariable [_var, [_rags, _armor]];
};

[_armor, _armorScaled] // return
_armor // return
69 changes: 29 additions & 40 deletions addons/medical_engine/functions/fnc_getItemArmor.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -18,53 +18,42 @@

params ["_item", "_hitpoint"];

private _key = format ["%1$%2", _item, _hitpoint];
private _return = GVAR(armorCache) get _key;

if (isNil "_return") then {
GVAR(armorCache) getOrDefaultCall [_this joinString "$", {
TRACE_2("Cache miss",_item,_hitpoint);
private _armor = 0;
private _armorScaled = 0;
private _passThrough = 1;
TRACE_2("Cache miss",_item,_hitpoint);
if ("" in [_item, _hitpoint]) exitWith {
_return = [_armor, _armorScaled];
GVAR(armorCache) set [_key, _return];
};

private _itemInfo = configFile >> "CfgWeapons" >> _item >> "ItemInfo";
private _itemType = getNumber (_itemInfo >> "type");
private _passThroughEffect = [1, 0.6] select (_itemType == TYPE_VEST);
if !("" in [_item, _hitpoint]) then {
private _itemInfo = configFile >> "CfgWeapons" >> _item >> "ItemInfo";
private _itemType = getNumber (_itemInfo >> "type");

if (_itemType == TYPE_UNIFORM) then {
private _unitCfg = configFile >> "CfgVehicles" >> getText (_itemInfo >> "uniformClass");
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");
if (_itemType == TYPE_UNIFORM) then {
private _unitCfg = configFile >> "CfgVehicles" >> getText (_itemInfo >> "uniformClass");
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"));
_passThrough = 0.1 max getNumber (_entry >> "passThrough") min 1; // prevent dividing by 0
};
} else {
private _entry = _unitCfg >> "HitPoints" >> _hitpoint;
_armor = getNumber (_unitCfg >> "armor") * (1 max getNumber (_entry >> "armor"));
_passThrough = 0.1 max getNumber (_entry >> "passThrough") min 1; // prevent dividing by 0
private _condition = format ["getText (_x >> 'hitpointName') == '%1'", _hitpoint];
private _entry = configProperties [_itemInfo >> "HitpointsProtectionInfo", _condition] param [0, configNull];
if (!isNull _entry) then {
_armor = getNumber (_entry >> "armor");
_passThrough = 0.1 max getNumber (_entry >> "passThrough") min 1;
};
};
} else {
private _condition = format ["getText (_x >> 'hitpointName') == '%1'", _hitpoint];
private _entry = configProperties [_itemInfo >> "HitpointsProtectionInfo", _condition] param [0, configNull];
if (!isNull _entry) then {
_armor = getNumber (_entry >> "armor");
_passThrough = 0.1 max getNumber (_entry >> "passThrough") min 1;
};
};

// Scale armor using passthrough to fix explosive-resistant armor (#9063)
// 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;
// Scale armor using passthrough to fix explosive-resistant & stupid armor (#9063)
// Skip scaling for uniforms and items that don't cover the hitpoint to prevent infinite armor
private _armorLevelStep = [4, 2] select (_itemType == TYPE_HEADGEAR);
if (_itemType != TYPE_UNIFORM && (_armor > _armorLevelStep * 6)) then {
LinkIsGrim marked this conversation as resolved.
Show resolved Hide resolved
private _passThroughEffect = [1, 0.6] select (_itemType == TYPE_VEST);
_armor = (log (_armor / (_passThrough ^ _passThroughEffect))) * 10;
};
};
_return = [_armor, _armorScaled];
GVAR(armorCache) set [_key, _return];
};

_return // return
_armor // return
}, true]
9 changes: 2 additions & 7 deletions addons/medical_engine/functions/fnc_handleDamage.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,11 @@ if (_context != 2 && {_context == 4 || _newDamage == 0}) exitWith {
_oldDamage
};

// Get scaled armor value of hitpoint and calculate damage before armor
// Get armor value of hitpoint and calculate damage before armor
// We scale using passThrough to handle explosive-resistant armor properly (#9063)
// We need realDamage to determine which limb was hit correctly
[_unit, _hitpoint] call FUNC(getHitpointArmor) params ["_armor", "_armorScaled"];
private _armor = [_unit, _hitpoint] call FUNC(getHitpointArmor);
private _realDamage = _newDamage * _armor;
if (!_structuralDamage) then {
private _armorCoef = _armor/_armorScaled;
private _damageCoef = linearConversion [0, 1, GVAR(damagePassThroughEffect), 1, _armorCoef];
_newDamage = _newDamage * _damageCoef;
};
TRACE_6("Received hit",_hitpoint,_ammo,_newDamage,_realDamage,_directHit,_context);

// Drowning doesn't fire the EH for each hitpoint and never triggers _context=2 (LastHitPoint)
Expand Down
9 changes: 0 additions & 9 deletions addons/medical_engine/initSettings.inc.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,3 @@
true,
true
] call CBA_fnc_addSetting;

[
QGVAR(damagePassThroughEffect),
"SLIDER",
[LSTRING(damagePassThroughEffect_displayName), LSTRING(damagePassThroughEffect_description)],
ELSTRING(medical,Category),
[0, 1, 1, 2, true],
true
] call CBA_fnc_addSetting;
24 changes: 0 additions & 24 deletions addons/medical_engine/stringtable.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,29 +27,5 @@
<Japanese>車両衝突ダメージを有効化</Japanese>
<Chinesesimp>启用车辆碰撞损坏</Chinesesimp>
</Key>
<Key ID="STR_ACE_Medical_Engine_damagePassThroughEffect_description">
<English>Controls effect of armor 'passThrough' on final damage. Makes high armor values, like ones used in GL rigs, less effective.\nUse 0% for pre 3.16.0 armor behavior.\nOnly touch this if you know what you're doing!</English>
<French>Contrôle l'effet de la "pénétration" de l'armure sur les dégâts finaux. Rend les valeurs d'armures élevées, comme celles utilisées dans les gilets GL, moins efficaces.\nUtilisez 0% pour le comportement des armures des versions antérieures à 3.16.0.\nNe modifiez la valeur que si vous savez ce que vous faîtes !</French>
<Spanish>Controla el efecto de 'passThrough' de armadura en el daño final. Hace que los valores altos de armadura, como los usados en los chalecos GL, sean menos efectivos.\nUsar 0% para comportamiento de armadura en versiones anteriores a 3.16.0.\nSólo modifica esto si sabes lo que estás haciendo!</Spanish>
<Italian>Determina l'effetto di danni sul corpo che 'trapassano' l'armatura. Rende alti valori di protezione, come quelli su corpetti GL, meno efficaci.\nUtilizza 0% per il comportamento prima di v3.16.0.\nModifica questo valore solo se sai cosa stai facendo!</Italian>
<Polish>Kontroluje wpływ "penetracji" pancerza na ostateczne obrażenia. Sprawia, że wysokie wartości pancerza, takie jak te używane w kamizelkach GL, są mniej skuteczne.\nUżyj 0% dla zachowania pancerza sprzed wersji 3.16.0.\nZmień wartość tylko jeśli wiesz co robisz!</Polish>
<Portuguese>Controla o efeito de penetração (passThrough) da blindagem no dano final. Torna valores de blindagem altos, como os usados em coletes GL, menos eficazes.\nUse 0% para o comportamento de blindagem anterior à versão 3.16.0.\nSó mexa nisso se souber o que está fazendo!</Portuguese>
<Russian>Контролирует эффект `passThrough` при нанесении конечного урона. Делает высокие значения брони, подобные тем, которые используются в GL rigs, менее эффективными.\nИспользуйте 0% для поведения брони до версии 3.16.0.n\Прикасайтесь к этому, только если знаете, что делаете!</Russian>
<German>Steuert den Effekt des „Durchschlagens“ von Panzerung auf den Gesamtschaden. Macht hohe Panzerungswerte, wie sie in GL-Westen verwendet werden, weniger effektiv.\nVerwende 0% für das Panzerungsverhalten vor 3.16.0.\nÄndere den Wert nur, wenn du weißt, was du tust!</German>
<Korean>최종 데미지에 대한 방어구의 'PassThrough' 효과를 조정합니다. GL 리그에 사용되는 것과 같은 높은 방호값을 덜 효과적으로 만듭니다\n3.16.0 이전의 방어구 동작에는 0%를 사용하십시오.\n당신이 뭘 하고 있는지 알고 있는 경우에만 이걸 설정하세요!</Korean>
<Japanese>ボディアーマーの'passThrough'値が最終的な身体ダメージに与える影響を調整します。擲弾兵リグで使用されるような高い装甲値では効果が低くなります。\n3.16.0以前の挙動にするには0%にしてください。\nこれが何かわからない場合は変更しないことをお勧めします。</Japanese>
</Key>
<Key ID="STR_ACE_Medical_Engine_damagePassThroughEffect_displayName">
<English>Armor PassThrough Effect</English>
<French>Effet de pénétration d'armure</French>
<Spanish>Efecto de Atravesar Armadura</Spanish>
<Italian>Fattore di Trapasso Armatura</Italian>
<Polish>Efekt penetracji pancerza</Polish>
<Portuguese>Efeito de Penetração de Blindagem</Portuguese>
<Russian>Эффект сквозного прохождения брони</Russian>
<German>Effekt des Panzerungsdurchschlags</German>
<Korean>방어구 PassThrough 효과</Korean>
<Japanese>装甲貫通効果</Japanese>
</Key>
</Package>
</Project>
Loading