package micdoodle8.mods.galacticraft.core.world.gen; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.pattern.BlockHelper; import net.minecraft.util.BlockPos; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenMinable; import java.util.Random; public class WorldGenMinableMeta extends WorldGenMinable { private final Block minableBlockId; private final int numberOfBlocks; private final int metadata; private boolean usingMetadata = false; private final Block fillerID; private final int fillerMetadata; public WorldGenMinableMeta(Block placeBlock, int blockCount, int placeMeta, boolean metaActive, Block replaceBlock, int replaceMeta) { super(placeBlock.getStateFromMeta(placeMeta), blockCount, BlockHelper.forBlock(replaceBlock)); this.minableBlockId = placeBlock; this.numberOfBlocks = blockCount; this.metadata = placeMeta; this.usingMetadata = metaActive; this.fillerID = replaceBlock; this.fillerMetadata = replaceMeta; } @Override public boolean generate(World worldIn, Random rand, BlockPos position) { float f = rand.nextFloat() * (float) Math.PI; float sinFvalue = MathHelper.sin(f) * (float) this.numberOfBlocks / 8.0F; float cosFvalue = MathHelper.cos(f) * (float) this.numberOfBlocks / 8.0F; float chunkCentreX = (float) (position.getX() + 8); float chunkCentreZ = (float) (position.getZ() + 8); double clumpXa = (double) (chunkCentreX + sinFvalue); double clumpXb = (double) (chunkCentreX - sinFvalue) - clumpXa; double clumpZa = (double) (chunkCentreZ + cosFvalue); double clumpZb = (double) (chunkCentreZ - cosFvalue) - clumpZa; double clumpYa = (double) (position.getY() + rand.nextInt(3) - 2); double clumpYb = (double) (position.getY() + rand.nextInt(3) - 2) - clumpYa; final IBlockState oreState = this.minableBlockId.getStateFromMeta(this.usingMetadata ? this.metadata : 0); for (int i = 0; i < this.numberOfBlocks; ++i) { float f1 = (float) i / (float) this.numberOfBlocks; double centreX = clumpXa + clumpXb * (double) f1; double centreY = clumpYa + clumpYb * (double) f1; double centreZ = clumpZa + clumpZb * (double) f1; double size = rand.nextDouble() * (double) this.numberOfBlocks / 16.0D; double sizeXZ = ((double) (MathHelper.sin((float) Math.PI * f1) + 1.0F) * size + 1.0D) / 2.0D; double sizeY = sizeXZ; int xmin = MathHelper.floor_double(centreX - sizeXZ); int xmax = MathHelper.floor_double(centreX + sizeXZ); int ymin = MathHelper.floor_double(centreY - sizeY); int ymax = MathHelper.floor_double(centreY + sizeY); int zmin = MathHelper.floor_double(centreZ - sizeXZ); int zmax = MathHelper.floor_double(centreZ + sizeXZ); centreX -= 0.5D; centreY -= 0.5D; centreZ -= 0.5D; for (int x = xmin; x <= xmax; ++x) { double dx = ((double) x - centreX) / sizeXZ; if (dx * dx < 1.0D) { for (int y = ymin; y <= ymax; ++y) { double dy = ((double) y - centreY) / sizeY; double xySquared = dx * dx + dy * dy; if (xySquared < 1.0D) { for (int z = zmin; z <= zmax; ++z) { double dz = ((double) z - centreZ) / sizeXZ; if (xySquared + dz * dz < 1.0D) { BlockPos blockpos = new BlockPos(x, y, z); IBlockState state = worldIn.getBlockState(blockpos); if (state.getBlock() == this.fillerID && state.getBlock().getMetaFromState(state) == this.fillerMetadata) { worldIn.setBlockState(blockpos, oreState, 2); } } } } } } } } return true; } }