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