-
-
Notifications
You must be signed in to change notification settings - Fork 214
Description
Hello,
i'm developing a fabric mod using the sponge mixins where i need to to invoke a private method from within a mixin.
I created an interface with the method signatures i want to call from the target class. It look like the following:
@Mixin(Screen.class)
public interface IScreen {
@Invoker(remap = true)
<T extends Drawable> T callAddDrawable(T drawable);
@Invoker(remap = true)
<T extends Element & Selectable> T callAddSelectableChild(T child);
}
Now in my implementing (abstract) screen mixin, i can call the "callAddDrawable" method and it works great.
However, calling the "callAddSelectableChild" the same way does ONLY work in dev (gradle runClient) and not if i build the mod and run it with the fabric loader.
I get the following exception:
Mixin apply failed mymod.mixins.json:IScreen -> net.minecraft.class_437: org.spongepowered.asm.mixin.gen.throwables.InvalidAccessorException No candidates were found matching addSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364; in net/minecraft/class_437 for mymod.mixins.json:IScreen->@Invoker[METHOD_PROXY]::invokeAddSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364; [INJECT Applicator Phase -> mymod.mixins.json:IScreen -> Apply Accessors -> -> Locate -> mymod.mixins.json:IScreen->@Invoker[METHOD_PROXY]::invokeAddSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364;]
org.spongepowered.asm.mixin.gen.throwables.InvalidAccessorException: No candidates were found matching addSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364; in net/minecraft/class_437 for mymod.mixins.json:IScreen->@Invoker[METHOD_PROXY]::invokeAddSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364; [INJECT Applicator Phase -> mymod.mixins.json:IScreen -> Apply Accessors -> -> Locate -> mymod.mixins.json:IScreen->@Invoker[METHOD_PROXY]::invokeAddSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364;]
at org.spongepowered.asm.mixin.gen.InvokerInfo.findTargetMethod(InvokerInfo.java:117)
at org.spongepowered.asm.mixin.gen.InvokerInfo.locate(InvokerInfo.java:101)
at org.spongepowered.asm.mixin.transformer.MixinTargetContext.generateAccessors(MixinTargetContext.java:1318)
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyAccessors(MixinApplicatorStandard.java:1051)
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:393)
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:320)
at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:345)
at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:569)
at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351)
at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:208)
at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:178)
at org.spongepowered.asm.mixin.transformer.FabricMixinTransformerProxy.transformClassBytes(FabricMixinTransformerProxy.java:23)
at net.fabricmc.loader.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:157)
at net.fabricmc.loader.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:150)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
at net.optifine.reflect.Reflector.<clinit>(Reflector.java:185)
at net.minecraft.class_128.<init>(class_128.java:44)
at net.minecraft.class_128.method_24305(class_128.java:349)
at net.minecraft.client.main.Main.main(Main.java:137)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:226)
at net.fabricmc.loader.launch.knot.Knot.launch(Knot.java:146)
at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:28)
The other one (callAddDrawable) still works with fabric for some reason. I suspect the problem with the '&' operator of the generic T type of the function.
Enrivonment:
- Java 16 AdoptOpenJDK
- Minecraft 1.17
I don't know if this is a bug with fabric, sponge or my fault and need your help.
Any help is greatly appreciated, thanks.