From 35a4fbee1b55e9830b923c01cbc63190ec5486c1 Mon Sep 17 00:00:00 2001 From: Motschen Date: Thu, 9 Mar 2023 19:49:21 +0100 Subject: [PATCH] Many improvements for new GUI handling --- build.gradle | 8 +- gradle.properties | 10 +- localMaven/midnightlib-fabric-1.2.0.jar | Bin 0 -> 68102 bytes .../client/MidnightControlsClient.java | 5 + .../client/MidnightControlsConfig.java | 115 ++++++++++-------- .../client/MidnightInput.java | 63 ++++++---- .../client/MidnightReacharound.java | 2 +- .../compat/MidnightControlsMixinPlugin.java | 2 +- .../client/controller/InputHandlers.java | 83 +++++++------ .../gui/MidnightControlsSettingsScreen.java | 8 +- .../mixin/TabNavigationWidgetAccessor.java | 19 +++ .../assets/midnightcontrols/lang/en_us.json | 5 + .../resources/midnightcontrols.mixins.json | 3 +- 13 files changed, 190 insertions(+), 133 deletions(-) create mode 100644 localMaven/midnightlib-fabric-1.2.0.jar create mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/mixin/TabNavigationWidgetAccessor.java diff --git a/build.gradle b/build.gradle index d54a473..6c74c83 100644 --- a/build.gradle +++ b/build.gradle @@ -97,7 +97,9 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation "dev.lambdaurora:spruceui:${project.spruceui_version}" + modImplementation ("dev.lambdaurora:spruceui:${project.spruceui_version}") { + exclude(group: "net.fabricmc.fabric-api") + } include "dev.lambdaurora:spruceui:${project.spruceui_version}" api('org.aperlambda:lambdajcommon:1.8.1') { exclude group: 'com.google.code.gson' @@ -105,7 +107,9 @@ dependencies { } include 'org.aperlambda:lambdajcommon:1.8.1' - modCompileOnlyApi "com.terraformersmc:modmenu:${project.modmenu_version}" + modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") { + exclude(group: "net.fabricmc.fabric-api") + } // Compatibility mods diff --git a/gradle.properties b/gradle.properties index 4da8e07..5807b45 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/use -minecraft_version=23w06a -yarn_mappings=23w06a+build.14 -loader_version=0.14.14 +minecraft_version=1.19.4-pre4 +yarn_mappings=1.19.4-pre4+build.1 +loader_version=0.14.17 # Mod Properties mod_version = 1.7.4 @@ -15,10 +15,10 @@ modrinth_id=bXX9h73M # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api -fabric_version=0.74.0+1.19.4 +fabric_version=0.75.3+1.19.4 sodium_version=mc1.19.2-0.4.4 spruceui_version=4.2.0+23w06a -midnightlib_version=1.1.0-fabric +midnightlib_version=fabric-1.2.0 modmenu_version=5.0.1 emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric bendylib_version=2.0.+ diff --git a/localMaven/midnightlib-fabric-1.2.0.jar b/localMaven/midnightlib-fabric-1.2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..c363b66d37646528a3aa1cd9b13b91edf313e9a6 GIT binary patch literal 68102 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ð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%0Dyh&E38~-e>+*6K z>td@y@U&o3O{hwL+xI0Q>!PlVYMWvWsg+Y?dk=PYkble*hK4M#lwU?88=uZ_QJoJz zP9Lv^GBv)00R2VwQ;KT5G6yJZf zagn}1`RMj7&CN`#V_Oz1(6~H_NVL{XMiDuxbd>zpLQy#@F)M`jL41+@R)onViKDlS z-`rqrr8x{E(2<|Eaot zxz@5v-OEzQ6|q$_VcF9h`kQJS#C}|+w`ZaZZ$}$mUMfE{wA(VWQZAu40g+o-2Kz-H zGCjda^V2##RSM!5&^|?1S3*Q0LLfrG0KNx}3@RRRviYEp2WUS)e^O0=n=nCg?j9@{g2>Z&2Sx0-u6^|H6cUdWVP)fd2>T z+j!*vjE51W8c3NR07f$c|4j-r9>_}r{^D#8a4^GX}8in1G+FaIk~_ z01IP%GfQtTum532FTs(?;r&(zCkq$b^JUM7562e=7FQaOk3tUzm-q)bFE29>@3VUf zb~<~&QyR^HK^lSjdGNrO3D1|)#>33U^%o)7HpXy$G4XNjM&7@5QX67!#t_!Zgtz}7Bi-oNo%ur|i7Hdv4afO&w# zGk6>K0SOqt*^1xS0?677Wc_D}1;n4oP67Kc0x$)$Ce7nW>-NA_c zj5+6x#Dg38@yEztI}zmV>Gf|g#BebDbl(MlgZY1-_cxKq;IRD8!}7JZgqQ8tg7{{f zH{|?n%7BT9fq8@Xp&ft1`;n&&l%$ci@Ur-oX9h&OzljWg2=HY%tNypt$A6j-_;A;B z4ipgXfHoEIh~M-FDsUlu)8D!qtM(%h*i3=(@cN@L{$9ABh~LV0N&!pR!Ugmj{b4Dn zL>*_f0Q0^DHnRrYlxg$+kwWF?p+xGt4varCaV1<_T)iy5<@d?>Svh%o0>5Z^d02Q^ z+xq`Tj`LPC{4!+WKP$)2YE}O*r|_o)$MdlM(?kyj64p#5O!XQM0k>og6nxi&GgJLv zAmQ!wtM|x{Y%s=OFMm`GgiD`2N05~|pR@{Ku6BWQl{B0nvw~;sbbhMtFR`?o?16Gk z@QwXosLz`s_}zUV@_XvKrng~k5+SFw(fTJS;!u1t6jokhM`D>Pxf0g?Di|w9I7!g4MKhXf3-$db< z#O=-z{vX;G{e={LC(p|r2$f-gir3&sZ@Zr*J>M^UiyGE0UVmXT9?$a82iPP5Hg-5R z8_%hLxu|vS{JVh1WOsnMHvpc#;OF1s z&xk7ae)cYEZr_vE;gfh_7BB2d6X;$E90RVD9RiI(;2ltH;91$vpNfAE3h=GMVSU0@ z_*us9)`DHsaE-&yQ3}2_G%ST#)LDveO2L%?InyW_hUUC^hmQ$w!GECnTlj|WehVx8 z_1M3|{zETZ7ARZE6@3>|NCJGwgJ;QCWddr1IrhG|195GSM(c41gj2w&3ssR(Soz^FzS3e zg8x?q{c|*cFFOrOVOn~Y0yfyeZsH%u@E>vZhv)csd4_qL4;kY@FiPeHL(9P;$I55oN2i_iW{`naC{Y?%SGyPHuuE^0jB=7|#U`bFRXGwl8&i{7Szbh|s4j=rz zb67srfwO$yiT?2x`Z5@|?pYDp17>0YMJ { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index d8a88e6..9d323ca 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -33,58 +33,61 @@ import static org.lwjgl.glfw.GLFW.*; */ public class MidnightControlsConfig extends MidnightConfig { public static boolean isEditing = false; - @Hidden @Entry public static int configVersion = 1; + @Hidden @Entry public static int configVersion = 2; // General - @Entry(name = "midnightcontrols.menu.controls_mode") public static ControlsMode controlsMode = ControlsMode.DEFAULT; - @Entry(name = "midnightcontrols.menu.auto_switch_mode") public static boolean autoSwitchMode = true; - @Entry(name = "Debug") public static boolean debug = false; + @Entry(category = "controller", name = "midnightcontrols.menu.controls_mode") public static ControlsMode controlsMode = ControlsMode.DEFAULT; + @Entry(category = "controller", name = "midnightcontrols.menu.auto_switch_mode") public static boolean autoSwitchMode = true; + @Entry(category = "misc", name = "Debug") public static boolean debug = false; // HUD - @Entry(name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true; - @Entry(name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT; - @Entry(name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false; + @Entry(category = "visual", name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true; + @Entry(category = "visual", name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT; + @Entry(category = "screens", name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false; // Gameplay - @Entry(name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true; - @Entry(name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true; - @Entry(name = "midnightcontrols.menu.controller_toggle_sneak") public static boolean controllerToggleSneak = MinecraftClient.getInstance().options.getSneakToggled().getValue(); - @Entry(name = "midnightcontrols.menu.controller_toggle_sprint") public static boolean controllerToggleSprint = MinecraftClient.getInstance().options.getSprintToggled().getValue(); - @Entry(name = "midnightcontrols.menu.fast_block_placing") public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. - @Entry(name = "midnightcontrols.menu.fly_drifting") public static boolean flyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. It can also conflict with some other mods. - @Entry(name = "midnightcontrols.menu.fly_drifting_vertical") public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. - @Entry(name = "midnightcontrols.menu.reacharound.horizontal") public static boolean horizontalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. - @Entry(name = "midnightcontrols.menu.reacharound.vertical") public static boolean verticalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. - @Entry(name = "Reacharound Outline") public static boolean shouldRenderReacharoundOutline = true; - @Entry(name = "Reacharound Outline Color (WIP)", isColor = true) public static String reacharoundOutlineColorHex = "#ffffff"; - @Entry(name = "Reacharound Outline Alpha", min = 0, max = 255) public static int reacharoundOutlineColorAlpha = 102; - @Entry(name = "midnightcontrols.menu.right_dead_zone") public static double rightDeadZone = 0.25; - @Entry(name = "midnightcontrols.menu.left_dead_zone") public static double leftDeadZone = 0.25; - @Entry(name = "midnightcontrols.menu.invert_right_y_axis") public static boolean invertRightYAxis = false; - @Entry(name = "midnightcontrols.menu.invert_right_x_axis") public static boolean invertRightXAxis = false; - @Entry(name = "midnightcontrols.menu.rotation_speed") public static double rotationSpeed = 40.0; //used for x-axis, name kept for compatability - @Entry(name = "midnightcontrols.menu.y_axis_rotation_speed") public static double yAxisRotationSpeed = rotationSpeed; - @Entry(name = "midnightcontrols.menu.mouse_speed") public static double mouseSpeed = 25.0; - @Entry(name = "midnightcontrols.menu.joystick_as_mouse") public static boolean joystickAsMouse = false; - @Entry(name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false; - @Entry(name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false; - @Entry(name = "midnightcontrols.menu.virtual_mouse.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT; - @Entry(name = "Controller ID") public static Object controllerID = 0; - @Entry(name = "2nd Controller ID") public static Object secondControllerID = -1; - @Entry(name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT; - @Entry(name = "Mouse screens") public static List mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui", - "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", + @Entry(category = "gameplay", name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true; + @Entry(category = "gameplay", name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true; + @Entry(category = "gameplay", name = "midnightcontrols.menu.controller_toggle_sneak") public static boolean controllerToggleSneak = MinecraftClient.getInstance().options.getSneakToggled().getValue(); + @Entry(category = "gameplay", name = "midnightcontrols.menu.controller_toggle_sprint") public static boolean controllerToggleSprint = MinecraftClient.getInstance().options.getSprintToggled().getValue(); + @Entry(category = "gameplay", name = "midnightcontrols.menu.fast_block_placing") public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. + @Entry(category = "gameplay", name = "midnightcontrols.menu.fly_drifting") public static boolean flyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. It can also conflict with some other mods. + @Entry(category = "gameplay", name = "midnightcontrols.menu.fly_drifting_vertical") public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. + @Entry(category = "gameplay", name = "midnightcontrols.menu.reacharound.horizontal") public static boolean horizontalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. + @Entry(category = "gameplay", name = "midnightcontrols.menu.reacharound.vertical") public static boolean verticalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. + @Entry(category = "visual", name = "Reacharound Outline") public static boolean shouldRenderReacharoundOutline = true; + @Entry(category = "visual", name = "Reacharound Outline Color", isColor = true) public static String reacharoundOutlineColorHex = "#ffffff"; + @Entry(category = "visual", name = "Reacharound Outline Alpha", isSlider = true, min = 0, max = 255) public static int reacharoundOutlineColorAlpha = 102; + @Entry(category = "controller", name = "midnightcontrols.menu.right_dead_zone", isSlider = true, min = 0.05, max = 1) public static double rightDeadZone = 0.25; + @Entry(category = "controller", name = "midnightcontrols.menu.left_dead_zone", isSlider = true, min = 0.05, max = 1) public static double leftDeadZone = 0.25; + @Entry(category = "controller", name = "midnightcontrols.menu.invert_right_y_axis") public static boolean invertRightYAxis = false; + @Entry(category = "controller", name = "midnightcontrols.menu.invert_right_x_axis") public static boolean invertRightXAxis = false; + @Entry(category = "controller", name = "midnightcontrols.menu.rotation_speed", isSlider = true, min = 0, max = 100, precision = 10) public static double rotationSpeed = 40.0; //used for x-axis, name kept for compatibility + @Entry(category = "controller", name = "midnightcontrols.menu.y_axis_rotation_speed", isSlider = true, min = 0, max = 100, precision = 10) public static double yAxisRotationSpeed = rotationSpeed; + @Entry(category = "screens", name = "midnightcontrols.menu.mouse_speed", isSlider = true, min = 0, max = 150, precision = 10) public static double mouseSpeed = 25.0; + @Entry(category = "screens", name = "midnightcontrols.menu.joystick_as_mouse") public static boolean joystickAsMouse = false; + @Entry(category = "controller", name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false; + @Entry(category = "screens", name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false; + @Entry(category = "screens", name = "midnightcontrols.menu.virtual_mouse.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT; + @Entry(category = "controller", name = "Controller ID") @Hidden public static Object controllerID = 0; + @Entry(category = "controller", name = "2nd Controller ID") @Hidden public static Object secondControllerID = -1; + @Entry(category = "visual", name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT; + @Entry(category = "screens", name = "Mouse screens") public static List mouseScreens = Lists.newArrayList("net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "net.minecraft.class_3872", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen", "hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen", "me.shedaniel.clothconfig2.gui.ClothConfigScreen", "com.mamiyaotaru.voxelmap.gui.GuiWaypoints", "com.mamiyaotaru.voxelmap.gui.GuiPersistentMap"); - @Entry(name = "Arrow screens") public static List arrowScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName()); - @Entry(name = "WASD screens") public static List wasdScreens = Lists.newArrayList("com.ultreon.devices.core.Laptop"); - @Entry(name = "Keybindings") public static Map BINDING = new HashMap<>(); + @Entry(category = "screens", name = "Arrow screens") public static List arrowScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName()); + @Entry(category = "screens", name = "WASD screens") public static List wasdScreens = Lists.newArrayList("com.ultreon.devices.core.Laptop"); + @Entry @Hidden public static Map BINDING = new HashMap<>(); private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?"); - @Entry(name = "Max analog values") public static double[] maxAnalogValues = new double[]{1, 1, 1, 1}; - @Entry(name = "Trigger button fix") public static boolean triggerFix = true; - @Entry(name = "Enable Hints") public static boolean enableHints = true; - @Entry(name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true; - @Entry(name = "Ring Bindings (WIP)") public static List ringBindings = new ArrayList<>(); - @Entry(name = "Ignored Unbound Keys") public static List ignoredUnboundKeys = Lists.newArrayList("inventorytabs.key.next_tab"); + @Deprecated @Hidden @Entry public static double[] maxAnalogValues = new double[]{1, 1, 1, 1}; + @Entry(category = "controller", name = "Max analog value: Left X", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueLeftX = maxAnalogValues[0]; + @Entry(category = "controller", name = "Max analog value: Left Y", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueLeftY = maxAnalogValues[1]; + @Entry(category = "controller", name = "Max analog value: Right X", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueRightX = maxAnalogValues[2]; + @Entry(category = "controller", name = "Max analog value: Right Y", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueRightY = maxAnalogValues[3]; + @Entry(category = "controller", name = "Trigger button fix") public static boolean triggerFix = true; + @Entry(category = "gameplay", name = "Enable Hints") public static boolean enableHints = true; + @Entry(category = "screens", name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true; + @Entry(category = "misc", name = "Ring Bindings (WIP)") public static List ringBindings = new ArrayList<>(); + @Entry(category = "misc", name = "Ignored Unbound Keys") public static List ignoredUnboundKeys = Lists.newArrayList("inventorytabs.key.next_tab"); @Entry @Hidden public static Map> controllerBindingProfiles = new HashMap<>(); private static Map currentBindingProfile = new HashMap<>(); private static Controller prevController; @@ -198,14 +201,21 @@ public class MidnightControlsConfig extends MidnightConfig { } public static double getAxisMaxValue(int axis) { - if (axis >= MidnightControlsConfig.maxAnalogValues.length) - return 1; - return MidnightControlsConfig.maxAnalogValues[axis]; + return switch (axis) { + case GLFW_GAMEPAD_AXIS_LEFT_X -> MidnightControlsConfig.maxAnalogValueLeftX; + case GLFW_GAMEPAD_AXIS_LEFT_Y -> MidnightControlsConfig.maxAnalogValueLeftY; + case GLFW_GAMEPAD_AXIS_RIGHT_X -> MidnightControlsConfig.maxAnalogValueRightX; + default -> MidnightControlsConfig.maxAnalogValueRightY; + }; } public static void setAxisMaxValue(int axis, double value) { - if (axis < MidnightControlsConfig.maxAnalogValues.length) - MidnightControlsConfig.maxAnalogValues[axis] = value; + switch (axis) { + case GLFW_GAMEPAD_AXIS_LEFT_X -> MidnightControlsConfig.maxAnalogValueLeftX = value; + case GLFW_GAMEPAD_AXIS_LEFT_Y -> MidnightControlsConfig.maxAnalogValueLeftY = value; + case GLFW_GAMEPAD_AXIS_RIGHT_X -> MidnightControlsConfig.maxAnalogValueRightX = value; + default -> MidnightControlsConfig.maxAnalogValueRightY = value; + }; } /** @@ -330,9 +340,12 @@ public class MidnightControlsConfig extends MidnightConfig { controllerID = 0; secondControllerID = -1; controllerType = ControllerType.DEFAULT; - mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui", "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "net.minecraft.class_3872", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen", "me.shedaniel.clothconfig2.gui.ClothConfigScreen", "com.mamiyaotaru.voxelmap.gui.GuiWaypoints", "com.mamiyaotaru.voxelmap.gui.GuiPersistentMap"); + mouseScreens = Lists.newArrayList("net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "net.minecraft.class_3872", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen", "me.shedaniel.clothconfig2.gui.ClothConfigScreen", "com.mamiyaotaru.voxelmap.gui.GuiWaypoints", "com.mamiyaotaru.voxelmap.gui.GuiPersistentMap"); BINDING = new HashMap<>(); - maxAnalogValues = new double[]{1, 1, 1, 1}; + maxAnalogValueLeftX = 1; + maxAnalogValueLeftY = 1; + maxAnalogValueRightX = 1; + maxAnalogValueRightY = 1; triggerFix = true; enableHints = true; shortcutInControls = true; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index b1ce7a1..cdc34c2 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -72,6 +72,7 @@ public class MidnightInput { private static final Map BUTTON_COOLDOWNS = new HashMap<>(); // Cooldowns public int actionGuiCooldown = 0; + public int joystickCooldown = 0; public boolean ignoreNextARelease = false; public boolean ignoreNextXRelease = false; private double targetYaw = 0.0; @@ -126,6 +127,8 @@ public class MidnightInput { --this.actionGuiCooldown; if (this.screenCloseCooldown > 0) --this.screenCloseCooldown; + if (this.joystickCooldown > 0) + --this.joystickCooldown; InputManager.updateStates(); @@ -328,10 +331,10 @@ public class MidnightInput { || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT)) { if (this.actionGuiCooldown == 0) { switch (button) { - case GLFW_GAMEPAD_BUTTON_DPAD_UP -> pressKeyboardKey(client, GLFW.GLFW_KEY_UP); - case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> pressKeyboardKey(client, GLFW.GLFW_KEY_DOWN); - case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> pressKeyboardKey(client, GLFW.GLFW_KEY_LEFT); - case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> pressKeyboardKey(client, GLFW.GLFW_KEY_RIGHT); + case GLFW_GAMEPAD_BUTTON_DPAD_UP -> this.changeFocus(client.currentScreen, NavigationDirection.UP); + case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> this.changeFocus(client.currentScreen, NavigationDirection.DOWN); + case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> this.handleLeftRight(client.currentScreen, false); + case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> this.handleLeftRight(client.currentScreen, true); } if (MidnightControlsConfig.wasdScreens.contains(client.currentScreen.getClass().getCanonicalName())) { switch (button) { @@ -341,11 +344,6 @@ public class MidnightInput { case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> pressKeyboardKey(client, GLFW.GLFW_KEY_D); } } -// else if (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP) { -// this.changeFocus(client.currentScreen, NavigationDirection.UP); -// } else if (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN) { -// this.changeFocus(client.currentScreen, NavigationDirection.DOWN); -// } else this.handleLeftRight(client.currentScreen, button != GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT); } return; } @@ -572,9 +570,8 @@ public class MidnightInput { return; } } else if (client.currentScreen != null) { - if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone) { - float finalValue = value; - if (client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget) + float finalValue = value; + if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone && client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget) .map(element -> (SpruceEntryListWidget) element) .filter(AbstractSpruceWidget::isFocusedOrHovered) .noneMatch(element -> { @@ -592,7 +589,20 @@ public class MidnightInput { { client.currentScreen.mouseScrolled(0.0, 0.0, -(value * 1.5f)); } - + else if (absValue >= deadZone) { + if (value > 0 && joystickCooldown == 0) { + switch (axis) { + case GLFW_GAMEPAD_AXIS_LEFT_Y -> this.changeFocus(client.currentScreen, NavigationDirection.UP); + case GLFW_GAMEPAD_AXIS_LEFT_X -> this.handleLeftRight(client.currentScreen, true); + } + if (axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X) joystickCooldown = 4; + } else if (value < 0 && joystickCooldown == 0) { + switch (axis) { + case GLFW_GAMEPAD_AXIS_LEFT_Y -> this.changeFocus(client.currentScreen, NavigationDirection.DOWN); + case GLFW_GAMEPAD_AXIS_LEFT_X -> this.handleLeftRight(client.currentScreen, false); + } + if (axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X) joystickCooldown = 4; + } return; } } @@ -696,6 +706,7 @@ public class MidnightInput { } else if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleAButton(screen, focused)) { return true; } + else pressKeyboardKey(screen, GLFW_KEY_ENTER); return false; } @@ -729,9 +740,11 @@ public class MidnightInput { return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false); } if (element instanceof SliderWidget slider) { - slider.keyPressed(right ? 262 : 263, 0, 0); - this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks. - return false; + if (slider.active) { + slider.keyPressed(right ? 262 : 263, 0, 0); + this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks. + return true; + } } else if (element instanceof AlwaysSelectedEntryListWidget) { //TODO((EntryListWidgetAccessor) element).midnightcontrols$moveSelection(right ? EntryListWidget.MoveDirection.DOWN : EntryListWidget.MoveDirection.UP); return false; @@ -782,18 +795,14 @@ public class MidnightInput { } return false; } - if (FabricLoader.getInstance().isModLoaded("sodium")) - SodiumCompat.handleInput(screen, direction.isLookingForward()); - else { - switch (direction) { - case UP -> pressKeyboardKey(screen, GLFW.GLFW_KEY_UP); - case DOWN -> pressKeyboardKey(screen, GLFW.GLFW_KEY_DOWN); - case LEFT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_LEFT); - case RIGHT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_RIGHT); - } - this.actionGuiCooldown = 5; - return false; + switch (direction) { + case UP -> pressKeyboardKey(screen, GLFW.GLFW_KEY_UP); + case DOWN -> pressKeyboardKey(screen, GLFW.GLFW_KEY_DOWN); + case LEFT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_LEFT); + case RIGHT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_RIGHT); } + this.actionGuiCooldown = 5; + return false; } catch (Exception exception) {MidnightControls.get().warn("Unknown exception encountered while trying to change focus: "+exception);} return false; } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightReacharound.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightReacharound.java index 6c1f8f4..ce24d52 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightReacharound.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightReacharound.java @@ -130,7 +130,7 @@ public class MidnightReacharound { } else { this.onSlab = false; } - var targetPos = new BlockPos(client.crosshairTarget.getPos()).subtract(playerPos); + var targetPos = BlockPos.ofFloored(client.crosshairTarget.getPos()).subtract(playerPos); var vector = new BlockPos.Mutable(MathHelper.clamp(targetPos.getX(), -1, 1), 0, MathHelper.clamp(targetPos.getZ(), -1, 1)); var blockPos = playerPos.add(vector); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java index 4c60faa..4db407f 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java @@ -30,7 +30,7 @@ public class MidnightControlsMixinPlugin implements IMixinConfigPlugin { private final HashMap conditionalMixins = new HashMap<>(); public MidnightControlsMixinPlugin() { - this.putConditionalMixin("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium")); + //this.putConditionalMixin("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium")); } private void putConditionalMixin(@NotNull String path, boolean condition) { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java index 831b760..19bcf28 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -9,6 +9,7 @@ package eu.midnightdust.midnightcontrols.client.controller; +import com.google.common.collect.Lists; import eu.midnightdust.midnightcontrols.client.ButtonState; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; @@ -21,6 +22,7 @@ import eu.midnightdust.midnightcontrols.client.gui.RingScreen; import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor; import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor; import eu.midnightdust.midnightcontrols.client.mixin.RecipeBookWidgetAccessor; +import eu.midnightdust.midnightcontrols.client.mixin.TabNavigationWidgetAccessor; import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor; import eu.midnightdust.midnightcontrols.client.util.MouseAccessor; import net.fabricmc.fabric.impl.client.itemgroup.CreativeGuiExtensions; @@ -33,7 +35,9 @@ import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; import net.minecraft.client.gui.screen.ingame.*; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import net.minecraft.client.gui.tab.TabManager; import net.minecraft.client.gui.widget.PressableWidget; +import net.minecraft.client.gui.widget.TabNavigationWidget; import net.minecraft.client.util.ScreenshotRecorder; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroups; @@ -161,6 +165,18 @@ public class InputHandlers { } } return true; + } else if (client.currentScreen != null && client.currentScreen.children().stream().anyMatch(e -> e instanceof TabNavigationWidget)) { + Lists.newCopyOnWriteArrayList(client.currentScreen.children()).stream().anyMatch(e -> { + if (e instanceof TabNavigationWidget tabs) { + TabNavigationWidgetAccessor accessor = (TabNavigationWidgetAccessor) tabs; + if (next ? accessor.getCurrentTabIndex()+1 < accessor.getTabs().size() : accessor.getCurrentTabIndex() > 0) { + if (next) tabs.selectTab(accessor.getCurrentTabIndex() + 1, true); + else tabs.selectTab(accessor.getCurrentTabIndex() - 1, true); + return true; + } + } + return false; + }); } else { if (FabricLoader.getInstance().isModLoaded("sodium")) SodiumCompat.handleTabs(client.currentScreen, next); @@ -174,31 +190,20 @@ public class InputHandlers { public static PressAction handlePage(boolean next) { return (client, button, value, action) -> { if (client.currentScreen instanceof CreativeInventoryScreen) { - var screen = (HandledScreenAccessor) client.currentScreen; try { - if (next) { - return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget) - .map(element -> (PressableWidget) element) - .filter(element -> element.getMessage() != null && element.getMessage().getContent() != null) - .anyMatch(element -> { - if (element.getMessage().getString().equals(">")) { - element.onPress(); - return true; - } - return false; - }); - } else { - return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget) - .map(element -> (PressableWidget) element) - .filter(element -> element.getMessage() != null && element.getMessage().getContent() != null) - .anyMatch(element -> { - if (element.getMessage().getString().equals("<")) { - element.onPress(); - return true; - } - return false; - }); - } + return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget) + .map(element -> (PressableWidget) element) + .filter(element -> element.getMessage() != null && element.getMessage().getContent() != null) + .anyMatch(element -> { + if (next && element.getMessage().getString().equals(">")) { + element.onPress(); + return true; + } else if (element.getMessage().getString().equals("<")) { + element.onPress(); + return true; + } + return false; + }); } catch (Exception ignored) {} } if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryPage(client.currentScreen, next); @@ -246,23 +251,21 @@ public class InputHandlers { MidnightControlsClient.get().input.inventoryInteractionCooldown = 5; switch (button.getName()) { - case "take_all": { - if (screen instanceof CreativeInventoryScreen) { - if (slot != null && (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot) || MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot)))) - actionType = SlotActionType.CLONE; + case "take_all" -> { + if (screen instanceof CreativeInventoryScreen) { + if (slot != null && (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot) || MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot)))) + actionType = SlotActionType.CLONE; + } + } + case "take" -> { + clickData = GLFW_MOUSE_BUTTON_2; + } + case "quick_move" -> { + actionType = SlotActionType.QUICK_MOVE; + } + default -> { + return false; } - break; - } - case "take": { - clickData = GLFW_MOUSE_BUTTON_2; - break; - } - case "quick_move": { - actionType = SlotActionType.QUICK_MOVE; - break; - } - default: - return false; } accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType); return true; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java index 72f0a58..23f5cb4 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -428,16 +428,16 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { } public static class MidnightControlsBackground implements Background { - private int transparency = 160; + private static int transparency = 160; public MidnightControlsBackground() {} public MidnightControlsBackground(int transparency) { - this.transparency = transparency; + MidnightControlsBackground.transparency = transparency; } @Override public void render(MatrixStack matrixStack, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) { fill(matrixStack, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), MidnightColorUtil.hex2Rgb("#000000")); } - private void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) { + private static void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) { matrixStack.push(); Matrix4f matrix = matrixStack.peek().getPositionMatrix(); @@ -447,7 +447,6 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { float t = (float)(transparency) / 255.0F; BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); RenderSystem.enableBlend(); - //RenderSystem.enableColorLogicOp();//.disableTexture(); RenderSystem.defaultBlendFunc(); RenderSystem.setShader(GameRenderer::getPositionColorProgram); bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); @@ -456,7 +455,6 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { bufferBuilder.vertex(matrix, (float)x2, (float)y1, 0.0F).color(r, g, b, t).next(); bufferBuilder.vertex(matrix, (float)x1, (float)y1, 0.0F).color(r, g, b, t).next(); BufferRenderer.drawWithGlobalProgram(bufferBuilder.end()); - //RenderSystem.enableColorLogicOp();//enableTexture RenderSystem.disableBlend(); matrixStack.pop(); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/TabNavigationWidgetAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/TabNavigationWidgetAccessor.java new file mode 100644 index 0000000..b1c882b --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/TabNavigationWidgetAccessor.java @@ -0,0 +1,19 @@ +package eu.midnightdust.midnightcontrols.client.mixin; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.gui.tab.Tab; +import net.minecraft.client.gui.tab.TabManager; +import net.minecraft.client.gui.widget.TabNavigationWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(TabNavigationWidget.class) +public interface TabNavigationWidgetAccessor { + @Accessor + TabManager getTabManager(); + @Accessor + ImmutableList getTabs(); + @Invoker("getCurrentTabIndex") + int getCurrentTabIndex(); +} diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index 4651850..fca0afa 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -203,5 +203,10 @@ "midnightcontrols.virtual_mouse.skin.default_dark": "Default Dark", "midnightcontrols.virtual_mouse.skin.second_light": "Second Light", "midnightcontrols.virtual_mouse.skin.second_dark": "Second Dark", + "midnightcontrols.midnightconfig.category.controller": "Controller", + "midnightcontrols.midnightconfig.category.misc": "Miscellaneous", + "midnightcontrols.midnightconfig.category.screens": "Screens", + "midnightcontrols.midnightconfig.category.gameplay": "Gameplay", + "midnightcontrols.midnightconfig.category.visual": "Visual", "modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued." } diff --git a/src/main/resources/midnightcontrols.mixins.json b/src/main/resources/midnightcontrols.mixins.json index 80b8185..33fdd50 100644 --- a/src/main/resources/midnightcontrols.mixins.json +++ b/src/main/resources/midnightcontrols.mixins.json @@ -20,7 +20,8 @@ "WorldRendererMixin", "KeyBindingRegistryImplAccessor", "KeyBindingIDAccessor", - "ScreenAccessor" + "ScreenAccessor", + "TabNavigationWidgetAccessor" ], "injectors": { "defaultRequire": 1