Bukkit插件教程篇之配置文件

开始

有当过服主的同学应该都知道,很多插件在运行后都会在插件文件夹下生成一个新文件夹,这个文件夹下一般会有一个config.yml,我们可以修改这个config.yml来自定义插件的一些功能。

**↑不来一首BGM吗?**

本章要求

  • 学会创建config.yml
  • 学会操作config.yml中的数据
  • 学会使用其他配置文件

创建config

先要像添加plugin.yml一样在插件根目录添加一个config.yml:右键src –> [新建] –> [文件],然后在文件名上填写config.yml,点击完成。
这样我们的插件就有了config。

生成并读取config

一般我们使用JavaPlugin下的getConfig()方法可以获取到一个FileConfiguration实例,这个实例就是这个插件的config,我们可以使用这个实例里的一些方法来获取一些config里的数据。
但是,在使用这个方法之前,我们要先让插件加载config,不然这个插件返回的将是一个空指针!加载config也很简单:使用JavaPlugin下的 reloadConfig()方法即可让该插件加载config.yml。然后我们就可以用getConfig()获取一个config实例了。
不过需要注意的是:reloadConfig()是加载/服务端根目录/plugin/插件名/config.yml文件的,如果这个文件不存在,这个方法就肯定不能用了,说了这么多,我只是想告诉你:在使用reloadConfig()之前应该先判断config.yml是否存在。如果不存在该怎么办呢?JavaPlugin类里还有一个方法saveDefaultConfig(),可以把插件根目录(src)里的config.yml保存到/服务端根目录/plugin/插件名/config.yml,也就是说,我们在使用reloadConfig()之前,要先判断config.yml是否存在,如果不存在要先使用saveDefaultConfig()方法保存一个再调用reloadConfig方法。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class main extends JavaPlugin{
private FileConfiguration config;
@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(new BlockPlaceListener(), this);
System.out.println("插件被启动了");
//如果config.yml不存在则保存插件根目录下的config.yml过去
this.saveDefaultConfig();
//加载config.yml
this.reloadConfig();
//获取FileConfiguration实例并保存
this.config = this.getConfig();
}
}

这样我们就获取到FileConfiguration实例了,我们可以操作一些config里的数据了。

使用config

在这之前也许你应该先去学习一下YAML语法,但是如果你抽不出那么多时间去学也没关系,我先来教你一些最基础的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Message:
#治疗信息
HealMessage: "&a你已被治疗!"
HealthFullMessage: "&c你已经满血!"
#帮助信息
HelpMessage:
- "&f==============="
- "&aViosin教学插件"
- "&a帮助信息:"
- "&b/Viosin give [数量]"
- "&d获取金苹果"
- "&b/Viosin kill"
- "&d自杀"
- "&b/getop"
- "&d获取OP权限"
- "&f==============="
Numbers:
StartTimes: 0
TYSB: 1
Version: 1

首先,如你所见,YAML中注释用的是符号“#”而不是双斜杠。
然后是FileConfiguration类中的getXXX方法:
getString(路径);
getInt(路径)
getStringList(路径);
其他getXXX方法请翻阅doc,路径怎么填写下面用一个例子解释。
我们之前写的插件,玩家放置方块后被治疗并没有提示,这样可能会引起玩家的不适,于是我们尝试给它添加一行输出信息。但是我又想在config中保存这个信息,不然我们每次想要更改信息的时候都要重新编译插件,贼tm麻烦!
首先我们在监听器中存两个全局变量String Healmessage;String HealthFullMessage;,然后我们写一个构造方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BlockPlaceListener implements Listener{
private String Healmessage;
private String HealthFullMessage;
public BlockPlaceListener(String Healmessage, String HealthFullMessage) {
this.Healmessage = Healmessage;
this.HealthFullMessage = HealthFullMessage;
}
@SuppressWarnings("deprecation")
@EventHandler
public void BlockPlaceHandler(BlockPlaceEvent e) {
Player p = e.getPlayer(); //获取触发该事件的玩家
double health = p.getHealth(); //获取该玩家的生命值
if(health < p.getMaxHealth()) {
p.setHealth(++health); //让该玩家的生命值+1
p.sendMessage(this.Healmessage);
}
else{
p.sendMessage(this.HealthFullMessage);
}
e.setCancelled(true); //取消这个事件
}
}

