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