diff --git a/OpenRA.Mods.Common/Activities/MoveToDock.cs b/OpenRA.Mods.Common/Activities/MoveToDock.cs index db7b684502..ecbe8e402a 100644 --- a/OpenRA.Mods.Common/Activities/MoveToDock.cs +++ b/OpenRA.Mods.Common/Activities/MoveToDock.cs @@ -24,16 +24,37 @@ namespace OpenRA.Mods.Common.Activities IDockHost dockHost; readonly INotifyDockClientMoving[] notifyDockClientMoving; readonly MoveCooldownHelper moveCooldownHelper; + readonly bool forceEnter; + readonly bool ignoreOccupancy; - public MoveToDock(Actor self, Actor dockHostActor = null, IDockHost dockHost = null) + public MoveToDock(Actor self, Actor dockHostActor = null, IDockHost dockHost = null, + bool forceEnter = false, bool ignoreOccupancy = false) { dockClient = self.Trait(); this.dockHostActor = dockHostActor; this.dockHost = dockHost; + this.forceEnter = forceEnter; + this.ignoreOccupancy = ignoreOccupancy; notifyDockClientMoving = self.TraitsImplementing().ToArray(); moveCooldownHelper = new MoveCooldownHelper(self.World, self.Trait() as Mobile) { RetryIfDestinationBlocked = true }; } + protected override void OnFirstRun(Actor self) + { + if (IsCanceling || dockClient.IsTraitDisabled) + return; + + // We were ordered to dock to an actor but host was unspecified. + if (dockHostActor != null && dockHost == null) + { + var link = dockClient.AvailableDockHosts(dockHostActor, default, forceEnter, ignoreOccupancy) + .ClosestDock(self, dockClient); + + if (link.HasValue) + dockHost = link.Value.Trait; + } + } + public override bool Tick(Actor self) { if (IsCanceling) diff --git a/OpenRA.Mods.Common/Traits/DockClientManager.cs b/OpenRA.Mods.Common/Traits/DockClientManager.cs index 7db9f94f02..01c316d09a 100644 --- a/OpenRA.Mods.Common/Traits/DockClientManager.cs +++ b/OpenRA.Mods.Common/Traits/DockClientManager.cs @@ -177,16 +177,13 @@ namespace OpenRA.Mods.Common.Traits if (target.Type != TargetType.Actor) return; - if (IsTraitDisabled) - return; + self.QueueActivity(order.Queued, new MoveToDock( + self, + target.Actor, + null, + order.OrderString == "ForceDock", + true)); - var dock = AvailableDockHosts(target.Actor, default, order.OrderString == "ForceDock", true) - .ClosestDock(self, this); - - if (!dock.HasValue) - return; - - self.QueueActivity(order.Queued, new MoveToDock(self, dock.Value.Actor, dock.Value.Trait)); self.ShowTargetLines(); } }