package net.glowstone.generator.ground;
import net.glowstone.constants.GlowBiomeClimate;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator.ChunkData;
import org.bukkit.material.MaterialData;
import java.util.Random;
public class GroundGenerator {
protected static final MaterialData AIR = new MaterialData(Material.AIR);
protected static final MaterialData STONE = new MaterialData(Material.STONE);
protected static final MaterialData SANDSTONE = new MaterialData(Material.SANDSTONE);
protected static final MaterialData GRASS = new MaterialData(Material.GRASS);
protected static final MaterialData DIRT = new MaterialData(Material.DIRT);
protected static final MaterialData COARSE_DIRT = new MaterialData(Material.DIRT, (byte) 1);
protected static final MaterialData PODZOL = new MaterialData(Material.DIRT, (byte) 2);
protected static final MaterialData GRAVEL = new MaterialData(Material.GRAVEL);
protected static final MaterialData MYCEL = new MaterialData(Material.MYCEL);
protected static final MaterialData SAND = new MaterialData(Material.SAND);
protected static final MaterialData SNOW = new MaterialData(Material.SNOW_BLOCK);
private MaterialData topMaterial;
private MaterialData groundMaterial;
public GroundGenerator() {
setTopMaterial(GRASS);
setGroundMaterial(DIRT);
}
public void generateTerrainColumn(ChunkData chunkData, World world, Random random, int x, int z, Biome biome, double surfaceNoise) {
int seaLevel = world.getSeaLevel();
MaterialData topMat = topMaterial;
MaterialData groundMat = groundMaterial;
int chunkX = x;
int chunkZ = z;
x &= 0xF;
z &= 0xF;
int surfaceHeight = Math.max((int) (surfaceNoise / 3.0D + 3.0D + random.nextDouble() * 0.25D), 1);
int deep = -1;
for (int y = 255; y >= 0; y--) {
if (y <= random.nextInt(5)) {
chunkData.setBlock(x, y, z, Material.BEDROCK);
} else {
Material mat = chunkData.getType(x, y, z);
if (mat == Material.AIR) {
deep = -1;
} else if (mat == Material.STONE) {
if (deep == -1) {
if (y >= seaLevel - 5 && y <= seaLevel) {
topMat = topMaterial;
groundMat = groundMaterial;
}
deep = surfaceHeight;
if (y >= seaLevel - 2) {
chunkData.setBlock(x, y, z, topMat);
} else if (y < seaLevel - 8 - surfaceHeight) {
topMat = AIR;
groundMat = STONE;
chunkData.setBlock(x, y, z, Material.GRAVEL);
} else {
chunkData.setBlock(x, y, z, groundMat);
}
} else if (deep > 0) {
deep--;
chunkData.setBlock(x, y, z, groundMat);
if (deep == 0 && groundMat.getItemType() == Material.SAND) {
deep = random.nextInt(4) + Math.max(0, y - seaLevel - 1);
groundMat = SANDSTONE;
}
}
} else if (mat == Material.STATIONARY_WATER && y == seaLevel - 2 &&
GlowBiomeClimate.isCold(biome, chunkX, y, chunkZ)) {
chunkData.setBlock(x, y, z, Material.ICE);
}
}
}
}
protected final void setTopMaterial(MaterialData topMaterial) {
this.topMaterial = topMaterial;
}
protected final void setGroundMaterial(MaterialData groundMaterial) {
this.groundMaterial = groundMaterial;
}
}