diff --git a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs index d6894c2e71..6794b019da 100644 --- a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs @@ -110,7 +110,7 @@ namespace OpenRA.Mods.Common.Activities if (ShouldLandAtBuilding(self, dest)) { - var exit = dest.FirstExitOrDefault(); + var exit = dest.NearestExitOrDefault(self.CenterPosition); var offset = WVec.Zero; if (exit != null) { diff --git a/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs index 84fd89bed6..86652c6338 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs @@ -86,7 +86,7 @@ namespace OpenRA.Mods.Common.Scripting if (rp.Path.Count > 0) return rp.Path.Last(); - var exit = Self.FirstExitOrDefault(); + var exit = Self.NearestExitOrDefault(Self.CenterPosition); if (exit != null) return Self.Location + exit.Info.ExitCell; diff --git a/OpenRA.Mods.Common/Traits/Buildings/Exit.cs b/OpenRA.Mods.Common/Traits/Buildings/Exit.cs index 4d8ca7680d..48b3926866 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Exit.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Exit.cs @@ -46,16 +46,13 @@ namespace OpenRA.Mods.Common.Traits public static class ExitExts { - public static Exit FirstExitOrDefault(this Actor actor, string productionType = null) + public static Exit NearestExitOrDefault(this Actor actor, WPos pos, string productionType = null, Func p = null) { - var all = actor.TraitsImplementing() - .Where(Exts.IsTraitEnabled) - .OrderBy(e => e.Info.Priority); + var all = Exits(actor, productionType) + .OrderBy(e => e.Info.Priority) + .ThenBy(e => (actor.CenterPosition + e.Info.SpawnOffset - pos).Length); - if (string.IsNullOrEmpty(productionType)) - return all.FirstOrDefault(); - - return all.FirstOrDefault(e => e.Info.ProductionTypes.Count == 0 || e.Info.ProductionTypes.Contains(productionType)); + return p != null ? all.FirstOrDefault(p) : all.FirstOrDefault(); } public static IEnumerable Exits(this Actor actor, string productionType = null) diff --git a/OpenRA.Mods.Common/Traits/Production.cs b/OpenRA.Mods.Common/Traits/Production.cs index 5521704858..dff46206a9 100644 --- a/OpenRA.Mods.Common/Traits/Production.cs +++ b/OpenRA.Mods.Common/Traits/Production.cs @@ -101,7 +101,10 @@ namespace OpenRA.Mods.Common.Traits protected virtual Exit SelectExit(Actor self, ActorInfo producee, string productionType, Func p) { - return self.RandomExitOrDefault(self.World, productionType, p); + if (!rp.IsValueCreated || rp.Value.Path.Count == 0) + return self.RandomExitOrDefault(self.World, productionType, p); + + return self.NearestExitOrDefault(self.World.Map.CenterOfCell(rp.Value.Path[0]), productionType, p); } protected Exit SelectExit(Actor self, ActorInfo producee, string productionType)