package net.minecraft.world.storage; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagShort; import net.minecraft.world.WorldSavedData; public class MapStorage { private ISaveHandler saveHandler; /** Map of item data String id to loaded MapDataBases */ private Map loadedDataMap = new HashMap(); /** List of loaded MapDataBases. */ private List loadedDataList = new ArrayList(); /** * Map of MapDataBase id String prefixes ('map' etc) to max known unique Short id (the 0 part etc) for that prefix */ private Map idCounts = new HashMap(); public MapStorage(ISaveHandler par1ISaveHandler) { this.saveHandler = par1ISaveHandler; this.loadIdCounts(); } /** * Loads an existing MapDataBase corresponding to the given String id from disk, instantiating the given Class, or * returns null if none such file exists. args: Class to instantiate, String dataid */ public WorldSavedData loadData(Class par1Class, String par2Str) { WorldSavedData var3 = (WorldSavedData)this.loadedDataMap.get(par2Str); if (var3 != null) { return var3; } else { if (this.saveHandler != null) { try { File var4 = this.saveHandler.getMapFileFromName(par2Str); if (var4 != null && var4.exists()) { try { var3 = (WorldSavedData)par1Class.getConstructor(new Class[] {String.class}).newInstance(new Object[] {par2Str}); } catch (Exception var7) { throw new RuntimeException("Failed to instantiate " + par1Class.toString(), var7); } FileInputStream var5 = new FileInputStream(var4); NBTTagCompound var6 = CompressedStreamTools.readCompressed(var5); var5.close(); var3.readFromNBT(var6.getCompoundTag("data")); } } catch (Exception var8) { var8.printStackTrace(); } } if (var3 != null) { this.loadedDataMap.put(par2Str, var3); this.loadedDataList.add(var3); } return var3; } } /** * Assigns the given String id to the given MapDataBase, removing any existing ones of the same id. */ public void setData(String par1Str, WorldSavedData par2WorldSavedData) { if (par2WorldSavedData == null) { throw new RuntimeException("Can\'t set null data"); } else { if (this.loadedDataMap.containsKey(par1Str)) { this.loadedDataList.remove(this.loadedDataMap.remove(par1Str)); } this.loadedDataMap.put(par1Str, par2WorldSavedData); this.loadedDataList.add(par2WorldSavedData); } } /** * Saves all dirty loaded MapDataBases to disk. */ public void saveAllData() { for (int var1 = 0; var1 < this.loadedDataList.size(); ++var1) { WorldSavedData var2 = (WorldSavedData)this.loadedDataList.get(var1); if (var2.isDirty()) { this.saveData(var2); var2.setDirty(false); } } } /** * Saves the given MapDataBase to disk. */ private void saveData(WorldSavedData par1WorldSavedData) { if (this.saveHandler != null) { try { File var2 = this.saveHandler.getMapFileFromName(par1WorldSavedData.mapName); if (var2 != null) { NBTTagCompound var3 = new NBTTagCompound(); par1WorldSavedData.writeToNBT(var3); NBTTagCompound var4 = new NBTTagCompound(); var4.setCompoundTag("data", var3); FileOutputStream var5 = new FileOutputStream(var2); CompressedStreamTools.writeCompressed(var4, var5); var5.close(); } } catch (Exception var6) { var6.printStackTrace(); } } } /** * Loads the idCounts Map from the 'idcounts' file. */ private void loadIdCounts() { try { this.idCounts.clear(); if (this.saveHandler == null) { return; } File var1 = this.saveHandler.getMapFileFromName("idcounts"); if (var1 != null && var1.exists()) { DataInputStream var2 = new DataInputStream(new FileInputStream(var1)); NBTTagCompound var3 = CompressedStreamTools.read(var2); var2.close(); Iterator var4 = var3.getTags().iterator(); while (var4.hasNext()) { NBTBase var5 = (NBTBase)var4.next(); if (var5 instanceof NBTTagShort) { NBTTagShort var6 = (NBTTagShort)var5; String var7 = var6.getName(); short var8 = var6.data; this.idCounts.put(var7, Short.valueOf(var8)); } } } } catch (Exception var9) { var9.printStackTrace(); } } /** * Returns an unique new data id for the given prefix and saves the idCounts map to the 'idcounts' file. */ public int getUniqueDataId(String par1Str) { Short var2 = (Short)this.idCounts.get(par1Str); if (var2 == null) { var2 = Short.valueOf((short)0); } else { var2 = Short.valueOf((short)(var2.shortValue() + 1)); } this.idCounts.put(par1Str, var2); if (this.saveHandler == null) { return var2.shortValue(); } else { try { File var3 = this.saveHandler.getMapFileFromName("idcounts"); if (var3 != null) { NBTTagCompound var4 = new NBTTagCompound(); Iterator var5 = this.idCounts.keySet().iterator(); while (var5.hasNext()) { String var6 = (String)var5.next(); short var7 = ((Short)this.idCounts.get(var6)).shortValue(); var4.setShort(var6, var7); } DataOutputStream var9 = new DataOutputStream(new FileOutputStream(var3)); CompressedStreamTools.write(var4, var9); var9.close(); } } catch (Exception var8) { var8.printStackTrace(); } return var2.shortValue(); } } }