package net.glowstone.generator.populators; import org.bukkit.Chunk; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.generator.BlockPopulator; import java.util.Random; /** * BlockPopulator that generates giant mushrooms in tundra * and {@link Biome#TAIGA taiga}, a la Minecraft 1.8. */ public class MushroomPopulator extends BlockPopulator { @Override public void populate(World world, Random random, Chunk source) { if (random.nextInt(16) > 0) { return; } int rx = 2 + random.nextInt(12); int rz = 2 + random.nextInt(12); Block block = source.getBlock(rx, world.getHighestBlockYAt((source.getX() << 4) + rx, (source.getZ() << 4) + rz), rz); if (block.getBiome() != Biome.TAIGA) { return; } if (block.getRelative(BlockFace.DOWN).getType() != Material.GRASS && block.getRelative(BlockFace.DOWN).getType() != Material.DIRT) { return; } int size = 2 + random.nextInt(4); for (int i = 0; i <= size + 1; i++) { Block mushroom = block.getRelative(0, i, 0); mushroom.setTypeIdAndData(Material.LOG.getId(), (byte) 2, true); if (i >= size) { int diff = i - size; int diffNext = i - size + 1; for (int x = -size + diff; x <= size - diff; x++) { for (int z = -size + diff; z <= size - diff; z++) { if (x * x + z * z < (size - diff) * (size - diff) && (i > size || x * x + z * z + 1 > (size - diffNext) * (size - diffNext))) { mushroom.getRelative(x, 0, z).setType(Material.STONE); } } } } } } }