From 1e859c90adb72fadea2598c1e2cd5ffe7dba9001 Mon Sep 17 00:00:00 2001 From: tovl Date: Fri, 30 Aug 2019 19:57:50 +0200 Subject: [PATCH 1/4] Prevent bogus attackmove on take-off. --- OpenRA.Mods.Common/Activities/Air/Fly.cs | 4 ++-- OpenRA.Mods.Common/Activities/Air/TakeOff.cs | 25 +------------------- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 5 ++-- 3 files changed, 5 insertions(+), 29 deletions(-) diff --git a/OpenRA.Mods.Common/Activities/Air/Fly.cs b/OpenRA.Mods.Common/Activities/Air/Fly.cs index a5486e5fc2ba..594afa496caa 100644 --- a/OpenRA.Mods.Common/Activities/Air/Fly.cs +++ b/OpenRA.Mods.Common/Activities/Air/Fly.cs @@ -129,7 +129,7 @@ public override bool Tick(Actor self) if (aircraft.Info.CanHover && !skipHeightAdjustment && dat != aircraft.Info.CruiseAltitude) { if (dat <= aircraft.LandAltitude) - QueueChild(new TakeOff(self, target)); + QueueChild(new TakeOff(self)); else VerticalTakeOffOrLandTick(self, aircraft, aircraft.Facing, aircraft.Info.CruiseAltitude); @@ -140,7 +140,7 @@ public override bool Tick(Actor self) } else if (dat <= aircraft.LandAltitude) { - QueueChild(new TakeOff(self, target)); + QueueChild(new TakeOff(self)); return false; } diff --git a/OpenRA.Mods.Common/Activities/Air/TakeOff.cs b/OpenRA.Mods.Common/Activities/Air/TakeOff.cs index d9e14389e1d0..38a854a34b38 100644 --- a/OpenRA.Mods.Common/Activities/Air/TakeOff.cs +++ b/OpenRA.Mods.Common/Activities/Air/TakeOff.cs @@ -21,19 +21,13 @@ public class TakeOff : Activity { readonly Aircraft aircraft; readonly IMove move; - Target fallbackTarget; - bool movedToTarget = false; - public TakeOff(Actor self, Target fallbackTarget) + public TakeOff(Actor self) { aircraft = self.Trait(); move = self.Trait(); - this.fallbackTarget = fallbackTarget; } - public TakeOff(Actor self) - : this(self, Target.Invalid) { } - protected override void OnFirstRun(Actor self) { if (aircraft.ForceLanding) @@ -73,24 +67,7 @@ public override bool Tick(Actor self) return false; } - // Only move to the fallback target if we don't have anything better to do - if (NextActivity == null && fallbackTarget.IsValidFor(self) && !movedToTarget) - { - QueueChild(new AttackMoveActivity(self, () => move.MoveToTarget(self, fallbackTarget, targetLineColor: Color.OrangeRed))); - movedToTarget = true; - return false; - } - return true; } - - public override IEnumerable TargetLineNodes(Actor self) - { - if (ChildActivity != null) - foreach (var n in ChildActivity.TargetLineNodes(self)) - yield return n; - else - yield return new TargetLineNode(fallbackTarget, Color.OrangeRed); - } } } diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index eb59335dd65f..490fde1e0491 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -521,10 +521,9 @@ public void UnReserve(bool takeOff = false) if (takeOff && self.World.Map.DistanceAboveTerrain(CenterPosition).Length <= LandAltitude.Length) { + self.QueueActivity(new TakeOff(self)); if (rp != null) - self.QueueActivity(new TakeOff(self, Target.FromCell(self.World, rp.Location))); - else - self.QueueActivity(new TakeOff(self)); + self.QueueActivity(new AttackMoveActivity(self, () => MoveTo(rp.Location, null, targetLineColor: Color.OrangeRed))); } } From 796aa112d532257529664f4c778432e1bf860b2d Mon Sep 17 00:00:00 2001 From: tovl Date: Fri, 30 Aug 2019 22:13:09 +0200 Subject: [PATCH 2/4] Refactor unreserve actions. --- OpenRA.Mods.Common/Activities/Air/TakeOff.cs | 3 +- OpenRA.Mods.Common/Activities/Resupply.cs | 2 ++ OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 12 +------ .../Traits/Buildings/Reservable.cs | 33 ++++++++++++++----- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/OpenRA.Mods.Common/Activities/Air/TakeOff.cs b/OpenRA.Mods.Common/Activities/Air/TakeOff.cs index 38a854a34b38..e22caa1369d5 100644 --- a/OpenRA.Mods.Common/Activities/Air/TakeOff.cs +++ b/OpenRA.Mods.Common/Activities/Air/TakeOff.cs @@ -36,8 +36,7 @@ protected override void OnFirstRun(Actor self) if (self.World.Map.DistanceAboveTerrain(aircraft.CenterPosition).Length >= aircraft.Info.MinAirborneAltitude) return; - // We are taking off, so remove reservation and influence in ground cells. - aircraft.UnReserve(); + // We are taking off, so remove influence in ground cells. aircraft.RemoveInfluence(); if (aircraft.Info.TakeoffSounds.Length > 0) diff --git a/OpenRA.Mods.Common/Activities/Resupply.cs b/OpenRA.Mods.Common/Activities/Resupply.cs index 566a94190390..6c062f48399d 100644 --- a/OpenRA.Mods.Common/Activities/Resupply.cs +++ b/OpenRA.Mods.Common/Activities/Resupply.cs @@ -191,6 +191,8 @@ void OnResupplyEnding(Actor self, bool isHostInvalid = false) QueueChild(move.MoveTo(rp.Location, repairableNear != null ? null : host.Actor)); else QueueChild(new TakeOff(self)); + + aircraft.UnReserve(); } // Aircraft without TakeOffOnResupply remain on the resupplier until something else needs it diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 490fde1e0491..c11835f953b6 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -506,25 +506,15 @@ public void AllowYieldingReservation() MayYieldReservation = true; } - public void UnReserve(bool takeOff = false) + public void UnReserve() { if (reservation == null) return; - // Move to the host's rally point if it has one - var rp = ReservedActor != null ? ReservedActor.TraitOrDefault() : null; - reservation.Dispose(); reservation = null; ReservedActor = null; MayYieldReservation = false; - - if (takeOff && self.World.Map.DistanceAboveTerrain(CenterPosition).Length <= LandAltitude.Length) - { - self.QueueActivity(new TakeOff(self)); - if (rp != null) - self.QueueActivity(new AttackMoveActivity(self, () => MoveTo(rp.Location, null, targetLineColor: Color.OrangeRed))); - } } bool AircraftCanEnter(Actor a, TargetModifiers modifiers) diff --git a/OpenRA.Mods.Common/Traits/Buildings/Reservable.cs b/OpenRA.Mods.Common/Traits/Buildings/Reservable.cs index 1b618b486771..3b7ae41b46d5 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Reservable.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Reservable.cs @@ -10,6 +10,7 @@ #endregion using System; +using OpenRA.Mods.Common.Activities; using OpenRA.Primitives; using OpenRA.Traits; @@ -18,10 +19,16 @@ namespace OpenRA.Mods.Common.Traits [Desc("Reserve landing places for aircraft.")] class ReservableInfo : TraitInfo { } - public class Reservable : ITick, INotifyOwnerChanged, INotifySold, INotifyActorDisposing + public class Reservable : ITick, INotifyOwnerChanged, INotifySold, INotifyActorDisposing, INotifyCreated { Actor reservedFor; Aircraft reservedForAircraft; + RallyPoint rallyPoint; + + void INotifyCreated.Created(Actor self) + { + rallyPoint = self.TraitOrDefault(); + } void ITick.Tick(Actor self) { @@ -41,7 +48,7 @@ void ITick.Tick(Actor self) public IDisposable Reserve(Actor self, Actor forActor, Aircraft forAircraft) { if (reservedForAircraft != null && reservedForAircraft.MayYieldReservation) - reservedForAircraft.UnReserve(true); + UnReserve(self); reservedFor = forActor; reservedForAircraft = forAircraft; @@ -71,17 +78,27 @@ public static bool IsAvailableFor(Actor reservable, Actor forActor) return res == null || res.reservedForAircraft == null || res.reservedForAircraft.MayYieldReservation || res.reservedFor == forActor; } - private void UnReserve() + void UnReserve(Actor self) { if (reservedForAircraft != null) - reservedForAircraft.UnReserve(true); + { + if (reservedForAircraft.GetActorBelow() == self) + { + if (rallyPoint != null) + reservedFor.QueueActivity(reservedForAircraft.MoveTo(rallyPoint.Location, null, targetLineColor: Color.Green)); + else + reservedFor.QueueActivity(new TakeOff(reservedFor)); + } + + reservedForAircraft.UnReserve(); + } } - void INotifyActorDisposing.Disposing(Actor self) { UnReserve(); } + void INotifyActorDisposing.Disposing(Actor self) { UnReserve(self); } - void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { UnReserve(); } + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { UnReserve(self); } - void INotifySold.Selling(Actor self) { UnReserve(); } - void INotifySold.Sold(Actor self) { UnReserve(); } + void INotifySold.Selling(Actor self) { UnReserve(self); } + void INotifySold.Sold(Actor self) { UnReserve(self); } } } From bf677797a7946511fc2db6c0577fc9bd871305e5 Mon Sep 17 00:00:00 2001 From: tovl Date: Fri, 30 Aug 2019 22:22:49 +0200 Subject: [PATCH 3/4] Add missing target line to aircraft taking off from resupplying. --- OpenRA.Mods.Common/Activities/Resupply.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.Mods.Common/Activities/Resupply.cs b/OpenRA.Mods.Common/Activities/Resupply.cs index 6c062f48399d..1b4cd3f1b9dd 100644 --- a/OpenRA.Mods.Common/Activities/Resupply.cs +++ b/OpenRA.Mods.Common/Activities/Resupply.cs @@ -188,7 +188,7 @@ void OnResupplyEnding(Actor self, bool isHostInvalid = false) if (wasRepaired || isHostInvalid || (!stayOnResupplier && aircraft.Info.TakeOffOnResupply)) { if (rp != null) - QueueChild(move.MoveTo(rp.Location, repairableNear != null ? null : host.Actor)); + QueueChild(move.MoveTo(rp.Location, repairableNear != null ? null : host.Actor, targetLineColor: Color.Green)); else QueueChild(new TakeOff(self)); From bce07ab71b1ab66ceaf2ff830e3a1bb5f5187913 Mon Sep 17 00:00:00 2001 From: tovl Date: Sun, 15 Sep 2019 16:14:18 +0200 Subject: [PATCH 4/4] Skip rally point if order is queued after resupply. --- OpenRA.Mods.Common/Activities/Resupply.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.Mods.Common/Activities/Resupply.cs b/OpenRA.Mods.Common/Activities/Resupply.cs index 1b4cd3f1b9dd..5030b039e435 100644 --- a/OpenRA.Mods.Common/Activities/Resupply.cs +++ b/OpenRA.Mods.Common/Activities/Resupply.cs @@ -187,7 +187,7 @@ void OnResupplyEnding(Actor self, bool isHostInvalid = false) { if (wasRepaired || isHostInvalid || (!stayOnResupplier && aircraft.Info.TakeOffOnResupply)) { - if (rp != null) + if (self.CurrentActivity.NextActivity == null && rp != null) QueueChild(move.MoveTo(rp.Location, repairableNear != null ? null : host.Actor, targetLineColor: Color.Green)); else QueueChild(new TakeOff(self));