package mcjty.rftools.dimension.world.mapgen; import mcjty.lib.varia.BlockMeta; import mcjty.rftools.dimension.world.GenericChunkProvider; import net.minecraft.block.Block; import net.minecraft.world.World; import java.util.Random; public class MapGenOrbs { private final GenericChunkProvider provider; private final boolean large; private final int r; public MapGenOrbs(GenericChunkProvider provider, boolean large) { this.provider = provider; this.large = large; r = large ? 2 : 1; } public void generate(World world, int chunkX, int chunkZ, Block[] ablock, byte[] ameta) { BlockMeta[] blocks = large ? provider.dimensionInformation.getHugeSphereBlocks() : provider.dimensionInformation.getSphereBlocks(); for (int cx = -r ; cx <= r ; cx++) { for (int cz = -r ; cz <= r ; cz++) { Random random = new Random((world.getSeed() + (chunkX+cx)) * 113 + (chunkZ+cz) * 31 + 77); random.nextFloat(); if (random.nextFloat() < .05f) { int x = cx * 16 + random.nextInt(16); int y = 40 + random.nextInt(40); int z = cz * 16 + random.nextInt(16); int radius = random.nextInt(large ? 20 : 6) + (large ? 10 : 4); BlockMeta block = BlockMeta.STONE; if (blocks.length > 1) { block = blocks[random.nextInt(blocks.length)]; } else if (blocks.length == 1) { block = blocks[0]; } fillSphere(ablock, ameta, x, y, z, radius, block); } } } } private void fillSphere(Block[] ablock, byte[] ameta, int centerx, int centery, int centerz, int radius, BlockMeta blockMeta) { Block block = blockMeta.getBlock(); byte meta = blockMeta.getMeta(); double sqradius = radius * radius; for (int x = 0 ; x < 16 ; x++) { double dxdx = (x-centerx) * (x-centerx); for (int z = 0 ; z < 16 ; z++) { double dzdz = (z-centerz) * (z-centerz); int index = (x * 16 + z) * 256; for (int y = centery-radius ; y <= centery+radius ; y++) { double dydy = (y-centery) * (y-centery); double sqdist = dxdx + dydy + dzdz; if (sqdist <= sqradius) { ablock[index + y] = block; ameta[index + y] = meta; } } } } } }