package com.jared.mysticaltrinkets.world.dimension;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
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 cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class WorldChunkManagerMysticalDimension extends WorldChunkManager {
private BiomeCache mBiomeCache;
private List biomesToSpawn;
private GenLayer myGenBiomes;
private GenLayer myBiomeIndexLayer;
protected WorldChunkManagerMysticalDimension() {
this.mBiomeCache = new BiomeCache(this);
this.biomesToSpawn = new ArrayList();
this.biomesToSpawn.add(GenLayerBiomesMysticalTrinkets.mystical);
}
public WorldChunkManagerMysticalDimension(long par1, float par2, float par3) {
this();
GenLayer[] agenlayer = GenLayerMysticalTrinkets.makeTheWorld(par1);
this.myGenBiomes = agenlayer[0];
this.myBiomeIndexLayer = agenlayer[1];
}
public WorldChunkManagerMysticalDimension(World par1World) {
this(par1World.getSeed(), 0.5F, 0.5F);
}
@Override
public List getBiomesToSpawnIn() {
return this.biomesToSpawn;
}
@Override
public BiomeGenBase getBiomeGenAt(int par1, int par2) {
return this.mBiomeCache.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.myBiomeIndexLayer.getInts(par2, par3, par4, par5);
for (int i1 = 0; i1 < par4 * par5; ++i1) {
float f = BiomeGenBase.getBiomeGenArray()[aint[i1]].getIntRainfall() / 65536.0F;
if (f > 1.0F) {
f = 1.0F;
}
par1ArrayOfFloat[i1] = f;
}
return par1ArrayOfFloat;
}
@Override
@SideOnly(Side.CLIENT)
public float getTemperatureAtHeight(float par1, int par2) {
return 0.0F;
}
public float[] getTemperatures(float[] par1ArrayOfFloat, int par2, int par3, int par4, int par5) {
if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5) {
par1ArrayOfFloat = new float[par4 * par5];
}
Arrays.fill(par1ArrayOfFloat, 0, par4 * par5, 0.5F);
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.myGenBiomes.getInts(par2, par3, par4, par5);
for (int i1 = 0; i1 < par4 * par5; ++i1) {
par1ArrayOfBiomeGenBase[i1] = BiomeGenBase.getBiomeGenArray()[aint[i1]];
}
return par1ArrayOfBiomeGenBase;
}
@Override
public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5) {
return this.getBiomeGenAt(par1ArrayOfBiomeGenBase, par2, par3, par4, par5, true);
}
@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.mBiomeCache.getCachedBiomes(par2, par3);
System.arraycopy(abiomegenbase1, 0, par1ArrayOfBiomeGenBase, 0, par4 * par5);
return par1ArrayOfBiomeGenBase;
} else {
int[] aint = this.myBiomeIndexLayer.getInts(par2, par3, par4, par5);
for (int i1 = 0; i1 < par4 * par5; ++i1) {
par1ArrayOfBiomeGenBase[i1] = BiomeGenBase.getBiomeGenArray()[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.myGenBiomes.getInts(l, i1, l1, i2);
for (int j2 = 0; j2 < l1 * i2; ++j2) {
BiomeGenBase biomegenbase = BiomeGenBase.getBiomeGenArray()[aint[j2]];
if (!par4List.contains(biomegenbase)) {
return false;
}
}
return true;
}
@Override
public ChunkPosition findBiomePosition(int par1, int par2, int par3, List par4List, Random par5Random) {
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.myGenBiomes.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.getBiomeGenArray()[aint[k2]];
if (par4List.contains(biomegenbase) && (chunkposition == null || par5Random.nextInt(j2 + 1) == 0)) {
chunkposition = new ChunkPosition(l2, 0, i3);
++j2;
}
}
return chunkposition;
}
@Override
public void cleanupCache() {
this.mBiomeCache.cleanupCache();
}
// public GenLayer[] getModdedBiomeGenerators(WorldType worldType, long
// seed, GenLayer[] original)
// {
// WorldTypeEvent.InitBiomeGens event = new
// WorldTypeEvent.InitBiomeGens(worldType, seed, original);
//
// }
}