Allow forced landing on helipads and enforce takeoff otherwise.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user