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 }