forked from Clones/Controlify
rewrite player look input to feel more bedrock-y
This commit is contained in:
@ -5,14 +5,13 @@ import dev.isxander.controlify.InputMode;
|
|||||||
import dev.isxander.controlify.controller.Controller;
|
import dev.isxander.controlify.controller.Controller;
|
||||||
import dev.isxander.controlify.event.ControlifyEvents;
|
import dev.isxander.controlify.event.ControlifyEvents;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.player.Input;
|
|
||||||
import net.minecraft.client.player.KeyboardInput;
|
import net.minecraft.client.player.KeyboardInput;
|
||||||
|
|
||||||
public class InGameInputHandler {
|
public class InGameInputHandler {
|
||||||
private final Controller controller;
|
private final Controller controller;
|
||||||
private final Minecraft minecraft;
|
private final Minecraft minecraft;
|
||||||
|
|
||||||
private double accumulatedDX, accumulatedDY;
|
private double lookInputX, lookInputY;
|
||||||
private double deltaTime;
|
private double deltaTime;
|
||||||
|
|
||||||
public InGameInputHandler(Controller controller) {
|
public InGameInputHandler(Controller controller) {
|
||||||
@ -56,39 +55,15 @@ public class InGameInputHandler {
|
|||||||
protected void handlePlayerLookInput() {
|
protected void handlePlayerLookInput() {
|
||||||
var axes = controller.state().axes();
|
var axes = controller.state().axes();
|
||||||
if (minecraft.mouseHandler.isMouseGrabbed() && minecraft.isWindowActive()) {
|
if (minecraft.mouseHandler.isMouseGrabbed() && minecraft.isWindowActive()) {
|
||||||
accumulatedDX += axes.rightStickX() * Math.abs(axes.rightStickX());
|
lookInputX = axes.rightStickX() * Math.abs(axes.rightStickX()) * controller.config().horizontalLookSensitivity;
|
||||||
accumulatedDY += axes.rightStickY() * Math.abs(axes.rightStickY());
|
lookInputY = axes.rightStickY() * Math.abs(axes.rightStickY()) * controller.config().verticalLookSensitivity;
|
||||||
}
|
}
|
||||||
|
|
||||||
processPlayerLook();
|
processPlayerLook(1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processPlayerLook() {
|
public void processPlayerLook(float deltaTime) {
|
||||||
var time = Blaze3D.getTime();
|
|
||||||
var delta = time - deltaTime;
|
|
||||||
deltaTime = time;
|
|
||||||
|
|
||||||
var hsensitivity = controller.config().horizontalLookSensitivity * 9.6 + 2.0;
|
|
||||||
var hsensCubed = hsensitivity * hsensitivity * hsensitivity;
|
|
||||||
var vsensitivity = controller.config().verticalLookSensitivity * 9.6 + 2.0;
|
|
||||||
var vsensCubed = vsensitivity * vsensitivity * vsensitivity;
|
|
||||||
|
|
||||||
var dx = accumulatedDX * delta;
|
|
||||||
var dy = accumulatedDY * delta;
|
|
||||||
|
|
||||||
// drag
|
|
||||||
if (accumulatedDX > 0) {
|
|
||||||
accumulatedDX -= Math.min(dx * 20, accumulatedDX);
|
|
||||||
} else if (accumulatedDX < 0) {
|
|
||||||
accumulatedDX -= Math.max(dx * 20, accumulatedDX);
|
|
||||||
}
|
|
||||||
if (accumulatedDY > 0) {
|
|
||||||
accumulatedDY -= Math.min(dy * 20, accumulatedDY);
|
|
||||||
} else if (accumulatedDY < 0) {
|
|
||||||
accumulatedDY -= Math.max(dy * 20, accumulatedDY);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (minecraft.player != null)
|
if (minecraft.player != null)
|
||||||
minecraft.player.turn(dx * hsensCubed, dy * vsensCubed);
|
minecraft.player.turn(lookInputX * 15f * deltaTime, lookInputY * 15f * deltaTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
public abstract class MinecraftMixin {
|
public abstract class MinecraftMixin {
|
||||||
@Shadow public abstract void setScreen(@Nullable Screen screen);
|
@Shadow public abstract void setScreen(@Nullable Screen screen);
|
||||||
|
|
||||||
|
@Shadow public abstract float getDeltaFrameTime();
|
||||||
|
|
||||||
|
@Shadow public abstract float getFrameTime();
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/KeyboardHandler;setup(J)V", shift = At.Shift.AFTER))
|
@Inject(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/KeyboardHandler;setup(J)V", shift = At.Shift.AFTER))
|
||||||
private void onInputInitialized(CallbackInfo ci) {
|
private void onInputInitialized(CallbackInfo ci) {
|
||||||
Controlify.instance().onInitializeInput();
|
Controlify.instance().onInitializeInput();
|
||||||
@ -23,7 +27,7 @@ public abstract class MinecraftMixin {
|
|||||||
|
|
||||||
@Inject(method = "runTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;turnPlayer()V"))
|
@Inject(method = "runTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;turnPlayer()V"))
|
||||||
private void doPlayerLook(boolean tick, CallbackInfo ci) {
|
private void doPlayerLook(boolean tick, CallbackInfo ci) {
|
||||||
Controlify.instance().inGameInputHandler().processPlayerLook();
|
Controlify.instance().inGameInputHandler().processPlayerLook(getFrameTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("TAIL"))
|
@Inject(method = "<init>", at = @At("TAIL"))
|
||||||
|
Reference in New Issue
Block a user