package zmaster587.advancedRocketry.world; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; import java.util.logging.Logger; import cpw.mods.fml.relauncher.ReflectionHelper; import zmaster587.advancedRocketry.AdvancedRocketry; import zmaster587.advancedRocketry.api.AdvancedRocketryBiomes; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.dimension.DimensionProperties; import zmaster587.advancedRocketry.world.gen.BiomeCacheExtended; import zmaster587.advancedRocketry.world.gen.GenLayerHillsExtended; import zmaster587.advancedRocketry.world.gen.GenLayerVoronoiExtended; import zmaster587.advancedRocketry.world.type.WorldTypePlanetGen; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.util.LongHashMap; import net.minecraft.util.ReportedException; 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.GenLayerAddIsland; import net.minecraft.world.gen.layer.GenLayerAddMushroomIsland; import net.minecraft.world.gen.layer.GenLayerAddSnow; import net.minecraft.world.gen.layer.GenLayerDeepOcean; import net.minecraft.world.gen.layer.GenLayerEdge; import net.minecraft.world.gen.layer.GenLayerFuzzyZoom; import net.minecraft.world.gen.layer.GenLayerHills; import net.minecraft.world.gen.layer.GenLayerIsland; import net.minecraft.world.gen.layer.GenLayerRareBiome; import net.minecraft.world.gen.layer.GenLayerRemoveTooMuchOcean; import net.minecraft.world.gen.layer.GenLayerRiver; import net.minecraft.world.gen.layer.GenLayerRiverInit; import net.minecraft.world.gen.layer.GenLayerRiverMix; import net.minecraft.world.gen.layer.GenLayerSmooth; import net.minecraft.world.gen.layer.GenLayerVoronoiZoom; import net.minecraft.world.gen.layer.GenLayerZoom; import net.minecraft.world.gen.layer.IntCache; import net.minecraftforge.common.BiomeManager.BiomeEntry; public class ChunkManagerPlanet extends WorldChunkManager { //TODO: make higher biome ids work /** A GenLayer containing the indices into BiomeGenBase.biomeList[] */ private GenLayer biomeIndexLayer; private BiomeCache biomeCache; private GenLayer genBiomes; private List<BiomeEntry> biomes; private static Field fBiomeCacheMap; private static Field fBiomeCache; public ChunkManagerPlanet(long seed, WorldType default1, DimensionProperties properties) { this.biomeCache = new BiomeCache(this);//new BiomeCacheExtended(this); //TODO: more biomes //TODO: remove rivers GenLayer[] agenlayer = initializeAllBiomeGenerators(seed, default1, properties);//GenLayer.initializeAllBiomeGenerators(seed, default1); //; agenlayer = getModdedBiomeGenerators(default1, seed, agenlayer); this.genBiomes = agenlayer[0]; this.biomeIndexLayer = agenlayer[1]; fBiomeCache = ReflectionHelper.findField(BiomeCache.class, "cache", "field_76841_d"); fBiomeCache.setAccessible(true); fBiomeCacheMap = ReflectionHelper.findField(BiomeCache.class, "cacheMap", "field_76843_c"); fBiomeCacheMap.setAccessible(true); } public ChunkManagerPlanet(World world, List biomes) { this(world.getSeed(), (WorldTypePlanetGen)world.getWorldInfo().getTerrainType(), DimensionManager.getInstance().getDimensionProperties(world.provider.dimensionId)); //Note: world MUST BE REGISTERED WITH THE DIMENSION MANAGER //This is a mess! this.biomes = biomes; } /** * the first array item is a linked list of the bioms, the second is the zoom function, the third is the same as the * first. */ public static GenLayer[] initializeAllBiomeGenerators(long seed, WorldType type, DimensionProperties properties) { boolean flag = false; boolean hasRivers = properties.hasRivers(); GenLayerIsland genlayerisland = new GenLayerIsland(1L); GenLayerFuzzyZoom genlayerfuzzyzoom = new GenLayerFuzzyZoom(2000L, genlayerisland); GenLayerAddIsland genlayeraddisland = new GenLayerAddIsland(1L, genlayerfuzzyzoom); GenLayerZoom genlayerzoom = new GenLayerZoom(2001L, genlayeraddisland); genlayeraddisland = new GenLayerAddIsland(2L, genlayerzoom); genlayeraddisland = new GenLayerAddIsland(50L, genlayeraddisland); genlayeraddisland = new GenLayerAddIsland(70L, genlayeraddisland); GenLayerRemoveTooMuchOcean genlayerremovetoomuchocean = new GenLayerRemoveTooMuchOcean(2L, genlayeraddisland); GenLayerAddSnow genlayeraddsnow = new GenLayerAddSnow(2L, genlayerremovetoomuchocean); genlayeraddisland = new GenLayerAddIsland(3L, genlayeraddsnow); GenLayerEdge genlayeredge = new GenLayerEdge(2L, genlayeraddisland, GenLayerEdge.Mode.COOL_WARM); genlayeredge = new GenLayerEdge(2L, genlayeredge, GenLayerEdge.Mode.HEAT_ICE); genlayeredge = new GenLayerEdge(3L, genlayeredge, GenLayerEdge.Mode.SPECIAL); genlayerzoom = new GenLayerZoom(2002L, genlayeredge); genlayerzoom = new GenLayerZoom(2003L, genlayerzoom); genlayeraddisland = new GenLayerAddIsland(4L, genlayerzoom); GenLayerAddMushroomIsland genlayeraddmushroomisland = new GenLayerAddMushroomIsland(5L, genlayeraddisland); GenLayerDeepOcean genlayerdeepocean = new GenLayerDeepOcean(4L, genlayeraddmushroomisland); GenLayer genlayer2 = GenLayerZoom.magnify(1000L, genlayerdeepocean, 0); byte b0 = 4; if (type == WorldType.LARGE_BIOMES) { b0 = 6; } if (flag) { b0 = 4; } b0 = GenLayer.getModdedBiomeSize(type, b0); GenLayer genlayer = GenLayerZoom.magnify(1000L, genlayer2, 0); Object object = type.getBiomeLayer(seed, genlayer2); GenLayer genlayer1; if(hasRivers) { GenLayerRiverInit genlayerriverinit = new GenLayerRiverInit(100L, genlayer); genlayer1 = GenLayerZoom.magnify(1000L, genlayerriverinit, 2); genlayer = GenLayerZoom.magnify(1000L, genlayerriverinit, 2); } else genlayer1 = genlayer; GenLayerHillsExtended genlayerhills = new GenLayerHillsExtended(1000L, (GenLayer)object, genlayer1); genlayer = GenLayerZoom.magnify(1000L, genlayer, b0); GenLayerSmooth genlayersmooth; if(hasRivers) { GenLayerRiver genlayerriver = new GenLayerRiver(1L, genlayer); genlayersmooth = new GenLayerSmooth(1000L, genlayerriver); } else genlayersmooth = new GenLayerSmooth(1000L, genlayer); object = new GenLayerRareBiome(1001L, genlayerhills); for (int j = 0; j < b0; ++j) { object = new GenLayerZoom((long)(1000 + j), (GenLayer)object); if (j == 0) { object = new GenLayerAddIsland(3L, (GenLayer)object); } if (j == 1) { object = new zmaster587.advancedRocketry.world.gen.GenLayerShoreExtended(1000L, (GenLayer)object); } } GenLayerSmooth genlayersmooth1 = new GenLayerSmooth(1000L, (GenLayer)object); GenLayerVoronoiExtended genlayervoronoizoom; if(hasRivers) { GenLayerRiverMix genlayerrivermix = new GenLayerRiverMix(100L, genlayersmooth1, genlayersmooth); genlayervoronoizoom = new GenLayerVoronoiExtended(10L, genlayerrivermix); genlayerrivermix.initWorldGenSeed(seed); genlayer = genlayerrivermix; } else genlayer = genlayervoronoizoom = new GenLayerVoronoiExtended(10L, genlayersmooth1); genlayervoronoizoom.initWorldGenSeed(seed); return new GenLayer[] {genlayer, genlayervoronoizoom, genlayer}; } //Overridden for MOAR BIOMES! /** * Returns a list of rainfall values for the specified blocks. Args: listToReuse, x, z, width, length. */ @Override 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[] aint = this.biomeIndexLayer.getInts(p_76936_2_, p_76936_3_, p_76936_4_, p_76936_5_); for (int i1 = 0; i1 < p_76936_4_ * p_76936_5_; ++i1) { try { BiomeGenBase biome = AdvancedRocketryBiomes.instance.getBiomeById(aint[i1]); //TODO: debug if(biome == null) System.out.println("shit"); float f = (float)biome.getIntRainfall() / 65536.0F; if (f > 1.0F) { f = 1.0F; } p_76936_1_[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(p_76936_1_.length)); crashreportcategory.addCrashSection("x", Integer.valueOf(p_76936_2_)); crashreportcategory.addCrashSection("z", Integer.valueOf(p_76936_3_)); crashreportcategory.addCrashSection("w", Integer.valueOf(p_76936_4_)); crashreportcategory.addCrashSection("h", Integer.valueOf(p_76936_5_)); throw new ReportedException(crashreport); } } return p_76936_1_; } /** * Returns an array of biomes for the location input. */ /** * Returns the BiomeGenBase related to the x, z position on the world. */ @Override public BiomeGenBase getBiomeGenAt(int p_76935_1_, int p_76935_2_) { return this.biomeCache.getBiomeGenAt(p_76935_1_, p_76935_2_); } public void resetCache() { try { fBiomeCacheMap.set(this.biomeCache, new LongHashMap()); ((List)fBiomeCache.get(this.biomeCache)).clear(); } catch (Exception e) { e.printStackTrace(); } } public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] p_76937_1_, int p_76937_2_, int p_76937_3_, int p_76937_4_, int p_76937_5_, DimensionProperties properties) { GenLayerBiomePlanet.setupBiomesForUse(biomes); //return super.getBiomesForGeneration(p_76937_1_, p_76937_2_, p_76937_3_, p_76937_4_, 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[] aint = this.genBiomes.getInts(p_76937_2_, p_76937_3_, p_76937_4_, p_76937_5_); try { for (int i1 = 0; i1 < p_76937_4_ * p_76937_5_; ++i1) { p_76937_1_[i1] = AdvancedRocketryBiomes.instance.getBiomeById(aint[i1]); } return p_76937_1_; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id"); CrashReportCategory crashreportcategory = crashreport.makeCategory("RawBiomeBlock"); crashreportcategory.addCrashSection("biomes[] size", Integer.valueOf(p_76937_1_.length)); crashreportcategory.addCrashSection("x", Integer.valueOf(p_76937_2_)); crashreportcategory.addCrashSection("z", Integer.valueOf(p_76937_3_)); crashreportcategory.addCrashSection("w", Integer.valueOf(p_76937_4_)); crashreportcategory.addCrashSection("h", Integer.valueOf(p_76937_5_)); throw new ReportedException(crashreport); } } @Override 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); } //TODO: make it allow more biomes later /** * 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) */ @Override public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] biomeGenBase, int x, int y, int width, int length, boolean p_76931_6_ ) { GenLayerBiomePlanet.setupBiomesForUse(biomes); //return super.getBiomeGenAt(biomeGenBase, x, y, width, length, p_76931_6_); IntCache.resetIntCache(); if (biomeGenBase == null || biomeGenBase.length < width * length) { biomeGenBase = new BiomeGenBase[width * length]; } if (p_76931_6_ && width == 16 && length == 16 && (x & 15) == 0 && (y & 15) == 0) { BiomeGenBase[] abiomegenbase1 = this.biomeCache.getCachedBiomes(x, y); System.arraycopy(abiomegenbase1, 0, biomeGenBase, 0, width * length); return biomeGenBase; } else { int[] aint = this.biomeIndexLayer.getInts(x, y, width, length); for (int i1 = 0; i1 < width * length; ++i1) { //TODO DEBUG: if(aint[i1] > 255) { System.out.println("s"); } biomeGenBase[i1] = AdvancedRocketryBiomes.instance.getBiomeById(aint[i1]); } return biomeGenBase; } } @Override public void cleanupCache() { super.cleanupCache(); this.biomeCache.cleanupCache(); } }