官方维基教程-插件与JVM模组

来自Mindustry中文wiki

插件与 JVM 模组

Mindustry 支持在桌面端及安卓通过 Java 字节码加载 jar 的文件。这个模组类似 JS 模组,必须提供一个主类来在创建时实例化。

理论上,支持一切 JVM 语言。

Jar/JVM 模组使用和基础 json 模组相同的mod.hjson元文件,但有一个附加条件:全限定的主类必须用一个名为 main 的字段指定为 main: "mypackage.MyMod"。并且这个类必须继承 mindustry.mod.Mod

如果主类没有被指定,默认会变成modnameinlowercase.ModName + "Mod". 一个简单的Java模组的mod.hjson 看起来是这样的:

name: "nothing"
author: "你自己"
main: "nothing.NothingMod"
description: "..."
version: "114.514"

访问 Java 模组示例Kotlin 模组示例 获得更多教程。

插件

插件是仅安装于服务端的 Java 模组。 通常来说,它们添加了 新的命令 或者 新的游戏模式. 所有插件的主类都应该继承mindustry.mod.Plugin。 这使得它们被隐式转换为隐藏模式 ——客户端不需要下载插件连接服务器。他们都是仅用于服务端的! 安装插件只需要把文件放在 <服务端目录>/config/mods/. 插件命名自己的元文件 plugin.[h]json。该文件的结构与其他Java 模组的文件结构相同——详见上文。 你可以看一个示例插件在这里。对于一个可以在服务器上使用的实际示例, 看 这个项目.

导入

与JS或 json 模组不同,JAR 模组需要编译。这意味着它们不能直接从Github导入,而是使用Github Releases进行导入。

当用户尝试安装JAR模组时,Mindustry将检查最新(且最新)的Github版本的 .jar 模组 。如果有更新的版本,将自动下载并安装,注意 pre-releases 会被忽略。

我建议使用Github Actions(或任何其他CI)自动构建jar并上传。

多线程

除非另有说明,任何Mindustry代码都不是线程安全的。从主线程以外的线程执行任何操作(例如发送数据包、更改磁贴)都会导致随机崩溃或网络错误。要在主线程上运行某些内容,请使用 Core.app.post(() -> { /* code */ })

兼容性与安全

由于jar mod直接通过“URLClassLoader”加载,没有沙盒,因此它们没有任何安全限制。这意味着:

  • 所有Java API都可以访问。
  • 反射可用于访问私有/隐藏属性。
  • 模组可以完全访问客户端的计算机,为潜在的恶意行为创造良机。
  • 模组可以更改游戏文件或重写核心字节码。

因此,您应该永远不要从不受信任的来源导入jar MOD。现在,你可能想知道:为什么 jar 模组没有沙盒?这不是一个巨大的安全风险吗?

答案显然是正确的。然而,我没有更好的选择。即使实现了一个“安全管理器”来限制模组功能,也不会有帮助——Java从本质上就是不安全的,任何合理的“安全”沙盒实现(如果存在的话)都需要禁用mods中的反射,这完全是不可接受的。

作为比较,Forge(Minecraft的流行 Java 模组加载器)也不使用沙盒。