package micdoodle8.mods.galacticraft.planets.venus.world.gen;
import micdoodle8.mods.galacticraft.planets.venus.world.gen.layer.GenLayerVenus;
import net.minecraft.util.BlockPos;
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.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class WorldChunkManagerVenus extends WorldChunkManager
{
private GenLayer unzoomedBiomes;
private GenLayer zoomedBiomes;
private BiomeCache biomeCache;
private List<BiomeGenBase> biomesToSpawnIn;
protected WorldChunkManagerVenus()
{
biomeCache = new BiomeCache(this);
biomesToSpawnIn = new ArrayList<>();
// biomesToSpawnIn.add()
}
public WorldChunkManagerVenus(long seed, WorldType type)
{
this();
GenLayer[] genLayers = GenLayerVenus.createWorld(seed);
this.unzoomedBiomes = genLayers[0];
this.zoomedBiomes = genLayers[1];
}
public WorldChunkManagerVenus(World world)
{
this(world.getSeed(), world.getWorldInfo().getTerrainType());
}
@Override
public List<BiomeGenBase> getBiomesToSpawnIn()
{
return this.biomesToSpawnIn;
}
@Override
public BiomeGenBase getBiomeGenerator(BlockPos pos, BiomeGenBase biomeGenBaseIn)
{
return this.biomeCache.func_180284_a(pos.getX(), pos.getZ(), BiomeGenBaseVenus.venusFlat);
}
@Override
public float[] getRainfall(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.0F);
return par1ArrayOfFloat;
}
@Override
@SideOnly(Side.CLIENT)
public float getTemperatureAtHeight(float par1, int par2)
{
return par1;
}
@Override
public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] biomes, int x, int z, int length, int width)
{
IntCache.resetIntCache();
if (biomes == null || biomes.length < length * width)
{
biomes = new BiomeGenBase[length * width];
}
int[] intArray = unzoomedBiomes.getInts(x, z, length, width);
for (int i = 0; i < length * width; ++i)
{
if (intArray[i] >= 0)
{
biomes[i] = BiomeGenBase.getBiome(intArray[i]);
}
else
{
biomes[i] = BiomeGenBaseVenus.venusFlat;
}
}
return biomes;
}
@Override
public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] oldBiomeList, int x, int z, int length, int width)
{
return getBiomeGenAt(oldBiomeList, x, z, length, width, true);
}
@Override
public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] listToReuse, int x, int z, int length, int width, boolean cacheFlag)
{
IntCache.resetIntCache();
if (listToReuse == null || listToReuse.length < length * width)
{
listToReuse = new BiomeGenBase[width * length];
}
if (cacheFlag && width == 16 && length == 16 && (x & 15) == 0 && (z & 15) == 0)
{
BiomeGenBase[] cached = this.biomeCache.getCachedBiomes(x, z);
System.arraycopy(cached, 0, listToReuse, 0, width * length);
return listToReuse;
}
int[] zoomed = zoomedBiomes.getInts(x, z, width, length);
for (int i = 0; i < width * length; ++i)
{
if (zoomed[i] >= 0)
{
listToReuse[i] = BiomeGenBase.getBiome(zoomed[i]);
}
else
{
listToReuse[i] = BiomeGenBaseVenus.venusFlat;
}
}
return listToReuse;
}
@Override
public boolean areBiomesViable(int x, int z, int range, List<BiomeGenBase> viables)
{
int i = x - range >> 2;
int j = z - range >> 2;
int k = x + range >> 2;
int l = z + range >> 2;
int diffX = (k - i) + 1;
int diffZ = (l - j) + 1;
int[] unzoomed = this.unzoomedBiomes.getInts(i, j, diffX, diffZ);
for (int a = 0; a < diffX * diffZ; ++a)
{
BiomeGenBase biome = BiomeGenBase.getBiome(unzoomed[a]);
if (!viables.contains(biome))
{
return false;
}
}
return true;
}
@Override
public BlockPos findBiomePosition(int x, int z, int range, List<BiomeGenBase> biomes, Random random)
{
int i = x - range >> 2;
int j = z - range >> 2;
int k = x + range >> 2;
int l = z + range >> 2;
int diffX = (k - i) + 1;
int diffZ = (l - j) + 1;
int[] unzoomed = this.unzoomedBiomes.getInts(i, j, diffX, diffZ);
BlockPos blockPos = null;
int count = 0;
for (int a = 0; a < unzoomed.length; ++a)
{
int x0 = i + a % diffX << 2;
int z0 = j + a / diffX << 2;
BiomeGenBase biome = BiomeGenBase.getBiome(unzoomed[a]);
if (biomes.contains(biome) && (blockPos == null || random.nextInt(count + 1) == 0))
{
blockPos = new BlockPos(x0, 0, z0);
count++;
}
}
return blockPos;
}
@Override
public void cleanupCache()
{
this.biomeCache.cleanupCache();
}
}