Skip to content

About

This project modifies some of the original movement behaviors to improve them. It is a client-side-only mod that stays very true to the vanilla experience.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Repository files navigation

BetterMoving

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.

Requirements

  • 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.

Installation

  1. Install Fabric Loader for Minecraft 1.20.1.
  2. Place compatible Fabric API and MaLiLib JARs in the instance's mods folder.
  3. Download bettermoving-1.14.8.jar and place it in the same mods folder.
  4. Optionally install Mod Menu, then launch Minecraft.

The -sources.jar is for source inspection. Do not install the sources JAR as a mod.

Configuration

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.

Features

Reset momentum

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.

Fluid movement

Enable Ignore fluid physics, then select a Movement model:

  • Air rules treats 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 rules treats 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

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

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

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.

Boat strafing and jumping

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.

Boat target speed

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

Void protection platform adds an invisible movement-only floor at the current world's void damage boundary:

world.getBottomY() - 64

This 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.

Sprint hunger override

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.

Slippery blocks

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.

Riptide anywhere

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

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.

Simulated potion effects

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.

Levitation and slowness

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.

Elytra hovering

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.

Elytra fireworks

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.

Building and testing

Build the mod, run unit tests, and compile the client compatibility suite:

./gradlew build compatTestClasses

On 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 \
  -PbettermovingElytraHoverCompatTest

Add -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.

License

BetterMoving is licensed under the MIT License. See LICENSE.

About

This project modifies some of the original movement behaviors to improve them. It is a client-side-only mod that stays very true to the vanilla experience.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages