001    package net.minecraft.world.biome;
002    
003    import java.util.ArrayList;
004    import java.util.List;
005    import net.minecraft.util.LongHashMap;
006    
007    public class BiomeCache
008    {
009        /** Reference to the WorldChunkManager */
010        private final WorldChunkManager chunkManager;
011    
012        /** The last time this BiomeCache was cleaned, in milliseconds. */
013        private long lastCleanupTime = 0L;
014    
015        /**
016         * The map of keys to BiomeCacheBlocks. Keys are based on the chunk x, z coordinates as (x | z << 32).
017         */
018        private LongHashMap cacheMap = new LongHashMap();
019    
020        /** The list of cached BiomeCacheBlocks */
021        private List cache = new ArrayList();
022    
023        public BiomeCache(WorldChunkManager par1WorldChunkManager)
024        {
025            this.chunkManager = par1WorldChunkManager;
026        }
027    
028        /**
029         * Returns a biome cache block at location specified.
030         */
031        public BiomeCacheBlock getBiomeCacheBlock(int par1, int par2)
032        {
033            par1 >>= 4;
034            par2 >>= 4;
035            long var3 = (long)par1 & 4294967295L | ((long)par2 & 4294967295L) << 32;
036            BiomeCacheBlock var5 = (BiomeCacheBlock)this.cacheMap.getValueByKey(var3);
037    
038            if (var5 == null)
039            {
040                var5 = new BiomeCacheBlock(this, par1, par2);
041                this.cacheMap.add(var3, var5);
042                this.cache.add(var5);
043            }
044    
045            var5.lastAccessTime = System.currentTimeMillis();
046            return var5;
047        }
048    
049        /**
050         * Returns the BiomeGenBase related to the x, z position from the cache.
051         */
052        public BiomeGenBase getBiomeGenAt(int par1, int par2)
053        {
054            return this.getBiomeCacheBlock(par1, par2).getBiomeGenAt(par1, par2);
055        }
056    
057        /**
058         * Removes BiomeCacheBlocks from this cache that haven't been accessed in at least 30 seconds.
059         */
060        public void cleanupCache()
061        {
062            long var1 = System.currentTimeMillis();
063            long var3 = var1 - this.lastCleanupTime;
064    
065            if (var3 > 7500L || var3 < 0L)
066            {
067                this.lastCleanupTime = var1;
068    
069                for (int var5 = 0; var5 < this.cache.size(); ++var5)
070                {
071                    BiomeCacheBlock var6 = (BiomeCacheBlock)this.cache.get(var5);
072                    long var7 = var1 - var6.lastAccessTime;
073    
074                    if (var7 > 30000L || var7 < 0L)
075                    {
076                        this.cache.remove(var5--);
077                        long var9 = (long)var6.xPosition & 4294967295L | ((long)var6.zPosition & 4294967295L) << 32;
078                        this.cacheMap.remove(var9);
079                    }
080                }
081            }
082        }
083    
084        /**
085         * Returns the array of cached biome types in the BiomeCacheBlock at the given location.
086         */
087        public BiomeGenBase[] getCachedBiomes(int par1, int par2)
088        {
089            return this.getBiomeCacheBlock(par1, par2).biomes;
090        }
091    
092        /**
093         * Get the world chunk manager object for a biome list.
094         */
095        static WorldChunkManager getChunkManager(BiomeCache par0BiomeCache)
096        {
097            return par0BiomeCache.chunkManager;
098        }
099    }