Require cancelled move orders to exit tunnels before completion.
This commit is contained in:
@@ -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) :
|
||||||
|
|||||||
Reference in New Issue
Block a user