@Override
  public void forceSave() {
    // config.load -- Configurations are loaded on Construction.
    config.addCustomCategoryComment("Chat", "Chatconfigs");

    Property prop =
        config.get(
            "Chat",
            "chatformat",
            "%groupPrefix%playerPrefix<%username>%playerSuffix%groupSuffix %reset%message");
    prop.comment = "This String formats the Chat.";
    prop.comment +=
        "\nIf you want both a color and special formatcodes, the color needs to be first before the special code";
    prop.comment +=
        "\nExamples: '%red%username' '%red%bold%username'\nNot OK:'%bold%gold%underline%username' In this example you would get the username in gold and underline but without bold";
    prop.comment += "\nList of possible variables:";
    prop.comment +=
        "\nFor the username: %username The health of the player can be used with %health. The variable, you need for the message:%message ";
    prop.comment += "\nFor the players prefix and suffix use %playerPrefix and %playerSuffix";
    prop.comment +=
        "\nColors:%black,%darkblue,%darkgreen,%darkaqua,%darkred,%purple,%gold,%grey,%darkgrey,%indigo,\n       %green,%aqua,%red,%pink,%yellow,%white";
    prop.comment += "\nSpecial formatcodes: %random,%bold,%strike,%underline,%italics";
    prop.comment += "\nTo reset all formatcodes, you can use %reset";
    prop.comment +=
        "\nUse %rank to display a users rank as defined in the config below., %zone to specify there current zone";
    prop.comment +=
        "\nUse %groupPrefix and groupSuffix to display the prefix and suffix of groups as defined in the config";
    prop.value = chatFormat;

    config.get("BannedWords", "censor", true, "censor the words in the censorList").value =
        "" + Chat.censor;
    config.get("BannedWords", "censorList", new String[] {}, "List of words to be censored")
            .valueList =
        Chat.bannedWords.toArray(new String[Chat.bannedWords.size()]);

    config.addCustomCategoryComment(
        "Chat.groups",
        "You may put enything here that you want displaed as part of the group prefixes, suffixes, or ranks."
            + "\n {ladderName<:>Zone} will display the data for the highest priority group that the player is in that is part of the specified ladder and specified zone."
            + "\n {...} will display the data of each group the player is in in order of priority"
            + "\n you may put contsraints with ladders or zones with {...<:>zoneName} or {ladderName<:>...}"
            + "\n you may also use the color and MCFormat codes above.");

    config.get("Chat.groups", "groupPrefix", "").value = groupPrefixFormat;
    config.get("Chat.groups", "groupSuffix", "").value = groupSuffixFormat;
    config.get("Chat.groups", "rank", "").value = groupRankFormat;

    config.save();
  }
  @Override
  public void registerConfig(Configuration config, String category) {
    String[] potionEffects = {"9:5:0"};

    config.addCustomCategoryComment(
        category,
        "For more information, go to http://www.minecraftwiki.net/wiki/Potion_effects#Parameters");
    potionEffects =
        config
            .get(
                category,
                "potionEffects",
                potionEffects,
                "Format like this: 'ID:duration:amplifier'")
            .getStringList();

    for (String poisonEffect : potionEffects) {
      String[] split = poisonEffect.split(":");
      potionEffectsList.add(
          new PotionEffect(
              Integer.parseInt(split[0]),
              Integer.parseInt(split[1]) * 20,
              Integer.parseInt(split[2])));
    }
  }
  @Override
  public void init() {
    config = new Configuration(file, true);

    config.addCustomCategoryComment("general", "General Commands configuration.");
    config.save();
  }
  @Override
  public void forceSave() {
    // TODO: may have problems..
    String path = CommandRules.rulesFile.getPath();
    path = path.replace(ModuleCommands.cmddir.getPath(), "");

    config.addCustomCategoryComment("general", "General Commands configuration.");
    config.save();
  }
  private void loadPerms() {
    config.addCustomCategoryComment(
        "Permissions",
        "Configure ForgeEssentials Permissions. Only implemented if Permissions module is enabled.");

    Property prop = config.get("Permissions", "verbose", false);
    prop.comment =
        "Specify if Verbose mode for Permissions module is enabled. If enabled, every permission registered is printed to the console. Only useful in debugging.";
    ModulePermissions.permsVerbose = prop.getBoolean(false);
  }
  private void loadCore() {
    config.addCustomCategoryComment("Core", "Configure ForgeEssentials Core.");

    Property prop = config.get("Core", "versionCheck", true);
    prop.comment = "Check for newer versions of ForgeEssentials on load?";
    ForgeEssentials.verCheck = prop.getBoolean(true);

    prop = config.get("Core", "modlistLocation", "modlist.txt");
    prop.comment =
        "Specify the file where the modlist will be written to. This path is relative to the ForgeEssentials folder.";
    ForgeEssentials.modlistLocation = prop.value;
  }
  @Subscribe
  public void preInit(FMLPreInitializationEvent ev) {
    bukkitLogger = ev.getModLog();
    bukkitLogger.setParent(FMLCommonHandler.instance().getFMLLogger());

    // ServerGUI.logger = bukkitLogger;
    if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {

      FMLCommonHandler.instance()
          .getFMLLogger()
          .warning("Bukkit For Vanilla is currently only a server-side mod.");
      return;
    } else if (FMLCommonHandler.instance().getEffectiveSide() == Side.BUKKIT) {
      FMLCommonHandler.instance()
          .getFMLLogger()
          .severe("The bukkit API as a forge mod on bukkit? *mind blown*");
      return;
    }
    this.bukkitLogger.info("Initializing configuration...");
    myConfigurationFile = ev.getSuggestedConfigurationFile();

    Configuration config = new Configuration(myConfigurationFile);
    config.addCustomCategoryComment("consoleConfig", "Configuration for the server console");
    config.addCustomCategoryComment("dontTouchThis", "Things which are best left untouched");

    Property colour =
        config.get(
            "consoleConfig",
            "enablecolour",
            DedicatedServer.getServer().getGuiEnabled() ? false : true);
    colour.comment = "Enable coloured ANSI console output";
    this.allowAnsi = colour.getBoolean(false);

    Property plugins = config.get(Configuration.CATEGORY_GENERAL, "pluginDir", "plugins");
    plugins.comment = "The folder to look for plugins in.";
    this.pluginFolder = plugins.value;

    Property suuid = config.get("dontTouchThis", "serverUUID", this.genUUID());
    bukkitLogger.info("Set UUID to " + suuid.value);
    suuid.comment = "The UUID of the server. Don't touch this or it might break your plugins.";
    this.serverUUID = suuid.value;

    /*Property showAllLogs = config.get(Configuration.CATEGORY_GENERAL, "printForgeLogToGui", false);
    showAllLogs.comment = "Print stuff that's outputted to the logs to the GUI as it happens.";
    this.showAllLogs = showAllLogs.getBoolean(false);*/

    config.save();
  }
  private void loadCmd() {
    config.addCustomCategoryComment(
        "Commands",
        "Configure ForgeEssentials Commands. Only implemented if Commands module is on.");

    Property prop = config.get("Commands", "motd", "Welcome to a server running ForgeEssentials");
    prop.comment = "Specify the message that greets players when they log in to your server.";
    CommandMotd.motd = prop.value;

    prop = config.get("Commands", "RulesFile", "rules.txt");
    prop.comment =
        "Specify the file where the rules will read from and written to. This path is relative to the ForgeEssentials folder.";
    CommandRules.rulesFile = new File(ForgeEssentials.FEDIR, prop.value);

    prop = config.get("Commands", "backupName", "%world_%month-%day_%hourh%min");
    prop.comment =
        "The name config for the backup zip. You can use the following variables: %day, %month, %year, %hour, %min, %world";
    CommandBackup.backupName = prop.value;
  }
  private void loadModules() {
    config.addCustomCategoryComment(
        "Modules",
        "Toggles Forge Essentials modules on or off. Set to true to turn on, false to turn off.");

    Property prop = config.get("Modules", "Commands_Enabled", true);
    prop.comment =
        "Disabling this will remove non-essential commands. ie: /home, /motd, /rules, etc...";
    ModuleLauncher.cmdEnabled = prop.getBoolean(true);

    prop = config.get("Modules", "WorldControl_Enabled", true);
    prop.comment =
        "Disabling this will remove Selections and selection editing commands such as //set, //copy, etc... Note that this is force disabled if WEIntegration is loaded.";
    ModuleLauncher.wcEnabled = prop.getBoolean(true);

    prop = config.get("Modules", "Permissions_Enabled", true);
    prop.comment =
        "Disabling this will remove any and all permissions integration. Other mods that use this may be affected.";
    ModuleLauncher.permsEnabled = prop.getBoolean(true);
  }
  @Override
  public void init() {
    OutputHandler.finer("Loading chatconfigs");
    config = new Configuration(file, true);

    // config.load -- Configurations are loaded on Construction.
    config.addCustomCategoryComment("Chat", "Chat Configs");

    Property prop =
        config.get(
            "Chat",
            "chatformat",
            "%playerPrefix%groupPrefix<%username>%groupSuffix%playerSuffix %reset%message");
    prop.comment = "This String formats the Chat.";
    prop.comment +=
        "\nIf you want both a color and special formatcodes, the color needs to be first before the special code";
    prop.comment +=
        "\nExamples: '%red%username' '%red%bold%username'\nNot OK:'%bold%gold%underline%username' In this example you would get the username in gold and underline but without bold";
    prop.comment += "\nList of possible variables:";
    prop.comment +=
        "\nFor the username: %username The health of the player can be used with %health. The variable, you need for the message:%message ";
    prop.comment += "\nFor the player prefix and sufix use %playerPrefix and %playerSuffix";
    prop.comment +=
        "\nColors:%black,%darkblue,%darkgreen,%darkaqua,%darkred,%purple,%gold,%grey,%darkgrey,%indigo,\n       %green,%aqua,%red,%pink,%yellow,%white";
    prop.comment += "\nSpecial formatcodes: %random,%bold,%strike,%underline,%italics";
    prop.comment += "\nTo reset all formatcodes, you can use %reset";
    prop.comment +=
        "\nUse %rank to display a users rank as specified, %zone to specify there current zone";
    prop.comment +=
        "\nUse %groupPrefix and %groupSuffix to display the group prefixes and suffixes as specified";
    chatFormat = prop.value;

    Chat.censor =
        config
            .get("BannedWords", "censor", true, "censor the words in the censorList")
            .getBoolean(true);
    Chat.bannedWords =
        Arrays.asList(
            config.get(
                    "BannedWords",
                    "censorList",
                    new String[] {"f**k", "ass", "bitch", "shit"},
                    "List of words to be censored")
                .valueList);
    Chat.censorSymbol =
        config.get(
                "BannedWords",
                "censorSymbol",
                "#",
                "Character to replace censored words with (Use only one character in this config)")
            .value;

    config.addCustomCategoryComment(
        "Chat.groups",
        "You may put enything here that you want displaed as part of the group prefixes, suffixes, or ranks."
            + "\n {ladderName<:>Zone} will display the data for the highest priority group that the player is in that is part of the specified ladder and specified zone."
            + "\n {...<:>...} will display the data of each group the player is in in order of priority"
            + "\n you may put contsraints with ladders or zones with {...<:>zoneName} or {ladderName<:>...}"
            + "\n you may also use the color and MCFormat codes above.");
    groupPrefixFormat =
        config.get(
                "Chat.groups",
                "groupPrefix",
                "{...<:>" + ZoneManager.getGLOBAL().getZoneName() + "}")
            .value;
    groupSuffixFormat =
        config.get(
                "Chat.groups",
                "groupSuffix",
                "{...<:>" + ZoneManager.getGLOBAL().getZoneName() + "}")
            .value;
    groupRankFormat =
        config.get("Chat.groups", "rank", "[{...<:>" + ZoneManager.getGLOBAL().getZoneName() + "}]")
            .value;

    config.save();
  }