package net.minecraft.world.biome;
import java.util.ArrayList;
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 = new ArrayList();
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 k = (long)p_76840_1_ & 4294967295L | ((long)p_76840_2_ & 4294967295L) << 32;
BiomeCache.Block block = (BiomeCache.Block)this.cacheMap.getValueByKey(k);
if (block == null)
{
block = new BiomeCache.Block(p_76840_1_, p_76840_2_);
this.cacheMap.add(k, block);
this.cache.add(block);
}
block.lastAccessTime = MinecraftServer.getCurrentTimeMillis();
return block;
}
/**
* Returns the BiomeGenBase related to the x, z position from the cache.
*/
public BiomeGenBase getBiomeGenAt(int p_76837_1_, int p_76837_2_)
{
return this.getBiomeCacheBlock(p_76837_1_, p_76837_2_).getBiomeGenAt(p_76837_1_, p_76837_2_);
}
/**
* Removes BiomeCacheBlocks from this cache that haven't been accessed in at least 30 seconds.
*/
public void cleanupCache()
{
long i = MinecraftServer.getCurrentTimeMillis();
long j = i - this.lastCleanupTime;
if (j > 7500L || j < 0L)
{
this.lastCleanupTime = i;
for (int k = 0; k < this.cache.size(); ++k)
{
BiomeCache.Block block = (BiomeCache.Block)this.cache.get(k);
long l = i - block.lastAccessTime;
if (l > 30000L || l < 0L)
{
this.cache.remove(k--);
long i1 = (long)block.xPosition & 4294967295L | ((long)block.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 p_76839_1_, int p_76839_2_)
{
return this.getBiomeCacheBlock(p_76839_1_, p_76839_2_).biomes;
}
public class Block
{
/** An array of chunk rainfall values saved by this cache. */
public float[] rainfallValues = new float[256];
/** The array of biome types stored in this BiomeCacheBlock. */
public BiomeGenBase[] biomes = new BiomeGenBase[256];
/** The x coordinate of the BiomeCacheBlock. */
public int xPosition;
/** The z coordinate of the BiomeCacheBlock. */
public int zPosition;
/** The last time this BiomeCacheBlock was accessed, in milliseconds. */
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);
}
/**
* Returns the BiomeGenBase related to the x, z position from the cache block.
*/
public BiomeGenBase getBiomeGenAt(int p_76885_1_, int p_76885_2_)
{
return this.biomes[p_76885_1_ & 15 | (p_76885_2_ & 15) << 4];
}
}
}