From 9216427c2b5623c2401024b096cde637f86060c1 Mon Sep 17 00:00:00 2001 From: rob-v Date: Tue, 11 Apr 2017 17:32:00 +0200 Subject: [PATCH] RepairableNearUnitsWithRepairCursor #12361 --- .../Orders/RepairOrderGenerator.cs | 20 ++++++++++++++----- OpenRA.Mods.Common/Traits/RepairableNear.cs | 13 ++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs b/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs index 15dc9f9d45..94f90e3b46 100644 --- a/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs @@ -49,17 +49,27 @@ namespace OpenRA.Mods.Common.Orders if (underCursor.Owner != world.LocalPlayer) yield break; + Actor repairBuilding = null; + var orderId = "Repair"; + // Test for generic Repairable (used on units). var repairable = underCursor.TraitOrDefault(); - if (repairable == null) - yield break; + if (repairable != null) + repairBuilding = repairable.FindRepairBuilding(underCursor); + else + { + var repairableNear = underCursor.TraitOrDefault(); + if (repairableNear != null) + { + orderId = "RepairNear"; + repairBuilding = repairableNear.FindRepairBuilding(underCursor); + } + } - // Find a building to repair at. - var repairBuilding = repairable.FindRepairBuilding(underCursor); if (repairBuilding == null) yield break; - yield return new Order("Repair", underCursor, false) { TargetActor = repairBuilding }; + yield return new Order(orderId, underCursor, false) { TargetActor = repairBuilding }; } public void Tick(World world) diff --git a/OpenRA.Mods.Common/Traits/RepairableNear.cs b/OpenRA.Mods.Common/Traits/RepairableNear.cs index 8fc31c0d0c..09cbe625cf 100644 --- a/OpenRA.Mods.Common/Traits/RepairableNear.cs +++ b/OpenRA.Mods.Common/Traits/RepairableNear.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Drawing; +using System.Linq; using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Orders; using OpenRA.Traits; @@ -84,5 +85,17 @@ namespace OpenRA.Mods.Common.Traits self.SetTargetLine(target, Color.Green, false); } } + + public Actor FindRepairBuilding(Actor self) + { + var repairBuilding = self.World.ActorsWithTrait() + .Where(a => !a.Actor.IsDead && a.Actor.IsInWorld + && a.Actor.Owner.IsAlliedWith(self.Owner) && + info.Buildings.Contains(a.Actor.Info.Name)) + .OrderBy(p => (self.Location - p.Actor.Location).LengthSquared); + + // Worst case FirstOrDefault() will return a TraitPair, which is OK. + return repairBuilding.FirstOrDefault().Actor; + } } }