promotional bannermobile promotional banner

Horse Powered

Hand-cranked and animal-powered machinery focusing on early game grinding, chopping, pressing, drying, and crushing. Leash horses, donkeys, or llamas to automate the line or generate Forge Energy. Data-driven recipes with full JEI, EMI, and Jade support.

File Details

horsepowered 2.5.0

  • R
  • May 20, 2026
  • 457.33 KB
  • 12
  • 1.21.1
  • NeoForge

File Name

horsepowered-2.5.0.jar

Supported Versions

  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:horse-powered-1408330:8117810"
Curse Maven does not yet support mods that have disabled 3rd party sharing

Learn more about Curse Maven

Horse Powered 2.5.0

New Content

  • Animal Trap: wooden-retextured mob-spawner block that catches passive animals over time. Right-click bait into the empty trap, wait, and the trap rolls a 5% chance per second after the minimum wait elapses. Once an animal is caught it is stored on the BlockEntity as NBT (not as a live entity) and renders inside the cage spinning the way a vanilla mob spawner does. Every 2.5 minutes the captured entity rolls its vanilla death loot table and the drops land in the trap's internal inventory. Hoppers below the trap pull drops out; hoppers above only insert valid bait. Sneak+right-click releases the captured animal back into the world. Right-click with an empty hand drops all stored items on the ground. Mining the trap with a stone-tier-or-better axe drops it with full NBT preserved (bait, drops, captured entity) so a working farm can be relocated. Crafted with 4 wooden slabs, 2 iron chains, 2 smooth stone, and a wooden pressure plate.
  • Flint and Tinder: low-durability flint-and-steel alternative. Crafted from 8 dead bush surrounding a piece of flint. Behaves like flint and steel for fire/campfire/candle lighting but only has 16 durability. Pair it with the Drying Rack's saplings-to-dead-bush recipe for a renewable fire-starter loop.

Animal Trap Details

Data-driven recipes (horsepowered:trapping)

Pack makers add their own bait → entity mappings at data/<ns>/recipe/trapping/*.json. Recipe fields:

  • bait — Ingredient (required)
  • entity — entity type ResourceLocation (required)
  • time — minimum wait in ticks before the dice roll begins (default 1200)
  • priority — sort order in recipe viewers (default 0, lowest displays first)
  • biome — optional biome tag the trap must sit inside before the dice roll counts
  • waterlogged — optional boolean; when true the trap must be waterlogged before the dice roll counts

When biome or waterlogged conditions are not met the bait stays, the timer keeps running, and Jade shows "Wrong biome" or "Needs water" in red so you know to relocate or waterlog the trap.

Built-in recipes

Animal Bait Wait Extra conditions
Cow Wheat 60s
Pig Carrot 60s
Sheep Short Grass 60s
Chicken Wheat Seeds 45s
Rabbit Dandelion 75s
Goat Apple 75s
Mooshroom Red Mushroom 90s
Strider Nether Wart 90s Biome: #minecraft:is_nether
Salmon Kelp 75s Biome: #horsepowered:fish_habitat, waterlogged

The horsepowered:fish_habitat biome tag bundles #minecraft:is_river, #minecraft:is_ocean, and #minecraft:is_deep_ocean, so it works for future fish recipes too.

Recipe Viewer Improvements

  • Trapping category added to JEI and EMI showing the bait, the trap as the catalyst, and the captured animal's spawn egg as the result. Each recipe lists the minimum wait, "5% Chance/sec" after, and any biome or waterlogged gate.
  • Drying Rack cross-fade: during the last 30% of a drying recipe the input item smoothly fades out as the output fades in, instead of snapping at completion. Fade is partial-tick interpolated for buttery smoothness.

Visual / Rendering Fixes

  • JEI count text now renders: GuiGraphicsExtractor.text() in 1.21.x silently drops text when the color's alpha byte is zero. All Horse Powered JEI categories used 0x808080 (alpha 0) for the strike/chop/turn/hunger labels, so those lines never showed up. Switched to 0xFF808080 across every category so the counts and hunger costs actually display.
  • Granite Anvil swing animation: right-clicking the anvil to crush now plays the player's arm-swing animation. The original useItemOn gated InteractionResult.SUCCESS behind a client-side canWork() check that always returned false (recipe lookup requires ServerLevel), so the client never predicted a successful interaction and skipped the swing. Now the swing is triggered explicitly on the server.

Jade Improvements

  • Granite Anvil tooltip: now shows input/output items and remaining strikes when looking at the block, matching the Drying Rack's progress display.
  • Animal Trap tooltip: shows bait/drops, "Trapping... Xs", "Trap set", "Caught: ⟨entity⟩", and "Next drop: 2:30" countdown that ticks down live via a server-data provider. Red warnings appear when bait is loaded but biome or waterlogged conditions aren't satisfied.

Datapack / API

  • horsepowered:trapping recipe type — see Animal Trap Details above for fields.
  • horsepowered:fish_habitat biome tag — aggregates rivers + oceans + deep oceans for waterlogged-fish recipes.
  • Trap drops use the captured entity's vanilla loot table with LootContextParams.DAMAGE_SOURCE = damageSources().generic(), giving raw drops (e.g. raw porkchop, not cooked).
  • Trap state is preserved across mining via DataComponents.BLOCK_ENTITY_DATA, so the dropped item carries the captured entity NBT + inventory contents.

Sneaky Bug Fixes Worth Calling Out

  • Drying rack progress no longer steps in 50 ms chunks: the renderer's progress ratio now interpolates with partialTick, and the BE has a client-side ticker that advances progress[slot] per client tick (with a defensive if (!level.isClientSide) return; guard so it can never run on the server).
  • Trap drops actually go into the trap inventory (caught during this release): an early version of depositDrop routed through ItemStackHandler.insertItem which short-circuits on isItemValid — drop slots returned false to keep hoppers out of them, so loot was falling out the top of the trap. Now uses a direct two-pass setStackInSlot merge that bypasses the validity check while still keeping hoppers locked out of insertion via the public isItemValid contract.
  • Trap drops can be hopper-extracted (caught during this release): the Capabilities.ItemHandler.BLOCK capability was never registered for the trap BE, so hoppers couldn't see the inventory at all. Now wired in HorsePowerMod.registerCapabilities.