Bukkit / Spigotplugin - Удалить запись из конфига - PullRequest
0 голосов
/ 02 сентября 2018

Я работаю над Bukkit / Spigotplugin, который позволяет пользователям голосовать за вещи. Плагин использует конфиг. Я хочу удалить запись, но она не работает. Что я нашел в Google:

getConfig().set("your.value", null);

что я реализовал:

int i = id;
while(getConfig().contains("ThingsYouCanVoteFor." + (i + 1)))
{
    getConfig().set("ThingsYouCanVoteFor." + Integer.toString(i) + ".name", getConfig().getString("ThingsYouCanVoteFor." + Integer.toString(i + 1) + ".name"));
    getConfig().set("ThingsYouCanVoteFor." + Integer.toString(i) + ".votes", getConfig().getInt("ThingsYouCanVoteFor." + Integer.toString(i + 1) + ".votes"));
    i++;
}
getConfig().set("ThingsYouCanVoteFor." + Integer.toString(i + 1), null);
saveConfig();
sender.sendMessage("§aRemoved ID " + id);

как выглядит конфиг:

ThingsYouCanVoteFor:
  0:
    name: Build a bridge
    votes: 0
  1:
    name: Kill the owner
    votes: 2
  2:
    name: Vote for something other
    votes: 1
  3:
    name: Remove all banned peoples inventory
    votes: 0
  4:
    name: Teleport to others home
    votes: 0
  5:
    name: Dig a hole in the air
    votes: 0
  6:
    name: Shutdown the internet
    votes: 0
PeopleWhoVoted:
- Gamingwelle
- BDevGWAdmin
- Sllikson
OpenForVoting: false

как это должно выглядеть, когда я использую "/ voiceadmin remove 3":

ThingsYouCanVoteFor:
  0:
    name: Build a bridge
    votes: 0
  1:
    name: Kill the owner
    votes: 2
  2:
    name: Vote for something other
    votes: 1
  3:
    name: Teleport to others home
    votes: 0
  4:
    name: Dig a hole in the air
    votes: 0
  5:
    name: Shutdown the internet
    votes: 0
PeopleWhoVoted:
- Gamingwelle
- BDevGWAdmin
- Sllikson
OpenForVoting: false

как это выглядит:

ThingsYouCanVoteFor:
  0:
    name: Build a bridge
    votes: 0
  1:
    name: Kill the owner
    votes: 2
  2:
    name: Vote for something other
    votes: 1
  3:
    name: Teleport to others home
    votes: 0
  4:
    name: Dig a hole in the air
    votes: 0
  5:
    name: Shutdown the internet
    votes: 0
  6:
    name: Shutdown the internet
    votes: 0
PeopleWhoVoted:
- Gamingwelle
- BDevGWAdmin
- Sllikson
OpenForVoting: false

с помощью

getConfig().getConfigurationSection("ThingsYouCanVoteFor").getKeys(false).remove(i + 1)

тоже не работает.

Что я сделал не так?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вы можете просто удалить значение в пути, используя:

config.set(pathToRemove, null);
0 голосов
/ 02 сентября 2018

ConfigurationSection * Методы set изменили значение так, как вы хотите, однако при сохранении конфигурации будут отменены все текущие значения. Это означает, что вы должны редактировать / указывать каждое отдельное значение, если хотите сохранить их, иначе они будут потеряны. Чтобы вместо этого нужно было редактировать только одно значение, я использую массив.

Массив для хранения временных данных, вам нужен объект, содержащий String name и int votes, я называю этот объект VoteData.

Когда сервер запустится, загрузите config и заполните массив результатом. Это позволяет нам удалять объекты или изменять массив во время выполнения, не касаясь файла конфигурации, что повышает производительность.

private void loadConfig() {

    voteDataArray = new ArrayList<VoteData>();
    YamlConfiguration config = YamlConfiguration.loadConfiguration(yourConfigFile);

    ConfigurableSection section = config.getConfigurableSection("ThingsYouCanVoteFor");
    if(section == null) {
        Bukkit.getLogger().warn("ConfigSection ThingsYouCanVoteFor doesn't exist");
        return;
    }

    for(String num : section.getKeys(false)) {

        String name = section.getString(num + ".name");
        int votes = section.getDouble(num + ".votes");

        voteDataArray.add(new VoteData(name, votes));

    }
}

Когда сервер закрывается или когда вы хотите, сохраните конфигурацию с содержимым массива, выполнив цикл config.getKeys(false) и установив для узла значения ваших данных.

private void saveConfig() {

    YamlConfiguration config = new YamlConfiguration();

    int num = 1;
    for(VoteData data : voteDataArray) {
        config.set("ThingsYouCanVoteFor." + num + ".name", data.getName());
        config.set("ThingsYouCanVoteFor." + num + ".votes", data.getVotes());
        num++;
    }

    try {
        config.save(yourConfigFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Теперь, когда вам нужно использовать данные в плагине, используйте массив вместо конфига. А когда вы хотите что-то удалить, просто удалите из массива.

...