Redstone Dynamometer
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.
The block
- Redstone Dynamometer - obsidian-armored body, slime-cushioned top,
gauge dial on every side. Obsidian-grade blast resistance (1200): it
never breaks from explosions. Mines quickly with any pickaxe and always
drops itself (it is a redstone component, not a wall block).
- Recipe (the OP's, including his post-thread revision): top row 3
obsidian; middle row iron ingot, redstone dust, iron ingot; bottom row
slimeball, echo shard, slimeball. The echo shard replaced the original
bottom-center iron ingot at the author's request (2026-06-10) for the
sculk-tech kinship.
- Found in the Redstone Blocks creative tab.
The three senses
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.
1. Fall impact (top face)
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 |
2. Explosion (anywhere near it)
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.
3. Projectile (any face)
A projectile striking any face produces a velocity-based force estimate:
- Arrows and bolts:
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.)
- Trident: flat 8, its vanilla impact damage.
- Everything else (snowballs, eggs, pearls, fireballs, wind charges):
clamp(ceil(impactSpeed x 2), 1, 15); a snowball reads about 3. A
fireball that explodes also produces a separate explosion reading.
Config
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) |
Version support
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.
Honest gaps
- Projectile sensing is code-verified only. Fall and explosion sensing
were proven headless on a dedicated server (falling block lands -> signal
fires and lights an adjacent lamp; TNT 3 blocks away -> reading fires and
the block survives). Nobody has shot the block in a real client yet.
- Not visually verified in a graphical client (textures, dial, creative tab
placement).
- Comparator read-out is implemented via the standard analog-output hook but
was not exercised headless; the lamp test proves the weak-power path.
- Author approval: GRANTED 2026-06-10, verbatim quote in
docs/permission.md;
the echo-shard recipe revision in this build is his own request.
Building
# 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.
License
MIT (see LICENSE). All art is original.