package net.minecraft.world.gen;
import java.util.List;
import java.util.Random;
import net.minecraft.block.BlockFalling;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.block.state.pattern.BlockHelper;
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.World;
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.WorldGenFire;
import net.minecraft.world.gen.feature.WorldGenGlowStone1;
import net.minecraft.world.gen.feature.WorldGenGlowStone2;
import net.minecraft.world.gen.feature.WorldGenHellLava;
import net.minecraft.world.gen.feature.WorldGenMinable;
import net.minecraft.world.gen.feature.WorldGenerator;
import net.minecraft.world.gen.structure.MapGenNetherBridge;
public class ChunkProviderHell implements IChunkProvider
{
/** Is the world that the nether is getting generated. */
private final World worldObj;
private final boolean field_177466_i;
private final Random hellRNG;
/**
* Holds the noise used to determine whether slowsand can be generated at a location
*/
private double[] slowsandNoise = new double[256];
private double[] gravelNoise = new double[256];
/**
* Holds the noise used to determine whether something other than netherrack can be generated at a location
*/
private double[] netherrackExclusivityNoise = new double[256];
private double[] noiseField;
/** A NoiseGeneratorOctaves used in generating nether terrain */
private final NoiseGeneratorOctaves netherNoiseGen1;
private final NoiseGeneratorOctaves netherNoiseGen2;
private final NoiseGeneratorOctaves netherNoiseGen3;
/** Determines whether slowsand or gravel can be generated at a location */
private final NoiseGeneratorOctaves slowsandGravelNoiseGen;
/**
* Determines whether something other than nettherack can be generated at a location
*/
private final NoiseGeneratorOctaves netherrackExculsivityNoiseGen;
public final NoiseGeneratorOctaves netherNoiseGen6;
public final NoiseGeneratorOctaves netherNoiseGen7;
private final WorldGenFire field_177470_t = new WorldGenFire();
private final WorldGenGlowStone1 field_177469_u = new WorldGenGlowStone1();
private final WorldGenGlowStone2 field_177468_v = new WorldGenGlowStone2();
private final WorldGenerator field_177467_w;
private final WorldGenHellLava field_177473_x;
private final WorldGenHellLava field_177472_y;
private final GeneratorBushFeature field_177471_z;
private final GeneratorBushFeature field_177465_A;
private final MapGenNetherBridge genNetherBridge;
private final MapGenBase netherCaveGenerator;
double[] noiseData1;
double[] noiseData2;
double[] noiseData3;
double[] noiseData4;
double[] noiseData5;
private static final String __OBFID = "CL_00000392";
public ChunkProviderHell(World worldIn, boolean p_i45637_2_, long p_i45637_3_)
{
this.field_177467_w = new WorldGenMinable(Blocks.quartz_ore.getDefaultState(), 14, BlockHelper.forBlock(Blocks.netherrack));
this.field_177473_x = new WorldGenHellLava(Blocks.flowing_lava, true);
this.field_177472_y = new WorldGenHellLava(Blocks.flowing_lava, false);
this.field_177471_z = new GeneratorBushFeature(Blocks.brown_mushroom);
this.field_177465_A = new GeneratorBushFeature(Blocks.red_mushroom);
this.genNetherBridge = new MapGenNetherBridge();
this.netherCaveGenerator = new MapGenCavesHell();
this.worldObj = worldIn;
this.field_177466_i = p_i45637_2_;
this.hellRNG = new Random(p_i45637_3_);
this.netherNoiseGen1 = new NoiseGeneratorOctaves(this.hellRNG, 16);
this.netherNoiseGen2 = new NoiseGeneratorOctaves(this.hellRNG, 16);
this.netherNoiseGen3 = new NoiseGeneratorOctaves(this.hellRNG, 8);
this.slowsandGravelNoiseGen = new NoiseGeneratorOctaves(this.hellRNG, 4);
this.netherrackExculsivityNoiseGen = new NoiseGeneratorOctaves(this.hellRNG, 4);
this.netherNoiseGen6 = new NoiseGeneratorOctaves(this.hellRNG, 10);
this.netherNoiseGen7 = new NoiseGeneratorOctaves(this.hellRNG, 16);
}
public void func_180515_a(int p_180515_1_, int p_180515_2_, ChunkPrimer p_180515_3_)
{
byte var4 = 4;
byte var5 = 32;
int var6 = var4 + 1;
byte var7 = 17;
int var8 = var4 + 1;
this.noiseField = this.initializeNoiseField(this.noiseField, p_180515_1_ * var4, 0, p_180515_2_ * var4, var6, var7, var8);
for (int var9 = 0; var9 < var4; ++var9)
{
for (int var10 = 0; var10 < var4; ++var10)
{
for (int var11 = 0; var11 < 16; ++var11)
{
double var12 = 0.125D;
double var14 = this.noiseField[((var9 + 0) * var8 + var10 + 0) * var7 + var11 + 0];
double var16 = this.noiseField[((var9 + 0) * var8 + var10 + 1) * var7 + var11 + 0];
double var18 = this.noiseField[((var9 + 1) * var8 + var10 + 0) * var7 + var11 + 0];
double var20 = this.noiseField[((var9 + 1) * var8 + var10 + 1) * var7 + var11 + 0];
double var22 = (this.noiseField[((var9 + 0) * var8 + var10 + 0) * var7 + var11 + 1] - var14) * var12;
double var24 = (this.noiseField[((var9 + 0) * var8 + var10 + 1) * var7 + var11 + 1] - var16) * var12;
double var26 = (this.noiseField[((var9 + 1) * var8 + var10 + 0) * var7 + var11 + 1] - var18) * var12;
double var28 = (this.noiseField[((var9 + 1) * var8 + var10 + 1) * var7 + var11 + 1] - var20) * var12;
for (int var30 = 0; var30 < 8; ++var30)
{
double var31 = 0.25D;
double var33 = var14;
double var35 = var16;
double var37 = (var18 - var14) * var31;
double var39 = (var20 - var16) * var31;
for (int var41 = 0; var41 < 4; ++var41)
{
double var42 = 0.25D;
double var44 = var33;
double var46 = (var35 - var33) * var42;
for (int var48 = 0; var48 < 4; ++var48)
{
IBlockState var49 = null;
if (var11 * 8 + var30 < var5)
{
var49 = Blocks.lava.getDefaultState();
}
if (var44 > 0.0D)
{
var49 = Blocks.netherrack.getDefaultState();
}
int var50 = var41 + var9 * 4;
int var51 = var30 + var11 * 8;
int var52 = var48 + var10 * 4;
p_180515_3_.setBlockState(var50, var51, var52, var49);
var44 += var46;
}
var33 += var37;
var35 += var39;
}
var14 += var22;
var16 += var24;
var18 += var26;
var20 += var28;
}
}
}
}
}
public void func_180516_b(int p_180516_1_, int p_180516_2_, ChunkPrimer p_180516_3_)
{
byte var4 = 64;
double var5 = 0.03125D;
this.slowsandNoise = this.slowsandGravelNoiseGen.generateNoiseOctaves(this.slowsandNoise, p_180516_1_ * 16, p_180516_2_ * 16, 0, 16, 16, 1, var5, var5, 1.0D);
this.gravelNoise = this.slowsandGravelNoiseGen.generateNoiseOctaves(this.gravelNoise, p_180516_1_ * 16, 109, p_180516_2_ * 16, 16, 1, 16, var5, 1.0D, var5);
this.netherrackExclusivityNoise = this.netherrackExculsivityNoiseGen.generateNoiseOctaves(this.netherrackExclusivityNoise, p_180516_1_ * 16, p_180516_2_ * 16, 0, 16, 16, 1, var5 * 2.0D, var5 * 2.0D, var5 * 2.0D);
for (int var7 = 0; var7 < 16; ++var7)
{
for (int var8 = 0; var8 < 16; ++var8)
{
boolean var9 = this.slowsandNoise[var7 + var8 * 16] + this.hellRNG.nextDouble() * 0.2D > 0.0D;
boolean var10 = this.gravelNoise[var7 + var8 * 16] + this.hellRNG.nextDouble() * 0.2D > 0.0D;
int var11 = (int)(this.netherrackExclusivityNoise[var7 + var8 * 16] / 3.0D + 3.0D + this.hellRNG.nextDouble() * 0.25D);
int var12 = -1;
IBlockState var13 = Blocks.netherrack.getDefaultState();
IBlockState var14 = Blocks.netherrack.getDefaultState();
for (int var15 = 127; var15 >= 0; --var15)
{
if (var15 < 127 - this.hellRNG.nextInt(5) && var15 > this.hellRNG.nextInt(5))
{
IBlockState var16 = p_180516_3_.getBlockState(var8, var15, var7);
if (var16.getBlock() != null && var16.getBlock().getMaterial() != Material.air)
{
if (var16.getBlock() == Blocks.netherrack)
{
if (var12 == -1)
{
if (var11 <= 0)
{
var13 = null;
var14 = Blocks.netherrack.getDefaultState();
}
else if (var15 >= var4 - 4 && var15 <= var4 + 1)
{
var13 = Blocks.netherrack.getDefaultState();
var14 = Blocks.netherrack.getDefaultState();
if (var10)
{
var13 = Blocks.gravel.getDefaultState();
var14 = Blocks.netherrack.getDefaultState();
}
if (var9)
{
var13 = Blocks.soul_sand.getDefaultState();
var14 = Blocks.soul_sand.getDefaultState();
}
}
if (var15 < var4 && (var13 == null || var13.getBlock().getMaterial() == Material.air))
{
var13 = Blocks.lava.getDefaultState();
}
var12 = var11;
if (var15 >= var4 - 1)
{
p_180516_3_.setBlockState(var8, var15, var7, var13);
}
else
{
p_180516_3_.setBlockState(var8, var15, var7, var14);
}
}
else if (var12 > 0)
{
--var12;
p_180516_3_.setBlockState(var8, var15, var7, var14);
}
}
}
else
{
var12 = -1;
}
}
else
{
p_180516_3_.setBlockState(var8, var15, var7, Blocks.bedrock.getDefaultState());
}
}
}
}
}
/**
* 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.hellRNG.setSeed((long)p_73154_1_ * 341873128712L + (long)p_73154_2_ * 132897987541L);
ChunkPrimer var3 = new ChunkPrimer();
this.func_180515_a(p_73154_1_, p_73154_2_, var3);
this.func_180516_b(p_73154_1_, p_73154_2_, var3);
this.netherCaveGenerator.func_175792_a(this, this.worldObj, p_73154_1_, p_73154_2_, var3);
if (this.field_177466_i)
{
this.genNetherBridge.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_);
BiomeGenBase[] var5 = this.worldObj.getWorldChunkManager().loadBlockGeneratorData((BiomeGenBase[])null, p_73154_1_ * 16, p_73154_2_ * 16, 16, 16);
byte[] var6 = var4.getBiomeArray();
for (int var7 = 0; var7 < var6.length; ++var7)
{
var6[var7] = (byte)var5[var7].biomeID;
}
var4.resetRelightChecks();
return var4;
}
/**
* generates a subset of the level's terrain data. Takes 7 arguments: the [empty] noise array, the position, and the
* size.
*/
private double[] initializeNoiseField(double[] p_73164_1_, int p_73164_2_, int p_73164_3_, int p_73164_4_, int p_73164_5_, int p_73164_6_, int p_73164_7_)
{
if (p_73164_1_ == null)
{
p_73164_1_ = new double[p_73164_5_ * p_73164_6_ * p_73164_7_];
}
double var8 = 684.412D;
double var10 = 2053.236D;
this.noiseData4 = this.netherNoiseGen6.generateNoiseOctaves(this.noiseData4, p_73164_2_, p_73164_3_, p_73164_4_, p_73164_5_, 1, p_73164_7_, 1.0D, 0.0D, 1.0D);
this.noiseData5 = this.netherNoiseGen7.generateNoiseOctaves(this.noiseData5, p_73164_2_, p_73164_3_, p_73164_4_, p_73164_5_, 1, p_73164_7_, 100.0D, 0.0D, 100.0D);
this.noiseData1 = this.netherNoiseGen3.generateNoiseOctaves(this.noiseData1, p_73164_2_, p_73164_3_, p_73164_4_, p_73164_5_, p_73164_6_, p_73164_7_, var8 / 80.0D, var10 / 60.0D, var8 / 80.0D);
this.noiseData2 = this.netherNoiseGen1.generateNoiseOctaves(this.noiseData2, p_73164_2_, p_73164_3_, p_73164_4_, p_73164_5_, p_73164_6_, p_73164_7_, var8, var10, var8);
this.noiseData3 = this.netherNoiseGen2.generateNoiseOctaves(this.noiseData3, p_73164_2_, p_73164_3_, p_73164_4_, p_73164_5_, p_73164_6_, p_73164_7_, var8, var10, var8);
int var12 = 0;
double[] var13 = new double[p_73164_6_];
int var14;
for (var14 = 0; var14 < p_73164_6_; ++var14)
{
var13[var14] = Math.cos((double)var14 * Math.PI * 6.0D / (double)p_73164_6_) * 2.0D;
double var15 = (double)var14;
if (var14 > p_73164_6_ / 2)
{
var15 = (double)(p_73164_6_ - 1 - var14);
}
if (var15 < 4.0D)
{
var15 = 4.0D - var15;
var13[var14] -= var15 * var15 * var15 * 10.0D;
}
}
for (var14 = 0; var14 < p_73164_5_; ++var14)
{
for (int var31 = 0; var31 < p_73164_7_; ++var31)
{
double var16 = 0.0D;
for (int var18 = 0; var18 < p_73164_6_; ++var18)
{
double var19 = 0.0D;
double var21 = var13[var18];
double var23 = this.noiseData2[var12] / 512.0D;
double var25 = this.noiseData3[var12] / 512.0D;
double var27 = (this.noiseData1[var12] / 10.0D + 1.0D) / 2.0D;
if (var27 < 0.0D)
{
var19 = var23;
}
else if (var27 > 1.0D)
{
var19 = var25;
}
else
{
var19 = var23 + (var25 - var23) * var27;
}
var19 -= var21;
double var29;
if (var18 > p_73164_6_ - 4)
{
var29 = (double)((float)(var18 - (p_73164_6_ - 4)) / 3.0F);
var19 = var19 * (1.0D - var29) + -10.0D * var29;
}
if ((double)var18 < var16)
{
var29 = (var16 - (double)var18) / 4.0D;
var29 = MathHelper.clamp_double(var29, 0.0D, 1.0D);
var19 = var19 * (1.0D - var29) + -10.0D * var29;
}
p_73164_1_[var12] = var19;
++var12;
}
}
}
return p_73164_1_;
}
/**
* 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;
BlockPos var4 = new BlockPos(p_73153_2_ * 16, 0, p_73153_3_ * 16);
ChunkCoordIntPair var5 = new ChunkCoordIntPair(p_73153_2_, p_73153_3_);
this.genNetherBridge.func_175794_a(this.worldObj, this.hellRNG, var5);
int var6;
for (var6 = 0; var6 < 8; ++var6)
{
this.field_177472_y.generate(this.worldObj, this.hellRNG, var4.add(this.hellRNG.nextInt(16) + 8, this.hellRNG.nextInt(120) + 4, this.hellRNG.nextInt(16) + 8));
}
for (var6 = 0; var6 < this.hellRNG.nextInt(this.hellRNG.nextInt(10) + 1) + 1; ++var6)
{
this.field_177470_t.generate(this.worldObj, this.hellRNG, var4.add(this.hellRNG.nextInt(16) + 8, this.hellRNG.nextInt(120) + 4, this.hellRNG.nextInt(16) + 8));
}
for (var6 = 0; var6 < this.hellRNG.nextInt(this.hellRNG.nextInt(10) + 1); ++var6)
{
this.field_177469_u.generate(this.worldObj, this.hellRNG, var4.add(this.hellRNG.nextInt(16) + 8, this.hellRNG.nextInt(120) + 4, this.hellRNG.nextInt(16) + 8));
}
for (var6 = 0; var6 < 10; ++var6)
{
this.field_177468_v.generate(this.worldObj, this.hellRNG, var4.add(this.hellRNG.nextInt(16) + 8, this.hellRNG.nextInt(128), this.hellRNG.nextInt(16) + 8));
}
if (this.hellRNG.nextBoolean())
{
this.field_177471_z.generate(this.worldObj, this.hellRNG, var4.add(this.hellRNG.nextInt(16) + 8, this.hellRNG.nextInt(128), this.hellRNG.nextInt(16) + 8));
}
if (this.hellRNG.nextBoolean())
{
this.field_177465_A.generate(this.worldObj, this.hellRNG, var4.add(this.hellRNG.nextInt(16) + 8, this.hellRNG.nextInt(128), this.hellRNG.nextInt(16) + 8));
}
for (var6 = 0; var6 < 16; ++var6)
{
this.field_177467_w.generate(this.worldObj, this.hellRNG, var4.add(this.hellRNG.nextInt(16), this.hellRNG.nextInt(108) + 10, this.hellRNG.nextInt(16)));
}
for (var6 = 0; var6 < 16; ++var6)
{
this.field_177473_x.generate(this.worldObj, this.hellRNG, var4.add(this.hellRNG.nextInt(16), this.hellRNG.nextInt(108) + 10, this.hellRNG.nextInt(16)));
}
BlockFalling.fallInstantly = false;
}
public boolean func_177460_a(IChunkProvider p_177460_1_, Chunk p_177460_2_, int p_177460_3_, int p_177460_4_)
{
return false;
}
/**
* 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 "HellRandomLevelSource";
}
public List func_177458_a(EnumCreatureType p_177458_1_, BlockPos p_177458_2_)
{
if (p_177458_1_ == EnumCreatureType.MONSTER)
{
if (this.genNetherBridge.func_175795_b(p_177458_2_))
{
return this.genNetherBridge.getSpawnList();
}
if (this.genNetherBridge.func_175796_a(this.worldObj, p_177458_2_) && this.worldObj.getBlockState(p_177458_2_.offsetDown()).getBlock() == Blocks.nether_brick)
{
return this.genNetherBridge.getSpawnList();
}
}
BiomeGenBase var3 = this.worldObj.getBiomeGenForCoords(p_177458_2_);
return var3.getSpawnableList(p_177458_1_);
}
public BlockPos func_180513_a(World worldIn, String p_180513_2_, BlockPos p_180513_3_)
{
return null;
}
public int getLoadedChunkCount()
{
return 0;
}
public void func_180514_a(Chunk p_180514_1_, int p_180514_2_, int p_180514_3_)
{
this.genNetherBridge.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);
}
}