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