Context
Environment
Minecraft: 1.21.1
NeoForge: 21.1.227
Sable: 1.1.3 (NeoForge)
Quark: 4.1-477
Zeta: 1.1-40
Sodium: present (via NeoForge port)
Sinytra Connector: 2.0.0-beta.14+1.21.1
Description
Installing Sable alongside Quark causes a hard crash during Initializing game — the game never reaches the main menu. The crash is reproducible every launch and is not intermittent.
This is a distinct but related variant of issue #101. Where #101 documents Sable causing early ClientHooks / MouseHandler event dispatch before mods finish keybind/config initialization, this issue documents a mixin ordering race on RenderBuffers that forces Quark's static initializer () to run before its NeoForge mod container is registered, causing ModLoadingContext.getActiveContainer() to throw "Where is minecraft???!".
Root Cause Analysis
Sable bundles Veil as a JiJ (Jar-in-Jar) dependency. Veil registers a mixin against net.minecraft.client.renderer.RenderBuffers via veil.neoforge.mixins.json:client.RenderBuffersMixin.
When Veil's RenderBuffersMixin is applied alongside Sodium's RenderBuffersMixin and Quark's RenderBuffersMixin, the combined mixin transformation causes Quark's @Inject handler (addGlintTypes) to fire during Minecraft.() — before Quark's mod container has been set as the active FML context.
The addGlintTypes handler triggers the classloading of org.violetmoon.quark.content.tools.client.render.GlintRenderTypes. That class's static initializer () references Quark.ZETA, which forces Quark. to run. Quark. calls new ForgeZeta() → ForgeZeta.createRegistry() → new ForgeZetaRegistry() → ModLoadingContext.getActiveContainer(), which throws because no mod container is active on the render thread at this point in startup.
Without Veil/Sable present, the same Quark + Sodium combination does not crash, confirming that Veil's RenderBuffersMixin is the triggering factor that shifts the mixin execution context.
Mixin chain on RenderBuffers when crash occurs:
pl:mixin:APP:veil.neoforge.mixins.json:client.RenderBuffersMixin ← from Sable's bundled Veil
pl:mixin:APP:sodium-common.mixins.json:core.render.world.RenderBuffersMixin
pl:mixin:APP:quark.mixins.json:client.RenderBuffersMixin
Crash Report
https://mclo.gs/CSgbwEN
Context
Environment
Minecraft: 1.21.1
NeoForge: 21.1.227
Sable: 1.1.3 (NeoForge)
Quark: 4.1-477
Zeta: 1.1-40
Sodium: present (via NeoForge port)
Sinytra Connector: 2.0.0-beta.14+1.21.1
Description
Installing Sable alongside Quark causes a hard crash during Initializing game — the game never reaches the main menu. The crash is reproducible every launch and is not intermittent.
This is a distinct but related variant of issue #101. Where #101 documents Sable causing early ClientHooks / MouseHandler event dispatch before mods finish keybind/config initialization, this issue documents a mixin ordering race on RenderBuffers that forces Quark's static initializer () to run before its NeoForge mod container is registered, causing ModLoadingContext.getActiveContainer() to throw "Where is minecraft???!".
Root Cause Analysis
Sable bundles Veil as a JiJ (Jar-in-Jar) dependency. Veil registers a mixin against net.minecraft.client.renderer.RenderBuffers via veil.neoforge.mixins.json:client.RenderBuffersMixin.
When Veil's RenderBuffersMixin is applied alongside Sodium's RenderBuffersMixin and Quark's RenderBuffersMixin, the combined mixin transformation causes Quark's @Inject handler (addGlintTypes) to fire during Minecraft.() — before Quark's mod container has been set as the active FML context.
The addGlintTypes handler triggers the classloading of org.violetmoon.quark.content.tools.client.render.GlintRenderTypes. That class's static initializer () references Quark.ZETA, which forces Quark. to run. Quark. calls new ForgeZeta() → ForgeZeta.createRegistry() → new ForgeZetaRegistry() → ModLoadingContext.getActiveContainer(), which throws because no mod container is active on the render thread at this point in startup.
Without Veil/Sable present, the same Quark + Sodium combination does not crash, confirming that Veil's RenderBuffersMixin is the triggering factor that shifts the mixin execution context.
Mixin chain on RenderBuffers when crash occurs:
pl:mixin:APP:veil.neoforge.mixins.json:client.RenderBuffersMixin ← from Sable's bundled Veil
pl:mixin:APP:sodium-common.mixins.json:core.render.world.RenderBuffersMixin
pl:mixin:APP:quark.mixins.json:client.RenderBuffersMixin
Crash Report
https://mclo.gs/CSgbwEN