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 008 @SideOnly(Side.CLIENT) 009 public class ChunkProviderClient implements IChunkProvider 010 { 011 /** 012 * The completely empty chunk used by ChunkProviderClient when chunkMapping doesn't contain the requested 013 * coordinates. 014 */ 015 private Chunk blankChunk; 016 017 /** 018 * The mapping between ChunkCoordinates and Chunks that ChunkProviderClient maintains. 019 */ 020 private LongHashMap chunkMapping = new LongHashMap(); 021 022 /** 023 * This may have been intended to be an iterable version of all currently loaded chunks (MultiplayerChunkCache), 024 * with identical contents to chunkMapping's values. However it is never actually added to. 025 */ 026 private List chunkListing = new ArrayList(); 027 028 /** Reference to the World object. */ 029 private World worldObj; 030 031 public ChunkProviderClient(World par1World) 032 { 033 this.blankChunk = new EmptyChunk(par1World, 0, 0); 034 this.worldObj = par1World; 035 } 036 037 /** 038 * Checks to see if a chunk exists at x, y 039 */ 040 public boolean chunkExists(int par1, int par2) 041 { 042 return true; 043 } 044 045 /** 046 * Unload chunk from ChunkProviderClient's hashmap. Called in response to a Packet50PreChunk with its mode field set 047 * to false 048 */ 049 public void unloadChunk(int par1, int par2) 050 { 051 Chunk var3 = this.provideChunk(par1, par2); 052 053 if (!var3.isEmpty()) 054 { 055 var3.onChunkUnload(); 056 } 057 058 this.chunkMapping.remove(ChunkCoordIntPair.chunkXZ2Int(par1, par2)); 059 this.chunkListing.remove(var3); 060 } 061 062 /** 063 * loads or generates the chunk at the chunk location specified 064 */ 065 public Chunk loadChunk(int par1, int par2) 066 { 067 Chunk var3 = new Chunk(this.worldObj, par1, par2); 068 this.chunkMapping.add(ChunkCoordIntPair.chunkXZ2Int(par1, par2), var3); 069 var3.isChunkLoaded = true; 070 return var3; 071 } 072 073 /** 074 * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the 075 * specified chunk from the map seed and chunk seed 076 */ 077 public Chunk provideChunk(int par1, int par2) 078 { 079 Chunk var3 = (Chunk)this.chunkMapping.getValueByKey(ChunkCoordIntPair.chunkXZ2Int(par1, par2)); 080 return var3 == null ? this.blankChunk : var3; 081 } 082 083 /** 084 * Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks. 085 * Return true if all chunks have been saved. 086 */ 087 public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate) 088 { 089 return true; 090 } 091 092 /** 093 * Unloads the 100 oldest chunks from memory, due to a bug with chunkSet.add() never being called it thinks the list 094 * is always empty and will not remove any chunks. 095 */ 096 public boolean unload100OldestChunks() 097 { 098 return false; 099 } 100 101 /** 102 * Returns if the IChunkProvider supports saving. 103 */ 104 public boolean canSave() 105 { 106 return false; 107 } 108 109 /** 110 * Populates chunk with ores etc etc 111 */ 112 public void populate(IChunkProvider par1IChunkProvider, int par2, int par3) {} 113 114 /** 115 * Converts the instance data to a readable string. 116 */ 117 public String makeString() 118 { 119 return "MultiplayerChunkCache: " + this.chunkMapping.getNumHashElements(); 120 } 121 122 /** 123 * Returns a list of creatures of the specified type that can spawn at the given location. 124 */ 125 public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4) 126 { 127 return null; 128 } 129 130 /** 131 * Returns the location of the closest structure of the specified type. If not found returns null. 132 */ 133 public ChunkPosition findClosestStructure(World par1World, String par2Str, int par3, int par4, int par5) 134 { 135 return null; 136 } 137 138 public int getLoadedChunkCount() 139 { 140 return this.chunkListing.size(); 141 } 142 143 public void recreateStructures(int par1, int par2) {} 144 }