001package net.minecraft.client.gui;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.util.Random;
006import net.minecraft.util.ChatAllowedCharacters;
007import net.minecraft.util.MathHelper;
008import net.minecraft.util.StatCollector;
009import net.minecraft.util.StringTranslate;
010import net.minecraft.world.EnumGameType;
011import net.minecraft.world.WorldSettings;
012import net.minecraft.world.WorldType;
013import net.minecraft.world.storage.ISaveFormat;
014import net.minecraft.world.storage.WorldInfo;
015import org.lwjgl.input.Keyboard;
016
017@SideOnly(Side.CLIENT)
018public 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                WorldType.worldTypes[this.worldTypeId].onCustomizeButton(this.mc, this);
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].isCustomizable());
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}