ABANDONED - do not continue for now. Fabric 1.20.4 port of a slab-lowering mod; block model render offset never worked despite correct computed values. May revisit later.
Find a file
Aca. e3c3b60c53 Port to Fabric 1.20.4 (ABANDONED - see README)
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>
2026-07-31 17:28:30 +02:00
gradle/wrapper Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
mappings Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
src Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
.gitignore Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
build.gradle Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
gradle.properties Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
gradlew Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
gradlew.bat Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
KNOWN_INCOMPLETE_1.20.4.md Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
LICENSE Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
README.md Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00
settings.gradle Port to Fabric 1.20.4 (ABANDONED - see README) 2026-07-31 17:28:30 +02:00

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 jstack thread 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 row debug 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.