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    }