Fix aircraft allowing enter when it should not
Show "enter-blocked" cursor when resupply is not possible, except when - the actor CanForceLand, - does not TakeOffOnResupply, - and has active ForceEnter modifier.
This commit is contained in:
@@ -549,6 +549,20 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return canRearmAtActor || canRepairAtActor;
|
return canRearmAtActor || canRepairAtActor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AircraftCanResupplyAt(Actor a, bool allowedToForceEnter = false)
|
||||||
|
{
|
||||||
|
if (self.AppearsHostileTo(a))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var canRearmAtActor = rearmable != null && rearmable.Info.RearmActors.Contains(a.Info.Name);
|
||||||
|
var canRepairAtActor = repairable != null && repairable.Info.RepairActors.Contains(a.Info.Name);
|
||||||
|
|
||||||
|
var allowedToEnterRearmer = canRearmAtActor && (allowedToForceEnter || rearmable.RearmableAmmoPools.Any(p => !p.FullAmmo()));
|
||||||
|
var allowedToEnterRepairer = canRepairAtActor && (allowedToForceEnter || self.GetDamageState() != DamageState.Undamaged);
|
||||||
|
|
||||||
|
return allowedToEnterRearmer || allowedToEnterRepairer;
|
||||||
|
}
|
||||||
|
|
||||||
public int MovementSpeed
|
public int MovementSpeed
|
||||||
{
|
{
|
||||||
get { return Util.ApplyPercentageModifiers(Info.Speed, speedModifiers); }
|
get { return Util.ApplyPercentageModifiers(Info.Speed, speedModifiers); }
|
||||||
@@ -914,10 +928,10 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
yield return new EnterAlliedActorTargeter<BuildingInfo>("ForceEnter", 6,
|
yield return new EnterAlliedActorTargeter<BuildingInfo>("ForceEnter", 6,
|
||||||
(target, modifiers) => Info.CanForceLand && modifiers.HasModifier(TargetModifiers.ForceMove) && AircraftCanEnter(target),
|
(target, modifiers) => Info.CanForceLand && modifiers.HasModifier(TargetModifiers.ForceMove) && AircraftCanEnter(target),
|
||||||
target => Reservable.IsAvailableFor(target, self));
|
target => Reservable.IsAvailableFor(target, self) && AircraftCanResupplyAt(target, !Info.TakeOffOnResupply));
|
||||||
|
|
||||||
yield return new EnterAlliedActorTargeter<BuildingInfo>("Enter", 5,
|
yield return new EnterAlliedActorTargeter<BuildingInfo>("Enter", 5,
|
||||||
AircraftCanEnter, target => Reservable.IsAvailableFor(target, self));
|
AircraftCanEnter, target => Reservable.IsAvailableFor(target, self) && AircraftCanResupplyAt(target));
|
||||||
|
|
||||||
yield return new AircraftMoveOrderTargeter(this);
|
yield return new AircraftMoveOrderTargeter(this);
|
||||||
}
|
}
|
||||||
@@ -1003,19 +1017,24 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (order.Target.Type != TargetType.Actor)
|
if (order.Target.Type != TargetType.Actor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var targetActor = order.Target.Actor;
|
||||||
|
var isForceEnter = orderString == "ForceEnter";
|
||||||
|
var canResupplyAt = AircraftCanResupplyAt(targetActor, isForceEnter && !Info.TakeOffOnResupply);
|
||||||
|
|
||||||
|
// This is what the order targeter checks to display the correct cursor, so we need to make sure
|
||||||
|
// the behavior matches the cursor if the player clicks despite a "blocked" cursor.
|
||||||
|
if (!canResupplyAt || !Reservable.IsAvailableFor(targetActor, self))
|
||||||
|
return;
|
||||||
|
|
||||||
if (!order.Queued)
|
if (!order.Queued)
|
||||||
UnReserve();
|
UnReserve();
|
||||||
|
|
||||||
var targetActor = order.Target.Actor;
|
|
||||||
|
|
||||||
// We only want to set a target line if the order will (most likely) succeed
|
|
||||||
if (Reservable.IsAvailableFor(targetActor, self))
|
|
||||||
self.SetTargetLine(Target.FromActor(targetActor), Color.Green);
|
self.SetTargetLine(Target.FromActor(targetActor), Color.Green);
|
||||||
|
|
||||||
// Aircraft with TakeOffOnResupply would immediately take off again, so there's no point in automatically forcing
|
// Aircraft with TakeOffOnResupply would immediately take off again, so there's no point in automatically forcing
|
||||||
// them to land on a resupplier. For aircraft without it, it makes more sense to land than to idle above a
|
// them to land on a resupplier. For aircraft without it, it makes more sense to land than to idle above a
|
||||||
// free resupplier.
|
// free resupplier.
|
||||||
var forceLand = orderString == "ForceEnter" || !Info.TakeOffOnResupply;
|
var forceLand = isForceEnter || !Info.TakeOffOnResupply;
|
||||||
self.QueueActivity(order.Queued, new ReturnToBase(self, targetActor, forceLand));
|
self.QueueActivity(order.Queued, new ReturnToBase(self, targetActor, forceLand));
|
||||||
}
|
}
|
||||||
else if (orderString == "Stop")
|
else if (orderString == "Stop")
|
||||||
|
|||||||
Reference in New Issue
Block a user