/******************************************************************************* * AbyssalCraft * Copyright (c) 2012 - 2017 Shinoow. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-3.0.txt * * Contributors: * Shinoow - implementation ******************************************************************************/ package com.shinoow.abyssalcraft.common.world; import java.util.ArrayList; import java.util.List; import java.util.Random; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.WorldType; import net.minecraft.world.biome.BiomeCache; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeProvider; 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 com.shinoow.abyssalcraft.api.biome.ACBiomes; import com.shinoow.abyssalcraft.common.world.gen.layer.GenLayerDL; public class BiomeProviderDreadlands extends BiomeProvider { private GenLayer biomeToUse; private GenLayer biomeIndexLayer; private BiomeCache biomeCache; private List<Biome> biomesToSpawnIn; public BiomeProviderDreadlands() { biomeCache = new BiomeCache(this); biomesToSpawnIn = new ArrayList<Biome>(); biomesToSpawnIn.add(ACBiomes.dreadlands); biomesToSpawnIn.add(ACBiomes.purified_dreadlands); biomesToSpawnIn.add(ACBiomes.dreadlands_forest); biomesToSpawnIn.add(ACBiomes.dreadlands_mountains); } public BiomeProviderDreadlands(long par1, WorldType par3WorldType) { this(); GenLayer[] agenlayer = GenLayerDL.makeTheWorld(par1); biomeToUse = agenlayer[0]; biomeIndexLayer = agenlayer[1]; } public BiomeProviderDreadlands(World par1world) { this(par1world.getSeed(), par1world.getWorldInfo().getTerrainType()); } @Override public List<Biome> getBiomesToSpawnIn() { return biomesToSpawnIn; } @Override public Biome getBiome(BlockPos pos) { return this.getBiome(pos, (Biome)null); } @Override public Biome getBiome(BlockPos pos, Biome biomegen) { Biome biome = biomeCache.getBiome(pos.getX(), pos.getZ(), biomegen); if (biome == null) return ACBiomes.dreadlands; return biome; } @Override @SideOnly(Side.CLIENT) public float getTemperatureAtHeight(float par1, int par2) { return par1; } @Override public Biome[] getBiomesForGeneration(Biome[] par1ArrayOfBiome, int par2, int par3, int par4, int par5) { if (par1ArrayOfBiome == null || par1ArrayOfBiome.length < par4 * par5) par1ArrayOfBiome = new Biome[par4 * par5]; int[] aint = biomeToUse.getInts(par2, par3, par4, par5); for (int i = 0; i < par4 * par5; ++i) if (aint[i] >= 0 && aint[i] <= Biome.REGISTRY.getKeys().size()) par1ArrayOfBiome[i] = Biome.getBiome(aint[i]); else par1ArrayOfBiome[i] = ACBiomes.dreadlands; return par1ArrayOfBiome; } @Override public Biome[] getBiomes(Biome[] par1ArrayOfBiome, int par2, int par3, int par4, int par5) { return getBiomes(par1ArrayOfBiome, par2, par3, par4, par5, true); } @Override public Biome[] getBiomes(Biome[] par1ArrayOfBiome, int x, int y, int width, int length, boolean cacheFlag) { IntCache.resetIntCache(); if (par1ArrayOfBiome == null || par1ArrayOfBiome.length < width * length) par1ArrayOfBiome = new Biome[width * length]; if (cacheFlag && width == 16 && length == 16 && (x & 15) == 0 && (y & 15) == 0) { Biome[] aBiome1 = biomeCache.getCachedBiomes(x, y); System.arraycopy(aBiome1, 0, par1ArrayOfBiome, 0, width * length); return par1ArrayOfBiome; } else { int[] aint = biomeIndexLayer.getInts(x, y, width, length); for (int i = 0; i < width * length; ++i) if (aint[i] >= 0 && aint[i] <= Biome.REGISTRY.getKeys().size()) par1ArrayOfBiome[i] = Biome.getBiome(aint[i]); else par1ArrayOfBiome[i] = ACBiomes.dreadlands; return par1ArrayOfBiome; } } @Override @SuppressWarnings("rawtypes") 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 = biomeToUse.getInts(l, i1, l1, i2); for (int j2 = 0; j2 < l1 * i2; ++j2) { Biome biome = Biome.getBiome(aint[j2]); if (!par4List.contains(biome)) return false; } return true; } @Override @SuppressWarnings("rawtypes") public BlockPos 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 = biomeToUse.getInts(l, i1, l1, i2); BlockPos blockpos = null; int j2 = 0; for (int k2 = 0; k2 < l1 * i2; ++k2) { int l2 = l + k2 % l1 << 2; int i3 = i1 + k2 / l1 << 2; Biome biome = Biome.getBiome(aint[k2]); if (par4List.contains(biome) && (blockpos == null || par5Random.nextInt(j2 + 1) == 0)) { blockpos = new BlockPos(l2, 0, i3); ++j2; } } return blockpos; } @Override public void cleanupCache() { biomeCache.cleanupCache(); } }