Skip to content

@ModifyVariable

@ModifyVariable 注解用于修改方法中的局部变量。

属性

method

method 属性指定了包含要修改局部变量的方法。

at

at 属性使用 @At 注解来指定在何处修改变量。

index / ordinal

你可以使用 index (或 ldc / var / arg) 或 ordinal 来指定要修改的变量。

  • index: 局部变量表中的索引。
  • ordinal: 如果有多个相同类型的变量,ordinal 用于选择第几个(从0开始)。

name

你也可以通过 name 属性来指定变量名。这通常比使用索引更清晰。

用法

@ModifyVariable 注解的方法应该返回与要修改的变量相同的类型,并接受一个同类型的参数(原始变量值)。

示例:

假设目标方法如下:

java
public void applyDamage(int damage) {
    int finalDamage = damage * 2;
    // ... deal finalDamage
}

我们可以修改 finalDamage 变量:

java
@Mixin(Example.class)
public class ExampleMixin {
    @ModifyVariable(
        method = "applyDamage",
        at = @At("STORE"), // after the variable is stored
        name = "finalDamage"
    )
    private int modifyFinalDamage(int originalDamage) {
        return originalDamage / 2;
    }
}

@At("STORE") 表示在变量被赋值后立即修改它。在这个例子中,finalDamage 的值将从 damage * 2 变为 (damage * 2) / 2,也就是 damage

修改方法参数

@ModifyVariable 也可以用来修改方法的参数,因为它们也被看作是局部变量。

示例:

java
@Mixin(Example.class)
public class ExampleMixin {
    @ModifyVariable(
        method = "applyDamage",
        at = @At("HEAD"),
        argsOnly = true // only look at arguments
    )
    private int modifyDamageArgument(int damage) {
        return 0; // Negate all damage
    }
}

这里 argsOnly = true 是一个好习惯,它告诉 Mixin 只在方法的参数中查找要修改的变量。at = @At("HEAD") 表示在方法开始时就修改参数。