跳转到内容

NMS 跨版本打包兼容性

QueDP 会把多个 Minecraft 版本的 NMS 实现合并到同一个插件 JAR 中。运行时,NmsWorldCreatorFactory 只会实例化与当前 Bukkit 版本匹配的实现。

但 Paper 会在插件代码运行前重映射整个插件 JAR。这个阶段会读取所有 class,包括最终不会被版本路由选中的 NMS 实现。因此,“运行时跳过不匹配模块”不能阻止 Paper 解析这些 class。

26.x 模块必须同时满足两项约束:

  • 使用 JDK 25 工具链解析和编译 Paper 26.x API。
  • 输出 Java 21 字节码(class major 65),保证 Paper 1.21.1 自带的 ASM 能完成预加载重映射。

不要把 nms26 的 jvmTarget 或 options.release 改回 25,除非发布方式已经改为按服务端版本拆分 JAR,或在 Paper 重映射阶段之后再加载独立模块。

验证命令:

Terminal window
cd nms26
.\gradlew.bat :nms-v26_1_2:shadowJar :nms-v26_2:shadowJar :nms-v26_3:shadowJar --no-daemon
cd ..
.\gradlew.bat releaseObfuscated --no-daemon

在 Paper 1.21.1 上,发布包应出现 Done remapping plugin,且不得出现 Unsupported class file major version 69。

Paper 26.3 兼容性核对(2026-09-22)

Section titled “Paper 26.3 兼容性核对(2026-09-22)”

构建基准:Paper 26.3.build.32-alpha、Java 25.0.3、TabooLib 6.3.0-2765a28。26.3 开发依赖固定为该构建;后续 Paper 构建改变 NMS 时应重新验证。

改动对 QueDP 的影响与处理
26.3 版本断点、AI 目标选择器和告示牌编辑数据包升级 TabooLib,包含上游对应适配;QueDP 自有世界模块单独注册 26.3 路由
游戏规则按注册表键查询旧的 doMobSpawning、keepInventory 等名称原先返回空,世界默认规则和 DSL 会失效;通过 Bukkit 保留的旧常量桥接,兼容旧名称及值转换
CraftWorld.getWorldPath() 使用服务器主存储会话自建世界的 Bukkit 目录可能指向主存档;本体的数据目录准备改用 NMS 创建器记录的实际路径。第三方插件直接读取 Bukkit 路径仍受 Paper 行为影响
ServerLevel 不再保存独立存储会话创建器记录会话,在 NMS 卸载时显式关闭,避免临时世界留下文件锁
虚空世界生成器参数26.3 创建器实现带生成器的重载,避免退回普通地形生成

完整 gradlew.bat build 通过。隔离实服探针验证了:插件加载、命令注册、物品 PDC 与 YAML 往返、旧粒子名、10 种旧名称游戏规则与新注册表键、三轮 NMS 建图/异步加载/卸载、模板方块保留、会话锁释放,以及 WorldPoolManager.createVoidWorld 公开入口。NMS 类的字节码版本为 65。

本轮未覆盖真人客户端的 GUI/告示牌交互、战斗体验,以及 MythicMobs、WorldEdit、PlaceholderAPI 等第三方插件联动;Paper 26.3 当前验证构建属于 Alpha。旧服务端模块完成构建,本轮未重跑全部旧版本实服。

参考:TabooLib 26.3 适配、TabooLib Shift 槽位修复、Paper 26.3 构建记录。