    001package net.minecraft.client.gui;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.text.DateFormat;
    006import java.text.SimpleDateFormat;
    007import java.util.Collections;
    008import java.util.List;
    009import net.minecraft.client.AnvilConverterException;
    010import net.minecraft.util.MathHelper;
    011import net.minecraft.util.StringTranslate;
    012import net.minecraft.world.EnumGameType;
    013import net.minecraft.world.WorldSettings;
    014import net.minecraft.world.storage.ISaveFormat;
    015import net.minecraft.world.storage.ISaveHandler;
    016import net.minecraft.world.storage.SaveFormatComparator;
    017import net.minecraft.world.storage.WorldInfo;
    018
    019@SideOnly(Side.CLIENT)
    020public class GuiSelectWorld extends GuiScreen
    021{
    022    /** simple date formater */
    023    private final DateFormat dateFormatter = new SimpleDateFormat();
    024
    025    /**
    026     * A reference to the screen object that created this. Used for navigating between screens.
    027     */
    028    protected GuiScreen parentScreen;
    029
    030    /** The title string that is displayed in the top-center of the screen. */
    031    protected String screenTitle = "Select world";
    032
    033    /** True if a world has been selected. */
    034    private boolean selected = false;
    035
    036    /** the currently selected world */
    037    private int selectedWorld;
    038
    039    /** The save list for the world selection screen */
    040    private List saveList;
    041    private GuiWorldSlot worldSlotContainer;
    042
    043    /** E.g. World, Welt, Monde, Mundo */
    044    private String localizedWorldText;
    045    private String localizedMustConvertText;
    046
    047    /**
    048     * The game mode text that is displayed with each world on the world selection list.
    049     */
    050    private String[] localizedGameModeText = new String[3];
    051
    052    /** set to true if you arein the process of deleteing a world/save */
    053    private boolean deleting;
    054
    055    /** The delete button in the world selection GUI */
    056    private GuiButton buttonDelete;
    057
    058    /** the select button in the world selection gui */
    059    private GuiButton buttonSelect;
    060
    061    /** The rename button in the world selection GUI */
    062    private GuiButton buttonRename;
    063    private GuiButton buttonRecreate;
    064
    065    public GuiSelectWorld(GuiScreen par1GuiScreen)
    066    {
    067        this.parentScreen = par1GuiScreen;
    068    }
    069
    070    /**
    071     * Adds the buttons (and other controls) to the screen in question.
    072     */
    073    public void initGui()
    074    {
    075        StringTranslate stringtranslate = StringTranslate.getInstance();
    076        this.screenTitle = stringtranslate.translateKey("selectWorld.title");
    077
    078        try
    079        {
    080            this.loadSaves();
    081        }
    082        catch (AnvilConverterException anvilconverterexception)
    083        {
    084            anvilconverterexception.printStackTrace();
    085            this.mc.displayGuiScreen(new GuiErrorScreen("Unable to load words", anvilconverterexception.getMessage()));
    086            return;
    087        }
    088
    089        this.localizedWorldText = stringtranslate.translateKey("selectWorld.world");
    090        this.localizedMustConvertText = stringtranslate.translateKey("selectWorld.conversion");
    091        this.localizedGameModeText[EnumGameType.SURVIVAL.getID()] = stringtranslate.translateKey("gameMode.survival");
    092        this.localizedGameModeText[EnumGameType.CREATIVE.getID()] = stringtranslate.translateKey("gameMode.creative");
    093        this.localizedGameModeText[EnumGameType.ADVENTURE.getID()] = stringtranslate.translateKey("gameMode.adventure");
    094        this.worldSlotContainer = new GuiWorldSlot(this);
    095        this.worldSlotContainer.registerScrollButtons(this.buttonList, 4, 5);
    096        this.initButtons();
    097    }
    098
    099    /**
    100     * loads the saves
    101     */
    102    private void loadSaves() throws AnvilConverterException
    103    {
    104        ISaveFormat isaveformat = this.mc.getSaveLoader();
    105        this.saveList = isaveformat.getSaveList();
    106        Collections.sort(this.saveList);
    107        this.selectedWorld = -1;
    108    }
    109
    110    /**
    111     * returns the file name of the specified save number
    112     */
    113    protected String getSaveFileName(int par1)
    114    {
    115        return ((SaveFormatComparator)this.saveList.get(par1)).getFileName();
    116    }
    117
    118    /**
    119     * returns the name of the saved game
    120     */
    121    protected String getSaveName(int par1)
    122    {
    123        String s = ((SaveFormatComparator)this.saveList.get(par1)).getDisplayName();
    124
    125        if (s == null || MathHelper.stringNullOrLengthZero(s))
    126        {
    127            StringTranslate stringtranslate = StringTranslate.getInstance();
    128            s = stringtranslate.translateKey("selectWorld.world") + " " + (par1 + 1);
    129        }
    130
    131        return s;
    132    }
    133
    134    /**
    135     * intilize the buttons for this GUI
    136     */
    137    public void initButtons()
    138    {
    139        StringTranslate stringtranslate = StringTranslate.getInstance();
    140        this.buttonList.add(this.buttonSelect = new GuiButton(1, this.width / 2 - 154, this.height - 52, 150, 20, stringtranslate.translateKey("selectWorld.select")));
    141        this.buttonList.add(new GuiButton(3, this.width / 2 + 4, this.height - 52, 150, 20, stringtranslate.translateKey("selectWorld.create")));
    142        this.buttonList.add(this.buttonRename = new GuiButton(6, this.width / 2 - 154, this.height - 28, 72, 20, stringtranslate.translateKey("selectWorld.rename")));
    143        this.buttonList.add(this.buttonDelete = new GuiButton(2, this.width / 2 - 76, this.height - 28, 72, 20, stringtranslate.translateKey("selectWorld.delete")));
    144        this.buttonList.add(this.buttonRecreate = new GuiButton(7, this.width / 2 + 4, this.height - 28, 72, 20, stringtranslate.translateKey("selectWorld.recreate")));
    145        this.buttonList.add(new GuiButton(0, this.width / 2 + 82, this.height - 28, 72, 20, stringtranslate.translateKey("gui.cancel")));
    146        this.buttonSelect.enabled = false;
    147        this.buttonDelete.enabled = false;
    148        this.buttonRename.enabled = false;
    149        this.buttonRecreate.enabled = false;
    150    }
    151
    152    /**
    153     * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
    154     */
    155    protected void actionPerformed(GuiButton par1GuiButton)
    156    {
    157        if (par1GuiButton.enabled)
    158        {
    159            if (par1GuiButton.id == 2)
    160            {
    161                String s = this.getSaveName(this.selectedWorld);
    162
    163                if (s != null)
    164                {
    165                    this.deleting = true;
    166                    GuiYesNo guiyesno = getDeleteWorldScreen(this, s, this.selectedWorld);
    167                    this.mc.displayGuiScreen(guiyesno);
    168                }
    169            }
    170            else if (par1GuiButton.id == 1)
    171            {
    172                this.selectWorld(this.selectedWorld);
    173            }
    174            else if (par1GuiButton.id == 3)
    175            {
    176                this.mc.displayGuiScreen(new GuiCreateWorld(this));
    177            }
    178            else if (par1GuiButton.id == 6)
    179            {
    180                this.mc.displayGuiScreen(new GuiRenameWorld(this, this.getSaveFileName(this.selectedWorld)));
    181            }
    182            else if (par1GuiButton.id == 0)
    183            {
    184                this.mc.displayGuiScreen(this.parentScreen);
    185            }
    186            else if (par1GuiButton.id == 7)
    187            {
    188                GuiCreateWorld guicreateworld = new GuiCreateWorld(this);
    189                ISaveHandler isavehandler = this.mc.getSaveLoader().getSaveLoader(this.getSaveFileName(this.selectedWorld), false);
    190                WorldInfo worldinfo = isavehandler.loadWorldInfo();
    191                isavehandler.flush();
    192                guicreateworld.func_82286_a(worldinfo);
    193                this.mc.displayGuiScreen(guicreateworld);
    194            }
    195            else
    196            {
    197                this.worldSlotContainer.actionPerformed(par1GuiButton);
    198            }
    199        }
    200    }
    201
    202    /**
    203     * Gets the selected world.
    204     */
    205    public void selectWorld(int par1)
    206    {
    207        this.mc.displayGuiScreen((GuiScreen)null);
    208
    209        if (!this.selected)
    210        {
    211            this.selected = true;
    212            String s = this.getSaveFileName(par1);
    213
    214            if (s == null)
    215            {
    216                s = "World" + par1;
    217            }
    218
    219            String s1 = this.getSaveName(par1);
    220
    221            if (s1 == null)
    222            {
    223                s1 = "World" + par1;
    224            }
    225
    226            if (this.mc.getSaveLoader().canLoadWorld(s))
    227            {
    228                this.mc.launchIntegratedServer(s, s1, (WorldSettings)null);
    229            }
    230        }
    231    }
    232
    233    public void confirmClicked(boolean par1, int par2)
    234    {
    235        if (this.deleting)
    236        {
    237            this.deleting = false;
    238
    239            if (par1)
    240            {
    241                ISaveFormat isaveformat = this.mc.getSaveLoader();
    242                isaveformat.flushCache();
    243                isaveformat.deleteWorldDirectory(this.getSaveFileName(par2));
    244
    245                try
    246                {
    247                    this.loadSaves();
    248                }
    249                catch (AnvilConverterException anvilconverterexception)
    250                {
    251                    anvilconverterexception.printStackTrace();
    252                }
    253            }
    254
    255            this.mc.displayGuiScreen(this);
    256        }
    257    }
    258
    259    /**
    260     * Draws the screen and all the components in it.
    261     */
    262    public void drawScreen(int par1, int par2, float par3)
    263    {
    264        this.worldSlotContainer.drawScreen(par1, par2, par3);
    265        this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215);
    266        super.drawScreen(par1, par2, par3);
    267    }
    268
    269    /**
    270     * Gets a GuiYesNo screen with the warning, buttons, etc.
    271     */
    272    public static GuiYesNo getDeleteWorldScreen(GuiScreen par0GuiScreen, String par1Str, int par2)
    273    {
    274        StringTranslate stringtranslate = StringTranslate.getInstance();
    275        String s1 = stringtranslate.translateKey("selectWorld.deleteQuestion");
    276        String s2 = "\'" + par1Str + "\' " + stringtranslate.translateKey("selectWorld.deleteWarning");
    277        String s3 = stringtranslate.translateKey("selectWorld.deleteButton");
    278        String s4 = stringtranslate.translateKey("gui.cancel");
    279        GuiYesNo guiyesno = new GuiYesNo(par0GuiScreen, s1, s2, s3, s4, par2);
    280        return guiyesno;
    281    }
    282
    283    static List getSize(GuiSelectWorld par0GuiSelectWorld)
    284    {
    285        return par0GuiSelectWorld.saveList;
    286    }
    287
    288    /**
    289     * called whenever an element in this gui is selected
    290     */
    291    static int onElementSelected(GuiSelectWorld par0GuiSelectWorld, int par1)
    292    {
    293        return par0GuiSelectWorld.selectedWorld = par1;
    294    }
    295
    296    /**
    297     * returns the world currently selected
    298     */
    299    static int getSelectedWorld(GuiSelectWorld par0GuiSelectWorld)
    300    {
    301        return par0GuiSelectWorld.selectedWorld;
    302    }
    303
    304    /**
    305     * returns the select button
    306     */
    307    static GuiButton getSelectButton(GuiSelectWorld par0GuiSelectWorld)
    308    {
    309        return par0GuiSelectWorld.buttonSelect;
    310    }
    311
    312    /**
    313     * returns the rename button
    314     */
    315    static GuiButton getRenameButton(GuiSelectWorld par0GuiSelectWorld)
    316    {
    317        return par0GuiSelectWorld.buttonDelete;
    318    }
    319
    320    /**
    321     * returns the delete button
    322     */
    323    static GuiButton getDeleteButton(GuiSelectWorld par0GuiSelectWorld)
    324    {
    325        return par0GuiSelectWorld.buttonRename;
    326    }
    327
    328    static GuiButton func_82312_f(GuiSelectWorld par0GuiSelectWorld)
    329    {
    330        return par0GuiSelectWorld.buttonRecreate;
    331    }
    332
    333    static String func_82313_g(GuiSelectWorld par0GuiSelectWorld)
    334    {
    335        return par0GuiSelectWorld.localizedWorldText;
    336    }
    337
    338    static DateFormat func_82315_h(GuiSelectWorld par0GuiSelectWorld)
    339    {
    340        return par0GuiSelectWorld.dateFormatter;
    341    }
    342
    343    static String func_82311_i(GuiSelectWorld par0GuiSelectWorld)
    344    {
    345        return par0GuiSelectWorld.localizedMustConvertText;
    346    }
    347
    348    static String[] func_82314_j(GuiSelectWorld par0GuiSelectWorld)
    349    {
    350        return par0GuiSelectWorld.localizedGameModeText;
    351    }
    352}