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    }