Table of Contents
Перенаправления методов
Редиректоры методов могут использовать Точки внедрения:
INVOKE
INVOKE_STRING
.
INVOKE
Точка внедрения INVOKE
используется для вызовов “target” в “method”, что означает, что его можно использовать для перенаправления метода непосредственно перед его вызовом.
Перенаправление статического метода
Редиректоры статических методов должен иметь те же параметры, что и target
.
Перенаправление вызова ItemStack::fromTag(ListTag)
в SimpleInventory::readTags
возращает 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, int)
в Entity::dropItem(ItemConvertible)
делает так, что при выкидывании алмазы будут заменяться на воздух:
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;")) return droppingEntity.dropItem(item == Items.DIAMOND ? Items.AIR : item, yOffset); } }
INVOKE_STRING
Точка внедрения “INVOKE_STRING” используется для сопоставления вызовов “target” в “method”, если “target” является методом с одним параметром “String” и ему передается литерал “String”. Литерал “String” для захвата должен быть указан в свойстве “args” для “At”.
Перенаправление вызова Profiler::push
с помощью “tick”
, переданного ему в MinecraftClient::render
изменяет location
, переданное в указанном вызове:
@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")) profiler.push("modified tick"); } }