diff --git a/OpenRA.Mods.Common/Activities/Air/FlyForward.cs b/OpenRA.Mods.Common/Activities/Air/FlyForward.cs index 5cbfa9139b..94c011c95d 100644 --- a/OpenRA.Mods.Common/Activities/Air/FlyForward.cs +++ b/OpenRA.Mods.Common/Activities/Air/FlyForward.cs @@ -18,15 +18,28 @@ namespace OpenRA.Mods.Common.Activities { readonly Aircraft aircraft; readonly WDist cruiseAltitude; - int remainingTicks; + readonly int flyTicks; + int remainingDistance; + int ticks; - public FlyForward(int ticks, Actor self) + FlyForward(Actor self) { - remainingTicks = ticks; aircraft = self.Trait(); cruiseAltitude = aircraft.Info.CruiseAltitude; } + public FlyForward(int ticks, Actor self) + : this(self) + { + flyTicks = ticks; + } + + public FlyForward(Actor self, WDist distance) + : this(self) + { + remainingDistance = distance.Length; + } + public override bool Tick(Actor self) { // Refuse to take off if it would land immediately again. @@ -36,11 +49,15 @@ namespace OpenRA.Mods.Common.Activities return true; } - if (IsCanceling || remainingTicks-- == 0) + // Having flyTicks < 0 is valid and means the actor flies until this activity is canceled + if (IsCanceling || (flyTicks > 0 && ticks++ >= flyTicks) || (flyTicks == 0 && remainingDistance <= 0)) return true; - Fly.FlyTick(self, aircraft, aircraft.Facing, cruiseAltitude); + // FlyTick moves the aircraft while FlyStep calculates how far we are moving + if (remainingDistance != 0) + remainingDistance -= aircraft.FlyStep(aircraft.Facing).HorizontalLength; + Fly.FlyTick(self, aircraft, aircraft.Facing, cruiseAltitude); return false; } }