1.0.0
Compatibility
Required content
Changes
First public release of Sable: Destructive — a NeoForge 1.21.1 add-on for Sable that finally lets physics blocks break.
Core mechanics
- Universal collision callback wired into every Sable physics block.
- Real kinetic-energy model (mass × v²) decides the outcome of every impact.
- Two destruction modes:
- DETACH (~90%) — affected blocks break off as a smaller independent physics sub-level and keep flying.
- VANISH (~10%) — blocks pulverize into particles + sound when energy exceeds the material's pulverize threshold.
- Outcome is biased by physics: energy ratio, brittleness, and a safety speed ceiling — chances only set the baseline tendency.
- Cluster detach: blocks can break off in chunks, not strictly one at a time.
Block data
- Full mass + toughness table for all 1.21.1 vanilla blocks.
- Modded blocks default to a fragile clay-tier (clamped to 80–1500 kg, ≤6 m/s break speed) so unknown blocks never become indestructible bricks.
- F3 + H tooltip shows "Mass: X kg" and "Impact strength: Y m/s".
Explosions and terrain
- TNT, creepers, end crystals and other vanilla explosions now damage Sable sub-levels through the same path.
- World terrain is also affected, but only via VANISH (never DETACH), so the world never turns into a runaway physics sim.
- Bedrock, barriers, unbreakable blocks and block entities are skipped on the terrain path.
- Toggle terrain damage with the affectOnlySubLevelBlocks config flag.
Visual + audio (fancy VANISH effect)
- 3-layer particles: block-dust with the actual block texture, POOF, and CRIT chips.
- Block break sound + soft "whump".
- Per-tick budgets: 600 particles, 32 effects.
- Spatial + temporal dedup so big simultaneous breaks don't audio-clip.
- Auto-scaling under backpressure; falls back to vanilla levelEvent(2001) if overloaded.
- Toggle with effects and fancyVanishEffect config flags.
Stability and crash safety
- Lock-free offer queue with atomic size counter and epoch-XOR dedup ring (8192 entries).
- Per-tick offer cap (1024) to keep the hot path bounded.
- DETACH is always deferred to a safe inter-tick window — never executed while Sable's physics system is mid-step (this was the historic native-crash trigger).
- Snapshot + rollback, global crash guard, shutdown hook, emergency disable.
- NaN / Inf sanitisation on all impact data and kick velocities.
- Cluster BFS strictly stays within one parent sub-level — no cross-boundary clusters.
- Lifecycle reset on server start / stop / level unload.
Runtime control (op level 2)
- /sable-dv on | off | toggle | status
- /sable-dv config list
- /sable-dv config get <name>
- /sable-dv config set <name> <value>
- /sable-dv config reset <name>
- All tunables are reflected automatically with type coercion and tab-suggest.
Defaults
- enabled = true
- chanceDetach = 0.90, chanceVanish = 0.10, physicsBiasStrength = 0.6
- pulverizeEnergyRatio = 6.0, cleanDetachEnergyRatio = 1.5
- minBreakSpeed = 6.0, absoluteMaxSpeed = 350, detachSafeSpeedCeiling = 100
- maxDetachesPerSecond = 8, maxActiveDetachedSubLevels = 48, detachCooldownMs = 25
- affectOnlySubLevelBlocks = false
- effects = true, fancyVanishEffect = true
Requirements
- Minecraft 1.21.1
- NeoForge 21.1.227+
- Sable 1.1.3+
Credits
- Code: Xylos_Official
- Visuals: Viaquelt
- Built on top of Sable by ryanhcode
Optional dependencies
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:s8kSCCgD:effswrK5"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:s8kSCCgD:effswrK5"
}

