package fr.maxlego08.generation.popular; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.bukkit.Chunk; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.generator.BlockPopulator; import fr.maxlego08.generation.utils.Position; public class CavePopulor extends BlockPopulator { private void generateCave(World world, Random random, Chunk chunk, int x, int y, int z){ List positions = new ArrayList(); int r = random.nextInt(120) + 50; for(int a = 0; a != r; a++){ int r2 = random.nextInt(5); int r3 = random.nextInt(20); if (r2 == 0){ if (r3 <= 2) x--; if (r3 <= 6) x++; if (r3 <= 9) y--; if (r3 <= 12) y++; if (r3 <= 15) z--; if (r3 <= 20) z++; } if (r2 == 1){ if (r3 <= 2) y--; if (r3 <= 6) z++; if (r3 <= 9) x--; if (r3 <= 12) y++; if (r3 <= 15) x--; if (r3 <= 20) z++; } if (r2 == 2){ if (r3 <= 2) y--; if (r3 <= 6) z++; if (r3 <= 9) z--; if (r3 <= 12) y++; if (r3 <= 15) x--; if (r3 <= 20) x++; } if (r2 == 3){ if (r3 <= 2) x--; if (r3 <= 6) x++; if (r3 <= 9) z--; if (r3 <= 12) z++; if (r3 <= 15) y--; if (r3 <= 20) y++; } if (r2 >= 4){ if (r3 <= 2) y--; if (r3 <= 6) z++; if (r3 <= 9) y--; if (r3 <= 12) y++; if (r3 <= 15) y--; if (r3 <= 20) x++; } positions.add(new Position(x, y, z)); } positions.forEach(position -> { getPostions(world, random, chunk, position.getPosX(), position.getPosY(), position.getPosZ()).forEach(localPostion -> { Block block = world.getBlockAt(localPostion.getPosX(), localPostion.getPosY(), localPostion.getPosZ()); if (!block.isEmpty() && !block.isLiquid() && !block.getType().equals(Material.BEDROCK)){ block.setType(Material.AIR); } }); }); } @SuppressWarnings("deprecation") private List getPostions(World world, Random random, Chunk chunk, int x, int y, int z){ List positions = new ArrayList(); int a = 0; int b = random.nextInt(200) + 20; while(a <= b){ int k = random.nextInt(50); if (k == 0) y++; else if (k == 5) y++; else if (random.nextBoolean()){ if (random.nextBoolean()) x++; else z++; }else if (random.nextBoolean()) x--; else z--; if (world.getBlockTypeIdAt(x, y, z) != 0){ int c = 1 + random.nextInt(3); int d = c * c + 1; for(int x2 = -c; x2 <= c; x2++){ for(int y2 = -c; y2 <= c; y2++){ for(int z2 = -c; z2 <= c; z2++){ if (world.getBlockTypeIdAt(x2, y2, z2) != 0) a++; else{ positions.add(new Position(x + x2, y + y2, z + z2)); } } } } }else a++; } return positions; } public void populate(World world, Random random, Chunk chunk) { int a = random.nextInt(5000); int b = random.nextInt(5000); if (a > b){ int x = 4 + random.nextInt(8) + chunk.getX() * 16; int z = 4 + random.nextInt(8) + chunk.getX() * 16; int y = world.getHighestBlockYAt(x, z); if (y <= 16) y = 32; int newY = random.nextInt(y); generateCave(world, random, chunk, x, newY, z); } } }