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