diff --git a/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs index 08f3055c94..2293ea02f5 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs @@ -44,7 +44,7 @@ namespace OpenRA.Mods.Common.Activities return self.World.Actors.Where(a => a.Owner == self.Owner && rearmable.Info.RearmActors.Contains(a.Info.Name) - && (!unreservedOnly || !Reservable.IsReserved(a))) + && (!unreservedOnly || Reservable.IsAvailableFor(a, self))) .ClosestTo(self); } @@ -58,7 +58,7 @@ namespace OpenRA.Mods.Common.Activities if (IsCanceled) return NextActivity; - if (dest == null || dest.IsDead || Reservable.IsReserved(dest)) + if (dest == null || dest.IsDead || !Reservable.IsAvailableFor(dest, self)) dest = ChooseResupplier(self, true); var initialFacing = aircraft.Info.InitialFacing; diff --git a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs index 0d0efaaf85..200d61dec0 100644 --- a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs @@ -49,13 +49,13 @@ namespace OpenRA.Mods.Common.Activities return self.World.ActorsHavingTrait() .Where(a => a.Owner == self.Owner && rearmInfo.RearmActors.Contains(a.Info.Name) - && (!unreservedOnly || !Reservable.IsReserved(a))) + && (!unreservedOnly || Reservable.IsAvailableFor(a, self))) .ClosestTo(self); } void Calculate(Actor self) { - if (dest == null || dest.IsDead || Reservable.IsReserved(dest)) + if (dest == null || dest.IsDead || !Reservable.IsAvailableFor(dest, self)) dest = ChooseResupplier(self, true); if (dest == null) diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 09f32ea2d1..c11b5949c9 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -714,7 +714,7 @@ namespace OpenRA.Mods.Common.Traits get { yield return new EnterAlliedActorTargeter("Enter", 5, - target => AircraftCanEnter(target), target => !Reservable.IsReserved(target)); + target => AircraftCanEnter(target), target => Reservable.IsAvailableFor(target, self)); yield return new AircraftMoveOrderTargeter(Info); } @@ -787,7 +787,7 @@ namespace OpenRA.Mods.Common.Traits UnReserve(); var targetActor = order.Target.Actor; - if (Reservable.IsReserved(targetActor)) + if (!Reservable.IsAvailableFor(targetActor, self)) { if (!Info.CanHover) self.QueueActivity(new ReturnToBase(self, Info.AbortOnResupply)); diff --git a/OpenRA.Mods.Common/Traits/Buildings/Reservable.cs b/OpenRA.Mods.Common/Traits/Buildings/Reservable.cs index a9d1611706..3cfe5a5853 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Reservable.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Reservable.cs @@ -65,6 +65,12 @@ namespace OpenRA.Mods.Common.Traits return res != null && res.reservedForAircraft != null && !res.reservedForAircraft.MayYieldReservation; } + public static bool IsAvailableFor(Actor reservable, Actor forActor) + { + var res = reservable.TraitOrDefault(); + return res == null || res.reservedForAircraft == null || res.reservedForAircraft.MayYieldReservation || res.reservedFor == forActor; + } + private void UnReserve() { if (reservedForAircraft != null)