- Java 100%
Ports peetsamods/slabbed from 1.21.11 to 1.20.4/Java 17/Loader 0.19.3/ Fabric API 0.97.3 for the MTR France server: gradle.properties/build.gradle retargeting, mixin signature fixes for the 1.20.4 API generation (getStateForNeighborUpdate, isOpaqueFullCube, onUseWithItem -> onUse, render-state-refactor classes that don't exist yet, etc.), a rewritten attachment-sync networking layer (createPersistent + a plain broadcast packet instead of the newer AttachmentSyncPredicate API), a hand-rolled OffsetBakedModel (FabricBakedModel mesh add-on is opt-in in this MC generation, not universal like the newer BlockStateModel one), and fixes for two separate real crash/deadlock classes found via live thread dumps and log analysis (a mixin descriptor mismatch causing InvalidInjection- Exception, and off-server-thread World.getChunk calls deadlocking against worldgen). Survived all of that, but the block model render offset itself never worked correctly (hitbox/outline/raycast always correct, rendered model never was) despite exhaustive diagnosis - see README.md for the full writeup of what was tried and ruled out. Abandoned 2026-07-31; not deleted in case it's worth revisiting later. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| gradle/wrapper | ||
| mappings | ||
| src | ||
| .gitignore | ||
| build.gradle | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| KNOWN_INCOMPLETE_1.20.4.md | ||
| LICENSE | ||
| README.md | ||
| settings.gradle | ||
Slabbed — 1.20.4 port (ABANDONED, not being continued for now)
Status: abandoned 2026-07-31. Not deleted because real work went into it and it might be worth revisiting later with fresh eyes or an upstream fix — but do not pick this back up without the project owner explicitly asking for it.
This is a port of peetsamods/slabbed
(a mod that visually lowers blocks/torches/etc placed on top of a bottom slab so
they sit flush instead of floating, originally 1.21.11) down to Fabric 1.20.4,
for the MTR France server. See KNOWN_INCOMPLETE_1.20.4.md in this repo for the
detailed list of what was dropped/hand-rolled during the port (debug tooling,
attachment sync, model offset, entity render offsets, crosshair pick, Indigo
cull hook) and unverified-but-documented risk areas.
Why it was abandoned
The mod's hitbox/outline/raycast always correctly reflected the intended -0.5 lowering offset, but the actual rendered block model never did, on every block type placed on a slab — confirmed on multiple relaunches and rebuilds, not a one-off.
Extensive diagnosis found nothing wrong on the code side:
- Live
jstackthread dumps ruled out a deadlock/hang explanation. - Decompiling the actual Sodium/Indium/Fabric-Renderer-API internals in use
(
VanillaModelEncoder,AbstractRenderContext,TerrainRenderContext) confirmed the transform-stack mechanism used to shift rendered quads is architecturally sound and correctly wired. - The mod's own
/slabdy rowdebug command confirmed, directly from inside the live render path, that the offset value being computed was exactly correct (-0.5) at the moment of rendering.
Two different rendering strategies were tried: the original
context.pushTransform() + context.fallbackConsumer() approach, and a
from-scratch direct QuadEmitter emission that bypasses the transform stack
entirely. Neither fixed the visual bug. A second opinion (a different AI model)
proposed a specific theory about fallbackConsumer()/VanillaModelEncoder
resetting quad state after the transform ran — that theory didn't hold up
against the actually-decompiled bytecode (the transform demonstrably runs
during emitter.emit(), which happens after the quad data is populated, not
before), so it wasn't the explanation either.
Rather than keep sinking time into a root cause that resisted every diagnostic tried, the project owner chose to drop the mod from the live modpack rather than continue debugging it.
If you do pick this back up
Start from the modelTrace//slabdy row evidence above — the wrapper model
is correctly registered (SlabbedModelLoadingPlugin confirmed wrapping the
torch's baked model at bake time) and is correctly invoked
(OffsetBakedModel.emitBlockQuads confirmed firing, with the correct dy) —
so the bug is somewhere between a correctly-computed, correctly-transformed
quad and what actually reaches the screen under Sodium + Indium specifically.
That narrows it, but doesn't answer it.