mrpackはzipだと嘘をつくzipである
.mrpackを.zipにリネームして解凍しても、マニフェストとoverridesフォルダが手に入るだけでmodは入っていない——jarファイルはModrinthのCDN上にあり、ハッシュで取得される。
.mrpack はZIPアーカイブなので、.zip にリネームして解凍すれば動く——が、ほとんど何も役に立つものは出てこない。手に入るのは modrinth.index.json と overrides フォルダだけで、modは一切入っていない。jarファイルは最初から中には入っていないのだ。
modが入っていない理由
Modrinthのパックはペイロードではなくマニフェストを保存している。modrinth.index.json の各エントリには、ダウンロードURLと、そのURLが返すべきファイルのSHA-1およびSHA-512ハッシュが記載されている。ランチャーはマニフェストを読み、各ファイルを取得し、ハッシュを検証してから、初めてインスタンスに配置する。
この設計によりパックは小さく保たれ、すべてのjarを再アップロードすることなくパックを更新できる。また、一度誰かが解決するまでパックはオフラインでは使えないということでもある。
マニフェストに実際に含まれるもの
| フィールド | 意味 |
|---|---|
formatVersion | マニフェストのスキーマバージョン |
game | 対象のMinecraftバージョンとローダー |
files | path、hashes、downloads、env の配列 |
dependencies | 最初にインストールするローダーとMinecraftのバージョン |
各ファイルの env フィールドは見落とされがちだ。これはファイルを client、server、あるいはその両方としてマークする。クライアント専用とマークされたmodは、サーバーの mods フォルダにコピーすべきではない——これをやるとサーバーが起動しなくなるよくある原因になる。
ハッシュチェックは任意ではない
ダウンロードしたファイルのSHA-1がマニフェストと一致しなければ、そのファイルは間違っている。ダウンロードの途切れ、jarとして保存されたCDNのエラーページ、あるいは改ざんされたミラーのいずれかだ。検証をスキップするコンバーターは、壊れたインスタンスを平気でパックしてしまう。検証こそが、適当な再パックを信用せずにこれをローカルで行う理由そのものだ。
クライアントとサーバーの出力
同じマニフェストでも、対象によって2種類の異なるアーカイブが生成される。
- クライアントパック — すべてに加えて
overridesがインスタンスのルートにマージされ、ZIPを受け付けるランチャーですぐ使える。 - サーバーパック —
env: clientエントリをスキップし、env: serverとマークなしのものを残し、overridesからクライアント専用の設定を除外する。
Java Editionのみ。Bedrockには同等のフォーマットはない。Bedrockのアドオンは .mcaddon/.mcpack アーカイブであり、manifest.json はまったく異なる形をしており、Modrinthのパックがそれらに解決されることはない。
overridesはマージではなく上書きする
overrides/ 配下のファイルは、modが配置された後にインスタンスへ上書きコピーされる。overrides内の設定ファイルは、modのデフォルトを丸ごと置き換える。パックがoverridesに設定を同梱していて、あなたがインスタンス内でもその設定を編集した場合、次回の解決時にoverridesのコピーが勝つ。
マニフェストを変換し、すべてのハッシュを検証して、ランチャー対応またはサーバー対応のZIPを MRPACK to ZIP Converter で手に入れよう。