Table of Contents

Аксессоры(Получение доступа)

Аксессоры Миксина позволяют вам получать доступ к полям и методам, которые не являются видимыми (частными) или финальными.

@Accessor

@Accessor позволяет вам получать доступ к полям. Предположим, мы хотим получить доступ к полю itemUseCooldown класса MinecraftClient.

Получение значения из поля

@Mixin(MinecraftClient.class)
public interface MinecraftClientAccessor {
    @Accessor
    int getItemUseCooldown();
}

Использование:

int itemUseCooldown = ((MinecraftClientAccessor) MinecraftClient.getInstance()).getItemUseCooldown();

Установка значения в поле

@Mixin(MinecraftClient.class)
public interface MinecraftClientAccessor {
    @Accessor("itemUseCooldown")
    public void setItemUseCooldown(int itemUseCooldown);
}

Использование:

((MinecraftClientAccessor) MinecraftClient.getInstance()).setItemUseCooldown(100);

Аксессоры для статических полей

Предположим, мы хотим получить доступ к полю BIOMES класса VanillaLayeredBiomeSource.

Получение значения из поля

@Mixin(VanillaLayeredBiomeSource.class)
public interface VanillaLayeredBiomeSourceAccessor {
  @Accessor("BIOMES")
  public static List<RegistryKey<Biome>> getBiomes() {
    throw new AssertionError();
  }
}

Использование:

List<RegistryKey<Biome>> biomes = VanillaLayeredBiomeSourceAccessor.getBiomes();

Установка значения в поле

@Mixin(VanillaLayeredBiomeSource.class)
public interface VanillaLayeredBiomeSourceAccessor {
  @Accessor("BIOMES")
  public static void setBiomes(List<RegistryKey<Biome>> biomes) {
    throw new AssertionError();
  }
}

Использование:

VanillaLayeredBiomeSourceAccessor.setBiomes(biomes);

Инвокеры(Вызыватели)

@Invoker позволяет вам получать доступ к методам. Предположим, мы хотим вызвать метод teleportTo класса EndermanEntity.

@Mixin(EndermanEntity.class)
public interface EndermanEntityInvoker {
  @Invoker("teleportTo")
  public boolean invokeTeleportTo(double x, double y, double z);
}

Использование:

EndermanEntity enderman = ...;
((EndermanEntityInvoker) enderman).invokeTeleportTo(0.0D, 70.0D, 0.0D);

Инвокеры для статических методов

Предположим, мы хотим вызвать метод registerPotionType класса BrewingRecipeRegistry.

@Mixin(BrewingRecipeRegistry.class)
public interface BrewingRecipeRegistryInvoker {
  @Invoker("registerPotionType")
  public static void invokeRegisterPotionType(Item item) {
    throw new AssertionError();
  }
}

Использование:

BrewingRecipeRegistryInvoker.invokeRegisterPotionType(item);