Original concept by u/SuperMario69Kraft on Reddit (r/minecraftsuggestions) - https://www.reddit.com/r/minecraftsuggestions/comments/1u0eybs/. Built by BeansNToast.
A blast-resistant sensor block that converts FORCE into analog redstone. The target block's sibling: the target block measures accuracy, the dynamometer measures force. One block, three senses, documented 0-15 curves.
Each detection emits a redstone pulse (default 10 ticks). Output is pressure-plate-shaped: weak power to all six neighbors, strong power into the block below, and a comparator reads the measured value for the pulse duration. Like the vanilla target block, a second hit during a pulse updates the strength but does not extend the window.
Anything landing on top: players, mobs, armor stands, falling sand, anvils. The sensor reads RAW fall distance, not fall damage, so damage modifiers cannot skew it - and it reads through ONE cover block (carpet, slab, or a full block) sitting on the sensor, exactly as the original suggestion asks. Cover it in slime or hay: same reading.
signal = clamp(floor(fallDistance / 2), 1, 15)
| Fall distance | Signal |
|---|---|
| 0-3 blocks | 1 |
| 6 blocks | 3 |
| 10 blocks | 5 |
| 20 blocks | 10 |
| 30+ blocks | 15 |
Any blast within power x 2 blocks of the sensor takes a reading. The
signal encodes the explosion's POWER, independent of distance:
signal = clamp(round(explosionPower x 2), 1, 15)
| Source | Power | Signal |
|---|---|---|
| Ghast fireball / wither skull | 1 | 2 |
| Creeper | 3 | 6 |
| TNT | 4 | 8 |
| Bed / respawn anchor (wrong dimension) | 5 | 10 |
| Charged creeper / end crystal | 6 | 12 |
| Wither spawn | 7 | 14 |
The dynamometer itself always survives the blast.
A projectile striking any face produces a velocity-based force estimate:
signal = clamp(ceil(impactSpeed x 2), 1, 15) - the
same speed-times-base-damage formula vanilla arrows use. Full-charge bow
is 6, crossbow bolt is 7. (Reads kinetic energy: Power enchantments do
not change the reading.)clamp(ceil(impactSpeed x 2), 1, 15); a snowball reads about 3. A
fireball that explodes also produces a separate explosion reading.config/dynamometer.json (generated on first run):
| Key | Default | Meaning |
|---|---|---|
pulse_ticks |
10 | output pulse length in game ticks |
fall_enabled / explosion_enabled / projectile_enabled |
true | per-sense toggles |
fall_divisor |
2.0 | fall curve: floor(fallDistance / divisor) |
explosion_factor |
2.0 | explosion curve: round(power x factor) |
explosion_range_multiplier |
2.0 | reading range: power x multiplier blocks |
projectile_velocity_factor |
2.0 | projectile curve: ceil(speed x factor) |
log_detections |
false | INFO-log every reading (contraption debugging) |
Two jars, one per version line (this repo's standard policy):
| Jar | Targets | Toolchain | Tested on |
|---|---|---|---|
Dynamometer-1.0.0.jar |
1.21.11 | Java 21 (class 65), remap Loom, Mojang mappings | Fabric dedicated server 1.21.11 |
Dynamometer-1.0.0-26.1.jar |
26.1 - 26.1.2 | Java 25 (class 69), non-remap Loom | Fabric dedicated server 26.1.2 |
The 1.21 jar declares 1.21.11 only: the mod hooks Entity.checkFallDamage
and ServerExplosion.explode, whose shapes changed inside the 1.21.x line
(fall distance went float to double at 1.21.5), so earlier patches are not
claimed without a test pass. Requires Fabric API on both lines.
docs/permission.md;
the echo-shard recipe revision in this build is his own request.# 1.21.x jar
cd fabric
$env:JAVA_HOME = 'C:\Program Files\Java\jdk-25'; .\gradlew build --no-daemon
# 26.1.x jar
cd fabric26
$env:JAVA_HOME = 'C:\Program Files\Java\jdk-25'; .\gradlew build --no-daemon
textures.py regenerates the 16x16 art into both resource trees plus
preview.png; gen_logo.py renders logo.png and the in-jar icons.
MIT (see LICENSE). All art is original.