tutorial:mixin_injects
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
tutorial:mixin_injects [2022/03/08 18:56] – Added interface inection section. salvopelux | tutorial:mixin_injects [2022/08/05 14:11] – Renamed output type and input type to return type and parameter type, and fixed a typo clomclem | ||
---|---|---|---|
Line 5: | Line 5: | ||
<code java> | <code java> | ||
- | @Inject(method = "", | + | @Inject(method = "METHODNAME", at = @At(" |
private void injectMethod(METHOD ARGS, CallbackInfo info) { | private void injectMethod(METHOD ARGS, CallbackInfo info) { | ||
Line 35: | Line 35: | ||
| [ | reference | one array dimension | | | [ | reference | one array dimension | | ||
- | A method descriptor is comprised of the method name, followed by a set of parentheses containing the input types, followed by the output | + | A method descriptor is comprised of the method name, followed by a set of parentheses containing the parameter |
- | Generics' | + | In the case that the return type is void, you need to use V (Void Descriptor Type) as the type (for example, |
- | //@Inject// methods always have a void return type. The method name does not matter; using something that describes what the inject does is best. The target method' | + | Generics' |
+ | |||
+ | //@Inject// methods always have a void return type. The method name does not matter | ||
=== Returning & Cancelling from Inject === | === Returning & Cancelling from Inject === | ||
Line 67: | Line 69: | ||
For more information on this particular example, view its usage in the [[https:// | For more information on this particular example, view its usage in the [[https:// | ||
- | |||
- | ====== Inject an interface ====== | ||
- | |||
- | This is a new tecnique introduced by Loom 0.11 to add methods into a specific existing class. | ||
- | More specifically, | ||
- | As result the target class will acquire all the methods of the interface, as if it always had them. | ||
- | Interface injection is a compile time only feature, this means that a Mixin should also be used to implement the interface into the target class. | ||
- | |||
- | This is particulatly useful for libraries, with this you can add new methods to existing classes and use them without the need of casting or reimplementing the interface every time. | ||
- | |||
- | Let's explain better with an example: | ||
- | |||
- | The scope of this example is to add the following method into FlowableFluid to get the sound of the bucket when emptied. | ||
- | This, normally, is not possible because FlowableFluid does not has a similar method. | ||
- | |||
- | <code java [enable_line_numbers=" | ||
- | Optional< | ||
- | </ | ||
- | |||
- | To add the method into the class, first of all you need to create an interface with it: | ||
- | |||
- | <code java [enable_line_numbers=" | ||
- | package net.fabricmc.example; | ||
- | |||
- | public interface BucketEmptySoundGetter { | ||
- | Optional< | ||
- | } | ||
- | </ | ||
- | |||
- | Now you need to implement this interface into FlowableFluid with a mixin implementing the interface: | ||
- | |||
- | <code java [enable_line_numbers=" | ||
- | @Mixin(FlowableFluid.class) | ||
- | public class MixinFlowableFluid implements BucketEmptySoundGetter { | ||
- | @Override | ||
- | public Optional< | ||
- | |||
- | return Optional.of(((FlowableFluid) (Object) this).isIn(FluidTags.LAVA) ? SoundEvents.ITEM_BUCKET_EMPTY_LAVA : SoundEvents.ITEM_BUCKET_EMPTY); | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | Lastly you need to inject the interface into FabricFluid. | ||
- | The following snippet can be added to your fabric.mod.json file to add one or more interfaces to the net/ | ||
- | |||
- | <code json [enable_line_numbers=" | ||
- | { | ||
- | " | ||
- | " | ||
- | " | ||
- | } | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | Now you can use the new method: | ||
- | |||
- | <code java [enable_line_numbers=" | ||
- | Optional< | ||
- | </ | ||
- | |||
- | You could also override this method in classes extending FlowableFluid to implement custom behaviours. |
tutorial/mixin_injects.txt · Last modified: 2022/08/05 19:19 by clomclem