创建'自定义'Bukkit插件YAML文件

时间:2013-11-22 03:23:32

标签: yaml minecraft bukkit

大家。我刚刚开始为Minecraft编写Bukkit插件。我的前两个插件在我的服务器上运行正常,我已经有了dev版本,而且它们根本没给我带来太多麻烦。我目前正在研究第三种,我遇到了一些麻烦。

我试图弄清楚如何创建一个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,我希望将最后两个参数(两个和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,则会在该部分添加'test'而不替换之前添加的'goodbye'。 谁能给我一些帮助或提示如何去做这个? 谢谢!

[编辑]昨晚我发现了。我实际上正在做的一切就文件和YamlCinfiguration而言,我的CommandExecutor有问题,但我修复了它。感谢您的回复!

3 个答案:

答案 0 :(得分:5)

一般来说,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上提供的插件源代码。

答案 1 :(得分:4)

我相信你要找的是org.bukkit.configuration.file.YamlConfiguration。 javadoc位于here

快速示例,基于上面的示例:

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');

答案 2 :(得分:0)

我个人直到现在才知道如何做到这一点,但我使用了zifnab06和mezzodrinker这两个第一个答案的组合,它很好地解决了。这就是我所拥有的:

.alert span {
  vertical-align: middle;
  line-height:normal;
}

.alert > div {
  line-height: 34px;
}

对于任何新手,结果是在名为PermaLocs的文件夹中找到的文件名位置,该文​​件内部包含以下内容:

        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();
        }

希望有人帮助过。 :)