diff --git a/OpenRA.Mods.RA/Air/HeliReturn.cs b/OpenRA.Mods.RA/Air/HeliReturn.cs index 69494f6220..68a7e7c47b 100755 --- a/OpenRA.Mods.RA/Air/HeliReturn.cs +++ b/OpenRA.Mods.RA/Air/HeliReturn.cs @@ -39,8 +39,9 @@ namespace OpenRA.Mods.RA.Air NextActivity); var res = dest.TraitOrDefault(); + var heli = self.Trait(); if (res != null) - self.Trait().reservation = res.Reserve(dest, self); + heli.reservation = res.Reserve(dest, self, heli); 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 481ed30bd0..cce3d0d348 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(order.TargetActor, self); + reservation = res.Reserve(order.TargetActor, self, this); 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 3aadbb1ce4..1b88013efd 100755 --- a/OpenRA.Mods.RA/Air/Plane.cs +++ b/OpenRA.Mods.RA/Air/Plane.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Air { var res = afld.Trait(); if (res != null) - reservation = res.Reserve(afld, self); + reservation = res.Reserve(afld, self, this); } } } diff --git a/OpenRA.Mods.RA/Air/ReturnToBase.cs b/OpenRA.Mods.RA/Air/ReturnToBase.cs index b228a148b0..fe072363e4 100755 --- a/OpenRA.Mods.RA/Air/ReturnToBase.cs +++ b/OpenRA.Mods.RA/Air/ReturnToBase.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Air if (res != null) { plane.UnReserve(); - plane.reservation = res.Reserve(dest, self); + plane.reservation = res.Reserve(dest, self, plane); } var landPos = dest.CenterLocation; diff --git a/OpenRA.Mods.RA/Reservable.cs b/OpenRA.Mods.RA/Reservable.cs index e520e15864..56db199610 100755 --- a/OpenRA.Mods.RA/Reservable.cs +++ b/OpenRA.Mods.RA/Reservable.cs @@ -10,14 +10,16 @@ using System; using OpenRA.Traits; +using OpenRA.Mods.RA.Air; namespace OpenRA.Mods.RA { class ReservableInfo : TraitInfo {} - public class Reservable : ITick + public class Reservable : ITick, INotifyDamage, INotifyCapture, INotifySold { Actor reservedFor; + Aircraft herp; public void Tick(Actor self) { @@ -28,15 +30,16 @@ namespace OpenRA.Mods.RA reservedFor = null; /* not likely to arrive now. */ } - public IDisposable Reserve(Actor self, Actor forActor) + public IDisposable Reserve(Actor self, Actor forActor, Aircraft derp) { - reservedFor = forActor; + reservedFor = forActor; + herp = derp; // NOTE: we really dont care about the GC eating DisposableActions that apply to a world *other* than // the one we're playing in. return new DisposableAction( - () => reservedFor = null, + () => {reservedFor = null; herp = null;}, () => Game.RunAfterTick( () => { if (Game.IsCurrentWorld( self.World )) throw new InvalidOperationException( "Attempted to finalize an undisposed DisposableAction. {0} ({1}) reserved {2} ({3})" @@ -48,5 +51,24 @@ namespace OpenRA.Mods.RA var res = a.TraitOrDefault(); return res != null && res.reservedFor != null; } + + public void Damaged(Actor self, AttackInfo e) + { + if (herp != null && e.DamageStateChanged && e.DamageState == DamageState.Dead) + herp.UnReserve(); + } + + public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner) + { + if (herp != null) + herp.UnReserve(); + } + + public void Selling (Actor self) { Sold(self); } + public void Sold (Actor self) + { + if (herp != null) + herp.UnReserve(); + } } }