package erogenousbeef.bigreactors.world;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.ChunkProviderEnd;
import net.minecraft.world.gen.ChunkProviderHell;
import net.minecraft.world.gen.feature.WorldGenMinable;
/**
* This class handles simple ore generation.
* @author Erogenous Beef
*
*/
public class BRSimpleOreGenerator extends WorldGenMinable {
protected Block blockToGenerate;
protected int blockToGenerateMetadata;
protected Block blockToReplace;
protected int minClustersPerChunk;
protected int maxClustersPerChunk;
protected int minY;
protected int maxY;
// For now, we never generate in those dimensions.
protected Set<Integer> dimensionBlacklist;
public BRSimpleOreGenerator(Block blockToGenerate, int blockMetadata, Block blockToReplace, int clustersPerChunk, int maxY, int maxOrePerCluster) {
super(blockToGenerate, blockMetadata, maxOrePerCluster, blockToReplace);
this.minClustersPerChunk = maxClustersPerChunk = clustersPerChunk;
this.minY = 0;
this.maxY = maxY;
// this is only used for equality checks
this.blockToGenerate = blockToGenerate;
this.blockToGenerateMetadata = blockMetadata;
this.blockToReplace = blockToReplace;
dimensionBlacklist = new CopyOnWriteArraySet<Integer>();
}
public BRSimpleOreGenerator(Block blockToGenerate, int blockMetadata, Block blockToReplace, int minClustersPerChunk, int maxClustersPerChunk, int minY, int maxY, int maxOrePerCluster) {
this(blockToGenerate, blockMetadata, blockToReplace, maxClustersPerChunk, maxY, maxOrePerCluster);
this.minClustersPerChunk = minClustersPerChunk;
this.minY = minY;
}
public void blacklistDimension(int dimensionId) {
dimensionBlacklist.add(dimensionId);
}
/**
* Call to generate in the given chunk in the given world.
* Performs no validation as to whether this generator should run (per user settings).
* @param world
* @param random
* @param chunkX
* @param chunkZ
*/
public void generateChunk(World world, Random random, int chunkX, int chunkZ) {
int clustersToGen = minClustersPerChunk;
if(maxClustersPerChunk > minClustersPerChunk) {
clustersToGen += random.nextInt(maxClustersPerChunk - minClustersPerChunk);
}
int chunkBaseX = chunkX << 4;
int chunkBaseZ = chunkZ << 4;
int y;
for(int i = 0; i < clustersToGen; i++) {
y = this.minY + random.nextInt(this.maxY - this.minY);
generate(world, random, chunkBaseX, y, chunkBaseZ);
}
}
/**
* Call to discover if this generator WISHES to generate in this world.
* @param world
* @return
*/
public boolean shouldGenerateInWorld(World world) {
IChunkProvider chunkProvider = world.getChunkProvider();
if(dimensionBlacklist.contains(world.provider.dimensionId)) {
return false;
}
else if(chunkProvider instanceof ChunkProviderHell) {
return false;
}
else if(chunkProvider instanceof ChunkProviderEnd) {
return false;
}
return true;
}
@Override
public boolean equals(Object o) {
if(o instanceof BRSimpleOreGenerator) {
BRSimpleOreGenerator other = (BRSimpleOreGenerator)o;
if(this.blockToGenerate != null) {
return this.blockToGenerate == other.blockToGenerate && this.blockToGenerateMetadata == other.blockToGenerateMetadata;
}
else if(other.blockToGenerate != null) {
return false;
}
else {
return false;
}
}
else {
return false;
}
}
}