diff --git a/OpenRA.FileFormats/WVec.cs b/OpenRA.FileFormats/WVec.cs index e792a75ae6..ab96bea054 100644 --- a/OpenRA.FileFormats/WVec.cs +++ b/OpenRA.FileFormats/WVec.cs @@ -38,6 +38,7 @@ namespace OpenRA public static int Dot(WVec a, WVec b) { return a.X * b.X + a.Y * b.Y + a.Z * b.Z; } public long LengthSquared { get { return (long)X * X + (long)Y * Y + (long)Z * Z; } } public int Length { get { return (int)Math.Sqrt(LengthSquared); } } + public long HorizontalLengthSquared { get { return (long)X * X + (long)Y * Y; } } public WVec Rotate(WRot rot) { diff --git a/OpenRA.Game/Traits/Target.cs b/OpenRA.Game/Traits/Target.cs index 2bd84ffd11..39d0153123 100644 --- a/OpenRA.Game/Traits/Target.cs +++ b/OpenRA.Game/Traits/Target.cs @@ -91,12 +91,7 @@ namespace OpenRA.Traits // Target ranges are calculated in 2D, so ignore height differences var rangeSquared = range.Range*range.Range; - return Positions.Any(t => - { - var dx = (long)(t.X - origin.X); - var dy = (long)(t.Y - origin.Y); - return dx*dx + dy*dy <= rangeSquared; - }); + return Positions.Any(t => (t - origin).HorizontalLengthSquared <= rangeSquared); } } diff --git a/OpenRA.Mods.RA/Air/Land.cs b/OpenRA.Mods.RA/Air/Land.cs index eb5d41f398..42ac37f569 100755 --- a/OpenRA.Mods.RA/Air/Land.cs +++ b/OpenRA.Mods.RA/Air/Land.cs @@ -25,13 +25,19 @@ namespace OpenRA.Mods.RA.Air if (!Target.IsValid) Cancel(self); - if (IsCanceled) return NextActivity; - - var d = Target.CenterPosition - self.CenterPosition; - if (d.LengthSquared < 256*256) // close enough (1/4 cell) + if (IsCanceled) return NextActivity; var aircraft = self.Trait(); + var d = Target.CenterPosition - self.CenterPosition; + + // close enough (1/16 cell) + // TODO: TickMove may overshoot if the aircraft speed is too high + if (d.HorizontalLengthSquared < 4096) + { + aircraft.SetPxPosition(self, PPos.FromWPos(Target.CenterPosition)); + return NextActivity; + } if (aircraft.Altitude > 0) --aircraft.Altitude;