001 package net.minecraft.client.settings; 002 003 import cpw.mods.fml.client.FMLClientHandler; 004 import cpw.mods.fml.relauncher.Side; 005 import cpw.mods.fml.relauncher.SideOnly; 006 import java.io.BufferedReader; 007 import java.io.File; 008 import java.io.FileReader; 009 import java.io.FileWriter; 010 import java.io.PrintWriter; 011 import net.minecraft.client.Minecraft; 012 import net.minecraft.network.packet.Packet204ClientInfo; 013 import net.minecraft.util.StatCollector; 014 import net.minecraft.util.StringTranslate; 015 import org.lwjgl.input.Keyboard; 016 import org.lwjgl.opengl.Display; 017 018 @SideOnly(Side.CLIENT) 019 public class GameSettings 020 { 021 private static final String[] RENDER_DISTANCES = new String[] {"options.renderDistance.far", "options.renderDistance.normal", "options.renderDistance.short", "options.renderDistance.tiny"}; 022 private static final String[] DIFFICULTIES = new String[] {"options.difficulty.peaceful", "options.difficulty.easy", "options.difficulty.normal", "options.difficulty.hard"}; 023 024 /** GUI scale values */ 025 private static final String[] GUISCALES = new String[] {"options.guiScale.auto", "options.guiScale.small", "options.guiScale.normal", "options.guiScale.large"}; 026 private static final String[] CHAT_VISIBILITIES = new String[] {"options.chat.visibility.full", "options.chat.visibility.system", "options.chat.visibility.hidden"}; 027 private static final String[] PARTICLES = new String[] {"options.particles.all", "options.particles.decreased", "options.particles.minimal"}; 028 029 /** Limit framerate labels */ 030 private static final String[] LIMIT_FRAMERATES = new String[] {"performance.max", "performance.balanced", "performance.powersaver"}; 031 public float musicVolume = 1.0F; 032 public float soundVolume = 1.0F; 033 public float mouseSensitivity = 0.5F; 034 public boolean invertMouse = false; 035 public int renderDistance = 0; 036 public boolean viewBobbing = true; 037 public boolean anaglyph = false; 038 039 /** Advanced OpenGL */ 040 public boolean advancedOpengl = false; 041 public int limitFramerate = 1; 042 public boolean fancyGraphics = true; 043 044 /** Smooth Lighting */ 045 public boolean ambientOcclusion = true; 046 047 /** Clouds flag */ 048 public boolean clouds = true; 049 050 /** The name of the selected texture pack. */ 051 public String skin = "Default"; 052 public int chatVisibility = 0; 053 public boolean chatColours = true; 054 public boolean chatLinks = true; 055 public boolean chatLinksPrompt = true; 056 public float chatOpacity = 1.0F; 057 public boolean serverTextures = true; 058 public boolean snooperEnabled = true; 059 public boolean fullScreen = false; 060 public boolean enableVsync = true; 061 public boolean hideServerAddress = false; 062 063 /** 064 * Whether to show advanced information on item tooltips, toggled by F3+H 065 */ 066 public boolean advancedItemTooltips = false; 067 068 /** Whether to pause when the game loses focus, toggled by F3+P */ 069 public boolean pauseOnLostFocus = true; 070 071 /** Whether to show your cape */ 072 public boolean showCape = true; 073 public boolean touchscreen = false; 074 public int field_92118_B = 0; 075 public int field_92119_C = 0; 076 public boolean field_92117_D = true; 077 public KeyBinding keyBindForward = new KeyBinding("key.forward", 17); 078 public KeyBinding keyBindLeft = new KeyBinding("key.left", 30); 079 public KeyBinding keyBindBack = new KeyBinding("key.back", 31); 080 public KeyBinding keyBindRight = new KeyBinding("key.right", 32); 081 public KeyBinding keyBindJump = new KeyBinding("key.jump", 57); 082 public KeyBinding keyBindInventory = new KeyBinding("key.inventory", 18); 083 public KeyBinding keyBindDrop = new KeyBinding("key.drop", 16); 084 public KeyBinding keyBindChat = new KeyBinding("key.chat", 20); 085 public KeyBinding keyBindSneak = new KeyBinding("key.sneak", 42); 086 public KeyBinding keyBindAttack = new KeyBinding("key.attack", -100); 087 public KeyBinding keyBindUseItem = new KeyBinding("key.use", -99); 088 public KeyBinding keyBindPlayerList = new KeyBinding("key.playerlist", 15); 089 public KeyBinding keyBindPickBlock = new KeyBinding("key.pickItem", -98); 090 public KeyBinding keyBindCommand = new KeyBinding("key.command", 53); 091 public KeyBinding[] keyBindings; 092 protected Minecraft mc; 093 private File optionsFile; 094 public int difficulty; 095 public boolean hideGUI; 096 public int thirdPersonView; 097 098 /** true if debug info should be displayed instead of version */ 099 public boolean showDebugInfo; 100 public boolean showDebugProfilerChart; 101 102 /** The lastServer string. */ 103 public String lastServer; 104 105 /** No clipping for singleplayer */ 106 public boolean noclip; 107 108 /** Smooth Camera Toggle */ 109 public boolean smoothCamera; 110 public boolean debugCamEnable; 111 112 /** No clipping movement rate */ 113 public float noclipRate; 114 115 /** Change rate for debug camera */ 116 public float debugCamRate; 117 public float fovSetting; 118 public float gammaSetting; 119 120 /** GUI scale */ 121 public int guiScale; 122 123 /** Determines amount of particles. 0 = All, 1 = Decreased, 2 = Minimal */ 124 public int particleSetting; 125 126 /** Game settings language */ 127 public String language; 128 129 public GameSettings(Minecraft par1Minecraft, File par2File) 130 { 131 this.keyBindings = new KeyBinding[] {this.keyBindAttack, this.keyBindUseItem, this.keyBindForward, this.keyBindLeft, this.keyBindBack, this.keyBindRight, this.keyBindJump, this.keyBindSneak, this.keyBindDrop, this.keyBindInventory, this.keyBindChat, this.keyBindPlayerList, this.keyBindPickBlock, this.keyBindCommand}; 132 this.difficulty = 2; 133 this.hideGUI = false; 134 this.thirdPersonView = 0; 135 this.showDebugInfo = false; 136 this.showDebugProfilerChart = false; 137 this.lastServer = ""; 138 this.noclip = false; 139 this.smoothCamera = false; 140 this.debugCamEnable = false; 141 this.noclipRate = 1.0F; 142 this.debugCamRate = 1.0F; 143 this.fovSetting = 0.0F; 144 this.gammaSetting = 0.0F; 145 this.guiScale = 0; 146 this.particleSetting = 0; 147 this.language = "en_US"; 148 this.mc = par1Minecraft; 149 this.optionsFile = new File(par2File, "options.txt"); 150 this.loadOptions(); 151 } 152 153 public GameSettings() 154 { 155 this.keyBindings = new KeyBinding[] {this.keyBindAttack, this.keyBindUseItem, this.keyBindForward, this.keyBindLeft, this.keyBindBack, this.keyBindRight, this.keyBindJump, this.keyBindSneak, this.keyBindDrop, this.keyBindInventory, this.keyBindChat, this.keyBindPlayerList, this.keyBindPickBlock, this.keyBindCommand}; 156 this.difficulty = 2; 157 this.hideGUI = false; 158 this.thirdPersonView = 0; 159 this.showDebugInfo = false; 160 this.showDebugProfilerChart = false; 161 this.lastServer = ""; 162 this.noclip = false; 163 this.smoothCamera = false; 164 this.debugCamEnable = false; 165 this.noclipRate = 1.0F; 166 this.debugCamRate = 1.0F; 167 this.fovSetting = 0.0F; 168 this.gammaSetting = 0.0F; 169 this.guiScale = 0; 170 this.particleSetting = 0; 171 this.language = "en_US"; 172 } 173 174 public String getKeyBindingDescription(int par1) 175 { 176 StringTranslate var2 = StringTranslate.getInstance(); 177 return var2.translateKey(this.keyBindings[par1].keyDescription); 178 } 179 180 /** 181 * The string that appears inside the button/slider in the options menu. 182 */ 183 public String getOptionDisplayString(int par1) 184 { 185 int var2 = this.keyBindings[par1].keyCode; 186 return getKeyDisplayString(var2); 187 } 188 189 /** 190 * Represents a key or mouse button as a string. Args: key 191 */ 192 public static String getKeyDisplayString(int par0) 193 { 194 return par0 < 0 ? StatCollector.translateToLocalFormatted("key.mouseButton", new Object[] {Integer.valueOf(par0 + 101)}): Keyboard.getKeyName(par0); 195 } 196 197 /** 198 * Sets a key binding. 199 */ 200 public void setKeyBinding(int par1, int par2) 201 { 202 this.keyBindings[par1].keyCode = par2; 203 this.saveOptions(); 204 } 205 206 /** 207 * If the specified option is controlled by a slider (float value), this will set the float value. 208 */ 209 public void setOptionFloatValue(EnumOptions par1EnumOptions, float par2) 210 { 211 if (par1EnumOptions == EnumOptions.MUSIC) 212 { 213 this.musicVolume = par2; 214 this.mc.sndManager.onSoundOptionsChanged(); 215 } 216 217 if (par1EnumOptions == EnumOptions.SOUND) 218 { 219 this.soundVolume = par2; 220 this.mc.sndManager.onSoundOptionsChanged(); 221 } 222 223 if (par1EnumOptions == EnumOptions.SENSITIVITY) 224 { 225 this.mouseSensitivity = par2; 226 } 227 228 if (par1EnumOptions == EnumOptions.FOV) 229 { 230 this.fovSetting = par2; 231 } 232 233 if (par1EnumOptions == EnumOptions.GAMMA) 234 { 235 this.gammaSetting = par2; 236 } 237 238 if (par1EnumOptions == EnumOptions.CHAT_OPACITY) 239 { 240 this.chatOpacity = par2; 241 } 242 } 243 244 /** 245 * For non-float options. Toggles the option on/off, or cycles through the list i.e. render distances. 246 */ 247 public void setOptionValue(EnumOptions par1EnumOptions, int par2) 248 { 249 if (par1EnumOptions == EnumOptions.INVERT_MOUSE) 250 { 251 this.invertMouse = !this.invertMouse; 252 } 253 254 if (par1EnumOptions == EnumOptions.RENDER_DISTANCE) 255 { 256 this.renderDistance = this.renderDistance + par2 & 3; 257 } 258 259 if (par1EnumOptions == EnumOptions.GUI_SCALE) 260 { 261 this.guiScale = this.guiScale + par2 & 3; 262 } 263 264 if (par1EnumOptions == EnumOptions.PARTICLES) 265 { 266 this.particleSetting = (this.particleSetting + par2) % 3; 267 } 268 269 if (par1EnumOptions == EnumOptions.VIEW_BOBBING) 270 { 271 this.viewBobbing = !this.viewBobbing; 272 } 273 274 if (par1EnumOptions == EnumOptions.RENDER_CLOUDS) 275 { 276 this.clouds = !this.clouds; 277 } 278 279 if (par1EnumOptions == EnumOptions.ADVANCED_OPENGL) 280 { 281 this.advancedOpengl = !this.advancedOpengl; 282 this.mc.renderGlobal.loadRenderers(); 283 } 284 285 if (par1EnumOptions == EnumOptions.ANAGLYPH) 286 { 287 this.anaglyph = !this.anaglyph; 288 this.mc.renderEngine.refreshTextures(); 289 } 290 291 if (par1EnumOptions == EnumOptions.FRAMERATE_LIMIT) 292 { 293 this.limitFramerate = (this.limitFramerate + par2 + 3) % 3; 294 } 295 296 if (par1EnumOptions == EnumOptions.DIFFICULTY) 297 { 298 this.difficulty = this.difficulty + par2 & 3; 299 } 300 301 if (par1EnumOptions == EnumOptions.GRAPHICS) 302 { 303 this.fancyGraphics = !this.fancyGraphics; 304 this.mc.renderGlobal.loadRenderers(); 305 } 306 307 if (par1EnumOptions == EnumOptions.AMBIENT_OCCLUSION) 308 { 309 this.ambientOcclusion = !this.ambientOcclusion; 310 this.mc.renderGlobal.loadRenderers(); 311 } 312 313 if (par1EnumOptions == EnumOptions.CHAT_VISIBILITY) 314 { 315 this.chatVisibility = (this.chatVisibility + par2) % 3; 316 } 317 318 if (par1EnumOptions == EnumOptions.CHAT_COLOR) 319 { 320 this.chatColours = !this.chatColours; 321 } 322 323 if (par1EnumOptions == EnumOptions.CHAT_LINKS) 324 { 325 this.chatLinks = !this.chatLinks; 326 } 327 328 if (par1EnumOptions == EnumOptions.CHAT_LINKS_PROMPT) 329 { 330 this.chatLinksPrompt = !this.chatLinksPrompt; 331 } 332 333 if (par1EnumOptions == EnumOptions.USE_SERVER_TEXTURES) 334 { 335 this.serverTextures = !this.serverTextures; 336 } 337 338 if (par1EnumOptions == EnumOptions.SNOOPER_ENABLED) 339 { 340 this.snooperEnabled = !this.snooperEnabled; 341 } 342 343 if (par1EnumOptions == EnumOptions.SHOW_CAPE) 344 { 345 this.showCape = !this.showCape; 346 } 347 348 if (par1EnumOptions == EnumOptions.TOUCHSCREEN) 349 { 350 this.touchscreen = !this.touchscreen; 351 } 352 353 if (par1EnumOptions == EnumOptions.USE_FULLSCREEN) 354 { 355 this.fullScreen = !this.fullScreen; 356 357 if (this.mc.isFullScreen() != this.fullScreen) 358 { 359 this.mc.toggleFullscreen(); 360 } 361 } 362 363 if (par1EnumOptions == EnumOptions.ENABLE_VSYNC) 364 { 365 this.enableVsync = !this.enableVsync; 366 Display.setVSyncEnabled(this.enableVsync); 367 } 368 369 this.saveOptions(); 370 } 371 372 public float getOptionFloatValue(EnumOptions par1EnumOptions) 373 { 374 return par1EnumOptions == EnumOptions.FOV ? this.fovSetting : (par1EnumOptions == EnumOptions.GAMMA ? this.gammaSetting : (par1EnumOptions == EnumOptions.MUSIC ? this.musicVolume : (par1EnumOptions == EnumOptions.SOUND ? this.soundVolume : (par1EnumOptions == EnumOptions.SENSITIVITY ? this.mouseSensitivity : (par1EnumOptions == EnumOptions.CHAT_OPACITY ? this.chatOpacity : 0.0F))))); 375 } 376 377 public boolean getOptionOrdinalValue(EnumOptions par1EnumOptions) 378 { 379 switch (EnumOptionsHelper.enumOptionsMappingHelperArray[par1EnumOptions.ordinal()]) 380 { 381 case 1: 382 return this.invertMouse; 383 case 2: 384 return this.viewBobbing; 385 case 3: 386 return this.anaglyph; 387 case 4: 388 return this.advancedOpengl; 389 case 5: 390 return this.ambientOcclusion; 391 case 6: 392 return this.clouds; 393 case 7: 394 return this.chatColours; 395 case 8: 396 return this.chatLinks; 397 case 9: 398 return this.chatLinksPrompt; 399 case 10: 400 return this.serverTextures; 401 case 11: 402 return this.snooperEnabled; 403 case 12: 404 return this.fullScreen; 405 case 13: 406 return this.enableVsync; 407 case 14: 408 return this.showCape; 409 case 15: 410 return this.touchscreen; 411 default: 412 return false; 413 } 414 } 415 416 /** 417 * Returns the translation of the given index in the given String array. If the index is smaller than 0 or greater 418 * than/equal to the length of the String array, it is changed to 0. 419 */ 420 private static String getTranslation(String[] par0ArrayOfStr, int par1) 421 { 422 if (par1 < 0 || par1 >= par0ArrayOfStr.length) 423 { 424 par1 = 0; 425 } 426 427 StringTranslate var2 = StringTranslate.getInstance(); 428 return var2.translateKey(par0ArrayOfStr[par1]); 429 } 430 431 /** 432 * Gets a key binding. 433 */ 434 public String getKeyBinding(EnumOptions par1EnumOptions) 435 { 436 StringTranslate var2 = StringTranslate.getInstance(); 437 String var3 = var2.translateKey(par1EnumOptions.getEnumString()) + ": "; 438 439 if (par1EnumOptions.getEnumFloat()) 440 { 441 float var5 = this.getOptionFloatValue(par1EnumOptions); 442 return par1EnumOptions == EnumOptions.SENSITIVITY ? (var5 == 0.0F ? var3 + var2.translateKey("options.sensitivity.min") : (var5 == 1.0F ? var3 + var2.translateKey("options.sensitivity.max") : var3 + (int)(var5 * 200.0F) + "%")) : (par1EnumOptions == EnumOptions.FOV ? (var5 == 0.0F ? var3 + var2.translateKey("options.fov.min") : (var5 == 1.0F ? var3 + var2.translateKey("options.fov.max") : var3 + (int)(70.0F + var5 * 40.0F))) : (par1EnumOptions == EnumOptions.GAMMA ? (var5 == 0.0F ? var3 + var2.translateKey("options.gamma.min") : (var5 == 1.0F ? var3 + var2.translateKey("options.gamma.max") : var3 + "+" + (int)(var5 * 100.0F) + "%")) : (par1EnumOptions == EnumOptions.CHAT_OPACITY ? var3 + (int)(var5 * 90.0F + 10.0F) + "%" : (var5 == 0.0F ? var3 + var2.translateKey("options.off") : var3 + (int)(var5 * 100.0F) + "%")))); 443 } 444 else if (par1EnumOptions.getEnumBoolean()) 445 { 446 boolean var4 = this.getOptionOrdinalValue(par1EnumOptions); 447 return var4 ? var3 + var2.translateKey("options.on") : var3 + var2.translateKey("options.off"); 448 } 449 else 450 { 451 return par1EnumOptions == EnumOptions.RENDER_DISTANCE ? var3 + getTranslation(RENDER_DISTANCES, this.renderDistance) : (par1EnumOptions == EnumOptions.DIFFICULTY ? var3 + getTranslation(DIFFICULTIES, this.difficulty) : (par1EnumOptions == EnumOptions.GUI_SCALE ? var3 + getTranslation(GUISCALES, this.guiScale) : (par1EnumOptions == EnumOptions.CHAT_VISIBILITY ? var3 + getTranslation(CHAT_VISIBILITIES, this.chatVisibility) : (par1EnumOptions == EnumOptions.PARTICLES ? var3 + getTranslation(PARTICLES, this.particleSetting) : (par1EnumOptions == EnumOptions.FRAMERATE_LIMIT ? var3 + getTranslation(LIMIT_FRAMERATES, this.limitFramerate) : (par1EnumOptions == EnumOptions.GRAPHICS ? (this.fancyGraphics ? var3 + var2.translateKey("options.graphics.fancy") : var3 + var2.translateKey("options.graphics.fast")) : var3)))))); 452 } 453 } 454 455 /** 456 * Loads the options from the options file. It appears that this has replaced the previous 'loadOptions' 457 */ 458 public void loadOptions() 459 { 460 try 461 { 462 if (!this.optionsFile.exists()) 463 { 464 return; 465 } 466 467 BufferedReader var1 = new BufferedReader(new FileReader(this.optionsFile)); 468 String var2 = ""; 469 470 while ((var2 = var1.readLine()) != null) 471 { 472 try 473 { 474 String[] var3 = var2.split(":"); 475 476 if (var3[0].equals("music")) 477 { 478 this.musicVolume = this.parseFloat(var3[1]); 479 } 480 481 if (var3[0].equals("sound")) 482 { 483 this.soundVolume = this.parseFloat(var3[1]); 484 } 485 486 if (var3[0].equals("mouseSensitivity")) 487 { 488 this.mouseSensitivity = this.parseFloat(var3[1]); 489 } 490 491 if (var3[0].equals("fov")) 492 { 493 this.fovSetting = this.parseFloat(var3[1]); 494 } 495 496 if (var3[0].equals("gamma")) 497 { 498 this.gammaSetting = this.parseFloat(var3[1]); 499 } 500 501 if (var3[0].equals("invertYMouse")) 502 { 503 this.invertMouse = var3[1].equals("true"); 504 } 505 506 if (var3[0].equals("viewDistance")) 507 { 508 this.renderDistance = Integer.parseInt(var3[1]); 509 } 510 511 if (var3[0].equals("guiScale")) 512 { 513 this.guiScale = Integer.parseInt(var3[1]); 514 } 515 516 if (var3[0].equals("particles")) 517 { 518 this.particleSetting = Integer.parseInt(var3[1]); 519 } 520 521 if (var3[0].equals("bobView")) 522 { 523 this.viewBobbing = var3[1].equals("true"); 524 } 525 526 if (var3[0].equals("anaglyph3d")) 527 { 528 this.anaglyph = var3[1].equals("true"); 529 } 530 531 if (var3[0].equals("advancedOpengl")) 532 { 533 this.advancedOpengl = var3[1].equals("true"); 534 } 535 536 if (var3[0].equals("fpsLimit")) 537 { 538 this.limitFramerate = Integer.parseInt(var3[1]); 539 } 540 541 if (var3[0].equals("difficulty")) 542 { 543 this.difficulty = Integer.parseInt(var3[1]); 544 } 545 546 if (var3[0].equals("fancyGraphics")) 547 { 548 this.fancyGraphics = var3[1].equals("true"); 549 } 550 551 if (var3[0].equals("ao")) 552 { 553 this.ambientOcclusion = var3[1].equals("true"); 554 } 555 556 if (var3[0].equals("clouds")) 557 { 558 this.clouds = var3[1].equals("true"); 559 } 560 561 if (var3[0].equals("skin")) 562 { 563 this.skin = var3[1]; 564 } 565 566 if (var3[0].equals("lastServer") && var3.length >= 2) 567 { 568 this.lastServer = var3[1]; 569 } 570 571 if (var3[0].equals("lang") && var3.length >= 2) 572 { 573 this.language = var3[1]; 574 } 575 576 if (var3[0].equals("chatVisibility")) 577 { 578 this.chatVisibility = Integer.parseInt(var3[1]); 579 } 580 581 if (var3[0].equals("chatColors")) 582 { 583 this.chatColours = var3[1].equals("true"); 584 } 585 586 if (var3[0].equals("chatLinks")) 587 { 588 this.chatLinks = var3[1].equals("true"); 589 } 590 591 if (var3[0].equals("chatLinksPrompt")) 592 { 593 this.chatLinksPrompt = var3[1].equals("true"); 594 } 595 596 if (var3[0].equals("chatOpacity")) 597 { 598 this.chatOpacity = this.parseFloat(var3[1]); 599 } 600 601 if (var3[0].equals("serverTextures")) 602 { 603 this.serverTextures = var3[1].equals("true"); 604 } 605 606 if (var3[0].equals("snooperEnabled")) 607 { 608 this.snooperEnabled = var3[1].equals("true"); 609 } 610 611 if (var3[0].equals("fullscreen")) 612 { 613 this.fullScreen = var3[1].equals("true"); 614 } 615 616 if (var3[0].equals("enableVsync")) 617 { 618 this.enableVsync = var3[1].equals("true"); 619 } 620 621 if (var3[0].equals("hideServerAddress")) 622 { 623 this.hideServerAddress = var3[1].equals("true"); 624 } 625 626 if (var3[0].equals("advancedItemTooltips")) 627 { 628 this.advancedItemTooltips = var3[1].equals("true"); 629 } 630 631 if (var3[0].equals("pauseOnLostFocus")) 632 { 633 this.pauseOnLostFocus = var3[1].equals("true"); 634 } 635 636 if (var3[0].equals("showCape")) 637 { 638 this.showCape = var3[1].equals("true"); 639 } 640 641 if (var3[0].equals("touchscreen")) 642 { 643 this.touchscreen = var3[1].equals("true"); 644 } 645 646 if (var3[0].equals("overrideHeight")) 647 { 648 this.field_92119_C = Integer.parseInt(var3[1]); 649 } 650 651 if (var3[0].equals("overrideWidth")) 652 { 653 this.field_92118_B = Integer.parseInt(var3[1]); 654 } 655 656 if (var3[0].equals("heldItemTooltips")) 657 { 658 this.field_92117_D = var3[1].equals("true"); 659 } 660 661 for (int var4 = 0; var4 < this.keyBindings.length; ++var4) 662 { 663 if (var3[0].equals("key_" + this.keyBindings[var4].keyDescription)) 664 { 665 this.keyBindings[var4].keyCode = Integer.parseInt(var3[1]); 666 } 667 } 668 } 669 catch (Exception var5) 670 { 671 System.out.println("Skipping bad option: " + var2); 672 } 673 } 674 675 KeyBinding.resetKeyBindingArrayAndHash(); 676 var1.close(); 677 } 678 catch (Exception var6) 679 { 680 System.out.println("Failed to load options"); 681 var6.printStackTrace(); 682 } 683 } 684 685 /** 686 * Parses a string into a float. 687 */ 688 private float parseFloat(String par1Str) 689 { 690 return par1Str.equals("true") ? 1.0F : (par1Str.equals("false") ? 0.0F : Float.parseFloat(par1Str)); 691 } 692 693 /** 694 * Saves the options to the options file. 695 */ 696 public void saveOptions() 697 { 698 if (FMLClientHandler.instance().isLoading()) return; 699 try 700 { 701 PrintWriter var1 = new PrintWriter(new FileWriter(this.optionsFile)); 702 var1.println("music:" + this.musicVolume); 703 var1.println("sound:" + this.soundVolume); 704 var1.println("invertYMouse:" + this.invertMouse); 705 var1.println("mouseSensitivity:" + this.mouseSensitivity); 706 var1.println("fov:" + this.fovSetting); 707 var1.println("gamma:" + this.gammaSetting); 708 var1.println("viewDistance:" + this.renderDistance); 709 var1.println("guiScale:" + this.guiScale); 710 var1.println("particles:" + this.particleSetting); 711 var1.println("bobView:" + this.viewBobbing); 712 var1.println("anaglyph3d:" + this.anaglyph); 713 var1.println("advancedOpengl:" + this.advancedOpengl); 714 var1.println("fpsLimit:" + this.limitFramerate); 715 var1.println("difficulty:" + this.difficulty); 716 var1.println("fancyGraphics:" + this.fancyGraphics); 717 var1.println("ao:" + this.ambientOcclusion); 718 var1.println("clouds:" + this.clouds); 719 var1.println("skin:" + this.skin); 720 var1.println("lastServer:" + this.lastServer); 721 var1.println("lang:" + this.language); 722 var1.println("chatVisibility:" + this.chatVisibility); 723 var1.println("chatColors:" + this.chatColours); 724 var1.println("chatLinks:" + this.chatLinks); 725 var1.println("chatLinksPrompt:" + this.chatLinksPrompt); 726 var1.println("chatOpacity:" + this.chatOpacity); 727 var1.println("serverTextures:" + this.serverTextures); 728 var1.println("snooperEnabled:" + this.snooperEnabled); 729 var1.println("fullscreen:" + this.fullScreen); 730 var1.println("enableVsync:" + this.enableVsync); 731 var1.println("hideServerAddress:" + this.hideServerAddress); 732 var1.println("advancedItemTooltips:" + this.advancedItemTooltips); 733 var1.println("pauseOnLostFocus:" + this.pauseOnLostFocus); 734 var1.println("showCape:" + this.showCape); 735 var1.println("touchscreen:" + this.touchscreen); 736 var1.println("overrideWidth:" + this.field_92118_B); 737 var1.println("overrideHeight:" + this.field_92119_C); 738 var1.println("heldItemTooltips:" + this.field_92117_D); 739 740 for (int var2 = 0; var2 < this.keyBindings.length; ++var2) 741 { 742 var1.println("key_" + this.keyBindings[var2].keyDescription + ":" + this.keyBindings[var2].keyCode); 743 } 744 745 var1.close(); 746 } 747 catch (Exception var3) 748 { 749 System.out.println("Failed to save options"); 750 var3.printStackTrace(); 751 } 752 753 this.sendSettingsToServer(); 754 } 755 756 /** 757 * Send a client info packet with settings information to the server 758 */ 759 public void sendSettingsToServer() 760 { 761 if (this.mc.thePlayer != null) 762 { 763 this.mc.thePlayer.sendQueue.addToSendQueue(new Packet204ClientInfo(this.language, this.renderDistance, this.chatVisibility, this.chatColours, this.difficulty, this.showCape)); 764 } 765 } 766 767 /** 768 * Should render clouds 769 */ 770 public boolean shouldRenderClouds() 771 { 772 return this.renderDistance < 2 && this.clouds; 773 } 774 }