    001    package net.minecraft.world.gen.layer;
    002
    003    import net.minecraft.world.WorldType;
    004
    005    import net.minecraftforge.common.*;
    006    import net.minecraftforge.event.terraingen.*;
    007
    008    public abstract class GenLayer
    009    {
    010        /** seed from World#getWorldSeed that is used in the LCG prng */
    011        private long worldGenSeed;
    012
    013        /** parent GenLayer that was provided via the constructor */
    014        protected GenLayer parent;
    015
    016        /**
    017         * final part of the LCG prng that uses the chunk X, Z coords along with the other two seeds to generate
    018         * pseudorandom numbers
    019         */
    020        private long chunkSeed;
    021
    022        /** base seed to the LCG prng provided via the constructor */
    023        private long baseSeed;
    024
    025        /**
    026         * the first array item is a linked list of the bioms, the second is the zoom function, the third is the same as the
    027         * first.
    028         */
    029        public static GenLayer[] initializeAllBiomeGenerators(long par0, WorldType par2WorldType)
    030        {
    031            GenLayerIsland var3 = new GenLayerIsland(1L);
    032            GenLayerFuzzyZoom var9 = new GenLayerFuzzyZoom(2000L, var3);
    033            GenLayerAddIsland var10 = new GenLayerAddIsland(1L, var9);
    034            GenLayerZoom var11 = new GenLayerZoom(2001L, var10);
    035            var10 = new GenLayerAddIsland(2L, var11);
    036            GenLayerAddSnow var12 = new GenLayerAddSnow(2L, var10);
    037            var11 = new GenLayerZoom(2002L, var12);
    038            var10 = new GenLayerAddIsland(3L, var11);
    039            var11 = new GenLayerZoom(2003L, var10);
    040            var10 = new GenLayerAddIsland(4L, var11);
    041            GenLayerAddMushroomIsland var16 = new GenLayerAddMushroomIsland(5L, var10);
    042            byte var4 = 4;
    043
    044            if (par2WorldType == WorldType.LARGE_BIOMES)
    045            {
    046                var4 = 6;
    047            }
    048            var4 = getModdedBiomeSize(par2WorldType, var4);
    049
    050            GenLayer var5 = GenLayerZoom.func_75915_a(1000L, var16, 0);
    051            GenLayerRiverInit var13 = new GenLayerRiverInit(100L, var5);
    052            var5 = GenLayerZoom.func_75915_a(1000L, var13, var4 + 2);
    053            GenLayerRiver var14 = new GenLayerRiver(1L, var5);
    054            GenLayerSmooth var15 = new GenLayerSmooth(1000L, var14);
    055            GenLayer var6 = GenLayerZoom.func_75915_a(1000L, var16, 0);
    056            GenLayerBiome var17 = new GenLayerBiome(200L, var6, par2WorldType);
    057            var6 = GenLayerZoom.func_75915_a(1000L, var17, 2);
    058            Object var18 = new GenLayerHills(1000L, var6);
    059
    060            for (int var7 = 0; var7 < var4; ++var7)
    061            {
    062                var18 = new GenLayerZoom((long)(1000 + var7), (GenLayer)var18);
    063
    064                if (var7 == 0)
    065                {
    066                    var18 = new GenLayerAddIsland(3L, (GenLayer)var18);
    067                }
    068
    069                if (var7 == 1)
    070                {
    071                    var18 = new GenLayerShore(1000L, (GenLayer)var18);
    072                }
    073
    074                if (var7 == 1)
    075                {
    076                    var18 = new GenLayerSwampRivers(1000L, (GenLayer)var18);
    077                }
    078            }
    079
    080            GenLayerSmooth var19 = new GenLayerSmooth(1000L, (GenLayer)var18);
    081            GenLayerRiverMix var20 = new GenLayerRiverMix(100L, var19, var15);
    082            GenLayerVoronoiZoom var8 = new GenLayerVoronoiZoom(10L, var20);
    083            var20.initWorldGenSeed(par0);
    084            var8.initWorldGenSeed(par0);
    085            return new GenLayer[] {var20, var8, var20};
    086        }
    087
    088        public GenLayer(long par1)
    089        {
    090            this.baseSeed = par1;
    091            this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
    092            this.baseSeed += par1;
    093            this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
    094            this.baseSeed += par1;
    095            this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
    096            this.baseSeed += par1;
    097        }
    098
    099        /**
    100         * Initialize layer's local worldGenSeed based on its own baseSeed and the world's global seed (passed in as an
    101         * argument).
    102         */
    103        public void initWorldGenSeed(long par1)
    104        {
    105            this.worldGenSeed = par1;
    106
    107            if (this.parent != null)
    108            {
    109                this.parent.initWorldGenSeed(par1);
    110            }
    111
    112            this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
    113            this.worldGenSeed += this.baseSeed;
    114            this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
    115            this.worldGenSeed += this.baseSeed;
    116            this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
    117            this.worldGenSeed += this.baseSeed;
    118        }
    119
    120        /**
    121         * Initialize layer's current chunkSeed based on the local worldGenSeed and the (x,z) chunk coordinates.
    122         */
    123        public void initChunkSeed(long par1, long par3)
    124        {
    125            this.chunkSeed = this.worldGenSeed;
    126            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
    127            this.chunkSeed += par1;
    128            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
    129            this.chunkSeed += par3;
    130            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
    131            this.chunkSeed += par1;
    132            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
    133            this.chunkSeed += par3;
    134        }
    135
    136        /**
    137         * returns a LCG pseudo random number from [0, x). Args: int x
    138         */
    139        protected int nextInt(int par1)
    140        {
    141            int var2 = (int)((this.chunkSeed >> 24) % (long)par1);
    142
    143            if (var2 < 0)
    144            {
    145                var2 += par1;
    146            }
    147
    148            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
    149            this.chunkSeed += this.worldGenSeed;
    150            return var2;
    151        }
    152
    153        /**
    154         * Returns a list of integer values generated by this layer. These may be interpreted as temperatures, rainfall
    155         * amounts, or biomeList[] indices based on the particular GenLayer subclass.
    156         */
    157        public abstract int[] getInts(int var1, int var2, int var3, int var4);
    158
    159        public static byte getModdedBiomeSize(WorldType worldType, byte original)
    160        {
    161            WorldTypeEvent.BiomeSize event = new WorldTypeEvent.BiomeSize(worldType, original);
    162            MinecraftForge.TERRAIN_GEN_BUS.post(event);
    163            return event.newSize;
    164        }
    165    }