插件与 JVM 模组
Mindustry 支持在桌面和 Android 上加载带有 Java 字节码的 jar 文件。这些功能类似于 JS 模组,并且在创建模组时必须提供一个主类进行实例化。
理论上,所有 JVM 语言都应受到支持。
Jar/JVM 模组使用与标准模组相同的 mod.hjson 元数据文件,唯一的补充是:可以使用 main: "mypackage.MyMod" 指定 完全限定的主类。该类应扩展 mindustry.mod.Mod。
如果未指定主类,则默认为 modnameinlowercase.ModName + "Mod"。
一个简单的 Java 模组的 mod.hjson 可能如下所示:
name: "Nothing"
author: "Yourself"
main: "nothing.NothingMod"
description: "..."
version: "99.99"
有关更多说明,请参见 示例 Java 模组库 或 示例 Kotlin 模组库。
插件
插件是仅在服务器上运行的 Java 模组。通常,这些插件添加 新命令 或 新游戏模式。
所有插件的主类应扩展 mindustry.mod.Plugin。这使它们隐式 隐藏 - 客户端无需下载插件即可加入服务器。它们仅限于服务器端。要安装插件,请将 JAR 文件放入 <server directory>/config/mods/。
插件将其元数据文件命名为 plugin.[h]json。文件结构与其他 Java 模组相同 - 详见上文。
您可以在 这里 查看示例插件。有关可以在真实服务器上使用的更实际的示例,请参见 此库。
导入
与 JS 或 JSON 模组不同,JAR 模组需要编译。这意味着它们不能直接从 GitHub 导入 - 相反,使用 GitHub Releases。
当用户尝试安装 JAR 模组时,Mindustry 将检查最新的(仅最新的)GitHub 发布以查找 .jar 工件。当找到第一个工件时,它将下载到客户端。请注意,预发布版本将被忽略。
我建议使用 GitHub Actions(或任何其他 CI)自动构建并上传 JAR 工件到新发布。
多线程
除非另有说明,Mindustry 代码不是线程安全的。从主线程以外的线程执行任何操作(例如发送数据包、改变瓦片)将导致随机崩溃或网络错误。要在主线程上运行某些内容,请使用 Core.app.post(() -> { /* code */ })。
功能与安全性
由于 JAR 模组是通过 URLClassLoader 直接加载的,没有沙箱,因此它们没有任何安全限制。这意味着:
- 可以访问所有 Java API。
- 可以使用反射访问私有/隐藏属性。
- 模组可以完全访问客户端的计算机,可能会导致恶意操作。
- 模组可以更改游戏文件或重写核心字节码。
因此,您绝不要从不受信任的来源导入 JAR 模组。现在,您可能会想:为什么 JAR 模组没有沙箱?这不是一个巨大的安全风险吗?
答案是:是的,确实如此。然而,没有好的替代方案。即使我实现了一个 SecurityManager 来限制模组的功能,它也无济于事 - Java 本质上是不安全的,任何合理的"安全"沙箱实现(如果存在的话)都需要禁用模组中的反射,这是不可接受的。
作为比较,Forge(一个流行的 Minecraft Java 模组加载器)也不对模组进行沙箱处理。