package net.minecraft.world.gen.layer; import net.minecraft.world.WorldType; import net.minecraftforge.common.*; import net.minecraftforge.event.terraingen.*; public abstract class GenLayer { /** seed from World#getWorldSeed that is used in the LCG prng */ private long worldGenSeed; /** parent GenLayer that was provided via the constructor */ protected GenLayer parent; /** * final part of the LCG prng that uses the chunk X, Z coords along with the other two seeds to generate * pseudorandom numbers */ private long chunkSeed; /** base seed to the LCG prng provided via the constructor */ private long baseSeed; /** * 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 par0, WorldType par2WorldType) { 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); GenLayerAddSnow genlayeraddsnow = new GenLayerAddSnow(2L, genlayeraddisland); genlayerzoom = new GenLayerZoom(2002L, genlayeraddsnow); genlayeraddisland = new GenLayerAddIsland(3L, genlayerzoom); genlayerzoom = new GenLayerZoom(2003L, genlayeraddisland); genlayeraddisland = new GenLayerAddIsland(4L, genlayerzoom); GenLayerAddMushroomIsland genlayeraddmushroomisland = new GenLayerAddMushroomIsland(5L, genlayeraddisland); byte b0 = 4; if (par2WorldType == WorldType.LARGE_BIOMES) { b0 = 6; } b0 = getModdedBiomeSize(par2WorldType, b0); GenLayer genlayer = GenLayerZoom.magnify(1000L, genlayeraddmushroomisland, 0); GenLayerRiverInit genlayerriverinit = new GenLayerRiverInit(100L, genlayer); genlayer = GenLayerZoom.magnify(1000L, genlayerriverinit, b0 + 2); GenLayerRiver genlayerriver = new GenLayerRiver(1L, genlayer); GenLayerSmooth genlayersmooth = new GenLayerSmooth(1000L, genlayerriver); GenLayer genlayer1 = GenLayerZoom.magnify(1000L, genlayeraddmushroomisland, 0); GenLayerBiome genlayerbiome = new GenLayerBiome(200L, genlayer1, par2WorldType); genlayer1 = GenLayerZoom.magnify(1000L, genlayerbiome, 2); Object object = new GenLayerHills(1000L, genlayer1); 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 GenLayerShore(1000L, (GenLayer)object); } if (j == 1) { object = new GenLayerSwampRivers(1000L, (GenLayer)object); } } GenLayerSmooth genlayersmooth1 = new GenLayerSmooth(1000L, (GenLayer)object); GenLayerRiverMix genlayerrivermix = new GenLayerRiverMix(100L, genlayersmooth1, genlayersmooth); GenLayerVoronoiZoom genlayervoronoizoom = new GenLayerVoronoiZoom(10L, genlayerrivermix); genlayerrivermix.initWorldGenSeed(par0); genlayervoronoizoom.initWorldGenSeed(par0); return new GenLayer[] {genlayerrivermix, genlayervoronoizoom, genlayerrivermix}; } public GenLayer(long par1) { this.baseSeed = par1; this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L; this.baseSeed += par1; this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L; this.baseSeed += par1; this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L; this.baseSeed += par1; } /** * Initialize layer's local worldGenSeed based on its own baseSeed and the world's global seed (passed in as an * argument). */ public void initWorldGenSeed(long par1) { this.worldGenSeed = par1; if (this.parent != null) { this.parent.initWorldGenSeed(par1); } this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L; this.worldGenSeed += this.baseSeed; this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L; this.worldGenSeed += this.baseSeed; this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L; this.worldGenSeed += this.baseSeed; } /** * Initialize layer's current chunkSeed based on the local worldGenSeed and the (x,z) chunk coordinates. */ public void initChunkSeed(long par1, long par3) { this.chunkSeed = this.worldGenSeed; this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed += par1; this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed += par3; this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed += par1; this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed += par3; } /** * returns a LCG pseudo random number from [0, x). Args: int x */ protected int nextInt(int par1) { int j = (int)((this.chunkSeed >> 24) % (long)par1); if (j < 0) { j += par1; } this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L; this.chunkSeed += this.worldGenSeed; return j; } /** * Returns a list of integer values generated by this layer. These may be interpreted as temperatures, rainfall * amounts, or biomeList[] indices based on the particular GenLayer subclass. */ public abstract int[] getInts(int i, int j, int k, int l); public static byte getModdedBiomeSize(WorldType worldType, byte original) { WorldTypeEvent.BiomeSize event = new WorldTypeEvent.BiomeSize(worldType, original); MinecraftForge.TERRAIN_GEN_BUS.post(event); return event.newSize; } }