5 min

Movement & Speed

Control player physics: speed, jump height, gravity, and more through MovementSettings packets.

MovementSettings

Player movement is controlled via the UpdateMovementSettings packet. Start with default settings and modify the values you need.

thread safe
Sending packets is thread-safe. You don't need world.execute() for movement changes.

Basic Speed Control

1private void setPlayerSpeed(Player player, float multiplier) {
2 // Get default movement settings
3 MovementSettings settings = MovementConfig.DEFAULT_MOVEMENT.toPacket();
4
5 // Apply multiplier to all speed-related fields
6 settings.baseSpeed *= multiplier;
7 settings.forwardWalkSpeedMultiplier *= multiplier;
8 settings.backwardWalkSpeedMultiplier *= multiplier;
9 settings.strafeWalkSpeedMultiplier *= multiplier;
10 settings.sprintSpeedMultiplier *= multiplier;
11
12 // Send to player
13 UpdateMovementSettings packet = new UpdateMovementSettings(settings);
14 player.getPlayerConnection().write(packet);
15}

Movement Fields

fielddescriptiondefault
baseSpeedBase movement speed~5.0
forwardWalkSpeedMultiplierForward walking1.0
backwardWalkSpeedMultiplierBackward walking0.8
strafeWalkSpeedMultiplierSide movement0.9
sprintSpeedMultiplierSprint modifier1.3
jumpForceVertical jump power~8.0
gravityDownward force~-28.0
airControlMovement control in air0.5

Common Modifications

Speed Boost

1public void applySpeedBoost(Player player, float multiplier, int durationTicks) {
2 setPlayerSpeed(player, multiplier);
3
4 // Schedule reset
5 player.getWorld().execute(() -> {
6 player.getWorld().schedule(durationTicks, () -> {
7 setPlayerSpeed(player, 1.0f); // Reset to normal
8 });
9 });
10}

Super Jump

1public void enableSuperJump(Player player, float multiplier) {
2 MovementSettings settings = MovementConfig.DEFAULT_MOVEMENT.toPacket();
3
4 settings.jumpForce *= multiplier;
5
6 // Optional: reduce fall damage by lowering gravity
7 settings.gravity *= 0.8f;
8
9 player.getPlayerConnection().write(new UpdateMovementSettings(settings));
10}

No Gravity (Flying Effect)

1public void enableFloating(Player player) {
2 MovementSettings settings = MovementConfig.DEFAULT_MOVEMENT.toPacket();
3
4 // Reduce gravity significantly
5 settings.gravity = -2.0f; // Very low gravity
6
7 // Increase air control for better flight feel
8 settings.airControl = 1.0f;
9
10 player.getPlayerConnection().write(new UpdateMovementSettings(settings));
11}

Slow Motion

1public void applySlowMotion(Player player) {
2 MovementSettings settings = MovementConfig.DEFAULT_MOVEMENT.toPacket();
3
4 // Slow everything down
5 float slowFactor = 0.3f;
6
7 settings.baseSpeed *= slowFactor;
8 settings.forwardWalkSpeedMultiplier *= slowFactor;
9 settings.backwardWalkSpeedMultiplier *= slowFactor;
10 settings.strafeWalkSpeedMultiplier *= slowFactor;
11 settings.sprintSpeedMultiplier *= slowFactor;
12 settings.jumpForce *= slowFactor;
13 settings.gravity *= slowFactor;
14
15 player.getPlayerConnection().write(new UpdateMovementSettings(settings));
16}

Reset Movement

1public void resetMovement(Player player) {
2 // Simply send default settings
3 MovementSettings settings = MovementConfig.DEFAULT_MOVEMENT.toPacket();
4 player.getPlayerConnection().write(new UpdateMovementSettings(settings));
5}

Movement Manager Example

MovementManager.javajava
1public class MovementManager {
2
3 private final Map customSettings = new HashMap<>();
4
5 public void setSpeed(Player player, float multiplier) {
6 MovementSettings settings = getOrCreateSettings(player);
7
8 settings.baseSpeed = getDefault().baseSpeed * multiplier;
9 settings.forwardWalkSpeedMultiplier = getDefault().forwardWalkSpeedMultiplier * multiplier;
10 // ... other speed fields
11
12 apply(player, settings);
13 }
14
15 public void setJump(Player player, float multiplier) {
16 MovementSettings settings = getOrCreateSettings(player);
17 settings.jumpForce = getDefault().jumpForce * multiplier;
18 apply(player, settings);
19 }
20
21 public void setGravity(Player player, float multiplier) {
22 MovementSettings settings = getOrCreateSettings(player);
23 settings.gravity = getDefault().gravity * multiplier;
24 apply(player, settings);
25 }
26
27 public void reset(Player player) {
28 customSettings.remove(player.getUuid());
29 apply(player, getDefault());
30 }
31
32 private MovementSettings getOrCreateSettings(Player player) {
33 return customSettings.computeIfAbsent(
34 player.getUuid(),
35 k -> MovementConfig.DEFAULT_MOVEMENT.toPacket()
36 );
37 }
38
39 private MovementSettings getDefault() {
40 return MovementConfig.DEFAULT_MOVEMENT.toPacket();
41 }
42
43 private void apply(Player player, MovementSettings settings) {
44 player.getPlayerConnection().write(new UpdateMovementSettings(settings));
45 }
46}

Best Practices

do
Always store custom settings per-player to allow partial modifications.
do
Reset movement on player disconnect to prevent stale state.
avoid
Extreme values can cause physics glitches or client instability.