package net.tropicraft.world.biomes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ReportedException;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.BiomeCache;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.WorldChunkManager;
import net.minecraft.world.gen.layer.GenLayer;
import net.minecraft.world.gen.layer.IntCache;
import net.tropicraft.world.genlayer.GenLayerTropicraft;
public class WorldChunkManagerTropicraft extends WorldChunkManager {
public static final List<BiomeGenBase> allowedBiomes = Arrays.asList(BiomeGenTropicraft.tropics, BiomeGenTropicraft.rainforestPlains);
private GenLayer genBiomes;
private GenLayer biomeIndexLayer;
private BiomeCache biomeCache;
private List biomesToSpawnIn;
protected WorldChunkManagerTropicraft()
{
this.biomeCache = new BiomeCache(this);
this.biomesToSpawnIn = new ArrayList();
this.biomesToSpawnIn.addAll(allowedBiomes);
}
public WorldChunkManagerTropicraft(long seed, WorldType worldType)
{
this();
GenLayer[] agenlayer = GenLayerTropicraft.initializeAllBiomeGenerators(seed, worldType);
this.genBiomes = agenlayer[0];
this.biomeIndexLayer = agenlayer[1];
}
public WorldChunkManagerTropicraft(World world)
{
this(world.getSeed(), world.getWorldInfo().getTerrainType());
}
@Override
public List getBiomesToSpawnIn()
{
return this.biomesToSpawnIn;
}
@Override
public BiomeGenBase getBiomeGenAt(int par1, int par2)
{
return this.biomeCache.getBiomeGenAt(par1, par2);
}
@Override
public float[] getRainfall(float[] par1ArrayOfFloat, int par2, int par3, int par4, int par5)
{
IntCache.resetIntCache();
if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5)
{
par1ArrayOfFloat = new float[par4 * par5];
}
int[] aint = this.biomeIndexLayer.getInts(par2, par3, par4, par5);
for (int i1 = 0; i1 < par4 * par5; ++i1)
{
try
{
float f = (float)BiomeGenBase.getBiome(aint[i1]).getIntRainfall() / 65536.0F;
if (f > 1.0F)
{
f = 1.0F;
}
par1ArrayOfFloat[i1] = f;
}
catch (Throwable throwable)
{
CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
CrashReportCategory crashreportcategory = crashreport.makeCategory("DownfallBlock");
crashreportcategory.addCrashSection("biome id", Integer.valueOf(i1));
crashreportcategory.addCrashSection("downfalls[] size", Integer.valueOf(par1ArrayOfFloat.length));
crashreportcategory.addCrashSection("x", Integer.valueOf(par2));
crashreportcategory.addCrashSection("z", Integer.valueOf(par3));
crashreportcategory.addCrashSection("w", Integer.valueOf(par4));
crashreportcategory.addCrashSection("h", Integer.valueOf(par5));
throw new ReportedException(crashreport);
}
}
return par1ArrayOfFloat;
}
@Override
public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5)
{
IntCache.resetIntCache();
if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5)
{
par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
}
int[] aint = this.genBiomes.getInts(par2, par3, par4, par5);
try
{
for (int i1 = 0; i1 < par4 * par5; ++i1)
{
par1ArrayOfBiomeGenBase[i1] = BiomeGenBase.getBiome(aint[i1]);
}
return par1ArrayOfBiomeGenBase;
}
catch (Throwable throwable)
{
CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
CrashReportCategory crashreportcategory = crashreport.makeCategory("RawBiomeBlock");
crashreportcategory.addCrashSection("biomes[] size", Integer.valueOf(par1ArrayOfBiomeGenBase.length));
crashreportcategory.addCrashSection("x", Integer.valueOf(par2));
crashreportcategory.addCrashSection("z", Integer.valueOf(par3));
crashreportcategory.addCrashSection("w", Integer.valueOf(par4));
crashreportcategory.addCrashSection("h", Integer.valueOf(par5));
throw new ReportedException(crashreport);
}
}
@Override
public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5, boolean par6)
{
IntCache.resetIntCache();
if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5)
{
par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
}
if (par6 && par4 == 16 && par5 == 16 && (par2 & 15) == 0 && (par3 & 15) == 0)
{
BiomeGenBase[] abiomegenbase1 = this.biomeCache.getCachedBiomes(par2, par3);
System.arraycopy(abiomegenbase1, 0, par1ArrayOfBiomeGenBase, 0, par4 * par5);
return par1ArrayOfBiomeGenBase;
}
else
{
int[] aint = this.biomeIndexLayer.getInts(par2, par3, par4, par5);
for (int i1 = 0; i1 < par4 * par5; ++i1)
{
par1ArrayOfBiomeGenBase[i1] = BiomeGenBase.getBiome(aint[i1]);
}
return par1ArrayOfBiomeGenBase;
}
}
@Override
public boolean areBiomesViable(int par1, int par2, int par3, List par4List)
{
IntCache.resetIntCache();
int l = par1 - par3 >> 2;
int i1 = par2 - par3 >> 2;
int j1 = par1 + par3 >> 2;
int k1 = par2 + par3 >> 2;
int l1 = j1 - l + 1;
int i2 = k1 - i1 + 1;
int[] aint = this.genBiomes.getInts(l, i1, l1, i2);
try
{
for (int j2 = 0; j2 < l1 * i2; ++j2)
{
BiomeGenBase biomegenbase = BiomeGenBase.getBiome(aint[j2]);
if (!par4List.contains(biomegenbase))
{
return false;
}
}
return true;
}
catch (Throwable throwable)
{
CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
CrashReportCategory crashreportcategory = crashreport.makeCategory("Layer");
crashreportcategory.addCrashSection("Layer", this.genBiomes.toString());
crashreportcategory.addCrashSection("x", Integer.valueOf(par1));
crashreportcategory.addCrashSection("z", Integer.valueOf(par2));
crashreportcategory.addCrashSection("radius", Integer.valueOf(par3));
crashreportcategory.addCrashSection("allowed", par4List);
throw new ReportedException(crashreport);
}
}
@Override
public ChunkPosition findBiomePosition(int p_150795_1_, int p_150795_2_, int p_150795_3_, List p_150795_4_, Random p_150795_5_)
{
IntCache.resetIntCache();
int l = p_150795_1_ - p_150795_3_ >> 2;
int i1 = p_150795_2_ - p_150795_3_ >> 2;
int j1 = p_150795_1_ + p_150795_3_ >> 2;
int k1 = p_150795_2_ + p_150795_3_ >> 2;
int l1 = j1 - l + 1;
int i2 = k1 - i1 + 1;
int[] aint = this.genBiomes.getInts(l, i1, l1, i2);
ChunkPosition chunkposition = null;
int j2 = 0;
for (int k2 = 0; k2 < l1 * i2; ++k2)
{
int l2 = l + k2 % l1 << 2;
int i3 = i1 + k2 / l1 << 2;
BiomeGenBase biomegenbase = BiomeGenBase.getBiome(aint[k2]);
if (p_150795_4_.contains(biomegenbase) && (chunkposition == null || p_150795_5_.nextInt(j2 + 1) == 0))
{
chunkposition = new ChunkPosition(l2, 0, i3);
++j2;
}
}
return chunkposition;
}
@Override
public void cleanupCache()
{
this.biomeCache.cleanupCache();
}
}