001    package net.minecraft.world.storage;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.io.File;
006    import java.io.FileInputStream;
007    import java.io.FileOutputStream;
008    import java.util.ArrayList;
009    import java.util.List;
010    import net.minecraft.nbt.CompressedStreamTools;
011    import net.minecraft.nbt.NBTTagCompound;
012    import net.minecraft.util.IProgressUpdate;
013    
014    public class SaveFormatOld implements ISaveFormat
015    {
016        /**
017         * Reference to the File object representing the directory for the world saves
018         */
019        protected final File savesDirectory;
020    
021        public SaveFormatOld(File par1File)
022        {
023            if (!par1File.exists())
024            {
025                par1File.mkdirs();
026            }
027    
028            this.savesDirectory = par1File;
029        }
030    
031        @SideOnly(Side.CLIENT)
032        public List getSaveList()
033        {
034            ArrayList var1 = new ArrayList();
035    
036            for (int var2 = 0; var2 < 5; ++var2)
037            {
038                String var3 = "World" + (var2 + 1);
039                WorldInfo var4 = this.getWorldInfo(var3);
040    
041                if (var4 != null)
042                {
043                    var1.add(new SaveFormatComparator(var3, "", var4.getLastTimePlayed(), var4.getSizeOnDisk(), var4.getGameType(), false, var4.isHardcoreModeEnabled(), var4.areCommandsAllowed()));
044                }
045            }
046    
047            return var1;
048        }
049    
050        public void flushCache() {}
051    
052        /**
053         * gets the world info
054         */
055        public WorldInfo getWorldInfo(String par1Str)
056        {
057            File var2 = new File(this.savesDirectory, par1Str);
058    
059            if (!var2.exists())
060            {
061                return null;
062            }
063            else
064            {
065                File var3 = new File(var2, "level.dat");
066                NBTTagCompound var4;
067                NBTTagCompound var5;
068    
069                if (var3.exists())
070                {
071                    try
072                    {
073                        var4 = CompressedStreamTools.readCompressed(new FileInputStream(var3));
074                        var5 = var4.getCompoundTag("Data");
075                        return new WorldInfo(var5);
076                    }
077                    catch (Exception var7)
078                    {
079                        var7.printStackTrace();
080                    }
081                }
082    
083                var3 = new File(var2, "level.dat_old");
084    
085                if (var3.exists())
086                {
087                    try
088                    {
089                        var4 = CompressedStreamTools.readCompressed(new FileInputStream(var3));
090                        var5 = var4.getCompoundTag("Data");
091                        return new WorldInfo(var5);
092                    }
093                    catch (Exception var6)
094                    {
095                        var6.printStackTrace();
096                    }
097                }
098    
099                return null;
100            }
101        }
102    
103        @SideOnly(Side.CLIENT)
104    
105        /**
106         * @args: Takes two arguments - first the name of the directory containing the world and second the new name for
107         * that world. @desc: Renames the world by storing the new name in level.dat. It does *not* rename the directory
108         * containing the world data.
109         */
110        public void renameWorld(String par1Str, String par2Str)
111        {
112            File var3 = new File(this.savesDirectory, par1Str);
113    
114            if (var3.exists())
115            {
116                File var4 = new File(var3, "level.dat");
117    
118                if (var4.exists())
119                {
120                    try
121                    {
122                        NBTTagCompound var5 = CompressedStreamTools.readCompressed(new FileInputStream(var4));
123                        NBTTagCompound var6 = var5.getCompoundTag("Data");
124                        var6.setString("LevelName", par2Str);
125                        CompressedStreamTools.writeCompressed(var5, new FileOutputStream(var4));
126                    }
127                    catch (Exception var7)
128                    {
129                        var7.printStackTrace();
130                    }
131                }
132            }
133        }
134    
135        /**
136         * @args: Takes one argument - the name of the directory of the world to delete. @desc: Delete the world by deleting
137         * the associated directory recursively.
138         */
139        public boolean deleteWorldDirectory(String par1Str)
140        {
141            File var2 = new File(this.savesDirectory, par1Str);
142    
143            if (!var2.exists())
144            {
145                return true;
146            }
147            else
148            {
149                System.out.println("Deleting level " + par1Str);
150    
151                for (int var3 = 1; var3 <= 5; ++var3)
152                {
153                    System.out.println("Attempt " + var3 + "...");
154    
155                    if (deleteFiles(var2.listFiles()))
156                    {
157                        break;
158                    }
159    
160                    System.out.println("Unsuccessful in deleting contents.");
161    
162                    if (var3 < 5)
163                    {
164                        try
165                        {
166                            Thread.sleep(500L);
167                        }
168                        catch (InterruptedException var5)
169                        {
170                            ;
171                        }
172                    }
173                }
174    
175                return var2.delete();
176            }
177        }
178    
179        /**
180         * @args: Takes one argument - the list of files and directories to delete. @desc: Deletes the files and directory
181         * listed in the list recursively.
182         */
183        protected static boolean deleteFiles(File[] par0ArrayOfFile)
184        {
185            for (int var1 = 0; var1 < par0ArrayOfFile.length; ++var1)
186            {
187                File var2 = par0ArrayOfFile[var1];
188                System.out.println("Deleting " + var2);
189    
190                if (var2.isDirectory() && !deleteFiles(var2.listFiles()))
191                {
192                    System.out.println("Couldn\'t delete directory " + var2);
193                    return false;
194                }
195    
196                if (!var2.delete())
197                {
198                    System.out.println("Couldn\'t delete file " + var2);
199                    return false;
200                }
201            }
202    
203            return true;
204        }
205    
206        /**
207         * Returns back a loader for the specified save directory
208         */
209        public ISaveHandler getSaveLoader(String par1Str, boolean par2)
210        {
211            return new SaveHandler(this.savesDirectory, par1Str, par2);
212        }
213    
214        /**
215         * Checks if the save directory uses the old map format
216         */
217        public boolean isOldMapFormat(String par1Str)
218        {
219            return false;
220        }
221    
222        /**
223         * Converts the specified map to the new map format. Args: worldName, loadingScreen
224         */
225        public boolean convertMapFormat(String par1Str, IProgressUpdate par2IProgressUpdate)
226        {
227            return false;
228        }
229    
230        @SideOnly(Side.CLIENT)
231    
232        /**
233         * Return whether the given world can be loaded.
234         */
235        public boolean canLoadWorld(String par1Str)
236        {
237            File var2 = new File(this.savesDirectory, par1Str);
238            return var2.isDirectory();
239        }
240    }