diff --git a/OpenRA.Mods.RA/Activities/ReturnToBase.cs b/OpenRA.Mods.RA/Activities/ReturnToBase.cs index f8e5d247d5..28ebc08b70 100644 --- a/OpenRA.Mods.RA/Activities/ReturnToBase.cs +++ b/OpenRA.Mods.RA/Activities/ReturnToBase.cs @@ -35,10 +35,17 @@ namespace OpenRA.Mods.RA.Activities void Calculate(Actor self) { - if (dest == null) dest = ChooseAirfield(self); - var res = dest.traits.GetOrDefault(); - if (res != null) - self.traits.Get().reservation = res.Reserve(self); + if (dest == null) + { + dest = ChooseAirfield(self); + var res = dest.traits.GetOrDefault(); + if (res != null) + { + var plane = self.traits.Get(); + plane.UnReserve(); + plane.reservation = res.Reserve(self); + } + } var landPos = dest.CenterLocation; var aircraft = self.traits.Get(); diff --git a/OpenRA.Mods.RA/Plane.cs b/OpenRA.Mods.RA/Plane.cs index 56b34b5e2e..cb4deb6ee5 100644 --- a/OpenRA.Mods.RA/Plane.cs +++ b/OpenRA.Mods.RA/Plane.cs @@ -74,7 +74,7 @@ namespace OpenRA.Mods.RA return (order.OrderString == "Move" || order.OrderString == "Enter") ? "Move" : null; } - void UnReserve() + public void UnReserve() { if (reservation != null) { @@ -122,7 +122,7 @@ namespace OpenRA.Mods.RA if (line != null) line.SetTarget(self, Target.FromOrder(order), Color.Green); }); - + self.CancelActivity(); self.QueueActivity(new ReturnToBase(self, order.TargetActor)); self.QueueActivity( @@ -130,7 +130,10 @@ namespace OpenRA.Mods.RA ? (IActivity)new Rearm() : new Repair(order.TargetActor)); } else + { + Game.Debug("Unreserve due to unhandled order: {0}".F(order.OrderString)); UnReserve(); + } } } } diff --git a/OpenRA.Mods.RA/Reservable.cs b/OpenRA.Mods.RA/Reservable.cs index 187bd17b24..526fa1329b 100644 --- a/OpenRA.Mods.RA/Reservable.cs +++ b/OpenRA.Mods.RA/Reservable.cs @@ -36,6 +36,10 @@ namespace OpenRA.Mods.RA public IDisposable Reserve(Actor forActor) { + if (reservedFor != null) + Game.Debug("BUG: #{0} {1} was already reserved (by #{2} {3})".F( + self.ActorID, self.Info.Name, reservedFor.ActorID, reservedFor.Info.Name)); + reservedFor = forActor; Game.Debug("#{0} {1} reserved by #{2} {3}".F( self.ActorID, self.Info.Name, forActor.ActorID, forActor.Info.Name));