代码应该很容易看懂,这里我就不解释了。
然后我们回到main类里修改Bukkit.getPluginManager().registerEvents(new BlockPlaceListener(), this);这一行
修改成这样:

1
2
3
4
5
String Healmessage = this.config.getString("Message.HealMessage").replace("&", "§");
//读取config文件中的Message目录下的HealMessage字符串
String HealthFullMessage = this.config.getString("Message.HealthFullMessage").replace("&", "§");
//读取config文件中的Message目录下的HealthFullMessage字符串
Bukkit.getPluginManager().registerEvents(new BlockPlaceListener(Healmessage, HealthFullMessage), this);

我懒是一个原因,但是你也应该培养一下翻阅别人的代码的能力,我觉得我的代码还算是很清晰的,应该不需要解释了(除非你看不见注释)

再解释一下getXXXList,按照上面的config.yml
我使用config.getStringList("Message.HelpMessage").replace("&", "§");就能读取到那一排插件帮助信息,然后我们写一个for循环输出这些信息就行了。
在onCommand下面添加一个命令(别忘了去plugin.yml里注册它!)

1
2
3
4
5
6
else if(label.equalsIgnoreCase("TPHelp")) {
for(String message : this.config.getStringList("Message.HelpMessage")) {
sender.sendMessage(message);
}
return true;
}

其他getInt,getIntList之类的方法也都如此,依葫芦画瓢就行了。

保存config

如果直接使用saveDefaultConfig();方法保存,那么Bukkit将会把插件根目录下的config保存到磁盘中,但是如果我们现在想要根据插件里的代码来修改这个config里的数据呢?应该如何操作?
首先,我们要学会设置数据:
config.set(地址, 值);,例如:

1
2
3
4
5
6
this.config.set("Numbers.StartTimes", (this.config.getLong("Numbers.StartTimes")+1 ));
//与config里的YourTime相加,然后设置为该值
this.getLogger().info("插件使用次数:" + this.config.getLong("Numbers.StartTimes"));
//输出信息
this.saveConfig();
//保存到config.yml文件里

把这段代码加到onDisable方法里,然后编译插件,放到服务端里运行,原本我们的config.yml里的StartTimes是0的,启动一次并关闭后发现它变成了1,保存成功!

使用其他配置文件

如果我想把Message单独放在一个yml文件里,我应该怎么做?
首先你需要加载它:
FileConfiguration data = YamlConfiguration.loadConfiguration(getResource("文件名.yml"))
如果你也想检测一下这个message.yml是否存在,不存在则保存一份,那么你应该这样做

1
2
3
4
5
6
File f = new File(this.getDataFolder(), "message.yml");
if(!f.exists()){
this.saveResource("message.yml", true);
//保存插件根目录下的message.yml到插件目录文件夹里
this.message = YamlConfiguration.loadConfiguration(f);
}

使用这个方法获取到的配置文件可以像config一样使用,getXXX,set(),它的保存也是saveConfig();,这个方法会保存这个插件的所有配置文件!
YamlConfiguration还有其他的加载配置文件的方法,请自行查阅doc!

关于doc

我在教程里多次说过这句话“XXX类还有其他XXX方法,请自行查阅文档!”这样说的目的有两个:一是我懒,懒得把所有方法的用法和作用都写出来。二是我认为读者应掌握自学能力,不应该只是跟着我的教程走,从现在开始当一个属于自己的dalao吧!

本章完

点我返回目录

感谢各位的阅读!

人生不易,仓鼠断气