package cofh.lib.world;
import static cofh.lib.world.WorldGenMinableCluster.*;
import cofh.lib.util.WeightedRandomBlock;
import java.util.List;
import java.util.Random;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;
public class WorldGenBoulder extends WorldGenerator
{
private final List<WeightedRandomBlock> cluster;
private final WeightedRandomBlock[] genBlock;
private final int size;
public int sizeVariance = 2;
public int clusters = 3;
public int clusterVariance = 0;
public boolean hollow = false;
public float hollowAmt = 0.1665f;
public float hollowVar = 0;
public WorldGenBoulder(List<WeightedRandomBlock> resource, int minSize, List<WeightedRandomBlock> block) {
cluster = resource;
size = minSize;
genBlock = block.toArray(new WeightedRandomBlock[block.size()]);
}
@Override
public boolean generate(World world, Random rand, int xCenter, int yCenter, int zCenter) {
final int minSize = size, var = sizeVariance;
boolean r = false;
int i = clusterVariance > 0 ? clusters + rand.nextInt(clusterVariance + 1) : clusters;
while (i --> 0) {
while (yCenter > minSize && world.isAirBlock(xCenter, yCenter - 1, zCenter)) {
--yCenter;
}
if (yCenter <= (minSize + var + 1)) {
return false;
}
if (canGenerateInBlock(world, xCenter, yCenter - 1, zCenter, genBlock)) {
int xWidth = minSize + (var > 1 ? rand.nextInt(var) : 0);
int yWidth = minSize + (var > 1 ? rand.nextInt(var) : 0);
int zWidth = minSize + (var > 1 ? rand.nextInt(var) : 0);
float maxDist = (xWidth + yWidth + zWidth) * 0.333F + 0.5F;
maxDist *= maxDist;
float minDist = hollow ? (xWidth + yWidth + zWidth) * (hollowAmt * (1 - rand.nextFloat() * hollowVar)) : 0;
minDist *= minDist;
for (int x = -xWidth; x <= xWidth; ++x) {
final int xDist = x * x;
for (int z = -zWidth; z <= zWidth; ++z) {
final int xzDist = xDist + z * z;
for (int y = -yWidth; y <= yWidth; ++y) {
final int dist = xzDist + y * y;
if (dist <= maxDist) {
if (dist >= minDist)
r |= generateBlock(world, xCenter + x, yCenter + y, zCenter + z, cluster);
else
r |= world.setBlockToAir(xCenter + x, yCenter + y, zCenter + z);
}
}
}
}
}
xCenter += rand.nextInt(var + minSize * 2) - (minSize + var/2);
zCenter += rand.nextInt(var + minSize * 2) - (minSize + var/2);
yCenter += rand.nextInt((var+1) * 3) - (var+1);
}
return r;
}
}