package net.minecraft.world.biome; import com.google.common.collect.Lists; import java.util.List; import net.minecraft.server.MinecraftServer; 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; /** * 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 = Lists.newArrayList(); private static final String __OBFID = "CL_00000162"; public BiomeCache(WorldChunkManager p_i1973_1_) { this.chunkManager = p_i1973_1_; } /** * Returns a biome cache block at location specified. */ public BiomeCache.Block getBiomeCacheBlock(int p_76840_1_, int p_76840_2_) { p_76840_1_ >>= 4; p_76840_2_ >>= 4; long var3 = (long)p_76840_1_ & 4294967295L | ((long)p_76840_2_ & 4294967295L) << 32; BiomeCache.Block var5 = (BiomeCache.Block)this.cacheMap.getValueByKey(var3); if (var5 == null) { var5 = new BiomeCache.Block(p_76840_1_, p_76840_2_); this.cacheMap.add(var3, var5); this.cache.add(var5); } var5.lastAccessTime = MinecraftServer.getCurrentTimeMillis(); return var5; } public BiomeGenBase func_180284_a(int p_180284_1_, int p_180284_2_, BiomeGenBase p_180284_3_) { BiomeGenBase var4 = this.getBiomeCacheBlock(p_180284_1_, p_180284_2_).getBiomeGenAt(p_180284_1_, p_180284_2_); return var4 == null ? p_180284_3_ : var4; } /** * Removes BiomeCacheBlocks from this cache that haven't been accessed in at least 30 seconds. */ public void cleanupCache() { long var1 = MinecraftServer.getCurrentTimeMillis(); long var3 = var1 - this.lastCleanupTime; if (var3 > 7500L || var3 < 0L) { this.lastCleanupTime = var1; for (int var5 = 0; var5 < this.cache.size(); ++var5) { BiomeCache.Block var6 = (BiomeCache.Block)this.cache.get(var5); long var7 = var1 - var6.lastAccessTime; if (var7 > 30000L || var7 < 0L) { this.cache.remove(var5--); long var9 = (long)var6.xPosition & 4294967295L | ((long)var6.zPosition & 4294967295L) << 32; this.cacheMap.remove(var9); } } } } /** * Returns the array of cached biome types in the BiomeCacheBlock at the given location. */ public BiomeGenBase[] getCachedBiomes(int p_76839_1_, int p_76839_2_) { return this.getBiomeCacheBlock(p_76839_1_, p_76839_2_).biomes; } public class Block { public float[] rainfallValues = new float[256]; public BiomeGenBase[] biomes = new BiomeGenBase[256]; public int xPosition; public int zPosition; public long lastAccessTime; private static final String __OBFID = "CL_00000163"; public Block(int p_i1972_2_, int p_i1972_3_) { this.xPosition = p_i1972_2_; this.zPosition = p_i1972_3_; BiomeCache.this.chunkManager.getRainfall(this.rainfallValues, p_i1972_2_ << 4, p_i1972_3_ << 4, 16, 16); BiomeCache.this.chunkManager.getBiomeGenAt(this.biomes, p_i1972_2_ << 4, p_i1972_3_ << 4, 16, 16, false); } public BiomeGenBase getBiomeGenAt(int p_76885_1_, int p_76885_2_) { return this.biomes[p_76885_1_ & 15 | (p_76885_2_ & 15) << 4]; } } }