diff --git a/OpenRa.Game/Shroud.cs b/OpenRa.Game/Shroud.cs index 18dab2724d..a6cc09b4d2 100644 --- a/OpenRa.Game/Shroud.cs +++ b/OpenRa.Game/Shroud.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using IjwFramework.Types; using OpenRa.Game.Graphics; +using OpenRa.Game.Traits; namespace OpenRa.Game { diff --git a/OpenRa.Game/Traits/AutoHeal.cs b/OpenRa.Game/Traits/AutoHeal.cs index a833cc8c25..66cc04ba6a 100644 --- a/OpenRa.Game/Traits/AutoHeal.cs +++ b/OpenRa.Game/Traits/AutoHeal.cs @@ -17,23 +17,16 @@ namespace OpenRa.Game.Traits self.CancelActivity(); } - float GetMaximumRange(Actor self) - { - return new[] { self.LegacyInfo.Primary, self.LegacyInfo.Secondary } - .Where(w => w != null) - .Max(w => Rules.WeaponInfo[w].Range); - } - bool NeedsNewTarget(Actor self) { var attack = self.traits.WithInterface().First(); - var range = GetMaximumRange(self); + var range = Util.GetMaximumRange(self); if (attack.target == null) return true; // he's dead. if ((attack.target.Location - self.Location).LengthSquared > range * range + 2) return true; // wandered off faster than we could follow - if (attack.target.Health == attack.target.LegacyInfo.Strength) + if (attack.target.Health == attack.target.Info.Traits.WithInterface().First().HP) return true; // fully healed return false; @@ -42,7 +35,7 @@ namespace OpenRa.Game.Traits public void Tick(Actor self) { var attack = self.traits.WithInterface().First(); - var range = GetMaximumRange(self); + var range = Util.GetMaximumRange(self); if (NeedsNewTarget(self)) AttackTarget(self, ChooseTarget(self, range)); diff --git a/OpenRa.Game/Traits/AutoTarget.cs b/OpenRa.Game/Traits/AutoTarget.cs index 29d588a8f3..33fc5002c5 100644 --- a/OpenRa.Game/Traits/AutoTarget.cs +++ b/OpenRa.Game/Traits/AutoTarget.cs @@ -13,20 +13,12 @@ namespace OpenRa.Game.Traits attack.ResolveOrder(self, new Order("Attack", self, target, int2.Zero, null)); } - float GetMaximumRange(Actor self) - { - var info = self.Info.Traits.WithInterface().First(); - return new[] { info.PrimaryWeapon, info.SecondaryWeapon } - .Where(w => w != null) - .Max(w => Rules.WeaponInfo[w].Range); - } - public void Tick(Actor self) { if (!self.IsIdle) return; var attack = self.traits.WithInterface().First(); - var range = GetMaximumRange(self); + var range = Util.GetMaximumRange(self); if (attack.target == null || (attack.target.Location - self.Location).LengthSquared > range * range + 2) diff --git a/OpenRa.Game/Traits/Util.cs b/OpenRa.Game/Traits/Util.cs index fda0a447a1..bef22a08b9 100755 --- a/OpenRa.Game/Traits/Util.cs +++ b/OpenRa.Game/Traits/Util.cs @@ -142,5 +142,13 @@ namespace OpenRa.Game.Traits return acts.Reverse().Aggregate( (next, a) => { a.NextActivity = next; return a; }); } + + public static float GetMaximumRange(Actor self) + { + var info = self.Info.Traits.WithInterface().First(); + return new[] { info.PrimaryWeapon, info.SecondaryWeapon } + .Where(w => w != null) + .Max(w => Rules.WeaponInfo[w].Range); + } } }