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指定したメソッドの最後の
INVOKE_ASSIGN
FIELD
NEW
INVOKE_STRING
TAIL指定したメソッドの最後の
return
の直前で実行INVOKEINVOKE_ASSIGN
FIELD
NEW
INVOKE_STRING
INVOKE
とほぼ同じCONSTANT最后
忘れないようにメモの感覚で残しています。間違っていたところがあれば指摘していただけると助かります。
请参照以下内容。
请参考以下内容。
请参考以下内容。
请参考以下内容。
海绵动力维基百科