From 8e31472c0739a2dcc67045460847540db53465ec Mon Sep 17 00:00:00 2001 From: isXander Date: Fri, 17 Feb 2023 00:46:40 +0000 Subject: [PATCH] joystick axis rendering (no textures), improve config error handling and fix joystick deadzones being unordered --- .../bindings/ControllerBindings.java | 5 +- .../controlify/bindings/GamepadBind.java | 2 +- .../isxander/controlify/bindings/IBind.java | 8 +-- .../controlify/bindings/JoystickAxisBind.java | 37 ++++++++---- .../bindings/JoystickButtonBind.java | 20 ++++--- .../controlify/bindings/JoystickHatBind.java | 34 +++++++---- .../controlify/config/ControlifyConfig.java | 10 +++- .../controlify/config/gui/YACLHelper.java | 4 +- .../controller/AbstractController.java | 5 ++ .../controlify/controller/Controller.java | 9 ++- .../controller/joystick/JoystickConfig.java | 18 +++--- .../joystick/JoystickController.java | 2 +- .../joystick/mapping/DataJoystickMapping.java | 7 ++- .../joystick/mapping/JoystickMapping.java | 2 +- .../mapping/UnmappedJoystickMapping.java | 54 +++++++++--------- .../controlify/debug/DebugProperties.java | 12 ++++ .../virtualmouse/VirtualMouseHandler.java | 4 +- .../resources/assets/controlify/hiddb.json5 | 40 ++++++------- .../dualshock4/a_button.png | Bin .../dualshock4/b_button.png | Bin .../dualshock4/back.png | Bin .../dualshock4/dpad_down.png | Bin .../dualshock4/dpad_left.png | Bin .../dualshock4/dpad_right.png | Bin .../dualshock4/dpad_up.png | Bin .../dualshock4/left_bumper.png | Bin .../dualshock4/left_stick_down.png | Bin .../dualshock4/left_stick_left.png | Bin .../dualshock4/left_stick_press.png | Bin .../dualshock4/left_stick_right.png | Bin .../dualshock4/left_stick_up.png | Bin .../dualshock4/left_trigger.png | Bin .../dualshock4/right_bumper.png | Bin .../dualshock4/right_stick_down.png | Bin .../dualshock4/right_stick_left.png | Bin .../dualshock4/right_stick_press.png | Bin .../dualshock4/right_stick_right.png | Bin .../dualshock4/right_stick_up.png | Bin .../dualshock4/right_trigger.png | Bin .../dualshock4/start.png | Bin .../dualshock4/x_button.png | Bin .../dualshock4/y_button.png | Bin .../switch/switch_bumper_left.png | Bin .../switch/switch_bumper_right.png | Bin .../switch/switch_circle_button.png | Bin .../switch/switch_dpad_down.png | Bin .../switch/switch_dpad_left.png | Bin .../switch/switch_dpad_right.png | Bin .../switch/switch_dpad_up.png | Bin .../switch/switch_face_button_down.png | Bin .../switch/switch_face_button_left.png | Bin .../switch/switch_face_button_right.png | Bin .../switch/switch_face_button_up.png | Bin .../switch/switch_home_button.png | Bin .../switch/switch_left_trigger.png | Bin .../switch/switch_right_trigger.png | Bin .../switch/switch_select_button.png | Bin .../switch/switch_sl_button.png | Bin .../switch/switch_sr_button.png | Bin .../switch/switch_start_button.png | Bin .../switch/switch_stick_left.png | Bin .../switch/switch_stick_right.png | Bin .../switch/switch_touchpad.png | Bin .../xbox_one/a_button.png | Bin .../xbox_one/b_button.png | Bin .../xbox_one/back.png | Bin .../xbox_one/dpad_down.png | Bin .../xbox_one/dpad_left.png | Bin .../xbox_one/dpad_right.png | Bin .../xbox_one/dpad_up.png | Bin .../xbox_one/guide.png | Bin .../xbox_one/left_bumper.png | Bin .../xbox_one/left_stick_down.png | Bin .../xbox_one/left_stick_left.png | Bin .../xbox_one/left_stick_press.png | Bin .../xbox_one/left_stick_right.png | Bin .../xbox_one/left_stick_up.png | Bin .../xbox_one/left_trigger.png | Bin .../xbox_one/right_bumper.png | Bin .../xbox_one/right_stick_down.png | Bin .../xbox_one/right_stick_left.png | Bin .../xbox_one/right_stick_press.png | Bin .../xbox_one/right_stick_right.png | Bin .../xbox_one/right_stick_up.png | Bin .../xbox_one/right_trigger.png | Bin .../xbox_one/start.png | Bin .../xbox_one/touchpad.png | Bin .../xbox_one/x_button.png | Bin .../xbox_one/y_button.png | Bin 89 files changed, 169 insertions(+), 104 deletions(-) create mode 100644 src/main/java/dev/isxander/controlify/debug/DebugProperties.java rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/a_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/b_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/back.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/dpad_down.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/dpad_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/dpad_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/dpad_up.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/left_bumper.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/left_stick_down.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/left_stick_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/left_stick_press.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/left_stick_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/left_stick_up.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/left_trigger.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/right_bumper.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/right_stick_down.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/right_stick_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/right_stick_press.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/right_stick_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/right_stick_up.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/right_trigger.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/start.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/x_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/dualshock4/y_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_bumper_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_bumper_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_circle_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_dpad_down.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_dpad_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_dpad_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_dpad_up.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_face_button_down.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_face_button_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_face_button_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_face_button_up.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_home_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_left_trigger.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_right_trigger.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_select_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_sl_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_sr_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_start_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_stick_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_stick_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/switch/switch_touchpad.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/a_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/b_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/back.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/dpad_down.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/dpad_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/dpad_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/dpad_up.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/guide.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/left_bumper.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/left_stick_down.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/left_stick_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/left_stick_press.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/left_stick_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/left_stick_up.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/left_trigger.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/right_bumper.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/right_stick_down.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/right_stick_left.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/right_stick_press.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/right_stick_right.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/right_stick_up.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/right_trigger.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/start.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/touchpad.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/x_button.png (100%) rename src/main/resources/assets/controlify/textures/gui/{gamepad_buttons => gamepad}/xbox_one/y_button.png (100%) diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java index f784c06..17bf2fd 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java @@ -125,7 +125,10 @@ public class ControllerBindings { public void fromJson(JsonObject json) { for (var binding : registry().values()) { var bind = json.get(binding.id().toString()).getAsJsonObject(); - if (bind == null) continue; + if (bind == null) { + Controlify.LOGGER.warn("Unknown control: " + binding.id() + " in config file. Skipping!"); + continue; + } binding.setCurrentBind(IBind.fromJson(bind, controller)); } } diff --git a/src/main/java/dev/isxander/controlify/bindings/GamepadBind.java b/src/main/java/dev/isxander/controlify/bindings/GamepadBind.java index e39bd22..6d443a6 100644 --- a/src/main/java/dev/isxander/controlify/bindings/GamepadBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/GamepadBind.java @@ -72,7 +72,7 @@ public enum GamepadBind implements IBind { public void draw(PoseStack matrices, int x, int centerY, Controller controller) { ResourceLocation texture; if (((GamepadConfig)controller.config()).theme == BuiltinGamepadTheme.DEFAULT) { - texture = new ResourceLocation("controlify", "textures/gui/gamepad_buttons/" + controller.type().identifier() + "/" + identifier + ".png"); + texture = new ResourceLocation("controlify", "textures/gui/gamepad/" + controller.type().identifier() + "/" + identifier + ".png"); } else { texture = textureLocations.get(((GamepadConfig)controller.config()).theme); } diff --git a/src/main/java/dev/isxander/controlify/bindings/IBind.java b/src/main/java/dev/isxander/controlify/bindings/IBind.java index d4e1819..82228e6 100644 --- a/src/main/java/dev/isxander/controlify/bindings/IBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/IBind.java @@ -32,14 +32,10 @@ public interface IBind { case JoystickButtonBind.BIND_ID -> JoystickButtonBind.fromJson(json, joystick); case JoystickHatBind.BIND_ID -> JoystickHatBind.fromJson(json, joystick); case JoystickAxisBind.BIND_ID -> JoystickAxisBind.fromJson(json, joystick); - default -> { - Controlify.LOGGER.error("Unknown bind type: " + type); - yield new EmptyBind<>(); - } + default -> throw new IllegalStateException("Unknown bind type for joystick: " + type); }; } - Controlify.LOGGER.error("Could not parse bind for controller: " + controller.name()); - return new EmptyBind<>(); + throw new IllegalStateException("Unknown controller type: " + controller.getClass().getName()); } } diff --git a/src/main/java/dev/isxander/controlify/bindings/JoystickAxisBind.java b/src/main/java/dev/isxander/controlify/bindings/JoystickAxisBind.java index b4b4562..e31a400 100644 --- a/src/main/java/dev/isxander/controlify/bindings/JoystickAxisBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/JoystickAxisBind.java @@ -1,13 +1,18 @@ package dev.isxander.controlify.bindings; import com.google.gson.JsonObject; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickState; +import dev.isxander.controlify.controller.joystick.mapping.JoystickMapping; +import dev.isxander.controlify.controller.joystick.mapping.UnmappedJoystickMapping; import dev.isxander.controlify.gui.DrawSize; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import java.util.Objects; @@ -35,22 +40,32 @@ public class JoystickAxisBind implements IBind { @Override public void draw(PoseStack matrices, int x, int centerY, Controller controller) { - var font = Minecraft.getInstance().font; - font.drawShadow(matrices, getTempButtonName(), x + 1.5f, centerY - font.lineHeight / 2f, 0xFFFFFF); + if (controller != joystick) return; + JoystickMapping mapping = joystick.mapping(); + + String type = joystick.type().identifier(); + String axis = mapping.axis(axisIndex).identifier(); + String direction = mapping.axis(axisIndex).getDirectionIdentifier(axisIndex, this.direction); + var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/axis_" + axis + "_" + direction + ".png"); + + RenderSystem.setShaderTexture(0, texture); + RenderSystem.setShaderColor(1, 1, 1, 1); + GuiComponent.blit(matrices, x, centerY - 11, 0, 0, 22, 22, 22, 22); + + if (mapping instanceof UnmappedJoystickMapping) { + var text = Integer.toString(axisIndex + 1); + var font = Minecraft.getInstance().font; + GuiComponent.drawCenteredString(matrices, font, text, x + 11, centerY - font.lineHeight / 2, 0xFFFFFF); + } } @Override public DrawSize drawSize() { - var font = Minecraft.getInstance().font; - return new DrawSize(font.width(getTempButtonName()) + 3, font.lineHeight); - } + int width = 22; + if (joystick.mapping() instanceof UnmappedJoystickMapping) + width = Math.max(width, Minecraft.getInstance().font.width(Integer.toString(axisIndex + 1))); - private Component getTempButtonName() { - var axis = joystick.mapping().axis(axisIndex); - return Component.empty() - .append(axis.name()) - .append(" ") - .append(axis.getDirectionName(axisIndex, direction)); + return new DrawSize(width, 22); } @Override diff --git a/src/main/java/dev/isxander/controlify/bindings/JoystickButtonBind.java b/src/main/java/dev/isxander/controlify/bindings/JoystickButtonBind.java index d13a9d9..2c4a432 100644 --- a/src/main/java/dev/isxander/controlify/bindings/JoystickButtonBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/JoystickButtonBind.java @@ -1,13 +1,16 @@ package dev.isxander.controlify.bindings; import com.google.gson.JsonObject; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.gui.DrawSize; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import java.util.Objects; @@ -29,19 +32,20 @@ public class JoystickButtonBind implements IBind { @Override public void draw(PoseStack matrices, int x, int centerY, Controller controller) { - var font = Minecraft.getInstance().font; + if (controller != joystick) return; - font.drawShadow(matrices, getTempButtonName(), x + 1.5f, centerY - font.lineHeight / 2f, 0xFFFFFF); + String type = joystick.type().identifier(); + String button = joystick.mapping().button(buttonIndex).identifier(); + var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/button_" + button + ".png"); + + RenderSystem.setShaderTexture(0, texture); + RenderSystem.setShaderColor(1, 1, 1, 1); + GuiComponent.blit(matrices, x, centerY - 11, 0, 0, 22, 22, 22, 22); } @Override public DrawSize drawSize() { - var font = Minecraft.getInstance().font; - return new DrawSize(font.width(getTempButtonName()) + 3, font.lineHeight); - } - - private Component getTempButtonName() { - return joystick.mapping().button(buttonIndex).name(); + return new DrawSize(22, 22); } @Override diff --git a/src/main/java/dev/isxander/controlify/bindings/JoystickHatBind.java b/src/main/java/dev/isxander/controlify/bindings/JoystickHatBind.java index 778fb73..c5d0fe5 100644 --- a/src/main/java/dev/isxander/controlify/bindings/JoystickHatBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/JoystickHatBind.java @@ -1,13 +1,16 @@ package dev.isxander.controlify.bindings; import com.google.gson.JsonObject; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.gui.DrawSize; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import java.util.Objects; @@ -31,21 +34,30 @@ public class JoystickHatBind implements IBind { @Override public void draw(PoseStack matrices, int x, int centerY, Controller controller) { - var font = Minecraft.getInstance().font; - font.drawShadow(matrices, getTempButtonName(), x + 1.5f, centerY - font.lineHeight / 2f, 0xFFFFFF); + if (controller != joystick) return; + + String type = joystick.type().identifier(); + String button = joystick.mapping().button(hatIndex).identifier(); + String direction = "centered"; + if (hatState.isUp()) + direction = "up"; + else if (hatState.isDown()) + direction = "down"; + else if (hatState.isLeft()) + direction = "left"; + else if (hatState.isRight()) + direction = "right"; + + var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/hat" + button + "_" + direction + ".png"); + + RenderSystem.setShaderTexture(0, texture); + RenderSystem.setShaderColor(1, 1, 1, 1); + GuiComponent.blit(matrices, x, centerY - 11, 0, 0, 22, 22, 22, 22); } @Override public DrawSize drawSize() { - var font = Minecraft.getInstance().font; - return new DrawSize(font.width(getTempButtonName()) + 3, font.lineHeight); - } - - private Component getTempButtonName() { - return Component.empty() - .append(joystick.mapping().hat(hatIndex).name()) - .append(" ") - .append(hatState.getDisplayName()); + return new DrawSize(22, 22); } @Override diff --git a/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java b/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java index c79bfc5..42298ef 100644 --- a/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java +++ b/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java @@ -105,8 +105,14 @@ public class ControlifyConfig { } private void applyControllerConfig(Controller controller, JsonObject object) { - controller.setConfig(GSON, object.getAsJsonObject("config")); - controller.bindings().fromJson(object.getAsJsonObject("bindings")); + try { + controller.setConfig(GSON, object.getAsJsonObject("config")); + controller.bindings().fromJson(object.getAsJsonObject("bindings")); + } catch (Exception e) { + Controlify.LOGGER.error("Failed to load controller data for " + controller.uid() + ". Resetting to default!", e); + controller.resetConfig(); + save(); + } } public GlobalSettings globalSettings() { diff --git a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java index 87c15f6..450de56 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java +++ b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java @@ -27,6 +27,7 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -190,7 +191,8 @@ public class YACLHelper { .collect(Collectors.toMap( i -> joystick.mapping().axis(i).identifier(), i -> i, - (x, y) -> x + (x, y) -> x, + LinkedHashMap::new )) .values(); var jsCfg = joystick.config(); diff --git a/src/main/java/dev/isxander/controlify/controller/AbstractController.java b/src/main/java/dev/isxander/controlify/controller/AbstractController.java index 9e1c5d5..f041ee8 100644 --- a/src/main/java/dev/isxander/controlify/controller/AbstractController.java +++ b/src/main/java/dev/isxander/controlify/controller/AbstractController.java @@ -97,6 +97,11 @@ public abstract class AbstractController(getClass()){}.getType()); diff --git a/src/main/java/dev/isxander/controlify/controller/Controller.java b/src/main/java/dev/isxander/controlify/controller/Controller.java index b7ee7ba..2fef521 100644 --- a/src/main/java/dev/isxander/controlify/controller/Controller.java +++ b/src/main/java/dev/isxander/controlify/controller/Controller.java @@ -5,6 +5,7 @@ import com.google.gson.JsonElement; import dev.isxander.controlify.bindings.ControllerBindings; import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.joystick.JoystickController; +import dev.isxander.controlify.debug.DebugProperties; import org.hid4java.HidDevice; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; @@ -24,6 +25,7 @@ public interface Controller deadzones; + private Map deadzones; private transient JoystickController controller; public JoystickConfig(JoystickController controller) { - this.controller = controller; - deadzones = new HashMap<>(); - for (int i = 0; i < controller.axisCount(); i++) { - if (controller.mapping().axis(i).requiresDeadzone()) - deadzones.put(controller.mapping().axis(i).identifier(), 0.2f); - } + setup(controller); } @Override @@ -35,7 +30,14 @@ public class JoystickConfig extends ControllerConfig { return deadzones.getOrDefault(controller.mapping().axis(axis).identifier(), 0.2f); } - void setController(JoystickController controller) { + void setup(JoystickController controller) { this.controller = controller; + if (this.deadzones == null) { + deadzones = new HashMap<>(); + for (int i = 0; i < controller.axisCount(); i++) { + if (controller.mapping().axis(i).requiresDeadzone()) + deadzones.put(controller.mapping().axis(i).identifier(), 0.2f); + } + } } } diff --git a/src/main/java/dev/isxander/controlify/controller/joystick/JoystickController.java b/src/main/java/dev/isxander/controlify/controller/joystick/JoystickController.java index 66b2bc7..0ca7b30 100644 --- a/src/main/java/dev/isxander/controlify/controller/joystick/JoystickController.java +++ b/src/main/java/dev/isxander/controlify/controller/joystick/JoystickController.java @@ -64,6 +64,6 @@ public class JoystickController extends AbstractController