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 }