Allow VTOLs to land with force-move

This commit is contained in:
tovl
2019-06-30 10:11:42 +00:00
committed by reaperrr
parent 8e5875453a
commit 79a48765d9
13 changed files with 58 additions and 32 deletions

View File

@@ -119,20 +119,22 @@ namespace OpenRA.Mods.Common.Activities
// Look for free landing cell
if (target.Type == TargetType.Terrain && !landingInitiated)
{
var targetLocation = aircraft.FindLandingLocation(landingCell, landRange);
if (!targetLocation.HasValue)
var newLocation = aircraft.FindLandingLocation(landingCell, landRange);
// Cannot land so fly towards the last target location instead.
if (!newLocation.HasValue)
{
// Maintain holding pattern.
if (aircraft.Info.CanHover)
QueueChild(self, new Wait(25), true);
else
QueueChild(self, new FlyCircle(self, 25), true);
Cancel(self, true);
QueueChild(self, aircraft.MoveTo(landingCell, 0), true);
return this;
}
target = Target.FromCell(self.World, targetLocation.Value);
targetPosition = target.CenterPosition + offset;
landingCell = self.World.Map.CellContaining(targetPosition);
if (newLocation.Value != landingCell)
{
target = Target.FromCell(self.World, newLocation.Value);
targetPosition = target.CenterPosition + offset;
landingCell = self.World.Map.CellContaining(targetPosition);
}
}
// Move towards landing location

View File

@@ -97,6 +97,9 @@ namespace OpenRA.Mods.Common.Activities
// Checking for NextActivity == null again in case another activity was queued while taking off
if (moveToRallyPoint && NextActivity == null)
{
if (!aircraft.Info.VTOL && assignTargetOnFirstRun)
return NextActivity;
QueueChild(self, new AttackMoveActivity(self, () => move.MoveToTarget(self, target)), true);
moveToRallyPoint = false;
return this;

View File

@@ -66,7 +66,15 @@ namespace OpenRA.Mods.Common.Activities
if (cargo != carryall.Carryable)
return NextActivity;
if (cargo.IsDead || IsCanceling || carryable.IsTraitDisabled || !cargo.AppearsFriendlyTo(self))
if (IsCanceling)
{
if (carryall.State == Carryall.CarryallState.Reserved)
carryall.UnreserveCarryable(self);
return NextActivity;
}
if (cargo.IsDead || carryable.IsTraitDisabled || !cargo.AppearsFriendlyTo(self))
{
carryall.UnreserveCarryable(self);
return NextActivity;
@@ -93,14 +101,15 @@ namespace OpenRA.Mods.Common.Activities
{
// Land at the target location
var localOffset = carryall.OffsetForCarryable(self, cargo).Rotate(carryableBody.QuantizeOrientation(self, cargo.Orientation));
QueueChild(self, new Land(self, Target.FromActor(cargo), -carryableBody.LocalToWorld(localOffset), carryableFacing.Facing));
QueueChild(self, new Land(self, Target.FromActor(cargo), -carryableBody.LocalToWorld(localOffset), carryableFacing.Facing), true);
// Pause briefly before attachment for visual effect
if (delay > 0)
QueueChild(self, new Wait(delay, false), true);
QueueChild(self, new Wait(delay, false));
// Remove our carryable from world
QueueChild(self, new CallFunc(() => Attach(self)));
QueueChild(self, new TakeOff(self));
return this;
}
}

View File

@@ -680,7 +680,7 @@ namespace OpenRA.Mods.Common.Traits
}
}
if (!atLandAltitude && Info.LandWhenIdle)
if (!atLandAltitude && Info.LandWhenIdle && Info.LandableTerrainTypes.Count > 0)
self.QueueActivity(new Land(self));
else if (!Info.CanHover && !atLandAltitude)
self.QueueActivity(new FlyCircle(self, -1, Info.IdleTurnSpeed > -1 ? Info.IdleTurnSpeed : TurnSpeed));
@@ -914,7 +914,7 @@ namespace OpenRA.Mods.Common.Traits
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{
if (order.OrderID == "Enter" || order.OrderID == "Move")
if (order.OrderID == "Enter" || order.OrderID == "Move" || order.OrderID == "Land")
return new Order(order.OrderID, self, target, queued);
return null;
@@ -934,6 +934,7 @@ namespace OpenRA.Mods.Common.Traits
{
switch (order.OrderString)
{
case "Land":
case "Move":
if (!Info.MoveIntoShroud && order.Target.Type != TargetType.Invalid)
{
@@ -968,6 +969,20 @@ namespace OpenRA.Mods.Common.Traits
self.SetTargetLine(target, Color.Green);
self.QueueActivity(order.Queued, new Fly(self, target));
}
else if (order.OrderString == "Land")
{
var cell = self.World.Map.Clamp(self.World.Map.CellContaining(order.Target.CenterPosition));
if (!Info.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell))
return;
if (!order.Queued)
UnReserve();
var target = Target.FromCell(self.World, cell);
self.SetTargetLine(target, Color.Green);
self.QueueActivity(order.Queued, new Land(self, target));
}
else if (order.OrderString == "Enter" || order.OrderString == "Repair")
{
// Enter and Repair orders are only valid for own/allied actors,
@@ -1095,13 +1110,14 @@ namespace OpenRA.Mods.Common.Traits
{
readonly Aircraft aircraft;
public string OrderID { get { return "Move"; } }
public string OrderID { get; protected set; }
public int OrderPriority { get { return 4; } }
public bool IsQueued { get; protected set; }
public AircraftMoveOrderTargeter(Aircraft aircraft)
{
this.aircraft = aircraft;
OrderID = "Move";
}
public bool TargetOverridesSelection(TargetModifiers modifiers)
@@ -1114,6 +1130,9 @@ namespace OpenRA.Mods.Common.Traits
if (target.Type != TargetType.Terrain || (aircraft.requireForceMove && !modifiers.HasModifier(TargetModifiers.ForceMove)))
return false;
if (modifiers.HasModifier(TargetModifiers.ForceMove))
OrderID = "Land";
var location = self.World.Map.CellContaining(target.CenterPosition);
var explored = self.Owner.Shroud.IsExplored(location);
cursor = self.World.Map.Contains(location) ?