Skip to content

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
plugins {
    ...
}
+ apply plugin: 'org.spongepowered.mixin'

以下をbuild.gradledependencies {}ブロックの下に追加。

build.gradle
dependencies {
+    annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
}

以下をsrc/main/resources/<modid>.mixins.json

.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.gradleminecraft {}ブロックの下に以下を追加。

mixin {
    add sourceSets.main, "${mod_id}.refmap.json"

    config "${mod_id}.mixins.json"
}
${mod_id}はそのままで大丈夫です

Mixinの使い方

実践的なコードですが、以下が参考になるかと思います。

Mixin Examples - Fabric Wiki

Mixinクラスの書き方

クラスの前に@Mixinを付けることでMixinクラスとなります。

@Mixin(Example.class)
public class ExampleMixin {
}

その後、src/main/resources/<modid>.mixins.json にクラスを追加しなければいけません。

Warning

サーバー側ではクライアントクラスが読み込まれないので、クライアントとサーバーのMixinを分ける必要があります。

  • mixins: クライアントとサーバー両方
  • client: クライアントのみ
  • server: サーバーのみ

それぞれのMixinに対応する場所にクラスを指定する必要があります。

クラスの指定は、<modid>.mixins.jsonで指定した"package"で指定したパッケージからの相対的な場所を指定します。

package io.github.toapuro.example.mixins;

@Mixin(Example.class)
public class ExampleMixin {
}

この例では以下のようになります

.mixins.json
{
    "package": "io.github.toapuro.example.mixins",
    "mixins": [
        "ExampleMixin"
    ],
    "client": [],
    "server": []
}


  1. 実際はonProcessのメソッド名やアノテーションなどが異なる。