package net.minecraft.world.chunk.storage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class RegionFileCache
{
/** A map containing Files as keys and RegionFiles as values */
private static final Map regionsByFilename = new HashMap();
private static final String __OBFID = "CL_00000383";
public static synchronized RegionFile createOrLoadRegionFile(File p_76550_0_, int p_76550_1_, int p_76550_2_)
{
File file2 = new File(p_76550_0_, "region");
File file3 = new File(file2, "r." + (p_76550_1_ >> 5) + "." + (p_76550_2_ >> 5) + ".mca");
RegionFile regionfile = (RegionFile)regionsByFilename.get(file3);
if (regionfile != null)
{
return regionfile;
}
else
{
if (!file2.exists())
{
file2.mkdirs();
}
if (regionsByFilename.size() >= 256)
{
clearRegionFileReferences();
}
RegionFile regionfile1 = new RegionFile(file3);
regionsByFilename.put(file3, regionfile1);
return regionfile1;
}
}
/**
* clears region file references
*/
public static synchronized void clearRegionFileReferences()
{
Iterator iterator = regionsByFilename.values().iterator();
while (iterator.hasNext())
{
RegionFile regionfile = (RegionFile)iterator.next();
try
{
if (regionfile != null)
{
regionfile.close();
}
}
catch (IOException ioexception)
{
ioexception.printStackTrace();
}
}
regionsByFilename.clear();
}
/**
* Returns an input stream for the specified chunk. Args: worldDir, chunkX, chunkZ
*/
public static DataInputStream getChunkInputStream(File p_76549_0_, int p_76549_1_, int p_76549_2_)
{
RegionFile regionfile = createOrLoadRegionFile(p_76549_0_, p_76549_1_, p_76549_2_);
return regionfile.getChunkDataInputStream(p_76549_1_ & 31, p_76549_2_ & 31);
}
/**
* Returns an output stream for the specified chunk. Args: worldDir, chunkX, chunkZ
*/
public static DataOutputStream getChunkOutputStream(File p_76552_0_, int p_76552_1_, int p_76552_2_)
{
RegionFile regionfile = createOrLoadRegionFile(p_76552_0_, p_76552_1_, p_76552_2_);
return regionfile.getChunkDataOutputStream(p_76552_1_ & 31, p_76552_2_ & 31);
}
}