diff --git a/OpenRA.Mods.RA/Air/HeliReturn.cs b/OpenRA.Mods.RA/Air/HeliReturn.cs index 57698a3ef0..c272660216 100755 --- a/OpenRA.Mods.RA/Air/HeliReturn.cs +++ b/OpenRA.Mods.RA/Air/HeliReturn.cs @@ -32,10 +32,16 @@ namespace OpenRA.Mods.RA.Air var initialFacing = self.Info.Traits.Get().InitialFacing; if (dest == null) - return Util.SequenceActivities( - new Turn(initialFacing), - new HeliLand(true), - NextActivity); + { + var rearmBuildings = self.Info.Traits.Get().RearmBuildings; + var nearestHpad = self.World.ActorsWithTrait() + .Where(a => a.Actor.Owner == self.Owner && rearmBuildings.Contains(a.Actor.Info.Name)) + .Select(a => a.Actor) + .ClosestTo(self.CenterLocation); + + self.CancelActivity(); + return Util.SequenceActivities(new HeliFly(Util.CenterOfCell(nearestHpad.Location))); + } var res = dest.TraitOrDefault(); var heli = self.Trait(); diff --git a/OpenRA.Mods.RA/Air/Helicopter.cs b/OpenRA.Mods.RA/Air/Helicopter.cs index bc0ed05060..29775fbeb2 100755 --- a/OpenRA.Mods.RA/Air/Helicopter.cs +++ b/OpenRA.Mods.RA/Air/Helicopter.cs @@ -58,22 +58,29 @@ namespace OpenRA.Mods.RA.Air if (order.OrderString == "Enter") { - if (Reservable.IsReserved(order.TargetActor)) return; - var res = order.TargetActor.TraitOrDefault(); - if (res != null) - reservation = res.Reserve(order.TargetActor, self, this); + if (Reservable.IsReserved(order.TargetActor)) + { + self.CancelActivity(); + self.QueueActivity(new HeliReturn()); + } + else + { + var res = order.TargetActor.TraitOrDefault(); + if (res != null) + reservation = res.Reserve(order.TargetActor, self, this); - var exit = order.TargetActor.Info.Traits.WithInterface().FirstOrDefault(); - var offset = exit != null ? exit.SpawnOffset : int2.Zero; + var exit = order.TargetActor.Info.Traits.WithInterface().FirstOrDefault(); + var offset = exit != null ? exit.SpawnOffset : int2.Zero; - self.SetTargetLine(Target.FromActor(order.TargetActor), Color.Green); + self.SetTargetLine(Target.FromActor(order.TargetActor), Color.Green); - self.CancelActivity(); - self.QueueActivity(new HeliFly(order.TargetActor.Trait().PxPosition + offset)); - self.QueueActivity(new Turn(Info.InitialFacing)); - self.QueueActivity(new HeliLand(false)); + self.CancelActivity(); + self.QueueActivity(new HeliFly(order.TargetActor.Trait().PxPosition + offset)); + self.QueueActivity(new Turn(Info.InitialFacing)); + self.QueueActivity(new HeliLand(false)); - QueueResupplyActivities(order.TargetActor); + QueueResupplyActivities(order.TargetActor); + } } if (order.OrderString == "ReturnToBase")