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