From 3f221feb26e850db95f18121f2c75b110b107c05 Mon Sep 17 00:00:00 2001 From: LambdAurora Date: Tue, 30 Jun 2020 00:28:27 +0200 Subject: [PATCH] Add mouse4 as back in GUIs. --- .../lambdacontrols/client/LambdaInput.java | 26 ++++++++++++++++++- .../client/mixin/MouseMixin.java | 13 +++++++++- gradle.properties | 2 +- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/LambdaInput.java b/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/LambdaInput.java index 17ff409..ff06e0b 100644 --- a/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/LambdaInput.java +++ b/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/LambdaInput.java @@ -9,6 +9,7 @@ package me.lambdaurora.lambdacontrols.client; +import com.google.common.collect.ImmutableSet; import me.lambdaurora.lambdacontrols.client.compat.LambdaControlsCompat; import me.lambdaurora.lambdacontrols.client.controller.ButtonBinding; import me.lambdaurora.lambdacontrols.client.controller.Controller; @@ -39,6 +40,7 @@ import net.minecraft.client.gui.widget.SliderWidget; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.text.TranslatableText; import net.minecraft.util.math.MathHelper; import org.aperlambda.lambdacommon.utils.Pair; import org.jetbrains.annotations.NotNull; @@ -315,7 +317,8 @@ public class LambdaInput if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) { if (client.currentScreen != null) { if (!LambdaControlsCompat.handleMenuBack(client, client.currentScreen)) - client.currentScreen.onClose(); + if (!this.tryGoBack(client.currentScreen)) + client.currentScreen.onClose(); return; } } @@ -397,6 +400,27 @@ public class LambdaInput return true; } + /** + * Tries to go back. + * + * @param screen The current screen. + * @return True if successful, else false. + */ + public boolean tryGoBack(@NotNull Screen screen) + { + ImmutableSet set = ImmutableSet.of("gui.back", "gui.done", "gui.cancel", "gui.toTitle", "gui.toMenu"); + return screen.children().stream().filter(element -> element instanceof AbstractPressableButtonWidget) + .map(element -> (AbstractPressableButtonWidget) element) + .filter(element -> element.getMessage() instanceof TranslatableText) + .anyMatch(element -> { + if (set.stream().anyMatch(key -> key.equals(((TranslatableText) element.getMessage()).getKey()))) { + element.onPress(); + return true; + } + return false; + }); + } + private void handleAxe(@NotNull MinecraftClient client, int axis, float value, float absValue, int state) { int asButtonState = value > 0.5F ? 1 : (value < -0.5F ? 2 : 0); diff --git a/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/mixin/MouseMixin.java b/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/mixin/MouseMixin.java index cb62662..b76517b 100644 --- a/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/mixin/MouseMixin.java +++ b/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/mixin/MouseMixin.java @@ -15,6 +15,7 @@ import me.lambdaurora.lambdacontrols.client.LambdaControlsConfig; import me.lambdaurora.lambdacontrols.client.util.MouseAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.client.Mouse; +import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -37,10 +38,20 @@ public abstract class MouseMixin implements MouseAccessor @Invoker("onCursorPos") public abstract void lambdacontrols_onCursorPos(long window, double x, double y); + @Inject(method = "method_1605", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/Screen;mouseReleased(DDI)Z")) + private void onMouseBackButton(boolean[] result, double mouseX, double mouseY, int button, CallbackInfo ci) + { + if (!result[0] && button == GLFW.GLFW_MOUSE_BUTTON_4 && this.client.currentScreen != null) { + if (LambdaControlsClient.get().input.tryGoBack(this.client.currentScreen)) { + result[0] = true; + } + } + } + @Inject(method = "isCursorLocked", at = @At("HEAD"), cancellable = true) private void isCursorLocked(CallbackInfoReturnable ci) { - if (client.currentScreen == null) { + if (this.client.currentScreen == null) { LambdaControlsConfig config = LambdaControlsClient.get().config; if (config.getControlsMode() == ControlsMode.CONTROLLER && config.hasVirtualMouse()) { ci.setReturnValue(true); diff --git a/gradle.properties b/gradle.properties index 32c601b..378f447 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.8.8+build.202 # Mod Properties - mod_version = 1.3.2 + mod_version = 1.4.0 maven_group = me.lambdaurora.lambdacontrols archives_base_name = lambdacontrols