Files
OpenRA/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs
reaperrr 996029ee38 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).
2020-11-15 16:56:28 +01:00

60 lines
1.8 KiB
C#

#region Copyright & License Information
/*
* Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using OpenRA.Mods.Common.Traits;
using OpenRA.Mods.Common.Traits.Render;
namespace OpenRA.Mods.Common.Activities
{
public class SpriteHarvesterDockSequence : HarvesterDockSequence
{
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)
{
wsb = self.Trait<WithSpriteBody>();
wda = self.Info.TraitInfo<WithDockingAnimationInfo>();
}
public override void OnStateDock(Actor self)
{
foreach (var trait in self.TraitsImplementing<INotifyHarvesterAction>())
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,
() =>
{
dockingState = DockingState.Complete;
foreach (var trait in self.TraitsImplementing<INotifyHarvesterAction>())
trait.Undocked();
});
}
}
}