1.1.0
Compatibility
Changes
This is a big quality-of-life pass on top of 1.0.0. The destruction system now feels meaningful instead of cosmetic: a heavy hammer actually digs into the ground, dirt yields deeper craters than stone, modded blocks have a clean integration path, and every tunable you change at runtime survives a server restart.
New — Inertial Penetration
- Impacts no longer stop at the first block. The attacker's kinetic energy is drained block-by-block along the motion direction by each consumed block's break cost (0.5 · m_def · v_threshold²).
- An obsidian hammer punches a deep crater into dirt and only chips the surface of stone — automatically, no per-block scripting.
- Chain-broken blocks always VANISH. Only the FIRST contact block may DETACH, because spawning new sub-levels mid-walk is the historic native-crash trigger and is intentionally forbidden here.
- Stops on tile entities, indestructible blocks, world bounds, energy exhaustion, or maxPenetrationDepth.
- New knobs: inertialPenetrationEnabled (default true), maxPenetrationDepth (16), penetrationEnergyMultiplier (1.0), defaultAttackerMassKg (2000.0).
New — Public Addon API
- com.destroynautics.sabledestructive.api.SableDestructiveAPI lets other mods register their own blocks into the destruction system with custom mass and toughness — no more falling back to the fragile clay-tier default for unknown modded blocks.
- Register by Block instance (type-safe) or by ResourceLocation (works even if the target Block class isn't loaded — ideal for optional cross-mod compat).
- Tier presets matching the internal scale: PAPER, LEAF, EARTH, CLOTH, SOFT, CLAY, WOOD, STONE, HARD_STONE, METAL_SOFT, METAL, GEM, OBSIDIAN, NETHERITE, REINFORCED, UNBREAKABLE.
- registerUnbreakable(Block / ResourceLocation) — bedrock-equivalent shortcut.
- Read-only queries: getMassKg, getBreakSpeedMs, getToughnessUnits — useful for your own tooltips or ballistics.
- isRegistered / unregister for runtime control.
- Thread-safe, idempotent, last-write-wins.
- API_VERSION = 1, covered by SemVer. Anything outside the api package is internal and may change without notice.
New — Persistent Config
- Tunables now live in config/sabledestructive-common.toml. Every value set via /sable-dv set … survives server restarts.
- Live auto-reload: edit the TOML on disk and the change applies within ~250 ms — no restart, no command, no reconnect.
- /sable-dv config reset now actually restores defaults (was a no-op in 1.0.0).
- Config writes are debounced and the watcher ignores its own writes, so toggling values from chat doesn't trigger a redundant reload.
New — Hand-Tuned Block Table
- ~70 of the most relevant 1.21.1 blocks — every wood species and the full stone family — carry their own hand-tuned mass and toughness rather than being lumped into a generic "wood" or "stone" bucket.
- Cherry is softer than oak. Mangrove is denser than spruce. Mossy bricks crack a hair sooner than fresh ones. Slabs, stairs, walls, fences, doors, trapdoors, signs and pressure plates each get their own entry.
- All other vanilla blocks continue to use the existing classification pipeline (tag → registry path → vanilla material), so behaviour is unchanged for blocks not in the override table.
Tweaks
- Modded blocks default break-speed halved (2.0 m/s → 1.0 m/s) — even more fragile than vanilla leaves, encouraging addons to register explicit values via the new API.
- Modded max break-speed cap halved (V_CLAY → V_CLAY / 2) — modded blocks can no longer silently rival vanilla wood without explicit registration.
Tooltip
- F3+H now shows "Toughness: N units" instead of "Mass: X kg / Impact strength: Y m/s". Mass is no longer surfaced in the tooltip — it's an internal physics input, not a durability measure. N = break-speed × 10.
Documentation
- Full API documentation added to the long Modrinth description, including a soft-dependency setup snippet for neoforge.mods.toml.
- New sections covering Persistent Config, the Block Toughness table, and Inertial Penetration semantics.
License
- Switched from All-Rights-Reserved to MIT.
No breaking changes for end users. Existing 1.0.0 worlds load as-is. Disable inertial penetration with /sable-dv set inertialPenetrationEnabled false to restore the pre-1.1.0 "one block per contact" behaviour.
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
License
- MIT
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:Jq82tbOb"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:s8kSCCgD:Jq82tbOb"
}

