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