From 996029ee38f93db40b02155225ef988ca989a489 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Sun, 18 Oct 2020 13:46:08 +0200 Subject: [PATCH] Fix undock anim playing even if docking was cancelled ...before dock anim could run. The undock animation would play even if the dock anim hadn't run (meaning the sequence cancelled before the docking completed, for example due to refinery death). --- .../Activities/VoxelHarvesterDockSequence.cs | 8 +++++--- .../Activities/SpriteHarvesterDockSequence.cs | 11 ++++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/OpenRA.Mods.Cnc/Activities/VoxelHarvesterDockSequence.cs b/OpenRA.Mods.Cnc/Activities/VoxelHarvesterDockSequence.cs index fc66b05d51..421cb3b9ea 100644 --- a/OpenRA.Mods.Cnc/Activities/VoxelHarvesterDockSequence.cs +++ b/OpenRA.Mods.Cnc/Activities/VoxelHarvesterDockSequence.cs @@ -45,10 +45,12 @@ namespace OpenRA.Mods.Cnc.Activities public override void OnStateUndock(Actor self) { - dockingState = DockingState.Wait; - - if (spriteOverlay != null && !spriteOverlay.Visible) + // If body.Docked wasn't set, we didn't actually dock and have to skip the undock overlay + if (!body.Docked) + dockingState = DockingState.Complete; + else if (spriteOverlay != null && !spriteOverlay.Visible) { + dockingState = DockingState.Wait; spriteOverlay.Visible = true; spriteOverlay.WithOffset.Animation.PlayBackwardsThen(spriteOverlay.Info.Sequence, () => { diff --git a/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs b/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs index a231f94616..fe56aa7d19 100644 --- a/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs +++ b/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs @@ -18,6 +18,7 @@ namespace OpenRA.Mods.Common.Activities { readonly WithSpriteBody wsb; readonly WithDockingAnimationInfo wda; + protected bool dockAnimPlayed; public SpriteHarvesterDockSequence(Actor self, Actor refinery, WAngle dockAngle, bool isDragRequired, WVec dragOffset, int dragLength) : base(self, refinery, dockAngle, isDragRequired, dragOffset, dragLength) @@ -32,11 +33,20 @@ namespace OpenRA.Mods.Common.Activities trait.Docked(); wsb.PlayCustomAnimation(self, wda.DockSequence, () => wsb.PlayCustomAnimationRepeating(self, wda.DockLoopSequence)); + dockAnimPlayed = true; dockingState = DockingState.Loop; } public override void OnStateUndock(Actor self) { + // If dock animation hasn't played, we didn't actually dock and have to skip the undock anim and notification + if (!dockAnimPlayed) + { + dockingState = DockingState.Complete; + return; + } + + dockingState = DockingState.Wait; wsb.PlayCustomAnimationBackwards(self, wda.DockSequence, () => { @@ -44,7 +54,6 @@ namespace OpenRA.Mods.Common.Activities foreach (var trait in self.TraitsImplementing()) trait.Undocked(); }); - dockingState = DockingState.Wait; } } }