Allow DeliveryBuildings: to be specified on Harvester
This allows multiple harv/proc type pairs, requested in #4323.
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user