diff --git a/OpenRA.Mods.RA/Air/HeliReturn.cs b/OpenRA.Mods.RA/Air/HeliReturn.cs index 69722e2f96..f799f78c0f 100755 --- a/OpenRA.Mods.RA/Air/HeliReturn.cs +++ b/OpenRA.Mods.RA/Air/HeliReturn.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.RA.Air var res = dest.TraitOrDefault(); if (res != null) - self.Trait().reservation = res.Reserve(self); + self.Trait().reservation = res.Reserve(dest, self); var exit = dest.Info.Traits.WithInterface().FirstOrDefault(); var offset = exit != null ? exit.SpawnOffset : int2.Zero; diff --git a/OpenRA.Mods.RA/Air/Helicopter.cs b/OpenRA.Mods.RA/Air/Helicopter.cs index 44885b3f31..481ed30bd0 100755 --- a/OpenRA.Mods.RA/Air/Helicopter.cs +++ b/OpenRA.Mods.RA/Air/Helicopter.cs @@ -92,7 +92,7 @@ namespace OpenRA.Mods.RA.Air if (Reservable.IsReserved(order.TargetActor)) return; var res = order.TargetActor.TraitOrDefault(); if (res != null) - reservation = res.Reserve(self); + reservation = res.Reserve(order.TargetActor, self); var exit = order.TargetActor.Info.Traits.WithInterface().FirstOrDefault(); var offset = exit != null ? exit.SpawnOffset : int2.Zero; diff --git a/OpenRA.Mods.RA/Air/Plane.cs b/OpenRA.Mods.RA/Air/Plane.cs index 21c3b780d8..4c785871d9 100755 --- a/OpenRA.Mods.RA/Air/Plane.cs +++ b/OpenRA.Mods.RA/Air/Plane.cs @@ -41,11 +41,12 @@ namespace OpenRA.Mods.RA.Air if (self.Trait().Altitude == 0) { /* not spawning in the air, so try to assoc. with our afld. this is a hack. */ - var res = self.World.FindUnits(self.CenterLocation, self.CenterLocation) - .Select( a => a.TraitOrDefault() ).FirstOrDefault( a => a != null ); + var afld = self.World.FindUnits(self.CenterLocation, self.CenterLocation) + .FirstOrDefault( a => a.HasTrait() ); + var res = afld.Trait(); if (res != null) - reservation = res.Reserve(self); + reservation = res.Reserve(afld, self); } } } diff --git a/OpenRA.Mods.RA/Air/ReturnToBase.cs b/OpenRA.Mods.RA/Air/ReturnToBase.cs index 50319ac224..5a7ae48ce5 100755 --- a/OpenRA.Mods.RA/Air/ReturnToBase.cs +++ b/OpenRA.Mods.RA/Air/ReturnToBase.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.RA.Air if (res != null) { plane.UnReserve(); - plane.reservation = res.Reserve(self); + plane.reservation = res.Reserve(dest, self); } var landPos = dest.CenterLocation; diff --git a/OpenRA.Mods.RA/Reservable.cs b/OpenRA.Mods.RA/Reservable.cs index f32e37eae8..2a750f9df8 100755 --- a/OpenRA.Mods.RA/Reservable.cs +++ b/OpenRA.Mods.RA/Reservable.cs @@ -28,13 +28,14 @@ namespace OpenRA.Mods.RA reservedFor = null; /* not likely to arrive now. */ } - public IDisposable Reserve(Actor forActor) + public IDisposable Reserve(Actor self, Actor forActor) { reservedFor = forActor; - return new DisposableAction(() => { reservedFor = null; }, + return new DisposableAction(() => reservedFor = null, () => Game.RunAfterTick(() => - {throw new InvalidOperationException("Attempted to finalize an undisposed DisposableAction");}) + {throw new InvalidOperationException("Attempted to finalize an undisposed DisposableAction. {0} ({1}) reserved {2} ({3})" + .F(forActor.Info.Name, forActor.ActorID, self.Info.Name, self.ActorID));}) ); }