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