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