RepairableNearUnitsWithRepairCursor #12361

This commit is contained in:
rob-v
2017-04-11 17:32:00 +02:00
parent 739653ce37
commit 9216427c2b
2 changed files with 28 additions and 5 deletions

View File

@@ -49,17 +49,27 @@ namespace OpenRA.Mods.Common.Orders
if (underCursor.Owner != world.LocalPlayer) if (underCursor.Owner != world.LocalPlayer)
yield break; yield break;
Actor repairBuilding = null;
var orderId = "Repair";
// Test for generic Repairable (used on units). // Test for generic Repairable (used on units).
var repairable = underCursor.TraitOrDefault<Repairable>(); var repairable = underCursor.TraitOrDefault<Repairable>();
if (repairable == null) if (repairable != null)
yield break; repairBuilding = repairable.FindRepairBuilding(underCursor);
else
{
var repairableNear = underCursor.TraitOrDefault<RepairableNear>();
if (repairableNear != null)
{
orderId = "RepairNear";
repairBuilding = repairableNear.FindRepairBuilding(underCursor);
}
}
// Find a building to repair at.
var repairBuilding = repairable.FindRepairBuilding(underCursor);
if (repairBuilding == null) if (repairBuilding == null)
yield break; 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) public void Tick(World world)

View File

@@ -11,6 +11,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Activities;
using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Orders;
using OpenRA.Traits; using OpenRA.Traits;
@@ -84,5 +85,17 @@ namespace OpenRA.Mods.Common.Traits
self.SetTargetLine(target, Color.Green, false); self.SetTargetLine(target, Color.Green, false);
} }
} }
public Actor FindRepairBuilding(Actor self)
{
var repairBuilding = self.World.ActorsWithTrait<RepairsUnits>()
.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<null, null>, which is OK.
return repairBuilding.FirstOrDefault().Actor;
}
} }
} }