I am working in the latest MDK. Minecraft 1.21.4, Forge 54.1.0.
I am trying to create a mixin. The implementation doesn't matter. Assume it is doing nothing more than logging to the console:
@Mixin(LevelRenderer.class)
public abstract class LevelRendererMixin {
private static final Logger LOGGER = LogManager.getLogger("LevelRendererMixin");
@Inject(method = "renderLevel", at = @At("TAIL"))
private void onRenderLevel(
com.mojang.blaze3d.resource.GraphicsResourceAllocator allocator,
net.minecraft.client.DeltaTracker deltaTracker,
boolean someFlag,
Camera camera,
GameRenderer gameRenderer,
Matrix4f matrix1,
Matrix4f matrix2,
CallbackInfo ci
) {
Assuming my whole implementation is just to write something to console, it works perfectly fine in when I debug (runClient) in IntelliJ. Whenever the Minecraft `renderLevel` runs every frame, my logging is overlaid at "TAIL".
Yes, this spams the sht out of the console.
But when I `build` and use the jar as a mod, it does not. The mixin annotation processor shows to be loading, and my other parts of my mod work, but the nothing gets logged by my mixin.
I am apparently generating a proper `refmap` and it's in the jar root. Other files are also in the jar appropriately, including mods.toml. And all the naming and reference paths are correct.
I had to add this to my build.gradle to get my refmap into the jar ([name] obviously replaced):
tasks.register("copyRefmap", Copy) {
dependsOn tasks.named("compileJava")
from("${project.buildDir}/tmp/compileJava") {
include "mixins.[name].refmap.json"
}
into("${project.buildDir}/resources/main")
}
tasks.named("processResources", ProcessResources).configure {
dependsOn(tasks.named("copyRefmap"))
}
tasks.named("jar", Jar).configure {
// Include the generated refmap from build/resources/main into the jar.
from("${project.buildDir}/resources/main") {
include "mixins.[name].refmap.json"
}
}
Just for fun, here is my refmap in case something looks wrong to anybody:
{
"mappings": {
"com/[name]/mixin/LevelRendererMixin": {
"renderLevel": "Lnet/minecraft/client/renderer/LevelRenderer;m_109599_(Lcom/mojang/blaze3d/resource/GraphicsResourceAllocator;Lnet/minecraft/client/DeltaTracker;ZLnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/GameRenderer;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V"
}
},
"data": {
"searge": {
"com/[name]/mixin/LevelRendererMixin": {
"renderLevel": "Lnet/minecraft/client/renderer/LevelRenderer;m_109599_(Lcom/mojang/blaze3d/resource/GraphicsResourceAllocator;Lnet/minecraft/client/DeltaTracker;ZLnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/GameRenderer;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V"
}
}
}
}
TLDR;
My mixin works in dev, but not when built and run in an official Forge/Minecraft environment. Like it's not overlaying/replacing the minecraft function.
What are some typical other things to check when a mixin works in dev, but not after build?