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