package cofh.lib.world.feature; import java.util.Random; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; public class FeatureGenLargeVein extends FeatureBase { final WorldGenerator worldGen; final int count; final int minY; private int veinHeight, veinDiameter; private int verticalDensity; private int horizontalDensity; public FeatureGenLargeVein(String name, WorldGenerator worldGen, int count, int minY, GenRestriction biomeRes, boolean regen, GenRestriction dimRes, int height, int diameter, int vDensity, int hDensity) { super(name, biomeRes, regen, dimRes); this.worldGen = worldGen; this.count = count; this.minY = minY; this.veinHeight = height; this.veinDiameter = diameter; this.verticalDensity = vDensity; this.horizontalDensity = hDensity; } public int getDensity(Random rand, int oreDistance, float oreDensity) { oreDensity = (oreDensity * 0.01f * (oreDistance >> 1)) + 1f; int i = (int)oreDensity; int rnd = oreDistance / i; int r = 0; for (; i > 0; --i) { r += rand.nextInt(rnd); } return r; } @Override public boolean generateFeature(Random random, int chunkX, int chunkZ, World world) { int blockX = chunkX * 16; int blockY = minY; int blockZ = chunkZ * 16; Random dRand = new Random(world.getSeed()); long l = (dRand.nextLong() / 2L) * 2L + 1L; long l1 = (dRand.nextLong() / 2L) * 2L + 1L; dRand.setSeed(chunkX * l + chunkZ * l1 ^ world.getSeed()); boolean generated = false; for (int i = count; i --> 0; ) { int x = blockX + getDensity(dRand, veinDiameter, horizontalDensity); int y = blockY + getDensity(dRand, veinHeight, verticalDensity); int z = blockZ + getDensity(dRand, veinDiameter, horizontalDensity); if (!canGenerateInBiome(world, x, z, random)) continue; generated |= worldGen.generate(world, random, x, y, z); } return generated; } }