跳到主要内容

3-5 运行和测试

安装和测试插件

现在我们就来测试写好的插件吧!和第二章一样,先使用 Gradle 面板中的 jar 选项构建插件,再将它挪到服务器根目录的 plugins 文件夹中,随后启动服务器。同时,打开客户端 Minecraft(在 Alicorn 中,只需要在游戏库中找到上次创建的游戏,并点按启动按钮),并在多人游戏中通过 localhost 或者 127.0.0.1 加入服务器。

如果一切正常,你将看到服务器发送的公告:

Anno Running

前往服务器的 plugins 目录下,Bukkit 应当生成了一个与插件同名的文件夹(在这里是 Anno),其中包含一个 config.yml 文件。如果将其打开,你将看到我们先前设置的默认配置文件:

enabled: true
content: Welcome to my Paper server!

你可以将 content 修改成任何你想要的内容,比如:

enabled: true
content: |
    欢迎来到我的插件开发服务器!
    禁止破坏性 TNT 行为
    禁止复制龙蛋
    禁止嘲讽和恶意蹲起
    禁止售卖隔夜西瓜酿造的药水

这里在 content:  后添加的管道符 |(按下 Shift,再按主键盘 Enter 键上方的那个按钮)允许我们像上面那样编写多行字符串。YAML 会将前面的缩进和其它多余的字符都删掉,只留下文字本身,并在最后添上一个换行。如果想进一步了解这种用法,可以看看 YAML Multiline Strings 这个网站。

重载配置

当你修改了配置文件后,有两种方法让它生效:

  1. 关闭并重启服务器(不需要重启客户端),然后重新加入服务器。
  2. 在服务器控制台键入 reload confirm 命令,重新加载所有插件,这种方法不需要关闭服务器。

这里我们使用第二种方式,在控制台键入 reload confirm(注意前面没有斜线 /)并按 Enter,Bukkit 会重新加载所有插件(包括代码和配置文件),这时退出并重新加入服务器就能看到新的信息:

Anno Running With New Config

等一下!

reload confirm 看上去很方便?不需要重启服务器就能更新插件?的确如此,但这不是毫无代价的:

  • 插件内部的状态将丢失(包括所有的变量值、函数的执行状况等)。
  • 服务器会停止响应一段时间,特别是插件很多的服务器。
  • 如果有其它正在进行的操作(例如插件更新自身),会造成不可预料的问题。
  • 极有可能会造成内存泄漏,或者加重已有的情况。
  • Paper 不保证在这条命令执行后,服务器上的数据还是完整的。

读者应当始终明白:reload confirm 仅仅是一个用于开发和测试的命令,它允许我们在不重启服务器的情况下快速查看插件(和配置)更新后的效果,这能提升测试的效率,但所带来的风险也会随着这种便利性而增加。合理地在开发环境中使用这条命令,并且绝不要在任何生产环境的服务器上尝试执行它


这样我们就完成了整个项目,虽然期间讲了不少语言知识,但就代码来说还算简单(不到 30 行)。你可以在 GitHub 上查看本项目的源代码。

现在来看看我们都做了什么(不含语言知识):

  • 使用 YAML 来存储配置文件。
  • 插件启动时通常保存默认配置文件,默认配置文件的名称是 config.yml
  • 使用 config 属性获取配置文件(实际上是调用 getConfig 方法),并用合适的 getXXX 方法读取内容。
  • 使用 as 进行类型转换,但这种方法可能出错。
  • 使用 sendMessage 向玩家发送消息。
  • onEnable就地创建事件监听器,并根据情况注册。
  • 在 YAML 中用 | 填写多行字符串。

有了配置文件,我们的插件就能拥有更高的可自定义程度,这使得管理员改变插件的部分功能更加容易,那么我们的插件就能在市面上众多功能相同的产品中拥有进一步的优势,而且我们也不用再纠结这个公告到底写什么好呢,而是可以交给服务器自主配置,这可太好了!