Tags
Creators
Details
1.2.1
Compatibility
Changes
Sparkle Morpher 1.2.1
Sparkle Morpher 1.2.1 fixes a singleplayer crash on the Fabric 26.x line, aligns the 26.2 branch with the real 26.2 APIs, and brings the rendering/network/Maid refactor series R0–R11 (recorded between 2026-08-10 and 2026-08-13, including everything from the 08-12 prerelease 1.2.0-beta-R11MAID) into a formal release across Fabric and NeoForge × 1.21.1 / 26.1.2 / 26.2.
Highlights
Crash fixes (focus of this release)
- Fixed
IncompatibleClassChangeErroron joining singleplayer (Fabric 26.1.2 / 26.2): removed the compile-time shadow stubs whereMinecraft.execute/submit/isLocalServerwere wrongly declaredstatic, which madeMinecraft.getInstance().execute(...)compile toinvokestaticand crash at runtime against the real instance methods. Everything is now compiled back toinvokevirtual(verified by a full ASM scan: 0 remaining). - Fa26.2 stub cleanup & alignment with real 26.2 APIs: removed 24 vestigial/shadowing stubs, keeping only 4 runtime compat layers (
MultiBufferSource/IrisApi/ModConfig/IForgeGuiGraphicsExtractor); 6 call sites (getScoreboard/renderNames/renderBuffers/getMainRenderTarget/screenetc.) moved to the real 26.2 APIs. - Sync packet queue overflow → bounded backpressure: bursts no longer abort the whole sync when the queue briefly fills; the enqueue side now waits with a bounded budget (server bandwidth limiting + outbound drain form a backpressure loop).
Rendering & performance
- Classic HUD deep performance rewrite: FBO partial physical-pixel offscreen cache (was ~35 ms full CPU render per frame → ~0.17 ms); GPU path with a 60 Hz independent refresh budget, SIMD/compat path at 10 Hz throttle; 8-slot bone SSBO ring +
GL_STREAM_DRAWstreaming uploads, eliminating shared-buffer sync stalls; explicit alpha compositing and batching isolation. - First-person hand rendering fix (26.x): the hand always uses the
entityTranslucentpass. - Preview rotation pollution fix (1.21.1): entity yaw and preview mode are reset even on exception paths (try/finally).
- Hand rendering NPE guard:
getAnimationBundle()==nullmid-state protection (12 sites across 6 branches). - R10-series internal refactors:
RenderBackendinterface isolation (Blaze3D / OpenGL / SIMD / Java implementations),GpuMeshRegistryleases + orphan sweeps, unified resource ownership for model assemblies (deterministic release), weighted-LRU audio cache.
Networking & model sync
- Fixed crash when clients without SPM join: per-player channel pre-checks before sending (NeoForge/Fabric) + batch send fallback.
- Systemic fix for sync timeouts / stuck "receiving model data":
LegacySyncFlowControl64 KiB burst backpressure + 512 MiB in-flight budget; a dedicated single-threaded sync executor with a bounded ordered packet queue (decrypt/verify/disk-write no longer blocks network/main threads); termination frame sent when the server cache is unavailable so the client never hangs forever; the watchdog no longer reports false success. - neo1.21.1 stuck-at-LOADING fix:
toClientboundPacketnull packet → wrapped inClientboundCustomPayloadPacket. - R9 networking modularization (internal): send-entry pre-checks, connection-state split, upload-transport interfaces.
Maid (TLM) compatibility (R11)
MaidModelSyncdivergence converged across branches (byte-identical in all six).C2SSetMaidModelPacket(id 24) ported to all branches: maid model switching now uses SPM's own chain (auth pipeline); the official TLM protocol remains as fallback.- TLM-environment startup crash fixed (
@Mixin(targets=...)to avoidMixinTargetAlreadyLoaded). - 26.x GUI maid preview not replacing YSM models — fixed.
- R11
compat.apiservice layer (internal, no startup-order dependencies).
GUI / HUD
- Classic / Modern HUD dual toggles: independent switches in settings; the legacy keybinding and old screen were removed.
ClassicHudLayoutScreenlayout editor: drag, unbounded scaling, scroll zoom, yaw rotation, one-click reset.ModernHudRendererindependent entry contract (off by default, internal).
Other fixes
- Abnormal head rotation while riding (
RiderRotationMathpure-angle helper, verified on 6 branches). - 1.21.1 default model rotation not following the camera (cross-frame cache registry retained).
- Server model pack name JSON-quote display fix.
Internal refactors (R0–R9, core of 1.2.1)
- S0 security hotfixes: YSM folder path-escape sandbox, atomic audio-cache dedup.
- R2 unified thread pools (
SmExecutorsbounded queues + CallerRuns backpressure + TaskScope). - R3
ModelStoragePathscentralization +PersistentStoreatomic writes. - R4 unified resource container (folder / zip GBK / limits) + zip-bomb protection.
- R5 Model Domain / R6 EntityModelResolver (priority + revision race protection).
- R7
ClientModelManagersplit (3024 lines → 5 focused classes). - R8
ServerModelManagersplit (1899 lines → 8 focused classes, atomic file moves + upload policy). - Tests grown from 45 → 201 per branch (YsmCrypt golden vectors, model corpus, race acceptance).
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:jQtfvgHC:nuJGQXPW"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:jQtfvgHC:nuJGQXPW"
}

