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