将 .mrpack 转换为普通整合包 zip 文件——以及为什么解压器会失败
.mrpack 只是一个清单文件,而不是模组的压缩包。解压它只会得到一个 JSON 文件,而没有 jar 文件。本文将解释其内部结构以及转换器需要做些什么。
将一个 .mrpack 重命名为 .zip,然后打开它,你会发现里面几乎空无一物:一个 modrinth.index.json,可能还有一个 overrides/ 文件夹。模组不见了。这并非文件损坏——而是该格式的设计初衷。
内部结构
modrinth.index.json the manifest: name, version, loader, and a list of downloads
overrides/ config files, resource packs, anything not on Modrinth
清单中的每个条目看起来像这样:
{
"path": "mods/sodium.jar",
"hashes": { "sha1": "…", "sha512": "…" },
"downloads": ["https://cdn.modrinth.com/data/…/sodium.jar"],
"fileSize": 812345
}
整合包传输的是引用,而不是文件。这就是为什么一个包含 40 个模组的整合包下载大小只有 200 KB,也是为什么所有通用解压器都会“失败”——因为根本没有什么可解压的。
转换器需要做些什么
- 读取
modrinth.index.json。 - 从其 CDN URL 获取每个条目。
- 根据清单中的 sha512 校验每个文件。跳过这一步会导致损坏或被替换的 jar 文件进入整合包。
- 将每个文件放置在其
path。 - 将
overrides/覆盖到顶部——覆盖文件会生效,这就是它们的目的。 - 压缩结果。
第 3 步是转换器通常会悄悄跳过的一步。哈希不匹配意味着下载被截断或文件已更改;无论如何安装它会导致整合包在加载时崩溃,并显示指向错误模组的错误信息。
为什么要进行转换
- 不支持 .mrpack 的启动器。 ATLauncher、MultiMC 和手动安装都需要一个包含 jar 文件的文件夹。
- 服务器端。 服务器主机几乎从不接受
.mrpack;他们需要模组文件夹。 - 离线安装。 一旦转换完成,整合包就不再需要 CDN。
env 字段决定客户端还是服务器
每个文件都带有:
"env": { "client": "required", "server": "unsupported" }
服务器整合包必须跳过所有在服务器端标记为 unsupported 的内容——主要是着色器、小地图和 HUD 模组。将完整的客户端模组文件夹复制到服务器上是导致启动时崩溃并显示渲染类错误信息的常见原因。
反向操作
从文件夹构建 .mrpack 是一个反向操作,其中有一个陷阱:任何不在 Modrinth 上的模组都不能作为清单条目。它必须放在 overrides/mods/ 中,这会使整合包变大,但能确保其正常工作。悄悄删除这些模组会导致整合包安装干净但缺少内容。
在 资源包 Zip 工具 中,可以进行双向转换,并处理哈希验证和 env 分割。