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