====== Перенаправления методов ======
Редиректоры методов могут использовать [[https://github.com/SpongePowered/Mixin/wiki/Injection-Point-Reference|Точки внедрения]]:
* ''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)'' делает так, что при выкидывании алмазы будут заменяться на воздух:
@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" используется для сопоставления вызовов "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"))
private void redirectPush(Profiler profiler, String location) {
profiler.push("modified tick");
System.out.println(location);
}
}