Fix subterranean units teleporting to surface and jump jets to ground
This commit is contained in:
@@ -185,7 +185,8 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
if (margin >= 0)
|
if (margin >= 0)
|
||||||
toTerrainOrientation = WRot.SLerp(map.TerrainOrientation(mobile.FromCell), map.TerrainOrientation(mobile.ToCell), 1, 2);
|
toTerrainOrientation = WRot.SLerp(map.TerrainOrientation(mobile.FromCell), map.TerrainOrientation(mobile.ToCell), 1, 2);
|
||||||
|
|
||||||
QueueChild(new MoveFirstHalf(this, from, to, mobile.Facing, mobile.Facing, null, toTerrainOrientation, margin, carryoverProgress));
|
var movingOnGroundLayer = mobile.FromCell.Layer == 0 && mobile.ToCell.Layer == 0;
|
||||||
|
QueueChild(new MoveFirstHalf(this, from, to, mobile.Facing, mobile.Facing, null, toTerrainOrientation, margin, carryoverProgress, movingOnGroundLayer));
|
||||||
carryoverProgress = 0;
|
carryoverProgress = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -360,11 +361,12 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
protected readonly int ArcToLength;
|
protected readonly int ArcToLength;
|
||||||
protected readonly WAngle ArcToAngle;
|
protected readonly WAngle ArcToAngle;
|
||||||
protected readonly int Distance;
|
protected readonly int Distance;
|
||||||
|
protected readonly bool MovingOnGroundLayer;
|
||||||
readonly int terrainOrientationMargin;
|
readonly int terrainOrientationMargin;
|
||||||
protected int progress;
|
protected int progress;
|
||||||
|
|
||||||
public MovePart(Move move, WPos from, WPos to, WAngle fromFacing, WAngle toFacing,
|
public MovePart(Move move, WPos from, WPos to, WAngle fromFacing, WAngle toFacing,
|
||||||
WRot? fromTerrainOrientation, WRot? toTerrainOrientation, int terrainOrientationMargin, int carryoverProgress)
|
WRot? fromTerrainOrientation, WRot? toTerrainOrientation, int terrainOrientationMargin, int carryoverProgress, bool movingOnGroundLayer)
|
||||||
{
|
{
|
||||||
Move = move;
|
Move = move;
|
||||||
From = from;
|
From = from;
|
||||||
@@ -376,6 +378,7 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
progress = carryoverProgress;
|
progress = carryoverProgress;
|
||||||
Distance = (to - from).Length;
|
Distance = (to - from).Length;
|
||||||
this.terrainOrientationMargin = Math.Min(terrainOrientationMargin, Distance / 2);
|
this.terrainOrientationMargin = Math.Min(terrainOrientationMargin, Distance / 2);
|
||||||
|
MovingOnGroundLayer = movingOnGroundLayer;
|
||||||
|
|
||||||
IsInterruptible = false; // See comments in Move.Cancel()
|
IsInterruptible = false; // See comments in Move.Cancel()
|
||||||
|
|
||||||
@@ -436,7 +439,9 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
else
|
else
|
||||||
pos = WPos.Lerp(From, To, progress, Distance);
|
pos = WPos.Lerp(From, To, progress, Distance);
|
||||||
|
|
||||||
if (self.Location.Layer == 0)
|
// This makes sure units move smoothly moves over ramps
|
||||||
|
// HACK: DistanceAboveTerrain works only with ground layer
|
||||||
|
if (MovingOnGroundLayer)
|
||||||
pos -= new WVec(WDist.Zero, WDist.Zero, self.World.Map.DistanceAboveTerrain(pos));
|
pos -= new WVec(WDist.Zero, WDist.Zero, self.World.Map.DistanceAboveTerrain(pos));
|
||||||
|
|
||||||
mobile.SetCenterPosition(self, pos);
|
mobile.SetCenterPosition(self, pos);
|
||||||
@@ -470,8 +475,8 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
class MoveFirstHalf : MovePart
|
class MoveFirstHalf : MovePart
|
||||||
{
|
{
|
||||||
public MoveFirstHalf(Move move, WPos from, WPos to, WAngle fromFacing, WAngle toFacing,
|
public MoveFirstHalf(Move move, WPos from, WPos to, WAngle fromFacing, WAngle toFacing,
|
||||||
WRot? fromTerrainOrientation, WRot? toTerrainOrientation, int terrainOrientationMargin, int carryoverProgress)
|
WRot? fromTerrainOrientation, WRot? toTerrainOrientation, int terrainOrientationMargin, int carryoverProgress, bool movingOnGroundLayer)
|
||||||
: base(move, from, to, fromFacing, toFacing, fromTerrainOrientation, toTerrainOrientation, terrainOrientationMargin, carryoverProgress) { }
|
: base(move, from, to, fromFacing, toFacing, fromTerrainOrientation, toTerrainOrientation, terrainOrientationMargin, carryoverProgress, movingOnGroundLayer) { }
|
||||||
|
|
||||||
static bool IsTurn(Mobile mobile, CPos nextCell, Map map)
|
static bool IsTurn(Mobile mobile, CPos nextCell, Map map)
|
||||||
{
|
{
|
||||||
@@ -512,7 +517,8 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
ToTerrainOrientation,
|
ToTerrainOrientation,
|
||||||
nextToTerrainOrientation,
|
nextToTerrainOrientation,
|
||||||
margin,
|
margin,
|
||||||
progress - Distance);
|
progress - Distance,
|
||||||
|
mobile.ToCell.Layer == 0 && nextCell.Value.Cell.Layer == 0);
|
||||||
|
|
||||||
mobile.FinishedMoving(self);
|
mobile.FinishedMoving(self);
|
||||||
mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, nextCell.Value.Cell, nextCell.Value.SubCell);
|
mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, nextCell.Value.Cell, nextCell.Value.SubCell);
|
||||||
@@ -534,7 +540,8 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
ToTerrainOrientation,
|
ToTerrainOrientation,
|
||||||
null,
|
null,
|
||||||
mobile.Info.TerrainOrientationAdjustmentMargin.Length,
|
mobile.Info.TerrainOrientationAdjustmentMargin.Length,
|
||||||
progress - Distance);
|
progress - Distance,
|
||||||
|
MovingOnGroundLayer);
|
||||||
|
|
||||||
mobile.EnteringCell(self);
|
mobile.EnteringCell(self);
|
||||||
mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, mobile.ToCell, mobile.ToSubCell);
|
mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, mobile.ToCell, mobile.ToSubCell);
|
||||||
@@ -545,8 +552,8 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
class MoveSecondHalf : MovePart
|
class MoveSecondHalf : MovePart
|
||||||
{
|
{
|
||||||
public MoveSecondHalf(Move move, WPos from, WPos to, WAngle fromFacing, WAngle toFacing,
|
public MoveSecondHalf(Move move, WPos from, WPos to, WAngle fromFacing, WAngle toFacing,
|
||||||
WRot? fromTerrainOrientation, WRot? toTerrainOrientation, int terrainOrientationMargin, int carryoverProgress)
|
WRot? fromTerrainOrientation, WRot? toTerrainOrientation, int terrainOrientationMargin, int carryoverProgress, bool movingOnGroundLayer)
|
||||||
: base(move, from, to, fromFacing, toFacing, fromTerrainOrientation, toTerrainOrientation, terrainOrientationMargin, carryoverProgress) { }
|
: base(move, from, to, fromFacing, toFacing, fromTerrainOrientation, toTerrainOrientation, terrainOrientationMargin, carryoverProgress, movingOnGroundLayer) { }
|
||||||
|
|
||||||
protected override MovePart OnComplete(Actor self, Mobile mobile, Move parent)
|
protected override MovePart OnComplete(Actor self, Mobile mobile, Move parent)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user