diff --git a/OpenRA.Mods.Common/Activities/UnloadCargo.cs b/OpenRA.Mods.Common/Activities/UnloadCargo.cs index 00902f28a4..de08b4f667 100644 --- a/OpenRA.Mods.Common/Activities/UnloadCargo.cs +++ b/OpenRA.Mods.Common/Activities/UnloadCargo.cs @@ -29,6 +29,7 @@ namespace OpenRA.Mods.Common.Activities readonly WDist unloadRange; Target destination; + bool takeOffAfterUnload; public UnloadCargo(Actor self, WDist unloadRange, bool unloadAll = true) : this(self, Target.Invalid, unloadRange, unloadAll) @@ -74,7 +75,11 @@ namespace OpenRA.Mods.Common.Activities // Move to the target destination if (aircraft != null) + { + // Queue the activity even if already landed in case self.Location != destination QueueChild(self, new Land(self, destination, unloadRange)); + takeOffAfterUnload = !aircraft.AtLandAltitude; + } else { var cell = self.World.Map.Clamp(this.self.World.Map.CellContaining(destination.CenterPosition)); @@ -135,7 +140,7 @@ namespace OpenRA.Mods.Common.Activities if (cargo.Info.AfterUnloadDelay > 0) QueueChild(self, new Wait(cargo.Info.AfterUnloadDelay, false), true); - if (aircraft != null && !aircraft.Info.LandWhenIdle) + if (takeOffAfterUnload) QueueChild(self, new TakeOff(self), true); } diff --git a/OpenRA.Mods.Common/Traits/Cargo.cs b/OpenRA.Mods.Common/Traits/Cargo.cs index 5ad050599a..20630e9883 100644 --- a/OpenRA.Mods.Common/Traits/Cargo.cs +++ b/OpenRA.Mods.Common/Traits/Cargo.cs @@ -105,6 +105,7 @@ namespace OpenRA.Mods.Common.Traits ConditionManager conditionManager; int loadingToken = ConditionManager.InvalidConditionToken; Stack loadedTokens = new Stack(); + bool takeOffAfterLoad; CPos currentCell; public IEnumerable CurrentAdjacentCells { get; private set; } @@ -280,7 +281,10 @@ namespace OpenRA.Mods.Common.Traits var air = self.TraitOrDefault(); if (air != null && !air.AtLandAltitude) + { + takeOffAfterLoad = true; self.QueueActivity(new Land(self)); + } self.QueueActivity(new WaitFor(() => state != State.Locked, false)); return true; @@ -294,9 +298,10 @@ namespace OpenRA.Mods.Common.Traits state = State.Free; self.QueueActivity(new Wait(Info.AfterLoadDelay, false)); - var air = self.TraitOrDefault(); - if (air != null) + if (takeOffAfterLoad) self.QueueActivity(new TakeOff(self)); + + takeOffAfterLoad = false; } public string CursorForOrder(Actor self, Order order)