Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 9 additions & 55 deletions rule/datapack.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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)规范。
Expand Down Expand Up @@ -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):
"""根据起始和结束版本获取版本列表。
Expand All @@ -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 模式。
Expand Down Expand Up @@ -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(
Expand Down
88 changes: 88 additions & 0 deletions rule/minecraft_versions.bzl
Original file line number Diff line number Diff line change
@@ -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]
Loading