Allow forced landing on helipads and enforce takeoff otherwise.

This commit is contained in:
tovl
2019-06-30 11:56:50 +00:00
committed by reaperrr
parent 79a48765d9
commit 76422933f6
3 changed files with 31 additions and 15 deletions

View File

@@ -142,6 +142,8 @@ namespace OpenRA.Mods.Common.Activities
aircraft.MakeReservation(dest); aircraft.MakeReservation(dest);
QueueChild(self, new Land(self, Target.FromActor(dest), offset, facing), true); QueueChild(self, new Land(self, Target.FromActor(dest), offset, facing), true);
QueueChild(self, new Resupply(self, dest, WDist.Zero), true); QueueChild(self, new Resupply(self, dest, WDist.Zero), true);
if (aircraft.Info.TakeOffOnResupply && !alwaysLand)
QueueChild(self, new TakeOff(self));
} }
else else
QueueChild(self, new Fly(self, Target.FromActor(dest)), true); QueueChild(self, new Fly(self, Target.FromActor(dest)), true);

View File

@@ -117,11 +117,7 @@ namespace OpenRA.Mods.Common.Activities
{ {
var aircraft = self.TraitOrDefault<Aircraft>(); var aircraft = self.TraitOrDefault<Aircraft>();
if (aircraft != null) if (aircraft != null)
{
aircraft.AllowYieldingReservation(); aircraft.AllowYieldingReservation();
if (aircraft.Info.TakeOffOnResupply)
Queue(self, new TakeOff(self));
}
return NextActivity; return NextActivity;
} }
@@ -129,6 +125,14 @@ namespace OpenRA.Mods.Common.Activities
return this; return this;
} }
public override void Cancel(Actor self, bool keepQueue = false)
{
if (NextActivity != null)
return;
base.Cancel(self, keepQueue);
}
void RepairTick(Actor self) void RepairTick(Actor self)
{ {
// First active. // First active.

View File

@@ -527,7 +527,7 @@ namespace OpenRA.Mods.Common.Traits
return AircraftCanEnter(a); return AircraftCanEnter(a);
} }
public bool AircraftCanEnter(Actor a) bool AircraftCanEnter(Actor a)
{ {
if (self.AppearsHostileTo(a)) if (self.AppearsHostileTo(a))
return false; return false;
@@ -905,6 +905,10 @@ namespace OpenRA.Mods.Common.Traits
{ {
get get
{ {
yield return new EnterAlliedActorTargeter<BuildingInfo>("ForceEnter", 6,
(target, modifiers) => AircraftCanEnter(target) && modifiers.HasModifier(TargetModifiers.ForceMove),
target => Reservable.IsAvailableFor(target, self));
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));
@@ -914,7 +918,7 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "Enter" || order.OrderID == "Move" || order.OrderID == "Land") if (order.OrderID == "Enter" || order.OrderID == "Move" || order.OrderID == "Land" || order.OrderID == "ForceEnter")
return new Order(order.OrderID, self, target, queued); return new Order(order.OrderID, self, target, queued);
return null; return null;
@@ -945,6 +949,7 @@ namespace OpenRA.Mods.Common.Traits
return Info.Voice; return Info.Voice;
case "Enter": case "Enter":
case "ForceEnter":
case "Stop": case "Stop":
case "Scatter": case "Scatter":
return Info.Voice; return Info.Voice;
@@ -956,7 +961,8 @@ namespace OpenRA.Mods.Common.Traits
public void ResolveOrder(Actor self, Order order) public void ResolveOrder(Actor self, Order order)
{ {
if (order.OrderString == "Move") var orderString = order.OrderString;
if (orderString == "Move")
{ {
var cell = self.World.Map.Clamp(self.World.Map.CellContaining(order.Target.CenterPosition)); var cell = self.World.Map.Clamp(self.World.Map.CellContaining(order.Target.CenterPosition));
if (!Info.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell)) if (!Info.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell))
@@ -969,7 +975,7 @@ namespace OpenRA.Mods.Common.Traits
self.SetTargetLine(target, Color.Green); self.SetTargetLine(target, Color.Green);
self.QueueActivity(order.Queued, new Fly(self, target)); self.QueueActivity(order.Queued, new Fly(self, target));
} }
else if (order.OrderString == "Land") else if (orderString == "Land")
{ {
var cell = self.World.Map.Clamp(self.World.Map.CellContaining(order.Target.CenterPosition)); var cell = self.World.Map.Clamp(self.World.Map.CellContaining(order.Target.CenterPosition));
if (!Info.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell)) if (!Info.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell))
@@ -983,9 +989,9 @@ namespace OpenRA.Mods.Common.Traits
self.SetTargetLine(target, Color.Green); self.SetTargetLine(target, Color.Green);
self.QueueActivity(order.Queued, new Land(self, target)); self.QueueActivity(order.Queued, new Land(self, target));
} }
else if (order.OrderString == "Enter" || order.OrderString == "Repair") else if (orderString == "Enter" || orderString == "ForceEnter" || orderString == "Repair")
{ {
// Enter and Repair orders are only valid for own/allied actors, // Enter, ForceEnter and Repair orders are only valid for own/allied actors,
// which are guaranteed to never be frozen. // which are guaranteed to never be frozen.
if (order.Target.Type != TargetType.Actor) if (order.Target.Type != TargetType.Actor)
return; return;
@@ -999,9 +1005,13 @@ namespace OpenRA.Mods.Common.Traits
if (Reservable.IsAvailableFor(targetActor, self)) if (Reservable.IsAvailableFor(targetActor, self))
self.SetTargetLine(Target.FromActor(targetActor), Color.Green); self.SetTargetLine(Target.FromActor(targetActor), Color.Green);
self.QueueActivity(order.Queued, new ReturnToBase(self, Info.AbortOnResupply, targetActor)); // 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
// free resupplier.
var forceLand = orderString == "ForceEnter" || !Info.TakeOffOnResupply;
self.QueueActivity(order.Queued, new ReturnToBase(self, Info.AbortOnResupply, targetActor, forceLand));
} }
else if (order.OrderString == "Stop") else if (orderString == "Stop")
{ {
self.CancelActivity(); self.CancelActivity();
@@ -1012,7 +1022,7 @@ namespace OpenRA.Mods.Common.Traits
UnReserve(); UnReserve();
} }
else if (order.OrderString == "ReturnToBase" && rearmable != null && rearmable.Info.RearmActors.Any()) else if (orderString == "ReturnToBase" && rearmable != null && rearmable.Info.RearmActors.Any())
{ {
// Don't restart activity every time deploy hotkey is triggered // Don't restart activity every time deploy hotkey is triggered
if (self.CurrentActivity is ReturnToBase || GetActorBelow() != null) if (self.CurrentActivity is ReturnToBase || GetActorBelow() != null)
@@ -1022,10 +1032,10 @@ namespace OpenRA.Mods.Common.Traits
UnReserve(); UnReserve();
// Aircraft with TakeOffOnResupply would immediately take off again, so there's no point in forcing them to land // Aircraft with TakeOffOnResupply would immediately take off again, so there's no point in forcing them to land
// on a resupplier. For aircraft without it, it makes more sense to land than to idle above a free resupplier, though. // on a resupplier. For aircraft without it, it makes more sense to land than to idle above a free resupplier.
self.QueueActivity(order.Queued, new ReturnToBase(self, Info.AbortOnResupply, null, !Info.TakeOffOnResupply)); self.QueueActivity(order.Queued, new ReturnToBase(self, Info.AbortOnResupply, null, !Info.TakeOffOnResupply));
} }
else if (order.OrderString == "Scatter") else if (orderString == "Scatter")
Nudge(self); Nudge(self);
} }