package net.minecraft.world.biome; import java.util.ArrayList; import java.util.List; import net.minecraft.util.LongHashMap; public class BiomeCache { /** Reference to the WorldChunkManager */ private final WorldChunkManager chunkManager; /** The last time this BiomeCache was cleaned, in milliseconds. */ private long lastCleanupTime = 0L; /** * The map of keys to BiomeCacheBlocks. Keys are based on the chunk x, z coordinates as (x | z << 32). */ private LongHashMap cacheMap = new LongHashMap(); /** The list of cached BiomeCacheBlocks */ private List cache = new ArrayList(); public BiomeCache(WorldChunkManager par1WorldChunkManager) { this.chunkManager = par1WorldChunkManager; } /** * Returns a biome cache block at location specified. */ public BiomeCacheBlock getBiomeCacheBlock(int par1, int par2) { par1 >>= 4; par2 >>= 4; long k = (long)par1 & 4294967295L | ((long)par2 & 4294967295L) << 32; BiomeCacheBlock biomecacheblock = (BiomeCacheBlock)this.cacheMap.getValueByKey(k); if (biomecacheblock == null) { biomecacheblock = new BiomeCacheBlock(this, par1, par2); this.cacheMap.add(k, biomecacheblock); this.cache.add(biomecacheblock); } biomecacheblock.lastAccessTime = System.currentTimeMillis(); return biomecacheblock; } /** * Returns the BiomeGenBase related to the x, z position from the cache. */ public BiomeGenBase getBiomeGenAt(int par1, int par2) { return this.getBiomeCacheBlock(par1, par2).getBiomeGenAt(par1, par2); } /** * Removes BiomeCacheBlocks from this cache that haven't been accessed in at least 30 seconds. */ public void cleanupCache() { long i = System.currentTimeMillis(); long j = i - this.lastCleanupTime; if (j > 7500L || j < 0L) { this.lastCleanupTime = i; for (int k = 0; k < this.cache.size(); ++k) { BiomeCacheBlock biomecacheblock = (BiomeCacheBlock)this.cache.get(k); long l = i - biomecacheblock.lastAccessTime; if (l > 30000L || l < 0L) { this.cache.remove(k--); long i1 = (long)biomecacheblock.xPosition & 4294967295L | ((long)biomecacheblock.zPosition & 4294967295L) << 32; this.cacheMap.remove(i1); } } } } /** * Returns the array of cached biome types in the BiomeCacheBlock at the given location. */ public BiomeGenBase[] getCachedBiomes(int par1, int par2) { return this.getBiomeCacheBlock(par1, par2).biomes; } /** * Get the world chunk manager object for a biome list. */ static WorldChunkManager getChunkManager(BiomeCache par0BiomeCache) { return par0BiomeCache.chunkManager; } }