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 }