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 重映射阶段之后再加载独立模块。
验证命令:
cd nms26.\gradlew.bat :nms-v26_1_2:shadowJar :nms-v26_2:shadowJar :nms-v26_3:shadowJar --no-daemoncd ...\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。旧服务端模块完成构建,本轮未重跑全部旧版本实服。