Possible fix for #14102: Consider airfield available if already reserved for the same actor
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user