BetterMoving is a client-only Fabric mod for Minecraft 1.20.1. It provides configurable movement overrides through a MaLiLib configuration screen, including fluid movement, a momentum-reset hotkey, invisible platforms, simulated potion effects, client-side Riptide, boat speed, and Elytra firework controls. It also includes continuous air jumping and camera steering, strafing, and jumping for locally driven boats.
Current release: 1.14.8 for Minecraft 1.20.1.
Download the installable JAR from GitHub Releases, or build it using the instructions below.
Version 1.14.8 adds Continuous air jumping. It removes the local player's
jump cooldown and permits repeated jumps in midair, including real and
simulated Jump Boost effects.
English option names and descriptions also follow the updated Chinese wording,
including the Level Elytra flight option for hovering without propulsion.
Install BetterMoving only on the client. It changes local movement prediction, not server rules. Servers can reject or correct movement, and server-side damage and item consumption remain authoritative.
- Minecraft 1.20.1
- Fabric Loader 0.15.11 or newer
- Fabric API 0.92.2 or newer for Minecraft 1.20.1
- MaLiLib 0.16.x
- Java 17 or newer
Mod Menu is optional. When installed, its BetterMoving configuration button opens the MaLiLib screen. The configuration hotkey works without Mod Menu.
- Install Fabric Loader for Minecraft 1.20.1.
- Place compatible Fabric API and MaLiLib JARs in the instance's
modsfolder. - Download bettermoving-1.14.8.jar
and place it in the same
modsfolder. - Optionally install Mod Menu, then launch Minecraft.
The -sources.jar is for source inspection.
Do not install the sources JAR as a mod.
Open the configuration screen with L + C, or use the BetterMoving button in
Mod Menu. The Open configuration screen hotkey can be rebound in MaLiLib.
All feature toggles are disabled and have no hotkey assigned by default.
Each toggle supports a configurable hotkey. Movement model defaults to
Air rules; all three simulated potion levels default to 0 and accept
integers from 0 to Integer.MAX_VALUE. The model and level settings do not
have hotkeys.
Settings are saved in config/bettermoving.json. If that file does not exist,
BetterMoving imports config/fluidair.json, when available, and saves the
settings under the current name.
Reset momentum is an action hotkey with no on/off toggle. Press it to set
the local player's X, Y, and Z velocity to zero once, whether walking,
sprinting, falling, swimming, flying, using Riptide, or gliding with an Elytra.
Holding the key does not repeat the action; release and press again for another
reset. If an Elytra glide is active, the same press also ends that glide,
including local gliding while Ignore levitation and slowness is enabled.
It does not change position, fall distance, or other movement states. Normal
gravity and movement input continue afterward. Elytra fireworks cannot boost
while gliding is stopped. Simulated rockets are also removed if both
Infinite fireworks and Cancel Elytra fireworks on glide stop are
enabled. Otherwise, a rocket that has not expired can boost again if a new
glide starts before its lifetime ends.
The option appears directly below Open configuration screen and is unbound
by default. Its advanced defaults are: activation on PRESS, context INGAME,
allow empty bindings false, allow extra keys false, order sensitive true,
exclusive false, and cancel further processing true. By default, only the
bound keys may be held when the action is pressed. Enable Allow extra keys
in the advanced settings to also use it while other movement keys are held.
It does not trigger in a GUI or when no player is present. The action changes
only local velocity and glide state and sends no dedicated packet; normal
movement synchronization still applies.
Enable Ignore fluid physics, then select a Movement model:
Air rulestreats water, lava, and bubble columns as air for local movement. Walk, sprint, jump, fall, and use an Elytra without fluid drag, swimming slowdown, or bubble-column forces.Water rulestreats those fluids as ordinary water. This includes swimming poses and sprint-swimming in lava and bubble columns, without bubble-column lift or downward drag.
The model applies only while Ignore fluid physics is enabled. Fluid
rendering, breathing, fire, damage, underwater vision, and other non-movement
behavior continue to use the real world state.
Virtual platform records the local player's feet height when enabled and
adds an invisible movement-only floor at that height. Walk, sprint, sneak,
jump, and land on it like ordinary ground; it is not creative flight.
Locally driven boats, chest boats, and bamboo rafts also collide with this floor and can slide or paddle across it. Enabling the option while driving records the hull's bottom height instead of the passenger's feet height. Boarding or leaving a boat does not change an existing platform's height. Empty boats and boats driven by other entities remain unaffected.
Toggle the option off and on to record a different height. Respawning, reconnecting, or changing dimension also captures a fresh height.
Boat noclip lets the boat controlled by the local player pass through real
block collision shapes, including walls, floors, and ceilings. Gravity still
applies: without a virtual platform, the boat can fall through real ground.
With Virtual platform enabled, the hull lands on its recorded height and can
slide or paddle through walls without falling through the platform. The
platform keeps its existing height when the player boards or leaves the boat.
The toggle is disabled and unbound by default and supports a hotkey. It works
with boats, chest boats, bamboo rafts, and Simulate boat target speed.
Disabling it or leaving the driver's seat immediately restores normal block
collisions. Empty boats, remote drivers, local second passengers, and players
on foot retain their normal collisions. Entity collisions, the world border,
world blocks, rendering, interactions, and server-side physics remain unchanged.
Servers can still correct the boat's movement.
Boat camera steering keeps the yaw of a boat driven by the local player
aligned with the player's camera yaw. Turning the camera steers the boat
without requiring A/D input, while ordinary paddle movement and other boat
physics continue to run normally. The setting is disabled and unbound by
default and supports a hotkey.
Only the local driver's boat is affected. Remote drivers, passengers, empty boats, and players on foot retain vanilla behavior. The setting changes local client movement and rotation; server-side physics and corrections remain unchanged.
Enable Boat strafing and jumping together with Boat camera steering to
use player-like controls while driving a boat. The toggle is disabled and
unbound by default and supports a configurable hotkey.
A/D strafe left and right relative to the camera without turning the boat or
the player's view. Strafing uses the same propulsion and surface drag as
forward paddling. With Simulate boat target speed enabled, strafing uses
the configured target speed too. Forward diagonals are normalized to avoid
an extra speed boost; opposite inputs cancel. Reverse retains its vanilla
propulsion proportion. Real and simulated Speed effects do not affect boat
movement.
Hold Jump (Space by default) to jump from ordinary ground, Virtual platform,
or the water surface. The boat uses the player's jump velocity, gravity, and
vertical damping, lands normally, and can jump again while the key remains
held. Real Jump Boost and Simulated jump boost level affect jump height,
including the existing potion-override setting. Jumping does not enable
midair flight; ceilings and ordinary collisions still stop the boat unless
Boat noclip is enabled.
Boats, chest boats, and bamboo rafts are supported. The feature requires the local player to be the driver. Disabling either toggle restores ordinary boat controls. Empty boats, remote drivers, local second passengers, and server-side physics are unaffected; normal server movement corrections still apply.
Enable Simulate boat target speed and set Simulated boat target speed (m/s)
to adjust the horizontal equilibrium speed while continuously paddling forward.
The value defaults to 8 m/s, accepts 0 to Double.MAX_VALUE, and is
converted to meters per tick using V / 20, like the Elytra firework target
speed setting. The toggle defaults to off and supports an optional hotkey.
Paddle acceleration accounts for the current surface drag, so the configured
forward target applies on water, ordinary ground, ice, and Virtual platform.
The boat accelerates toward the target instead of teleporting or changing its
position directly. Steering and paddle animations remain normal. Reverse and
turn-only paddling keep their vanilla speed proportions; reverse reaches
one eighth of the forward target. Releasing the controls preserves ordinary
coasting and surface drag. Gravity, buoyancy, and collisions still apply.
At 0, paddling adds no horizontal acceleration; existing momentum still
decays normally. Disabling the toggle immediately restores vanilla paddle
acceleration. The feature supports boats, chest boats, and bamboo rafts driven
by the local player. Empty boats, remotely driven boats, and server-side
physics are unaffected. Normal movement and paddle synchronization continue.
Void protection platform adds an invisible movement-only floor at the
current world's void damage boundary:
world.getBottomY() - 64This is the boundary below which vanilla applies void damage, not the minimum build height itself. The platform stops local downward movement at that boundary. Its height is recalculated for each player and world, including dimensions with different minimum build heights.
Virtual platform affects movement collision for the local player and boats
they drive. Void protection platform affects only local-player movement
collision. Neither creates world blocks, renders a platform, changes raycasts
or interaction targets, or affects unrelated entities. Void protection platform and
Virtual platform are independent and can be enabled together. Void
protection does not cancel damage or change the server's position checks.
Virtual platform collision is excluded from local block-breaking speed checks. When the player is supported only by the virtual platform, mining keeps vanilla's in-air penalty; a real block below the player still provides the normal ground mining speed.
Ignore sprint hunger allows normal client-side sprinting at food level 6 or
below. It changes only the food check in ClientPlayerEntity.canSprint().
Actual food, saturation, movement speed, and other sprint requirements are
unchanged.
Ignore slippery blocks treats ice and other blocks with above-normal
slipperiness as ordinary blocks during local-player movement. It does not
change block states, rendering, interactions, or other entities.
Simulate Riptide anywhere simulates Riptide-enchanted trident use for the
local player in any environment, including dry air and water. By default,
both hands use vanilla charging: releasing after at least 10 ticks applies
the normal enchantment-dependent impulse, ground lift, sound, and 20-tick
spin. Shorter charges do not launch the player. Vanilla cooldown and
durability checks still apply.
Enable Custom Riptide charge time together with Simulate Riptide anywhere
to replace the minimum charge requirement with Riptide charge time (ticks).
The duration defaults to 10 and accepts any integer from 0 to
Integer.MAX_VALUE (2,147,483,647) ticks. At 0, starting use and releasing
immediately launches the player. Longer values require holding the trident
for at least that many ticks before release; there is no automatic launch.
The elapsed charge timer saturates at Integer.MAX_VALUE to avoid overflow.
The custom-charge toggle is disabled and unbound by default and supports a
hotkey. It appears directly below Simulate Riptide anywhere, while
Riptide charge time (ticks) appears at the bottom of the configuration
screen and has no hotkey. With either toggle disabled, the vanilla 10-tick
requirement applies. Only the simulated local Riptide charge is changed:
impulse strength, ground lift, and spin duration remain vanilla, and ordinary
tridents and other players retain their charge rules.
Simulated use sends neither an item-use packet nor a release-use packet and does not consume trident durability. Aiming at an ordinary block also skips the unused block-use fallback packet; accepted container and other block interactions retain their normal behavior. Disabling the option or changing the held item cancels an in-progress local charge. Incoming server status updates do not interrupt a valid local charge.
The toggle is disabled and unbound by default and works independently of
Ignore fluid physics, including both movement models. Tridents without
Riptide retain vanilla throwing and packets. Other players and server-side
combat remain unchanged; servers can still correct the simulated movement.
Continuous air jumping removes the local player's jump cooldown and allows
another jump before landing. Hold Jump to jump upward every tick; release it
to resume normal falling, or press it again to jump while falling. Each jump
uses the vanilla jump velocity and retains ordinary horizontal movement.
Real Jump Boost and Simulated jump boost level apply through the existing
jump calculation, including Override existing potion effects. Speed effects
do not increase jump height. The toggle is disabled and unbound by default.
Only jump eligibility changes: the player is not marked as standing on ground,
and airborne mining penalties and normal block collisions are preserved.
Swimming, riding, creative flight, Elytra gliding, and active Riptide keep their
existing movement rules. With Ignore fluid physics set to Air rules,
air jumping also works inside fluids; Water rules retains swimming.
Enable Simulate potion effects to use the configured potion levels in
local-player movement calculations. No real status effects, particles, HUD
icons, or server-side effects are added.
| Setting | Movement behavior |
|---|---|
Simulated speed potion level |
Uses the vanilla Speed multiplier: 1 + 0.2 * level. |
Simulated jump boost level |
Uses the vanilla Jump Boost formula, adding 0.1 * level to jump velocity. |
Simulated dolphin's grace level |
Enables vanilla Dolphin's Grace water movement at any level above 0; vanilla does not scale it with the amplifier. |
Level 0 represents no simulated effect. With
Override existing potion effects disabled, stronger existing Speed and
Jump Boost levels and any existing Dolphin's Grace effect are preserved.
With that toggle enabled, the configured levels replace the corresponding
real effects for movement calculations, including a configured level of 0.
The override applies only while Simulate potion effects is enabled.
Ignore levitation and slowness controls both movement overrides:
- Levitation does not add vertical motion or block Elytra activation and gliding.
- Slowness does not reduce local movement speed. Other attribute modifiers continue to apply.
Real effects remain active for particles, icons, and non-movement behavior. While real Levitation is present, BetterMoving can retain a started local Elytra flight when the server clears its gliding flag. This does not enable server-side gliding or bypass movement validation.
The local flight override ends on landing, riding, creative flight, climbing, death, water movement, missing or unusable Elytra, an explicit flight stop, disconnecting, disabling the option, or removal of Levitation. Air-rule fluid movement and local firework boosts remain compatible.
Level Elytra flight stops the local player in midair whenever an
Elytra glide has no active propulsion. It immediately clears X, Y, and Z
velocity and suppresses inertial gliding, level flight, and falling while
keeping the glide active. Looking around or holding movement keys does not
cause drift. A new firework boost or Riptide launch resumes ordinary movement;
when all attached rockets and Riptide propulsion have ended, the player
stops again. Turning the option off restores normal gliding.
Both ordinary attached rockets and Infinite fireworks are supported,
including custom simulated firework lifetimes and overlapping rockets. An
active boost permits movement even when its speed has reached equilibrium.
Free-flying fireworks and rockets attached to other players do not count.
Riptide propulsion follows the actual spin timer, including simulated Riptide
with Custom Riptide charge time; charging alone or releasing too early
does not interrupt hovering. Walking, jumping, ordinary falling, creative
flight, and other players are unaffected. The option is disabled and unbound
by default and supports a hotkey.
Infinite fireworks simulates a firework rocket while the local player
is gliding, applying vanilla acceleration without sending the item-use packet
or consuming a rocket on the server. The client-side rocket expires after its
normal lifetime. This option does not create rockets outside Elytra flight.
Elytra firework block use routes firework use on a block or wall to an Elytra
boost while gliding, instead of launching a rocket from the block. With
Infinite fireworks enabled, the boost is simulated without rocket
consumption. Otherwise, vanilla item-use packets and rocket consumption are
preserved.
Block non-Elytra firework use blocks firework launches from blocks or walls
unless the player is gliding with Elytra firework block use enabled. It
blocks only the actual launch path: accepted workbench and container
interactions still work, and entity interactions are unaffected. Sneaking
past a block's normal interaction is blocked if it would launch a rocket.
Cancel Elytra fireworks on glide stop removes client-only simulated rockets
when the local player stops gliding, but only while Infinite fireworks
is enabled. It also handles glide state changes received through tracked entity
data, so a canceled glide cannot leave an old simulated rocket to accelerate a
later glide. The setting is disabled and unbound by default.
A blocked launch sends no interaction packet, consumes no rocket, creates no rocket entity, and does not swing the hand. Aiming at air is unaffected. These firework options are independent, hotkey-capable toggles.
Simulate Elytra firework target speed adjusts the local Elytra firework
acceleration toward a configurable equilibrium speed. The companion
Simulated Elytra firework target speed (m/s) value is expressed in meters per
second and is converted to per-tick speed with v_t = V / 20. For example,
40 targets 2.0 meters per tick. Values from 0 through the Java double
maximum (Double.MAX_VALUE) are accepted. The default value is 64 m/s
(3.2 meters per tick). The toggle is disabled and unbound by default. The
setting only changes the local player's Elytra firework propulsion and leaves
vanilla behavior unchanged while disabled.
Custom Elytra firework lifetime replaces the boost duration for Elytra
fireworks with Flight 1, 2, or 3 using the corresponding tick value. Flight
levels 0 and 4 or higher, non-Elytra launches, and rockets while the option is
disabled retain their vanilla lifetime. The Flight 1, 2, and 3 values accept
any non-negative int value up to Integer.MAX_VALUE ticks. It also applies
to rockets created by Infinite fireworks; rocket consumption behavior
is unchanged. The toggle is disabled and unbound by default, and all three
values default to 0 ticks.
Build the mod, run unit tests, and compile the client compatibility suite:
./gradlew build compatTestClassesOn Windows, use gradlew.bat instead of ./gradlew. The installable JAR is
build/libs/bettermoving-1.14.8.jar; the -sources.jar is for source
inspection only.
Run the disposable client compatibility suite:
./gradlew runClient \
-PbettermovingCompatTest \
-PbettermovingMovementCompatTest \
-PbettermovingPlatformCompatTest \
-PbettermovingBoatSpeedCompatTest \
-PbettermovingBoatCollisionCompatTest \
-PbettermovingBoatPlayerControlsCompatTest \
-PbettermovingSprintCompatTest \
-PbettermovingSlipperinessCompatTest \
-PbettermovingPotionEffectsCompatTest \
-PbettermovingAirJumpCompatTest \
-PbettermovingElytraFireworksCompatTest \
-PbettermovingRiptideCompatTest \
-PbettermovingMomentumCompatTest \
-PbettermovingElytraHoverCompatTestAdd -PbettermovingModMenuTest to include optional Mod Menu integration.
Add -PbettermovingLithiumTest to run with Lithium 0.11.3. To use an already
downloaded official JAR, also pass -PbettermovingLithiumJar=path/to/lithium.jar.
Lithium is only a test dependency and is not required by BetterMoving. Run
the platform, boat speed, and boat noclip checks both with and without it when
changing movement collisions.
The suite covers configuration persistence, fluid models, both platforms,
sprint restrictions, slippery-block friction, simulated potion formulas,
Levitation and Slowness overrides, Elytra firework behavior, local Riptide,
the momentum-reset hotkey, virtual-platform mining-speed isolation,
unpowered Elytra hovering, and continuous air jumping. Air jump checks cover
consecutive real movement ticks, release and re-press, live toggles, real and
simulated Jump Boost, effect overrides, Speed isolation, fluid models, ground
and mining state, riding and flight isolation, hotkey persistence, and server
isolation. Platform checks also cover all boat and chest boat
variants, sliding and paddling, mounted activation, fixed heights across
boarding and dismounting, toggling, and remote-driver and server isolation.
Boat speed checks measure real per-tick displacement and equilibrium on water, stone, ice, blue ice, and virtual platforms. They also cover all boat and chest boat variants, reverse and steering inputs, gravity, coasting, zero and maximum targets, live toggling, settings persistence, and client/server isolation.
Boat camera steering checks verify camera-following yaw, live view changes, disabled behavior, local-driver activation, and configuration persistence.
Boat player-control checks compare A/D propulsion with forward paddling on water, stone, ice, blue ice, and virtual platforms, with and without custom boat speed. They cover camera-relative movement, all boat and chest boat variants, normalized diagonals, opposite inputs, Speed isolation, real and simulated Jump Boost, player jump curves, takeoff and landing, held Jump, ceilings, live toggles, settings persistence, and client/server isolation.
Boat noclip checks exercise real movement through thick walls, floors, and ceilings for every boat and chest boat variant. They verify virtual-platform landing and sliding, natural falling, ordinary and custom-speed paddling, preserved entity and world border collisions, toggle and hotkey persistence, driver changes, empty boats, local passengers, players on foot, general world collision queries, and integrated-server isolation.
Hover checks cover sustained XYZ stops at different pitch angles, propulsion restart, ordinary and simulated rocket removal, default and custom lifetimes, overlapping propulsion, target-speed equilibrium, glide-stop cancellation, entity ID changes, network spawn/metadata/removal, local firework packet suppression, both Riptide hands, custom charge boundaries through the integer maximum, spin expiration and collision, stale spin metadata, hotkey persistence, and player/toggle isolation.
Momentum checks exercise real MaLiLib press, hold, repeat, and release handling, all three velocity axes, movement states, default and customized key sharing, GUI and unbound isolation, remote-player isolation, settings persistence, and resumed gravity after the single reset. They also verify Elytra glide stopping, including retained local flight during Levitation, and simulated-firework cancellation with default and custom lifetimes.
Flight checks reproduce integrated-server Levitation rejection and verify local gliding, stopping conditions, remote-player isolation, fluid models, and firework acceleration. Firework checks cover both hands in Creative and Survival, block and entity interactions, sneaking fallbacks, outgoing packets, and block prediction cleanup.
Riptide checks cover both hands, Creative and Survival, vanilla and custom charge thresholds (including zero and the integer maximum), timer saturation, toggle isolation, impulse levels, ground lift, natural ticking and spin poses, spin expiration and collision, server status updates, cancellation, cooldown and durability restrictions, water and fluid-model compatibility, outgoing packets, accepted block and entity interactions, and vanilla behavior for unenchanted tridents and remote players.
BetterMoving is licensed under the MIT License. See LICENSE.