Skip to content

bukkit-nms: MinecraftVersion 在 Spigot 1.21.11 Unobfuscated 下错误解析 runningVersion,导致误判为 unsupported #681

@sumdream

Description

@sumdream

我遇到了个版本适配的问题,让ai总结如下。奈何不会发pr,只能提个issue了

问题描述

Spigot 1.21.11 Unobfuscated 环境下,TabooLib 会错误打印:

当前 Minecraft 版本不受支持,请等待插件适配。

但实际上 MinecraftVersion.supportedVersion 中已经包含 1.21.11

根因是 MinecraftVersion.runningVersion 的解析逻辑直接从 Bukkit.getServer().version 中截取 "MC:" 后的内容,并仅去掉最后一个字符,导致在当前环境下解析结果变成:

  • 1.21.11 Unobfuscated

而不是:

  • 1.21.11

后续 isSupported 使用的是精确匹配,因此匹配失败。

影响版本

  • TabooLib: 6.2.4-99fb800
  • 模块:bukkit-nms

运行环境

  • 服务端:Spigot 1.21.11 Unobfuscated
  • 服务端日志中的版本字符串:
This server is running CraftBukkit version 4598-Spigot-56165ca-d74c5d8 (MC: 1.21.11 Unobfuscated) (Implementing API version 1.21.11-R0.2-SNAPSHOT)

复现方式

  1. 在 Spigot 1.21.11 Unobfuscated 环境启动一个使用 TabooLib bukkit-nms 的插件
  2. 启动时触发 MinecraftVersion 初始化
  3. 观察日志

实际结果

日志中会输出:

当前 Minecraft 版本不受支持,请等待插件适配。

同时我在插件启动时加了诊断日志,结果如下:

[VersionProbe] trigger = Awake/LOAD
[VersionProbe] Bukkit.getServer().version = 4598-Spigot-56165ca-d74c5d8 (MC: 1.21.11 Unobfuscated)
[VersionProbe] 模拟旧版 TabooLib runningVersion = 1.21.11 Unobfuscated
[VersionProbe] Bukkit.getMinecraftVersion() = <不可用>
[VersionProbe] 正则提取语义化版本 = 1.21.11
[VersionProbe] TabooLib.runningVersion = 1.21.11 Unobfuscated
[VersionProbe] TabooLib.isSupported = false, isSkipped = false
[VersionProbe] supported.contains(模拟值) = false
[VersionProbe] supported.contains(正则值) = true

预期结果

在该环境下,runningVersion 应该被规范化为:

1.21.11

从而使:

MinecraftVersion.isSupported == true

且不再打印 unsupported warning。

问题位置

文件:module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt

当前逻辑大致为:

val runningVersion by unsafeLazy {
    val version = Bukkit.getServer().version.split("MC:")[1]
    version.substring(0, version.length - 1).trim()
}

这在 MC: 1.21.11 Unobfuscated) 这种格式下会得到:

1.21.11 Unobfuscated

为什么会误判

supportedVersion 中 1.21 组已经包含:

arrayOf("!1.21", "1.21.1", "!1.21.2", "1.21.3", "1.21.4", "1.21.5", "!1.21.6", "!1.21.7", "1.21.8", "!1.21.9", "1.21.10", "1.21.11")

isSupported 的判断是:

supportedVersion.flatten().contains(runningVersion)

这是精确匹配,因此:

  • contains("1.21.11 Unobfuscated") == false
  • contains("1.21.11") == true

附带影响

MinecraftLanguage.kt 里也依赖 MinecraftVersion.runningVersion 做版本匹配,因此该问题还可能导致语言文件下载或匹配失败。

当前环境启动日志中也能看到:

正在下载 Minecraft 语言文件 ...
未能找到 Minecraft 语言文件。

建议修复

建议 runningVersion 不要直接依赖原始 Bukkit.getServer().version 截断,而是做更稳健的版本提取,例如:

  1. 优先尝试 Bukkit.getMinecraftVersion()
  2. 如果不可用,再从 Bukkit.getServer().version 中用正则提取纯语义化版本号

例如:

val runningVersion by unsafeLazy {
    runCatching {
        Bukkit::class.java.getMethod("getMinecraftVersion").invoke(null) as? String
    }.getOrNull()?.trim()?.takeIf { Regex("""\d+\.\d+(?:\.\d+)?""").matches(it) }
        ?: Regex("""\d+\.\d+(?:\.\d+)?""").find(Bukkit.getServer().version.substringAfter("MC:"))?.value
        ?: Bukkit.getServer().version.substringAfter("MC:").substringBefore(')').trim()
}

总结

这不是 1.21.11 没有加入支持列表的问题,而是:

  • 支持列表里有 1.21.11
  • 但实际解析出的 runningVersion1.21.11 Unobfuscated
  • 因此精确匹配失败

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions