From e2dd9677578833e09ec7d1ce07e80097ca4665ec Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Tue, 27 Oct 2015 22:00:26 +0000 Subject: [PATCH 1/2] Fix some reservation issues. - TakeOff.Tick was nulling a local variable, rather than the Reservation field - this is changed to call UnReserve which does the right thing. - Aircraft.ResolveOrder was missing an UnReserve call before setting a new reservation. --- OpenRA.Mods.Common/Activities/Air/TakeOff.cs | 7 +------ OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 3 +++ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/OpenRA.Mods.Common/Activities/Air/TakeOff.cs b/OpenRA.Mods.Common/Activities/Air/TakeOff.cs index 24de372431..03dde21f70 100644 --- a/OpenRA.Mods.Common/Activities/Air/TakeOff.cs +++ b/OpenRA.Mods.Common/Activities/Air/TakeOff.cs @@ -30,12 +30,7 @@ namespace OpenRA.Mods.Common.Activities if (NextActivity == null) self.CancelActivity(); - var reservation = aircraft.Reservation; - if (reservation != null) - { - reservation.Dispose(); - reservation = null; - } + aircraft.UnReserve(); var host = aircraft.GetActorBelow(); var hasHost = host != null; diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 95ea12961a..45fac81c78 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -543,7 +543,10 @@ namespace OpenRA.Mods.Common.Traits { var res = order.TargetActor.TraitOrDefault(); if (res != null) + { + UnReserve(); Reservation = res.Reserve(order.TargetActor, self, this); + } Action enter = () => { From b4180615a824d970d9dde06651d348bed60f403f Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Tue, 27 Oct 2015 22:15:56 +0000 Subject: [PATCH 2/2] Add Aircraft.MakeReservation. This provides a simpler method for making reservations and also ensures the previous reservation is definitely unreserved before being discarded. --- .../Activities/Air/HeliReturnToBase.cs | 8 +--- .../Activities/Air/ReturnToBase.cs | 7 +--- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 40 ++++++++----------- 3 files changed, 18 insertions(+), 37 deletions(-) diff --git a/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs index 7c9ee1a58a..52d26edd4d 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs @@ -53,13 +53,7 @@ namespace OpenRA.Mods.Common.Activities return Util.SequenceActivities(new HeliFly(self, Target.FromActor(nearestHpad))); } - var res = dest.TraitOrDefault(); - - if (res != null) - { - heli.UnReserve(); - heli.Reservation = res.Reserve(dest, self, heli); - } + heli.MakeReservation(dest); var exit = dest.Info.TraitInfos().FirstOrDefault(); var offset = (exit != null) ? exit.SpawnOffset : WVec.Zero; diff --git a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs index ff485f4549..2f3cdc1909 100644 --- a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs @@ -50,12 +50,7 @@ namespace OpenRA.Mods.Common.Activities if (dest == null) return; - var res = dest.TraitOrDefault(); - if (res != null) - { - plane.UnReserve(); - plane.Reservation = res.Reserve(dest, self, plane); - } + plane.MakeReservation(dest); var landPos = dest.CenterPosition; var altitude = planeInfo.CruiseAltitude.Length; diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 45fac81c78..a932f86a76 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -92,11 +92,11 @@ namespace OpenRA.Mods.Common.Traits readonly Actor self; UpgradeManager um; + IDisposable reservation; [Sync] public int Facing { get; set; } [Sync] public WPos CenterPosition { get; private set; } public CPos TopLeft { get { return self.World.Map.CellContaining(CenterPosition); } } - public IDisposable Reservation; public int ROT { get { return Info.ROT; } } bool airborne; @@ -257,22 +257,24 @@ namespace OpenRA.Mods.Common.Traits if (afld == null) return; - var res = afld.TraitOrDefault(); + MakeReservation(afld); + } - if (res != null) - { - UnReserve(); - Reservation = res.Reserve(afld, self, this); - } + public void MakeReservation(Actor target) + { + UnReserve(); + var reservable = target.TraitOrDefault(); + if (reservable != null) + reservation = reservable.Reserve(target, self, this); } public void UnReserve() { - if (Reservation != null) - { - Reservation.Dispose(); - Reservation = null; - } + if (reservation == null) + return; + + reservation.Dispose(); + reservation = null; } public bool AircraftCanEnter(Actor a) @@ -448,12 +450,7 @@ namespace OpenRA.Mods.Common.Traits if (target.Positions.Any(p => self.World.ActorMap.GetActorsAt(self.World.Map.CellContaining(p)).Any(a => a != self && a != target.Actor))) return false; - var res = target.Actor.TraitOrDefault(); - if (res == null) - return true; - - UnReserve(); - Reservation = res.Reserve(target.Actor, self, this); + MakeReservation(target.Actor); return true; } @@ -541,12 +538,7 @@ namespace OpenRA.Mods.Common.Traits } else { - var res = order.TargetActor.TraitOrDefault(); - if (res != null) - { - UnReserve(); - Reservation = res.Reserve(order.TargetActor, self, this); - } + MakeReservation(order.TargetActor); Action enter = () => {