package net.minecraft.src; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Iterator; public class ChunkLoader implements IChunkLoader { private File saveDir; private boolean createIfNecessary; public ChunkLoader(File var1, boolean var2) { this.saveDir = var1; this.createIfNecessary = var2; } private File chunkFileForXZ(int var1, int var2) { String var3 = "c." + Integer.toString(var1, 36) + "." + Integer.toString(var2, 36) + ".dat"; String var4 = Integer.toString(var1 & 63, 36); String var5 = Integer.toString(var2 & 63, 36); File var6 = new File(this.saveDir, var4); if(!var6.exists()) { if(!this.createIfNecessary) { return null; } var6.mkdir(); } var6 = new File(var6, var5); if(!var6.exists()) { if(!this.createIfNecessary) { return null; } var6.mkdir(); } var6 = new File(var6, var3); return !var6.exists() && !this.createIfNecessary ? null : var6; } public Chunk loadChunk(World var1, int var2, int var3) { File var4 = this.chunkFileForXZ(var2, var3); if(var4 != null && var4.exists()) { try { FileInputStream var5 = new FileInputStream(var4); NBTTagCompound var6 = CompressedStreamTools.readCompressed(var5); return loadChunkIntoWorldFromCompound(var1, var6.getCompoundTag("Level")); } catch (Exception var7) { var7.printStackTrace(); } } return null; } public void saveChunk(World var1, Chunk var2) { File var3 = this.chunkFileForXZ(var2.xPosition, var2.zPosition); if(var3.exists()) { var1.setSizeOnDisk -= var3.length(); } try { File var4 = new File(this.saveDir, "tmp_chunk.dat"); FileOutputStream var5 = new FileOutputStream(var4); NBTTagCompound var6 = new NBTTagCompound(); NBTTagCompound var7 = new NBTTagCompound(); var6.setTag("Level", var7); this.storeChunkInCompound(var2, var1, var7); CompressedStreamTools.writeCompressed(var6, var5); var5.close(); if(var3.exists()) { var3.delete(); } var4.renameTo(var3); var1.setSizeOnDisk += var3.length(); } catch (Exception var8) { var8.printStackTrace(); } } public void storeChunkInCompound(Chunk var1, World var2, NBTTagCompound var3) { var3.setInteger("xPos", var1.xPosition); var3.setInteger("zPos", var1.zPosition); var3.setLong("LastUpdate", var2.worldTime); var3.setByteArray("Blocks", var1.blocks); var3.setByteArray("Data", var1.data.data); var3.setByteArray("SkyLight", var1.skylightMap.data); var3.setByteArray("BlockLight", var1.blocklightMap.data); var3.setByteArray("HeightMap", var1.heightMap); var3.setBoolean("TerrainPopulated", var1.isTerrainPopulated); var1.hasEntities = false; NBTTagList var4 = new NBTTagList(); Iterator var6; NBTTagCompound var8; for(int var5 = 0; var5 < var1.entities.length; ++var5) { var6 = var1.entities[var5].iterator(); while(var6.hasNext()) { Entity var7 = (Entity)var6.next(); var1.hasEntities = true; var8 = new NBTTagCompound(); if(var7.addEntityID(var8)) { var4.setTag(var8); } } } var3.setTag("Entities", var4); NBTTagList var9 = new NBTTagList(); var6 = var1.chunkTileEntityMap.values().iterator(); while(var6.hasNext()) { TileEntity var10 = (TileEntity)var6.next(); var8 = new NBTTagCompound(); var10.writeToNBT(var8); var9.setTag(var8); } var3.setTag("TileEntities", var9); } public static Chunk loadChunkIntoWorldFromCompound(World var0, NBTTagCompound var1) { int var2 = var1.getInteger("xPos"); int var3 = var1.getInteger("zPos"); Chunk var4 = new Chunk(var0, var2, var3); var4.blocks = var1.getByteArray("Blocks"); var4.data = new NibbleArray(var1.getByteArray("Data")); var4.skylightMap = new NibbleArray(var1.getByteArray("SkyLight")); var4.blocklightMap = new NibbleArray(var1.getByteArray("BlockLight")); var4.heightMap = var1.getByteArray("HeightMap"); var4.isTerrainPopulated = var1.getBoolean("TerrainPopulated"); if(!var4.data.isValid()) { var4.data = new NibbleArray(var4.blocks.length); } if(var4.heightMap == null || !var4.skylightMap.isValid()) { var4.heightMap = new byte[256]; var4.skylightMap = new NibbleArray(var4.blocks.length); var4.generateHeightMap(); } if(!var4.blocklightMap.isValid()) { var4.blocklightMap = new NibbleArray(var4.blocks.length); var4.doNothing(); } NBTTagList var5 = var1.getTagList("Entities"); if(var5 != null) { for(int var6 = 0; var6 < var5.tagCount(); ++var6) { NBTTagCompound var7 = (NBTTagCompound)var5.tagAt(var6); Entity var8 = EntityList.createEntityFromNBT(var7, var0); var4.hasEntities = true; if(var8 != null) { var4.addEntity(var8); } } } NBTTagList var10 = var1.getTagList("TileEntities"); if(var10 != null) { for(int var11 = 0; var11 < var10.tagCount(); ++var11) { NBTTagCompound var12 = (NBTTagCompound)var10.tagAt(var11); TileEntity var9 = TileEntity.createAndLoadEntity(var12); if(var9 != null) { var4.addTileEntity(var9); } } } return var4; } public void chunkTick() { } public void saveExtraData() { } public void saveExtraChunkData(World var1, Chunk var2) { } }