gists

Minecraft Modding の仕組み — Fabric・Forge はなぜ可能なのか

はじめに

Minecraft(Java Edition)には公式の Modding API が存在しない。にもかかわらず、Fabric や Forge といった大規模な Mod フレームワークが成立している。その技術的な仕組みと、Java という言語選択がもたらした意図せぬ好循環について整理する。


Fabric の仕組み

Minecraft Java Edition は Java で書かれており、コンパイル済みの .class ファイルは比較的解析・改変しやすい。Fabric はこの特性を利用している。

難読化の解除(Mappings)

Mojang はリリース時にクラス名やメソッド名を難読化(a, b, c のような名前に変換)している。Fabric コミュニティは独自のマッピング(Yarn および Intermediary)を作成・維持し、難読化された名前を人間が読める名前に対応付けている。Intermediary はバージョン間で安定した中間マッピングで、Mod の互換性維持に重要な役割を果たす。

Mixin によるコード注入

Fabric の中核技術が Mixin(SpongePowered が開発)である。Minecraft のコンパイル済みバイトコードに対して、実行時(ランタイム)にコードを注入・差し替えできる。たとえば「プレイヤーがダメージを受ける処理」の前後に独自のコードを挟むことが可能。直接ソースコードを書き換えるのではなく、クラスのロード時にバイトコードレベルで変換をかける仕組みである。

Fabric Loader

Mod のロードやライフサイクル管理を担当する軽量なローダー。Minecraft の起動プロセスに介入し、Mixin の適用や Mod の初期化を行う。

Fabric API

よく使われる機能(イベントのフック、アイテム・ブロックの登録など)を抽象化した共通ライブラリ。Mod として提供されており必須ではないが、多くの Mod が依存している。


Forge の仕組み

Forge も「Java のバイトコードをいじる」点では同じだが、アプローチが異なる。

バイナリパッチ方式

Forge は Minecraft の .class ファイルに対してバイナリパッチ(差分パッチ)を適用する。開発チームが Minecraft のデコンパイル済みソースを改変し、その差分だけをパッチファイルとして配布している。Minecraft 本体のコードは再配布しない。

具体的な流れ:

  1. ユーザーが Forge のインストーラーを実行する
  2. インストーラーがローカルにある Minecraft の .jar ファイルを取得する
  3. その .jar に対してパッチを適用し、改変済みの .jar を生成する
  4. この改変済み .jar で Minecraft が起動する

ユーザーの手元で、ユーザーが所有する Minecraft に対してパッチを当てるため、改変済みコードの直接配布には該当しない。

デコンパイルと MCP

歴史的に Forge は MCP(Mod Coder Pack) に依存していた。MCP の役割:

現在は Mojang 自身が公式マッピングを公開するようになり、状況は変化している。

大量のイベントフック

Forge の大きな特徴は、パッチによって Minecraft のコード各所にイベント発火ポイントを埋め込んでいること。「エンティティがスポーンした」「ブロックが壊された」「ワールドがロードされた」など膨大な種類のイベントが用意されており、Mod 開発者はイベントを購読するだけで機能を追加できる。Mod 開発者が直接バイトコードをいじらなくて済むよう、分厚い API 層を提供する思想である。


Fabric と Forge の比較

観点 Forge Fabric
手法 パッチで本体を改変し API を提供 Mixin で実行時に注入
API の厚さ 分厚い(イベントが大量) 薄い(必要最小限)
バージョン追従 パッチの再作成が必要で遅い Mixin は比較的追従しやすい
Mod 開発者の負担 API に乗れば楽 Mixin の知識が必要になることも

なぜ Java だからこそ可能なのか

Java の .class ファイルは比較的構造化されたバイトコードであり、デコンパイルの精度が高く、差分の生成・適用がしやすい。C++ でコンパイルされたネイティブバイナリ(例:Bedrock Edition)では同様のことは極めて困難であり、Bedrock 側の Mod シーンが Java Edition ほど発展していないのはまさにこの理由による。


Java 選択がもたらした逆説的な成功

Notch(Markus Persson)が Java を選んだのは、当時の彼にとって書き慣れた言語だったからという素朴な理由だったとされる。パフォーマンス面ではガベージコレクションによるカクつきやメモリ消費の大きさなど不利な点が多い。

しかし結果的に、Java であったことが以下の好循環を生んだ:

Microsoft が後に Bedrock Edition を C++ で作り直したのは、パフォーマンスやモバイル・コンソール展開を考えれば合理的な判断だった。しかし Bedrock の公式アドオンシステムは Java 版 Mod シーンの自由度には遠く及ばない。「正しい技術選択」が必ずしもエコシステムの豊かさにはつながらないという好例であり、技術的な制約がコミュニティの創造性を刺激するという、意図せぬ好循環が生まれた稀有なケースといえる。