diff --git a/OpenRA.Mods.Common/Traits/Armor.cs b/OpenRA.Mods.Common/Traits/Armor.cs index 04064cd913..e637ff52a1 100644 --- a/OpenRA.Mods.Common/Traits/Armor.cs +++ b/OpenRA.Mods.Common/Traits/Armor.cs @@ -13,10 +13,16 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Used to define weapon efficiency modifiers with different percentages per Type.")] - public class ArmorInfo : TraitInfo + public class ArmorInfo : UpgradableTraitInfo { public readonly string Type = null; + + public override object Create(ActorInitializer init) { return new Armor(init.Self, this); } } - public class Armor { } + public class Armor : UpgradableTrait + { + public Armor(Actor self, ArmorInfo info) + : base(info) { } + } } \ No newline at end of file diff --git a/OpenRA.Mods.Common/Warheads/DamageWarhead.cs b/OpenRA.Mods.Common/Warheads/DamageWarhead.cs index 460d019f52..5cbac65fe5 100644 --- a/OpenRA.Mods.Common/Warheads/DamageWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/DamageWarhead.cs @@ -9,6 +9,7 @@ #endregion using System.Collections.Generic; +using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -34,13 +35,13 @@ namespace OpenRA.Mods.Common.Warheads : new Dictionary(); } - public int DamageVersus(ActorInfo victim) + public int DamageVersus(Actor victim) { - var armor = victim.Traits.GetOrDefault(); - if (armor != null && armor.Type != null) + var armor = victim.TraitsImplementing().Where(a => !a.IsTraitDisabled && a.Info.Type != null); + foreach (var a in armor) { int versus; - if (Versus.TryGetValue(armor.Type, out versus)) + if (Versus.TryGetValue(a.Info.Type, out versus)) return versus; } @@ -60,7 +61,7 @@ namespace OpenRA.Mods.Common.Warheads public virtual void DoImpact(Actor victim, Actor firedBy, IEnumerable damageModifiers) { - var damage = Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(DamageVersus(victim.Info))); + var damage = Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(DamageVersus(victim))); victim.InflictDamage(firedBy, damage, this); } } diff --git a/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs b/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs index c1d5c5ab1f..62d252d849 100644 --- a/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Warheads return; // Damage is measured as a percentage of the target health - var damage = Util.ApplyPercentageModifiers(healthInfo.HP, damageModifiers.Append(Damage, DamageVersus(victim.Info))); + var damage = Util.ApplyPercentageModifiers(healthInfo.HP, damageModifiers.Append(Damage, DamageVersus(victim))); victim.InflictDamage(firedBy, damage, this); } }