From 9649c6f890f2371ad4f4cf9caca26e4bfb981969 Mon Sep 17 00:00:00 2001 From: Andrij Abyzov Date: Sat, 21 Mar 2026 21:31:54 +0100 Subject: [PATCH] Fix NeoForge shader crash by using RegisterShadersEvent instead of mixin The GameRendererReloadShaders mixin crashed on NeoForge 1.21.1 because the ResourceProvider passed to reloadShaders does not include mod resources, causing FileNotFoundException for watut:shaders/core/particle.json. Replace the mixin with NeoForge's RegisterShadersEvent, which provides a ResourceProvider that includes all mod resources. This is the standard approach used by other mods (Create, Mekanism, Alex's Caves, etc.). Also fix ShaderInstanceBlur to call the ResourceLocation super constructor directly instead of converting to String. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../com/corosus/watut/ShaderInstanceBlur.java | 2 +- .../watut/loader/neoforge/ClientEvents.java | 34 +++++++++++++++++++ .../loader/neoforge/WatutModNeoForge.java | 1 + src/main/resources/watut.mixins.json | 1 - 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/corosus/watut/ShaderInstanceBlur.java b/src/main/java/com/corosus/watut/ShaderInstanceBlur.java index 3c94ae3..e95406a 100644 --- a/src/main/java/com/corosus/watut/ShaderInstanceBlur.java +++ b/src/main/java/com/corosus/watut/ShaderInstanceBlur.java @@ -17,7 +17,7 @@ public class ShaderInstanceBlur extends ShaderInstance { public final Uniform BLUR_LEVEL; public ShaderInstanceBlur(ResourceProvider p_173336_, ResourceLocation shaderLocation, VertexFormat p_173338_) throws IOException { - super(p_173336_, shaderLocation.toString(), p_173338_); + super(p_173336_, shaderLocation, p_173338_); this.RESOLUTION = this.getUniform("resolution"); this.RADIUS = this.getUniform("radius"); this.BLUR_LEVEL = this.getUniform("blurLevel"); diff --git a/src/main/java/com/corosus/watut/loader/neoforge/ClientEvents.java b/src/main/java/com/corosus/watut/loader/neoforge/ClientEvents.java index f342ffc..cb29a45 100644 --- a/src/main/java/com/corosus/watut/loader/neoforge/ClientEvents.java +++ b/src/main/java/com/corosus/watut/loader/neoforge/ClientEvents.java @@ -1,15 +1,49 @@ package com.corosus.watut.loader.neoforge; import com.corosus.watut.ParticleRegistry; +import com.corosus.watut.PlayerStatusManagerClient; +import com.corosus.watut.ShaderInstanceBlur; import com.corosus.watut.WatutMod; import com.corosus.watut.command.CommandWatutReloadJSON; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.InputEvent; import net.neoforged.neoforge.client.event.RegisterClientCommandsEvent; +import net.neoforged.neoforge.client.event.RegisterShadersEvent; import net.neoforged.neoforge.client.event.TextureAtlasStitchedEvent; +import java.io.IOException; + public class ClientEvents { + public void onRegisterShaders(RegisterShadersEvent event) { + try { + event.registerShader( + new ShaderInstanceBlur(event.getResourceProvider(), + ResourceLocation.fromNamespaceAndPath(WatutMod.MODID, "particle"), + DefaultVertexFormat.PARTICLE), + s -> PlayerStatusManagerClient.particle = (ShaderInstanceBlur) s); + event.registerShader( + new ShaderInstanceBlur(event.getResourceProvider(), + ResourceLocation.fromNamespaceAndPath(WatutMod.MODID, "position_tex_blur"), + DefaultVertexFormat.POSITION_TEX), + s -> PlayerStatusManagerClient.positionTexBlur = (ShaderInstanceBlur) s); + event.registerShader( + new ShaderInstanceBlur(event.getResourceProvider(), + ResourceLocation.fromNamespaceAndPath(WatutMod.MODID, "position_tex_blur_horizontal"), + DefaultVertexFormat.POSITION_TEX), + s -> PlayerStatusManagerClient.positionTexBlurHorizontal = (ShaderInstanceBlur) s); + event.registerShader( + new ShaderInstanceBlur(event.getResourceProvider(), + ResourceLocation.fromNamespaceAndPath(WatutMod.MODID, "position_tex_blur_vertical"), + DefaultVertexFormat.POSITION_TEX), + s -> PlayerStatusManagerClient.positionTexBlurVertical = (ShaderInstanceBlur) s); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + public void getRegisteredParticles(TextureAtlasStitchedEvent event) { ParticleRegistry.textureAtlasUpload(event.getAtlas()); } diff --git a/src/main/java/com/corosus/watut/loader/neoforge/WatutModNeoForge.java b/src/main/java/com/corosus/watut/loader/neoforge/WatutModNeoForge.java index d0dbe43..fb53512 100644 --- a/src/main/java/com/corosus/watut/loader/neoforge/WatutModNeoForge.java +++ b/src/main/java/com/corosus/watut/loader/neoforge/WatutModNeoForge.java @@ -31,6 +31,7 @@ public WatutModNeoForge(ModContainer container) { if (FMLEnvironment.dist.isClient()) { ClientEvents clientEvents = new ClientEvents(); container.getEventBus().addListener(clientEvents::getRegisteredParticles); + container.getEventBus().addListener(clientEvents::onRegisterShaders); NeoForge.EVENT_BUS.addListener(clientEvents::onRegisterCommandsClient); NeoForge.EVENT_BUS.addListener(clientEvents::onGameTick); NeoForge.EVENT_BUS.addListener(clientEvents::onKey); diff --git a/src/main/resources/watut.mixins.json b/src/main/resources/watut.mixins.json index 2bfa40e..6327174 100644 --- a/src/main/resources/watut.mixins.json +++ b/src/main/resources/watut.mixins.json @@ -10,7 +10,6 @@ "client.ScreenRenderBackground", "client.ScreenRenderWithTooltip", "client.PostChainResize", - "client.GameRendererReloadShaders", "client.ParticleEngineMixin", "client.NativeImageAccessor" ],