User Tools

Site Tools


tutorial:mixin_accessors

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:mixin_accessors [2025/11/30 16:54] – Added section on Invokers for constructors. gauntreclusetutorial:mixin_accessors [2025/11/30 20:08] (current) gauntrecluse
Line 7: Line 7:
 Unlike typical injectors, accessors do not prefix the merged methods with the modid of the mod that contains them. Additionally as the **Accessor Mixins** are used in user code, the names of the handlers are not mangled, these differences are important to keep in mind when writing **Accessor Mixins** for compatibility and debugging purposes. Unlike typical injectors, accessors do not prefix the merged methods with the modid of the mod that contains them. Additionally as the **Accessor Mixins** are used in user code, the names of the handlers are not mangled, these differences are important to keep in mind when writing **Accessor Mixins** for compatibility and debugging purposes.
  
-''@Accessor''s and ''@Invoker''s can infer the field/method name if they are called ''getFieldName'' / ''call/invokeMethodName'', omitting the requirement for the ''value'' attribute to be specified, however, all handlers should be prefixed as so: ''modid$getFieldName'' instead. This is because when the **Accessor Mixin** is merged the handler will remain unchanged and if there is a problem related to the handler, it's useful to know who owns it. Additionally, if another mod decides to create a Duck interface with a method called ''getFieldName'', when that is merged alongside your **Accessor Mixin** whichever one applies last will overwrite the other and you end up with a conflict that may crash or cause unintended behaviour.+''@Accessor''s and ''@Invoker''s can infer the field/method name if they are called ''getFieldName'' / ''call/invokeMethodName'', omitting the requirement for the ''value'' attribute to be specified, however, all non-static handlers should be prefixed as so: ''modid$getFieldName'' instead. This is because when the **Accessor Mixin** is merged the handler will remain unchanged and if there is a problem related to the handler, it's useful to know who owns it. Additionally, if another mod decides to create a Duck interface with a method called ''getFieldName'', when that is merged alongside your **Accessor Mixin** whichever one applies last will overwrite the other and you end up with a conflict that may crash or cause unintended behaviour.\\ 
 +Prefixing accessor or invoker handlers is not necessary if they are static, as those may not conflict, and the stacktrace provides the Mixin class whose handlers are involved in errors, thus making it sufficient without needing to prefix with the modid.
  
 ===== Accessor ===== ===== Accessor =====
Line 53: Line 54:
 public interface VanillaLayeredBiomeSourceAccessor { public interface VanillaLayeredBiomeSourceAccessor {
   @Accessor("BIOMES")   @Accessor("BIOMES")
-  static List<RegistryKey<Biome>> modid$getBiomes() {+  static List<RegistryKey<Biome>> getBiomes() {
     throw new AssertionError();     throw new AssertionError();
   }   }
Line 62: Line 63:
  
 <code java> <code java>
-List<RegistryKey<Biome>> biomes = VanillaLayeredBiomeSourceAccessor.modid$getBiomes();+List<RegistryKey<Biome>> biomes = VanillaLayeredBiomeSourceAccessor.getBiomes();
 </code> </code>
  
Line 70: Line 71:
 public interface VanillaLayeredBiomeSourceAccessor { public interface VanillaLayeredBiomeSourceAccessor {
   @Accessor("BIOMES")   @Accessor("BIOMES")
-  static void modid$setBiomes(List<RegistryKey<Biome>> biomes) {+  static void setBiomes(List<RegistryKey<Biome>> biomes) {
     throw new AssertionError();     throw new AssertionError();
   }   }
Line 79: Line 80:
  
 <code java> <code java>
-VanillaLayeredBiomeSourceAccessor.modid$setBiomes(biomes);+VanillaLayeredBiomeSourceAccessor.setBiomes(biomes);
 </code> </code>
  
Line 108: Line 109:
 <code java> <code java>
 @Mixin(BrewingRecipeRegistry.class) @Mixin(BrewingRecipeRegistry.class)
-public interface BrewingRecipeRegistryInvoker {+public interface BrewingRecipeRegistryAccessor {
   @Invoker("registerPotionType")   @Invoker("registerPotionType")
-  static void modid$invokeRegisterPotionType(Item item) {+  static void invokeRegisterPotionType(Item item) {
     throw new AssertionError();     throw new AssertionError();
   }   }
Line 119: Line 120:
  
 <code java> <code java>
-BrewingRecipeRegistryInvoker.modid$invokeRegisterPotionType(item);+BrewingRecipeRegistryAccessor.invokeRegisterPotionType(item);
 </code> </code>
  
Line 129: Line 130:
 <code java> <code java>
 @Mixin(Identifier.class) @Mixin(Identifier.class)
-public interface IdentifierInvoker {+public interface IdentifierAccessor {
     @Invoker("<init>")     @Invoker("<init>")
-    static Identifier modid$invokeConstructor(String namespace, String path) {+    static Identifier newIdentifier(String namespace, String path) {
         throw new AssertionError();         throw new AssertionError();
     }     }
Line 139: Line 140:
 Usage: Usage:
 <code java> <code java>
-Identifier exampleVariable = IdentifierInvoker.modid$invokeConstructor("some_namespace", "some_path");+Identifier exampleVariable = IdentifierAccessor.newIdentifier("some_namespace", "some_path");
 </code> </code>
tutorial/mixin_accessors.1764521679.txt.gz · Last modified: 2025/11/30 16:54 by gauntrecluse