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