From df7c7bbdadeac6fa2989f129e18d49df78ccf3be Mon Sep 17 00:00:00 2001 From: Motschen Date: Thu, 30 Jun 2022 21:29:59 +0200 Subject: [PATCH] MidnightControls 1.3.0 - Fixes and Improvements - Merge #48 (Split rotation speed in X and Y, thanks to @ronniedude) - Merge #47 (Korean translations by @gyular) - Fix #50 (Stack pick-up problems in survival mode) - Add some compatibility measures for EMI (Will likely be improved further in the future) - Remove all REI-related code (not working anyway, EMI is better) - Possibly fix #41 (Random crashes when changing keybinds) --- gradle.properties | 2 +- .../client/MidnightControlsClient.java | 2 +- .../client/MidnightControlsConfig.java | 22 +- .../client/MidnightInput.java | 4 +- .../client/compat/MidnightControlsCompat.java | 8 + .../compat/MidnightControlsMixinPlugin.java | 4 - .../client/compat/ReiCompat.java | 355 ------------------ .../compat/mixin/EntryListWidgetAccessor.java | 30 -- .../compat/mixin/EntryWidgetAccessor.java | 23 -- .../mixin/RecipeViewingScreenAccessor.java | 32 -- .../VillagerRecipeViewingScreenAccessor.java | 44 --- .../client/controller/InputHandlers.java | 16 +- .../client/gui/MidnightControlsHud.java | 4 +- .../client/mixin/HandledScreenMixin.java | 20 +- 14 files changed, 53 insertions(+), 513 deletions(-) delete mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java delete mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryListWidgetAccessor.java delete mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryWidgetAccessor.java delete mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/RecipeViewingScreenAccessor.java delete mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/VillagerRecipeViewingScreenAccessor.java diff --git a/gradle.properties b/gradle.properties index 89510ac..ce1255f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=1.19+build.1 loader_version=0.14.7 # Mod Properties -mod_version = 1.2.2 +mod_version = 1.3.0 maven_group = eu.midnightdust archives_base_name = midnightcontrols modrinth_id=bXX9h73M diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index 2a5c56b..1d0ead5 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -156,7 +156,7 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo if (KeyBindingRegistryImplAccessor.getModdedKeyBindings() == null || KeyBindingRegistryImplAccessor.getModdedKeyBindings().isEmpty()) return; for (int i = 0; i < KeyBindingRegistryImplAccessor.getModdedKeyBindings().size(); ++i) { KeyBinding keyBinding = KeyBindingRegistryImplAccessor.getModdedKeyBindings().get(i); - if (!keyBinding.getTranslationKey().contains("midnightcontrols")) { + 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()))) diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index 01eea8f..bb2aae5 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -9,9 +9,9 @@ package eu.midnightdust.midnightcontrols.client; +import com.google.common.collect.Lists; import eu.midnightdust.lib.config.MidnightConfig; import eu.midnightdust.midnightcontrols.ControlsMode; -import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.MidnightControlsFeature; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.Controller; @@ -51,9 +51,8 @@ public class MidnightControlsConfig extends MidnightConfig { @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; - public static double DEFAULT_MAX_VALUE = 1; @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 = 40.0; + @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.unfocused_input") public static boolean unfocusedInput = false; @Entry(name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false; @@ -61,11 +60,11 @@ public class MidnightControlsConfig extends MidnightConfig { @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 = List.of("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", "me.flashyreese.mods.reeses_sodium_options.client.gui"); - @Entry(name = "Keybindings") public static Map BINDINGS = Map.of(); + @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", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen"); + @Entry(name = "Keybindings") public static Map BINDINGS = new HashMap<>(); private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?"); - @Entry(name = "Max analog values") public static double[] maxAnalogValues = new double[]{DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE}; + @Entry(name = "Max analog values") public static double[] maxAnalogValues = new double[]{1, 1, 1, 1}; /** * Loads the configuration @@ -156,7 +155,7 @@ public class MidnightControlsConfig extends MidnightConfig { public static double getAxisMaxValue(int axis) { if (axis >= MidnightControlsConfig.maxAnalogValues.length) - return DEFAULT_MAX_VALUE; + return 1; return MidnightControlsConfig.maxAnalogValues[axis]; } @@ -273,9 +272,8 @@ public class MidnightControlsConfig extends MidnightConfig { leftDeadZone = 0.25; invertRightYAxis = false; invertRightXAxis = false; - DEFAULT_MAX_VALUE = 1; rotationSpeed = 40.0; - yAxisRotationSpeed = 40.0; + yAxisRotationSpeed = rotationSpeed; mouseSpeed = 25.0; unfocusedInput = false; virtualMouse = false; @@ -283,9 +281,9 @@ public class MidnightControlsConfig extends MidnightConfig { controllerID = 0; secondControllerID = -1; controllerType = ControllerType.DEFAULT; - mouseScreens = List.of("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", "me.flashyreese.mods.reeses_sodium_options.client.gui"); - BINDINGS = Map.of(); - maxAnalogValues = new double[]{DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE}; + 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", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen"); + BINDINGS = new HashMap<>(); + maxAnalogValues = new double[]{1, 1, 1, 1}; } /** diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index d9e89fc..947627a 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -267,7 +267,7 @@ public class MidnightInput { } } - private void handleButton(@NotNull MinecraftClient client, int button, int action, boolean state) { + public void handleButton(@NotNull MinecraftClient client, int button, int action, boolean state) { if (this.controlsInput != null && this.controlsInput.focusedBinding != null) { if (action == 0 && !this.controlsInput.currentButtons.contains(button)) { this.controlsInput.currentButtons.add(button); @@ -549,7 +549,7 @@ public class MidnightInput { } } - private boolean handleAButton(@NotNull Screen screen, @NotNull Element focused) { + public boolean handleAButton(@NotNull Screen screen, @NotNull Element focused) { if (focused instanceof PressableWidget widget) { widget.playDownSound(MinecraftClient.getInstance().getSoundManager()); widget.onPress(); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java index 6f23cb2..f646a86 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java @@ -159,4 +159,12 @@ public class MidnightControlsCompat { public static boolean isReiPresent() { return FabricLoader.getInstance().isModLoaded("roughlyenoughitems"); } + /** + * Returns whether EMI is present. + * + * @return true if EMI is present, else false + */ + public static boolean isEMIPresent() { + return FabricLoader.getInstance().isModLoaded("emi"); + } } 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 f08a33c..4c60faa 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java @@ -30,10 +30,6 @@ public class MidnightControlsMixinPlugin implements IMixinConfigPlugin { private final HashMap conditionalMixins = new HashMap<>(); public MidnightControlsMixinPlugin() { - this.putConditionalMixin("EntryListWidgetAccessor", MidnightControlsCompat.isReiPresent()); - this.putConditionalMixin("EntryWidgetAccessor", MidnightControlsCompat.isReiPresent()); - this.putConditionalMixin("RecipeViewingScreenAccessor", MidnightControlsCompat.isReiPresent()); - this.putConditionalMixin("VillagerRecipeViewingScreenAccessor", MidnightControlsCompat.isReiPresent()); this.putConditionalMixin("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium")); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java deleted file mode 100644 index 0756f41..0000000 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright © 2021 LambdAurora - * - * 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.ButtonState; -import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; -import eu.midnightdust.midnightcontrols.client.compat.mixin.EntryListWidgetAccessor; -import eu.midnightdust.midnightcontrols.client.compat.mixin.EntryWidgetAccessor; -import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; -import eu.midnightdust.midnightcontrols.client.controller.InputHandlers; -import eu.midnightdust.midnightcontrols.client.controller.PressAction; -import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; -import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.Selectable; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.EntryListWidget; -import net.minecraft.util.Identifier; -import net.minecraft.util.Pair; -import org.aperlambda.lambdacommon.utils.LambdaReflection; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Optional; - -import static eu.midnightdust.midnightcontrols.client.compat.CompatHandler.SlotPos.INVALID_SLOT; -import static org.lwjgl.glfw.GLFW.*; - -/** - * Represents a compatibility handler for REI. - * - * @author LambdAurora - * @version 1.7.0 - * @since 1.2.0 - */ -public class ReiCompat implements CompatHandler { - private static EntryListWidget ENTRY_LIST_WIDGET; - - @Override - public void handle(@NotNull MidnightControlsClient mod) { - /*ButtonBinding.builder(new Identifier("rei", "category_back")) - .buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER) - .filter((client, binding) -> isViewingScreen(client.currentScreen)) - .action(handleTab(false)) - .cooldown(true) - .register(); - ButtonBinding.builder(new Identifier("rei", "category_next")) - .buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER) - .filter((client, binding) -> isViewingScreen(client.currentScreen)) - .action(handleTab(true)) - .cooldown(true) - .register(); - - ButtonBinding.builder(new Identifier("rei", "page_back")) - .buttons(ButtonBinding.axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_X, false)) - .filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen)) - .action(handlePage(false)) - .cooldown(true) - .register(); - ButtonBinding.builder(new Identifier("rei", "page_next")) - .buttons(ButtonBinding.axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_X, true)) - .filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen)) - .action(handlePage(true)) - .cooldown(true) - .register(); - - ButtonBinding.builder(new Identifier("rei", "recipe_back")) - .buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP) - .filter((client, binding) -> isViewingScreen(client.currentScreen)) - .action(handleRecipe(false)) - .cooldown(true) - .register(); - ButtonBinding.builder(new Identifier("rei", "recipe_next")) - .buttons(GLFW_GAMEPAD_BUTTON_DPAD_DOWN) - .filter((client, binding) -> isViewingScreen(client.currentScreen)) - .action(handleRecipe(true)) - .cooldown(true) - .register(); - - // For some reasons this is broken. - ButtonBinding.builder(new Identifier("rei", "show_usage")) - .buttons(GLFW_GAMEPAD_BUTTON_RIGHT_THUMB) - .filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen)) - .action(handleShowRecipeUsage(true)) - .cooldown(true) - .register(); - - ButtonBinding.builder(new Identifier("rei", "show_recipe")) - .buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB) - .filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen)) - .action(handleShowRecipeUsage(false)) - .cooldown(true) - .register(); - */ - } - /* - - @Override - public boolean requireMouseOnScreen(Screen screen) { - return isViewingScreen(screen); - } - - @Override - public @Nullable CompatHandler.SlotPos getSlotAt(@NotNull Screen screen, int mouseX, int mouseY) { - - ScreenOverlayImpl overlay = ScreenOverlayImpl.getInstance(); - if (overlay.isInside(mouseX, mouseY)) { - EntryListWidget widget = getEntryListWidget(); - if (widget == null) - return null; - - return this.getSlotAt(widget, mouseX, mouseY, false); - } else if (isViewingScreen(screen)) { - for (Element element : screen.children()) { - var slot = this.getSlotAt(element, mouseX, mouseY, true); - if (slot != null) - return slot; - } - } - return null; - } - - private @Nullable CompatHandler.SlotPos getSlotAt(@NotNull Element element, int mouseX, int mouseY, boolean allowEmpty) { - if (element instanceof EntryWidget) { - EntryWidget entry = (EntryWidget) element; - if (entry.containsMouse(mouseX, mouseY)) { - if (!allowEmpty && entry.getEntries().isEmpty()) - return INVALID_SLOT; - return new SlotPos(entry.getBounds().getX() + 1, entry.getBounds().getY() + 1); - } - } else if (element instanceof EntryListWidget) { - List entries = ((EntryListWidgetAccessor) element).getEntries(); - for (EntryListEntryWidget entry : entries) { - var slot = this.getSlotAt(entry, mouseX, mouseY, allowEmpty); - if (slot != null && slot != INVALID_SLOT) - return slot; - } - } else if (!(element instanceof ButtonWidget) && element instanceof WidgetWithBounds widgetWithBounds) { - for (var child : widgetWithBounds.children()) { - var slot = this.getSlotAt(child, mouseX, mouseY, allowEmpty); - if (slot != null && slot != INVALID_SLOT) - return slot; - } - } - return null; - } - - private static boolean isViewingScreen(Screen screen) { - return screen instanceof DefaultDisplayViewingScreen || screen instanceof CompositeDisplayViewingScreen; - } - - @Override - public boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen) { - if (!isViewingScreen(screen)) - return false; - - MinecraftClient.getInstance().setScreen(REIRuntimeImpl.getInstance().getPreviousContainerScreen()); - REIRuntimeImpl.getInstance().getLastOverlay().init(); - return true; - } - - private static EntryListWidget getEntryListWidget() { - if (ENTRY_LIST_WIDGET == null) { - ENTRY_LIST_WIDGET = LambdaReflection.getFirstFieldOfType(ContainerScreenOverlay.class, EntryListWidget.class) - .map(field -> (EntryListWidget) LambdaReflection.getFieldValue(null, field)) - .orElse(null); - } - return ENTRY_LIST_WIDGET; - } - - private static @Nullable AbstractEntryStack getCurrentStack(@NotNull MinecraftClient client) { - double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(); - double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight(); - - if (isViewingScreen(client.currentScreen)) { - for (Element element : client.currentScreen.children()) { - EntryStack stack = getCurrentStack(element, x, y); - if (stack != null) - return stack; - } - } - - Optional overlay = REIRuntimeImpl.getInstance().getOverlay(false,false); - if (!overlay.isPresent()) - return RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen); - EntryListWidget widget = getEntryListWidget(); - if (widget == null) - return ScreenOverlayImpl.getInstance().getInstance().getOverlayMenu()..getScreenFocusedStack(client.currentScreen); - - return getCurrentStack(widget, x, y); - } - - private static @Nullable EntryStack getCurrentStack(@NotNull Element element, double mouseX, double mouseY) { - if (element instanceof EntryWidget) { - EntryWidget entry = (EntryWidget) element; - if (entry.containsMouse(mouseX, mouseY)) - return ((EntryWidgetAccessor) entry).lambdacontrols_getCurrentEntry(); - } else if (element instanceof EntryListWidget) { - List entries = ((EntryListWidgetAccessor) element).getEntries(); - for (EntryListEntryWidget entry : entries) { - if (entry.containsMouse(mouseX, mouseY)) { - return ((EntryWidgetAccessor) entry).lambdacontrols_getCurrentEntry(); - } - } - } else if (!(element instanceof ButtonWidget) && element instanceof WidgetWithBounds) { - for (Element child : ((WidgetWithBounds) element).children()) { - EntryStack stack = getCurrentStack(child, mouseX, mouseY); - if (stack != null) - return stack; - } - } - return null; - } - - private static PressAction handleShowRecipeUsage(boolean usage) { - return (client, button, value, action) -> { - if (action.isUnpressed()) - return false; - - EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen); - if (stack == null) { - stack = getCurrentStack(client); - } - - if (stack != null && !stack.isEmpty()) { - stack = stack.copy(); - if (usage) { - return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); - } else { - return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); - } - } - - return false; - }; - } - - private static PressAction handlePage(boolean next) { - return (client, button, value, action) -> { - if (action == ButtonState.RELEASE) - return false; - - Optional overlay = ScreenHelper.getOptionalOverlay(); - if (!overlay.isPresent()) - return false; - - EntryListWidget widget = getEntryListWidget(); - if (widget == null) - return false; - - if (next) - widget.nextPage(); - else - widget.previousPage(); - widget.updateEntriesPosition(); - - return true; - }; - } - - /** - * Returns the handler for category tabs buttons. - * - * @param next True if the action is to switch to the next tab. - * @return The handler. - */ - /* - private static PressAction handleTab(boolean next) { - return (client, button, value, action) -> { - if (action != ButtonState.RELEASE) - return false; - - if (client.currentScreen instanceof RecipeViewingScreen) { - RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen; - if (next) - screen.getCategoryNext().onClick(); - else - screen.getCategoryBack().onClick(); - return true; - } else if (client.currentScreen instanceof VillagerRecipeViewingScreen) { - VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen; - List> categories = screen.getCategories(); - int currentTab = screen.getSelectedCategoryIndex(); - screen.setSelectedCategoryIndex(getNextIndex(currentTab, categories.size(), next)); - screen.setSelectedRecipeIndex(0); - screen.lambdacontrols_init(); - return true; - } - return false; - }; - } - - private static PressAction handleRecipe(boolean next) { - return (client, button, value, action) -> { - if (action.isUnpressed()) - return false; - - if (client.currentScreen instanceof RecipeViewingScreen) { - RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen; - if (next) - screen.getRecipeNext().onClick(); - else - screen.getRecipeBack().onClick(); - return true; - } else if (client.currentScreen instanceof VillagerRecipeViewingScreen) { - VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen; - List> categories = screen.getCategories(); - int currentTab = screen.getSelectedCategoryIndex(); - List recipes = screen.getCategoryMap().get(categories.get(currentTab)); - - if (recipes.size() == 0) - return true; - - int currentRecipe = screen.getSelectedRecipeIndex(); - int nextRecipe = getNextIndex(currentRecipe, recipes.size(), next); - - if (nextRecipe == 0) { - screen.getScrolling().scrollTo(0.0, true); - } else if (nextRecipe == recipes.size() - 1) { - screen.getScrolling().scrollTo(screen.getScrolling().getMaxScroll(), true); - } else { - double scrollAmount = screen.getScrolling().getMaxScroll() / (float) recipes.size(); - screen.getScrolling().offset(next ? scrollAmount : -scrollAmount, true); - } - - screen.setSelectedRecipeIndex(nextRecipe); - screen.lambdacontrols_init(); - - return true; - } - - return false; - }; - } - - private static int getNextIndex(int currentIndex, int size, boolean next) { - int nextIndex = currentIndex + (next ? 1 : -1); - if (nextIndex < 0) - nextIndex = size - 1; - else if (nextIndex >= size) - nextIndex = 0; - return nextIndex; - } - */ -} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryListWidgetAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryListWidgetAccessor.java deleted file mode 100644 index ee027a9..0000000 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryListWidgetAccessor.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright © 2021 LambdAurora - * - * This file is part of midnightcontrols. - * - * Licensed under the MIT license. For more information, - * see the LICENSE file. - */ - -package eu.midnightdust.midnightcontrols.client.compat.mixin; - -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.widget.EntryListWidget; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -/** - * Represents an accessor to REI's EntryListWidget. - * - * @author LambdAurora - * @version 1.5.0 - * @since 1.5.0 - */ -@Mixin(value = EntryListWidget.class, remap = false) -public interface EntryListWidgetAccessor { - @Accessor(value = "children") - List getEntries(); -} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryWidgetAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryWidgetAccessor.java deleted file mode 100644 index 1f91774..0000000 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/EntryWidgetAccessor.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright © 2021 LambdAurora - * - * This file is part of midnightcontrols. - * - * Licensed under the MIT license. For more information, - * see the LICENSE file. - */ - -package eu.midnightdust.midnightcontrols.client.compat.mixin; - -/** - * Represents an accessor to REI's EntryWidget. - * - * @author LambdAurora - * @version 1.5.0 - * @since 1.5.0 - */ -//@Mixin(value = EntryWidget.class, remap = false) -public interface EntryWidgetAccessor { - /*@Invoker("getCurrentEntry") - EntryStack midnightcontrols_getCurrentEntry();*/ -} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/RecipeViewingScreenAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/RecipeViewingScreenAccessor.java deleted file mode 100644 index c5ca69a..0000000 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/RecipeViewingScreenAccessor.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright © 2021 LambdAurora - * - * This file is part of midnightcontrols. - * - * Licensed under the MIT license. For more information, - * see the LICENSE file. - */ - -package eu.midnightdust.midnightcontrols.client.compat.mixin; - -/** - * Represents an accessor to REI's RecipeViewingScreen. - * - * @author LambdAurora - * @version 1.7.0 - * @since 1.2.0 - */ -//@Mixin(value = DefaultDisplayViewingScreen.class, remap = false) -public interface RecipeViewingScreenAccessor { - /*@Accessor("categoryBack") - Button getCategoryBack(); - - @Accessor("categoryNext") - Button getCategoryNext(); - - @Accessor("recipeBack") - Button getRecipeBack(); - - @Accessor("recipeNext") - Button getRecipeNext();*/ -} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/VillagerRecipeViewingScreenAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/VillagerRecipeViewingScreenAccessor.java deleted file mode 100644 index eade134..0000000 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/VillagerRecipeViewingScreenAccessor.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright © 2021 LambdAurora - * - * This file is part of midnightcontrols. - * - * Licensed under the MIT license. For more information, - * see the LICENSE file. - */ - -package eu.midnightdust.midnightcontrols.client.compat.mixin; - -/** - * Represents an accessor to REI's VillagerRecipeViewingScreen. - * - * @author LambdAurora - * @version 1.7.0 - * @since 1.2.0 - */ -//@Mixin(CompositeDisplayViewingScreen.class) -public interface VillagerRecipeViewingScreenAccessor { - /*@Accessor(value = "categoryMap", remap = false) - Map, List> getCategoryMap(); - - @Accessor(value = "categories", remap = false) - List> getCategories(); - - @Accessor(value = "selectedCategoryIndex", remap = false) - int getSelectedCategoryIndex(); - - @Accessor(value = "selectedCategoryIndex", remap = false) - void setSelectedCategoryIndex(int selectedCategoryIndex); - - @Accessor(value = "selectedRecipeIndex", remap = false) - int getSelectedRecipeIndex(); - - @Accessor(value = "selectedRecipeIndex", remap = false) - void setSelectedRecipeIndex(int selectedRecipeIndex); - - @Accessor(value = "scrolling", remap = false) - ScrollingContainer getScrolling(); - - @Invoker("init") - void midnightcontrols_init();*/ -} 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 b42e4cf..8e6e881 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -28,6 +28,7 @@ import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.client.util.ScreenshotRecorder; import net.minecraft.item.ItemGroup; +import net.minecraft.item.Items; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; import org.aperlambda.lambdacommon.utils.Pair; @@ -142,22 +143,29 @@ public class InputHandlers { int slotId; if (slot == null) { - if (client.player.currentScreenHandler.getCursorStack().isEmpty()) + if (button.getName().equals("take_all")) { return false; + } slotId = accessor.midnightcontrols$isClickOutsideBounds(x, y, accessor.getX(), accessor.getY(), GLFW_MOUSE_BUTTON_1) ? -999 : -1; } else { slotId = slot.id; } var actionType = SlotActionType.PICKUP; int clickData = GLFW.GLFW_MOUSE_BUTTON_1; + MidnightControlsClient.get().input.inventoryInteractionCooldown = 5; switch (button.getName()) { case "take_all": - if (accessor instanceof CreativeInventoryScreen) + if (accessor instanceof CreativeInventoryScreen) { if (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot)) actionType = SlotActionType.CLONE; - if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))) - actionType = SlotActionType.CLONE; + if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))) + actionType = SlotActionType.CLONE; + } else { + if (slot != null && screen.getScreenHandler().getCursorStack() != null) { + return screen.mouseReleased(x, y, GLFW.GLFW_MOUSE_BUTTON_1); + } else actionType = SlotActionType.PICKUP_ALL; + } break; case "take": clickData = GLFW_MOUSE_BUTTON_2; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java index 36067ae..1263049 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java @@ -72,8 +72,8 @@ public class MidnightControlsHud extends Hud { this.dropItemButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.DROP_ITEM); this.attackButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.ATTACK); this.useButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.USE); - if (client.options.getGuiScale().getValue() >= 4) { - scale = 0.75f * (client.options.getGuiScale().getValue() -3); + if (client.getWindow().getScaleFactor() >= 4) { + scale = (float) (0.75f * (client.getWindow().getScaleFactor()-3)); } else scale = 1f; } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/HandledScreenMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/HandledScreenMixin.java index c54d42e..eea2062 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/HandledScreenMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/HandledScreenMixin.java @@ -13,6 +13,7 @@ import eu.midnightdust.midnightcontrols.ControlsMode; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.MidnightInput; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; +import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer; import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor; import net.minecraft.client.MinecraftClient; @@ -20,9 +21,11 @@ import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.injection.At; @@ -34,6 +37,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; */ @Mixin(HandledScreen.class) public abstract class HandledScreenMixin implements HandledScreenAccessor { + @Unique private static float scale = 1f; @Accessor("x") public abstract int getX(); @@ -55,16 +59,26 @@ public abstract class HandledScreenMixin implements HandledScreenAccessor { public void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) { var client = MinecraftClient.getInstance(); - int x = 2, y = client.getWindow().getScaledHeight() - 2 - MidnightControlsRenderer.ICON_SIZE; - + if (client.getWindow().getScaleFactor() >= 4) { + scale = (float) (0.75f * (client.getWindow().getScaleFactor()-3)); + } else scale = 1f; + if (scale != 1f) matrices.scale(scale,scale,scale); + int x = 2, y = (int) (client.getWindow().getScaledHeight() * (1 / scale) - 2 - MidnightControlsRenderer.ICON_SIZE); + if (MidnightControlsCompat.isEMIPresent()) { + x += 40 * (1 / scale); + } x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_A}, "midnightcontrols.action.pickup_all", true, client) + 2; x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_B}, "midnightcontrols.action.exit", true, client) + 2; if (MidnightControlsCompat.isReiPresent()) { x = 2; y -= 24; } - x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_X}, "midnightcontrols.action.pickup", true, client) + 2; + if (MidnightControlsCompat.isEMIPresent()) { + x = (int) (client.getWindow().getScaledWidth() * (1 / scale) - 55 - client.textRenderer.getWidth(Text.translatable("midnightcontrols.action.pickup")) * (1 / scale) - client.textRenderer.getWidth(Text.translatable("midnightcontrols.action.quick_move")) - MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.TAKE) - MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.QUICK_MOVE)); + } + x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_X}, "midnightcontrols.action.pickup", true, client); MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_Y}, "midnightcontrols.action.quick_move", true, client); + if (scale != 1f) matrices.scale(1,1,1); } } }