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