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 }