Replace pseudo-childactivities in Enter and related.

This commit is contained in:
tovl
2019-04-02 21:49:15 +02:00
committed by Paul Chote
parent d5588c51ed
commit a000b173d8
3 changed files with 21 additions and 48 deletions

View File

@@ -136,9 +136,10 @@ namespace OpenRA.Mods.Common.Activities
base.OnActorDispose(self); base.OnActorDispose(self);
} }
protected override void OnCancel(Actor self) public override void Cancel(Actor self, bool keepQueue = false)
{ {
CancelCapture(self); CancelCapture(self);
base.Cancel(self, keepQueue);
} }
void CancelCapture(Actor self) void CancelCapture(Actor self)

View File

@@ -20,7 +20,7 @@ namespace OpenRA.Mods.Common.Activities
public abstract class Enter : Activity public abstract class Enter : Activity
{ {
enum EnterState { Approaching, Waiting, Entering, Exiting } enum EnterState { Approaching, Entering, Exiting }
readonly IMove move; readonly IMove move;
readonly Color? targetLineColor; readonly Color? targetLineColor;
@@ -57,12 +57,6 @@ namespace OpenRA.Mods.Common.Activities
/// </summary> /// </summary>
protected virtual void OnEnterComplete(Actor self, Actor targetActor) { } protected virtual void OnEnterComplete(Actor self, Actor targetActor) { }
/// <summary>
/// Called when the activity is cancelled to allow subclasses to clean up their own state.
/// </summary>
protected virtual void OnCancel(Actor self) { }
Activity moveActivity;
public override Activity Tick(Actor self) public override Activity Tick(Actor self)
{ {
// Update our view of the target // Update our view of the target
@@ -86,10 +80,10 @@ namespace OpenRA.Mods.Common.Activities
// We need to wait for movement to finish before transitioning to // We need to wait for movement to finish before transitioning to
// the next state or next activity // the next state or next activity
if (moveActivity != null) if (ChildActivity != null)
{ {
moveActivity = ActivityUtils.RunActivity(self, moveActivity); ChildActivity = ActivityUtils.RunActivity(self, ChildActivity);
if (moveActivity != null) if (ChildActivity != null)
return this; return this;
} }
@@ -97,7 +91,6 @@ namespace OpenRA.Mods.Common.Activities
switch (lastState) switch (lastState)
{ {
case EnterState.Approaching: case EnterState.Approaching:
case EnterState.Waiting:
{ {
// NOTE: We can safely cancel in this case because we know the // NOTE: We can safely cancel in this case because we know the
// actor has finished any in-progress move activities // actor has finished any in-progress move activities
@@ -111,12 +104,10 @@ namespace OpenRA.Mods.Common.Activities
// We are not next to the target - lets fix that // We are not next to the target - lets fix that
if (target.Type != TargetType.Invalid && !move.CanEnterTargetNow(self, target)) if (target.Type != TargetType.Invalid && !move.CanEnterTargetNow(self, target))
{ {
lastState = EnterState.Approaching;
// Target lines are managed by this trait, so we do not pass targetLineColor // Target lines are managed by this trait, so we do not pass targetLineColor
var initialTargetPosition = (useLastVisibleTarget ? lastVisibleTarget : target).CenterPosition; var initialTargetPosition = (useLastVisibleTarget ? lastVisibleTarget : target).CenterPosition;
moveActivity = ActivityUtils.RunActivity(self, move.MoveToTarget(self, target, initialTargetPosition)); QueueChild(self, move.MoveToTarget(self, target, initialTargetPosition), true);
break; return this;
} }
// We are next to where we thought the target should be, but it isn't here // We are next to where we thought the target should be, but it isn't here
@@ -128,7 +119,7 @@ namespace OpenRA.Mods.Common.Activities
if (TryStartEnter(self, target.Actor)) if (TryStartEnter(self, target.Actor))
{ {
lastState = EnterState.Entering; lastState = EnterState.Entering;
moveActivity = ActivityUtils.RunActivity(self, move.MoveIntoTarget(self, target)); QueueChild(self, move.MoveIntoTarget(self, target), true);
return this; return this;
} }
@@ -137,8 +128,7 @@ namespace OpenRA.Mods.Common.Activities
if (IsCanceling) if (IsCanceling)
return NextActivity; return NextActivity;
lastState = EnterState.Waiting; return this;
break;
} }
case EnterState.Entering: case EnterState.Entering:
@@ -149,8 +139,8 @@ namespace OpenRA.Mods.Common.Activities
OnEnterComplete(self, target.Actor); OnEnterComplete(self, target.Actor);
lastState = EnterState.Exiting; lastState = EnterState.Exiting;
moveActivity = ActivityUtils.RunActivity(self, move.MoveIntoWorld(self, self.Location)); QueueChild(self, move.MoveIntoWorld(self, self.Location), true);
break; return this;
} }
case EnterState.Exiting: case EnterState.Exiting:
@@ -159,15 +149,5 @@ namespace OpenRA.Mods.Common.Activities
return this; return this;
} }
public override void Cancel(Actor self, bool keepQueue = false)
{
OnCancel(self);
if (!IsCanceling && moveActivity != null)
moveActivity.Cancel(self);
base.Cancel(self, keepQueue);
}
} }
} }

View File

@@ -68,14 +68,16 @@ namespace OpenRA.Mods.Common.Activities
}); });
} }
protected override void OnCancel(Actor self) protected override void OnLastRun(Actor self)
{ {
passenger.Unreserve(self); passenger.Unreserve(self);
} }
protected override void OnLastRun(Actor self) public override void Cancel(Actor self, bool keepQueue = false)
{ {
passenger.Unreserve(self); passenger.Unreserve(self);
base.Cancel(self, keepQueue);
} }
} }
@@ -84,23 +86,21 @@ namespace OpenRA.Mods.Common.Activities
readonly string type; readonly string type;
readonly Passenger passenger; readonly Passenger passenger;
Activity enterTransport;
public EnterTransports(Actor self, Target primaryTarget) public EnterTransports(Actor self, Target primaryTarget)
{ {
passenger = self.Trait<Passenger>(); passenger = self.Trait<Passenger>();
if (primaryTarget.Type == TargetType.Actor) if (primaryTarget.Type == TargetType.Actor)
type = primaryTarget.Actor.Info.Name; type = primaryTarget.Actor.Info.Name;
enterTransport = new EnterTransport(self, primaryTarget); QueueChild(self, new EnterTransport(self, primaryTarget));
} }
public override Activity Tick(Actor self) public override Activity Tick(Actor self)
{ {
if (enterTransport != null) if (ChildActivity != null)
{ {
enterTransport = ActivityUtils.RunActivity(self, enterTransport); ChildActivity = ActivityUtils.RunActivity(self, ChildActivity);
if (enterTransport != null) if (ChildActivity != null)
return this; return this;
} }
@@ -126,19 +126,11 @@ namespace OpenRA.Mods.Common.Activities
if (transport != null) if (transport != null)
{ {
enterTransport = ActivityUtils.RunActivity(self, new EnterTransport(self, Target.FromActor(transport))); QueueChild(self, ActivityUtils.RunActivity(self, new EnterTransport(self, Target.FromActor(transport))), true);
return this; return this;
} }
return NextActivity; return NextActivity;
} }
public override void Cancel(Actor self, bool keepQueue = false)
{
if (!IsCanceling && enterTransport != null)
enterTransport.Cancel(self);
base.Cancel(self, keepQueue);
}
} }
} }