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