Skip to content

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

Iron Jetpack Kit recipe

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.