tutorial:mixin_accessors
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tutorial:mixin_accessors [2025/10/16 16:46] – Rename to Accessor Mixins - Add preamble bawnorton | tutorial:mixin_accessors [2025/11/30 20:08] (current) – gauntrecluse | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Accessor Mixins ====== | ====== Accessor Mixins ====== | ||
| - | FIXME //This page is under revison. This page may change suddenly and should be taken with a grain of salt.// | ||
| **Accessor Mixins** are special mixins defined as interfaces which must **only** contain '' | **Accessor Mixins** are special mixins defined as interfaces which must **only** contain '' | ||
| Line 8: | 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. | ||
| - | '' | + | '' |
| + | 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 ===== | ||
| - | '' | + | '' |
| ==== Getting a value from the field ==== | ==== Getting a value from the field ==== | ||
| - | <code java> | + | <yarncode |
| - | @Mixin(MinecraftClient.class) | + | @Mixin(class_310.class) |
| - | public interface | + | public interface |
| - | @Accessor(" | + | @Accessor(" |
| int modid$getItemUseCooldown(); | int modid$getItemUseCooldown(); | ||
| } | } | ||
| - | </code> | + | </yarncode> |
| Usage: | Usage: | ||
| - | <code java> | + | <yarncode |
| - | int itemUseCooldown | + | int field_1752 |
| - | </code> | + | </yarncode> |
| ==== Setting a value to the field ==== | ==== Setting a value to the field ==== | ||
| - | <code java> | + | <yarncode |
| - | @Mixin(MinecraftClient.class) | + | @Mixin(class_310.class) |
| - | public interface | + | public interface |
| - | @Accessor(" | + | @Accessor(" |
| - | void modid$setItemUseCooldown(int | + | void modid$setItemUseCooldown(int |
| } | } | ||
| - | </code> | + | </yarncode> |
| Usage: | Usage: | ||
| - | <code java> | + | <yarncode |
| - | ((MinecraftClientAccessor) MinecraftClient.getInstance()).modid$setItemUseCooldown(100); | + | ((class_310Accessor) class_310.method_1551()).modid$setItemUseCooldown(100); |
| - | </code> | + | </yarncode> |
| When the field is final and you need to set it, use '' | When the field is final and you need to set it, use '' | ||
| ===== Accessor for static fields ===== | ===== Accessor for static fields ===== | ||
| - | Suppose we want to access '' | + | FIXME // |
| + | Suppose we want to access | ||
| ==== Getting a value from the field ==== | ==== Getting a value from the field ==== | ||
| Line 53: | Line 54: | ||
| public interface VanillaLayeredBiomeSourceAccessor { | public interface VanillaLayeredBiomeSourceAccessor { | ||
| @Accessor(" | @Accessor(" | ||
| - | static List< | + | static List< |
| throw new AssertionError(); | throw new AssertionError(); | ||
| } | } | ||
| Line 62: | Line 63: | ||
| <code java> | <code java> | ||
| - | List< | + | List< |
| </ | </ | ||
| Line 70: | Line 71: | ||
| public interface VanillaLayeredBiomeSourceAccessor { | public interface VanillaLayeredBiomeSourceAccessor { | ||
| @Accessor(" | @Accessor(" | ||
| - | static void modid$setBiomes(List< | + | static void setBiomes(List< |
| throw new AssertionError(); | throw new AssertionError(); | ||
| } | } | ||
| Line 79: | Line 80: | ||
| <code java> | <code java> | ||
| - | VanillaLayeredBiomeSourceAccessor.modid$setBiomes(biomes); | + | VanillaLayeredBiomeSourceAccessor.setBiomes(biomes); |
| </ | </ | ||
| Line 85: | Line 86: | ||
| ===== Invoker ===== | ===== Invoker ===== | ||
| - | '' | + | '' |
| - | <code java> | + | <yarncode |
| - | @Mixin(EndermanEntity.class) | + | @Mixin(class_1560.class) |
| - | public interface | + | public interface |
| - | @Invoker(" | + | @Invoker(" |
| boolean modid$invokeTeleportTo(double x, double y, double z); | boolean modid$invokeTeleportTo(double x, double y, double z); | ||
| } | } | ||
| - | </code> | + | </yarncode> |
| Usage: | Usage: | ||
| - | <code java> | + | <yarncode |
| - | EndermanEntity | + | class_1560 |
| - | ((EndermanEntityInvoker) enderman).modid$invokeTeleportTo(0.0D, | + | ((class_1560Invoker) enderman).modid$invokeTeleportTo(0.0D, |
| - | </code> | + | </yarncode> |
| ===== Invoker for static methods ===== | ===== Invoker for static methods ===== | ||
| + | FIXME //This example is not fully accurate to latest versions, '' | ||
| Suppose we want to invoke '' | Suppose we want to invoke '' | ||
| <code java> | <code java> | ||
| @Mixin(BrewingRecipeRegistry.class) | @Mixin(BrewingRecipeRegistry.class) | ||
| - | public interface | + | public interface |
| @Invoker(" | @Invoker(" | ||
| - | static void modid$invokeRegisterPotionType(Item item) { | + | static void invokeRegisterPotionType(Item item) { |
| throw new AssertionError(); | throw new AssertionError(); | ||
| } | } | ||
| Line 118: | Line 120: | ||
| <code java> | <code java> | ||
| - | BrewingRecipeRegistryInvoker.modid$invokeRegisterPotionType(item); | + | BrewingRecipeRegistryAccessor.invokeRegisterPotionType(item); |
| + | </ | ||
| + | |||
| + | ==== Invoker for constructors ==== | ||
| + | |||
| + | Invokers for constructors must be static, pass ''"< | ||
| + | |||
| + | For example, we will use the '' | ||
| + | <code java> | ||
| + | @Mixin(Identifier.class) | ||
| + | public interface IdentifierAccessor { | ||
| + | @Invoker("< | ||
| + | static Identifier newIdentifier(String namespace, String path) { | ||
| + | throw new AssertionError(); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Usage: | ||
| + | <code java> | ||
| + | Identifier exampleVariable = IdentifierAccessor.newIdentifier(" | ||
| </ | </ | ||
tutorial/mixin_accessors.1760633163.txt.gz · Last modified: 2025/10/16 16:46 by bawnorton