From 05cb9b1fbf3dd2c27cbf106bf55d573fe3769bbb Mon Sep 17 00:00:00 2001 From: reaperrr Date: Sat, 14 Nov 2020 13:31:38 +0100 Subject: [PATCH] Fix dock sequence dock/undock notifications - move Refinery dock/undock notifications to OnStateDock/-Undock and only call Undock if Dock was also called. - Add INotifyHarvesterAction support to VoxelHarvesterDockSequence. --- .../Activities/VoxelHarvesterDockSequence.cs | 19 +++++++++++++++++++ .../Activities/HarvesterDockSequence.cs | 9 --------- .../Activities/SpriteHarvesterDockSequence.cs | 6 ++++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/OpenRA.Mods.Cnc/Activities/VoxelHarvesterDockSequence.cs b/OpenRA.Mods.Cnc/Activities/VoxelHarvesterDockSequence.cs index 858352276c..072646da4f 100644 --- a/OpenRA.Mods.Cnc/Activities/VoxelHarvesterDockSequence.cs +++ b/OpenRA.Mods.Cnc/Activities/VoxelHarvesterDockSequence.cs @@ -11,6 +11,7 @@ using OpenRA.Mods.Cnc.Traits.Render; using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; namespace OpenRA.Mods.Cnc.Activities { @@ -29,6 +30,10 @@ namespace OpenRA.Mods.Cnc.Activities public override void OnStateDock(Actor self) { body.Docked = true; + foreach (var trait in self.TraitsImplementing()) + trait.Docked(); + foreach (var nd in Refinery.TraitsImplementing()) + nd.Docked(Refinery, self); if (spriteOverlay != null && !spriteOverlay.Visible) { @@ -57,12 +62,26 @@ namespace OpenRA.Mods.Cnc.Activities dockingState = DockingState.Complete; body.Docked = false; spriteOverlay.Visible = false; + + foreach (var trait in self.TraitsImplementing()) + trait.Undocked(); + + if (Refinery.IsInWorld && !Refinery.IsDead) + foreach (var nd in Refinery.TraitsImplementing()) + nd.Undocked(Refinery, self); }); } else { dockingState = DockingState.Complete; body.Docked = false; + + foreach (var trait in self.TraitsImplementing()) + trait.Undocked(); + + if (Refinery.IsInWorld && !Refinery.IsDead) + foreach (var nd in Refinery.TraitsImplementing()) + nd.Undocked(Refinery, self); } } } diff --git a/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs b/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs index eda650ebbe..bbda40ac8d 100644 --- a/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs +++ b/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs @@ -70,12 +70,7 @@ namespace OpenRA.Mods.Common.Activities case DockingState.Dock: if (!IsCanceling && Refinery.IsInWorld && !Refinery.IsDead) - { - foreach (var nd in Refinery.TraitsImplementing()) - nd.Docked(Refinery, self); - OnStateDock(self); - } else dockingState = DockingState.Undock; @@ -92,10 +87,6 @@ namespace OpenRA.Mods.Common.Activities return false; case DockingState.Complete: - if (Refinery.IsInWorld && !Refinery.IsDead) - foreach (var nd in Refinery.TraitsImplementing()) - nd.Undocked(Refinery, self); - Harv.LastLinkedProc = Harv.LinkedProc; Harv.LinkProc(self, null); if (IsDragRequired) diff --git a/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs b/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs index fe56aa7d19..afc5bc89ce 100644 --- a/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs +++ b/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs @@ -31,6 +31,8 @@ namespace OpenRA.Mods.Common.Activities { foreach (var trait in self.TraitsImplementing()) trait.Docked(); + foreach (var nd in Refinery.TraitsImplementing()) + nd.Docked(Refinery, self); wsb.PlayCustomAnimation(self, wda.DockSequence, () => wsb.PlayCustomAnimationRepeating(self, wda.DockLoopSequence)); dockAnimPlayed = true; @@ -53,6 +55,10 @@ namespace OpenRA.Mods.Common.Activities dockingState = DockingState.Complete; foreach (var trait in self.TraitsImplementing()) trait.Undocked(); + + if (Refinery.IsInWorld && !Refinery.IsDead) + foreach (var nd in Refinery.TraitsImplementing()) + nd.Undocked(Refinery, self); }); } }