    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.Random;
    006    import org.lwjgl.input.Keyboard;
    007
    008    @SideOnly(Side.CLIENT)
    009    public class GuiCreateWorld extends GuiScreen
    010    {
    011        private GuiScreen parentGuiScreen;
    012        private GuiTextField textboxWorldName;
    013        private GuiTextField textboxSeed;
    014        private String folderName;
    015
    016        /** hardcore', 'creative' or 'survival */
    017        private String gameMode = "survival";
    018        private boolean generateStructures = true;
    019        private boolean commandsAllowed = false;
    020
    021        /** True iif player has clicked buttonAllowCommands at least once */
    022        private boolean commandsToggled = false;
    023
    024        /** toggles when GUIButton 7 is pressed */
    025        private boolean bonusItems = false;
    026
    027        /** True if and only if gameMode.equals("hardcore") */
    028        private boolean isHardcore = false;
    029        private boolean createClicked;
    030
    031        /**
    032         * True if the extra options (Seed box, structure toggle button, world type button, etc.) are being shown
    033         */
    034        private boolean moreOptions;
    035
    036        /** The GUIButton that you click to change game modes. */
    037        private GuiButton buttonGameMode;
    038
    039        /**
    040         * The GUIButton that you click to get to options like the seed when creating a world.
    041         */
    042        private GuiButton moreWorldOptions;
    043
    044        /** The GuiButton in the 'More World Options' screen. Toggles ON/OFF */
    045        private GuiButton buttonGenerateStructures;
    046        private GuiButton buttonBonusItems;
    047
    048        /** The GuiButton in the more world options screen. */
    049        private GuiButton buttonWorldType;
    050        private GuiButton buttonAllowCommands;
    051        private GuiButton field_82289_B;
    052
    053        /** The first line of text describing the currently selected game mode. */
    054        private String gameModeDescriptionLine1;
    055
    056        /** The second line of text describing the currently selected game mode. */
    057        private String gameModeDescriptionLine2;
    058
    059        /** The current textboxSeed text */
    060        private String seed;
    061
    062        /** E.g. New World, Neue Welt, Nieuwe wereld, Neuvo Mundo */
    063        private String localizedNewWorldText;
    064        private int worldTypeId = 0;
    065        public String field_82290_a = "";
    066
    067        /**
    068         * If the world name is one of these, it'll be surrounded with underscores.
    069         */
    070        private static final String[] ILLEGAL_WORLD_NAMES = new String[] {"CON", "COM", "PRN", "AUX", "CLOCK$", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"};
    071
    072        public GuiCreateWorld(GuiScreen par1GuiScreen)
    073        {
    074            this.parentGuiScreen = par1GuiScreen;
    075            this.seed = "";
    076            this.localizedNewWorldText = StatCollector.translateToLocal("selectWorld.newWorld");
    077        }
    078
    079        /**
    080         * Called from the main game loop to update the screen.
    081         */
    082        public void updateScreen()
    083        {
    084            this.textboxWorldName.updateCursorCounter();
    085            this.textboxSeed.updateCursorCounter();
    086        }
    087
    088        /**
    089         * Adds the buttons (and other controls) to the screen in question.
    090         */
    091        public void initGui()
    092        {
    093            StringTranslate var1 = StringTranslate.getInstance();
    094            Keyboard.enableRepeatEvents(true);
    095            this.controlList.clear();
    096            this.controlList.add(new GuiButton(0, this.width / 2 - 155, this.height - 28, 150, 20, var1.translateKey("selectWorld.create")));
    097            this.controlList.add(new GuiButton(1, this.width / 2 + 5, this.height - 28, 150, 20, var1.translateKey("gui.cancel")));
    098            this.controlList.add(this.buttonGameMode = new GuiButton(2, this.width / 2 - 75, 115, 150, 20, var1.translateKey("selectWorld.gameMode")));
    099            this.controlList.add(this.moreWorldOptions = new GuiButton(3, this.width / 2 - 75, 187, 150, 20, var1.translateKey("selectWorld.moreWorldOptions")));
    100            this.controlList.add(this.buttonGenerateStructures = new GuiButton(4, this.width / 2 - 155, 100, 150, 20, var1.translateKey("selectWorld.mapFeatures")));
    101            this.buttonGenerateStructures.drawButton = false;
    102            this.controlList.add(this.buttonBonusItems = new GuiButton(7, this.width / 2 + 5, 151, 150, 20, var1.translateKey("selectWorld.bonusItems")));
    103            this.buttonBonusItems.drawButton = false;
    104            this.controlList.add(this.buttonWorldType = new GuiButton(5, this.width / 2 + 5, 100, 150, 20, var1.translateKey("selectWorld.mapType")));
    105            this.buttonWorldType.drawButton = false;
    106            this.controlList.add(this.buttonAllowCommands = new GuiButton(6, this.width / 2 - 155, 151, 150, 20, var1.translateKey("selectWorld.allowCommands")));
    107            this.buttonAllowCommands.drawButton = false;
    108            this.controlList.add(this.field_82289_B = new GuiButton(8, this.width / 2 + 5, 120, 150, 20, var1.translateKey("selectWorld.customizeType")));
    109            this.field_82289_B.drawButton = false;
    110            this.textboxWorldName = new GuiTextField(this.fontRenderer, this.width / 2 - 100, 60, 200, 20);
    111            this.textboxWorldName.setFocused(true);
    112            this.textboxWorldName.setText(this.localizedNewWorldText);
    113            this.textboxSeed = new GuiTextField(this.fontRenderer, this.width / 2 - 100, 60, 200, 20);
    114            this.textboxSeed.setText(this.seed);
    115            this.func_82288_a(this.moreOptions);
    116            this.makeUseableName();
    117            this.updateButtonText();
    118        }
    119
    120        /**
    121         * Makes a the name for a world save folder based on your world name, replacing specific characters for _s and
    122         * appending -s to the end until a free name is available.
    123         */
    124        private void makeUseableName()
    125        {
    126            this.folderName = this.textboxWorldName.getText().trim();
    127            char[] var1 = ChatAllowedCharacters.allowedCharactersArray;
    128            int var2 = var1.length;
    129
    130            for (int var3 = 0; var3 < var2; ++var3)
    131            {
    132                char var4 = var1[var3];
    133                this.folderName = this.folderName.replace(var4, '_');
    134            }
    135
    136            if (MathHelper.stringNullOrLengthZero(this.folderName))
    137            {
    138                this.folderName = "World";
    139            }
    140
    141            this.folderName = func_73913_a(this.mc.getSaveLoader(), this.folderName);
    142        }
    143
    144        private void updateButtonText()
    145        {
    146            StringTranslate var1 = StringTranslate.getInstance();
    147            this.buttonGameMode.displayString = var1.translateKey("selectWorld.gameMode") + " " + var1.translateKey("selectWorld.gameMode." + this.gameMode);
    148            this.gameModeDescriptionLine1 = var1.translateKey("selectWorld.gameMode." + this.gameMode + ".line1");
    149            this.gameModeDescriptionLine2 = var1.translateKey("selectWorld.gameMode." + this.gameMode + ".line2");
    150            this.buttonGenerateStructures.displayString = var1.translateKey("selectWorld.mapFeatures") + " ";
    151
    152            if (this.generateStructures)
    153            {
    154                this.buttonGenerateStructures.displayString = this.buttonGenerateStructures.displayString + var1.translateKey("options.on");
    155            }
    156            else
    157            {
    158                this.buttonGenerateStructures.displayString = this.buttonGenerateStructures.displayString + var1.translateKey("options.off");
    159            }
    160
    161            this.buttonBonusItems.displayString = var1.translateKey("selectWorld.bonusItems") + " ";
    162
    163            if (this.bonusItems && !this.isHardcore)
    164            {
    165                this.buttonBonusItems.displayString = this.buttonBonusItems.displayString + var1.translateKey("options.on");
    166            }
    167            else
    168            {
    169                this.buttonBonusItems.displayString = this.buttonBonusItems.displayString + var1.translateKey("options.off");
    170            }
    171
    172            this.buttonWorldType.displayString = var1.translateKey("selectWorld.mapType") + " " + var1.translateKey(WorldType.worldTypes[this.worldTypeId].getTranslateName());
    173            this.buttonAllowCommands.displayString = var1.translateKey("selectWorld.allowCommands") + " ";
    174
    175            if (this.commandsAllowed && !this.isHardcore)
    176            {
    177                this.buttonAllowCommands.displayString = this.buttonAllowCommands.displayString + var1.translateKey("options.on");
    178            }
    179            else
    180            {
    181                this.buttonAllowCommands.displayString = this.buttonAllowCommands.displayString + var1.translateKey("options.off");
    182            }
    183        }
    184
    185        public static String func_73913_a(ISaveFormat par0ISaveFormat, String par1Str)
    186        {
    187            par1Str = par1Str.replaceAll("[\\./\"]", "_");
    188            String[] var2 = ILLEGAL_WORLD_NAMES;
    189            int var3 = var2.length;
    190
    191            for (int var4 = 0; var4 < var3; ++var4)
    192            {
    193                String var5 = var2[var4];
    194
    195                if (par1Str.equalsIgnoreCase(var5))
    196                {
    197                    par1Str = "_" + par1Str + "_";
    198                }
    199            }
    200
    201            while (par0ISaveFormat.getWorldInfo(par1Str) != null)
    202            {
    203                par1Str = par1Str + "-";
    204            }
    205
    206            return par1Str;
    207        }
    208
    209        /**
    210         * Called when the screen is unloaded. Used to disable keyboard repeat events
    211         */
    212        public void onGuiClosed()
    213        {
    214            Keyboard.enableRepeatEvents(false);
    215        }
    216
    217        /**
    218         * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
    219         */
    220        protected void actionPerformed(GuiButton par1GuiButton)
    221        {
    222            if (par1GuiButton.enabled)
    223            {
    224                if (par1GuiButton.id == 1)
    225                {
    226                    this.mc.displayGuiScreen(this.parentGuiScreen);
    227                }
    228                else if (par1GuiButton.id == 0)
    229                {
    230                    this.mc.displayGuiScreen((GuiScreen)null);
    231
    232                    if (this.createClicked)
    233                    {
    234                        return;
    235                    }
    236
    237                    this.createClicked = true;
    238                    long var2 = (new Random()).nextLong();
    239                    String var4 = this.textboxSeed.getText();
    240
    241                    if (!MathHelper.stringNullOrLengthZero(var4))
    242                    {
    243                        try
    244                        {
    245                            long var5 = Long.parseLong(var4);
    246
    247                            if (var5 != 0L)
    248                            {
    249                                var2 = var5;
    250                            }
    251                        }
    252                        catch (NumberFormatException var7)
    253                        {
    254                            var2 = (long)var4.hashCode();
    255                        }
    256                    }
    257
    258                    WorldType.worldTypes[this.worldTypeId].onGUICreateWorldPress();
    259                    EnumGameType var8 = EnumGameType.getByName(this.gameMode);
    260                    WorldSettings var6 = new WorldSettings(var2, var8, this.generateStructures, this.isHardcore, WorldType.worldTypes[this.worldTypeId]);
    261                    var6.func_82750_a(this.field_82290_a);
    262
    263                    if (this.bonusItems && !this.isHardcore)
    264                    {
    265                        var6.enableBonusChest();
    266                    }
    267
    268                    if (this.commandsAllowed && !this.isHardcore)
    269                    {
    270                        var6.enableCommands();
    271                    }
    272
    273                    this.mc.launchIntegratedServer(this.folderName, this.textboxWorldName.getText().trim(), var6);
    274                }
    275                else if (par1GuiButton.id == 3)
    276                {
    277                    this.func_82287_i();
    278                }
    279                else if (par1GuiButton.id == 2)
    280                {
    281                    if (this.gameMode.equals("survival"))
    282                    {
    283                        if (!this.commandsToggled)
    284                        {
    285                            this.commandsAllowed = false;
    286                        }
    287
    288                        this.isHardcore = false;
    289                        this.gameMode = "hardcore";
    290                        this.isHardcore = true;
    291                        this.buttonAllowCommands.enabled = false;
    292                        this.buttonBonusItems.enabled = false;
    293                        this.updateButtonText();
    294                    }
    295                    else if (this.gameMode.equals("hardcore"))
    296                    {
    297                        if (!this.commandsToggled)
    298                        {
    299                            this.commandsAllowed = true;
    300                        }
    301
    302                        this.isHardcore = false;
    303                        this.gameMode = "creative";
    304                        this.updateButtonText();
    305                        this.isHardcore = false;
    306                        this.buttonAllowCommands.enabled = true;
    307                        this.buttonBonusItems.enabled = true;
    308                    }
    309                    else
    310                    {
    311                        if (!this.commandsToggled)
    312                        {
    313                            this.commandsAllowed = false;
    314                        }
    315
    316                        this.gameMode = "survival";
    317                        this.updateButtonText();
    318                        this.buttonAllowCommands.enabled = true;
    319                        this.buttonBonusItems.enabled = true;
    320                        this.isHardcore = false;
    321                    }
    322
    323                    this.updateButtonText();
    324                }
    325                else if (par1GuiButton.id == 4)
    326                {
    327                    this.generateStructures = !this.generateStructures;
    328                    this.updateButtonText();
    329                }
    330                else if (par1GuiButton.id == 7)
    331                {
    332                    this.bonusItems = !this.bonusItems;
    333                    this.updateButtonText();
    334                }
    335                else if (par1GuiButton.id == 5)
    336                {
    337                    ++this.worldTypeId;
    338
    339                    if (this.worldTypeId >= WorldType.worldTypes.length)
    340                    {
    341                        this.worldTypeId = 0;
    342                    }
    343
    344                    while (WorldType.worldTypes[this.worldTypeId] == null || !WorldType.worldTypes[this.worldTypeId].getCanBeCreated())
    345                    {
    346                        ++this.worldTypeId;
    347
    348                        if (this.worldTypeId >= WorldType.worldTypes.length)
    349                        {
    350                            this.worldTypeId = 0;
    351                        }
    352                    }
    353
    354                    this.field_82290_a = "";
    355                    this.updateButtonText();
    356                    this.func_82288_a(this.moreOptions);
    357                }
    358                else if (par1GuiButton.id == 6)
    359                {
    360                    this.commandsToggled = true;
    361                    this.commandsAllowed = !this.commandsAllowed;
    362                    this.updateButtonText();
    363                }
    364                else if (par1GuiButton.id == 8)
    365                {
    366                    this.mc.displayGuiScreen(new GuiCreateFlatWorld(this, this.field_82290_a));
    367                }
    368            }
    369        }
    370
    371        private void func_82287_i()
    372        {
    373            this.func_82288_a(!this.moreOptions);
    374        }
    375
    376        private void func_82288_a(boolean par1)
    377        {
    378            this.moreOptions = par1;
    379            this.buttonGameMode.drawButton = !this.moreOptions;
    380            this.buttonGenerateStructures.drawButton = this.moreOptions;
    381            this.buttonBonusItems.drawButton = this.moreOptions;
    382            this.buttonWorldType.drawButton = this.moreOptions;
    383            this.buttonAllowCommands.drawButton = this.moreOptions;
    384            this.field_82289_B.drawButton = this.moreOptions && WorldType.worldTypes[this.worldTypeId] == WorldType.FLAT;
    385            StringTranslate var2;
    386
    387            if (this.moreOptions)
    388            {
    389                var2 = StringTranslate.getInstance();
    390                this.moreWorldOptions.displayString = var2.translateKey("gui.done");
    391            }
    392            else
    393            {
    394                var2 = StringTranslate.getInstance();
    395                this.moreWorldOptions.displayString = var2.translateKey("selectWorld.moreWorldOptions");
    396            }
    397        }
    398
    399        /**
    400         * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
    401         */
    402        protected void keyTyped(char par1, int par2)
    403        {
    404            if (this.textboxWorldName.isFocused() && !this.moreOptions)
    405            {
    406                this.textboxWorldName.textboxKeyTyped(par1, par2);
    407                this.localizedNewWorldText = this.textboxWorldName.getText();
    408            }
    409            else if (this.textboxSeed.isFocused() && this.moreOptions)
    410            {
    411                this.textboxSeed.textboxKeyTyped(par1, par2);
    412                this.seed = this.textboxSeed.getText();
    413            }
    414
    415            if (par1 == 13)
    416            {
    417                this.actionPerformed((GuiButton)this.controlList.get(0));
    418            }
    419
    420            ((GuiButton)this.controlList.get(0)).enabled = this.textboxWorldName.getText().length() > 0;
    421            this.makeUseableName();
    422        }
    423
    424        /**
    425         * Called when the mouse is clicked.
    426         */
    427        protected void mouseClicked(int par1, int par2, int par3)
    428        {
    429            super.mouseClicked(par1, par2, par3);
    430
    431            if (this.moreOptions)
    432            {
    433                this.textboxSeed.mouseClicked(par1, par2, par3);
    434            }
    435            else
    436            {
    437                this.textboxWorldName.mouseClicked(par1, par2, par3);
    438            }
    439        }
    440
    441        /**
    442         * Draws the screen and all the components in it.
    443         */
    444        public void drawScreen(int par1, int par2, float par3)
    445        {
    446            StringTranslate var4 = StringTranslate.getInstance();
    447            this.drawDefaultBackground();
    448            this.drawCenteredString(this.fontRenderer, var4.translateKey("selectWorld.create"), this.width / 2, 20, 16777215);
    449
    450            if (this.moreOptions)
    451            {
    452                this.drawString(this.fontRenderer, var4.translateKey("selectWorld.enterSeed"), this.width / 2 - 100, 47, 10526880);
    453                this.drawString(this.fontRenderer, var4.translateKey("selectWorld.seedInfo"), this.width / 2 - 100, 85, 10526880);
    454                this.drawString(this.fontRenderer, var4.translateKey("selectWorld.mapFeatures.info"), this.width / 2 - 150, 122, 10526880);
    455                this.drawString(this.fontRenderer, var4.translateKey("selectWorld.allowCommands.info"), this.width / 2 - 150, 172, 10526880);
    456                this.textboxSeed.drawTextBox();
    457            }
    458            else
    459            {
    460                this.drawString(this.fontRenderer, var4.translateKey("selectWorld.enterName"), this.width / 2 - 100, 47, 10526880);
    461                this.drawString(this.fontRenderer, var4.translateKey("selectWorld.resultFolder") + " " + this.folderName, this.width / 2 - 100, 85, 10526880);
    462                this.textboxWorldName.drawTextBox();
    463                this.drawString(this.fontRenderer, this.gameModeDescriptionLine1, this.width / 2 - 100, 137, 10526880);
    464                this.drawString(this.fontRenderer, this.gameModeDescriptionLine2, this.width / 2 - 100, 149, 10526880);
    465            }
    466
    467            super.drawScreen(par1, par2, par3);
    468        }
    469
    470        public void func_82286_a(WorldInfo par1WorldInfo)
    471        {
    472            this.localizedNewWorldText = StatCollector.translateToLocalFormatted("selectWorld.newWorld.copyOf", new Object[] {par1WorldInfo.getWorldName()});
    473            this.seed = par1WorldInfo.getSeed() + "";
    474            this.worldTypeId = par1WorldInfo.getTerrainType().func_82747_f();
    475            this.field_82290_a = par1WorldInfo.func_82571_y();
    476            this.generateStructures = par1WorldInfo.isMapFeaturesEnabled();
    477            this.commandsAllowed = par1WorldInfo.areCommandsAllowed();
    478
    479            if (par1WorldInfo.isHardcoreModeEnabled())
    480            {
    481                this.gameMode = "hardcore";
    482            }
    483            else if (par1WorldInfo.getGameType().isSurvivalOrAdventure())
    484            {
    485                this.gameMode = "survival";
    486            }
    487            else if (par1WorldInfo.getGameType().isCreative())
    488            {
    489                this.gameMode = "creative";
    490            }
    491        }
    492    }