    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}