diff --git a/OpenRA.Game/Traits/Activities/Fly.cs b/OpenRA.Game/Traits/Activities/Fly.cs index 4eacfb4c81..5632051a5a 100644 --- a/OpenRA.Game/Traits/Activities/Fly.cs +++ b/OpenRA.Game/Traits/Activities/Fly.cs @@ -31,11 +31,11 @@ namespace OpenRA.Traits.Activities public Fly(int2 pos) { Pos = Util.CenterOfCell(pos); } public IActivity NextActivity { get; set; } - - const int CruiseAltitude = 20; public IActivity Tick(Actor self) { + var cruiseAltitude = self.Info.Traits.Get().CruiseAltitude; + if (isCanceled) return NextActivity; var d = Pos - self.CenterLocation; @@ -45,14 +45,14 @@ namespace OpenRA.Traits.Activities var unit = self.traits.Get(); var desiredFacing = Util.GetFacing(d, unit.Facing); - if (unit.Altitude == CruiseAltitude) + if (unit.Altitude == cruiseAltitude) Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get().ROT); - - if (unit.Altitude < CruiseAltitude) + + if (unit.Altitude < cruiseAltitude) ++unit.Altitude; - FlyUtil.Fly(self, CruiseAltitude); + FlyUtil.Fly(self, cruiseAltitude); return this; } diff --git a/OpenRA.Game/Traits/Plane.cs b/OpenRA.Game/Traits/Plane.cs index cb09615e38..78cd38cd46 100644 --- a/OpenRA.Game/Traits/Plane.cs +++ b/OpenRA.Game/Traits/Plane.cs @@ -19,12 +19,17 @@ #endregion using System; +using System.Linq; using OpenRA.Traits.Activities; namespace OpenRA.Traits { class PlaneInfo : ITraitInfo { + public readonly int CruiseAltitude = 20; + public readonly string[] RearmBuildings = { "afld" }; + public readonly string[] RepairBuildings = { "fix" }; + public object Create(Actor self) { return new Plane(self); } } @@ -34,22 +39,21 @@ namespace OpenRA.Traits public Plane(Actor self) {} - // todo: push into data! - static bool PlaneCanEnter(Actor a) + static bool PlaneCanEnter(Actor self, Actor a) { - if (a.Info.Name == "afld") return true; - if (a.Info.Name == "fix") return true; - return false; + var plane = self.Info.Traits.Get(); + return plane.RearmBuildings.Contains(a.Info.Name) + || plane.RepairBuildings.Contains(a.Info.Name); } public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) { if (mi.Button == MouseButton.Left) return null; + if (underCursor == null) - { - return new Order("Move", self, xy); - } - if (PlaneCanEnter(underCursor) + return new Order("Move", self, xy); + + if (PlaneCanEnter(self, underCursor) && underCursor.Owner == self.Owner && !Reservable.IsReserved(underCursor)) return new Order("Enter", self, underCursor); @@ -80,10 +84,13 @@ namespace OpenRA.Traits if (res != null) reservation = res.Reserve(self); + var info = self.Info.Traits.Get(); + self.CancelActivity(); self.QueueActivity(new ReturnToBase(self, order.TargetActor)); - self.QueueActivity(order.TargetActor.Info.Name == "afld" - ? (IActivity)new Rearm() : new Repair(true)); + self.QueueActivity( + info.RearmBuildings.Contains(order.TargetActor.Info.Name) + ? (IActivity)new Rearm() : new Repair(true)); } }