package net.minecraft.world.gen; import java.util.List; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockFalling; import net.minecraft.entity.EnumCreatureType; import net.minecraft.init.Blocks; import net.minecraft.util.BlockPos; import net.minecraft.util.IProgressUpdate; import net.minecraft.util.MathHelper; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.SpawnerAnimals; import net.minecraft.world.World; import net.minecraft.world.WorldType; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkPrimer; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.feature.WorldGenDungeons; import net.minecraft.world.gen.feature.WorldGenLakes; import net.minecraft.world.gen.structure.MapGenMineshaft; import net.minecraft.world.gen.structure.MapGenScatteredFeature; import net.minecraft.world.gen.structure.MapGenStronghold; import net.minecraft.world.gen.structure.MapGenVillage; import net.minecraft.world.gen.structure.StructureOceanMonument; public class ChunkProviderGenerate implements IChunkProvider { /** RNG. */ private Random rand; private NoiseGeneratorOctaves field_147431_j; private NoiseGeneratorOctaves field_147432_k; private NoiseGeneratorOctaves field_147429_l; private NoiseGeneratorPerlin field_147430_m; /** A NoiseGeneratorOctaves used in generating terrain */ public NoiseGeneratorOctaves noiseGen5; /** A NoiseGeneratorOctaves used in generating terrain */ public NoiseGeneratorOctaves noiseGen6; public NoiseGeneratorOctaves mobSpawnerNoise; /** Reference to the World object. */ private World worldObj; /** are map structures going to be generated (e.g. strongholds) */ private final boolean mapFeaturesEnabled; private WorldType field_177475_o; private final double[] field_147434_q; private final float[] parabolicField; private ChunkProviderSettings field_177477_r; private Block field_177476_s; private double[] stoneNoise; private MapGenBase caveGenerator; /** Holds Stronghold Generator */ private MapGenStronghold strongholdGenerator; /** Holds Village Generator */ private MapGenVillage villageGenerator; /** Holds Mineshaft Generator */ private MapGenMineshaft mineshaftGenerator; private MapGenScatteredFeature scatteredFeatureGenerator; /** Holds ravine generator */ private MapGenBase ravineGenerator; private StructureOceanMonument field_177474_A; /** The biomes that are used to generate the chunk */ private BiomeGenBase[] biomesForGeneration; double[] field_147427_d; double[] field_147428_e; double[] field_147425_f; double[] field_147426_g; private static final String __OBFID = "CL_00000396"; public ChunkProviderGenerate(World worldIn, long p_i45636_2_, boolean p_i45636_4_, String p_i45636_5_) { this.field_177476_s = Blocks.water; this.stoneNoise = new double[256]; this.caveGenerator = new MapGenCaves(); this.strongholdGenerator = new MapGenStronghold(); this.villageGenerator = new MapGenVillage(); this.mineshaftGenerator = new MapGenMineshaft(); this.scatteredFeatureGenerator = new MapGenScatteredFeature(); this.ravineGenerator = new MapGenRavine(); this.field_177474_A = new StructureOceanMonument(); this.worldObj = worldIn; this.mapFeaturesEnabled = p_i45636_4_; this.field_177475_o = worldIn.getWorldInfo().getTerrainType(); this.rand = new Random(p_i45636_2_); this.field_147431_j = new NoiseGeneratorOctaves(this.rand, 16); this.field_147432_k = new NoiseGeneratorOctaves(this.rand, 16); this.field_147429_l = new NoiseGeneratorOctaves(this.rand, 8); this.field_147430_m = new NoiseGeneratorPerlin(this.rand, 4); this.noiseGen5 = new NoiseGeneratorOctaves(this.rand, 10); this.noiseGen6 = new NoiseGeneratorOctaves(this.rand, 16); this.mobSpawnerNoise = new NoiseGeneratorOctaves(this.rand, 8); this.field_147434_q = new double[825]; this.parabolicField = new float[25]; for (int var6 = -2; var6 <= 2; ++var6) { for (int var7 = -2; var7 <= 2; ++var7) { float var8 = 10.0F / MathHelper.sqrt_float((float)(var6 * var6 + var7 * var7) + 0.2F); this.parabolicField[var6 + 2 + (var7 + 2) * 5] = var8; } } if (p_i45636_5_ != null) { this.field_177477_r = ChunkProviderSettings.Factory.func_177865_a(p_i45636_5_).func_177864_b(); this.field_177476_s = this.field_177477_r.field_177778_E ? Blocks.lava : Blocks.water; } } public void func_180518_a(int p_180518_1_, int p_180518_2_, ChunkPrimer p_180518_3_) { this.biomesForGeneration = this.worldObj.getWorldChunkManager().getBiomesForGeneration(this.biomesForGeneration, p_180518_1_ * 4 - 2, p_180518_2_ * 4 - 2, 10, 10); this.func_147423_a(p_180518_1_ * 4, 0, p_180518_2_ * 4); for (int var4 = 0; var4 < 4; ++var4) { int var5 = var4 * 5; int var6 = (var4 + 1) * 5; for (int var7 = 0; var7 < 4; ++var7) { int var8 = (var5 + var7) * 33; int var9 = (var5 + var7 + 1) * 33; int var10 = (var6 + var7) * 33; int var11 = (var6 + var7 + 1) * 33; for (int var12 = 0; var12 < 32; ++var12) { double var13 = 0.125D; double var15 = this.field_147434_q[var8 + var12]; double var17 = this.field_147434_q[var9 + var12]; double var19 = this.field_147434_q[var10 + var12]; double var21 = this.field_147434_q[var11 + var12]; double var23 = (this.field_147434_q[var8 + var12 + 1] - var15) * var13; double var25 = (this.field_147434_q[var9 + var12 + 1] - var17) * var13; double var27 = (this.field_147434_q[var10 + var12 + 1] - var19) * var13; double var29 = (this.field_147434_q[var11 + var12 + 1] - var21) * var13; for (int var31 = 0; var31 < 8; ++var31) { double var32 = 0.25D; double var34 = var15; double var36 = var17; double var38 = (var19 - var15) * var32; double var40 = (var21 - var17) * var32; for (int var42 = 0; var42 < 4; ++var42) { double var43 = 0.25D; double var47 = (var36 - var34) * var43; double var45 = var34 - var47; for (int var49 = 0; var49 < 4; ++var49) { if ((var45 += var47) > 0.0D) { p_180518_3_.setBlockState(var4 * 4 + var42, var12 * 8 + var31, var7 * 4 + var49, Blocks.stone.getDefaultState()); } else if (var12 * 8 + var31 < this.field_177477_r.field_177841_q) { p_180518_3_.setBlockState(var4 * 4 + var42, var12 * 8 + var31, var7 * 4 + var49, this.field_177476_s.getDefaultState()); } } var34 += var38; var36 += var40; } var15 += var23; var17 += var25; var19 += var27; var21 += var29; } } } } } public void func_180517_a(int p_180517_1_, int p_180517_2_, ChunkPrimer p_180517_3_, BiomeGenBase[] p_180517_4_) { double var5 = 0.03125D; this.stoneNoise = this.field_147430_m.func_151599_a(this.stoneNoise, (double)(p_180517_1_ * 16), (double)(p_180517_2_ * 16), 16, 16, var5 * 2.0D, var5 * 2.0D, 1.0D); for (int var7 = 0; var7 < 16; ++var7) { for (int var8 = 0; var8 < 16; ++var8) { BiomeGenBase var9 = p_180517_4_[var8 + var7 * 16]; var9.genTerrainBlocks(this.worldObj, this.rand, p_180517_3_, p_180517_1_ * 16 + var7, p_180517_2_ * 16 + var8, this.stoneNoise[var8 + var7 * 16]); } } } /** * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the * specified chunk from the map seed and chunk seed */ public Chunk provideChunk(int p_73154_1_, int p_73154_2_) { this.rand.setSeed((long)p_73154_1_ * 341873128712L + (long)p_73154_2_ * 132897987541L); ChunkPrimer var3 = new ChunkPrimer(); this.func_180518_a(p_73154_1_, p_73154_2_, var3); this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, p_73154_1_ * 16, p_73154_2_ * 16, 16, 16); this.func_180517_a(p_73154_1_, p_73154_2_, var3, this.biomesForGeneration); if (this.field_177477_r.field_177839_r) { this.caveGenerator.func_175792_a(this, this.worldObj, p_73154_1_, p_73154_2_, var3); } if (this.field_177477_r.field_177850_z) { this.ravineGenerator.func_175792_a(this, this.worldObj, p_73154_1_, p_73154_2_, var3); } if (this.field_177477_r.field_177829_w && this.mapFeaturesEnabled) { this.mineshaftGenerator.func_175792_a(this, this.worldObj, p_73154_1_, p_73154_2_, var3); } if (this.field_177477_r.field_177831_v && this.mapFeaturesEnabled) { this.villageGenerator.func_175792_a(this, this.worldObj, p_73154_1_, p_73154_2_, var3); } if (this.field_177477_r.field_177833_u && this.mapFeaturesEnabled) { this.strongholdGenerator.func_175792_a(this, this.worldObj, p_73154_1_, p_73154_2_, var3); } if (this.field_177477_r.field_177854_x && this.mapFeaturesEnabled) { this.scatteredFeatureGenerator.func_175792_a(this, this.worldObj, p_73154_1_, p_73154_2_, var3); } if (this.field_177477_r.field_177852_y && this.mapFeaturesEnabled) { this.field_177474_A.func_175792_a(this, this.worldObj, p_73154_1_, p_73154_2_, var3); } Chunk var4 = new Chunk(this.worldObj, var3, p_73154_1_, p_73154_2_); byte[] var5 = var4.getBiomeArray(); for (int var6 = 0; var6 < var5.length; ++var6) { var5[var6] = (byte)this.biomesForGeneration[var6].biomeID; } var4.generateSkylightMap(); return var4; } private void func_147423_a(int p_147423_1_, int p_147423_2_, int p_147423_3_) { this.field_147426_g = this.noiseGen6.generateNoiseOctaves(this.field_147426_g, p_147423_1_, p_147423_3_, 5, 5, (double)this.field_177477_r.field_177808_e, (double)this.field_177477_r.field_177803_f, (double)this.field_177477_r.field_177804_g); float var4 = this.field_177477_r.field_177811_a; float var5 = this.field_177477_r.field_177809_b; this.field_147427_d = this.field_147429_l.generateNoiseOctaves(this.field_147427_d, p_147423_1_, p_147423_2_, p_147423_3_, 5, 33, 5, (double)(var4 / this.field_177477_r.field_177825_h), (double)(var5 / this.field_177477_r.field_177827_i), (double)(var4 / this.field_177477_r.field_177821_j)); this.field_147428_e = this.field_147431_j.generateNoiseOctaves(this.field_147428_e, p_147423_1_, p_147423_2_, p_147423_3_, 5, 33, 5, (double)var4, (double)var5, (double)var4); this.field_147425_f = this.field_147432_k.generateNoiseOctaves(this.field_147425_f, p_147423_1_, p_147423_2_, p_147423_3_, 5, 33, 5, (double)var4, (double)var5, (double)var4); boolean var37 = false; boolean var36 = false; int var6 = 0; int var7 = 0; for (int var8 = 0; var8 < 5; ++var8) { for (int var9 = 0; var9 < 5; ++var9) { float var10 = 0.0F; float var11 = 0.0F; float var12 = 0.0F; byte var13 = 2; BiomeGenBase var14 = this.biomesForGeneration[var8 + 2 + (var9 + 2) * 10]; for (int var15 = -var13; var15 <= var13; ++var15) { for (int var16 = -var13; var16 <= var13; ++var16) { BiomeGenBase var17 = this.biomesForGeneration[var8 + var15 + 2 + (var9 + var16 + 2) * 10]; float var18 = this.field_177477_r.field_177813_n + var17.minHeight * this.field_177477_r.field_177819_m; float var19 = this.field_177477_r.field_177843_p + var17.maxHeight * this.field_177477_r.field_177815_o; if (this.field_177475_o == WorldType.AMPLIFIED && var18 > 0.0F) { var18 = 1.0F + var18 * 2.0F; var19 = 1.0F + var19 * 4.0F; } float var20 = this.parabolicField[var15 + 2 + (var16 + 2) * 5] / (var18 + 2.0F); if (var17.minHeight > var14.minHeight) { var20 /= 2.0F; } var10 += var19 * var20; var11 += var18 * var20; var12 += var20; } } var10 /= var12; var11 /= var12; var10 = var10 * 0.9F + 0.1F; var11 = (var11 * 4.0F - 1.0F) / 8.0F; double var38 = this.field_147426_g[var7] / 8000.0D; if (var38 < 0.0D) { var38 = -var38 * 0.3D; } var38 = var38 * 3.0D - 2.0D; if (var38 < 0.0D) { var38 /= 2.0D; if (var38 < -1.0D) { var38 = -1.0D; } var38 /= 1.4D; var38 /= 2.0D; } else { if (var38 > 1.0D) { var38 = 1.0D; } var38 /= 8.0D; } ++var7; double var39 = (double)var11; double var40 = (double)var10; var39 += var38 * 0.2D; var39 = var39 * (double)this.field_177477_r.field_177823_k / 8.0D; double var21 = (double)this.field_177477_r.field_177823_k + var39 * 4.0D; for (int var23 = 0; var23 < 33; ++var23) { double var24 = ((double)var23 - var21) * (double)this.field_177477_r.field_177817_l * 128.0D / 256.0D / var40; if (var24 < 0.0D) { var24 *= 4.0D; } double var26 = this.field_147428_e[var6] / (double)this.field_177477_r.field_177806_d; double var28 = this.field_147425_f[var6] / (double)this.field_177477_r.field_177810_c; double var30 = (this.field_147427_d[var6] / 10.0D + 1.0D) / 2.0D; double var32 = MathHelper.denormalizeClamp(var26, var28, var30) - var24; if (var23 > 29) { double var34 = (double)((float)(var23 - 29) / 3.0F); var32 = var32 * (1.0D - var34) + -10.0D * var34; } this.field_147434_q[var6] = var32; ++var6; } } } } /** * Checks to see if a chunk exists at x, y */ public boolean chunkExists(int p_73149_1_, int p_73149_2_) { return true; } /** * Populates chunk with ores etc etc */ public void populate(IChunkProvider p_73153_1_, int p_73153_2_, int p_73153_3_) { BlockFalling.fallInstantly = true; int var4 = p_73153_2_ * 16; int var5 = p_73153_3_ * 16; BlockPos var6 = new BlockPos(var4, 0, var5); BiomeGenBase var7 = this.worldObj.getBiomeGenForCoords(var6.add(16, 0, 16)); this.rand.setSeed(this.worldObj.getSeed()); long var8 = this.rand.nextLong() / 2L * 2L + 1L; long var10 = this.rand.nextLong() / 2L * 2L + 1L; this.rand.setSeed((long)p_73153_2_ * var8 + (long)p_73153_3_ * var10 ^ this.worldObj.getSeed()); boolean var12 = false; ChunkCoordIntPair var13 = new ChunkCoordIntPair(p_73153_2_, p_73153_3_); if (this.field_177477_r.field_177829_w && this.mapFeaturesEnabled) { this.mineshaftGenerator.func_175794_a(this.worldObj, this.rand, var13); } if (this.field_177477_r.field_177831_v && this.mapFeaturesEnabled) { var12 = this.villageGenerator.func_175794_a(this.worldObj, this.rand, var13); } if (this.field_177477_r.field_177833_u && this.mapFeaturesEnabled) { this.strongholdGenerator.func_175794_a(this.worldObj, this.rand, var13); } if (this.field_177477_r.field_177854_x && this.mapFeaturesEnabled) { this.scatteredFeatureGenerator.func_175794_a(this.worldObj, this.rand, var13); } if (this.field_177477_r.field_177852_y && this.mapFeaturesEnabled) { this.field_177474_A.func_175794_a(this.worldObj, this.rand, var13); } int var14; int var15; int var16; if (var7 != BiomeGenBase.desert && var7 != BiomeGenBase.desertHills && this.field_177477_r.field_177781_A && !var12 && this.rand.nextInt(this.field_177477_r.field_177782_B) == 0) { var14 = this.rand.nextInt(16) + 8; var15 = this.rand.nextInt(256); var16 = this.rand.nextInt(16) + 8; (new WorldGenLakes(Blocks.water)).generate(this.worldObj, this.rand, var6.add(var14, var15, var16)); } if (!var12 && this.rand.nextInt(this.field_177477_r.field_177777_D / 10) == 0 && this.field_177477_r.field_177783_C) { var14 = this.rand.nextInt(16) + 8; var15 = this.rand.nextInt(this.rand.nextInt(248) + 8); var16 = this.rand.nextInt(16) + 8; if (var15 < 63 || this.rand.nextInt(this.field_177477_r.field_177777_D / 8) == 0) { (new WorldGenLakes(Blocks.lava)).generate(this.worldObj, this.rand, var6.add(var14, var15, var16)); } } if (this.field_177477_r.field_177837_s) { for (var14 = 0; var14 < this.field_177477_r.field_177835_t; ++var14) { var15 = this.rand.nextInt(16) + 8; var16 = this.rand.nextInt(256); int var17 = this.rand.nextInt(16) + 8; (new WorldGenDungeons()).generate(this.worldObj, this.rand, var6.add(var15, var16, var17)); } } var7.func_180624_a(this.worldObj, this.rand, new BlockPos(var4, 0, var5)); SpawnerAnimals.performWorldGenSpawning(this.worldObj, var7, var4 + 8, var5 + 8, 16, 16, this.rand); var6 = var6.add(8, 0, 8); for (var14 = 0; var14 < 16; ++var14) { for (var15 = 0; var15 < 16; ++var15) { BlockPos var18 = this.worldObj.func_175725_q(var6.add(var14, 0, var15)); BlockPos var19 = var18.offsetDown(); if (this.worldObj.func_175675_v(var19)) { this.worldObj.setBlockState(var19, Blocks.ice.getDefaultState(), 2); } if (this.worldObj.func_175708_f(var18, true)) { this.worldObj.setBlockState(var18, Blocks.snow_layer.getDefaultState(), 2); } } } BlockFalling.fallInstantly = false; } public boolean func_177460_a(IChunkProvider p_177460_1_, Chunk p_177460_2_, int p_177460_3_, int p_177460_4_) { boolean var5 = false; if (this.field_177477_r.field_177852_y && this.mapFeaturesEnabled && p_177460_2_.getInhabitedTime() < 3600L) { var5 |= this.field_177474_A.func_175794_a(this.worldObj, this.rand, new ChunkCoordIntPair(p_177460_3_, p_177460_4_)); } return var5; } /** * Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks. * Return true if all chunks have been saved. */ public boolean saveChunks(boolean p_73151_1_, IProgressUpdate p_73151_2_) { return true; } /** * Save extra data not associated with any Chunk. Not saved during autosave, only during world unload. Currently * unimplemented. */ public void saveExtraData() {} /** * Unloads chunks that are marked to be unloaded. This is not guaranteed to unload every such chunk. */ public boolean unloadQueuedChunks() { return false; } /** * Returns if the IChunkProvider supports saving. */ public boolean canSave() { return true; } /** * Converts the instance data to a readable string. */ public String makeString() { return "RandomLevelSource"; } public List func_177458_a(EnumCreatureType p_177458_1_, BlockPos p_177458_2_) { BiomeGenBase var3 = this.worldObj.getBiomeGenForCoords(p_177458_2_); if (this.mapFeaturesEnabled) { if (p_177458_1_ == EnumCreatureType.MONSTER && this.scatteredFeatureGenerator.func_175798_a(p_177458_2_)) { return this.scatteredFeatureGenerator.getScatteredFeatureSpawnList(); } if (p_177458_1_ == EnumCreatureType.MONSTER && this.field_177477_r.field_177852_y && this.field_177474_A.func_175796_a(this.worldObj, p_177458_2_)) { return this.field_177474_A.func_175799_b(); } } return var3.getSpawnableList(p_177458_1_); } public BlockPos func_180513_a(World worldIn, String p_180513_2_, BlockPos p_180513_3_) { return "Stronghold".equals(p_180513_2_) && this.strongholdGenerator != null ? this.strongholdGenerator.func_180706_b(worldIn, p_180513_3_) : null; } public int getLoadedChunkCount() { return 0; } public void func_180514_a(Chunk p_180514_1_, int p_180514_2_, int p_180514_3_) { if (this.field_177477_r.field_177829_w && this.mapFeaturesEnabled) { this.mineshaftGenerator.func_175792_a(this, this.worldObj, p_180514_2_, p_180514_3_, (ChunkPrimer)null); } if (this.field_177477_r.field_177831_v && this.mapFeaturesEnabled) { this.villageGenerator.func_175792_a(this, this.worldObj, p_180514_2_, p_180514_3_, (ChunkPrimer)null); } if (this.field_177477_r.field_177833_u && this.mapFeaturesEnabled) { this.strongholdGenerator.func_175792_a(this, this.worldObj, p_180514_2_, p_180514_3_, (ChunkPrimer)null); } if (this.field_177477_r.field_177854_x && this.mapFeaturesEnabled) { this.scatteredFeatureGenerator.func_175792_a(this, this.worldObj, p_180514_2_, p_180514_3_, (ChunkPrimer)null); } if (this.field_177477_r.field_177852_y && this.mapFeaturesEnabled) { this.field_177474_A.func_175792_a(this, this.worldObj, p_180514_2_, p_180514_3_, (ChunkPrimer)null); } } public Chunk func_177459_a(BlockPos p_177459_1_) { return this.provideChunk(p_177459_1_.getX() >> 4, p_177459_1_.getZ() >> 4); } }