Skip to content

Mixin

MinecraftまたはMODのコードを一部改変できる仕組み。

概要

実際に何ができるかコードで解説します。

対象クラス

SomethingLogic.java
class SomethingLogic {
    public void process() {
        System.out.println("Proceed");
    }
}
Mixinサイド
MixinSomethingLogic.java
@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
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
apply plugin: 'org.spongepowered.mixin'

以下をsrc/main/resources/$(modid).mixins.json

$(modid).mixins.json
{
  "required": true,
  "minVersion": "0.8",
  "package": "$(groupId).mixin",
  "compatibilityLevel": "JAVA_17",
  "mixins": [],
  "client": [],
  "server": [],
  "injectors": {
    "defaultRequire": 1
  }
}
$(modid)はModのIDに置き換え、 $(groupId)は実際のグループIDに置き換えてください。

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

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

    config "${mod_id}.mixins.json"
}


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