如何在不删除笔记的情况下保存Bukkit的默认配置?

时间:2015-06-08 05:02:54

标签: java configuration save bukkit

我使用的是Bukkit API 1.7.9,但我遇到了一个问题。

我正在创建一个HashMap的经济系统,显然每次服务器重启时都不会重置经济系统,我需要将其存储在一个文件中。但是,如果我将其存储在默认配置中,则无法在不删除#notes的情况下保存它。

以下是我用于保存/加载经济系统HashMap的代码:

public static final void saveTokensAmount()
{
    for(String playerName : getTokensMap().keySet())
    {
        main.getConfig().set("tokens." + playerName, getTokensMap().get(playerName));
    }
    main.saveConfig();
}

public static final void loadTokensAmount()
{
    if(!main.getConfig().contains("tokens")) return;
    for(String s : main.getConfig().getConfigurationSection("tokens").getKeys(false))
    {
        setTokensBalance(s, main.getConfig().getInt("tokens." + s));
    }
}

这非常合适,但main.saveConfig();删除了#notes

我知道saveDefaultConfig();会保存笔记,但我不能在此处这样做,因为用户可能编辑了其中包含的其他变量。

尝试重新加载配置reloadConfig();认为它会重新加载它保存这个,但它没有。

我的问题:如何在不删除#notes的情况下保存Bukkit的默认配置?

你可能认为这个问题是重复的,但通常的答案是saveDefaultConfig();,我不能在这里做。

1 个答案:

答案 0 :(得分:1)

我认为在这种情况下你唯一的选择是创建一个自定义的YAML文件来存储数据(如果你想以YAML格式存储这种数据),这是我认为你应该继续使用的选项

我不认为这种播放器数据应保存在配置文件中。配置文件(如名称所示)用于初始设置或插件规则,允许用户更好地控制插件的行为方式。许多较新的开发人员使用配置文件来保存他们喜欢的任何内容,因为这是他们知道如何(以及Bukkit API使其如此容易实现)的唯一方式和/或因为它是第一种方式他们被介绍将信息保存到磁盘。

以下是一些代码,可帮助您开始创建一个可存储播放器的自定义YAML文件。代币金额。您还应该使用播放器的唯一ID而不是其名称来存储其令牌数量,因为这些名称将来可能会发生变化。

//Assuming you have a HashMap somewhere that stores the values
HashMap<String, Integer> tokens = new HashMap<String, Integer>();
//Note that the string is not the player name, but the UUID of the player (as a String)

我会在你的onEnable()方法中创建tokens.yml文件并创建一个方法来轻松访问该文件。这是saveTokensAmount()方法(经过测试,似乎有效)。

void saveTokensAmount() {
    File tokenFile = getTokenFile(); //Get the file (make sure it exists)
    FileConfiguration fileConfig = YamlConfiguration.loadConfiguration(tokenFile); //Load configuration
    for (String id : tokens.keySet()) {
        fileConfig.createSection(id); //Create a section
        fileConfig.set(id, tokens.get(id)); //Set the value
    }
    try {
        fileConfig.save(tokenFile); //Save the file
    } catch (IOException ex) {
        ex.printStackTrace();
        //Handle error
    }
}
//Not sure if creating new sections is the most efficient way of storing this data in a YAML file

这是loadTokensAmount()方法:

void loadTokensAmount() {
    File tokenFile = getTokenFile(); //Make sure it exists
    FileConfiguration fileConfig = YamlConfiguration.loadConfiguration(tokenFile); //Load configuration
    try {
        fileConfig.load(tokenFile); //Load contents of file
        for (String id : fileConfig.getKeys(false)) { //Get the keys
            tokens.put(id, fileConfig.getInt(id)); //Add values to map
        }
    } catch (Exception ex) {
        ex.printStackTrace();;
    }
}

输入播放器的初始信息,例如加入服务器时(您也可以写入文件):

tokens.put(player.getUniqueId().toString(), amount);

最终,此列表/文件可能会变得太大而无法使用更好的数据库。您可能还希望仅为当前在线的玩家将令牌金额存储在地图/内存中。希望这有帮助!