001 package net.minecraft.src; 002 003 import java.util.ArrayList; 004 import java.util.Iterator; 005 import java.util.List; 006 import java.util.Map; 007 import java.util.Random; 008 009 public class ChunkProviderFlat implements IChunkProvider 010 { 011 private World worldObj; 012 private Random random; 013 private final byte[] field_82700_c = new byte[256]; 014 private final byte[] field_82698_d = new byte[256]; 015 private final FlatGeneratorInfo field_82699_e; 016 private final List field_82696_f = new ArrayList(); 017 private final boolean field_82697_g; 018 private final boolean field_82702_h; 019 private WorldGenLakes field_82703_i; 020 private WorldGenLakes field_82701_j; 021 022 public ChunkProviderFlat(World par1World, long par2, boolean par4, String par5Str) 023 { 024 this.worldObj = par1World; 025 this.random = new Random(par2); 026 this.field_82699_e = FlatGeneratorInfo.func_82651_a(par5Str); 027 028 if (par4) 029 { 030 Map var6 = this.field_82699_e.getWorldFeatures(); 031 032 if (var6.containsKey("village")) 033 { 034 Map var7 = (Map)var6.get("village"); 035 036 if (!var7.containsKey("size")) 037 { 038 var7.put("size", "1"); 039 } 040 041 this.field_82696_f.add(new MapGenVillage(var7)); 042 } 043 044 if (var6.containsKey("biome_1")) 045 { 046 this.field_82696_f.add(new MapGenScatteredFeature((Map)var6.get("biome_1"))); 047 } 048 049 if (var6.containsKey("mineshaft")) 050 { 051 this.field_82696_f.add(new MapGenMineshaft((Map)var6.get("mineshaft"))); 052 } 053 054 if (var6.containsKey("stronghold")) 055 { 056 this.field_82696_f.add(new MapGenStronghold((Map)var6.get("stronghold"))); 057 } 058 } 059 060 this.field_82697_g = this.field_82699_e.getWorldFeatures().containsKey("decoration"); 061 062 if (this.field_82699_e.getWorldFeatures().containsKey("lake")) 063 { 064 this.field_82703_i = new WorldGenLakes(Block.waterStill.blockID); 065 } 066 067 if (this.field_82699_e.getWorldFeatures().containsKey("lava_lake")) 068 { 069 this.field_82701_j = new WorldGenLakes(Block.lavaStill.blockID); 070 } 071 072 this.field_82702_h = this.field_82699_e.getWorldFeatures().containsKey("dungeon"); 073 Iterator var9 = this.field_82699_e.getFlatLayers().iterator(); 074 075 while (var9.hasNext()) 076 { 077 FlatLayerInfo var10 = (FlatLayerInfo)var9.next(); 078 079 for (int var8 = var10.getMinY(); var8 < var10.getMinY() + var10.getLayerCount(); ++var8) 080 { 081 this.field_82700_c[var8] = (byte)(var10.getFillBlock() & 255); 082 this.field_82698_d[var8] = (byte)var10.getFillBlockMeta(); 083 } 084 } 085 } 086 087 /** 088 * loads or generates the chunk at the chunk location specified 089 */ 090 public Chunk loadChunk(int par1, int par2) 091 { 092 return this.provideChunk(par1, par2); 093 } 094 095 /** 096 * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the 097 * specified chunk from the map seed and chunk seed 098 */ 099 public Chunk provideChunk(int par1, int par2) 100 { 101 Chunk var3 = new Chunk(this.worldObj, par1, par2); 102 103 for (int var4 = 0; var4 < this.field_82700_c.length; ++var4) 104 { 105 int var5 = var4 >> 4; 106 ExtendedBlockStorage var6 = var3.getBlockStorageArray()[var5]; 107 108 if (var6 == null) 109 { 110 var6 = new ExtendedBlockStorage(var4); 111 var3.getBlockStorageArray()[var5] = var6; 112 } 113 114 for (int var7 = 0; var7 < 16; ++var7) 115 { 116 for (int var8 = 0; var8 < 16; ++var8) 117 { 118 var6.setExtBlockID(var7, var4 & 15, var8, this.field_82700_c[var4] & 255); 119 var6.setExtBlockMetadata(var7, var4 & 15, var8, this.field_82698_d[var4]); 120 } 121 } 122 } 123 124 var3.generateSkylightMap(); 125 BiomeGenBase[] var9 = this.worldObj.getWorldChunkManager().loadBlockGeneratorData((BiomeGenBase[])null, par1 * 16, par2 * 16, 16, 16); 126 byte[] var10 = var3.getBiomeArray(); 127 128 for (int var11 = 0; var11 < var10.length; ++var11) 129 { 130 var10[var11] = (byte)var9[var11].biomeID; 131 } 132 133 Iterator var12 = this.field_82696_f.iterator(); 134 135 while (var12.hasNext()) 136 { 137 MapGenStructure var13 = (MapGenStructure)var12.next(); 138 var13.generate(this, this.worldObj, par1, par2, (byte[])null); 139 } 140 141 var3.generateSkylightMap(); 142 return var3; 143 } 144 145 /** 146 * Checks to see if a chunk exists at x, y 147 */ 148 public boolean chunkExists(int par1, int par2) 149 { 150 return true; 151 } 152 153 /** 154 * Populates chunk with ores etc etc 155 */ 156 public void populate(IChunkProvider par1IChunkProvider, int par2, int par3) 157 { 158 int var4 = par2 * 16; 159 int var5 = par3 * 16; 160 BiomeGenBase var6 = this.worldObj.getBiomeGenForCoords(var4 + 16, var5 + 16); 161 boolean var7 = false; 162 this.random.setSeed(this.worldObj.getSeed()); 163 long var8 = this.random.nextLong() / 2L * 2L + 1L; 164 long var10 = this.random.nextLong() / 2L * 2L + 1L; 165 this.random.setSeed((long)par2 * var8 + (long)par3 * var10 ^ this.worldObj.getSeed()); 166 Iterator var12 = this.field_82696_f.iterator(); 167 168 while (var12.hasNext()) 169 { 170 MapGenStructure var13 = (MapGenStructure)var12.next(); 171 boolean var14 = var13.generateStructuresInChunk(this.worldObj, this.random, par2, par3); 172 173 if (var13 instanceof MapGenVillage) 174 { 175 var7 |= var14; 176 } 177 } 178 179 int var17; 180 int var16; 181 int var18; 182 183 if (this.field_82703_i != null && !var7 && this.random.nextInt(4) == 0) 184 { 185 var16 = var4 + this.random.nextInt(16) + 8; 186 var17 = this.random.nextInt(128); 187 var18 = var5 + this.random.nextInt(16) + 8; 188 this.field_82703_i.generate(this.worldObj, this.random, var16, var17, var18); 189 } 190 191 if (this.field_82701_j != null && !var7 && this.random.nextInt(8) == 0) 192 { 193 var16 = var4 + this.random.nextInt(16) + 8; 194 var17 = this.random.nextInt(this.random.nextInt(120) + 8); 195 var18 = var5 + this.random.nextInt(16) + 8; 196 197 if (var17 < 63 || this.random.nextInt(10) == 0) 198 { 199 this.field_82701_j.generate(this.worldObj, this.random, var16, var17, var18); 200 } 201 } 202 203 if (this.field_82702_h) 204 { 205 for (var16 = 0; var16 < 8; ++var16) 206 { 207 var17 = var4 + this.random.nextInt(16) + 8; 208 var18 = this.random.nextInt(128); 209 int var15 = var5 + this.random.nextInt(16) + 8; 210 (new WorldGenDungeons()).generate(this.worldObj, this.random, var17, var18, var15); 211 } 212 } 213 214 if (this.field_82697_g) 215 { 216 var6.decorate(this.worldObj, this.random, var4, var5); 217 } 218 } 219 220 /** 221 * Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks. 222 * Return true if all chunks have been saved. 223 */ 224 public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate) 225 { 226 return true; 227 } 228 229 /** 230 * Unloads the 100 oldest chunks from memory, due to a bug with chunkSet.add() never being called it thinks the list 231 * is always empty and will not remove any chunks. 232 */ 233 public boolean unload100OldestChunks() 234 { 235 return false; 236 } 237 238 /** 239 * Returns if the IChunkProvider supports saving. 240 */ 241 public boolean canSave() 242 { 243 return true; 244 } 245 246 /** 247 * Converts the instance data to a readable string. 248 */ 249 public String makeString() 250 { 251 return "FlatLevelSource"; 252 } 253 254 /** 255 * Returns a list of creatures of the specified type that can spawn at the given location. 256 */ 257 public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4) 258 { 259 BiomeGenBase var5 = this.worldObj.getBiomeGenForCoords(par2, par4); 260 return var5 == null ? null : var5.getSpawnableList(par1EnumCreatureType); 261 } 262 263 /** 264 * Returns the location of the closest structure of the specified type. If not found returns null. 265 */ 266 public ChunkPosition findClosestStructure(World par1World, String par2Str, int par3, int par4, int par5) 267 { 268 if ("Stronghold".equals(par2Str)) 269 { 270 Iterator var6 = this.field_82696_f.iterator(); 271 272 while (var6.hasNext()) 273 { 274 MapGenStructure var7 = (MapGenStructure)var6.next(); 275 276 if (var7 instanceof MapGenStronghold) 277 { 278 return var7.getNearestInstance(par1World, par3, par4, par5); 279 } 280 } 281 } 282 283 return null; 284 } 285 286 public int getLoadedChunkCount() 287 { 288 return 0; 289 } 290 291 public void func_82695_e(int par1, int par2) 292 { 293 Iterator var3 = this.field_82696_f.iterator(); 294 295 while (var3.hasNext()) 296 { 297 MapGenStructure var4 = (MapGenStructure)var3.next(); 298 var4.generate(this, this.worldObj, par1, par2, (byte[])null); 299 } 300 } 301 }