不写代码制作 Minecraft 插件
在 Minecraft 服务器上,凡是超出原版游戏的功能都得靠插件实现,而插件要用 Java 编写。这正是大多数服主会撞上的那堵墙:他们清楚自己想要什么,可唯一的路却是学一门语言、搭一个要编译的项目、啃一套 API。这个页面要讲清楚不写代码能做到什么,以及界限到底在哪里。
那堵墙,以及绕开它的三种已知办法
在 NimBlock 之前,不会编程的人有三个选择,每一个都有一条清晰的边界,值得在投入之前先了解清楚。
- 命令方块。它们固定在世界里的某个位置,靠红石或时钟触发。它们无法 对服务器事件做出反应,更别说阻止事件发生了。
- 数据包。它们局限在原版框架内:函数、进度、战利品表。没有真正的 命令,拦不住聊天,也撤销不了操作。作为交换,它们能在没有 Paper 的 原版服务器上运行。
- Skript。比前两者强大得多,也比 NimBlock 强大。它是一门真正的 语言,意味着要学语法、要会读报错。
这三者都存在多年,没有一个过时。真正缺失的,是命令方块和编程语言之间的那一级台阶。
一条规则,一句话说清
NimBlock 的整套语法可以浓缩成一句话:当这件事发生时, 如果这些条件成立,那么就做这件事。一个插件就是一份规则列表,一条规则由一个 触发器、几个条件和几个动作组成。没有别的东西要学,这是刻意为之:一句话能说完的语法, 也能装进脑子里。
在编辑器里,这些是能互相拼接的积木:一块不该出现在某处的积木,就是拼不进去。 编辑器放行的东西,校验器还会再查一遍:一份规格文件要么整份通过, 要么整份被拒,从不会只通过一半。少了保护规则的防护类插件,在游戏里根本看不出 少了什么,而这正是绝不能出现的那种故障。
现在能做到什么
9 个触发器、8 个条件、14 个动作。完整且最新的清单,连同每个参数的细节,都在 语法页面上:它是从目录直接生成的,所以从不会说谎。 简单来说,它们能做到:
- 对发生的事做出反应:玩家上线、下线、聊天消息、死亡、方块被破坏 或放置、你自己发明的命令,或者干脆每隔 N 秒一次。
- 按条件筛选:权限、管理员身份、所在世界、生命值、文本内容、数字 比较,或者概率。
- 执行动作:发送消息、大标题、播放音效、给予物品、施加效果、治疗、 传送、向全服公告、执行控制台命令,以及撤销刚刚发生的事件。 正是最后这一项,让这份清单变成真正的防护手段。
它替代不了什么
一个什么都承诺的页面对谁都没用。NimBlock 做不到的事:
- 造不出新的游戏机制。新的方块类型、全新的实体、定制的物品栏 界面:这些是 Java 的活,而且永远都会是。
- 没有变量,也没有循环。规则只会做出反应,不会计算。如果你的想法 需要在两个事件之间保存复杂的状态,那就超出了这套语法的能力范围。
- 不支持第三方插件。NimBlock 只运行你的规格文件,不会加载从别处 下载的 .jar。
- 新命令要等到下次启动才会生效。其余的改动都能热更新,不需要 关服,但 Minecraft 只在启动时注册命令:这一点会在面板上当场提示,而不是让你 在游戏里自己发现。
插件在哪里运行
这里从头到尾都不会生成 Java 代码再编译。服务器加载的是一个为所有人只写一次的 运行时,这个运行时会读取你的规格文件。这正是在这里搭建的插件不会欠下 技术债的原因:当 Minecraft 更新时,需要跟着适配的是这个运行时,只改一次, 而不是每一个用它写出来的插件都要改一遍。
在 NimBlock 服务器上,安装只需要点一下,插件不用关服就能下发生效。至于运行时 本身,以后会发布到插件目录里,让同一份规格文件也能在不是托管在这里的服务器上 运行。
常见问题
- 真的能在不会编程的情况下做出 Minecraft 插件吗?
- 可以,但有一个前提:你是在一套既定的语法里拼规则,而不是随便写一个程序。一条规则说的是「当这件事发生时,如果这些条件成立,那么就做这件事」。朋友之间的服务器需要的东西,几乎都能装进这个句式:欢迎消息、奖励、防护、公告、自定义命令。装不进去的,是那些需要发明全新游戏机制的东西,那就得靠 Java 了。
- 这和命令方块有什么区别?
- 命令方块固定在世界里的某个位置,靠红石或时钟触发。插件则是靠服务器事件触发:玩家上线、方块被破坏、聊天里的一条消息。命令方块做不到的,是对正在发生的事做出反应,更做不到阻止它发生。而一条 NimBlock 规则可以撤销刚刚发生的事件。
- 那和数据包相比呢?
- 数据包局限在原版游戏的框架内:函数、进度、战利品表。它加不了真正的命令,拦不住聊天,也撤销不了操作。Paper 插件可以做到这些,因为它运行在服务器里,而不是世界数据里。作为交换,数据包能在原版服务器上运行,而插件需要 Paper 或 Spigot。
- 那和 Skript 相比呢?
- Skript 是这类工具的鼻祖,也强大得多,完全不是一个量级:它是一门真正的语言,有变量、有循环,还有一个庞大的扩展库。但正因为是语言,就得学语法、啃报错,而且文件不会告诉你到底是哪里出了问题。NimBlock 能做的少得多,但它会在保存前拒绝一条无效的规则,并在出问题的那块积木上准确标出位置。如果你用 Skript 用得顺手,那就继续用 Skript。
- 插件会在什么地方被编译成 Java 吗?
- 不会,这正是这个产品最核心的选择。你的规格文件始终是一个 JSON 文件,服务器加载的是一个为所有人只写一次的运行时,由它读取并执行这个文件。什么都不会被生成,什么都不会被编译。实际的好处是:Minecraft 出新版本时,代价只需要在这个运行时里付一次,而不是每个用它写出来的插件都要付一次。
- 能不能把插件用到不是托管在 NimBlock 的服务器上?
- 这在计划之中,读取规格文件的运行时会发布到各个插件目录里。规格文件本身就是一个普通的 JSON 文件:运行时会从服务器的插件目录里读取它。截至撰写本页时,这项功能还没有上线。