Possible fix for #14102: Consider airfield available if already reserved for the same actor

This commit is contained in:
portablestew
2019-01-11 20:46:11 -08:00
committed by reaperrr
parent f9cf45e634
commit a49287cc97
4 changed files with 12 additions and 6 deletions

View File

@@ -44,7 +44,7 @@ namespace OpenRA.Mods.Common.Activities
return self.World.Actors.Where(a => a.Owner == self.Owner return self.World.Actors.Where(a => a.Owner == self.Owner
&& rearmable.Info.RearmActors.Contains(a.Info.Name) && rearmable.Info.RearmActors.Contains(a.Info.Name)
&& (!unreservedOnly || !Reservable.IsReserved(a))) && (!unreservedOnly || Reservable.IsAvailableFor(a, self)))
.ClosestTo(self); .ClosestTo(self);
} }
@@ -58,7 +58,7 @@ namespace OpenRA.Mods.Common.Activities
if (IsCanceled) if (IsCanceled)
return NextActivity; return NextActivity;
if (dest == null || dest.IsDead || Reservable.IsReserved(dest)) if (dest == null || dest.IsDead || !Reservable.IsAvailableFor(dest, self))
dest = ChooseResupplier(self, true); dest = ChooseResupplier(self, true);
var initialFacing = aircraft.Info.InitialFacing; var initialFacing = aircraft.Info.InitialFacing;

View File

@@ -49,13 +49,13 @@ namespace OpenRA.Mods.Common.Activities
return self.World.ActorsHavingTrait<Reservable>() return self.World.ActorsHavingTrait<Reservable>()
.Where(a => a.Owner == self.Owner .Where(a => a.Owner == self.Owner
&& rearmInfo.RearmActors.Contains(a.Info.Name) && rearmInfo.RearmActors.Contains(a.Info.Name)
&& (!unreservedOnly || !Reservable.IsReserved(a))) && (!unreservedOnly || Reservable.IsAvailableFor(a, self)))
.ClosestTo(self); .ClosestTo(self);
} }
void Calculate(Actor 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); dest = ChooseResupplier(self, true);
if (dest == null) if (dest == null)

View File

@@ -714,7 +714,7 @@ namespace OpenRA.Mods.Common.Traits
get get
{ {
yield return new EnterAlliedActorTargeter<BuildingInfo>("Enter", 5, yield return new EnterAlliedActorTargeter<BuildingInfo>("Enter", 5,
target => AircraftCanEnter(target), target => !Reservable.IsReserved(target)); target => AircraftCanEnter(target), target => Reservable.IsAvailableFor(target, self));
yield return new AircraftMoveOrderTargeter(Info); yield return new AircraftMoveOrderTargeter(Info);
} }
@@ -787,7 +787,7 @@ namespace OpenRA.Mods.Common.Traits
UnReserve(); UnReserve();
var targetActor = order.Target.Actor; var targetActor = order.Target.Actor;
if (Reservable.IsReserved(targetActor)) if (!Reservable.IsAvailableFor(targetActor, self))
{ {
if (!Info.CanHover) if (!Info.CanHover)
self.QueueActivity(new ReturnToBase(self, Info.AbortOnResupply)); self.QueueActivity(new ReturnToBase(self, Info.AbortOnResupply));

View File

@@ -65,6 +65,12 @@ namespace OpenRA.Mods.Common.Traits
return res != null && res.reservedForAircraft != null && !res.reservedForAircraft.MayYieldReservation; return res != null && res.reservedForAircraft != null && !res.reservedForAircraft.MayYieldReservation;
} }
public static bool IsAvailableFor(Actor reservable, Actor forActor)
{
var res = reservable.TraitOrDefault<Reservable>();
return res == null || res.reservedForAircraft == null || res.reservedForAircraft.MayYieldReservation || res.reservedFor == forActor;
}
private void UnReserve() private void UnReserve()
{ {
if (reservedForAircraft != null) if (reservedForAircraft != null)