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 }