diff --git a/OpenRA.Mods.RA/Air/HeliFly.cs b/OpenRA.Mods.RA/Air/HeliFly.cs index 94d570ba0f..881faf0daf 100755 --- a/OpenRA.Mods.RA/Air/HeliFly.cs +++ b/OpenRA.Mods.RA/Air/HeliFly.cs @@ -16,12 +16,21 @@ namespace OpenRA.Mods.RA.Air class HeliFly : Activity { readonly Helicopter helicopter; - readonly WPos pos; + readonly Target target; + readonly WRange maxRange; + readonly WRange minRange; public HeliFly(Actor self, Target t) { helicopter = self.Trait(); - pos = t.CenterPosition; + target = t; + } + + public HeliFly(Actor self, Target t, WRange minRange, WRange maxRange) + : this(self, t) + { + this.maxRange = maxRange; + this.minRange = minRange; } public static bool AdjustAltitude(Actor self, Helicopter helicopter, WRange targetAltitude) @@ -45,13 +54,26 @@ namespace OpenRA.Mods.RA.Air if (AdjustAltitude(self, helicopter, helicopter.Info.CruiseAltitude)) return this; + var pos = target.CenterPosition; + // Rotate towards the target var dist = pos - self.CenterPosition; var desiredFacing = Util.GetFacing(dist, helicopter.Facing); helicopter.Facing = Util.TickFacing(helicopter.Facing, desiredFacing, helicopter.ROT); + var move = helicopter.FlyStep(desiredFacing); + + // Inside the minimum range, so reverse + if (minRange.Range > 0 && target.IsInRange(helicopter.CenterPosition, minRange)) + { + helicopter.SetPosition(self, helicopter.CenterPosition - move); + return this; + } + + // Inside the maximum range, so we're done + if (maxRange.Range > 0 && target.IsInRange(helicopter.CenterPosition, maxRange)) + return NextActivity; // The next move would overshoot, so just set the final position - var move = helicopter.FlyStep(desiredFacing); if (dist.HorizontalLengthSquared < move.HorizontalLengthSquared) { helicopter.SetPosition(self, pos + new WVec(0, 0, helicopter.Info.CruiseAltitude.Range - pos.Z)); @@ -65,7 +87,7 @@ namespace OpenRA.Mods.RA.Air public override IEnumerable GetTargets(Actor self) { - yield return Target.FromPos(pos); + yield return target; } } } diff --git a/OpenRA.Mods.RA/Air/Helicopter.cs b/OpenRA.Mods.RA/Air/Helicopter.cs index acb6d06fd3..9621b815b7 100755 --- a/OpenRA.Mods.RA/Air/Helicopter.cs +++ b/OpenRA.Mods.RA/Air/Helicopter.cs @@ -154,7 +154,8 @@ namespace OpenRA.Mods.RA.Air public Activity MoveTo(CPos cell, int nearEnough) { return new HeliFly(self, Target.FromCell(cell)); } public Activity MoveTo(CPos cell, Actor ignoredActor) { return new HeliFly(self, Target.FromCell(cell)); } - public Activity MoveWithinRange(Target target, WRange range) { return new HeliFly(self, target); } + public Activity MoveWithinRange(Target target, WRange range) { return new HeliFly(self, target, WRange.Zero, range); } + public Activity MoveWithinRange(Target target, WRange minRange, WRange maxRange) { return new HeliFly(self, target, minRange, maxRange); } public CPos NearestMoveableCell(CPos cell) { return cell; } } }