Создать «пользовательский» файл YAML плагина Bukkit

каждый. Недавно я начал писать плагины Bukkit для Minecraft. У меня уже есть версии для разработчиков для моих первых двух плагинов, которые отлично работают на моем сервере, и они не доставили мне особых проблем. В настоящее время я работаю над третьим, и у меня возникли некоторые проблемы.

Я пытаюсь понять, как именно создать файл YAML и читать/записывать данные из/в него. Просто чтобы уточнить, я НЕ имею в виду файл config.yml, так как у меня нет с этим проблем. Я знаю, как создать файл config.yml по умолчанию и прочитать из него данные, и все это просто замечательно. Однако с моим третьим плагином мне нужно использовать отдельный файл YAML. Я огляделся в поисках помощи, но 95% ответов, которые я получаю, связаны с тем, что кто-то рассказывает мне что-то о getConfig(), а это НЕ то, что я ищу, или, по крайней мере, я на 95% уверен, что это не то, что я ищу. за. После нескольких недель поиска четкого ответа я решил опубликовать свой вопрос здесь. Как всегда, заранее спасибо за любую помощь!

Я думаю, что понял, как создать файл YAML, но после этого я застрял. Просто приведу пример своей ситуации.

Скажем, у меня был следующий основной класс:

package ...

import ...

//Here is my main class
public class MyClass extends JavaPlugin {

    //I instantiate my File and FileConfiguration here
    //Should I do this? I need them for my other classes.
    public FileConfiguration myFileConfig = null;
    public File myFile;

    //On Enable
    @Override
    public void onEnable() {

        //Get/Create File
        myFile = new File(getDataFolder(), "myfile.yml");
        if (!myFile.exists()) {
            try {
                myFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

            //Load myfily.yml file configuration
        FileConfiguration myFileConfig = YamlConfiguration.loadConfiguration(myFile);

            //Register my command executor class
        getCommand("test").setExecutor(new myCommandExecutor());
    }

    //On Disable
    @Override
    public void onDisable() {

        //Irrelevant stuff here

    }

}

Теперь предположим, что у меня также был следующий класс CommandExecutor (звездочками отмечены места, где происходят важные вещи. Я пропустил все вложенные if функции, чтобы сэкономить ваше время):

package ...

import ...

public class myCommandExecutor implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

        if (cmd.getName().equalsIgnoreCase("test")) {

            if (args.length > 0) {

****************//RIGHT HERE I WOULD ADD ALL THE COMMAND ARGUMENTS
****************//IMAGINE THE FOLLOWING USAGE FOR THE COMMAND
****************//USAGE: /test <add|del> <one|two|three> <name>
****************//IF THE USER EXECUTED THE FOLLOWING, THE CODE BELOW WOULD BE THE FINAL RESULT
****************//EXECUTED: /test add two hello
                YamlClass.addToFile(args[1], args[2]);

            } else {

                sender.sendMessage("Not enough arguments!");

            }

        }

    }

}

В приведенном выше примере, если пользователь набрал /test add two hello, я бы хотел, чтобы последние два аргумента (два и привет) были отправлены методу в другом классе (в этом примере addToFile(String a, String b) в классе YamlClass), в котором args[1] и args[ 2] будет использоваться для помещения строки в такой файл:

test:
  one:
  two:
    - hello
  three:

и если пользователь затем запустит /test add three goodbye, файл будет выглядеть так:

test:
  one:
  two:
    - hello
  three:
    - goodbye

Если бы пользователь затем выполнил /test add three test, он добавил бы слово "тест" в раздел без замены слова "до свидания", которое было добавлено ранее. Может ли кто-нибудь дать мне некоторую помощь или советы о том, как это сделать? Спасибо!

[РЕДАКТИРОВАТЬ] Я понял это прошлой ночью. На самом деле я все делал правильно, что касается File и YamlCinfiguration, что-то было не так с моим CommandExecutor, но я это исправил. Спасибо за ответы!


person tboneblaze    schedule 22.11.2013    source источник


Ответы (3)


Как правило, ответ zifnab06 не так уж и неверен. Я сам работаю над плагином Bukkit и привык использовать следующий фрагмент кода для файлов YAML.

File f = new File("path/to/your/YAML/file.yml");
YamlConfiguration yamlFile = YamlConfiguration.loadConfiguration(f);

Это создает новый экземпляр YamlConfiguration, к которому вы можете получить доступ с помощью yamlFile.set("path", new Object()); для записи значений и yamlFile.get("path"); для чтения значений (вам не обязательно заранее использовать createSection(String)). Все методы, которые можно использовать, содержатся в JavaDoc.

Если вы хотите сохранить/создать файл .yml, вам просто нужно использовать этот код:

try {
  yamlFile.save(f);
} catch(IOException e) {
  // Handle any IO exception here
  e.printStackTrace();
}

Надеюсь, это ответило на ваш вопрос; если вам нужен код для работы, вы можете использовать исходный код моего плагина, доступный на BitBucket.

person mezzodrinker    schedule 23.11.2013
comment
путь/к/вашему/YAML/file.yml относительно каталога плагина? - person tremor; 13.06.2014
comment
@tremor Нет, если вы используете конструктор файлов без папки вашего плагина, то нет. Вместо этого это будет относительно места исполнения Bukkit. - person mezzodrinker; 16.06.2014
comment
Просто сделайте yaml.set("path.to.data", "Lightspeed360"); как . создает новый раздел. Нет необходимости создавать их вручную. - person Lightspeed360; 11.03.2016

Я считаю, что вы ищете org.bukkit.configuration.file.YamlConfiguration. Документ Javadoc находится здесь.

Быстрый пример, основанный на вашем примере выше:

YamlConfiguration yaml = new YamlConfiguration();
yaml.createSection("test");
yaml.createSection("test.one");
yaml.createSection("test.two");
List<String> values = new ArrayList<String>();
values.add("hello");
values.add("goodbye");
values.add("test");
yaml.set("test.one", values)
yaml.save('/path/to/file/location.yml');
person zifnab06    schedule 23.11.2013

Я лично понятия не имел, как это сделать до сих пор, но я использовал комбинацию этих двух первых ответов от zifnab06 и mezzodrinker, и это сработало хорошо. Вот что у меня есть:

        YamlConfiguration yaml = new YamlConfiguration();
        yaml.createSection("test");
        yaml.createSection("test.one");
        yaml.createSection("test.two");
        List<String> values = new ArrayList<String>();
        values.add("hello");
        values.add("goodbye");
        values.add("test");
        yaml.set("test.one", values);
        try {
            yaml.save("plugins/PermaLocs/Locations.yml");
        } catch (IOException e) {
            e.printStackTrace();
        }

Результатом для всех, кто является новичком, является файл с именами Locations, найденный в папке с именем PermaLocs, и файл содержит следующее внутри:

test:
  one:
  - hello
  - goodbye
  - test
  two: {}

Надеюсь, что это помогло кому-то. :)

person Jon Bruce    schedule 02.03.2016