diff --git a/OpenRA.Mods.Common/Traits/Health.cs b/OpenRA.Mods.Common/Traits/Health.cs index 45ff73dc09..048f323fea 100644 --- a/OpenRA.Mods.Common/Traits/Health.cs +++ b/OpenRA.Mods.Common/Traits/Health.cs @@ -168,11 +168,24 @@ namespace OpenRA.Mods.Common.Traits // Apply any damage modifiers if (!ignoreModifiers && damage.Value > 0) { - var modifiers = damageModifiers - .Concat(damageModifiersPlayer) - .Select(t => t.GetDamageModifier(attacker, damage)); + // PERF: Util.ApplyPercentageModifiers has been manually inlined to + // avoid unnecessary loop enumerations and allocations + var appliedDamage = (decimal)damage.Value; + foreach (var dm in damageModifiers) + { + var modifier = dm.GetDamageModifier(attacker, damage); + if (modifier != 100) + appliedDamage *= modifier / 100m; + } - damage = new Damage(Util.ApplyPercentageModifiers(damage.Value, modifiers), damage.DamageTypes); + foreach (var dm in damageModifiersPlayer) + { + var modifier = dm.GetDamageModifier(attacker, damage); + if (modifier != 100) + appliedDamage *= modifier / 100m; + } + + damage = new Damage((int)appliedDamage, damage.DamageTypes); } hp = (hp - damage.Value).Clamp(0, MaxHP);