User Tools

Site Tools


tutorial:mixin_accessors

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
tutorial:mixin_accessors [2020/08/05 22:26] – created emmanuelmesstutorial:mixin_accessors [2022/04/29 09:54] (current) – [Mixin Accessors] solidblock
Line 1: Line 1:
-====== Mixin Accessors ======+====== Mixin Accessors & Invokers ====== 
 +Mixin accessors and invokers allow you to access fields or invoke methods that are not visible (private) or final.
  
-===== Introduction =====+===== Accessor ===== 
 +''@Accessor'' allows you to access fields. Suppose we want to access ''itemUseCooldown'' field of ''MinecraftClient'' class.
  
-A type of mixin allows to you to access variables that are not visible (private) or final:+==== Getting a value from the field ====
 <code java> <code java>
-@Mixin(StructuresConfig.class) +@Mixin(MinecraftClient.class) 
-public interface StructuresConfigAccessor +public interface MinecraftClientAccessor 
-    @Accessor("DEFAULT_STRUCTURES") +    @Accessor 
-    public static void setDefaultStructures(ImmutableMap<StructureFeature<?>, StructureConfig> defaultStructures) { +    int getItemUseCooldown();
-        throw new IllegalAccessError(); +
-    }+
 } }
 </code> </code>
-The error will never be thrown, you can use the function. 
  
 +Usage:
  
 +<code java>
 +int itemUseCooldown = ((MinecraftClientAccessor) MinecraftClient.getInstance()).getItemUseCooldown();
 +</code>
 +
 +==== Setting a value to the field ====
 +<code java>
 +@Mixin(MinecraftClient.class)
 +public interface MinecraftClientAccessor {
 +    @Accessor("itemUseCooldown")
 +    public void setItemUseCooldown(int itemUseCooldown);
 +}
 +</code>
 +
 +Usage:
 +
 +<code java>
 +((MinecraftClientAccessor) MinecraftClient.getInstance()).setItemUseCooldown(100);
 +</code>
 +
 +===== Accessor for static fields =====
 +Suppose we want to access ''BIOMES'' field of ''VanillaLayeredBiomeSource'' class.
 +
 +==== Getting a value from the field ====
 +<code java>
 +@Mixin(VanillaLayeredBiomeSource.class)
 +public interface VanillaLayeredBiomeSourceAccessor {
 +  @Accessor("BIOMES")
 +  public static List<RegistryKey<Biome>> getBiomes() {
 +    throw new AssertionError();
 +  }
 +}
 +</code>
 +
 +Usage:
 +
 +<code java>
 +List<RegistryKey<Biome>> biomes = VanillaLayeredBiomeSourceAccessor.getBiomes();
 +</code>
 +
 +==== Setting a value to the field ====
 +<code java>
 +@Mixin(VanillaLayeredBiomeSource.class)
 +public interface VanillaLayeredBiomeSourceAccessor {
 +  @Accessor("BIOMES")
 +  public static void setBiomes(List<RegistryKey<Biome>> biomes) {
 +    throw new AssertionError();
 +  }
 +}
 +</code>
 +
 +Usage:
 +
 +<code java>
 +VanillaLayeredBiomeSourceAccessor.setBiomes(biomes);
 +</code>
 +
 +===== Invoker =====
 +''@Invoker'' allows you to access methods. Suppose we want to invoke ''teleportTo'' method of ''EndermanEntity'' class.
 +
 +<code java>
 +@Mixin(EndermanEntity.class)
 +public interface EndermanEntityInvoker {
 +  @Invoker("teleportTo")
 +  public boolean invokeTeleportTo(double x, double y, double z);
 +}
 +</code>
 +
 +Usage:
 +
 +<code java>
 +EndermanEntity enderman = ...;
 +((EndermanEntityInvoker) enderman).invokeTeleportTo(0.0D, 70.0D, 0.0D);
 +</code>
 +
 +===== Invoker for static methods =====
 +Suppose we want to invoke ''registerPotionType'' method of ''BrewingRecipeRegistry'' class.
 +
 +<code java>
 +@Mixin(BrewingRecipeRegistry.class)
 +public interface BrewingRecipeRegistryInvoker {
 +  @Invoker("registerPotionType")
 +  public static void invokeRegisterPotionType(Item item) {
 +    throw new AssertionError();
 +  }
 +}
 +</code>
 +
 +Usage:
 +
 +<code java>
 +BrewingRecipeRegistryInvoker.invokeRegisterPotionType(item);
 +</code>
tutorial/mixin_accessors.1596666389.txt.gz · Last modified: 2020/08/05 22:26 by emmanuelmess