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 settings3 MovementSettings settings = MovementConfig.DEFAULT_MOVEMENT.toPacket();4 5 // Apply multiplier to all speed-related fields6 settings.baseSpeed *= multiplier;7 settings.forwardWalkSpeedMultiplier *= multiplier;8 settings.backwardWalkSpeedMultiplier *= multiplier;9 settings.strafeWalkSpeedMultiplier *= multiplier;10 settings.sprintSpeedMultiplier *= multiplier;11 12 // Send to player13 UpdateMovementSettings packet = new UpdateMovementSettings(settings);14 player.getPlayerConnection().write(packet);15}Movement Fields
| field | description | default |
|---|---|---|
| baseSpeed | Base movement speed | ~5.0 |
| forwardWalkSpeedMultiplier | Forward walking | 1.0 |
| backwardWalkSpeedMultiplier | Backward walking | 0.8 |
| strafeWalkSpeedMultiplier | Side movement | 0.9 |
| sprintSpeedMultiplier | Sprint modifier | 1.3 |
| jumpForce | Vertical jump power | ~8.0 |
| gravity | Downward force | ~-28.0 |
| airControl | Movement control in air | 0.5 |
Common Modifications
Speed Boost
1public void applySpeedBoost(Player player, float multiplier, int durationTicks) {2 setPlayerSpeed(player, multiplier);3 4 // Schedule reset5 player.getWorld().execute(() -> {6 player.getWorld().schedule(durationTicks, () -> {7 setPlayerSpeed(player, 1.0f); // Reset to normal8 });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 gravity7 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 significantly5 settings.gravity = -2.0f; // Very low gravity6 7 // Increase air control for better flight feel8 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 down5 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 settings3 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 fields11 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.