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