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