diff --git a/OpenRA.Mods.Common/Activities/Air/FlyCircle.cs b/OpenRA.Mods.Common/Activities/Air/FlyIdle.cs similarity index 52% rename from OpenRA.Mods.Common/Activities/Air/FlyCircle.cs rename to OpenRA.Mods.Common/Activities/Air/FlyIdle.cs index 88df46c9d0..b69ba7f309 100644 --- a/OpenRA.Mods.Common/Activities/Air/FlyCircle.cs +++ b/OpenRA.Mods.Common/Activities/Air/FlyIdle.cs @@ -9,22 +9,26 @@ */ #endregion +using System.Linq; using OpenRA.Activities; using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; namespace OpenRA.Mods.Common.Activities { - public class FlyCircle : Activity + public class FlyIdle : Activity { readonly Aircraft aircraft; - readonly int turnSpeedOverride; + readonly INotifyIdle[] tickIdles; + readonly int turnSpeed; int remainingTicks; - public FlyCircle(Actor self, int ticks = -1, int turnSpeedOverride = -1) + public FlyIdle(Actor self, int ticks = -1) { aircraft = self.Trait(); + tickIdles = self.TraitsImplementing().ToArray(); + turnSpeed = aircraft.Info.IdleTurnSpeed > -1 ? aircraft.Info.IdleTurnSpeed : aircraft.TurnSpeed; remainingTicks = ticks; - this.turnSpeedOverride = turnSpeedOverride; } public override bool Tick(Actor self) @@ -32,26 +36,25 @@ namespace OpenRA.Mods.Common.Activities if (remainingTicks == 0 || (NextActivity != null && remainingTicks < 0)) return true; - // Refuse to take off if it would land immediately again. - if (aircraft.ForceLanding) - { - Cancel(self); - return true; - } - - if (IsCanceling) + if (aircraft.ForceLanding || IsCanceling) return true; if (remainingTicks > 0) remainingTicks--; - // We can't possibly turn this fast - var desiredFacing = aircraft.Facing + 64; + foreach (var tickIdle in tickIdles) + tickIdle.TickIdle(self); - // This override is necessary, otherwise aircraft with CanSlide would circle sideways - var move = aircraft.FlyStep(aircraft.Facing); + if (!aircraft.Info.CanHover) + { + // We can't possibly turn this fast + var desiredFacing = aircraft.Facing + 64; - Fly.FlyTick(self, aircraft, desiredFacing, aircraft.Info.CruiseAltitude, move, turnSpeedOverride); + // This override is necessary, otherwise aircraft with CanSlide would circle sideways + var move = aircraft.FlyStep(aircraft.Facing); + + Fly.FlyTick(self, aircraft, desiredFacing, aircraft.Info.CruiseAltitude, move, turnSpeed); + } return false; } diff --git a/OpenRA.Mods.Common/Activities/Air/Land.cs b/OpenRA.Mods.Common/Activities/Air/Land.cs index ec382b5956..e3489ebac7 100644 --- a/OpenRA.Mods.Common/Activities/Air/Land.cs +++ b/OpenRA.Mods.Common/Activities/Air/Land.cs @@ -215,10 +215,7 @@ namespace OpenRA.Mods.Common.Activities if (!aircraft.CanLand(blockingCells, target.Actor)) { // Maintain holding pattern. - if (aircraft.Info.CanHover) - QueueChild(new Wait(25)); - else - QueueChild(new FlyCircle(self, 25)); + QueueChild(new FlyIdle(self, 25)); self.NotifyBlocker(blockingCells); finishedApproach = false; diff --git a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs index e5732c06c8..b6888a7701 100644 --- a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs @@ -100,7 +100,7 @@ namespace OpenRA.Mods.Common.Activities } QueueChild(new Fly(self, Target.FromActor(nearestResupplier), WDist.Zero, aircraft.Info.WaitDistanceFromResupplyBase, targetLineColor: Color.Green)); - QueueChild(new FlyCircle(self, aircraft.Info.NumberOfTicksToVerifyAvailableAirport)); + QueueChild(new FlyIdle(self, aircraft.Info.NumberOfTicksToVerifyAvailableAirport)); return false; } diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 98fea3476b..eb59335dd6 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -712,8 +712,8 @@ namespace OpenRA.Mods.Common.Traits self.QueueActivity(new TakeOff(self)); else if (Info.IdleBehavior == IdleBehaviorType.Land && Info.LandableTerrainTypes.Count > 0) self.QueueActivity(new Land(self)); - else if (!Info.CanHover) - self.QueueActivity(new FlyCircle(self, -1, Info.IdleTurnSpeed > -1 ? Info.IdleTurnSpeed : TurnSpeed)); + else + self.QueueActivity(new FlyIdle(self)); } }