Links
Tags
Creators
Details
0.4.0-beta.1+mc1.21.9
Compatibility
Required content
Changes
0.4.0-beta.1 — audit-driven beta
Multi-agent audit pass surfaced 35 findings across security, correctness, cross-version compatibility, and the merge algorithm itself. This beta closes the 2 CRITICAL and 10 HIGH-severity items. Marked as a beta until the deferred follow-ups land and the mod has more real-world validation.
Fixed — CRITICAL
- MoveEntities entity-id remap (the underlying cause of GitHub issue #1 for overlapping merges): the bulk-tick
MoveEntitiesaction is now decoded, everyVarInt entityIdis remapped throughsafeRemap, and the new bytes are re-emitted. Previously secondary sources' local ids collided with the primary's global namespace, producing the "frozen mobs / default rotations / missing equipment" symptoms. SET_ENTITY_LINKwire format: read/writeint32instead ofVarInt(which mis-decoded any id above 127). Sentinel for "no holder" treated as<= 0to cover both legacy (-1) and modern (0) encodings — leashes no longer randomly attach to the wrong entity.
Fixed — HIGH (security)
- Path traversal guard in
FlashbackReader.open: every segment path is normalised and confined to the replay folder. - Zip-bomb entry-count cap (65 536 entries per source) on top of the existing 5 GB byte cap.
OverlapValidatorrefuses to probe replays whose first segment exceeds 256 MB (OOM guard).
Fixed — HIGH (correctness)
- PIU bulk re-emit no longer fires on mid-segment intercalation (5-arg overload bug closed).
copyPrimarySnapshotForTickusesFileChannel.mapinstead ofFiles.readAllBytes, avoiding OOM on long replays.HURT_ANIMATIONandPLAYER_COMBAT_KILLreclassifiedEGO → ENTITYso their entity id is remapped through the global namespace.
Fixed — HIGH (cross-version)
fabric.mod.jsonjavadependency is now templated: 1.21.x jars declare>= 21, the 26.1.x jar declares>= 25. Previously the 26.1 jar advertised>= 21and crashed at classload on JDK 21 instead of failing cleanly via Fabric.addRenderableWidgetreflection on 26.1+ iteratesScreen.class.getDeclaredMethods()and binds to the first overload accepting ourButton— resilient to method-rename churn.
Fixed — i18n
- English users no longer see French progress labels:
MergeOrchestratoremitsmultiview.merge_progress.phase.*translation keys and the screen picksComponent.translatablevsComponent.literalbased on the"multiview."prefix.
Deferred to follow-up
EntityMergerUUID-overwrite race andsafeRemapphantom-ID race (H8, H9) — real but carry regression risk; separate focused session.SOUND_ENTITY/LEVEL_EVENTremap (H7) — non-trivial wire format.MergeOrchestratorrefactor (still ≥ 1300 lines).
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:ja9dG9KW:a6o6RLfB"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:ja9dG9KW:a6o6RLfB"
}

