Use IResourceLayer in BaseBuilderBotModule.
This commit is contained in:
@@ -150,8 +150,8 @@ namespace OpenRA.Mods.Common.Traits
|
||||
readonly Player player;
|
||||
PowerManager playerPower;
|
||||
PlayerResources playerResources;
|
||||
IResourceLayer resourceLayer;
|
||||
IBotPositionsUpdated[] positionsUpdatedModules;
|
||||
BitArray resourceTypeIndices;
|
||||
CPos initialBaseCenter;
|
||||
CPos defenseCenter;
|
||||
|
||||
@@ -168,20 +168,16 @@ namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
playerPower = self.Owner.PlayerActor.TraitOrDefault<PowerManager>();
|
||||
playerResources = self.Owner.PlayerActor.Trait<PlayerResources>();
|
||||
resourceLayer = self.World.WorldActor.TraitOrDefault<IResourceLayer>();
|
||||
positionsUpdatedModules = self.Owner.PlayerActor.TraitsImplementing<IBotPositionsUpdated>().ToArray();
|
||||
}
|
||||
|
||||
protected override void TraitEnabled(Actor self)
|
||||
{
|
||||
var terrainInfo = world.Map.Rules.TerrainInfo;
|
||||
resourceTypeIndices = new BitArray(terrainInfo.TerrainTypes.Length); // Big enough
|
||||
foreach (var t in world.Map.Rules.Actors["world"].TraitInfos<ResourceTypeInfo>())
|
||||
resourceTypeIndices.Set(terrainInfo.GetTerrainIndex(t.TerrainType), true);
|
||||
|
||||
foreach (var building in Info.BuildingQueues)
|
||||
builders.Add(new BaseBuilderQueueManager(this, building, player, playerPower, playerResources, resourceTypeIndices));
|
||||
builders.Add(new BaseBuilderQueueManager(this, building, player, playerPower, playerResources, resourceLayer));
|
||||
foreach (var defense in Info.DefenseQueues)
|
||||
builders.Add(new BaseBuilderQueueManager(this, defense, player, playerPower, playerResources, resourceTypeIndices));
|
||||
builders.Add(new BaseBuilderQueueManager(this, defense, player, playerPower, playerResources, resourceLayer));
|
||||
}
|
||||
|
||||
void IBotPositionsUpdated.UpdatedBaseCenter(CPos newLocation)
|
||||
|
||||
@@ -26,6 +26,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
readonly Player player;
|
||||
readonly PowerManager playerPower;
|
||||
readonly PlayerResources playerResources;
|
||||
readonly IResourceLayer resourceLayer;
|
||||
|
||||
int waitTicks;
|
||||
Actor[] playerBuildings;
|
||||
@@ -35,22 +36,21 @@ namespace OpenRA.Mods.Common.Traits
|
||||
int cachedBases;
|
||||
int cachedBuildings;
|
||||
int minimumExcessPower;
|
||||
BitArray resourceTypeIndices;
|
||||
|
||||
WaterCheck waterState = WaterCheck.NotChecked;
|
||||
|
||||
public BaseBuilderQueueManager(BaseBuilderBotModule baseBuilder, string category, Player p, PowerManager pm,
|
||||
PlayerResources pr, BitArray resourceTypeIndices)
|
||||
PlayerResources pr, IResourceLayer rl)
|
||||
{
|
||||
this.baseBuilder = baseBuilder;
|
||||
world = p.World;
|
||||
player = p;
|
||||
playerPower = pm;
|
||||
playerResources = pr;
|
||||
resourceLayer = rl;
|
||||
this.category = category;
|
||||
failRetryTicks = baseBuilder.Info.StructureProductionResumeDelay;
|
||||
minimumExcessPower = baseBuilder.Info.MinimumExcessPower;
|
||||
this.resourceTypeIndices = resourceTypeIndices;
|
||||
if (!baseBuilder.Info.NavalProductionTypes.Any())
|
||||
waterState = WaterCheck.DontCheck;
|
||||
}
|
||||
@@ -418,8 +418,10 @@ namespace OpenRA.Mods.Common.Traits
|
||||
case BuildingType.Refinery:
|
||||
|
||||
// Try and place the refinery near a resource field
|
||||
if (resourceLayer != null)
|
||||
{
|
||||
var nearbyResources = world.Map.FindTilesInAnnulus(baseCenter, baseBuilder.Info.MinBaseRadius, baseBuilder.Info.MaxBaseRadius)
|
||||
.Where(a => resourceTypeIndices.Get(world.Map.GetTerrainIndex(a)))
|
||||
.Where(a => resourceLayer.GetResource(a).Type != null)
|
||||
.Shuffle(world.LocalRandom).Take(baseBuilder.Info.MaxResourceCellsToCheck);
|
||||
|
||||
foreach (var r in nearbyResources)
|
||||
@@ -428,6 +430,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
if (found != null)
|
||||
return found;
|
||||
}
|
||||
}
|
||||
|
||||
// Try and find a free spot somewhere else in the base
|
||||
return findPos(baseCenter, baseCenter, baseBuilder.Info.MinBaseRadius, baseBuilder.Info.MaxBaseRadius);
|
||||
|
||||
Reference in New Issue
Block a user