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