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