diff --git a/rule/datapack.bzl b/rule/datapack.bzl index 7f127c3..c01205e 100644 --- a/rule/datapack.bzl +++ b/rule/datapack.bzl @@ -20,6 +20,7 @@ load("@//rule:upload_modrinth.bzl", "modrinth_dependency", "upload_modrinth") load("@rules_java//java:defs.bzl", "java_binary") load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup", "pkg_files") load("@rules_pkg//pkg:zip.bzl", "pkg_zip") +load(":minecraft_versions.bzl", "ALL_MINECRAFT_VERSIONS") def _is_valid_semver(version): """验证版本号是否符合语义化版本控制(SemVer)规范。 @@ -207,54 +208,7 @@ def validate_semver(version, context = "版本号"): " - 1.0.0-beta+exp.sha.5114f85\n" + "请参考项目根目录的 SemVer.md 文档了解详细规范。") -# 完整的 Minecraft 版本列表(按发布顺序排列) -_ALL_MINECRAFT_VERSIONS = [ - "1.13", - "1.13.1", - "1.13.2", - "1.14", - "1.14.1", - "1.14.2", - "1.14.3", - "1.14.4", - "1.15", - "1.15.1", - "1.15.2", - "1.16", - "1.16.1", - "1.16.2", - "1.16.3", - "1.16.4", - "1.16.5", - "1.17", - "1.17.1", - "1.18", - "1.18.1", - "1.18.2", - "1.19", - "1.19.1", - "1.19.2", - "1.19.3", - "1.19.4", - "1.20", - "1.20.1", - "1.20.2", - "1.20.3", - "1.20.4", - "1.20.5", - "1.20.6", - "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", -] + def minecraft_versions_range(start_version, end_version = None): """根据起始和结束版本获取版本列表。 @@ -273,24 +227,24 @@ def minecraft_versions_range(start_version, end_version = None): minecraft_versions_range("1.20.3") # 返回从 1.20.3 到最新版本的所有版本 """ - if start_version not in _ALL_MINECRAFT_VERSIONS: + if start_version not in ALL_MINECRAFT_VERSIONS: fail("起始版本 '%s' 不在支持的版本列表中" % start_version) - start_index = _ALL_MINECRAFT_VERSIONS.index(start_version) + start_index = ALL_MINECRAFT_VERSIONS.index(start_version) if end_version == None: # 如果没有指定结束版本,则取到最新版本 - return _ALL_MINECRAFT_VERSIONS[start_index:] + return ALL_MINECRAFT_VERSIONS[start_index:] - if end_version not in _ALL_MINECRAFT_VERSIONS: + if end_version not in ALL_MINECRAFT_VERSIONS: fail("结束版本 '%s' 不在支持的版本列表中" % end_version) - end_index = _ALL_MINECRAFT_VERSIONS.index(end_version) + end_index = ALL_MINECRAFT_VERSIONS.index(end_version) if start_index > end_index: fail("起始版本 '%s' 不能晚于结束版本 '%s'" % (start_version, end_version)) - return _ALL_MINECRAFT_VERSIONS[start_index:end_index + 1] + return ALL_MINECRAFT_VERSIONS[start_index:end_index + 1] def datapack_functions(pack_id): """生成数据包函数文件的 glob 模式。 @@ -334,7 +288,7 @@ def _datapack_impl( minecraft_json): # 默认使用版本列表中的最新版本 if not minecraft_version: - minecraft_version = _ALL_MINECRAFT_VERSIONS[-1] + minecraft_version = ALL_MINECRAFT_VERSIONS[-1] process_mcfunction( diff --git a/rule/minecraft_versions.bzl b/rule/minecraft_versions.bzl new file mode 100644 index 0000000..373a695 --- /dev/null +++ b/rule/minecraft_versions.bzl @@ -0,0 +1,88 @@ +"""Minecraft 版本列表。 + +此文件包含所有支持的 Minecraft 版本列表,按发布顺序排列。 +该列表用于 minecraft_versions_range() 函数和其他需要版本范围的功能。 +""" + +ALL_MINECRAFT_VERSIONS = [ + "1.13", + "1.13.1", + "1.13.2", + "1.14", + "1.14.1", + "1.14.2", + "1.14.3", + "1.14.4", + "1.15", + "1.15.1", + "1.15.2", + "1.16", + "1.16.1", + "1.16.2", + "1.16.3", + "1.16.4", + "1.16.5", + "1.17", + "1.17.1", + "1.18", + "1.18.1", + "1.18.2", + "1.19", + "1.19.1", + "1.19.2", + "1.19.3", + "1.19.4", + "1.20", + "1.20.1", + "1.20.2", + "1.20.3", + "1.20.4", + "1.20.5", + "1.20.6", + "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", +] + +def _parse_version(version_str): + """将版本字符串解析为整数列表以便比较。""" + parts = version_str.split(".") + result = [] + for part in parts: + result.append(int(part)) + return result + +def _compare_versions(v1, v2): + """比较两个版本字符串,返回负数如果 v1 < v2,0 如果相等,正数如果 v1 > v2。""" + parts1 = _parse_version(v1) + parts2 = _parse_version(v2) + # 使两个列表长度相同,用0填充较短的部分 + max_len = max(len(parts1), len(parts2)) + parts1.extend([0] * (max_len - len(parts1))) + parts2.extend([0] * (max_len - len(parts2))) + for i in range(max_len): + if parts1[i] != parts2[i]: + return parts1[i] - parts2[i] + return 0 + +def _validate_versions(): + """验证版本列表是否按正确顺序排列。""" + for i in range(len(ALL_MINECRAFT_VERSIONS) - 1): + current = ALL_MINECRAFT_VERSIONS[i] + next_version = ALL_MINECRAFT_VERSIONS[i + 1] + if _compare_versions(current, next_version) >= 0: + fail("版本列表未按正确顺序排列:'%s' 在 '%s' 之后" % (current, next_version)) + +_validate_versions() + +def latest_minecraft_version(): + """获取最新的 Minecraft 版本。""" + return ALL_MINECRAFT_VERSIONS[-1] \ No newline at end of file