Minecraftを逆コンパイル(+難読化解除)してソースコードを編集・コンパイルする方法 [Java 1.17]
- 注意
- はじめに
- 逆コンパイル→コンパイル
- 編集する
- 日本語でコメントできるようにする
- (おまけ1) IntelliJ IDEAの日本語化
- (おまけ2) Assetsのコピー
- (余談) yarnについて
- 参考動画
注意
逆コンパイルしたコードは公開できません。
後ほど紹介するMCP-Rebornのライセンスで禁止されています。
その他の禁止事項についてはMCP-RebornのMCP-License
にあります。
これらの点を注意して逆コンパイル・編集・コンパイルをしましょう。
はじめに
Minecraftの詳しい動作を知りたいとき、ソースコードをただ見るだけよりも、ソースコードにログを吐くコードを追加して挙動を見たほうが理解しやすかったりします。そこで、ソースコードが編集されたMinecraftを作る方法を紹介します。
逆コンパイル→コンパイル
各種ツールのダウンロード
まずは、IntelliJ IDEAとMCP-Rebornをダウンロードします。
IntelliJ IDEA
以下のリンクから「ダウンロード」をクリックします。
https://www.jetbrains.com/ja-jp/idea/
そうするとこのようなページに飛ぶので、Communityのほうをダウンロードします。
ダウンロードできたら、exeなら実行、zipなら展開して適当な場所に置いてください。
MCP-Reborn
以下のリンクからお好みのバージョンのzipファイル(Source codeではないほう)をダウンロードしてください。
https://github.com/Hexeption/MCP-Reborn/releases
ダウンロードできたら展開して適当な場所に置いてください。
IntelliJ IDEAの操作
ダウンロードできたら、IntelliJ IDEAを開きます。規約の同意と匿名の情報送信について選択したあと、ウィンドウが出ます。そのウィンドウの「Open」をクリックします。
ファイルの選択ダイアログが出るので、展開したMCP-Rebornの中にあるbuild.gradle
を選択して「OK」をクリックします。
そのファイルをどのように開くか聞かれるので、「Open as Project」をクリックします。
更に、そのプロジェクトを信頼するか聞かれるので、「Trust Project」をクリックします。
そうすると自動でプロジェクトのビルドが開始されるので、しばらく待ちます。
左下に「finished」、右下に「BUILD SUCCESSFUL」などと書かれていれば、ビルドが完了しています。
ビルドが完了したら、次はセットアップをします。
右端に縦書きで「🍃Gradle」と書いてある部分をクリックします。右上にメニューが出てくるので、mcp-reborn/Tasks/mcp
の中のsetup
をダブルクリックします。
これで逆コンパイル(+難読化解除)を含めたセットアップが始まります。左下に「successful」、右下に「BUILD SUCCESSFUL」などと書かれていれば、セットアップが完了しています。
ここまで来れば、あとはコンパイルしてゲームを起動するだけです。setup
の上にあるrunclient
をダブルクリックします。
コンパイルのあと、ゲームが起動します。
ゲームの起動が確認できたら、この節は終了です。
編集する
さて、次はソースコードを編集します。
今回は、TNTが爆発した瞬間のTNT座標をログファイルに出力するプログラムを挿入します。 Minecraftでは「複数のTNTが近くで同一tickで爆発するとき、先に爆発したTNTの影響を受けて、後に爆発するTNTが爆発直前に移動」します。これをソース編集によって体感します。
では、まずはエンティティのTNTの挙動を記述したファイルを探します。ここでCtrl+Shift+N
キーを押します。
検索画面が出たので、「tnt」と入力します。
いろいろなファイルが引っかかりますが、エンティティのTNTはPrimedTnt.java
*1に記述されているので、それを選択します。
PrimedTnt.java
が開かれるので、このファイルの82行目あたり*2にあるexplosion
関数*3の中に以下のコードを挿入します。
System.out.println("(x, y, z) = (" + this.getX() + ", " + this.getY() + ", " + this.getZ() + ")");
場所はどこでも良いですが、とりあえず関数の最初にします。
挿入したら、runclient
をしてゲームを実行します。
そして、以下の動画と同じことをします。TNTを(x, z) = (0.5, 0.5)と(0.5, 2.5)に置き、同時に着火します。y座標は見ないので適当に。
爆発したので、そのログが吐かれています。
ログはrun/logs/latest.log
にあります。
latest.log
を開くと、ファイルの末尾に座標が書き込まれているはずです。
このように、爆発した瞬間の座標や爆発の順番がわかります。 爆発の順番は(x, z) = (0.5, 0.5)→(0.5, 2.5)のようです*4。 よく見るとz = 2.5付近で爆発するはずのTNTはz = 3.259で爆発しています。 これは先に爆発したTNTの爆発力で、後に爆発するTNTが飛んだ現象です。 これで「後に爆発するTNTが爆発直前に移動する」ことを体感できたかなと思います。 お疲れさまでした。
その他の編集のヒント
その他のファイルを編集してログを吐かせる場合も、以上と同じ手順でできます。
Tips : 関数の元を見つける
TNTの例では、explosion
関数の中にthis.level.explosion
という関数が書かれていました。
この関数は何をやっているのか?を追うために、便利なショートカットキーがあります。
this.level.explosion
のexplosion
にカーソルを合わせてCtrl+Alt+B
キーを押します。
これでこの関数が実装されている位置まで飛んでくれます。
このショートカットキーを使って奥深くまで追うことができます。
日本語でコメントできるようにする
このままだと、日本語でコメントするとエラーが出ます。
これは、文字コードを指定すれば解決します。
左のメニューからbuild.gradle
を開きます。
開いたファイルの末尾に以下の2行を追記します。
compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = 'UTF-8'
これで日本語のコメントを打てるようになります。
(おまけ1) IntelliJ IDEAの日本語化
IntelliJ IDEAの日本語化の方法を紹介します。
左上の「File」から「Settings」をクリックします。
設定ウィンドウが出ます。左側の「Plugin」をクリックし、検索欄に「japan」と入力します。そうすると日本語化プラグインが出てくるので、それを選択してインストールします。
インストールができたら「Restart IDE」をクリックしてIntelliJ IDEAを再起動します。
これで日本語化ができました。
(おまけ2) Assetsのコピー
何もしない状態では、実行したゲームから音が鳴りません。また、日本語化もできません。
このような音や言語ファイル(Assets)が欲しい場合は、右上のGradleメニューのmcp-reborn/Tasks/mcp
からcopyAssets
を実行します。
実行したあと、左下に「successful」、右下に「BUILD SUCCESSFUL」などと書かれていれば、Assetsのコピーが完了しています。
このままrunclient
でゲームを実行すれば、音が出てくるはずです。
(余談) yarnについて
yarnというツールがあります。 これは逆コンパイルと難読化解除までをしてくれるツールです。 編集とコンパイルはできません。 特徴としては、難読化解除後の名前がMCP-Rebornと違う点です。 MCP-Rebornよりわかりやすい命名なこともあるので、見比べると理解が早くなるかもしれません。 yarnの使い方についてはこちらを参照ください。ただし、バージョン1.17以降はJava16のパスを通す必要があり、手順が増えることに注意してください。
参考動画
How To See And Edit Minecraft's Source Code | Minecraft Coding Tutorials #3 www.youtube.com
この記事の流れはこの動画に沿っています。 編集についてと日本語特有の内容をこの記事で追加しています。
javaで日本語を使用するときの文字化けの解決方法
IntelliJ IDEA 日本語化 - JetBrains 公式言語パックのインストール