Allow DeliveryBuildings: to be specified on Harvester

This allows multiple harv/proc type pairs, requested in #4323.
This commit is contained in:
Chris Forbes
2013-12-19 19:35:07 +13:00
committed by Paul Chote
parent c86d7b85a4
commit b55b64e86c

View File

@@ -20,6 +20,7 @@ namespace OpenRA.Mods.RA
{ {
public class HarvesterInfo : ITraitInfo public class HarvesterInfo : ITraitInfo
{ {
public readonly string[] DeliveryBuildings = { };
public readonly int Capacity = 28; public readonly int Capacity = 28;
public readonly int LoadTicksPerBale = 4; public readonly int LoadTicksPerBale = 4;
public readonly int UnloadTicksPerBale = 4; public readonly int UnloadTicksPerBale = 4;
@@ -101,12 +102,18 @@ namespace OpenRA.Mods.RA
self.QueueActivity(new FindResources()); self.QueueActivity(new FindResources());
} }
bool IsAcceptableProcType(Actor proc)
{
return Info.DeliveryBuildings.Length == 0 ||
Info.DeliveryBuildings.Contains(proc.Info.Name);
}
Actor ClosestProc(Actor self, Actor ignore) Actor ClosestProc(Actor self, Actor ignore)
{ {
// Find all refineries and their occupancy count: // Find all refineries and their occupancy count:
var refs = ( var refs = (
from r in self.World.ActorsWithTrait<IAcceptOre>() from r in self.World.ActorsWithTrait<IAcceptOre>()
where r.Actor != ignore && r.Actor.Owner == self.Owner where r.Actor != ignore && r.Actor.Owner == self.Owner && IsAcceptableProcType(r.Actor)
let linkedHarvs = self.World.ActorsWithTrait<Harvester>().Where(a => a.Trait.LinkedProc == r.Actor).Count() let linkedHarvs = self.World.ActorsWithTrait<Harvester>().Where(a => a.Trait.LinkedProc == r.Actor).Count()
select new { Location = r.Actor.Location + r.Trait.DeliverOffset, Actor = r.Actor, Occupancy = linkedHarvs } select new { Location = r.Actor.Location + r.Trait.DeliverOffset, Actor = r.Actor, Occupancy = linkedHarvs }
).ToDictionary(r => r.Location); ).ToDictionary(r => r.Location);
@@ -239,7 +246,8 @@ namespace OpenRA.Mods.RA
{ {
get get
{ {
yield return new EnterAlliedActorTargeter<IAcceptOre>("Deliver", 5, _ => true, yield return new EnterAlliedActorTargeter<IAcceptOre>("Deliver", 5,
proc => IsAcceptableProcType(proc),
proc => !IsEmpty && proc.Trait<IAcceptOre>().AllowDocking); proc => !IsEmpty && proc.Trait<IAcceptOre>().AllowDocking);
yield return new HarvestOrderTargeter(); yield return new HarvestOrderTargeter();
} }
@@ -316,7 +324,7 @@ namespace OpenRA.Mods.RA
{ {
// NOTE: An explicit deliver order forces the harvester to always deliver to this refinery. // NOTE: An explicit deliver order forces the harvester to always deliver to this refinery.
var iao = order.TargetActor.TraitOrDefault<IAcceptOre>(); var iao = order.TargetActor.TraitOrDefault<IAcceptOre>();
if (iao == null || !iao.AllowDocking) if (iao == null || !iao.AllowDocking || !IsAcceptableProcType(order.TargetActor))
return; return;
if (order.TargetActor != OwnerLinkedProc) if (order.TargetActor != OwnerLinkedProc)