はじめに
マイクラのMOD開発してて、ビルド重い、再起動だるいとか思ったことはありませんか? そんな人が対象の記事です。
どうにかする方法はあります!! jvmの機能?にClass Reloadingを行うためのHot Swapという機能があるのでこちらを使うことでいちいちマイクラを再起動せずに済みます。
intellijIDEAでやっていきます。
内容の要約
デバックモードで実行して、コードを変更したらRecompileを実行するだけ
Hot Swapについて
ClassファイルをJVM実行状態で更新する方法です。
まずは簡単にただのHelloWorldでHot Swapしてみます。
// Main.java public class Main { public void hello() { System.out.println("Hello World"); } public static void main(String[] args) { System.out.println("First print here"); Main main = new Main(); for(int i=0;i<5;i++){ System.out.print(i + ": "); main.hello(); } System.out.println("Line that I do not modify"); } }
普通に実行すると
First print here 0: Hello World 1: Hello World 2: Hello World 3: Hello World 4: Hello World Line that I do not modify
次に11行目にブレークポイントを設置してデバック実行します。
途中まで実行してみましょう。
そのままの状態で、4行目のprint文を変更します
- System.out.println("Hello World"); + System.out.println("Hello Hot Swap");
ツールバーのBuild -> Recompile を選択するとclassがリロードされます。
そのままステップ実行をすすめてみます。
すると出力が変わりました!
実際にマイクラでやってみる
サンプルコード
https://github.com/sinshutu/MC-Modding-Hot-Swap-sample
上記のリポジトリをクローンしてintellijIDEAで開いてください。
先ほどと同様にデバック実行してください
コードの詳細は省きますが以下のようなコードが実装されています。
// src/main/java/com/sinshutu/example/CommonEvent.java import ... public class CommonEvent { public CommonEvent(){ MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void onEntityItemPickupEvent(EntityItemPickupEvent event) { String msg = "EntityItemPickupEvent"; event.getEntityPlayer().sendMessage(new TextComponentString(msg)); } }
アイテムを拾ったときに、メッセージを表示するようになっています。
メッセージを表示した後、msgを変更して Recompile をしてみましょう
- msg = "EntityItemPickupEvent" + msg = "Hot Swap"
上記と同様に class reload が行われれば成功しているはずです。
(伝わるのかこの画像・・・)
おわりに
細かい用語とかしっかり調べられていないので、間違っている場合などはご指摘ください。
マイクラの開発ノウハウまわりのTipsどっかにまとまってないのかな?と思う今日。
参照
- stackoverflow.com
- Reloading Classes - Help | IntelliJ IDEA
- How to Edit Minecraft Code (Full Tutorial - Running Minecraft in Debug mode) - YouTube の7:30付近
備考
実行環境
ArchLinux: 4.12.8-2-ARCH
JVM: 1.8
idea: 2017.2.2
forge: 1.12-14.21.1.2387