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().getWorldTypeID();
487            this.field_82290_a = par1WorldInfo.getGeneratorOptions();
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    }