Mixin¶
MinecraftまたはMODのコードを一部改変できる仕組みです。
概要¶
実際に何ができるかコードで解説します。
Mixinの対象クラス
SomethingLogic.java
public class SomethingLogic {
public void process() {
System.out.println("Proceed");
}
}
Mixinクラス
MixinSomethingLogic.java
// リマッピングオフでSomethingLogicにMixin
@Mixin(value = SomethingLogic.class, remap = false)
public class MixinSomethingLogic {
// メソッドの最初に注入
@Inject(method = "process()V", at = @At("HEAD"))
private void onProcess(CallbackInfo ci) {
System.out.println("Injected");
}
}
このMixinがSomethingLogicに適用されると、概念的には1以下のようになります。
SomethingLogic(Injected).java
public class SomethingLogic {
public void process() {
onProcess(new CallbackInfo(...))
System.out.println("Proceed");
}
private void onProcess(CallbackInfo ci) {
System.out.println("Injected");
}
}
Mixinセットアップ¶
以下をbuild.gradleの冒頭に追加。
build.gradle
buildscript {
repositories {
maven { url = 'https://repo.spongepowered.org/repository/maven-public/' }
mavenCentral()
}
dependencies {
classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT'
}
}
以下を plugins {} ブロックの下に追加。
以下をbuild.gradleのdependencies {}ブロックの下に追加。
以下をsrc/main/resources/<modid>.mixins.jsonに
{
"required": true,
"minVersion": "0.8",
"package": "<groupId>.mixin",
"compatibilityLevel": "JAVA_17",
"refmap": "<modid>.refmap.json",
"mixins": [],
"client": [],
"server": [],
"injectors": {
"defaultRequire": 1
}
}
<modid>や<groupID>は適切なものに置き換えてください。
compatibilityLevelはJDKバージョンに合わせましょう。(例は1.20.1)
次に、build.gradleのminecraft {}ブロックの下に以下を追加。
${mod_id}はそのままで大丈夫です
Mixinの使い方¶
実践的なコードですが、以下が参考になるかと思います。
Mixinクラスの書き方¶
クラスの前に@Mixinを付けることでMixinクラスとなります。
その後、src/main/resources/<modid>.mixins.json にクラスを追加しなければいけません。
Warning
サーバー側ではクライアントクラスが読み込まれないので、クライアントとサーバーのMixinを分ける必要があります。
mixins: クライアントとサーバー両方client: クライアントのみserver: サーバーのみ
それぞれのMixinに対応する場所にクラスを指定する必要があります。
クラスの指定は、<modid>.mixins.jsonで指定した"package"で指定したパッケージからの相対的な場所を指定します。
この例では以下のようになります
{
"package": "io.github.toapuro.example.mixins",
"mixins": [
"ExampleMixin"
],
"client": [],
"server": []
}
-
実際はonProcessのメソッド名やアノテーションなどが異なる。 ↩