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
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }