pack.mcmeta:pack_format 编号与“不兼容”警告
一个字段填错,Minecraft 就会把你的数据包/资源包置灰。这里说明 26.x 要求的格式、如何用一个文件同时兼容新旧版本,以及文件必须放在哪里,资源包和数据包用的是两套不同的编号,26.3 的资源包是 97,数据包则是 121。
几乎每一条“我的包显示为不兼容”,问题都出在一个小文件里的一个字段。
文件本身
{
"pack": {
"min_format": 97,
"max_format": 97,
"description": "My pack"
}
}
这是一个 26.3 资源包;26.3 数据包则使用 121。自 1.21.9 起,任何高于 64(资源包)或 81(数据包)的格式都必须用 min_format 和 max_format 声明。如果包里仍然只写一个裸的 "pack_format": 97——大多数教程和大多数生成器至今仍这么写——就会被拒绝,并显示为不兼容。
文件名必须严格为 pack.mcmeta,并且位于 zip 的根目录——与 assets/ 或 data/ 同级,而不是放在 zip 内的某个文件夹里。把外层文件夹而不是文件夹里的内容打包成 zip,是第二常见的失败原因,而且它看起来和格式编号写错一模一样。
资源包和数据包用的是不同的编号
这一点最容易让人栽跟头:这两个计数器多年前就已经分道扬镳,不能互换使用。数据包如果用了资源包的编号,即使这个编号是“当前版本”的,也会被置灰。
与其去背一张每个版本都会过期的对照表,不如直接从你所针对版本的原版包里读出编号——或者干脆让生成器帮你填。
用一个文件兼容新旧版本
只钉死一个编号,意味着下个版本发布时包就会失效。用范围就不会——但一个延伸到 26.x 的范围,必须同时为两代游戏写法:
{
"pack": {
"pack_format": 46,
"supported_formats": { "min_inclusive": 46, "max_inclusive": 64 },
"min_format": 46,
"max_format": 97,
"description": "My pack"
}
}
min_format/max_format 是 26.x 读取的范围。pack_format 和 supported_formats 只是为了照顾 1.21.9 之前的客户端:supported_formats 必须正好结束于 64(数据包为 81),min_format 必须等于它的下限,而 pack_format 必须落在该范围内。过去那种建议——supported_formats 一直写到 99 之类的大数字——现在恰恰是 26.x 会直接拒绝的写法。对于只添加纹理或配方的包——也就是大多数包——用宽范围是诚实的做法,因为版本之间实际上没有任何东西会坏掉。
description 接受文本组件
"description": [
{ "text": "My pack ", "color": "gold" },
{ "text": "v2", "color": "gray", "italic": true }
]
§ 代码(§6)也仍然可用,但 JSON 形式能经受住那些会剥掉控制字符的工具的复制粘贴。
overlays:同时支持多个版本
"overlays": { "entries": [
{ "formats": { "min_inclusive": 42, "max_inclusive": 45 }, "directory": "older" }
] }
包根目录下的 older/ 文件夹只在那些格式上生效。这样一次下载就能支持两个使用不同模型格式的版本,而不必发布两个 zip。
快速排查
| 症状 | 原因 |
|---|---|
| 被置灰,提示“made for an older/newer version” | 格式编号错误,或者(1.21.9 及以后)缺少 min_format/max_format |
| 包根本没有被列出 | pack.mcmeta 不在 zip 根目录,或者 JSON 无效 |
| 能加载,但纹理缺失 | 包格式没问题;纹理路径写错了 |
| 单人游戏能用,服务器上不行 | 数据包放错了世界文件夹 |
末尾多一个逗号属于无效 JSON,会导致“根本没有被列出”这种情况,而不会给出任何错误提示。
用 pack.mcmeta 生成器为你的包类型和目标版本生成一个有效文件——包括 min_format/max_format,以及旧版本所需的旧式字段。