001 package net.minecraft.src;
002
003 import cpw.mods.fml.common.Side;
004 import cpw.mods.fml.common.asm.SideOnly;
005 import java.util.ArrayList;
006 import java.util.Arrays;
007 import java.util.List;
008 import java.util.Random;
009 import static net.minecraft.src.BiomeGenBase.*;
010
011 public class WorldChunkManager
012 {
013 public static ArrayList<BiomeGenBase> allowedBiomes = new ArrayList<BiomeGenBase>(Arrays.asList(forest, plains, taiga, taigaHills, forestHills, jungle. jungleHills));
014 private GenLayer genBiomes;
015
016 /** A GenLayer containing the indices into BiomeGenBase.biomeList[] */
017 private GenLayer biomeIndexLayer;
018
019 /** The BiomeCache object for this world. */
020 private BiomeCache biomeCache;
021
022 /** A list of biomes that the player can spawn in. */
023 private List biomesToSpawnIn;
024
025 protected WorldChunkManager()
026 {
027 this.biomeCache = new BiomeCache(this);
028 this.biomesToSpawnIn = new ArrayList();
029 this.biomesToSpawnIn.addAll(allowedBiomes);
030 }
031
032 public WorldChunkManager(long par1, WorldType par3WorldType)
033 {
034 this();
035 GenLayer[] var4 = GenLayer.initializeAllBiomeGenerators(par1, par3WorldType);
036 this.genBiomes = var4[0];
037 this.biomeIndexLayer = var4[1];
038 }
039
040 public WorldChunkManager(World par1World)
041 {
042 this(par1World.getSeed(), par1World.getWorldInfo().getTerrainType());
043 }
044
045 /**
046 * Gets the list of valid biomes for the player to spawn in.
047 */
048 public List getBiomesToSpawnIn()
049 {
050 return this.biomesToSpawnIn;
051 }
052
053 /**
054 * Returns the BiomeGenBase related to the x, z position on the world.
055 */
056 public BiomeGenBase getBiomeGenAt(int par1, int par2)
057 {
058 return this.biomeCache.getBiomeGenAt(par1, par2);
059 }
060
061 /**
062 * Returns a list of rainfall values for the specified blocks. Args: listToReuse, x, z, width, length.
063 */
064 public float[] getRainfall(float[] par1ArrayOfFloat, int par2, int par3, int par4, int par5)
065 {
066 IntCache.resetIntCache();
067
068 if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5)
069 {
070 par1ArrayOfFloat = new float[par4 * par5];
071 }
072
073 int[] var6 = this.biomeIndexLayer.getInts(par2, par3, par4, par5);
074
075 for (int var7 = 0; var7 < par4 * par5; ++var7)
076 {
077 float var8 = (float)BiomeGenBase.biomeList[var6[var7]].getIntRainfall() / 65536.0F;
078
079 if (var8 > 1.0F)
080 {
081 var8 = 1.0F;
082 }
083
084 par1ArrayOfFloat[var7] = var8;
085 }
086
087 return par1ArrayOfFloat;
088 }
089
090 @SideOnly(Side.CLIENT)
091
092 /**
093 * Return an adjusted version of a given temperature based on the y height
094 */
095 public float getTemperatureAtHeight(float par1, int par2)
096 {
097 return par1;
098 }
099
100 /**
101 * Returns a list of temperatures to use for the specified blocks. Args: listToReuse, x, y, width, length
102 */
103 public float[] getTemperatures(float[] par1ArrayOfFloat, int par2, int par3, int par4, int par5)
104 {
105 IntCache.resetIntCache();
106
107 if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5)
108 {
109 par1ArrayOfFloat = new float[par4 * par5];
110 }
111
112 int[] var6 = this.biomeIndexLayer.getInts(par2, par3, par4, par5);
113
114 for (int var7 = 0; var7 < par4 * par5; ++var7)
115 {
116 float var8 = (float)BiomeGenBase.biomeList[var6[var7]].getIntTemperature() / 65536.0F;
117
118 if (var8 > 1.0F)
119 {
120 var8 = 1.0F;
121 }
122
123 par1ArrayOfFloat[var7] = var8;
124 }
125
126 return par1ArrayOfFloat;
127 }
128
129 /**
130 * Returns an array of biomes for the location input.
131 */
132 public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5)
133 {
134 IntCache.resetIntCache();
135
136 if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5)
137 {
138 par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
139 }
140
141 int[] var6 = this.genBiomes.getInts(par2, par3, par4, par5);
142
143 for (int var7 = 0; var7 < par4 * par5; ++var7)
144 {
145 par1ArrayOfBiomeGenBase[var7] = BiomeGenBase.biomeList[var6[var7]];
146 }
147
148 return par1ArrayOfBiomeGenBase;
149 }
150
151 /**
152 * Returns biomes to use for the blocks and loads the other data like temperature and humidity onto the
153 * WorldChunkManager Args: oldBiomeList, x, z, width, depth
154 */
155 public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5)
156 {
157 return this.getBiomeGenAt(par1ArrayOfBiomeGenBase, par2, par3, par4, par5, true);
158 }
159
160 /**
161 * Return a list of biomes for the specified blocks. Args: listToReuse, x, y, width, length, cacheFlag (if false,
162 * don't check biomeCache to avoid infinite loop in BiomeCacheBlock)
163 */
164 public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5, boolean par6)
165 {
166 IntCache.resetIntCache();
167
168 if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5)
169 {
170 par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
171 }
172
173 if (par6 && par4 == 16 && par5 == 16 && (par2 & 15) == 0 && (par3 & 15) == 0)
174 {
175 BiomeGenBase[] var9 = this.biomeCache.getCachedBiomes(par2, par3);
176 System.arraycopy(var9, 0, par1ArrayOfBiomeGenBase, 0, par4 * par5);
177 return par1ArrayOfBiomeGenBase;
178 }
179 else
180 {
181 int[] var7 = this.biomeIndexLayer.getInts(par2, par3, par4, par5);
182
183 for (int var8 = 0; var8 < par4 * par5; ++var8)
184 {
185 par1ArrayOfBiomeGenBase[var8] = BiomeGenBase.biomeList[var7[var8]];
186 }
187
188 return par1ArrayOfBiomeGenBase;
189 }
190 }
191
192 /**
193 * checks given Chunk's Biomes against List of allowed ones
194 */
195 public boolean areBiomesViable(int par1, int par2, int par3, List par4List)
196 {
197 IntCache.resetIntCache();
198 int var5 = par1 - par3 >> 2;
199 int var6 = par2 - par3 >> 2;
200 int var7 = par1 + par3 >> 2;
201 int var8 = par2 + par3 >> 2;
202 int var9 = var7 - var5 + 1;
203 int var10 = var8 - var6 + 1;
204 int[] var11 = this.genBiomes.getInts(var5, var6, var9, var10);
205
206 for (int var12 = 0; var12 < var9 * var10; ++var12)
207 {
208 BiomeGenBase var13 = BiomeGenBase.biomeList[var11[var12]];
209
210 if (!par4List.contains(var13))
211 {
212 return false;
213 }
214 }
215
216 return true;
217 }
218
219 /**
220 * Finds a valid position within a range, that is in one of the listed biomes. Searches {par1,par2} +-par3 blocks.
221 * Strongly favors positive y positions.
222 */
223 public ChunkPosition findBiomePosition(int par1, int par2, int par3, List par4List, Random par5Random)
224 {
225 IntCache.resetIntCache();
226 int var6 = par1 - par3 >> 2;
227 int var7 = par2 - par3 >> 2;
228 int var8 = par1 + par3 >> 2;
229 int var9 = par2 + par3 >> 2;
230 int var10 = var8 - var6 + 1;
231 int var11 = var9 - var7 + 1;
232 int[] var12 = this.genBiomes.getInts(var6, var7, var10, var11);
233 ChunkPosition var13 = null;
234 int var14 = 0;
235
236 for (int var15 = 0; var15 < var10 * var11; ++var15)
237 {
238 int var16 = var6 + var15 % var10 << 2;
239 int var17 = var7 + var15 / var10 << 2;
240 BiomeGenBase var18 = BiomeGenBase.biomeList[var12[var15]];
241
242 if (par4List.contains(var18) && (var13 == null || par5Random.nextInt(var14 + 1) == 0))
243 {
244 var13 = new ChunkPosition(var16, 0, var17);
245 ++var14;
246 }
247 }
248
249 return var13;
250 }
251
252 /**
253 * Calls the WorldChunkManager's biomeCache.cleanupCache()
254 */
255 public void cleanupCache()
256 {
257 this.biomeCache.cleanupCache();
258 }
259 }