1.2.0
Compatibility
Changes
1.1.0 introduced inertial penetration but kept the per-block thresholds conservative — collisions still felt cosmetic. 1.2.0 retunes the damage model from the ground up so impacts feel like impacts.
What changed
-
Default damage is roughly doubled across the board.
- collisionEnergyMultiplier 1.0 → 2.0
- collisionStrengthMultiplier 1.0 → 1.5
- penetrationEnergyMultiplier 1.0 → 0.6 (each consumed block costs less, so chains run further on the same energy)
- maxPenetrationDepth 16 → 32
- defaultAttackerMassKg 2000 → 4000
-
Speed actually matters now. Two new knobs scale the penetration walk by approach speed:
- penetrationSpeedEnergyBonus = 0.02 → +2% kinetic-energy budget per m/s above minBreakSpeed. At 50 m/s above the gate that's +100% budget — fast hits chain dramatically further.
- penetrationDepthPerMs = 0.25 → each m/s above minBreakSpeed extends the depth cap by 0.25 blocks. At 80 m/s a hammer can chain ~18 blocks past the static cap.
-
Density actually matters now. The callback no longer hands attackerHardness=0 to BreakResolver — it now passes V_WOOD as a sensible default sub-level toughness plus the configured defaultAttackerMassKg. The asymmetry rule (attackerToughnessRatio) finally engages: a wooden cog smacked into stone won't shatter the stone, an iron block into wood will.
-
Self-damage. New: when the attacker is much softer than the defender (attacker toughness < defender · selfDamageThreshold, default 0.6), the defender survives AND the attacker erodes its own contact face for up to selfDamageMaxBlocks (default 4) blocks. A copper hammer slamming an obsidian wall now sheds copper from itself instead of the wall doing nothing — finally that "soft bounces off hard" feel.
-
All chain-broken AND self-damage blocks always VANISH (never DETACH) — same crash-safety rule as 1.1.0.
New tuning knobs (all auto-persisted to config/sabledestructive-common.toml, all live-reloadable):
- selfDamageThreshold (default 0.6)
- selfDamageMaxBlocks (default 4)
- penetrationSpeedEnergyBonus (default 0.02)
- penetrationDepthPerMs (default 0.25)
Tweaked defaults (existing knobs):
- collisionEnergyMultiplier 1.0 → 2.0
- collisionStrengthMultiplier 1.0 → 1.5
- penetrationEnergyMultiplier 1.0 → 0.6
- maxPenetrationDepth 16 → 32
- defaultAttackerMassKg 2000.0 → 4000.0
Compatibility
- No breaking changes for end users. Existing 1.1.0 worlds load as-is. The Addon API is unchanged (API_VERSION still 1).
- To restore 1.1.0 feel exactly, set the five "tweaked defaults" above back to their previous values via /sable-dv set.
- To completely disable inertial chains and self-damage: /sable-dv set inertialPenetrationEnabled false /sable-dv set selfDamageMaxBlocks 0
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:URNZhrIe"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:s8kSCCgD:URNZhrIe"
}

