diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index 387008e9c7..9f8e6b4bbe 100755 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -34,6 +34,11 @@ namespace OpenRA return world.WorldActor.Trait().ActorsInBox(u,v); } + public static Actor ClosestTo( this IEnumerable actors, int2 px ) + { + return actors.OrderBy( a => (a.CenterLocation - px).LengthSquared ).FirstOrDefault(); + } + public static IEnumerable FindUnitsInCircle(this World world, int2 a, int r) { using (new PerfSample("FindUnitsInCircle")) diff --git a/OpenRA.Mods.RA/Activities/LayMines.cs b/OpenRA.Mods.RA/Activities/LayMines.cs index 339663004c..c2865704c9 100644 --- a/OpenRA.Mods.RA/Activities/LayMines.cs +++ b/OpenRA.Mods.RA/Activities/LayMines.cs @@ -32,15 +32,13 @@ namespace OpenRA.Mods.RA.Activities var buildings = self.Info.Traits.Get().RearmBuildings; var rearmTarget = self.World.Actors.Where(a => a.Owner != null && self.Owner.Stances[a.Owner] == Stance.Ally && buildings.Contains(a.Info.Name)) - .OrderBy( a => (a.Location - self.Location).LengthSquared ) - .FirstOrDefault(); + .ClosestTo( self.CenterLocation ); if (rearmTarget == null) return new Wait(20); return Util.SequenceActivities( new Enter(rearmTarget), - //new Move(Util.CellContaining(rearmTarget.CenterLocation), rearmTarget), new Rearm(self), new Repair(rearmTarget), this ); diff --git a/OpenRA.Mods.RA/Air/ReturnToBase.cs b/OpenRA.Mods.RA/Air/ReturnToBase.cs index 8d3ffdc885..ca7370d1b1 100755 --- a/OpenRA.Mods.RA/Air/ReturnToBase.cs +++ b/OpenRA.Mods.RA/Air/ReturnToBase.cs @@ -25,13 +25,13 @@ namespace OpenRA.Mods.RA.Air public static Actor ChooseAirfield(Actor self) { - return self.World.ActorsWithTrait() - .Where(a => a.Actor.Owner == self.Owner) - .Where(a => self.Info.Traits.Get().RearmBuildings.Contains(a.Actor.Info.Name) - && !Reservable.IsReserved(a.Actor)) - .OrderBy(a => (a.Actor.CenterLocation - self.CenterLocation).LengthSquared) - .Select(a => a.Actor) - .FirstOrDefault(); + var rearmBuildings = self.Info.Traits.Get().RearmBuildings; + return self.World.ActorsWithTrait() + .Where(a => a.Actor.Owner == self.Owner) + .Where(a => rearmBuildings.Contains(a.Actor.Info.Name) + && !Reservable.IsReserved(a.Actor)) + .Select(a => a.Actor) + .ClosestTo( self.CenterLocation ); } void Calculate(Actor self) diff --git a/OpenRA.Mods.RA/AutoHeal.cs b/OpenRA.Mods.RA/AutoHeal.cs index 63bcbeaa10..51cdbd7c01 100644 --- a/OpenRA.Mods.RA/AutoHeal.cs +++ b/OpenRA.Mods.RA/AutoHeal.cs @@ -28,11 +28,10 @@ namespace OpenRA.Mods.RA .Where(a => a.IsInWorld && !a.IsDead()) .Where(a => a.HasTrait() && a.GetDamageState() > DamageState.Undamaged) .Where(a => attack.HasAnyValidWeapons(Target.FromActor(a))) - .OrderBy(a => (a.CenterLocation - self.CenterLocation).LengthSquared) - .FirstOrDefault(); + .ClosestTo( self.CenterLocation ); if( target != null ) self.QueueActivity(self.Trait().GetAttackActivity(self, Target.FromActor( target ), false )); } } -} \ No newline at end of file +} diff --git a/OpenRA.Mods.RA/AutoTarget.cs b/OpenRA.Mods.RA/AutoTarget.cs index 9d1711a15a..a9c29d284e 100644 --- a/OpenRA.Mods.RA/AutoTarget.cs +++ b/OpenRA.Mods.RA/AutoTarget.cs @@ -101,8 +101,7 @@ namespace OpenRA.Mods.RA .Where(a => a.Owner != null && a.AppearsHostileTo(self)) .Where(a => !a.HasTrait()) .Where(a => attack.HasAnyValidWeapons(Target.FromActor(a))) - .OrderBy(a => (a.CenterLocation - self.CenterLocation).LengthSquared) - .FirstOrDefault(); + .ClosestTo( self.CenterLocation ); } } diff --git a/OpenRA.Mods.RA/HackyAI.cs b/OpenRA.Mods.RA/HackyAI.cs index 807865a5c4..f1814caa7a 100644 --- a/OpenRA.Mods.RA/HackyAI.cs +++ b/OpenRA.Mods.RA/HackyAI.cs @@ -305,7 +305,7 @@ namespace OpenRA.Mods.RA { // Found enemy units nearby. foundEnemy = true; - var enemy = enemyUnits.OrderBy(e => (e.Location - a1.Location).LengthSquared).First(); + var enemy = enemyUnits.ClosestTo( a1.CenterLocation ); // Check how many own units we have gathered nearby... var ownUnits = world.FindUnitsInCircle(a1.CenterLocation, Game.CellSize * 2) diff --git a/OpenRA.Mods.RA/ProximityCapturable.cs b/OpenRA.Mods.RA/ProximityCapturable.cs index 7115324550..4696062bc0 100644 --- a/OpenRA.Mods.RA/ProximityCapturable.cs +++ b/OpenRA.Mods.RA/ProximityCapturable.cs @@ -174,8 +174,7 @@ namespace OpenRA.Mods.RA // TODO exclude other NeutralActor that arent permanent Actor GetInRange(Actor self) { - return CaptorsInRange(self).OrderBy(a => (a.CenterLocation - self.CenterLocation).LengthSquared) - .FirstOrDefault(); + return CaptorsInRange(self).ClosestTo( self.CenterLocation ); } int CountPlayersNear(Actor self, Player ignoreMe)