/* * This file is part of the Haven & Hearth game client. * Copyright (C) 2009 Fredrik Tolf <fredrik@dolda2000.com>, and * Björn Johannessen <johannessen.bjorn@gmail.com> * * Redistribution and/or modification of this file is subject to the * terms of the GNU Lesser General Public License, version 3, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Other parts of this source tree adhere to other copying * rights. Please see the file `COPYING' in the root directory of the * source tree for details. * * A copy the GNU Lesser General Public License is distributed along * with the source tree of which this file is a part in the file * `doc/LPGL-3'. If it is missing for any reason, please see the Free * Software Foundation's website at <http://www.fsf.org/>, or write * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA */ package haven; import static haven.Utils.getprop; import haven.geoloc.MapTileData; import haven.pathfinder.Node; import java.awt.Color; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.regex.Pattern; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import ender.CurioInfo; import ender.GoogleTranslator; import ender.HLInfo; import ender.SkillAvailability; import ender.SkillAvailability.Combat; public class Config { public static byte[] authck; public static String authuser; public static String authserv; public static String defserv; public static URL resurl, mapurl; public static boolean fullscreen; public static boolean dbtext; public static boolean bounddb; public static boolean profile; public static boolean nolocalres; public static String resdir; public static boolean nopreload; public static String loadwaited, allused; public static boolean xray; public static boolean hide; public static boolean grid; public static boolean timestamp; public static boolean new_chat; public static boolean highlight = false; public static boolean use_smileys; public static boolean zoom; public static boolean noborders; public static boolean new_minimap; public static boolean simple_plants = false; public static boolean fepbar = false; public static Set<String> hideObjectList; public static Set<String> highlightItemList; public static Map<String, HLInfo> hlcfg = new HashMap<String, HLInfo>(); public static Map<String, Set<String>> hlgroups = new HashMap<String, Set<String>>(); public static Map<String, Set<String>> hlcgroups = new HashMap<String, Set<String>>(); public static HashMap<Pattern, String> smileys; public static boolean nightvision; public static Properties options, window_props; public static int sfxVol; public static int musicVol; public static boolean isMusicOn = false; public static boolean isSoundOn = false; public static boolean showRadius = false; public static boolean showHidden = false; public static boolean showBeast = false; public static boolean showDirection; public static boolean showNames; public static boolean showOtherNames; public static boolean fastFlowerAnim; public static boolean sshot_compress; public static boolean sshot_noui; public static boolean sshot_nonames; public static boolean newclaim; public static boolean showq; public static boolean showpath; public static Map<String, Map<String, Float>> FEPMap = new HashMap<String, Map<String, Float>>(); public static Map<String, CurioInfo> curios = new HashMap<String, CurioInfo>(); public static Map<String, ItemType> itemTypes = new HashMap<String, ItemType>(); public static Map<String, Node.Type> obTypes = new HashMap<String, Node.Type>(); public static Map<Short, List<MapTileData>> geoLocs = new HashMap<Short, List<MapTileData>>(); public static Map<String, SkillAvailability> skills; public static Map<String, String> crafts = new HashMap<String, String>(); public static Map<String, String> beasts = new HashMap<String, String>(); public static List<LoginData> logins = new ArrayList<LoginData>(); // public static public static boolean highlightSkills; public static boolean fps = false; public static boolean TEST = false; public static boolean simplemap = false; public static boolean dontScaleMMIcons = true; public static boolean radar; public static boolean showViewDistance; public static boolean autohearth; public static boolean hearthunknown; public static boolean hearthred; public static boolean muteChat = false; public static boolean showgobpath; public static boolean showothergobpath = true; public static boolean edgedTiles = false; // new public static boolean maxWindow = true; // new public static boolean broadleafTile = false; // new public static boolean autoaggro = false; public static boolean aggrored = false; public static boolean aggrounknown = false; public static boolean alarm = false; public static boolean alarmred = false; public static boolean alarmunknown = false; public static boolean tracking = true; public static boolean crime = false; public static boolean gobHealth = false; public static boolean boatHitbox = false; // script bools public static boolean runFlaskRunning = false; public static boolean runFlask = true; public static boolean forcemod = false; public static boolean pathDrinker = false; public static boolean runFlaskSuppression = false; public static boolean minerSafety = false; // script bools public static int maxTextureSize; static { try { String p; if ((p = getprop("haven.authck", null)) != null) authck = Utils.hex2byte(p); authuser = getprop("haven.authuser", null); authserv = getprop("haven.authserv", null); defserv = getprop("haven.defserv", null); if (!(p = getprop("haven.resurl", "http://www.havenandhearth.com/res/")).equals("")) resurl = new URL(p); if (!(p = getprop("haven.mapurl", "http://www.havenandhearth.com/mm/")).equals("")) mapurl = new URL(p); fullscreen = getprop("haven.fullscreen", "off").equals("on"); loadwaited = getprop("haven.loadwaited", null); allused = getprop("haven.allused", null); dbtext = getprop("haven.dbtext", "off").equals("on"); bounddb = getprop("haven.bounddb", "off").equals("on"); profile = getprop("haven.profile", "off").equals("on"); nolocalres = getprop("haven.nolocalres", "").equals("yesimsure"); resdir = getprop("haven.resdir", null); nopreload = getprop("haven.nopreload", "no").equals("yes"); xray = false; hide = false; grid = false; timestamp = false; nightvision = true; zoom = false; new_minimap = true; GoogleTranslator.lang = "en"; GoogleTranslator.turnedon = false; options = new Properties(); window_props = new Properties(); hideObjectList = Collections.synchronizedSet(new HashSet<String>()); highlightItemList = Collections.synchronizedSet(new HashSet<String>()); loadOptions(); loadWindowOptions(); loadSmileys(); loadFEP(); loadCurios(); loadItemTypes(); loadObTypes(); loadSkills(); loadCraft(); loadGeoloc(); loadHighlight(); loadCurrentHighlight(); loadBeasts(); loadLogins(); } catch (java.net.MalformedURLException e) { throw (new RuntimeException(e)); } } public static String mksmiley(String str) { synchronized (smileys) { for (Pattern p : Config.smileys.keySet()) { String res = Config.smileys.get(p); str = p.matcher(str).replaceAll(res); } } return str; } public static void saveCurrentHighlights() { try { JSONObject cfg = new JSONObject(); for (String group : hlcgroups.keySet()) { cfg.put(group, hlcgroups.get(group)); } try { FileWriter fw = new FileWriter("highlight.cfg"); cfg.write(fw); fw.close(); } catch (IOException e) { e.printStackTrace(); } } catch (JSONException e) { e.printStackTrace(); } } private static void loadBeasts() { // bear String pat = "kritter/bear"; HLInfo inf = new HLInfo(pat, "mmap/bear"); Color col = new Color(0xff797c); inf.setColor(col); beasts.put(pat, "Bear"); inf.show = true; // new hlcfg.put(pat, inf); // boar pat = "kritter/boar"; inf = new HLInfo(pat, "mmap/boar"); inf.setColor(col); beasts.put(pat, "Boar"); inf.show = true; // new hlcfg.put(pat, inf); // deer pat = "kritter/deer"; inf = new HLInfo(pat, "mmap/deer"); inf.setColor(new Color(0x7BAF8E)); beasts.put(pat, "Deer"); inf.show = false; // new hlcfg.put(pat, inf); // fox pat = "kritter/fox"; inf = new HLInfo(pat, "mmap/fox"); inf.setColor(new Color(0xAF8E5B)); beasts.put(pat, "Fox"); inf.show = false; hlcfg.put(pat, inf); // rabbit pat = "kritter/hare"; inf = new HLInfo(pat, "mmap/rabbit"); inf.setColor(new Color(0x8E8E8E)); beasts.put(pat, "Rabbit"); inf.show = false; // new hlcfg.put(pat, inf); // battering ram pat = "kritter/bram"; inf = new HLInfo(pat, "paginae/build/bram"); inf.setColor(Color.PINK); beasts.put(pat, "Ram"); inf.show = false; hlcfg.put(pat, inf); // auroch pat = "kritter/aurochs"; inf = new HLInfo(pat, "mmap/aurochs"); inf.setColor(new Color(0x8E8E8E)); beasts.put(pat, "Aurochs"); inf.show = false; hlcfg.put(pat, inf); // mouflon pat = "kritter/mufflon"; inf = new HLInfo(pat, "mmap/mufflon"); inf.setColor(new Color(0x8E8E8E)); beasts.put(pat, "Mufflon"); inf.show = false; hlcfg.put(pat, inf); } private static void loadHighlight() { try { FileInputStream fstream; fstream = new FileInputStream("highlight.conf"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String data = ""; String strLine; while ((strLine = br.readLine()) != null) { data += strLine; } try { JSONObject cfg = new JSONObject(data); Iterator<String> keys = cfg.keys(); while (keys.hasNext()) { String key = keys.next(); Set<String> group = new HashSet<String>(); Set<String> group2 = new HashSet<String>(); hlgroups.put(key, group); hlcgroups.put(key, group2); JSONArray arr = cfg.getJSONArray(key); for (int i = 0; i < arr.length(); i++) { JSONObject o = arr.getJSONObject(i); String name = o.getString("name"); String icon = null; if (!o.isNull("icon")) { icon = o.getString("icon"); } HLInfo inf = new HLInfo(name, icon); if (!o.isNull("color")) { inf.setColor(new Color(Integer.parseInt(o.getString("color"), 16))); } hlcfg.put(name, inf); group.add(name); group2.add(name); } } } catch (JSONException e) { e.printStackTrace(); } br.close(); fstream.close(); } catch (FileNotFoundException e) { } catch (IOException e) { } } private static void loadCurrentHighlight() { try { FileInputStream fstream; fstream = new FileInputStream("highlight.cfg"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String data = ""; String strLine; while ((strLine = br.readLine()) != null) { data += strLine; } try { JSONObject cfg = new JSONObject(data); Iterator<String> keys = cfg.keys(); while (keys.hasNext()) { String key = keys.next(); Set<String> group = new HashSet<String>(); hlcgroups.put(key, group); JSONArray arr = cfg.getJSONArray(key); for (int i = 0; i < arr.length(); i++) { String name = arr.getString(i); group.add(name); } } } catch (JSONException e) { e.printStackTrace(); } br.close(); fstream.close(); } catch (FileNotFoundException e) { // e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static void loadCraft() { try { FileInputStream fstream; fstream = new FileInputStream("craft.conf"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String strLine; while ((strLine = br.readLine()) != null) { String[] tmp = strLine.split("="); String name = tmp[0].toLowerCase(), resources = tmp[1].replace("\\n", "\n"); crafts.put(name, resources); } br.close(); fstream.close(); } catch (FileNotFoundException e) { } catch (IOException e) { } } private static void loadSkills() { skills = new HashMap<String, SkillAvailability>(); // Attacks skills.put("paginae/atk/knockteeth", new Combat(6)); skills.put("paginae/atk/axe", new Combat(4)); skills.put("paginae/atk/cleave", new Combat(8)); skills.put("paginae/atk/sting", new Combat(2)); skills.put("paginae/atk/strangle", new Combat().maxINT(3)); skills.put("paginae/atk/valstr", new Combat(6)); // Moves skills.put("paginae/atk/feignflight", new Combat().maxDEF(10)); skills.put("paginae/atk/flex", new Combat(6)); skills.put("paginae/atk/padv", new Combat().minBAL(3)); skills.put("paginae/atk/seize", new Combat().minINT(5).minATK(75)); skills.put("paginae/atk/throwsand", new Combat(1)); // Special Moves skills.put("paginae/atk/roar", new Combat(14).minINT(10)); skills.put("paginae/atk/bloodshot", new Combat(2)); skills.put("paginae/atk/skuld", new Combat(10)); skills.put("paginae/atk/oppknock", new Combat(5)); skills.put("paginae/atk/sidestep", new Combat(4)); skills.put("paginae/atk/sternorder", new Combat(5)); skills.put("paginae/atk/bee", new Combat(6)); skills.put("paginae/atk/toarms", new Combat(3)); skills.put("paginae/atk/quell", new Combat(2).maxINT(0).minBAL(3)); } private static void loadCurios() { try { FileInputStream fstream; fstream = new FileInputStream("curio.conf"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String strLine; while ((strLine = br.readLine()) != null) { CurioInfo curio = new CurioInfo(); String[] tmp = strLine.split(":"); String name = tmp[0].toLowerCase(); curio.LP = Integer.parseInt(tmp[1]); curio.time = (int) (60 * Float.parseFloat(tmp[2])); curio.weight = Integer.parseInt(tmp[3]); curios.put(name, curio); } br.close(); fstream.close(); } catch (Exception e) { } } private static void loadFEP() { try { FileInputStream fstream; fstream = new FileInputStream("fep.conf"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String strLine; while ((strLine = br.readLine()) != null) { Map<String, Float> fep = new HashMap<String, Float>(); String[] tmp = strLine.split("="); String name; name = tmp[0].toLowerCase(); if (name.charAt(0) == '@') { name = name.substring(1); fep.put("isItem", (float) 1.0); } tmp = tmp[1].split(" "); for (String itm : tmp) { String tmp2[] = itm.split(":"); fep.put(tmp2[0], Float.valueOf(tmp2[1]).floatValue()); } FEPMap.put(name, fep); } br.close(); fstream.close(); } catch (FileNotFoundException e) { } catch (IOException e) { } } private static void loadItemTypes() { try { FileInputStream fstream; fstream = new FileInputStream("itemtypes.conf"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String strLine; while ((strLine = br.readLine()) != null) { String[] tmp = strLine.split(":"); String name = tmp[0].toLowerCase(); itemTypes.put(name, ItemType.valueOf(tmp[1])); } br.close(); fstream.close(); } catch (Exception e) { } } private static void loadObTypes() { try { FileInputStream fstream; fstream = new FileInputStream("obtypes.conf"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String strLine; while ((strLine = br.readLine()) != null) { String[] tmp = strLine.split(":"); String name = tmp[0].toLowerCase(); obTypes.put(name, Node.Type.valueOf(tmp[1].trim())); } br.close(); fstream.close(); } catch (Exception e) { } } private static void loadLogins() { try { FileInputStream fstream = new FileInputStream("passwd"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String strLine; while ((strLine = br.readLine()) != null) { String[] tmp = strLine.split(":"); logins.add(new LoginData(tmp[0], tmp[1])); } br.close(); fstream.close(); } catch (Exception e) { } } public static void saveLogins() { try { FileOutputStream fstream = new FileOutputStream("passwd"); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fstream, "UTF-8")); for (LoginData ld : logins) bw.write(ld.name + ":" + ld.pass + "\n"); bw.close(); fstream.close(); } catch (Exception e) { e.printStackTrace(); } } private static void loadGeoloc() { DataInputStream is = null; try { is = new DataInputStream(new FileInputStream("geoloc.dat")); while (is.available() > 0) { short weight = is.readShort(); long hash = is.readLong(); short c1 = is.readShort(); short c2 = is.readShort(); List<MapTileData> geodatas; if (geoLocs.containsKey(weight)) { geodatas = geoLocs.get(weight); } else { geodatas = new ArrayList<MapTileData>(); geoLocs.put(weight, geodatas); } geodatas.add(new MapTileData(weight, hash, c1, c2)); } is.close(); } catch (Exception e) { } } private static void usage(PrintStream out) { out.println("usage: haven.jar [-hdPf] [-u USER] [-C HEXCOOKIE] [-r RESDIR] [-U RESURL] [-A AUTHSERV] [SERVER]"); } public static void cmdline(String[] args) { PosixArgs opt = PosixArgs.getopt(args, "hdPU:fr:A:u:C:"); if (opt == null) { usage(System.err); System.exit(1); } for (char c : opt.parsed()) { switch (c) { case 'h': usage(System.out); System.exit(0); break; case 'd': dbtext = true; break; case 'P': profile = true; break; case 'f': fullscreen = true; break; case 'r': resdir = opt.arg; break; case 'A': authserv = opt.arg; break; case 'U': try { resurl = new URL(opt.arg); } catch (java.net.MalformedURLException e) { System.err.println(e); System.exit(1); } break; case 'u': authuser = opt.arg; break; case 'C': authck = Utils.hex2byte(opt.arg); break; } } if (opt.rest.length > 0) defserv = opt.rest[0]; } public static double getSFXVolume() { return (double) sfxVol / 100; } public static int getMusicVolume() { return isMusicOn ? musicVol : 0; } private static void loadSmileys() { smileys = new HashMap<Pattern, String>(); try { FileInputStream fstream; fstream = new FileInputStream("smileys.conf"); BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); String strLine; while ((strLine = br.readLine()) != null) { String[] tmp = strLine.split("\t"); String smile, res; smile = tmp[0]; res = "\\$img\\[smiley\\/" + tmp[1] + "\\]"; smileys.put(Pattern.compile(smile, Pattern.CASE_INSENSITIVE | Pattern.LITERAL), res); } br.close(); fstream.close(); } catch (FileNotFoundException e) { } catch (IOException e) { } } private static void loadWindowOptions() { File inputFile = new File("windows.conf"); if (!inputFile.exists()) { return; } try { window_props.load(new FileInputStream(inputFile)); } catch (IOException e) { System.out.println(e); } } private static void loadOptions() { File inputFile = new File("haven.conf"); if (!inputFile.exists()) { try { inputFile.createNewFile(); } catch (IOException e) { return; } } try { options.load(new FileInputStream("haven.conf")); } catch (IOException e) { System.out.println(e); } GoogleTranslator.apikey = options.getProperty("GoogleAPIKey", "AIzaSyCuo-ukzI_J5n-inniu2U7729ZfadP16_0"); zoom = options.getProperty("zoom", "false").equals("true"); noborders = options.getProperty("noborders", "false").equals("true"); new_minimap = options.getProperty("new_minimap", "true").equals("true"); new_chat = options.getProperty("new_chat", "true").equals("true"); use_smileys = options.getProperty("use_smileys", "true").equals("true"); isMusicOn = options.getProperty("music_on", "true").equals("true"); isSoundOn = options.getProperty("sound_on", "true").equals("true"); showDirection = options.getProperty("show_direction", "true").equals("true"); showNames = options.getProperty("showNames", "true").equals("true"); showOtherNames = options.getProperty("showOtherNames", "false").equals("true"); showBeast = options.getProperty("showBeast", "false").equals("true"); showRadius = options.getProperty("showRadius", "false").equals("true"); showHidden = options.getProperty("showHidden", "false").equals("true"); simple_plants = options.getProperty("simple_plants", "false").equals("true"); fastFlowerAnim = options.getProperty("fastFlowerAnim", "false").equals("true"); sshot_compress = options.getProperty("sshot_compress", "false").equals("true"); sshot_noui = options.getProperty("sshot_noui", "false").equals("true"); sshot_nonames = options.getProperty("sshot_nonames", "false").equals("true"); newclaim = options.getProperty("newclaim", "true").equals("true"); showq = options.getProperty("showq", "true").equals("true"); showpath = options.getProperty("showpath", "false").equals("true"); showgobpath = options.getProperty("showgobpath", "false").equals("true"); showothergobpath = options.getProperty("showothergobpath", "false").equals("true"); highlightSkills = options.getProperty("highlightSkills", "false").equals("true"); dontScaleMMIcons = options.getProperty("dontScaleMMIcons", "false").equals("true"); radar = options.getProperty("radar", "true").equals("true"); showViewDistance = options.getProperty("showViewDistance", "false").equals("true"); sfxVol = Integer.parseInt(options.getProperty("sfx_vol", "100")); musicVol = Integer.parseInt(options.getProperty("music_vol", "100")); autohearth = options.getProperty("autohearth", "false").equals("true"); hearthunknown = options.getProperty("hearthunknown", "false").equals("true"); hearthred = options.getProperty("hearthred", "false").equals("true"); hideObjectList.clear(); String hideObjects = options.getProperty("hideObjects", ""); edgedTiles = options.getProperty("edgedTiles", "false").equals("true"); // new maxWindow = options.getProperty("maxWindow", "false").equals("true"); // new broadleafTile = options.getProperty("broadleafTile", "false").equals("true"); // new fepbar = options.getProperty(FoodMeterWidget.NAME, "false").equals("true"); autoaggro = options.getProperty("autoaggro", "false").equals("true"); aggrored = options.getProperty("aggrored", "false").equals("true"); aggrounknown = options.getProperty("aggrounknown", "false").equals("true"); alarm = options.getProperty("alarm", "true").equals("true"); alarmred = options.getProperty("alarmred", "true").equals("true"); alarmunknown = options.getProperty("alarmunknown", "true").equals("true"); tracking = options.getProperty("tracking", "true").equals("true"); crime = options.getProperty("crime", "false").equals("true"); gobHealth = options.getProperty("gobHealth", "false").equals("true"); boatHitbox = options.getProperty("boatHitbox", "false").equals("true"); if (!hideObjects.isEmpty()) { for (String objectName : hideObjects.split(",")) { if (!objectName.isEmpty()) { hideObjectList.add(objectName); } } } String highlightObjects = options.getProperty("highlightObjects", ""); if (!highlightObjects.isEmpty()) { for (String objectName : highlightObjects.split(",")) { if (!objectName.isEmpty()) { highlightItemList.add(objectName); } } } Resource.checkhide(); timestamp = options.getProperty("timestamp", "false").equals("true"); } public static synchronized void setWindowOpt(String key, String value) { synchronized (window_props) { String prev_val = window_props.getProperty(key); if ((prev_val != null) && prev_val.equals(value)) return; window_props.setProperty(key, value); } saveWindowOpt(); } public static synchronized void setWindowOpt(String key, Boolean value) { setWindowOpt(key, value ? "true" : "false"); } public static void saveWindowOpt() { synchronized (window_props) { try { window_props.store(new FileOutputStream("windows.conf"), "Window config options"); } catch (IOException e) { System.out.println(e); } } } public static void addhide(String str) { hideObjectList.add(str); Resource.checkhide(); } public static void remhide(String str) { hideObjectList.remove(str); Resource.checkhide(); } public static void saveOptions() { String hideObjects = ""; for (String objectName : hideObjectList) { hideObjects += objectName + ","; } String highlightObjects = ""; for (String objectName : highlightItemList) { highlightObjects += objectName + ","; } options.setProperty("hideObjects", hideObjects); options.setProperty("highlightObjects", highlightObjects); options.setProperty("GoogleAPIKey", GoogleTranslator.apikey); options.setProperty("timestamp", (timestamp) ? "true" : "false"); options.setProperty("zoom", zoom ? "true" : "false"); options.setProperty("noborders", noborders ? "true" : "false"); options.setProperty("new_minimap", new_minimap ? "true" : "false"); options.setProperty("new_chat", new_chat ? "true" : "false"); options.setProperty("use_smileys", use_smileys ? "true" : "false"); options.setProperty("sfx_vol", String.valueOf(sfxVol)); options.setProperty("music_vol", String.valueOf(musicVol)); options.setProperty("music_on", isMusicOn ? "true" : "false"); options.setProperty("sound_on", isSoundOn ? "true" : "false"); options.setProperty("show_direction", showDirection ? "true" : "false"); options.setProperty("showNames", showNames ? "true" : "false"); options.setProperty("showOtherNames", showOtherNames ? "true" : "false"); options.setProperty("showBeast", showBeast ? "true" : "false"); options.setProperty("showRadius", showRadius ? "true" : "false"); options.setProperty("showHidden", showHidden ? "true" : "false"); options.setProperty("simple_plants", simple_plants ? "true" : "false"); options.setProperty("fastFlowerAnim", fastFlowerAnim ? "true" : "false"); options.setProperty("sshot_compress", sshot_compress ? "true" : "false"); options.setProperty("sshot_noui", sshot_noui ? "true" : "false"); options.setProperty("sshot_nonames", sshot_nonames ? "true" : "false"); options.setProperty("newclaim", newclaim ? "true" : "false"); options.setProperty("showq", showq ? "true" : "false"); options.setProperty("showpath", showpath ? "true" : "false"); options.setProperty("showgobpath", showgobpath ? "true" : "false"); options.setProperty("showothergobpath", showothergobpath ? "true" : "false"); options.setProperty("highlightSkills", highlightSkills ? "true" : "false"); options.setProperty("dontScaleMMIcons", dontScaleMMIcons ? "true" : "false"); options.setProperty("radar", radar ? "true" : "false"); options.setProperty("autohearth", autohearth ? "true" : "false"); options.setProperty("hearthunknown", hearthunknown ? "true" : "false"); options.setProperty("hearthred", hearthred ? "true" : "false"); options.setProperty("showViewDistance", showViewDistance ? "true" : "false"); options.setProperty("edgedTiles", edgedTiles ? "true" : "false"); // new options.setProperty("maxWindow", maxWindow ? "true" : "false"); // new options.setProperty("broadleafTile", broadleafTile ? "true" : "false"); // new options.setProperty(FoodMeterWidget.NAME, fepbar ? "true" : "false"); options.setProperty("autoaggro", autoaggro ? "true" : "false"); options.setProperty("aggrored", aggrored ? "true" : "false"); options.setProperty("aggrounknown", aggrounknown ? "true" : "false"); options.setProperty("alarm", alarm ? "true" : "false"); options.setProperty("alarmred", alarmred ? "true" : "false"); options.setProperty("alarmunknown", alarmunknown ? "true" : "false"); options.setProperty("tracking", tracking ? "true" : "false"); options.setProperty("crime", crime ? "true" : "false"); options.setProperty("gobHealth", gobHealth ? "true" : "false"); options.setProperty("boatHitbox", boatHitbox ? "true" : "false"); try { options.store(new FileOutputStream("haven.conf"), "Custom config options"); } catch (IOException e) { System.out.println(e); } } }