From 202ff888beb504f286dec80377aafd54ac3c6045 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Thu, 18 Jul 2024 19:16:36 +0200 Subject: [PATCH] Fix broken Touchscreen behavior --- common/build.gradle | 2 +- .../client/MidnightControlsClient.java | 7 +- .../client/MidnightInput.java | 163 +++++++++--------- .../client/controller/InputHandlers.java | 2 +- .../client/gui/MidnightControlsHud.java | 5 +- .../client/mixin/KeyboardMixin.java | 2 +- .../client/mixin/MinecraftClientMixin.java | 7 +- .../client/mixin/MouseMixin.java | 2 +- .../client/mixin/ScreenMixin.java | 2 +- .../client/touch/TouchInput.java | 4 +- .../client/touch/TouchUtils.java | 7 +- .../{ => touch}/gui/TouchscreenOverlay.java | 30 ++-- fabric/build.gradle | 2 +- .../fabric/MidnightControlsClientFabric.java | 5 - gradle.properties | 2 +- neoforge/build.gradle | 2 +- .../MidnightControlsClientNeoforge.java | 5 - 17 files changed, 126 insertions(+), 123 deletions(-) rename common/src/main/java/eu/midnightdust/midnightcontrols/client/{ => touch}/gui/TouchscreenOverlay.java (94%) diff --git a/common/build.gradle b/common/build.gradle index ed8171e..b4def6c 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -29,7 +29,7 @@ dependencies { // Using the Fabric version of midnightlib here to create a common config and get useful utilities // Just make sure NOT to use classes from the .fabric classpath modCompileOnlyApi "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric" - modCompileOnlyApi "maven.modrinth:obsidianui:${project.obsidianui_version}-fabric" + modCompileOnlyApi "maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric" include 'org.aperlambda:lambdajcommon:1.8.1' modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") { exclude(group: "net.fabricmc.fabric-api") diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index 36f5805..d0d9344 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -21,7 +21,7 @@ import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsHud; import eu.midnightdust.midnightcontrols.client.gui.RingScreen; -import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay; +import eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay; import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor; import eu.midnightdust.midnightcontrols.client.ring.ButtonBindingRingAction; import eu.midnightdust.midnightcontrols.client.ring.MidnightRing; @@ -41,7 +41,10 @@ import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; import java.io.File; -import java.util.*; +import java.util.Objects; +import java.util.Optional; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.atomic.AtomicReference; /** diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index d138520..73d82f6 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -23,7 +23,7 @@ import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; import eu.midnightdust.midnightcontrols.client.enums.CameraMode; import eu.midnightdust.midnightcontrols.client.gui.RingScreen; -import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay; +import eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay; import eu.midnightdust.midnightcontrols.client.gui.widget.ControllerControlsWidget; import eu.midnightdust.midnightcontrols.client.mixin.*; import eu.midnightdust.midnightcontrols.client.ring.RingPage; @@ -60,6 +60,7 @@ import org.lwjgl.glfw.GLFWGamepadState; import java.util.*; +import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client; import static org.lwjgl.glfw.GLFW.*; /** @@ -467,28 +468,28 @@ public class MidnightInput { }); } - private void handleAxe(@NotNull MinecraftClient client, AxisStorage axisStorage) { - setCurrentPolarities(axisStorage); + private void handleAxe(@NotNull MinecraftClient client, AxisStorage storage) { + setCurrentPolarities(storage); - handleMovement(client, axisStorage); + handleMovement(client, storage); - if (handleScreenScrolling(client.currentScreen, axisStorage)) return; + if (handleScreenScrolling(client.currentScreen, storage)) return; - axisStorage.absValue = (float) MathHelper.clamp(axisStorage.absValue / MidnightControlsConfig.getAxisMaxValue(axisStorage.axis), 0.f, 1.f); + storage.absValue = (float) MathHelper.clamp(storage.absValue / MidnightControlsConfig.getAxisMaxValue(storage.axis), 0.f, 1.f); if (client.currentScreen == null) { // Handles the look direction. - this.handleLook(client, axisStorage); + this.handleLook(client, storage); } else { boolean allowMouseControl = true; - if (this.actionGuiCooldown == 0 && MidnightControlsConfig.isMovementAxis(axisStorage.axis) && isScreenInteractive(client.currentScreen)) { - if (MidnightControlsConfig.isForwardButton(axisStorage.axis, false, axisStorage.asButtonState)) { + if (this.actionGuiCooldown == 0 && MidnightControlsConfig.isMovementAxis(storage.axis) && isScreenInteractive(client.currentScreen)) { + if (MidnightControlsConfig.isForwardButton(storage.axis, false, storage.asButtonState)) { allowMouseControl = this.changeFocus(client.currentScreen, NavigationDirection.UP); - } else if (MidnightControlsConfig.isBackButton(axisStorage.axis, false, axisStorage.asButtonState)) { + } else if (MidnightControlsConfig.isBackButton(storage.axis, false, storage.asButtonState)) { allowMouseControl = this.changeFocus(client.currentScreen, NavigationDirection.DOWN); - } else if (MidnightControlsConfig.isLeftButton(axisStorage.axis, false, axisStorage.asButtonState)) { + } else if (MidnightControlsConfig.isLeftButton(storage.axis, false, storage.asButtonState)) { allowMouseControl = this.handleLeftRight(client.currentScreen, false); - } else if (MidnightControlsConfig.isRightButton(axisStorage.axis, false, axisStorage.asButtonState)) { + } else if (MidnightControlsConfig.isRightButton(storage.axis, false, storage.asButtonState)) { allowMouseControl = this.handleLeftRight(client.currentScreen, true); } } @@ -496,14 +497,14 @@ public class MidnightInput { float movementX = 0.f; float movementY = 0.f; - if (MidnightControlsConfig.isBackButton(axisStorage.axis, false, (axisStorage.value > 0 ? 1 : 2))) { - movementY = axisStorage.absValue; - } else if (MidnightControlsConfig.isForwardButton(axisStorage.axis, false, (axisStorage.value > 0 ? 1 : 2))) { - movementY = -axisStorage.absValue; - } else if (MidnightControlsConfig.isLeftButton(axisStorage.axis, false, (axisStorage.value > 0 ? 1 : 2))) { - movementX = -axisStorage.absValue; - } else if (MidnightControlsConfig.isRightButton(axisStorage.axis, false, (axisStorage.value > 0 ? 1 : 2))) { - movementX = axisStorage.absValue; + if (MidnightControlsConfig.isBackButton(storage.axis, false, (storage.value > 0 ? 1 : 2))) { + movementY = storage.absValue; + } else if (MidnightControlsConfig.isForwardButton(storage.axis, false, (storage.value > 0 ? 1 : 2))) { + movementY = -storage.absValue; + } else if (MidnightControlsConfig.isLeftButton(storage.axis, false, (storage.value > 0 ? 1 : 2))) { + movementX = -storage.absValue; + } else if (MidnightControlsConfig.isRightButton(storage.axis, false, (storage.value > 0 ? 1 : 2))) { + movementX = storage.absValue; } if (client.currentScreen != null && allowMouseControl) { @@ -513,7 +514,7 @@ public class MidnightInput { Updates the target mouse position when the initial movement stick movement is detected. It prevents the cursor to jump to the old target mouse position if the user moves the cursor with the mouse. */ - if (Math.abs(prevXAxis) < axisStorage.deadZone && Math.abs(prevYAxis) < axisStorage.deadZone) { + if (Math.abs(prevXAxis) < storage.deadZone && Math.abs(prevYAxis) < storage.deadZone) { InputManager.INPUT_MANAGER.resetMouseTarget(client); } @@ -538,16 +539,16 @@ public class MidnightInput { this.prevYAxis = movementY; } } - private void setCurrentPolarities(AxisStorage axisStorage) { - boolean currentPlusState = axisStorage.value > axisStorage.deadZone; - boolean currentMinusState = axisStorage.value < -axisStorage.deadZone; - if (axisStorage.axis == GLFW_GAMEPAD_AXIS_LEFT_TRIGGER || axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER) currentMinusState = false; - if (!MidnightControlsConfig.analogMovement && (axisStorage.axis == GLFW_GAMEPAD_AXIS_LEFT_X || axisStorage.axis == GLFW_GAMEPAD_AXIS_LEFT_Y)) { - currentPlusState = axisStorage.asButtonState == 1; - currentMinusState = axisStorage.asButtonState == 2; + private void setCurrentPolarities(AxisStorage storage) { + boolean currentPlusState = storage.value > storage.deadZone; + boolean currentMinusState = storage.value < -storage.deadZone; + if (storage.axis == GLFW_GAMEPAD_AXIS_LEFT_TRIGGER || storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER) currentMinusState = false; + if (!MidnightControlsConfig.analogMovement && (storage.axis == GLFW_GAMEPAD_AXIS_LEFT_X || storage.axis == GLFW_GAMEPAD_AXIS_LEFT_Y)) { + currentPlusState = storage.asButtonState == 1; + currentMinusState = storage.asButtonState == 2; } - var posButton = ButtonBinding.axisAsButton(axisStorage.axis, true); - var negButton = ButtonBinding.axisAsButton(axisStorage.axis, false); + var posButton = ButtonBinding.axisAsButton(storage.axis, true); + var negButton = ButtonBinding.axisAsButton(storage.axis, false); var previousPlusState = InputManager.STATES.getOrDefault(posButton, ButtonState.NONE); var previousMinusState = InputManager.STATES.getOrDefault(negButton, ButtonState.NONE); @@ -572,32 +573,32 @@ public class MidnightInput { BUTTON_COOLDOWNS.put(negButton, 5); } } - axisStorage.polarity = currentPlusState ? AxisStorage.Polarity.PLUS : currentMinusState ? AxisStorage.Polarity.MINUS : AxisStorage.Polarity.ZERO; + storage.polarity = currentPlusState ? AxisStorage.Polarity.PLUS : currentMinusState ? AxisStorage.Polarity.MINUS : AxisStorage.Polarity.ZERO; } - private void handleMovement(@NotNull MinecraftClient client, AxisStorage axisStorage) { - float axisValue = axisStorage.absValue; + private void handleMovement(@NotNull MinecraftClient client, AxisStorage storage) { + float axisValue = storage.absValue; if (!MidnightControlsConfig.analogMovement || (client.player != null && client.player.getVehicle() instanceof BoatEntity)) { - axisValue = (float) (axisStorage.absValue - axisStorage.deadZone); - axisValue /= (float) (1.0 - axisStorage.deadZone); - axisValue *= (float) axisStorage.deadZone; + axisValue = (float) (storage.absValue - storage.deadZone); + axisValue /= (float) (1.0 - storage.deadZone); + axisValue *= (float) storage.deadZone; } - axisValue = (float) Math.min(axisValue / MidnightControlsConfig.getAxisMaxValue(axisStorage.axis), 1); - InputManager.BUTTON_VALUES.put(ButtonBinding.axisAsButton(axisStorage.axis, true), axisStorage.polarity == AxisStorage.Polarity.PLUS ? axisValue : 0.f); - InputManager.BUTTON_VALUES.put(ButtonBinding.axisAsButton(axisStorage.axis, false), axisStorage.polarity == AxisStorage.Polarity.MINUS ? axisValue : 0.f); + axisValue = (float) Math.min(axisValue / MidnightControlsConfig.getAxisMaxValue(storage.axis), 1); + InputManager.BUTTON_VALUES.put(ButtonBinding.axisAsButton(storage.axis, true), storage.polarity == AxisStorage.Polarity.PLUS ? axisValue : 0.f); + InputManager.BUTTON_VALUES.put(ButtonBinding.axisAsButton(storage.axis, false), storage.polarity == AxisStorage.Polarity.MINUS ? axisValue : 0.f); } - private boolean handleScreenScrolling(Screen screen, AxisStorage axisStorage) { - if (axisStorage.axis > GLFW_GAMEPAD_AXIS_RIGHT_Y) return false; + private boolean handleScreenScrolling(Screen screen, AxisStorage storage) { + if (storage.axis > GLFW_GAMEPAD_AXIS_RIGHT_Y) return false; // @TODO allow rebinding to left stick int preferredAxis = true ? GLFW_GAMEPAD_AXIS_RIGHT_Y : GLFW_GAMEPAD_AXIS_LEFT_Y; if (this.controlsInput != null && this.controlsInput.focusedBinding != null) { - if (axisStorage.asButtonState != 0 && !this.controlsInput.currentButtons.contains(ButtonBinding.axisAsButton(axisStorage.axis, axisStorage.asButtonState == 1))) { + if (storage.asButtonState != 0 && !this.controlsInput.currentButtons.contains(ButtonBinding.axisAsButton(storage.axis, storage.asButtonState == 1))) { - this.controlsInput.currentButtons.add(ButtonBinding.axisAsButton(axisStorage.axis, axisStorage.asButtonState == 1)); + this.controlsInput.currentButtons.add(ButtonBinding.axisAsButton(storage.axis, storage.asButtonState == 1)); int[] buttons = new int[this.controlsInput.currentButtons.size()]; for (int i = 0; i < this.controlsInput.currentButtons.size(); i++) @@ -607,39 +608,39 @@ public class MidnightInput { this.controlsInput.waiting = false; } return true; - } else if (axisStorage.absValue >= axisStorage.deadZone) { + } else if (storage.absValue >= storage.deadZone) { if (screen instanceof CreativeInventoryScreen creativeInventoryScreen) { - if (axisStorage.axis == preferredAxis) { + if (storage.axis == preferredAxis) { var accessor = (CreativeInventoryScreenAccessor) creativeInventoryScreen; - if (accessor.midnightcontrols$hasScrollbar() && axisStorage.absValue >= axisStorage.deadZone) { - creativeInventoryScreen.mouseScrolled(0.0, 0.0, 0, -axisStorage.value); + if (accessor.midnightcontrols$hasScrollbar() && storage.absValue >= storage.deadZone) { + creativeInventoryScreen.mouseScrolled(0.0, 0.0, 0, -storage.value); } return true; } } else if (screen instanceof MerchantScreen || screen instanceof StonecutterScreen) { - if (axisStorage.axis == preferredAxis) { - screen.mouseScrolled(0.0, 0.0, 0, -(axisStorage.value * 1.5f)); + if (storage.axis == preferredAxis) { + screen.mouseScrolled(0.0, 0.0, 0, -(storage.value * 1.5f)); return true; } } else if (screen instanceof AdvancementsScreen advancementsScreen) { - if (axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_X || axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) { + if (storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_X || storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) { var accessor = (AdvancementsScreenAccessor) advancementsScreen; AdvancementTab tab = accessor.getSelectedTab(); - tab.move(axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_X ? -axisStorage.value * 5.0 : 0.0, axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y ? -axisStorage.value * 5.0 : 0.0); + tab.move(storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_X ? -storage.value * 5.0 : 0.0, storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y ? -storage.value * 5.0 : 0.0); return true; } } else if (screen != null) { - if (axisStorage.axis == preferredAxis && !handleListWidgetScrolling(screen.children(), axisStorage.value)) { - screen.mouseScrolled(0.0, 0.0, 0, -(axisStorage.value * 1.5f)); + if (storage.axis == preferredAxis && !handleListWidgetScrolling(screen.children(), storage.value)) { + screen.mouseScrolled(0.0, 0.0, 0, -(storage.value * 1.5f)); } else if (isScreenInteractive(screen)) { if (joystickCooldown == 0) { - switch (axisStorage.axis) { + switch (storage.axis) { case GLFW_GAMEPAD_AXIS_LEFT_Y -> { - this.changeFocus(screen, axisStorage.value > 0 ? NavigationDirection.UP : NavigationDirection.DOWN); + this.changeFocus(screen, storage.value > 0 ? NavigationDirection.UP : NavigationDirection.DOWN); joystickCooldown = 4; } case GLFW_GAMEPAD_AXIS_LEFT_X -> { - this.handleLeftRight(screen, axisStorage.value > 0); + this.handleLeftRight(screen, storage.value > 0); joystickCooldown = 4; } } @@ -765,38 +766,38 @@ public class MidnightInput { * Handles the look direction input. * * @param client the client instance - * @param axisStorage the state of the provided axis + * @param storage the state of the provided axis */ - public void handleLook(@NotNull MinecraftClient client, AxisStorage axisStorage) { - if (client.player == null || !(axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y || axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_X)) return; + public void handleLook(@NotNull MinecraftClient client, AxisStorage storage) { + if (client.player == null || !(storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y || storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_X)) return; // Handles the look direction. - if (MidnightControlsConfig.cameraMode == CameraMode.FLAT) { - double powValue = Math.pow(axisStorage.value, 2.0); - if (axisStorage.polarity != AxisStorage.Polarity.ZERO) { - double constant = powValue * 0.11D * (axisStorage.polarity == AxisStorage.Polarity.MINUS ? -1 : 1); - double sign = (axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) ? MidnightControlsConfig.getRightYAxisSign() * MidnightControlsConfig.yAxisRotationSpeed : MidnightControlsConfig.getRightXAxisSign() * MidnightControlsConfig.rotationSpeed; + if (MidnightControlsConfig.cameraMode == CameraMode.FLAT) handleFlatLook(storage); + else handleAdaptiveLook(storage); + + } + public void handleFlatLook(AxisStorage storage) { + if (storage.state != 0) { + double powValue = Math.pow(storage.value, 2.0) * (storage.state == 2 ? -1 : 1); + double rotation = (storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) ? MidnightControlsConfig.getRightYAxisSign() * MidnightControlsConfig.yAxisRotationSpeed : MidnightControlsConfig.getRightXAxisSign() * MidnightControlsConfig.rotationSpeed * powValue * 0.11D; - if (axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) this.targetPitch = sign * constant; - else this.targetYaw = sign * constant; - } - return; + if (storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) this.targetPitch = rotation; + else this.targetYaw = rotation; } - // Code below runs for adaptive camera mode - - // Handles the look direction. - if (axisStorage.axis == GLFW_GAMEPAD_AXIS_RIGHT_X) { - xValue = axisStorage.value; - xState = axisStorage.state; + } + public void handleAdaptiveLook(AxisStorage storage) { + if (storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_X) { + xValue = storage.value; + xState = storage.state; } else { double yStep = (MidnightControlsConfig.yAxisRotationSpeed / 100) * 0.6000000238418579 + 0.20000000298023224; double xStep = (MidnightControlsConfig.rotationSpeed / 100) * 0.6000000238418579 + 0.20000000298023224; - float yValue = axisStorage.value; - float yState = axisStorage.state; + float yValue = storage.value; + float yState = storage.state; double cursorDeltaX = 2 * xValue - this.prevX; double cursorDeltaY = 2 * yValue - this.prevY; - boolean slowdown = client.options.getPerspective().isFirstPerson() && client.player.isUsingSpyglass(); + boolean slowdown = client.options.getPerspective().isFirstPerson() && Objects.requireNonNull(client.player).isUsingSpyglass(); double x = cursorDeltaX * xStep * (slowdown ? xStep : 1); double y = cursorDeltaY * yStep * (slowdown ? yStep : 1); @@ -816,6 +817,14 @@ public class MidnightInput { this.prevX = xValue; } } + public void handleTouchscreenLook(AxisStorage storage) { + if (storage.state != 0) { + double rotation = storage.value * 0.11D * MidnightControlsConfig.touchSpeed/5; + + if (storage.axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) this.targetPitch = rotation; + else this.targetYaw = rotation; + } + } private boolean changeFocus(@NotNull Screen screen, NavigationDirection direction) { if (!isScreenInteractive(screen) && !screen.getClass().getCanonicalName().contains("me.jellysquid.mods.sodium.client.gui")) return false; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java index 1b41baa..f758e7c 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -16,7 +16,7 @@ import eu.midnightdust.midnightcontrols.client.MidnightInput; import eu.midnightdust.midnightcontrols.client.compat.InventoryTabsCompat; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.gui.RingScreen; -import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay; +import eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay; import eu.midnightdust.midnightcontrols.client.mixin.*; import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor; import eu.midnightdust.midnightcontrols.client.util.InventoryUtil; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java index e031111..a6ad812 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java @@ -16,6 +16,7 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; +import net.minecraft.client.render.RenderTickCounter; import org.thinkingstudio.obsidianui.hud.Hud; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; @@ -78,7 +79,7 @@ public class MidnightControlsHud extends Hud { * Renders the MidnightControls HUD. */ @Override - public void render(DrawContext context, float tickDelta) { + public void render(DrawContext context, RenderTickCounter tickCounter) { if (this.client == null) return; if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && this.client.currentScreen == null) { isCrammed = client.getWindow().getScaledWidth() < 520; @@ -97,7 +98,7 @@ public class MidnightControlsHud extends Hud { var window = this.client.getWindow(); var text = "[ ]"; - float scale = Math.min(5, this.ticksDisplayedCrosshair + tickDelta) / 5F; + float scale = Math.min(5, this.ticksDisplayedCrosshair + tickCounter.getTickDelta(true)) / 5F; scale *= scale; int opacity = ((int) (255 * scale)) << 24; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyboardMixin.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyboardMixin.java index 7bc6a2e..1911508 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyboardMixin.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyboardMixin.java @@ -1,6 +1,6 @@ package eu.midnightdust.midnightcontrols.client.mixin; -import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay; +import eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay; import net.minecraft.client.Keyboard; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java index 759917f..d4313bf 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java @@ -13,6 +13,7 @@ import com.llamalad7.mixinextras.sugar.Local; import eu.midnightdust.midnightcontrols.MidnightControlsFeature; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.network.ClientPlayerEntity; @@ -36,7 +37,6 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.reacharound; @@ -52,6 +52,8 @@ public abstract class MinecraftClientMixin { @Shadow private int itemUseCooldown; + @Shadow public abstract void setScreen(Screen screen); + @Unique private BlockPos midnightcontrols$lastTargetPos; @Unique private Vec3d midnightcontrols$lastPos; @Unique private Direction midnightcontrols$lastTargetSide; @@ -104,9 +106,10 @@ public abstract class MinecraftClientMixin { @Inject(at = @At("TAIL"), method = "setScreen") private void setScreen(Screen screen, CallbackInfo info) { if (MidnightControlsConfig.hideNormalMouse){ - if (screen != null) GLFW.glfwSetInputMode(MinecraftClient.getInstance().getWindow().getHandle(), GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_HIDDEN); + if (screen != null && !(screen instanceof TouchscreenOverlay)) GLFW.glfwSetInputMode(MinecraftClient.getInstance().getWindow().getHandle(), GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_HIDDEN); else GLFW.glfwSetInputMode(MinecraftClient.getInstance().getWindow().getHandle(), GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_DISABLED); } + MidnightControlsClient.onScreenOpen(screen); } @Inject(method = "doItemUse()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/hit/HitResult;getType()Lnet/minecraft/util/hit/HitResult$Type;"), cancellable = true) diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MouseMixin.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MouseMixin.java index d163ec1..e85c577 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MouseMixin.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MouseMixin.java @@ -12,7 +12,7 @@ package eu.midnightdust.midnightcontrols.client.mixin; import eu.midnightdust.midnightcontrols.ControlsMode; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; -import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay; +import eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay; import eu.midnightdust.midnightcontrols.client.touch.TouchInput; import eu.midnightdust.midnightcontrols.client.touch.TouchUtils; import net.minecraft.client.MinecraftClient; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ScreenMixin.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ScreenMixin.java index f74f3de..bcee069 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ScreenMixin.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ScreenMixin.java @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay.WIDGETS_LOCATION; +import static eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay.WIDGETS_LOCATION; @Mixin(Screen.class) public abstract class ScreenMixin { diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/TouchInput.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/TouchInput.java index 4ee5195..975a8e2 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/TouchInput.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/TouchInput.java @@ -1,7 +1,7 @@ package eu.midnightdust.midnightcontrols.client.touch; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; -import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay; +import eu.midnightdust.midnightcontrols.client.touch.gui.TouchscreenOverlay; import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.item.ItemStack; @@ -18,6 +18,7 @@ public class TouchInput { private static final MinecraftClient client = MinecraftClient.getInstance(); public static long clickStartTime; public static HitResult firstHitResult = null; + public static boolean isDragging = false; public static void tick() { if ((client.currentScreen == null && doMixedInput()) || client.currentScreen instanceof TouchscreenOverlay) { @@ -58,6 +59,7 @@ public class TouchInput { } } public static boolean mouseReleased(double mouseX, double mouseY, int button) { + isDragging = false; firstHitResult = null; if (client.interactionManager != null) client.interactionManager.cancelBlockBreaking(); if ((client.currentScreen == null || !client.currentScreen.mouseReleased(mouseX, mouseY, button)) && System.currentTimeMillis() - clickStartTime < MidnightControlsConfig.touchBreakDelay) { diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/TouchUtils.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/TouchUtils.java index 3cb8114..aae6bfe 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/TouchUtils.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/TouchUtils.java @@ -32,13 +32,15 @@ public class TouchUtils { } Vec3d near = screenSpaceToWorldSpace(mouseX, mouseY, 0); Vec3d far = screenSpaceToWorldSpace(mouseX, mouseY, 1); - EntityHitResult entityCast = ProjectileUtil.raycast(client.player, near, far, Box.from(client.player.getPos()).expand(getPlayerRange(client)), entity -> (!entity.isSpectator() && entity.isAttackable()), getPlayerRange(client) * getPlayerRange(client)); + + float playerRange = getPlayerRange(client); + EntityHitResult entityCast = ProjectileUtil.raycast(client.player, near, far, Box.from(client.player.getPos()).expand(playerRange), entity -> (!entity.isSpectator() && entity.isAttackable()), playerRange * playerRange); if (entityCast != null && entityCast.getType() == HitResult.Type.ENTITY) return entityCast; BlockHitResult result = client.world.raycast(new RaycastContext(near, far, RaycastContext.ShapeType.OUTLINE, RaycastContext.FluidHandling.ANY, client.player)); - if (client.player.getPos().distanceTo(result.getPos()) > getPlayerRange(client)) return null; + if (client.player.getPos().distanceTo(result.getPos()) > playerRange) return null; return result; } @@ -62,6 +64,7 @@ public class TouchUtils { return new Vec3d(target.x, target.y, target.z).add(camera.getPos()); } + public static boolean hasInWorldUseAction(ItemStack stack) { UseAction action = stack.getUseAction(); return action == UseAction.BOW || action == UseAction.BRUSH || action == UseAction.SPEAR; diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/gui/TouchscreenOverlay.java similarity index 94% rename from common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java rename to common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/gui/TouchscreenOverlay.java index 3e42bde..7224bf1 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/touch/gui/TouchscreenOverlay.java @@ -7,8 +7,9 @@ * see the LICENSE file. */ -package eu.midnightdust.midnightcontrols.client.gui; +package eu.midnightdust.midnightcontrols.client.touch.gui; +import eu.midnightdust.midnightcontrols.client.touch.TouchInput; import eu.midnightdust.midnightcontrols.client.util.storage.AxisStorage; import org.thinkingstudio.obsidianui.Position; import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget; @@ -20,8 +21,6 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.InputManager; -import eu.midnightdust.midnightcontrols.client.touch.gui.ItemUseButtonWidget; -import eu.midnightdust.midnightcontrols.client.touch.gui.SilentTexturedButtonWidget; import eu.midnightdust.midnightcontrols.client.touch.TouchUtils; import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor; import net.minecraft.client.gui.DrawContext; @@ -82,10 +81,7 @@ public class TouchscreenOverlay extends Screen { } @Override - public void renderInGameBackground(DrawContext context) {} - - @Override - protected void applyBlur(float delta) {} + public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) {} private void pauseGame() { assert this.client != null; @@ -346,12 +342,15 @@ public class TouchscreenOverlay extends Screen { @Override public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) { - if (!MidnightControlsConfig.invertTouch) { - deltaX = -deltaX; - deltaY = -deltaY; + if (TouchInput.isDragging) { + if (!MidnightControlsConfig.invertTouch) { + deltaX = -deltaX; + deltaY = -deltaY; + } + input.handleTouchscreenLook(new AxisStorage(GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) deltaY, deltaY > 0.01 ? 2 : 1)); + input.handleTouchscreenLook(new AxisStorage(GLFW_GAMEPAD_AXIS_RIGHT_X, (float) deltaX, deltaX > 0.01 ? 2 : 1)); } - input.handleLook(this.client, new AxisStorage(GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), deltaX > 0.01 ? 2 : 1)); - input.handleLook(this.client, new AxisStorage(GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs((deltaX / 3.0)*MidnightControlsConfig.touchSpeed/100), deltaX > 0.01 ? 2 : 1)); + else TouchInput.isDragging = true; } return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); } @@ -361,11 +360,4 @@ public class TouchscreenOverlay extends Screen { super.keyPressed(keyCode,scanCode,modifiers); return true; } - - @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - super.render(context, mouseX, mouseY, delta); - context.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - context.fill(mouseX-10, mouseY-10, mouseX+10, mouseY+10, 0xFFFFFF); - } } diff --git a/fabric/build.gradle b/fabric/build.gradle index 526028f..cdea958 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -24,7 +24,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" modImplementation include ("maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric") - include modImplementation ("maven.modrinth:obsidianui:${project.obsidianui_version}-fabric") {} + modImplementation include ("maven.modrinth:obsidianui:${rootProject.obsidianui_version}-fabric") {} common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } diff --git a/fabric/src/main/java/eu/midnightdust/midnightcontrols/fabric/MidnightControlsClientFabric.java b/fabric/src/main/java/eu/midnightdust/midnightcontrols/fabric/MidnightControlsClientFabric.java index 257d030..60d43ac 100644 --- a/fabric/src/main/java/eu/midnightdust/midnightcontrols/fabric/MidnightControlsClientFabric.java +++ b/fabric/src/main/java/eu/midnightdust/midnightcontrols/fabric/MidnightControlsClientFabric.java @@ -1,10 +1,8 @@ package eu.midnightdust.midnightcontrols.fabric; -import eu.midnightdust.midnightcontrols.ControlsMode; import eu.midnightdust.midnightcontrols.MidnightControlsConstants; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; -import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay; import eu.midnightdust.midnightcontrols.packet.ControlsModePayload; import eu.midnightdust.midnightcontrols.packet.FeaturePayload; import eu.midnightdust.midnightcontrols.packet.HelloPayload; @@ -54,9 +52,6 @@ public class MidnightControlsClientFabric implements ClientModInitializer { ClientTickEvents.START_CLIENT_TICK.register(MidnightControlsClient::onTick); - OpenScreenCallback.POST.register((client, screen) -> { - MidnightControlsClient.onScreenOpen(screen); - }); FabricLoader.getInstance().getModContainer(MidnightControlsConstants.NAMESPACE).ifPresent(modContainer -> { ResourceManagerHelper.registerBuiltinResourcePack(id("bedrock"), modContainer, ResourcePackActivationType.NORMAL); ResourceManagerHelper.registerBuiltinResourcePack(id("legacy"), modContainer, ResourcePackActivationType.NORMAL); diff --git a/gradle.properties b/gradle.properties index d146ada..bdea951 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,7 +26,7 @@ quilt_loader_version=0.19.0-beta.18 quilt_fabric_api_version=7.0.1+0.83.0-1.20 sodium_version=mc1.21-0.5.11 -obsidianui_version=0.2.6+mc1.21 +obsidianui_version=0.2.7+mc1.21 modmenu_version=10.0.0-beta.1 emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric bendylib_version=2.0.+ diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 756b683..7b25289 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -41,7 +41,7 @@ configurations { dependencies { neoForge "net.neoforged:neoforge:$rootProject.neoforge_version" modImplementation include ("maven.modrinth:midnightlib:${rootProject.midnightlib_version}-neoforge") - include modImplementation ("maven.modrinth:obsidianui:${project.obsidianui_version}-neoforge") {} + modImplementation include ("maven.modrinth:obsidianui:${rootProject.obsidianui_version}-neoforge") {} shadowBundle('org.aperlambda:lambdajcommon:1.8.1') { exclude group: 'com.google.code.gson' exclude group: 'com.google.guava' diff --git a/neoforge/src/main/java/eu/midnightdust/midnightcontrols/neoforge/MidnightControlsClientNeoforge.java b/neoforge/src/main/java/eu/midnightdust/midnightcontrols/neoforge/MidnightControlsClientNeoforge.java index a0004fc..9bd1e20 100644 --- a/neoforge/src/main/java/eu/midnightdust/midnightcontrols/neoforge/MidnightControlsClientNeoforge.java +++ b/neoforge/src/main/java/eu/midnightdust/midnightcontrols/neoforge/MidnightControlsClientNeoforge.java @@ -21,7 +21,6 @@ import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; -import net.neoforged.neoforge.client.event.ScreenEvent; import net.neoforged.neoforge.event.AddPackFindersEvent; import net.neoforged.neoforgespi.locating.IModFile; @@ -91,9 +90,5 @@ public class MidnightControlsClientNeoforge { public static void startClientTick(ClientTickEvent.Pre event) { MidnightControlsClient.onTick(client); } - @SubscribeEvent - public static void onScreenOpen(ScreenEvent.Opening event) { - MidnightControlsClient.onScreenOpen(event.getNewScreen()); - } } }