diff --git a/OpenRA.Mods.Common/Activities/Air/Land.cs b/OpenRA.Mods.Common/Activities/Air/Land.cs index faaf244b82..d26164fce2 100644 --- a/OpenRA.Mods.Common/Activities/Air/Land.cs +++ b/OpenRA.Mods.Common/Activities/Air/Land.cs @@ -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 diff --git a/OpenRA.Mods.Common/Activities/Air/TakeOff.cs b/OpenRA.Mods.Common/Activities/Air/TakeOff.cs index d9a2aa9329..3ddbac0ebf 100644 --- a/OpenRA.Mods.Common/Activities/Air/TakeOff.cs +++ b/OpenRA.Mods.Common/Activities/Air/TakeOff.cs @@ -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; diff --git a/OpenRA.Mods.Common/Activities/PickupUnit.cs b/OpenRA.Mods.Common/Activities/PickupUnit.cs index 749fbb0ca2..c037b68174 100644 --- a/OpenRA.Mods.Common/Activities/PickupUnit.cs +++ b/OpenRA.Mods.Common/Activities/PickupUnit.cs @@ -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; } } diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 7d332f1ffc..455908d2a5 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -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) ? diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml index 46e8d41fc6..4a233fca79 100644 --- a/mods/cnc/chrome/ingame.yaml +++ b/mods/cnc/chrome/ingame.yaml @@ -1209,7 +1209,7 @@ Container@PLAYER_WIDGETS: Background: chrome-button-background DisableKeySound: true TooltipText: Force Move - TooltipDesc: Selected units will move to the desired location\n - Default activity for the target is suppressed\n - Vehicles will attempt to crush enemies at the target location\n\nLeft-click icon then right-click on target.\nHold {(Alt)} to activate temporarily while commanding units. + TooltipDesc: Selected units will move to the desired location\n - Default activity for the target is suppressed\n - Vehicles will attempt to crush enemies at the target location\n - Helicopters will land at the target location\n\nLeft-click icon then right-click on target.\nHold {(Alt)} to activate temporarily while commanding units. TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: BUTTON_WITH_DESC_HIGHLIGHT_TOOLTIP_FACTIONSUFFIX Children: diff --git a/mods/cnc/rules/aircraft.yaml b/mods/cnc/rules/aircraft.yaml index fcf75557bc..fa76be8e98 100644 --- a/mods/cnc/rules/aircraft.yaml +++ b/mods/cnc/rules/aircraft.yaml @@ -15,8 +15,6 @@ TRAN: LandWhenIdle: true TurnSpeed: 5 Speed: 150 - LandableTerrainTypes: Clear, Rough, Road, Beach, Tiberium, BlueTiberium - Crushes: crate, infantry AltitudeVelocity: 0c100 Health: HP: 9000 diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index 1f2aba0be0..c717676cc7 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -328,6 +328,8 @@ CanHover: True TakeOffOnResupply: true VTOL: true + LandableTerrainTypes: Clear, Rough, Road, Beach, Tiberium, BlueTiberium + Crushes: crate, infantry InitialFacing: 224 HiddenUnderFog: Type: GroundPosition diff --git a/mods/ra/chrome/ingame-player.yaml b/mods/ra/chrome/ingame-player.yaml index 0187d6c995..b3bfcce5e6 100644 --- a/mods/ra/chrome/ingame-player.yaml +++ b/mods/ra/chrome/ingame-player.yaml @@ -73,7 +73,7 @@ Container@PLAYER_WIDGETS: Background: command-button DisableKeySound: true TooltipText: Force Move - TooltipDesc: Selected units will move to the desired location\n - Default activity for the target is suppressed\n - Vehicles will attempt to crush enemies at the target location\n - Chrono Tanks will teleport towards the target location\n\nLeft-click icon then right-click on target.\nHold {(Alt)} to activate temporarily while commanding units. + TooltipDesc: Selected units will move to the desired location\n - Default activity for the target is suppressed\n - Vehicles will attempt to crush enemies at the target location\n - Helicopters will land at the target location\n - Chrono Tanks will teleport towards the target location\n\nLeft-click icon then right-click on target.\nHold {(Alt)} to activate temporarily while commanding units. TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: BUTTON_WITH_DESC_HIGHLIGHT_TOOLTIP Children: diff --git a/mods/ra/rules/aircraft.yaml b/mods/ra/rules/aircraft.yaml index 21e3c22b94..1a655afb8d 100644 --- a/mods/ra/rules/aircraft.yaml +++ b/mods/ra/rules/aircraft.yaml @@ -240,8 +240,6 @@ TRAN: Aircraft: TurnSpeed: 5 Speed: 128 - LandableTerrainTypes: Clear,Rough,Road,Ore,Beach,Gems - Crushes: crate, mine, infantry AltitudeVelocity: 0c58 WithIdleOverlay@ROTOR1AIR: Offset: 597,0,213 diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index e26ed424fa..28a8d56e2e 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -631,6 +631,8 @@ WaitDistanceFromResupplyBase: 4c0 TakeOffOnResupply: true VTOL: true + LandableTerrainTypes: Clear, Rough, Road, Ore, Beach, Gems + Crushes: crate, mine, infantry InitialFacing: 224 GpsDot: String: Helicopter diff --git a/mods/ts/chrome/ingame-player.yaml b/mods/ts/chrome/ingame-player.yaml index 03255a9c1c..3136f19294 100644 --- a/mods/ts/chrome/ingame-player.yaml +++ b/mods/ts/chrome/ingame-player.yaml @@ -61,7 +61,7 @@ Container@PLAYER_WIDGETS: Background: DisableKeySound: true TooltipText: Force Move - TooltipDesc: Selected units will move to the desired location\n - Default activity for the target is suppressed\n - Vehicles will attempt to crush enemies at the target location\n - Deployed units will undeploy and move to the target location\n - Carryalls will not release their cargo at the target location\n\nLeft-click icon then right-click on target.\nHold {(Alt)} to activate temporarily while commanding units. + TooltipDesc: Selected units will move to the desired location\n - Default activity for the target is suppressed\n - Vehicles will attempt to crush enemies at the target location\n - Deployed units will undeploy and move to the target location\n - Helicopters will land at the target location\n\nLeft-click icon then right-click on target.\nHold {(Alt)} to activate temporarily while commanding units. TooltipContainer: TOOLTIP_CONTAINER TooltipTemplate: BUTTON_WITH_DESC_HIGHLIGHT_TOOLTIP Children: diff --git a/mods/ts/rules/aircraft.yaml b/mods/ts/rules/aircraft.yaml index 9a18b022c2..bd85459854 100644 --- a/mods/ts/rules/aircraft.yaml +++ b/mods/ts/rules/aircraft.yaml @@ -10,8 +10,6 @@ DPOD: TurnSpeed: 5 Speed: 149 InitialFacing: 0 - LandableTerrainTypes: Clear,Road,Rail,DirtRoad,Rough,Tiberium,BlueTiberium,Veins - Crushes: crate, infantry Health: HP: 6000 Armor: @@ -46,8 +44,6 @@ DSHP: TurnSpeed: 5 Speed: 168 InitialFacing: 0 - LandableTerrainTypes: Clear,Road,Rail,DirtRoad,Rough,Tiberium,BlueTiberium,Veins - Crushes: crate, infantry TakeoffSounds: dropup1.aud LandingSounds: dropdwn1.aud IdealSeparation: 1275 @@ -198,8 +194,6 @@ ORCATRAN: TurnSpeed: 5 Speed: 84 InitialFacing: 0 - LandableTerrainTypes: Clear,Road,Rail,DirtRoad,Rough,Tiberium,BlueTiberium,Veins - Crushes: crate, infantry TakeoffSounds: orcaup1.aud LandingSounds: orcadwn1.aud IdealSeparation: 1275 @@ -233,12 +227,9 @@ TRNSPORT: Prerequisites: ~gahpad, gadept Description: VTOL aircraft capable of lifting\nand transporting vehicles.\n Unarmed Aircraft: - LandWhenIdle: true TurnSpeed: 5 Speed: 149 InitialFacing: 0 - LandableTerrainTypes: Clear,Road,Rail,DirtRoad,Rough,Tiberium,BlueTiberium,Veins - Crushes: crate, infantry TakeoffSounds: dropup1.aud LandingSounds: dropdwn1.aud MoveIntoShroud: false diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index bf9830c542..5b842b1375 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -875,6 +875,8 @@ Voice: Move IdealSeparation: 853 MaximumPitch: 120 + LandableTerrainTypes: Clear, Road, Rail, DirtRoad, Rough, Tiberium, BlueTiberium, Veins + Crushes: crate, infantry Voiced: VoiceSet: Heli HiddenUnderFog: