User Tools

Site Tools


zh_cn:tutorial:mixin_redirectors_methods

方法重定向

方法重定向器可以使用以下 注入点

  • INVOKE
  • INVOKE_STRING

INVOKE

INVOKE 注入点用于对 方法 中的 目标 的调用,这意味着它可以用于在一个方法调用之前进行重定向。

重定向一个静态方法

静态方法重定向器的参数应该与 目标 方法参数相同.

重定向在 SimpleInventory::readTags 中调用的 ItemStack::fromTag(ListTag) 使其返回 null

  1. @Mixin(SimpleInventory.class)
  2. abstract class SimpleInventoryMixin {
  3. @Redirect(method = "readTags",
  4. at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/item/ItemStack;fromTag(Lnet/minecraft/nbt/ListTag;)Lnet/minecraft/item/ItemStack;"))
  5. private static ItemStack returnNull(ListTag tag) {
  6. return null;
  7. }
  8. }

重定向一个实例方法

实例方法重定向器与静态方法重定向器类似,但他们的第一个参数总是表示调用其 目标 的对象。

重定向在 Entity::dropItem(ItemConvertible) 中调用的 Entity::dropItem(ItemConvertible, int) 在本应掉落钻石时,不掉落任何物品(空气):

  1. @Mixin(Entity.class)
  2. abstract class EntityMixin {
  3. @Redirect(method = "dropItem",
  4. at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;dropItem(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/entity/ItemEntity;"))
  5. private ItemEntity replaceDroppedItem(Entity droppingEntity, ItemConvertible item, int yOffset) {
  6. return droppingEntity.dropItem(item == Items.DIAMOND ? Items.AIR : item, yOffset);
  7. }
  8. }

INVOKE_STRING

INVOKE_STRING 注入点用于匹配只具有在 方法 调用中只具有单个字符串参数的 目标。待捕获的 字符串 内容应该在 At 中的 args 属性指定。

重定向 MinecraftClient::render 中调用的通过 Profiler::push 传递 “tick” 来修改上述调用中传递的 位置

  1. @Mixin(MinecraftClient.class)
  2. abstract class MinecraftClientMixin {
  3. @Redirect(method = "render",
  4. at = @At(value = "INVOKE_STRING",
  5. target = "Lnet/minecraft/util/profiler/Profiler;push(Ljava/lang/String;)V",
  6. args = "ldc=tick"))
  7. private void redirectPush(Profiler profiler, String location) {
  8. profiler.push("modified tick");
  9. System.out.println(location);
  10. }
  11. }
zh_cn/tutorial/mixin_redirectors_methods.txt · Last modified: 2021/08/29 03:37 by hendrix-shen