package net.minecraft.world.biome;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Random;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ReportedException;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.gen.layer.GenLayer;
import net.minecraft.world.gen.layer.IntCache;
public class WorldChunkManager
{
private GenLayer genBiomes;
/** A GenLayer containing the indices into BiomeGenBase.biomeList[] */
private GenLayer biomeIndexLayer;
/** The biome list. */
private BiomeCache biomeCache;
/** A list of biomes that the player can spawn in. */
private List biomesToSpawnIn;
private String field_180301_f;
private static final String __OBFID = "CL_00000166";
protected WorldChunkManager()
{
this.biomeCache = new BiomeCache(this);
this.field_180301_f = "";
this.biomesToSpawnIn = Lists.newArrayList();
this.biomesToSpawnIn.add(BiomeGenBase.forest);
this.biomesToSpawnIn.add(BiomeGenBase.plains);
this.biomesToSpawnIn.add(BiomeGenBase.taiga);
this.biomesToSpawnIn.add(BiomeGenBase.taigaHills);
this.biomesToSpawnIn.add(BiomeGenBase.forestHills);
this.biomesToSpawnIn.add(BiomeGenBase.jungle);
this.biomesToSpawnIn.add(BiomeGenBase.jungleHills);
}
public WorldChunkManager(long p_i45744_1_, WorldType p_i45744_3_, String p_i45744_4_)
{
this();
this.field_180301_f = p_i45744_4_;
GenLayer[] var5 = GenLayer.func_180781_a(p_i45744_1_, p_i45744_3_, p_i45744_4_);
this.genBiomes = var5[0];
this.biomeIndexLayer = var5[1];
}
public WorldChunkManager(World worldIn)
{
this(worldIn.getSeed(), worldIn.getWorldInfo().getTerrainType(), worldIn.getWorldInfo().getGeneratorOptions());
}
/**
* Gets the list of valid biomes for the player to spawn in.
*/
public List getBiomesToSpawnIn()
{
return this.biomesToSpawnIn;
}
public BiomeGenBase func_180631_a(BlockPos p_180631_1_)
{
return this.func_180300_a(p_180631_1_, (BiomeGenBase)null);
}
public BiomeGenBase func_180300_a(BlockPos p_180300_1_, BiomeGenBase p_180300_2_)
{
return this.biomeCache.func_180284_a(p_180300_1_.getX(), p_180300_1_.getZ(), p_180300_2_);
}
/**
* Returns a list of rainfall values for the specified blocks. Args: listToReuse, x, z, width, length.
*/
public float[] getRainfall(float[] p_76936_1_, int p_76936_2_, int p_76936_3_, int p_76936_4_, int p_76936_5_)
{
IntCache.resetIntCache();
if (p_76936_1_ == null || p_76936_1_.length < p_76936_4_ * p_76936_5_)
{
p_76936_1_ = new float[p_76936_4_ * p_76936_5_];
}
int[] var6 = this.biomeIndexLayer.getInts(p_76936_2_, p_76936_3_, p_76936_4_, p_76936_5_);
for (int var7 = 0; var7 < p_76936_4_ * p_76936_5_; ++var7)
{
try
{
float var8 = (float)BiomeGenBase.getBiomeFromBiomeList(var6[var7], BiomeGenBase.field_180279_ad).getIntRainfall() / 65536.0F;
if (var8 > 1.0F)
{
var8 = 1.0F;
}
p_76936_1_[var7] = var8;
}
catch (Throwable var11)
{
CrashReport var9 = CrashReport.makeCrashReport(var11, "Invalid Biome id");
CrashReportCategory var10 = var9.makeCategory("DownfallBlock");
var10.addCrashSection("biome id", Integer.valueOf(var7));
var10.addCrashSection("downfalls[] size", Integer.valueOf(p_76936_1_.length));
var10.addCrashSection("x", Integer.valueOf(p_76936_2_));
var10.addCrashSection("z", Integer.valueOf(p_76936_3_));
var10.addCrashSection("w", Integer.valueOf(p_76936_4_));
var10.addCrashSection("h", Integer.valueOf(p_76936_5_));
throw new ReportedException(var9);
}
}
return p_76936_1_;
}
/**
* Returns an array of biomes for the location input.
*/
public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] p_76937_1_, int p_76937_2_, int p_76937_3_, int p_76937_4_, int p_76937_5_)
{
IntCache.resetIntCache();
if (p_76937_1_ == null || p_76937_1_.length < p_76937_4_ * p_76937_5_)
{
p_76937_1_ = new BiomeGenBase[p_76937_4_ * p_76937_5_];
}
int[] var6 = this.genBiomes.getInts(p_76937_2_, p_76937_3_, p_76937_4_, p_76937_5_);
try
{
for (int var7 = 0; var7 < p_76937_4_ * p_76937_5_; ++var7)
{
p_76937_1_[var7] = BiomeGenBase.getBiomeFromBiomeList(var6[var7], BiomeGenBase.field_180279_ad);
}
return p_76937_1_;
}
catch (Throwable var10)
{
CrashReport var8 = CrashReport.makeCrashReport(var10, "Invalid Biome id");
CrashReportCategory var9 = var8.makeCategory("RawBiomeBlock");
var9.addCrashSection("biomes[] size", Integer.valueOf(p_76937_1_.length));
var9.addCrashSection("x", Integer.valueOf(p_76937_2_));
var9.addCrashSection("z", Integer.valueOf(p_76937_3_));
var9.addCrashSection("w", Integer.valueOf(p_76937_4_));
var9.addCrashSection("h", Integer.valueOf(p_76937_5_));
throw new ReportedException(var8);
}
}
/**
* Returns biomes to use for the blocks and loads the other data like temperature and humidity onto the
* WorldChunkManager Args: oldBiomeList, x, z, width, depth
*/
public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] p_76933_1_, int p_76933_2_, int p_76933_3_, int p_76933_4_, int p_76933_5_)
{
return this.getBiomeGenAt(p_76933_1_, p_76933_2_, p_76933_3_, p_76933_4_, p_76933_5_, true);
}
/**
* Return a list of biomes for the specified blocks. Args: listToReuse, x, y, width, length, cacheFlag (if false,
* don't check biomeCache to avoid infinite loop in BiomeCacheBlock)
*/
public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] p_76931_1_, int p_76931_2_, int p_76931_3_, int p_76931_4_, int p_76931_5_, boolean p_76931_6_)
{
IntCache.resetIntCache();
if (p_76931_1_ == null || p_76931_1_.length < p_76931_4_ * p_76931_5_)
{
p_76931_1_ = new BiomeGenBase[p_76931_4_ * p_76931_5_];
}
if (p_76931_6_ && p_76931_4_ == 16 && p_76931_5_ == 16 && (p_76931_2_ & 15) == 0 && (p_76931_3_ & 15) == 0)
{
BiomeGenBase[] var9 = this.biomeCache.getCachedBiomes(p_76931_2_, p_76931_3_);
System.arraycopy(var9, 0, p_76931_1_, 0, p_76931_4_ * p_76931_5_);
return p_76931_1_;
}
else
{
int[] var7 = this.biomeIndexLayer.getInts(p_76931_2_, p_76931_3_, p_76931_4_, p_76931_5_);
for (int var8 = 0; var8 < p_76931_4_ * p_76931_5_; ++var8)
{
p_76931_1_[var8] = BiomeGenBase.getBiomeFromBiomeList(var7[var8], BiomeGenBase.field_180279_ad);
}
return p_76931_1_;
}
}
/**
* checks given Chunk's Biomes against List of allowed ones
*/
public boolean areBiomesViable(int p_76940_1_, int p_76940_2_, int p_76940_3_, List p_76940_4_)
{
IntCache.resetIntCache();
int var5 = p_76940_1_ - p_76940_3_ >> 2;
int var6 = p_76940_2_ - p_76940_3_ >> 2;
int var7 = p_76940_1_ + p_76940_3_ >> 2;
int var8 = p_76940_2_ + p_76940_3_ >> 2;
int var9 = var7 - var5 + 1;
int var10 = var8 - var6 + 1;
int[] var11 = this.genBiomes.getInts(var5, var6, var9, var10);
try
{
for (int var12 = 0; var12 < var9 * var10; ++var12)
{
BiomeGenBase var16 = BiomeGenBase.getBiome(var11[var12]);
if (!p_76940_4_.contains(var16))
{
return false;
}
}
return true;
}
catch (Throwable var15)
{
CrashReport var13 = CrashReport.makeCrashReport(var15, "Invalid Biome id");
CrashReportCategory var14 = var13.makeCategory("Layer");
var14.addCrashSection("Layer", this.genBiomes.toString());
var14.addCrashSection("x", Integer.valueOf(p_76940_1_));
var14.addCrashSection("z", Integer.valueOf(p_76940_2_));
var14.addCrashSection("radius", Integer.valueOf(p_76940_3_));
var14.addCrashSection("allowed", p_76940_4_);
throw new ReportedException(var13);
}
}
public BlockPos findBiomePosition(int x, int z, int range, List biomes, Random random)
{
IntCache.resetIntCache();
int var6 = x - range >> 2;
int var7 = z - range >> 2;
int var8 = x + range >> 2;
int var9 = z + range >> 2;
int var10 = var8 - var6 + 1;
int var11 = var9 - var7 + 1;
int[] var12 = this.genBiomes.getInts(var6, var7, var10, var11);
BlockPos var13 = null;
int var14 = 0;
for (int var15 = 0; var15 < var10 * var11; ++var15)
{
int var16 = var6 + var15 % var10 << 2;
int var17 = var7 + var15 / var10 << 2;
BiomeGenBase var18 = BiomeGenBase.getBiome(var12[var15]);
if (biomes.contains(var18) && (var13 == null || random.nextInt(var14 + 1) == 0))
{
var13 = new BlockPos(var16, 0, var17);
++var14;
}
}
return var13;
}
/**
* Calls the WorldChunkManager's biomeCache.cleanupCache()
*/
public void cleanupCache()
{
this.biomeCache.cleanupCache();
}
}