diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index 0e3b38e..0566ab5 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -10,12 +10,12 @@ package eu.midnightdust.midnightcontrols.client; import dev.lambdaurora.spruceui.event.OpenScreenCallback; +import eu.midnightdust.lib.util.PlatformFunctions; import eu.midnightdust.midnightcontrols.ControlsMode; import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.MidnightControlsConstants; import eu.midnightdust.midnightcontrols.MidnightControlsFeature; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; -import eu.midnightdust.midnightcontrols.client.compat.VoxelMapCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory; import eu.midnightdust.midnightcontrols.client.controller.Controller; @@ -24,7 +24,6 @@ import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsHud; import eu.midnightdust.midnightcontrols.client.gui.RingScreen; import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay; import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor; -import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingRegistryImplAccessor; import eu.midnightdust.midnightcontrols.client.ring.ButtonBindingRingAction; import eu.midnightdust.midnightcontrols.client.ring.MidnightRing; import dev.lambdaurora.spruceui.hud.HudManager; @@ -60,7 +59,6 @@ import java.util.TimerTask; */ public class MidnightControlsClient extends MidnightControls implements ClientModInitializer { public static boolean lateInitDone = false; - public static boolean voxelmapInitDone = false; private static MidnightControlsClient INSTANCE; public static final KeyBinding BINDING_LOOK_UP = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "look_up"), InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_8, "key.categories.movement"); @@ -156,18 +154,20 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo } this.hud.setVisible(MidnightControlsConfig.hudEnable); Controller.updateMappings(); - GLFW.glfwSetJoystickCallback((jid, event) -> { - if (event == GLFW.GLFW_CONNECTED) { - var controller = Controller.byId(jid); - client.getToastManager().add(new SystemToast(SystemToast.Type.TUTORIAL_HINT, Text.translatable("midnightcontrols.controller.connected", jid), - Text.literal(controller.getName()))); - } else if (event == GLFW.GLFW_DISCONNECTED) { - client.getToastManager().add(new SystemToast(SystemToast.Type.TUTORIAL_HINT, Text.translatable("midnightcontrols.controller.disconnected", jid), - null)); - } + try { + GLFW.glfwSetJoystickCallback((jid, event) -> { + if (event == GLFW.GLFW_CONNECTED) { + var controller = Controller.byId(jid); + client.getToastManager().add(new SystemToast(SystemToast.Type.TUTORIAL_HINT, Text.translatable("midnightcontrols.controller.connected", jid), + Text.literal(controller.getName()))); + } else if (event == GLFW.GLFW_DISCONNECTED) { + client.getToastManager().add(new SystemToast(SystemToast.Type.TUTORIAL_HINT, Text.translatable("midnightcontrols.controller.disconnected", jid), + null)); + } - this.switchControlsMode(); - }); + this.switchControlsMode(); + }); + } catch (Exception e) {e.printStackTrace();} MidnightControlsCompat.init(this); } @@ -176,30 +176,27 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo * This method is called to initialize keybindings */ public void initKeybindings() { - if (!voxelmapInitDone && FabricLoader.getInstance().isModLoaded("voxelmap") && KeyBindingIDAccessor.getKEYS_BY_ID().containsKey("key.minimap.toggleingamewaypoints")) { - this.log("Adding VoxelMap compatibility..."); - new VoxelMapCompat().handle(this); - InputManager.loadButtonBindings(); - voxelmapInitDone = true; - } if (lateInitDone) return; - if (KeyBindingRegistryImplAccessor.getMODDED_KEY_BINDINGS() == null || KeyBindingRegistryImplAccessor.getMODDED_KEY_BINDINGS().isEmpty()) return; - for (int i = 0; i < KeyBindingRegistryImplAccessor.getMODDED_KEY_BINDINGS().size(); ++i) { - KeyBinding keyBinding = KeyBindingRegistryImplAccessor.getMODDED_KEY_BINDINGS().get(i); - if (!keyBinding.getTranslationKey().contains("midnightcontrols") && !keyBinding.getTranslationKey().contains("ok_zoomer") && !keyBinding.getTranslationKey().contains("okzoomer")) { - category = null; - InputManager.streamCategories().forEach(buttonCategory -> { - if (buttonCategory.getIdentifier().equals(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory()))) - category = buttonCategory; - }); - if (category == null) { - category = new ButtonCategory(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory())); - InputManager.registerCategory(category); - } - ButtonBinding buttonBinding = new ButtonBinding.Builder(keyBinding.getTranslationKey()).category(category).linkKeybind(keyBinding).register(); - if (MidnightControlsConfig.debug) { - logger.info(keyBinding.getTranslationKey()); - logger.info(buttonBinding); + if (KeyBindingIDAccessor.getKEYS_BY_ID() == null || KeyBindingIDAccessor.getKEYS_BY_ID().isEmpty()) return; + if (PlatformFunctions.isModLoaded("voxelmap") && !KeyBindingIDAccessor.getKEYS_BY_ID().containsKey("key.minimap.toggleingamewaypoints")) return; + for (int i = 0; i < KeyBindingIDAccessor.getKEYS_BY_ID().size(); ++i) { + KeyBinding keyBinding = KeyBindingIDAccessor.getKEYS_BY_ID().entrySet().stream().toList().get(i).getValue(); + if (MidnightControlsConfig.excludedKeybindings.stream().noneMatch(excluded -> keyBinding.getTranslationKey().startsWith(excluded))) { + if (!keyBinding.getTranslationKey().contains("midnightcontrols") && !keyBinding.getTranslationKey().contains("ok_zoomer") && !keyBinding.getTranslationKey().contains("okzoomer")) { + category = null; + InputManager.streamCategories().forEach(buttonCategory -> { + if (buttonCategory.getIdentifier().equals(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory()))) + category = buttonCategory; + }); + if (category == null) { + category = new ButtonCategory(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory())); + InputManager.registerCategory(category); + } + ButtonBinding buttonBinding = new ButtonBinding.Builder(keyBinding.getTranslationKey()).category(category).linkKeybind(keyBinding).register(); + if (MidnightControlsConfig.debug) { + logger.info(keyBinding.getTranslationKey()); + logger.info(buttonBinding); + } } } } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index f1f551c..6cc1fe2 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -102,6 +102,9 @@ public class MidnightControlsConfig extends MidnightConfig { @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 = false; + @Entry(category = "controller", name = "Excluded Keybindings") public static List excludedKeybindings = Lists.newArrayList("key.forward", "key.left", "key.back", "key.right", "key.jump", "key.sneak", "key.sprint", "key.inventory", + "key.swapOffhand", "key.drop", "key.use", "key.attack", "key.chat", "key.playerlist", "key.screenshot", "key.togglePerspective", "key.smoothCamera", "key.fullscreen", "key.saveToolbarActivator", "key.loadToolbarActivator", + "key.pickItem", "key.hotbar.1", "key.hotbar.2", "key.hotbar.3", "key.hotbar.4", "key.hotbar.5", "key.hotbar.6", "key.hotbar.7", "key.hotbar.8", "key.hotbar.9"); @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<>(); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java index 7964921..f2eb2b1 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java @@ -1,35 +1,12 @@ package eu.midnightdust.midnightcontrols.client.compat; import eu.midnightdust.midnightcontrols.MidnightControls; -import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.compat.mixin.SodiumOptionsGUIAccessor; -import eu.midnightdust.midnightcontrols.client.controller.InputManager; import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI; -import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; public class SodiumCompat { - private static final MinecraftClient client = MinecraftClient.getInstance(); - public static void handleInput(Screen screen, boolean direction) { - if (screen instanceof SodiumOptionsGUI optionsGUI) { - SodiumOptionsGUIAccessor accessor = (SodiumOptionsGUIAccessor) optionsGUI; - final int max = accessor.getControls().size()-1; - - var option = accessor.getControls().stream().filter(ControlElement::isHovered).findFirst().orElse(accessor.getControls().get(0)); - int i = accessor.getControls().indexOf(option); - i = (direction ? ((max > i) ? ++i : 0) : (i > 0 ? --i : max)); - - var dimensions = accessor.getControls().get(i).getDimensions(); - int x = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterX()); - int y = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterY()); - InputManager.queueMousePosition(x,y); - InputManager.INPUT_MANAGER.updateMousePosition(client); - MidnightControlsClient.get().input.actionGuiCooldown = 5; - if (MidnightControlsConfig.debug) MidnightControls.get().log(i+" "+accessor.getControls().size()+" | " + dimensions.getCenterX() + " " + dimensions.getCenterY()); - } - } public static void handleTabs(Screen screen, boolean direction) { if (screen instanceof SodiumOptionsGUI optionsGUI) { SodiumOptionsGUIAccessor accessor = (SodiumOptionsGUIAccessor) optionsGUI; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/VoxelMapCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/VoxelMapCompat.java deleted file mode 100644 index 9c425e7..0000000 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/VoxelMapCompat.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright © 2022 Motschen - * - * This file is part of MidnightControls. - * - * Licensed under the MIT license. For more information, - * see the LICENSE file. - */ - -package eu.midnightdust.midnightcontrols.client.compat; - -import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; -import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; -import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; -import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory; -import eu.midnightdust.midnightcontrols.client.controller.InputManager; -import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor; -import net.minecraft.client.option.KeyBinding; -import org.aperlambda.lambdacommon.Identifier; -import org.jetbrains.annotations.NotNull; -import org.lwjgl.glfw.GLFW; - -/** - * Represents a compatibility handler for VoxelMap. - * - * @author Motschen - * @version 1.8.0 - * @since 1.8.0 - */ -public class VoxelMapCompat implements CompatHandler { - - private final KeyBinding voxelMapZoomKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.zoom", null); - private final KeyBinding voxelmapFullscreenKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.togglefullscreen", null); - private final KeyBinding voxelmapMenuKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.voxelmapmenu", null);; - private final KeyBinding voxelmapWaypointMenuKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.waypointmenu", null);; - private final KeyBinding voxelmapWaypointKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.waypointhotkey", null); - private final KeyBinding voxelmapMobToggleKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.togglemobs", null); - private final KeyBinding voxelmapWaypointToggleKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.toggleingamewaypoints", null); - private static final ButtonCategory VOXELMAP_CATEGORY = InputManager.registerCategory(new Identifier("minecraft","controls.minimap.title")); - - - @Override - public void handle(@NotNull MidnightControlsClient mod) { - if (MidnightControlsConfig.debug && KeyBindingIDAccessor.getKEYS_BY_ID() != null) KeyBindingIDAccessor.getKEYS_BY_ID().forEach((a, b) -> System.out.println(a + " - " + b)); - new ButtonBinding.Builder("key.minimap.zoom") - .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_X) - .onlyInGame() - .cooldown(true) - .category(VOXELMAP_CATEGORY) - .linkKeybind(voxelMapZoomKey) - .register(); - new ButtonBinding.Builder("key.minimap.togglefullscreen") - .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_Y) - .onlyInGame() - .cooldown(true) - .category(VOXELMAP_CATEGORY) - .linkKeybind(voxelmapFullscreenKey) - .register(); - new ButtonBinding.Builder("key.minimap.voxelmapmenu") - .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_START) - .onlyInGame() - .cooldown(true) - .category(VOXELMAP_CATEGORY) - .linkKeybind(voxelmapMenuKey) - .register(); - new ButtonBinding.Builder("key.minimap.waypointmenu") - .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_GUIDE) - .onlyInGame() - .cooldown(true) - .category(VOXELMAP_CATEGORY) - .linkKeybind(voxelmapWaypointMenuKey) - .register(); - new ButtonBinding.Builder("key.minimap.waypointhotkey") - .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_BACK) - .onlyInGame() - .cooldown(true) - .category(VOXELMAP_CATEGORY) - .linkKeybind(voxelmapWaypointKey) - .register(); - new ButtonBinding.Builder("key.minimap.togglemobs") - .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_A) - .onlyInGame() - .cooldown(true) - .category(VOXELMAP_CATEGORY) - .linkKeybind(voxelmapMobToggleKey) - .register(); - new ButtonBinding.Builder("key.minimap.toggleingamewaypoints") - .buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_B) - .onlyInGame() - .cooldown(true) - .category(VOXELMAP_CATEGORY) - .linkKeybind(voxelmapWaypointToggleKey) - .register(); - } -} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingRegistryImplAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingRegistryImplAccessor.java deleted file mode 100644 index efd6d6e..0000000 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingRegistryImplAccessor.java +++ /dev/null @@ -1,19 +0,0 @@ -package eu.midnightdust.midnightcontrols.client.mixin; - -import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; -import net.minecraft.client.option.KeyBinding; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -@Mixin(value = KeyBindingRegistryImpl.class, remap = false) -public interface KeyBindingRegistryImplAccessor { - - @Accessor @Final - static List getMODDED_KEY_BINDINGS() { - return null; - } - -} diff --git a/src/main/resources/midnightcontrols.mixins.json b/src/main/resources/midnightcontrols.mixins.json index 8c087f8..64d6193 100644 --- a/src/main/resources/midnightcontrols.mixins.json +++ b/src/main/resources/midnightcontrols.mixins.json @@ -17,7 +17,6 @@ "ChatScreenMixin", "RecipeBookWidgetAccessor", "WorldRendererMixin", - "KeyBindingRegistryImplAccessor", "KeyBindingIDAccessor", "TabNavigationWidgetAccessor", "ScreenMixin",