From a94e35163ad88ed087b73fe9302a9d3b861cb2ee Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Tue, 4 Aug 2015 15:48:03 +0200 Subject: [PATCH] Have flying actors account for terrain height --- OpenRA.Mods.Common/Activities/Air/Fly.cs | 5 ++++- OpenRA.Mods.Common/Activities/Air/HeliFly.cs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenRA.Mods.Common/Activities/Air/Fly.cs b/OpenRA.Mods.Common/Activities/Air/Fly.cs index 8673e69413..f2c5da713c 100644 --- a/OpenRA.Mods.Common/Activities/Air/Fly.cs +++ b/OpenRA.Mods.Common/Activities/Air/Fly.cs @@ -37,6 +37,8 @@ namespace OpenRA.Mods.Common.Activities public static void FlyToward(Actor self, Plane plane, int desiredFacing, WDist desiredAltitude) { + desiredAltitude = new WDist(plane.CenterPosition.Z) + desiredAltitude - self.World.Map.DistanceAboveTerrain(plane.CenterPosition); + var move = plane.FlyStep(plane.Facing); var altitude = plane.CenterPosition.Z; @@ -71,7 +73,8 @@ namespace OpenRA.Mods.Common.Activities var desiredFacing = Util.GetFacing(d, plane.Facing); // Don't turn until we've reached the cruise altitude - if (plane.CenterPosition.Z < plane.Info.CruiseAltitude.Length) + var targetAltitude = plane.CenterPosition.Z + plane.Info.CruiseAltitude.Length - self.World.Map.DistanceAboveTerrain(plane.CenterPosition).Length; + if (plane.CenterPosition.Z < targetAltitude) desiredFacing = plane.Facing; FlyToward(self, plane, desiredFacing, plane.Info.CruiseAltitude); diff --git a/OpenRA.Mods.Common/Activities/Air/HeliFly.cs b/OpenRA.Mods.Common/Activities/Air/HeliFly.cs index 8c71abf7e1..c6f76cbd00 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliFly.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliFly.cs @@ -37,6 +37,8 @@ namespace OpenRA.Mods.Common.Activities public static bool AdjustAltitude(Actor self, Helicopter helicopter, WDist targetAltitude) { + targetAltitude = new WDist(helicopter.CenterPosition.Z) + targetAltitude - self.World.Map.DistanceAboveTerrain(helicopter.CenterPosition); + var altitude = helicopter.CenterPosition.Z; if (altitude == targetAltitude.Length) return false; @@ -78,7 +80,8 @@ namespace OpenRA.Mods.Common.Activities // The next move would overshoot, so just set the final position if (dist.HorizontalLengthSquared < move.HorizontalLengthSquared) { - helicopter.SetPosition(self, pos + new WVec(0, 0, helicopter.Info.CruiseAltitude.Length - pos.Z)); + var targetAltitude = helicopter.CenterPosition.Z + helicopter.Info.CruiseAltitude.Length - self.World.Map.DistanceAboveTerrain(helicopter.CenterPosition).Length; + helicopter.SetPosition(self, pos + new WVec(0, 0, targetAltitude - pos.Z)); return NextActivity; }