Minecraft modding 使用 Mixin 的方法

Mixin是什么

Mixin是SpongePowered开发的一种能够动态修改现有源代码的工具。

这个功能是在20年份的forge更新之后加入的。

简单的使用方法

package examplemod;

import net.minecraft.client.player.LocalPlayer;
import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(LocalPlayer.class)
public class LocalPlayerMixin {
    @Shadow @Final public static Logger LOGGER;

    @Inject(method = "getPermissionLevel", at = @At(value = "HEAD"))
    public void getPermissionLevelMixin(CallbackInfoReturnable<Integer> cir) {
        LOGGER.info("INJECT TO HEAD @ `getPermissionLevel`");
    }
}

@Mixin- 注解

@Mixin(目标类.class)

在value中放置一个包含要插入的方法的类(本文中称为目标类)。

@影子

“在目标类中,需要具有相同名称的字段” – @Shadow

在LocalPlayer类中的第一行中

(Note: The given statement is written in Japanese, not English. My response is based on the assumption that you want a paraphrase in Chinese.)

public static final Logger LOGGER = LogUtils.getLogger();

由于已经有了定义,为了使用它,我们要放置一个Shadow注释。

最终

@Final: 只有在字段上标有final时才能找到

先前的LOGGER字段被标记为final,这意味着目标类也被标记为final。

@注入

@Inject(method = “方法名”, at = @At(value = “插入位置”)):这个mixin的精华

然而,指定有点困难。

方法名称:所需插入方法的名称。本次使用LocalPlayer#getPermissionLevel()。

插入位置:(对于空白部分,我并不是很清楚)

value自分の認識HEADメソッドの一番初めに実行RETURN
TAIL指定したメソッドの最後のreturnの直前で実行INVOKE
INVOKE_ASSIGN
FIELD
NEW
INVOKE_STRINGINVOKE とほぼ同じCONSTANT

最后

忘れないようにメモの感覚で残しています。間違っていたところがあれば指摘していただけると助かります。

请参照以下内容。

请参考以下内容。

请参考以下内容。

请参考以下内容。

海绵动力维基百科