Skip to content

Sable's Veil RenderBuffersMixin causes Quark's GlintRenderTypes static initializer to fire before ModLoadingContext is ready → "Where is minecraft???!" crash on startup #551

@MetriumJS

Description

@MetriumJS

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: crashSomething crashes my game

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions