mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-13 15:25:08 +01:00
- Update to 1.20.4 - Touch can now be used in controller mode (especially nice on Steam Deck) - Added option to choose between camera modes (Flat vs. Adaptive, addresses #232) - Fixed broken button binding (#235)
104 lines
3.5 KiB
Java
104 lines
3.5 KiB
Java
/*
|
|
* Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
|
|
*
|
|
* This file is part of midnightcontrols.
|
|
*
|
|
* Licensed under the MIT license. For more information,
|
|
* see the LICENSE file.
|
|
*/
|
|
|
|
package eu.midnightdust.midnightcontrols.client.controller;
|
|
|
|
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
|
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|
import eu.midnightdust.midnightcontrols.client.util.MathUtil;
|
|
import net.minecraft.client.MinecraftClient;
|
|
import net.minecraft.client.network.ClientPlayerEntity;
|
|
import net.minecraft.enchantment.EnchantmentHelper;
|
|
import net.minecraft.util.math.MathHelper;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
/**
|
|
* Represents the movement handler.
|
|
*
|
|
* @author LambdAurora
|
|
* @version 1.6.0
|
|
* @since 1.4.0
|
|
*/
|
|
public final class MovementHandler implements PressAction {
|
|
public static final MovementHandler HANDLER = new MovementHandler();
|
|
private boolean shouldOverrideMovement = false;
|
|
private boolean pressingForward = false;
|
|
private boolean pressingBack = false;
|
|
private boolean pressingLeft = false;
|
|
private boolean pressingRight = false;
|
|
private float slowdownFactor = 1.f;
|
|
private float movementForward = 0.f;
|
|
private float movementSideways = 0.f;
|
|
private MathUtil.PolarUtil polarUtil = new MathUtil.PolarUtil();
|
|
|
|
private MovementHandler() {
|
|
}
|
|
|
|
/**
|
|
* Applies movement input of this handler to the player's input.
|
|
*
|
|
* @param player The client player.
|
|
*/
|
|
public void applyMovement(@NotNull ClientPlayerEntity player) {
|
|
if (!this.shouldOverrideMovement)
|
|
return;
|
|
player.input.pressingForward = this.pressingForward;
|
|
player.input.pressingBack = this.pressingBack;
|
|
player.input.pressingLeft = this.pressingLeft;
|
|
player.input.pressingRight = this.pressingRight;
|
|
|
|
polarUtil.calculate(this.movementSideways, this.movementForward, this.slowdownFactor);
|
|
player.input.movementForward = polarUtil.polarY;
|
|
player.input.movementSideways = polarUtil.polarX;
|
|
|
|
this.shouldOverrideMovement = false;
|
|
}
|
|
|
|
@Override
|
|
public boolean press(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action) {
|
|
if (client.currentScreen != null || client.player == null)
|
|
return this.shouldOverrideMovement = false;
|
|
|
|
int direction = 0;
|
|
if (button == ButtonBinding.FORWARD || button == ButtonBinding.LEFT)
|
|
direction = 1;
|
|
else if (button == ButtonBinding.BACK || button == ButtonBinding.RIGHT)
|
|
direction = -1;
|
|
|
|
if (action.isUnpressed())
|
|
direction = 0;
|
|
|
|
this.shouldOverrideMovement = direction != 0;
|
|
|
|
if (!MidnightControlsConfig.analogMovement) {
|
|
value = 1.f;
|
|
}
|
|
|
|
this.slowdownFactor = client.player.shouldSlowDown() ? (MathHelper.clamp(
|
|
0.3F + EnchantmentHelper.getSwiftSneakSpeedBoost(client.player),
|
|
0.0F,
|
|
1.0F
|
|
)) : 1.f;
|
|
|
|
if (button == ButtonBinding.FORWARD || button == ButtonBinding.BACK) {
|
|
// Handle forward movement.
|
|
this.pressingForward = direction > 0;
|
|
this.pressingBack = direction < 0;
|
|
this.movementForward = direction * value;
|
|
} else {
|
|
// Handle sideways movement.
|
|
this.pressingLeft = direction > 0;
|
|
this.pressingRight = direction < 0;
|
|
this.movementSideways = direction * value;
|
|
}
|
|
|
|
return this.shouldOverrideMovement;
|
|
}
|
|
}
|