    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    }