Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】I Fixed a Minecraft Mod by Patching a Java .class File

2026年09月19日に「Dev.to」が公開したITニュース「I Fixed a Minecraft Mod by Patching a Java .class File」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

MinecraftのModで、専用サーバーだと特定の魔法攻撃が機能しないバグを修正した。原因は、Modのイベントハンドラがクライアント側のみで登録される設定になっていたため。Javaのコンパイル済みクラスファイルを直接編集し、そのメタデータを変更することで問題を解決した。

ITニュース解説

MinecraftのModで「Spellbound Book」というアイテムに奇妙な不具合が発生した。この本は特殊な攻撃を可能にするものだが、シングルプレイ環境では正常に機能するのに、専用サーバー上では肝心の攻撃部分が全く動作しなかった。本がプレイヤーに付与する「Misconduction」という効果自体はサーバーでも適用されており、問題は攻撃がトリガーされないことにあると考えられた。

この問題の解決のため、まずはゲーム内の設定変更などを試みたが解決に至らなかったため、Modの「JARファイル」を直接調査することになった。JARファイルとは、Javaで書かれたプログラムを配布するために、コンパイル済みの「クラスファイル」と呼ばれる実行可能なファイルや、その他の必要なデータが一つにまとめられた圧縮ファイルのようなものだ。これはWindowsでいうEXEファイルやZIPアーカイブに近いと考えれば良いだろう。

JARファイルの中を調べてみると、「com.yellowbrossproductions.illageandspillage.events.ModClientEvents」という名前のクラスファイルが目についた。この名前から、クライアント(プレイヤーが操作する側のコンピューター)に関するイベント(出来事)を処理するプログラムであると推測できた。このコンパイル済みのクラスファイルを「javap」というツールを使ってさらに詳しく解析した結果、このクラスの中に、Spellbound Bookの攻撃処理、具体的にはプレイヤーがブロックを右クリックしたときにimps(インプ)という敵を召喚する処理や、敵を攻撃したときにIllager Souls(イリジャーソウル)を生成する処理が実装されていることが判明した。これにより、攻撃機能が動作しない原因は、これらの処理自体が間違っているのではなく、そもそも処理が呼び出されていないことにあると絞り込まれた。

さらにこのクラスの定義を調べたところ、「@Mod.EventBusSubscriber(modid = "illageandspillage", bus = Bus.FORGE, value = {Dist.CLIENT})」という特別な記述(「アノテーション」と呼ぶ)があることがわかった。アノテーションとは、プログラムのコードに追加される「補足情報」のようなもので、プログラム自身やそれを実行するシステムに対して、そのコードが何を意味し、どのように扱われるべきかを伝えるための目印となる。ここで特に重要だったのが「value = {Dist.CLIENT}」という部分だった。これは、「このイベントの購読者(処理を実行するプログラム)は、物理的なクライアント環境でのみ登録・実行されるべきである」という明確な指示を意味していた。

Minecraftのシングルプレイ環境では、プレイヤーが操作するクライアントと、ゲームの世界を計算するサーバーが同じコンピューター上で統合されて動作している。そのため、物理的なクライアントが存在し、「Dist.CLIENT」の条件を満たすため、ModClientEventsクラスが登録され、攻撃機能が正常に動作していたのだ。しかし、専用サーバー環境では、物理的なクライアントは存在せず、サーバープロセスのみが動作している。そのため、「Dist.CLIENT」という条件を満たせず、ModClientEventsクラスは登録すらされなかった。結果として、攻撃に関する処理が全く実行されず、Spellbound Bookの攻撃機能が使えなかったのである。サーバーが間違ったコードを実行していたのではなく、コード自体が全く実行されていなかったというわけだ。

この問題の解決策は、このアノテーションから「value = {Dist.CLIENT}」という部分を削除することだ。これにより、Forge(MinecraftのModを動作させるためのフレームワーク)が、このイベント購読者をクライアントとサーバーの両方で登録するデフォルトの挙動を使うようになる。しかし、Modの元のソースコードは手元になかったため、Mod全体を再コンパイルするのは手間がかかる。そこで、「クラスファイル」を直接編集するという手段が取られた。

Javaのクラスファイルは、プログラムの命令やデータだけでなく、アノテーションのようなメタ情報も内部に持っている。今回の修正は、このクラスファイル内の「ランタイム可視アノテーションメタデータ」と呼ばれる部分を直接編集し、「value」要素に関連する情報を削除するというものだった。これは、Spellbound Bookの攻撃の仕組みやダメージ値、設定などを一切変更することなく、単に「この攻撃機能をどこで登録・実行するか」というメタ情報だけを書き換えることに相当する。

変更後、修正したクラスファイルを元のJARファイルに再度組み込み、専用サーバーに適用した。サーバーを再起動し、Spellbound Bookの機能を試したところ、シングルプレイと同じようにimpsの召喚やIllager Soulsの生成といった攻撃が、専用サーバー上でも無事に動作するようになった。

この経験から得られた重要な教訓は、プログラムが異なる環境で異なる挙動を示す場合、単に環境設定を変え続けるのではなく、プログラムの内部構造やメタデータといったより深い層に踏み込んで調査することが重要だということだ。特にMinecraftのMod開発で使われるForgeのようなフレームワークでは、クライアント側とサーバー側の処理が明確に区別されており、この「物理的なサイド」の概念を理解することが、問題を解決する上で非常に役立つとわかる。今回のケースでは、たった一つのアノテーションの値が、Modの機能が動作するかどうかの鍵を握っていたのだ。

関連コンテンツ

関連IT用語

関連ITニュース