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 }