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 0000000..c363b66 Binary files /dev/null and b/localMaven/midnightlib-fabric-1.2.0.jar differ diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index 5ff513f..ec6c47c 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -144,6 +144,11 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo public void onMcInit(@NotNull MinecraftClient client) { ButtonBinding.init(client.options); MidnightControlsConfig.load(); + if (MidnightControlsConfig.configVersion < 2) { + MidnightControlsConfig.mouseScreens.remove("me.jellysquid.mods.sodium.client.gui"); + MidnightControlsConfig.mouseScreens.remove("net.coderbot.iris.gui"); + MidnightControlsConfig.write("midnightcontrols"); + } this.hud.setVisible(MidnightControlsConfig.hudEnable); Controller.updateMappings(); GLFW.glfwSetJoystickCallback((jid, event) -> { 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/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