001 package net.minecraft.client.settings;
002
003 import cpw.mods.fml.client.FMLClientHandler;
004 import cpw.mods.fml.relauncher.Side;
005 import cpw.mods.fml.relauncher.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 net.minecraft.network.packet.Packet204ClientInfo;
013 import net.minecraft.util.StatCollector;
014 import net.minecraft.util.StringTranslate;
015 import org.lwjgl.input.Keyboard;
016 import org.lwjgl.opengl.Display;
017
018 @SideOnly(Side.CLIENT)
019 public 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 }