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.init.Blocks; import net.minecraft.world.World; import java.util.Random; public class MapGenLiquidOrbs { private final GenericChunkProvider provider; private final boolean large; private final int r; public MapGenLiquidOrbs(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.getHugeLiquidSphereBlocks() : provider.dimensionInformation.getLiquidSphereBlocks(); Block[] fluids = large ? provider.dimensionInformation.getHugeLiquidSphereFluids() : provider.dimensionInformation.getLiquidSphereFluids(); for (int cx = -r ; cx <= r ; cx++) { for (int cz = -r ; cz <= r ; cz++) { Random random = new Random((world.getSeed() + (chunkX+cx)) * 37 + (chunkZ+cz) * 5 + 113); 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]; } Block fluid = Blocks.water; if (fluids.length > 1) { fluid = fluids[random.nextInt(fluids.length)]; } else if (fluids.length == 1) { fluid = fluids[0]; } fillSphere(ablock, ameta, x, y, z, radius, block, fluid); } } } } private void fillSphere(Block[] ablock, byte[] ameta, int centerx, int centery, int centerz, int radius, BlockMeta blockMeta, Block fluid) { Block block = blockMeta.getBlock(); byte meta = blockMeta.getMeta(); double sqradius = radius * radius; double liquidradius = (((double) radius) - 1.5f) * (((double) radius) - 1.5f); 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 < liquidradius) { ablock[index + y] = fluid; ameta[index + y] = 0; } else if (sqdist <= sqradius) { ablock[index + y] = block; ameta[index + y] = meta; } } } } } }