Require cancelled move orders to exit tunnels before completion.

This commit is contained in:
Paul Chote
2017-04-17 21:29:28 +00:00
parent c6d8957307
commit 0b0f8bc51e

View File

@@ -142,7 +142,9 @@ namespace OpenRA.Mods.Common.Activities
public override Activity Tick(Actor self) public override Activity Tick(Actor self)
{ {
if (IsCanceled) // If the actor is inside a tunnel then we must let them move
// all the way through before moving to the next activity
if (IsCanceled && self.Location.Layer != CustomMovementLayerType.Tunnel)
return NextActivity; return NextActivity;
if (mobile.IsTraitDisabled) if (mobile.IsTraitDisabled)
@@ -277,12 +279,6 @@ namespace OpenRA.Mods.Common.Activities
return Pair.New(nextCell, subCell); return Pair.New(nextCell, subCell);
} }
public override bool Cancel(Actor self)
{
path = NoPath;
return base.Cancel(self);
}
public override IEnumerable<Target> GetTargets(Actor self) public override IEnumerable<Target> GetTargets(Actor self)
{ {
if (path != null) if (path != null)
@@ -426,26 +422,29 @@ namespace OpenRA.Mods.Common.Activities
var fromSubcellOffset = map.Grid.OffsetOfSubCell(mobile.FromSubCell); var fromSubcellOffset = map.Grid.OffsetOfSubCell(mobile.FromSubCell);
var toSubcellOffset = map.Grid.OffsetOfSubCell(mobile.ToSubCell); var toSubcellOffset = map.Grid.OffsetOfSubCell(mobile.ToSubCell);
var nextCell = parent.PopPath(self); if (!IsCanceled || self.Location.Layer == CustomMovementLayerType.Tunnel)
if (nextCell != null)
{ {
if (IsTurn(mobile, nextCell.Value.First)) var nextCell = parent.PopPath(self);
if (nextCell != null)
{ {
var nextSubcellOffset = map.Grid.OffsetOfSubCell(nextCell.Value.Second); if (IsTurn(mobile, nextCell.Value.First))
var ret = new MoveFirstHalf( {
Move, var nextSubcellOffset = map.Grid.OffsetOfSubCell(nextCell.Value.Second);
Util.BetweenCells(self.World, mobile.FromCell, mobile.ToCell) + (fromSubcellOffset + toSubcellOffset) / 2, var ret = new MoveFirstHalf(
Util.BetweenCells(self.World, mobile.ToCell, nextCell.Value.First) + (toSubcellOffset + nextSubcellOffset) / 2, Move,
mobile.Facing, Util.BetweenCells(self.World, mobile.FromCell, mobile.ToCell) + (fromSubcellOffset + toSubcellOffset) / 2,
Util.GetNearestFacing(mobile.Facing, map.FacingBetween(mobile.ToCell, nextCell.Value.First, mobile.Facing)), Util.BetweenCells(self.World, mobile.ToCell, nextCell.Value.First) + (toSubcellOffset + nextSubcellOffset) / 2,
moveFraction - MoveFractionTotal); mobile.Facing,
Util.GetNearestFacing(mobile.Facing, map.FacingBetween(mobile.ToCell, nextCell.Value.First, mobile.Facing)),
moveFraction - MoveFractionTotal);
mobile.FinishedMoving(self); mobile.FinishedMoving(self);
mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, nextCell.Value.First, nextCell.Value.Second); mobile.SetLocation(mobile.ToCell, mobile.ToSubCell, nextCell.Value.First, nextCell.Value.Second);
return ret; return ret;
}
parent.path.Add(nextCell.Value.First);
} }
parent.path.Add(nextCell.Value.First);
} }
var toPos = mobile.ToCell.Layer == 0 ? map.CenterOfCell(mobile.ToCell) : var toPos = mobile.ToCell.Layer == 0 ? map.CenterOfCell(mobile.ToCell) :