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