====== 方法重定向 ====== 方法重定向器可以使用以下 [[https://github.com/SpongePowered/Mixin/wiki/Injection-Point-Reference|注入点]]: * ''INVOKE'' * ''INVOKE_STRING'' ===== INVOKE ===== ''INVOKE'' 注入点用于对 ''方法'' 中的 ''目标'' 的调用,这意味着它可以用于在一个方法调用之前进行重定向。 ==== 重定向一个静态方法 ==== 静态方法重定向器的参数应该与 ''目标'' 方法参数相同. 重定向在 ''SimpleInventory::readTags'' 中调用的 ''ItemStack::fromTag(ListTag)'' 使其返回 ''null'': @Mixin(SimpleInventory.class) abstract class SimpleInventoryMixin { @Redirect(method = "readTags", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/item/ItemStack;fromTag(Lnet/minecraft/nbt/ListTag;)Lnet/minecraft/item/ItemStack;")) private static ItemStack returnNull(ListTag tag) { return null; } } ==== 重定向一个实例方法 ==== 实例方法重定向器与静态方法重定向器类似,但他们的第一个参数总是表示调用其 ''目标'' 的对象。 重定向在 ''Entity::dropItem(ItemConvertible)'' 中调用的 ''Entity::dropItem(ItemConvertible, int)'' 在本应掉落钻石时,不掉落任何物品(空气): @Mixin(Entity.class) abstract class EntityMixin { @Redirect(method = "dropItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;dropItem(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/entity/ItemEntity;")) private ItemEntity replaceDroppedItem(Entity droppingEntity, ItemConvertible item, int yOffset) { return droppingEntity.dropItem(item == Items.DIAMOND ? Items.AIR : item, yOffset); } } ===== INVOKE_STRING ===== ''INVOKE_STRING'' 注入点用于匹配只具有在 ''方法'' 调用中只具有单个字符串参数的 ''目标''。待捕获的 ''字符串'' 内容应该在 ''At'' 中的 ''args'' 属性指定。 重定向 ''MinecraftClient::render'' 中调用的通过 ''Profiler::push'' 传递 ''"tick"'' 来修改上述调用中传递的 ''位置'' @Mixin(MinecraftClient.class) abstract class MinecraftClientMixin { @Redirect(method = "render", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;push(Ljava/lang/String;)V", args = "ldc=tick")) private void redirectPush(Profiler profiler, String location) { profiler.push("modified tick"); System.out.println(location); } }