001 package net.minecraft.world.storage; 002 003 import java.io.DataInputStream; 004 import java.io.DataOutputStream; 005 import java.io.File; 006 import java.io.FileInputStream; 007 import java.io.FileOutputStream; 008 import java.util.ArrayList; 009 import java.util.HashMap; 010 import java.util.Iterator; 011 import java.util.List; 012 import java.util.Map; 013 import net.minecraft.nbt.CompressedStreamTools; 014 import net.minecraft.nbt.NBTBase; 015 import net.minecraft.nbt.NBTTagCompound; 016 import net.minecraft.nbt.NBTTagShort; 017 import net.minecraft.world.WorldSavedData; 018 019 public class MapStorage 020 { 021 private ISaveHandler saveHandler; 022 023 /** Map of item data String id to loaded MapDataBases */ 024 private Map loadedDataMap = new HashMap(); 025 026 /** List of loaded MapDataBases. */ 027 private List loadedDataList = new ArrayList(); 028 029 /** 030 * Map of MapDataBase id String prefixes ('map' etc) to max known unique Short id (the 0 part etc) for that prefix 031 */ 032 private Map idCounts = new HashMap(); 033 034 public MapStorage(ISaveHandler par1ISaveHandler) 035 { 036 this.saveHandler = par1ISaveHandler; 037 this.loadIdCounts(); 038 } 039 040 /** 041 * Loads an existing MapDataBase corresponding to the given String id from disk, instantiating the given Class, or 042 * returns null if none such file exists. args: Class to instantiate, String dataid 043 */ 044 public WorldSavedData loadData(Class par1Class, String par2Str) 045 { 046 WorldSavedData var3 = (WorldSavedData)this.loadedDataMap.get(par2Str); 047 048 if (var3 != null) 049 { 050 return var3; 051 } 052 else 053 { 054 if (this.saveHandler != null) 055 { 056 try 057 { 058 File var4 = this.saveHandler.getMapFileFromName(par2Str); 059 060 if (var4 != null && var4.exists()) 061 { 062 try 063 { 064 var3 = (WorldSavedData)par1Class.getConstructor(new Class[] {String.class}).newInstance(new Object[] {par2Str}); 065 } 066 catch (Exception var7) 067 { 068 throw new RuntimeException("Failed to instantiate " + par1Class.toString(), var7); 069 } 070 071 FileInputStream var5 = new FileInputStream(var4); 072 NBTTagCompound var6 = CompressedStreamTools.readCompressed(var5); 073 var5.close(); 074 var3.readFromNBT(var6.getCompoundTag("data")); 075 } 076 } 077 catch (Exception var8) 078 { 079 var8.printStackTrace(); 080 } 081 } 082 083 if (var3 != null) 084 { 085 this.loadedDataMap.put(par2Str, var3); 086 this.loadedDataList.add(var3); 087 } 088 089 return var3; 090 } 091 } 092 093 /** 094 * Assigns the given String id to the given MapDataBase, removing any existing ones of the same id. 095 */ 096 public void setData(String par1Str, WorldSavedData par2WorldSavedData) 097 { 098 if (par2WorldSavedData == null) 099 { 100 throw new RuntimeException("Can\'t set null data"); 101 } 102 else 103 { 104 if (this.loadedDataMap.containsKey(par1Str)) 105 { 106 this.loadedDataList.remove(this.loadedDataMap.remove(par1Str)); 107 } 108 109 this.loadedDataMap.put(par1Str, par2WorldSavedData); 110 this.loadedDataList.add(par2WorldSavedData); 111 } 112 } 113 114 /** 115 * Saves all dirty loaded MapDataBases to disk. 116 */ 117 public void saveAllData() 118 { 119 for (int var1 = 0; var1 < this.loadedDataList.size(); ++var1) 120 { 121 WorldSavedData var2 = (WorldSavedData)this.loadedDataList.get(var1); 122 123 if (var2.isDirty()) 124 { 125 this.saveData(var2); 126 var2.setDirty(false); 127 } 128 } 129 } 130 131 /** 132 * Saves the given MapDataBase to disk. 133 */ 134 private void saveData(WorldSavedData par1WorldSavedData) 135 { 136 if (this.saveHandler != null) 137 { 138 try 139 { 140 File var2 = this.saveHandler.getMapFileFromName(par1WorldSavedData.mapName); 141 142 if (var2 != null) 143 { 144 NBTTagCompound var3 = new NBTTagCompound(); 145 par1WorldSavedData.writeToNBT(var3); 146 NBTTagCompound var4 = new NBTTagCompound(); 147 var4.setCompoundTag("data", var3); 148 FileOutputStream var5 = new FileOutputStream(var2); 149 CompressedStreamTools.writeCompressed(var4, var5); 150 var5.close(); 151 } 152 } 153 catch (Exception var6) 154 { 155 var6.printStackTrace(); 156 } 157 } 158 } 159 160 /** 161 * Loads the idCounts Map from the 'idcounts' file. 162 */ 163 private void loadIdCounts() 164 { 165 try 166 { 167 this.idCounts.clear(); 168 169 if (this.saveHandler == null) 170 { 171 return; 172 } 173 174 File var1 = this.saveHandler.getMapFileFromName("idcounts"); 175 176 if (var1 != null && var1.exists()) 177 { 178 DataInputStream var2 = new DataInputStream(new FileInputStream(var1)); 179 NBTTagCompound var3 = CompressedStreamTools.read(var2); 180 var2.close(); 181 Iterator var4 = var3.getTags().iterator(); 182 183 while (var4.hasNext()) 184 { 185 NBTBase var5 = (NBTBase)var4.next(); 186 187 if (var5 instanceof NBTTagShort) 188 { 189 NBTTagShort var6 = (NBTTagShort)var5; 190 String var7 = var6.getName(); 191 short var8 = var6.data; 192 this.idCounts.put(var7, Short.valueOf(var8)); 193 } 194 } 195 } 196 } 197 catch (Exception var9) 198 { 199 var9.printStackTrace(); 200 } 201 } 202 203 /** 204 * Returns an unique new data id for the given prefix and saves the idCounts map to the 'idcounts' file. 205 */ 206 public int getUniqueDataId(String par1Str) 207 { 208 Short var2 = (Short)this.idCounts.get(par1Str); 209 210 if (var2 == null) 211 { 212 var2 = Short.valueOf((short)0); 213 } 214 else 215 { 216 var2 = Short.valueOf((short)(var2.shortValue() + 1)); 217 } 218 219 this.idCounts.put(par1Str, var2); 220 221 if (this.saveHandler == null) 222 { 223 return var2.shortValue(); 224 } 225 else 226 { 227 try 228 { 229 File var3 = this.saveHandler.getMapFileFromName("idcounts"); 230 231 if (var3 != null) 232 { 233 NBTTagCompound var4 = new NBTTagCompound(); 234 Iterator var5 = this.idCounts.keySet().iterator(); 235 236 while (var5.hasNext()) 237 { 238 String var6 = (String)var5.next(); 239 short var7 = ((Short)this.idCounts.get(var6)).shortValue(); 240 var4.setShort(var6, var7); 241 } 242 243 DataOutputStream var9 = new DataOutputStream(new FileOutputStream(var3)); 244 CompressedStreamTools.write(var4, var9); 245 var9.close(); 246 } 247 } 248 catch (Exception var8) 249 { 250 var8.printStackTrace(); 251 } 252 253 return var2.shortValue(); 254 } 255 } 256 }