package cofh.lib.world.feature; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; public class FeatureGenCave extends FeatureBase { final WorldGenerator worldGen; final int count; final boolean ceiling; public FeatureGenCave(String name, WorldGenerator worldGen, boolean ceiling, int count, GenRestriction biomeRes, boolean regen, GenRestriction dimRes) { super(name, biomeRes, regen, dimRes); this.worldGen = worldGen; this.count = count; this.ceiling = ceiling; } @Override protected boolean generateFeature(Random random, int chunkX, int chunkZ, World world) { int averageSeaLevel = world.provider.getAverageGroundLevel() + 1; int blockX = chunkX * 16; int blockZ = chunkZ * 16; boolean generated = false; for (int i = 0; i < count; i++) { int x = blockX + random.nextInt(16); int z = blockZ + random.nextInt(16); if (!canGenerateInBiome(world, x, z, random)) continue; int seaLevel = averageSeaLevel; if (seaLevel < 20) { seaLevel = world.getHeightValue(x, z); } int stopY = random.nextInt(1 + seaLevel / 2); int y = stopY; Block block; do { block = world.getBlock(x, y, z); } while (!block.isAir(world, x, y, z) && ++y < seaLevel); if (y == seaLevel) { y = 0; do { block = world.getBlock(x, y, z); } while (!block.isAir(world, x, y, z) && ++y < stopY); if (y == stopY) continue; } if (ceiling) { if (y < stopY) seaLevel = stopY + 1; do { ++y; block = world.getBlock(x, y, z); } while (y < seaLevel && block.isAir(world, x, y, z)); if (y == seaLevel) continue; --y; } else if (block.isAir(world, x, y - 1, z)) { --y; do { block = world.getBlock(x, y, z); } while (block.isAir(world, x, y, z) && y --> 0); if (y == -1) continue; ++y; } generated |= worldGen.generate(world, random, x, y, z); } return generated; } }