Jetpacks¶
The ra_jetpacks module adds upgrade kits that fit onto any chestplate. The
chestplate keeps its material, its durability and its enchantments; the kit only
writes components onto it.
- Namespace:
ra_jetpacks - Give all:
/function ra_jetpacks:items/give_all - Mode switch:
/trigger ra.jp.mode - Engine sound on/off:
/trigger ra.jp.sound - Whole jetpack on/off:
/trigger ra.jp.power
Kits¶
| Kit | Obtained | Fuel |
|---|---|---|
| Iron Jetpack Kit | Crafted — blaze rod, iron ingots, a redstone block and a coal block | 1 coal (or charcoal) per 2 minutes of flight |
| Infinite Iron Jetpack Kit | Sacrifice an Iron Jetpack Kit on an enchanting table, 10% per kit — see Enchant Crafting | none |

Both are minecraft:firework_star rendered as an elytra. Right-click while
wearing a chestplate to fit the jetpack; the kit is consumed. The iron kit
refuses to overwrite a chestplate that is already a jetpack, the infinite kit
deliberately does not — that is how you upgrade in place.
Flight modes¶
Switch with /trigger ra.jp.mode. The mode is per player, not per jetpack.
Classic¶
Hold sneak to rise, three blocks a second. Smoke, flame and the engine loop just below your feet once you are off the ground, and gravity behaves normally the moment you let go — which is why classic never feels floaty.
Hover¶
The jetpack carries your weight while the chestplate is worn — let go of everything and you hang in the air, on the spot.
| Input | Result |
|---|---|
| Sneak + look up (pitch ≤ -30) | Rise, three blocks a second |
| Sneak + look down (pitch ≥ 30) | Sink — gravity is handed back with slow falling on top, so the descent is capped and costs no fall damage |
| Sneak + look level | Hold |
| No sneak | Hold |
| Standing on a block | Thrusters idle, vanilla physics |
| Touching down after a flight | Jetpack switches itself off |
A block under the feet (unless block ~ ~-0.1 ~ #minecraft:air) means the
thrusters have nothing to hold up, so they stop: walking around with gravity
switched off feels wrong. Sneak plus look up is exempt from that check, which is
how you lift off in the first place.
Landing is different from standing. Once the player has actually been airborne
— tracked in ra.jp.air — touching down runs the same function
/trigger ra.jp.power runs: gravity back, action bar, click. Flight resumes when
you ask for it, not by accident. Standing there deliberately does not switch the
jetpack off; an earlier version did, and it turned itself off the tick after hover
was selected, so there was never an armed jetpack to take off with.
The dead zone between -30 and +30 is wide on purpose: a narrow one flipped state every time you glanced around, and each flip resets your velocity.
The thrusters wash campfire smoke downward the whole time hover is on — they are holding your weight even when you are standing still — and throw out more of it, harder, whenever you are climbing or sinking. No end rods: white streaks read as glitched geometry rather than exhaust.
Sinking is deliberately not levitation. The amplifier-255 trick that used to
read back as -1 no longer wraps — the amplifier is stored as an integer, so 255
means 255 and throws the player upward at about twelve blocks a second. That was
the "look down, shoot up" bug.
Holding station is a servo¶
Zero gravity on its own is what made hover feel like ice: nothing damps vertical
motion except vanilla's 2%-per-tick drag, so releasing sneak left you coasting
for well over a second. There is no command that clears a player's velocity
either — an in-place /tp used to, but MC-275455
was fixed in the 1.21.2 snapshots and relative teleports now keep motion, so that
whole trick is dead.
So hold measures speed and pushes back. Each tick the player's Pos[1] is
sampled into ra.jp.y, the difference is vertical speed in thousandths of a
block per tick, and the gravity attribute is aimed against it:
| Vertical speed | Gravity applied | Effect |
|---|---|---|
| within ±0.006 b/t | 0 |
free hover, dead zone |
| ±0.006 to ±0.06 b/t | ∓0.02 |
gentle correction |
| beyond ±0.06 b/t | ∓0.08 |
full thruster |
Player gravity has a base of 0.08, so an add_value of -0.08 is exactly
zero, -0.16 is a full upward thruster and 0.0 leaves gravity untouched. A
levitation coast is 0.15 b/t and dies in two ticks; the dead zone keeps the
tiers from flapping, so there is no visible bob. The modifier is only rewritten
when the tier changes.
Climbing skips the servo — levitation sets velocity itself.
Horizontal movement still feels lighter than walking, and that part is vanilla: airborne players accelerate at a flat 0.02 no matter what their speed attribute says, and hover keeps you permanently airborne.
Gravity comes back as soon as the chestplate comes off, the mode is switched, or the jetpack runs out of fuel.
Fuel¶
Only the iron tier burns anything, and only on ticks where the jetpack is holding
the player's weight: classic thrust, and hover holding or climbing. Sinking in
hover mode is free. After 2400 such ticks one minecraft:coal is taken from the
inventory, falling back to minecraft:charcoal.
With neither in the inventory the jetpack cuts out: gravity returns, an action bar message says so, and it stays off until you pick up coal again.
Engine sound¶
The engine is minecraft:item.elytra.flying at volume 0.35, pitch 0.6, replayed
once a second. One sound, one volume — hovering, climbing, sinking and classic
thrust all sound the same, because in every one of them the thrusters are carrying
the player.
It runs while the jetpack is holding you up and stops the moment it isn't:
| Path | Engine |
|---|---|
| Hover, airborne (hold, climb, sink) | running |
| Hover, feet on a block | stopped |
| Classic, sneaking and airborne | running |
| Classic, sneak released | stopped |
| Chestplate off, out of fuel, switched off, muted | stopped |
Two functions, and that is the whole logic: flight/sound keeps the loop alive,
flight/sound_off kills it. The sample is long, so sound_off runs stopsound —
without it the last copy played on for seconds after the jetpack cut out, which is
why classic kept humming after sneak was released. sound also stops before every
replay, so copies never stack. ra.jp.sound_on marks that a loop is playing, so
sound_off is a no-op when nothing is.
stopsound covers everyone within 20 blocks, since they are the ones being played
to; two players flying together can clip each other's loop for a moment before it is
replayed.
/trigger ra.jp.sound mutes and unmutes it per player. The particles stay.
Switching the jetpack off¶
/trigger ra.jp.power disables the jetpack outright for that player: no hover, no
sneak thrust, no fuel burn, no particles, no sound, in either mode. Gravity comes
back the same tick. The chestplate keeps its components, so nothing has to be
re-fitted — run the trigger again and flight is back. Useful when you want to
sneak for the ordinary reasons.
Sneaking speed¶
Both modes fly by holding sneak, and sneaking normally costs 70% of walking
speed. A worn jetpack adds 0.7 to minecraft:sneaking_speed (base 0.3),
which puts crouch movement back at full walking pace for as long as the
chestplate is on. The modifier is ra.jetpack.sneak, removed the moment the
jetpack comes off.
Scoreboards and tags¶
| Name | Meaning |
|---|---|
ra.jp.mode |
Trigger objective players use to request a mode switch |
ra.jp.sound |
Trigger objective for muting the engine loop |
ra.jp.mute |
1 while that player's engine loop is muted |
ra.jp.power |
Trigger objective for the master switch |
ra.jp.off |
1 while that player's jetpack is switched off |
ra.jp.snd |
Engine-loop timer, one play a second |
ra.jp.sound_on |
An engine loop is currently playing |
ra.jp.air |
1 once the player has left the ground, so a landing can be spotted |
ra.jp.y |
Last sampled Y, in thousandths of a block |
ra.jp.grav |
Thruster tier currently written onto the gravity attribute |
ra.jp.state |
0 classic, 1 hover |
ra.jp.fuel |
Ticks of powered flight since the last coal |
ra.jetpack_on |
Player is currently wearing a jetpack |
ra.jp.hover_on |
The gravity modifier is applied |
ra.jp.dry |
Out of fuel; flight is suspended |
ra.jp.speed_on |
The sneaking-speed modifier is applied |
The gravity modifier is ra.jetpack.hover on minecraft:gravity, always
add_value, rewritten by ra_jetpacks:flight/gravity when the thruster tier
changes. Base player gravity is 0.08, so the values run from -0.16 (full
thrust up) through -0.08 (weightless) to 0.0 (vanilla fall). Do not reach for
add_multiplied_total: an earlier version used -1.0 there to hit zero, which
works but cannot express a thruster at all.