sinshutu_kibotuの日記

大体、大抵、大半、備忘録

マイクラMOD開発でマイクラを再起動させなくても変更を反映させる方法

はじめに

マイクラの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行目にブレークポイントを設置してデバック実行します。

途中まで実行してみましょう。

f:id:sinshutu_kibotu:20170821065226p:plain

そのままの状態で、4行目のprint文を変更します

-        System.out.println("Hello World");
+        System.out.println("Hello Hot Swap");

ツールバーのBuild -> Recompile を選択するとclassがリロードされます。

f:id:sinshutu_kibotu:20170821065922p:plain

そのままステップ実行をすすめてみます。

f:id:sinshutu_kibotu:20170821070056p:plain

すると出力が変わりました!

実際にマイクラでやってみる

サンプルコード

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 が行われれば成功しているはずです。

f:id:sinshutu_kibotu:20170821092052p:plain (伝わるのかこの画像・・・)

おわりに

細かい用語とかしっかり調べられていないので、間違っている場合などはご指摘ください。

マイクラの開発ノウハウまわりのTipsどっかにまとまってないのかな?と思う今日。

参照

備考

実行環境

ArchLinux: 4.12.8-2-ARCH

JVM: 1.8

idea: 2017.2.2

forge: 1.12-14.21.1.2387