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    }