diff --git a/OpenRA.Game/Traits/Activities/HeliReturn.cs b/OpenRA.Game/Traits/Activities/HeliReturn.cs index 629c230dfb..fc67046686 100644 --- a/OpenRA.Game/Traits/Activities/HeliReturn.cs +++ b/OpenRA.Game/Traits/Activities/HeliReturn.cs @@ -29,8 +29,9 @@ namespace OpenRA.Traits.Activities static Actor ChooseHelipad(Actor self) { + var rearmBuildings = self.Info.Traits.Get().RearmBuildings; return self.World.Queries.OwnedBy[self.Owner].FirstOrDefault( - a => a.Info.Name == "hpad" && + a => rearmBuildings.Contains(a.Info.Name) && !Reservable.IsReserved(a)); } diff --git a/OpenRA.Game/Traits/Activities/ReturnToBase.cs b/OpenRA.Game/Traits/Activities/ReturnToBase.cs index c1e1e1219c..3087d91375 100644 --- a/OpenRA.Game/Traits/Activities/ReturnToBase.cs +++ b/OpenRA.Game/Traits/Activities/ReturnToBase.cs @@ -37,7 +37,7 @@ namespace OpenRA.Traits.Activities public static Actor ChooseAirfield(Actor self) { return self.World.Queries.OwnedBy[self.Owner] - .Where(a => a.Info.Name == "afld" + .Where(a => self.Info.Traits.Get().RearmBuildings.Contains(a.Info.Name) && !Reservable.IsReserved(a)) .FirstOrDefault(); } diff --git a/OpenRA.Game/Traits/Helicopter.cs b/OpenRA.Game/Traits/Helicopter.cs index 712945b410..cbee8caf75 100644 --- a/OpenRA.Game/Traits/Helicopter.cs +++ b/OpenRA.Game/Traits/Helicopter.cs @@ -19,6 +19,7 @@ #endregion using System; +using System.Linq; using OpenRA.Traits.Activities; using OpenRA.GameRules; @@ -26,6 +27,8 @@ namespace OpenRA.Traits { class HelicopterInfo : ITraitInfo { + public readonly string[] RepairBuildings = { "fix" }; + public readonly string[] RearmBuildings = { "hpad" }; public object Create(Actor self) { return new Helicopter(self); } } @@ -34,10 +37,10 @@ namespace OpenRA.Traits public IDisposable reservation; public Helicopter(Actor self) {} - static bool HeliCanEnter(Actor a) + static bool HeliCanEnter(Actor self, Actor a) { - if (a.Info.Name == "hpad") return true; - if (a.Info.Name == "fix") return true; + if (self.Info.Traits.Get().RearmBuildings.Contains(a.Info.Name)) return true; + if (self.Info.Traits.Get().RepairBuildings.Contains(a.Info.Name)) return true; return false; } @@ -51,7 +54,7 @@ namespace OpenRA.Traits return new Order("Move", self, xy); } - if (HeliCanEnter(underCursor) + if (HeliCanEnter(self, underCursor) && underCursor.Owner == self.Owner && !Reservable.IsReserved(underCursor)) return new Order("Enter", self, underCursor); @@ -90,7 +93,7 @@ namespace OpenRA.Traits self.QueueActivity(new HeliFly(order.TargetActor.CenterLocation + offsetVec)); self.QueueActivity(new Turn(self.Info.Traits.GetOrDefault().InitialFacing)); self.QueueActivity(new HeliLand(false)); - self.QueueActivity(order.TargetActor.Info.Name == "hpad" + self.QueueActivity(self.Info.Traits.Get().RearmBuildings.Contains(order.TargetActor.Info.Name) ? (IActivity)new Rearm() : new Repair(true)); } } diff --git a/OpenRA.Game/Traits/Repairable.cs b/OpenRA.Game/Traits/Repairable.cs index 819ef65090..5689b55d01 100644 --- a/OpenRA.Game/Traits/Repairable.cs +++ b/OpenRA.Game/Traits/Repairable.cs @@ -19,12 +19,14 @@ #endregion using System; +using System.Linq; using OpenRA.Traits.Activities; namespace OpenRA.Traits { class RepairableInfo : ITraitInfo { + public readonly string[] RepairBuildings = { "fix" }; public object Create(Actor self) { return new Repairable(self); } } @@ -38,7 +40,7 @@ namespace OpenRA.Traits if (mi.Button != MouseButton.Right) return null; if (underCursor == null) return null; - if (underCursor.Info.Name == "fix" + if (self.Info.Traits.Get().RepairBuildings.Contains(underCursor.Info.Name) && underCursor.Owner == self.Owner && !Reservable.IsReserved(underCursor)) return new Order("Enter", self, underCursor);