package rtg.world.gen.surface; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.ChunkPrimer; import rtg.api.util.noise.OpenSimplexNoise; import rtg.api.world.RTGWorld; import rtg.api.config.BiomeConfig; import rtg.util.CanyonColour; import rtg.api.util.CliffCalculator; public class SurfaceMesa extends SurfaceBase { private int[] claycolor = new int[100]; public SurfaceMesa(BiomeConfig config, Block top, byte topByte, Block fill, byte fillByte) { super(config, top, fill); int[] c = new int[]{1, 8, 0}; OpenSimplexNoise simplex = new OpenSimplexNoise(2L); float n; for (int i = 0; i < 100; i++) { n = simplex.noise1(i / 3f) * 3f + simplex.noise1(i / 1f) * 0.3f + 1.5f; n = n >= 3f ? 2.9f : n < 0f ? 0f : n; claycolor[i] = c[(int) n]; } } public byte getClayColorForHeight(int k) { k -= 60; k = k < 0 ? 0 : k > 99 ? 99 : k; return (byte) claycolor[k]; } @Override public void paintTerrain(ChunkPrimer primer, int i, int j, int x, int z, int depth, RTGWorld rtgWorld, float[] noise, float river, Biome[] base) { Random rand = rtgWorld.rand; float c = CliffCalculator.calc(x, z, noise); boolean cliff = c > 1.3f ? true : false; for (int k = 255; k > -1; k--) { Block b = primer.getBlockState(x, k, z).getBlock(); if (b == Blocks.AIR) { depth = -1; } else if (b == Blocks.STONE) { depth++; if (depth > -1 && depth < 12) { if (cliff) { primer.setBlockState(x, k, z, CanyonColour.MESA.getBlockForHeight(i, k, j)); } else { if (depth > 4) { primer.setBlockState(x, k, z, CanyonColour.MESA.getBlockForHeight(i, k, j)); } else if (k > 77) { if (rand.nextInt(5) == 0) { primer.setBlockState(x, k, z, Blocks.DIRT.getDefaultState()); } else { if (depth == 0) { primer.setBlockState(x, k, z, topBlock); } else { primer.setBlockState(x, k, z, fillerBlock); } } } else if (k < 69) { primer.setBlockState(x, k, z, Blocks.DIRT.getDefaultState()); } else if (k < 78) { if (depth == 0) { if (k < 72 && rand.nextInt(k - 69 + 1) == 0) { primer.setBlockState(x, k, z, Blocks.DIRT.getDefaultState()); } else if (rand.nextInt(5) == 0) { primer.setBlockState(x, k, z, Blocks.DIRT.getDefaultState()); } else { primer.setBlockState(x, k, z, topBlock); } } else { primer.setBlockState(x, k, z, fillerBlock); } } else { if (depth == 0) { primer.setBlockState(x, k, z, topBlock); } else { primer.setBlockState(x, k, z, fillerBlock); } } } } else if (k > 63) { primer.setBlockState(x, k, z, CanyonColour.MESA.getBlockForHeight(i, k, j)); } } } } }