| package mods.emotion.dimension; |
| |
| import java.util.List; |
| import java.util.Random; |
| |
| import net.minecraft.block.Block; |
| import net.minecraft.block.BlockSand; |
| import net.minecraft.block.state.IBlockState; |
| import net.minecraft.entity.EnumCreatureType; |
| import net.minecraft.init.Blocks; |
| import net.minecraft.util.BlockPos; |
| import net.minecraft.util.IProgressUpdate; |
| import net.minecraft.world.SpawnerAnimals; |
| import net.minecraft.world.World; |
| import net.minecraft.world.biome.BiomeGenBase; |
| import net.minecraft.world.chunk.Chunk; |
| import net.minecraft.world.chunk.IChunkProvider; |
| import net.minecraft.world.gen.NoiseGeneratorOctaves; |
| import net.minecraft.world.gen.feature.WorldGenBigTree; |
| import net.minecraft.world.gen.feature.WorldGenLakes; |
| import net.minecraft.world.gen.feature.WorldGenTrees; |
| |
| public class SkyChunkProvider implements IChunkProvider |
| { |
| private Random rand; |
| |
| private NoiseGeneratorOctaves noiseGen1; |
| private NoiseGeneratorOctaves noiseGen2; |
| private NoiseGeneratorOctaves noiseGen3; |
| private NoiseGeneratorOctaves noiseGen4; |
| public NoiseGeneratorOctaves noiseGen5; |
| public NoiseGeneratorOctaves noiseGen6; |
| private NoiseGeneratorOctaves noiseGen7; |
| public NoiseGeneratorOctaves mobSpawnerNoise; |
| private World worldObj; |
| private double[] noiseArray; |
| |
| private double[] bNoise1; |
| private double[] bNoise2; |
| private double[] bNoise3; |
| private BiomeGenBase[] biomesForGeneration; |
| double[] noise1; |
| double[] noise2; |
| double[] noise3; |
| double[] noise4; |
| double[] noise5; |
| int[][] field_914_i = new int[32][32]; |
| private double[] generatedTemperatures; |
| |
| public Block topBlock; |
| public Block fillerBlock; |
| |
| public SkyChunkProvider(World world, long seed) |
| { |
| this.bNoise1 = new double[256]; |
| this.bNoise2 = new double[256]; |
| this.bNoise3 = new double[256]; |
| this.worldObj = world; |
| this.rand = new Random(seed); |
| this.noiseGen1 = new NoiseGeneratorOctaves(this.rand, 16); |
| this.noiseGen2 = new NoiseGeneratorOctaves(this.rand, 16); |
| this.noiseGen3 = new NoiseGeneratorOctaves(this.rand, 32); |
| this.noiseGen4 = new NoiseGeneratorOctaves(this.rand, 64); |
| this.noiseGen5 = new NoiseGeneratorOctaves(this.rand, 4); |
| this.noiseGen6 = new NoiseGeneratorOctaves(this.rand, 10); |
| this.noiseGen7 = new NoiseGeneratorOctaves(this.rand, 16); |
| this.mobSpawnerNoise = new NoiseGeneratorOctaves(this.rand, 8); |
| } |
| |
| public void generateTerrain(int i, int j, IBlockState[] ablock, BiomeGenBase[] abiomes) |
| { |
| byte byte0 = 2; |
| int k = byte0 + 1; |
| byte byte1 = 33; |
| int l = byte0 + 1; |
| this.noiseArray = initializeNoiseField(this.noiseArray, i * byte0, 0, j * byte0, k, byte1, l); |
| |
| for(int i1 = 0; i1 < byte0; i1++) |
| { |
| for(int j1 = 0; j1 < byte0; j1++) |
| { |
| for(int k1 = 0; k1 < 32; k1++) |
| { |
| double d = 0.25D; |
| double d1 = this.noiseArray[(((i1 + 0) * l + j1 + 0) * byte1 + k1 + 0)]; |
| double d2 = this.noiseArray[(((i1 + 0) * l + j1 + 1) * byte1 + k1 + 0)]; |
| double d3 = this.noiseArray[(((i1 + 1) * l + j1 + 0) * byte1 + k1 + 0)]; |
| double d4 = this.noiseArray[(((i1 + 1) * l + j1 + 1) * byte1 + k1 + 0)]; |
| double d5 = (this.noiseArray[(((i1 + 0) * l + j1 + 0) * byte1 + k1 + 1)] - d1) * d; |
| double d6 = (this.noiseArray[(((i1 + 0) * l + j1 + 1) * byte1 + k1 + 1)] - d2) * d; |
| double d7 = (this.noiseArray[(((i1 + 1) * l + j1 + 0) * byte1 + k1 + 1)] - d3) * d; |
| double d8 = (this.noiseArray[(((i1 + 1) * l + j1 + 1) * byte1 + k1 + 1)] - d4) * d; |
| for(int l1 = 0; l1 < 4; l1++) |
| { |
| double d9 = 0.125D; |
| double d10 = d1; |
| double d11 = d2; |
| double d12 = (d3 - d1) * d9; |
| double d13 = (d4 - d2) * d9; |
| for(int i2 = 0; i2 < 8; i2++) |
| { |
| int j2 = i2 + i1 * 8 << 11 | 0 + j1 * 8 << 7 | k1 * 4 + l1; |
| char c = ''; |
| double d14 = 0.125D; |
| double d15 = d10; |
| double d16 = (d11 - d10) * d14; |
| for(int k2 = 0; k2 < 8; k2++) |
| { |
| IBlockState l2 = Blocks.air.getDefaultState(); |
| if(d15 > 0.0D) |
| { |
| l2 = Blocks.stone.getDefaultState(); |
| } |
| ablock[j2] = l2; |
| j2 += c; |
| d15 += d16; |
| } |
| |
| d10 += d12; |
| d11 += d13; |
| } |
| |
| d1 += d5; |
| d2 += d6; |
| d3 += d7; |
| d4 += d8; |
| } |
| } |
| } |
| } |
| } |
| |
| private double[] initializeNoiseField(double[] ad, int i, int j, int k, int l, int i1, int j1) |
| { |
| if(ad == null) |
| { |
| ad = new double[l * i1 * j1]; |
| } |
| double d = 684.41200000000003D; |
| double d1 = 684.41200000000003D; |
| |
| this.noise4 = this.noiseGen6.generateNoiseOctaves(this.noise4, i, k, l, j1, 1.121D, 1.121D, 0.5D); |
| this.noise5 = this.noiseGen7.generateNoiseOctaves(this.noise5, i, k, l, j1, 200.0D, 200.0D, 0.5D); |
| d *= 2.0D; |
| this.noise3 = this.noiseGen3.generateNoiseOctaves(this.noise3, i, j, k, l, i1, j1, d / 80.0D, d1 / 160.0D, d / 80.0D); |
| this.noise1 = this.noiseGen1.generateNoiseOctaves(this.noise1, i, j, k, l, i1, j1, d, d1, d); |
| this.noise2 = this.noiseGen2.generateNoiseOctaves(this.noise2, i, j, k, l, i1, j1, d, d1, d); |
| int k1 = 0; |
| int l1 = 0; |
| for(int j2 = 0; j2 < l; j2++) |
| { |
| for(int l2 = 0; l2 < j1; l2++) |
| { |
| double d4 = 1.0D; |
| d4 *= d4; |
| d4 *= d4; |
| d4 = 1.0D - d4; |
| double d5 = (this.noise4[l1] + 256.0D) / 512.0D; |
| d5 *= d4; |
| if(d5 > 1.0D) |
| { |
| d5 = 1.0D; |
| } |
| double d6 = this.noise5[l1] / 8000.0D; |
| if(d6 < 0.0D) |
| { |
| d6 = -d6 * 0.3D; |
| } |
| d6 = d6 * 3.0D - 2.0D; |
| if(d6 > 1.0D) |
| { |
| d6 = 1.0D; |
| } |
| d6 /= 8.0D; |
| d6 = 0.0D; |
| if(d5 < 0.0D) |
| { |
| d5 = 0.0D; |
| } |
| d5 += 0.5D; |
| d6 = d6 * i1 / 16.0D; |
| l1++; |
| double d7 = i1 / 2.0D; |
| for(int j3 = 0; j3 < i1; j3++) |
| { |
| double d8 = 0.0D; |
| double d9 = (j3 - d7) * 8.0D / d5; |
| if(d9 < 0.0D) |
| { |
| d9 *= -1.0D; |
| } |
| double d10 = this.noise1[k1] / 512.0D; |
| double d11 = this.noise2[k1] / 512.0D; |
| double d12 = (this.noise3[k1] / 10.0D + 1.0D) / 2.0D; |
| if(d12 < 0.0D) |
| { |
| d8 = d10; |
| } |
| else if(d12 > 1.0D) |
| { |
| d8 = d11; |
| } |
| else |
| { |
| d8 = d10 + (d11 - d10) * d12; |
| } |
| d8 -= 8.0D; |
| int k3 = 32; |
| if(j3 > i1 - k3) |
| { |
| double d13 = (j3 - (i1 - k3)) / (k3 - 1.0F); |
| d8 = d8 * (1.0D - d13) + -30.0D * d13; |
| } |
| k3 = 8; |
| if(j3 < k3) |
| { |
| double d14 = (k3 - j3) / (k3 - 1.0F); |
| d8 = d8 * (1.0D - d14) + -30.0D * d14; |
| } |
| ad[k1] = d8; |
| k1++; |
| } |
| } |
| } |
| return ad; |
| } |
| |
| public void replaceBlockForBiome(int i, int j, IBlockState[] block, BiomeGenBase[] abiome) |
| { |
| double d = 0.03125D; |
| this.bNoise1 = this.noiseGen4.generateNoiseOctaves(this.bNoise1, i * 16, j * 16, 0, 16, 16, 1, d, d, 1.0D); |
| this.bNoise2 = this.noiseGen4.generateNoiseOctaves(this.bNoise2, i * 16, 109, j * 16, 16, 1, 16, d, 1.0D, d); |
| this.bNoise3 = this.noiseGen5.generateNoiseOctaves(this.bNoise3, i * 16, j * 16, 0, 16, 16, 1, d * 2.0D, d * 2.0D, d * 2.0D); |
| for(int k = 0; k < 16; k++) |
| { |
| for(int l = 0; l < 16; l++) |
| { |
| int i1 = (int)(this.bNoise3[(k + l * 16)] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D); |
| |
| int j1 = -1; |
| this.topBlock = Blocks.grass; |
| this.fillerBlock = Blocks.dirt; |
| IBlockState block1 = this.topBlock.getDefaultState(); |
| IBlockState block2 = this.fillerBlock.getDefaultState(); |
| IBlockState stone = Blocks.stone.getDefaultState(); |
| |
| if(block1 == Blocks.air.getDefaultState()) |
| { |
| block1 = Blocks.grass.getDefaultState(); |
| } |
| if(block2 == Blocks.air.getDefaultState()) |
| { |
| block2 = Blocks.dirt.getDefaultState(); |
| } |
| if(stone == Blocks.air.getDefaultState()) |
| { |
| stone = Blocks.stone.getDefaultState(); |
| } |
| for(int k1 = 127; k1 >= 0; k1–) |
| { |
| int l1 = (l * 16 + k) * 128 + k1; |
| IBlockState block3 = block[l1]; |
| if(block3 == Blocks.air.getDefaultState()) |
| { |
| j1 = -1; |
| } |
| else if(block3 == stone) |
| { |
| |
| if(j1 == -1) |
| { |
| |
| if(i1 <= 0) |
| { |
| block1 = Blocks.air.getDefaultState(); |
| block2 = stone; |
| } |
| j1 = i1; |
| if(k1 >= 0) |
| { |
| block[l1] = block1; |
| } |
| else |
| { |
| block[l1] = block2; |
| } |
| |
| } |
| else if(j1 > 0) |
| { |
| j1–; |
| block[l1] = block2; |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| public List getPossibleCreatures(EnumCreatureType enumcreaturetype, int x, int y, int z) |
| { |
| BiomeGenBase var5 = this.worldObj.getBiomeGenForCoords(new BlockPos(x, y, z)); |
| return var5 == null ? null : var5.getSpawnableList(enumcreaturetype); |
| } |
| |
| @Override |
| public boolean chunkExists(int x, int z) |
| { |
| return true; |
| } |
| |
| @Override |
| public Chunk provideChunk(BlockPos blockPosIn) |
| { |
| return this.provideChunk(blockPosIn.getX() >> 4, blockPosIn.getZ() >> 4); |
| } |
| |
| @Override |
| public Chunk provideChunk(int x, int z) |
| { |
| this.rand.setSeed(x * 391279128714L + z * 132894987741L); |
| IBlockState[] ablock = new IBlockState[32768]; |
| this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, x * 16, z * 16, 16, 16); |
| this.generateTerrain(x, z, ablock, this.biomesForGeneration); |
| this.replaceBlockForBiome(x, z, ablock, this.biomesForGeneration); |
| Chunk chunk = new Chunk(this.worldObj, x, z); |
| byte[] abyte = chunk.getBiomeArray(); |
| |
| for(int k = 0; k < abyte.length; k++) |
| { |
| abyte[k] = ((byte)this.biomesForGeneration[k].biomeID); |
| } |
| |
| chunk.generateSkylightMap(); |
| return chunk; |
| } |
| |
| @Override |
| public void populate(IChunkProvider iChunkProvider, int i, int j) |
| { |
| BlockSand.fallInstantly = true; |
| |
| int var4 = i * 16; |
| int var5 = j * 16; |
| BiomeGenBase var6 = this.worldObj.getWorldChunkManager().getBiomeGenerator(new BlockPos(var4 + 16, 0, var5 + 16)); |
| this.rand.setSeed(this.worldObj.getSeed()); |
| |
| if(this.rand.nextInt(4) == 0) |
| { |
| int var13 = var4 + this.rand.nextInt(16) + 8; |
| int var14 = this.rand.nextInt(256); |
| int var15 = var5 + this.rand.nextInt(16) + 8; |
| new WorldGenLakes(Blocks.water).generate(this.worldObj, this.rand, new BlockPos(var13, var14, var15)); |
| } |
| |
| Random rand = new Random(); |
| int randomNum = rand.nextInt(6) + 1; |
| if(randomNum == 2) |
| { |
| WorldGenTrees var17 = new WorldGenTrees(true); |
| |
| for(int var18 = 0; var18 < 5; var18++) |
| { |
| int var19 = var4 + this.rand.nextInt(16); |
| int var20 = var5 + this.rand.nextInt(16); |
| int var21 = this.worldObj.getHeight(); |
| var17.generate(this.worldObj, this.rand, new BlockPos(var19, var21, var20)); |
| } |
| |
| SpawnerAnimals.performWorldGenSpawning(this.worldObj, var6, var4 + 8, var5 + 8, 16, 16, this.rand); |
| |
| for(int var21 = var4 + 8; var21 < var4 + 8 + 16; var21++) |
| { |
| for(int var20 = var5 + 8; var20 < var5 + 8 + 16; var20++) |
| { |
| int var10000 = var21 - (var4 + 8); |
| var10000 = var20 - (var5 + 8); |
| } |
| } |
| } |
| else if(randomNum == 3) |
| { |
| WorldGenTrees var17 = new WorldGenTrees(false); |
| |
| for(int var18 = 0; var18 < 5; var18++) |
| { |
| int var19 = var4 + this.rand.nextInt(16); |
| int var20 = var5 + this.rand.nextInt(16); |
| int var21 = this.worldObj.getHeight(); |
| var17.generate(this.worldObj, this.rand, new BlockPos(var19, var21, var20)); |
| } |
| |
| SpawnerAnimals.performWorldGenSpawning(this.worldObj, var6, var4 + 8, var5 + 8, 16, 16, this.rand); |
| |
| for(int var21 = var4 + 8; var21 < var4 + 8 + 16; var21++) |
| { |
| for(int var20 = var5 + 8; var20 < var5 + 8 + 16; var20++) |
| { |
| int var10000 = var21 - (var4 + 8); |
| var10000 = var20 - (var5 + 8); |
| } |
| |
| } |
| |
| } |
| else if(randomNum == 4) |
| { |
| WorldGenBigTree var17 = new WorldGenBigTree(true); |
| |
| for(int var18 = 0; var18 < 5; var18++) |
| { |
| int var19 = var4 + this.rand.nextInt(16); |
| int var20 = var5 + this.rand.nextInt(16); |
| int var21 = this.worldObj.getHeight(); |
| var17.generate(this.worldObj, this.rand, new BlockPos(var19, var21, var20)); |
| } |
| |
| SpawnerAnimals.performWorldGenSpawning(this.worldObj, var6, var4 + 8, var5 + 8, 16, 16, this.rand); |
| |
| for(int var21 = var4 + 8; var21 < var4 + 8 + 16; var21++) |
| { |
| for(int var20 = var5 + 8; var20 < var5 + 8 + 16; var20++) |
| { |
| int var10000 = var21 - (var4 + 8); |
| var10000 = var20 - (var5 + 8); |
| } |
| } |
| } |
| BlockSand.fallInstantly = false; |
| } |
| |
| @Override |
| public boolean func_177460_a(IChunkProvider p_177460_1_, Chunk p_177460_2_, int p_177460_3_, int p_177460_4_) |
| { |
| return false; |
| } |
| |
| @Override |
| public boolean saveChunks(boolean p_73151_1_, IProgressUpdate p_73151_2_) |
| { |
| return true; |
| } |
| |
| @Override |
| public boolean unloadQueuedChunks() |
| { |
| return false; |
| } |
| |
| @Override |
| public boolean canSave() |
| { |
| return true; |
| } |
| |
| @Override |
| public String makeString() |
| { |
| return "RandomLevelSource"; |
| } |
| |
| @Override |
| public List func_177458_a(EnumCreatureType enumCreatureType, BlockPos pos) |
| { |
| BiomeGenDream biomegenbase = (BiomeGenDream)this.worldObj.getBiomeGenForCoords(pos); |
| return biomegenbase.getSpawnableList(enumCreatureType); |
| } |
| |
| @Override |
| public BlockPos getStrongholdGen(World worldIn, String p_180513_2_, BlockPos p_180513_3_) |
| { |
| return null; |
| } |
| |
| @Override |
| public int getLoadedChunkCount() |
| { |
| return 0; |
| } |
| |
| @Override |
| public void recreateStructures(Chunk p_180514_1_, int p_180514_2_, int p_180514_3_) |
| {} |
| |
| @Override |
| public void saveExtraData() |
| {} |
| } |