From 6e64c7c97d0e9a0b83d65aa5070f0661192a0848 Mon Sep 17 00:00:00 2001 From: Motschen Date: Thu, 9 Jun 2022 21:59:26 +0200 Subject: [PATCH 01/21] MidnightControls 1.1.0 - 1.19, Inventory Improvements - Update to 1.19 - Make buttons for Item/Stack Grabbing and Quick Moving configurable - Add Keybinds for moving between Fabric Creative Inventory Pages --- build.gradle | 2 +- controller_banner.svg | 269 ++++++++++++++++++ gradle.properties | 22 +- .../midnightcontrols/MidnightControls.java | 4 +- .../client/ControllerType.java | 22 +- .../midnightcontrols/client/HudSide.java | 3 +- .../client/MidnightControlsClient.java | 9 +- .../client/MidnightControlsConfig.java | 2 +- .../client/MidnightInput.java | 137 +++++---- .../client/VirtualMouseSkin.java | 3 +- .../client/compat/ReiCompat.java | 10 - .../client/controller/ButtonBinding.java | 118 ++++---- .../client/controller/Controller.java | 5 +- .../client/controller/InputHandlers.java | 78 ++++- .../client/gui/MappingsStringInputWidget.java | 7 +- .../client/gui/MidnightControlsHud.java | 8 +- .../gui/MidnightControlsSettingsScreen.java | 109 ++++--- .../gui/ReloadControllerMappingsOption.java | 7 +- .../client/gui/RingScreen.java | 4 +- .../client/gui/TouchscreenOverlay.java | 4 +- .../gui/widget/ControllerButtonWidget.java | 5 +- .../gui/widget/ControllerControlsWidget.java | 6 +- .../client/gui/widget/ControlsListWidget.java | 18 +- .../client/mixin/ClientPlayerEntityMixin.java | 11 +- .../mixin/ControlsOptionsScreenMixin.java | 5 +- .../client/mixin/GameOptionsMixin.java | 10 +- .../client/mixin/MinecraftClientMixin.java | 2 +- .../client/ring/KeyBindingRingAction.java | 4 +- .../client/ring/RingAction.java | 3 +- .../client/ring/RingButtonMode.java | 3 +- .../assets/midnightcontrols/lang/de_de.json | 4 + .../assets/midnightcontrols/lang/en_us.json | 4 + 32 files changed, 624 insertions(+), 274 deletions(-) create mode 100644 controller_banner.svg diff --git a/build.gradle b/build.gradle index d01c265..853b831 100644 --- a/build.gradle +++ b/build.gradle @@ -111,7 +111,7 @@ dependencies { modImplementation "org.quiltmc:quilt-json5:1.0.0" //modImplementation "maven.modrinth:sodium:${project.sodium_version}" - modImplementation("me.shedaniel:RoughlyEnoughItems-runtime-fabric:${project.rei_version}") + //modImplementation("maven.modrinth:emi:${project.emi_version}") modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}" modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}" diff --git a/controller_banner.svg b/controller_banner.svg new file mode 100644 index 0000000..51d98f4 --- /dev/null +++ b/controller_banner.svg @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gradle.properties b/gradle.properties index 0881019..ec8cf84 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,26 +3,26 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/use -minecraft_version=1.18.1 -yarn_mappings=1.18.1+build.22 -loader_version=0.13.3 +minecraft_version=1.19 +yarn_mappings=1.19+build.1 +loader_version=0.14.7 # Mod Properties -mod_version = 1.0.0 +mod_version = 1.1.0 maven_group = eu.midnightdust archives_base_name = midnightcontrols 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.46.6+1.18 -sodium_version=mc1.18.2-0.4.1 -spruceui_version=3.3.2+1.17 -midnightlib_version=0.4.0 -modmenu_version=2.0.2 -emotecraft_version=2.1-MC1.18.1-fabric +fabric_version=0.55.2+1.19 +sodium_version=mc1.19-0.4.1 +spruceui_version=4.0.0+1.19 +midnightlib_version=0.5.2 +modmenu_version=4.0.0 +emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric bendylib_version=2.0.+ -rei_version=7.4.456 +emi_version=0.1.1+1.18.2 # Ok Zoomer and LibZoomer are temporarily disabled for the time being, as we are currently using Reflection at runtime instead in OkZoomerCompat due to there being two major, completely incompatible API versions. # ok_zoomer_version=5.0.0-beta.3+1.17.1 diff --git a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java index 115bb05..fb1d0ae 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java @@ -16,7 +16,7 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.network.PacketByteBuf; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -38,7 +38,7 @@ public class MidnightControls implements ModInitializer { public static final Identifier FEATURE_CHANNEL = new Identifier(MidnightControlsConstants.FEATURE_CHANNEL.toString()); public static final Identifier HELLO_CHANNEL = new Identifier(MidnightControlsConstants.HELLO_CHANNEL.toString()); - public static final TranslatableText NOT_BOUND_TEXT = new TranslatableText("midnightcontrols.not_bound"); + public static final Text NOT_BOUND_TEXT = Text.translatable("midnightcontrols.not_bound"); public final Logger logger = LogManager.getLogger("MidnightControls"); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java b/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java index 49ba222..a3b388e 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java @@ -9,9 +9,7 @@ package eu.midnightdust.midnightcontrols.client; -import net.minecraft.text.LiteralText; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import org.aperlambda.lambdacommon.utils.Nameable; import org.jetbrains.annotations.NotNull; @@ -26,22 +24,22 @@ import java.util.Optional; * @since 1.0.0 */ public enum ControllerType implements Nameable { - DEFAULT(0, new LiteralText("Default")), - DUALSHOCK(1, new LiteralText("Dualshock")), - DUALSENSE(2, new LiteralText("Dualsense")), - SWITCH(3, new LiteralText("Switch")), - XBOX_360(4, new LiteralText("Xbox 360")), - XBOX(5, new LiteralText("Xbox")), - STEAM_DECK(6, new LiteralText("Steam Deck")), - STEAM_CONTROLLER(7, new LiteralText("Steam Controller")), - OUYA(8, new LiteralText("Ouya")); + DEFAULT(0, Text.of("Default")), + DUALSHOCK(1, Text.of("Dualshock")), + DUALSENSE(2, Text.of("Dualsense")), + SWITCH(3, Text.of("Switch")), + XBOX_360(4, Text.of("Xbox 360")), + XBOX(5, Text.of("Xbox")), + STEAM_DECK(6, Text.of("Steam Deck")), + STEAM_CONTROLLER(7, Text.of("Steam Controller")), + OUYA(8, Text.of("Ouya")); private final int id; private final Text text; ControllerType(int id) { this.id = id; - this.text = new TranslatableText("midnightcontrols.controller_type." + this.getName()); + this.text = Text.translatable("midnightcontrols.controller_type." + this.getName()); } ControllerType(int id, @NotNull Text text) { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/HudSide.java b/src/main/java/eu/midnightdust/midnightcontrols/client/HudSide.java index 8ce117b..db3e3d6 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/HudSide.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/HudSide.java @@ -10,7 +10,6 @@ package eu.midnightdust.midnightcontrols.client; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import org.aperlambda.lambdacommon.utils.Nameable; import org.jetbrains.annotations.NotNull; @@ -31,7 +30,7 @@ public enum HudSide implements Nameable { private final Text text; HudSide() { - this.text = new TranslatableText(this.getTranslationKey()); + this.text = Text.translatable(this.getTranslationKey()); } /** diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index e8fdbe8..36147eb 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -36,8 +36,7 @@ import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.option.KeyBinding; import net.minecraft.client.toast.SystemToast; import net.minecraft.client.util.InputUtil; -import net.minecraft.text.LiteralText; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; @@ -133,10 +132,10 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo GLFW.glfwSetJoystickCallback((jid, event) -> { if (event == GLFW.GLFW_CONNECTED) { var controller = Controller.byId(jid); - client.getToastManager().add(new SystemToast(SystemToast.Type.TUTORIAL_HINT, new TranslatableText("midnightcontrols.controller.connected", jid), - new LiteralText(controller.getName()))); + 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, new TranslatableText("midnightcontrols.controller.disconnected", jid), + client.getToastManager().add(new SystemToast(SystemToast.Type.TUTORIAL_HINT, Text.translatable("midnightcontrols.controller.disconnected", jid), null)); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index 1eb40ad..35a75b3 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -59,7 +59,7 @@ public class MidnightControlsConfig extends MidnightConfig { @Entry public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT; @Entry public static Object controllerID = 0; @Entry public static Object secondControllerID = -1; - @Entry 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"); + @Entry 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 public static Map BINDINGS = Map.of(); private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?"); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 6b4e3ff..241a386 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -27,6 +27,7 @@ import dev.lambdaurora.spruceui.widget.AbstractSprucePressableButtonWidget; import dev.lambdaurora.spruceui.widget.SpruceElement; import dev.lambdaurora.spruceui.widget.SpruceLabelWidget; import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget; +import net.fabricmc.fabric.impl.item.group.CreativeGuiExtensions; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.ParentElement; @@ -45,7 +46,7 @@ import net.minecraft.client.gui.widget.PressableWidget; import net.minecraft.client.gui.widget.SliderWidget; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; import org.aperlambda.lambdacommon.utils.Pair; import org.jetbrains.annotations.NotNull; @@ -53,10 +54,7 @@ import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFWGamepadState; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; import static org.lwjgl.glfw.GLFW.*; @@ -71,7 +69,7 @@ public class MidnightInput { private static final Map BUTTON_COOLDOWNS = new HashMap<>(); // Cooldowns public int actionGuiCooldown = 0; - private boolean ignoreNextARelease = false; + public boolean ignoreNextARelease = false; private double targetYaw = 0.0; private double targetPitch = 0.0; private float prevXAxis = 0.f; @@ -80,7 +78,7 @@ public class MidnightInput { private int targetMouseY = 0; private float mouseSpeedX = 0.f; private float mouseSpeedY = 0.f; - private int inventoryInteractionCooldown = 0; + public int inventoryInteractionCooldown = 0; private ControllerControlsWidget controlsInput = null; @@ -315,7 +313,7 @@ public class MidnightInput { if (client.currentScreen != null && client.currentScreen.getClass() != TitleScreen.class) { if (!MidnightControlsCompat.handleMenuBack(client, client.currentScreen)) if (!this.tryGoBack(client.currentScreen)) - client.currentScreen.onClose(); + client.currentScreen.close(); return; } } @@ -323,6 +321,9 @@ public class MidnightInput { if (button == GLFW.GLFW_GAMEPAD_BUTTON_A && client.currentScreen != null && !isScreenInteractive(client.currentScreen) && this.actionGuiCooldown == 0) { + if (client.currentScreen instanceof CreativeInventoryScreen creativeScreen && ((HandledScreenAccessor) creativeScreen).midnightcontrols$getSlotAt( + client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(), + client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()) != null) return; if (!this.ignoreNextARelease) { double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(); double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight(); @@ -347,58 +348,57 @@ public class MidnightInput { * @return {@code true} if an inventory interaction was done */ private boolean handleInventory(@NotNull MinecraftClient client, int button) { - if (!(client.currentScreen instanceof HandledScreen)) - return false; - - if (client.interactionManager == null || client.player == null) - return false; - - if (this.inventoryInteractionCooldown > 0) - return true; - - if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) { - client.player.closeHandledScreen(); - return true; - } - - 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(); - - var screen = (HandledScreen) client.currentScreen; - var accessor = (HandledScreenAccessor) screen; - Slot slot = ((HandledScreenAccessor) client.currentScreen).midnightcontrols$getSlotAt(x, y); - - int slotId; - if (slot == null) { - if (client.player.currentScreenHandler.getCursorStack().isEmpty()) - 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; - switch (button) { - case GLFW_GAMEPAD_BUTTON_A: - if (screen instanceof CreativeInventoryScreen) - if (((CreativeInventoryScreenAccessor) screen).midnightcontrols$isCreativeInventorySlot(slot)) - actionType = SlotActionType.CLONE; - if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))) - actionType = SlotActionType.CLONE; - break; - case GLFW.GLFW_GAMEPAD_BUTTON_X: - clickData = GLFW_MOUSE_BUTTON_2; - break; - case GLFW.GLFW_GAMEPAD_BUTTON_Y: - actionType = SlotActionType.QUICK_MOVE; - break; - default: - return false; - } - - accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType); - return true; +// if (!(client.currentScreen instanceof HandledScreen screen)) +// return false; +// +// if (client.interactionManager == null || client.player == null) +// return false; +// +// if (this.inventoryInteractionCooldown > 0) +// return true; +// +// if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) { +// client.player.closeHandledScreen(); +// return true; +// } +// +// 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(); +// +// var accessor = (HandledScreenAccessor) screen; +// Slot slot = ((HandledScreenAccessor) client.currentScreen).midnightcontrols$getSlotAt(x, y); +// +// int slotId; +// if (slot == null) { +// if (client.player.currentScreenHandler.getCursorStack().isEmpty()) +// 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; +// switch (button) { +// case GLFW_GAMEPAD_BUTTON_A: +// if (screen instanceof CreativeInventoryScreen) +// if (((CreativeInventoryScreenAccessor) screen).midnightcontrols$isCreativeInventorySlot(slot)) +// actionType = SlotActionType.CLONE; +// if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))) +// actionType = SlotActionType.CLONE; +// break; +// case GLFW.GLFW_GAMEPAD_BUTTON_X: +// clickData = GLFW_MOUSE_BUTTON_2; +// break; +// case GLFW.GLFW_GAMEPAD_BUTTON_Y: +// actionType = SlotActionType.QUICK_MOVE; +// break; +// default: +// return false; +// } +// +// accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType); + return false; } /** @@ -411,9 +411,9 @@ public class MidnightInput { var set = ImmutableSet.of("gui.back", "gui.done", "gui.cancel", "gui.toTitle", "gui.toMenu"); return screen.children().stream().filter(element -> element instanceof PressableWidget) .map(element -> (PressableWidget) element) - .filter(element -> element.getMessage() instanceof TranslatableText) + .filter(element -> element.getMessage() != null && element.getMessage().getContent() != null) .anyMatch(element -> { - if (set.stream().anyMatch(key -> key.equals(((TranslatableText) element.getMessage()).getKey()))) { + if (set.stream().anyMatch(key -> element.getMessage().getContent().toString().equals(key))) { element.onPress(); return true; } @@ -511,6 +511,17 @@ public class MidnightInput { } return; } + } else if (client.currentScreen != null) { + if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone) { + client.currentScreen.children().stream().filter(element -> element instanceof EntryListWidget) + .map(element -> (EntryListWidget) element) + .filter(element -> element.getType().isFocused()) + .anyMatch(element -> { + element.mouseScrolled(0.0, 0.0, -value); + return true; + }); + return; + } } absValue -= deadZone; @@ -593,7 +604,7 @@ public class MidnightInput { labelWidget.onPress(); return true; } else if (focused instanceof WorldListWidget list) { - list.getSelectedAsOptional().ifPresent(WorldListWidget.Entry::play); + list.getSelectedAsOptional().ifPresent(WorldListWidget.WorldEntry::play); return true; } else if (focused instanceof MultiplayerServerListWidget list) { var entry = list.getSelectedOrNull(); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/VirtualMouseSkin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/VirtualMouseSkin.java index f2871ce..01ac7cf 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/VirtualMouseSkin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/VirtualMouseSkin.java @@ -10,7 +10,6 @@ package eu.midnightdust.midnightcontrols.client; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import org.aperlambda.lambdacommon.utils.Nameable; import org.jetbrains.annotations.NotNull; @@ -34,7 +33,7 @@ public enum VirtualMouseSkin implements Nameable { VirtualMouseSkin(String name) { this.name = name; - this.text = new TranslatableText(this.getTranslationKey()); + this.text = Text.translatable(this.getTranslationKey()); } /** diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java index 8fa82e1..0756f41 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/ReiCompat.java @@ -16,16 +16,6 @@ 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 me.shedaniel.rei.RoughlyEnoughItemsCoreClient; -import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; -import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; -import me.shedaniel.rei.impl.client.gui.widget.EntryListEntryWidget; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; -import me.shedaniel.rei.impl.client.registry.screen.ScreenRegistryImpl; -import me.shedaniel.rei.impl.common.entry.AbstractEntryStack; import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java index 154d532..422a9eb 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java @@ -14,7 +14,6 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.GameOptions; import net.minecraft.client.option.KeyBinding; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; import org.aperlambda.lambdacommon.utils.function.PairPredicate; import org.aperlambda.lambdacommon.utils.function.Predicates; @@ -79,6 +78,16 @@ public class ButtonBinding { .action(InputHandlers.handleHotbar(false)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements)).cooldown().register(); public static final ButtonBinding TAB_RIGHT = new Builder("tab_next").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER) .action(InputHandlers.handleHotbar(true)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements)).cooldown().register(); + public static final ButtonBinding PAGE_LEFT = new Builder("page_back").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true)) + .action(InputHandlers.handlePage(false)).filter(InputHandlers::inInventory).cooldown().register(); + public static final ButtonBinding PAGE_RIGHT = new Builder("page_next").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true)) + .action(InputHandlers.handlePage(true)).filter(InputHandlers::inInventory).cooldown().register(); + public static final ButtonBinding TAKE = new Builder("take").buttons(GLFW_GAMEPAD_BUTTON_X) + .action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register(); + public static final ButtonBinding TAKE_ALL = new Builder("take_all").buttons(GLFW_GAMEPAD_BUTTON_A) + .action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register(); + public static final ButtonBinding QUICK_MOVE = new Builder("quick_move").buttons(GLFW_GAMEPAD_BUTTON_Y) + .action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register(); public static final ButtonBinding TOGGLE_PERSPECTIVE = new Builder("toggle_perspective").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_Y).cooldown().register(); public static final ButtonBinding USE = new Builder("use").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true)).register(); @@ -96,7 +105,7 @@ public class ButtonBinding { public ButtonBinding(String key, int[] defaultButton, List actions, PairPredicate filter, boolean hasCooldown) { this.setButton(this.defaultButton = defaultButton); this.key = key; - this.text = new TranslatableText(this.key); + this.text = Text.translatable(this.key); this.filter = filter; this.actions.addAll(actions); this.hasCooldown = hasCooldown; @@ -295,24 +304,24 @@ public class ButtonBinding { } public static void init(@NotNull GameOptions options) { - ATTACK.mcKeyBinding = options.keyAttack; - BACK.mcKeyBinding = options.keyBack; - CHAT.mcKeyBinding = options.keyChat; - DROP_ITEM.mcKeyBinding = options.keyDrop; - FORWARD.mcKeyBinding = options.keyForward; - INVENTORY.mcKeyBinding = options.keyInventory; - JUMP.mcKeyBinding = options.keyJump; - LEFT.mcKeyBinding = options.keyLeft; - PICK_BLOCK.mcKeyBinding = options.keyPickItem; - PLAYER_LIST.mcKeyBinding = options.keyPlayerList; - RIGHT.mcKeyBinding = options.keyRight; - SCREENSHOT.mcKeyBinding = options.keyScreenshot; - SMOOTH_CAMERA.mcKeyBinding = options.keySmoothCamera; - SNEAK.mcKeyBinding = options.keySneak; - SPRINT.mcKeyBinding = options.keySprint; - SWAP_HANDS.mcKeyBinding = options.keySwapHands; - TOGGLE_PERSPECTIVE.mcKeyBinding = options.keyTogglePerspective; - USE.mcKeyBinding = options.keyUse; + ATTACK.mcKeyBinding = options.attackKey; + BACK.mcKeyBinding = options.backKey; + CHAT.mcKeyBinding = options.chatKey; + DROP_ITEM.mcKeyBinding = options.dropKey; + FORWARD.mcKeyBinding = options.forwardKey; + INVENTORY.mcKeyBinding = options.inventoryKey; + JUMP.mcKeyBinding = options.jumpKey; + LEFT.mcKeyBinding = options.leftKey; + PICK_BLOCK.mcKeyBinding = options.pickItemKey; + PLAYER_LIST.mcKeyBinding = options.playerListKey; + RIGHT.mcKeyBinding = options.rightKey; + SCREENSHOT.mcKeyBinding = options.screenshotKey; + SMOOTH_CAMERA.mcKeyBinding = options.smoothCameraKey; + SNEAK.mcKeyBinding = options.sneakKey; + SPRINT.mcKeyBinding = options.sprintKey; + SWAP_HANDS.mcKeyBinding = options.swapHandsKey; + TOGGLE_PERSPECTIVE.mcKeyBinding = options.togglePerspectiveKey; + USE.mcKeyBinding = options.useKey; } /** @@ -323,37 +332,37 @@ public class ButtonBinding { */ public static @NotNull Text getLocalizedButtonName(int button) { return switch (button % 500) { - case -1 -> new TranslatableText("key.keyboard.unknown"); - case GLFW_GAMEPAD_BUTTON_A -> new TranslatableText("midnightcontrols.button.a"); - case GLFW_GAMEPAD_BUTTON_B -> new TranslatableText("midnightcontrols.button.b"); - case GLFW_GAMEPAD_BUTTON_X -> new TranslatableText("midnightcontrols.button.x"); - case GLFW_GAMEPAD_BUTTON_Y -> new TranslatableText("midnightcontrols.button.y"); - case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER -> new TranslatableText("midnightcontrols.button.left_bumper"); - case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER -> new TranslatableText("midnightcontrols.button.right_bumper"); - case GLFW_GAMEPAD_BUTTON_BACK -> new TranslatableText("midnightcontrols.button.back"); - case GLFW_GAMEPAD_BUTTON_START -> new TranslatableText("midnightcontrols.button.start"); - case GLFW_GAMEPAD_BUTTON_GUIDE -> new TranslatableText("midnightcontrols.button.guide"); - case GLFW_GAMEPAD_BUTTON_LEFT_THUMB -> new TranslatableText("midnightcontrols.button.left_thumb"); - case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB -> new TranslatableText("midnightcontrols.button.right_thumb"); - case GLFW_GAMEPAD_BUTTON_DPAD_UP -> new TranslatableText("midnightcontrols.button.dpad_up"); - case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> new TranslatableText("midnightcontrols.button.dpad_right"); - case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> new TranslatableText("midnightcontrols.button.dpad_down"); - case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> new TranslatableText("midnightcontrols.button.dpad_left"); - case 100 -> new TranslatableText("midnightcontrols.axis.left_x+"); - case 101 -> new TranslatableText("midnightcontrols.axis.left_y+"); - case 102 -> new TranslatableText("midnightcontrols.axis.right_x+"); - case 103 -> new TranslatableText("midnightcontrols.axis.right_y+"); - case 104 -> new TranslatableText("midnightcontrols.axis.left_trigger"); - case 105 -> new TranslatableText("midnightcontrols.axis.right_trigger"); - case 200 -> new TranslatableText("midnightcontrols.axis.left_x-"); - case 201 -> new TranslatableText("midnightcontrols.axis.left_y-"); - case 202 -> new TranslatableText("midnightcontrols.axis.right_x-"); - case 203 -> new TranslatableText("midnightcontrols.axis.right_y-"); - case 15 -> new TranslatableText("midnightcontrols.button.l4"); - case 16 -> new TranslatableText("midnightcontrols.button.l5"); - case 17 -> new TranslatableText("midnightcontrols.button.r4"); - case 18 -> new TranslatableText("midnightcontrols.button.r5"); - default -> new TranslatableText("midnightcontrols.button.unknown", button); + case -1 -> Text.translatable("key.keyboard.unknown"); + case GLFW_GAMEPAD_BUTTON_A -> Text.translatable("midnightcontrols.button.a"); + case GLFW_GAMEPAD_BUTTON_B -> Text.translatable("midnightcontrols.button.b"); + case GLFW_GAMEPAD_BUTTON_X -> Text.translatable("midnightcontrols.button.x"); + case GLFW_GAMEPAD_BUTTON_Y -> Text.translatable("midnightcontrols.button.y"); + case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER -> Text.translatable("midnightcontrols.button.left_bumper"); + case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER -> Text.translatable("midnightcontrols.button.right_bumper"); + case GLFW_GAMEPAD_BUTTON_BACK -> Text.translatable("midnightcontrols.button.back"); + case GLFW_GAMEPAD_BUTTON_START -> Text.translatable("midnightcontrols.button.start"); + case GLFW_GAMEPAD_BUTTON_GUIDE -> Text.translatable("midnightcontrols.button.guide"); + case GLFW_GAMEPAD_BUTTON_LEFT_THUMB -> Text.translatable("midnightcontrols.button.left_thumb"); + case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB -> Text.translatable("midnightcontrols.button.right_thumb"); + case GLFW_GAMEPAD_BUTTON_DPAD_UP -> Text.translatable("midnightcontrols.button.dpad_up"); + case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> Text.translatable("midnightcontrols.button.dpad_right"); + case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> Text.translatable("midnightcontrols.button.dpad_down"); + case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> Text.translatable("midnightcontrols.button.dpad_left"); + case 100 -> Text.translatable("midnightcontrols.axis.left_x+"); + case 101 -> Text.translatable("midnightcontrols.axis.left_y+"); + case 102 -> Text.translatable("midnightcontrols.axis.right_x+"); + case 103 -> Text.translatable("midnightcontrols.axis.right_y+"); + case 104 -> Text.translatable("midnightcontrols.axis.left_trigger"); + case 105 -> Text.translatable("midnightcontrols.axis.right_trigger"); + case 200 -> Text.translatable("midnightcontrols.axis.left_x-"); + case 201 -> Text.translatable("midnightcontrols.axis.left_y-"); + case 202 -> Text.translatable("midnightcontrols.axis.right_x-"); + case 203 -> Text.translatable("midnightcontrols.axis.right_y-"); + case 15 -> Text.translatable("midnightcontrols.button.l4"); + case 16 -> Text.translatable("midnightcontrols.button.l5"); + case 17 -> Text.translatable("midnightcontrols.button.r4"); + case 18 -> Text.translatable("midnightcontrols.button.r5"); + default -> Text.translatable("midnightcontrols.button.unknown", button); }; } @@ -376,7 +385,12 @@ public class ButtonBinding { ButtonBinding.HOTBAR_LEFT, ButtonBinding.HOTBAR_RIGHT, ButtonBinding.INVENTORY, - ButtonBinding.SWAP_HANDS + ButtonBinding.SWAP_HANDS, + ButtonBinding.PAGE_LEFT, + ButtonBinding.PAGE_RIGHT, + ButtonBinding.TAKE, + ButtonBinding.TAKE_ALL, + ButtonBinding.QUICK_MOVE )); MULTIPLAYER_CATEGORY = InputManager.registerDefaultCategory("key.categories.multiplayer", category -> category.registerAllBindings(ButtonBinding.CHAT, ButtonBinding.PLAYER_LIST)); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/Controller.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/Controller.java index 849d80f..5859047 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/Controller.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/Controller.java @@ -14,8 +14,7 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.toast.SystemToast; -import net.minecraft.text.LiteralText; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; import org.aperlambda.lambdacommon.utils.Nameable; import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; @@ -178,7 +177,7 @@ public record Controller(int id) implements Nameable { var client = MinecraftClient.getInstance(); if (client != null) { client.getToastManager().add(SystemToast.create(client, SystemToast.Type.TUTORIAL_HINT, - new TranslatableText("midnightcontrols.controller.mappings.error"), new LiteralText(string))); + Text.translatable("midnightcontrols.controller.mappings.error"), Text.literal(string))); } } } catch (Throwable e) { 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 970334a..18fb149 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -10,27 +10,36 @@ package eu.midnightdust.midnightcontrols.client.controller; import eu.midnightdust.midnightcontrols.client.ButtonState; +import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightInput; +import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; 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.util.HandledScreenAccessor; +import net.fabricmc.fabric.impl.item.group.CreativeGuiExtensions; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; +import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; 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.screen.slot.Slot; +import net.minecraft.screen.slot.SlotActionType; import org.aperlambda.lambdacommon.utils.Pair; import org.jetbrains.annotations.NotNull; +import org.lwjgl.glfw.GLFW; import java.util.Comparator; import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Collectors; +import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2; + /** * Represents some input handlers. * @@ -100,6 +109,67 @@ public class InputHandlers { return false; }; } + public static PressAction handlePage(boolean next) { + return (client, button, value, action) -> { + if (client.currentScreen instanceof CreativeInventoryScreen) { + var screen = (HandledScreenAccessor) client.currentScreen; + try { + if (next) { + ((CreativeGuiExtensions) screen).fabric_nextPage(); + } else { + ((CreativeGuiExtensions) screen).fabric_previousPage(); + } + } catch (Exception ignored) {} + } + return false; + }; + } + public static PressAction handleActions() { + return (client, button, value, action) -> { + if (!(client.currentScreen instanceof HandledScreen screen)) return false; + if (client.interactionManager == null || client.player == null) + return false; + + if (MidnightControlsClient.get().input.inventoryInteractionCooldown > 0) + return true; + 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(); + + var accessor = (HandledScreenAccessor) screen; + Slot slot = ((HandledScreenAccessor) screen).midnightcontrols$getSlotAt(x, y); + + int slotId; + if (slot == null) { + if (client.player.currentScreenHandler.getCursorStack().isEmpty()) + 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 (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot)) + actionType = SlotActionType.CLONE; + if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))) + actionType = SlotActionType.CLONE; + 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; + }; + } public static boolean handlePauseGame(@NotNull MinecraftClient client, @NotNull ButtonBinding binding, float value, @NotNull ButtonState action) { if (action == ButtonState.PRESS) { @@ -109,7 +179,7 @@ public class InputHandlers { else if (client.currentScreen instanceof HandledScreen && client.player != null) // If the current screen is a container then close it. client.player.closeHandledScreen(); else // Else just close the current screen. - client.currentScreen.onClose(); + client.currentScreen.close(); } return true; } @@ -131,12 +201,12 @@ public class InputHandlers { public static boolean handleToggleSneak(@NotNull MinecraftClient client, @NotNull ButtonBinding button, float value, @NotNull ButtonState action) { button.asKeyBinding().ifPresent(binding -> { - boolean sneakToggled = client.options.sneakToggled; + boolean sneakToggled = client.options.getSneakToggled().getValue(); if (client.player.getAbilities().flying && sneakToggled) - client.options.sneakToggled = false; + client.options.getSneakToggled().setValue(false); binding.setPressed(button.pressed); if (client.player.getAbilities().flying && sneakToggled) - client.options.sneakToggled = true; + client.options.getSneakToggled().setValue(true); }); return true; } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java index 9b56c1d..d5b0835 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MappingsStringInputWidget.java @@ -16,8 +16,7 @@ import dev.lambdaurora.spruceui.option.SpruceOption; import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; import dev.lambdaurora.spruceui.widget.text.SpruceTextAreaWidget; import net.minecraft.client.toast.SystemToast; -import net.minecraft.text.LiteralText; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; import java.io.FileWriter; import java.io.IOException; @@ -65,7 +64,7 @@ public class MappingsStringInputWidget extends SpruceContainerWidget { } catch (IOException e) { if (this.client != null) this.client.getToastManager().add(SystemToast.create(this.client, SystemToast.Type.TUTORIAL_HINT, - new TranslatableText("midnightcontrols.controller.mappings.error.write"), LiteralText.EMPTY)); + Text.translatable("midnightcontrols.controller.mappings.error.write"), Text.empty())); e.printStackTrace(); } } @@ -90,7 +89,7 @@ public class MappingsStringInputWidget extends SpruceContainerWidget { } int textFieldWidth = (int) (this.width * (5.0 / 6.0)); - this.textArea = new SpruceTextAreaWidget(Position.of(this, this.width / 2 - textFieldWidth / 2, 0), textFieldWidth, this.height - 50, new LiteralText(mappings)); + this.textArea = new SpruceTextAreaWidget(Position.of(this, this.width / 2 - textFieldWidth / 2, 0), textFieldWidth, this.height - 50, Text.literal(mappings)); this.textArea.setText(mappings); // Display as many lines as possible this.textArea.setDisplayedLines(this.textArea.getInnerHeight() / this.client.textRenderer.fontHeight); 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 4d89381..a2b5c3c 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java @@ -106,7 +106,7 @@ public class MidnightControlsHud extends Hud { this.drawButton(matrices, currentX, y, ButtonBinding.INVENTORY, true); this.drawButton(matrices, currentX += (MidnightControlsConfig.hudSide == HudSide.LEFT ? offset : -offset), y, ButtonBinding.SWAP_HANDS, true); offset = 2 + this.swapHandsWidth + this.dropItemButtonWidth + 4; - if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.RIGHT) { + if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.RIGHT) { currentX += -offset; } else { currentX = MidnightControlsConfig.hudSide == HudSide.LEFT ? x : x - this.dropItemButtonWidth; @@ -123,7 +123,7 @@ public class MidnightControlsHud extends Hud { currentX -= this.useButtonWidth; this.drawButton(matrices, currentX, y, ButtonBinding.USE, true); offset = 2 + this.useWidth + 4; - if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.LEFT) { + if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.LEFT) { currentX -= offset; } else { currentX = x; @@ -143,7 +143,7 @@ public class MidnightControlsHud extends Hud { currentX += MidnightControlsConfig.hudSide == HudSide.LEFT ? this.inventoryWidth + 4 + this.swapHandsButtonWidth + 2 : -this.swapHandsWidth - 2 - this.swapHandsButtonWidth - 4; this.drawTip(matrices, currentX, y, ButtonBinding.SWAP_HANDS, true); - if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.RIGHT) { + if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.RIGHT) { currentX += -this.dropItemWidth - 2 - this.dropItemButtonWidth - 4; } else { y -= 24; @@ -160,7 +160,7 @@ public class MidnightControlsHud extends Hud { this.drawTip(matrices, currentX, y, this.placeAction, true); - if (this.client.options.showSubtitles && MidnightControlsConfig.hudSide == HudSide.LEFT) { + if (this.client.options.getShowSubtitles().getValue() && MidnightControlsConfig.hudSide == HudSide.LEFT) { currentX -= 4; } else { currentX = x; 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 1911cb1..8941f10 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -34,10 +34,8 @@ import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.render.*; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.LiteralText; import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; import net.minecraft.util.Util; import net.minecraft.util.math.Matrix4f; @@ -49,7 +47,7 @@ import java.awt.*; * Represents the midnightcontrols settings screen. */ public class MidnightControlsSettingsScreen extends SpruceScreen { - private static final Text SDL2_GAMEPAD_TOOL = new LiteralText("SDL2 Gamepad Tool").formatted(Formatting.GREEN); + private static final Text SDL2_GAMEPAD_TOOL = Text.literal("SDL2 Gamepad Tool").formatted(Formatting.GREEN); public static final String GAMEPAD_TOOL_URL = "https://generalarcade.com/gamepadtool/"; final MidnightControlsClient mod = MidnightControlsClient.get(); private final Screen parent; @@ -88,11 +86,11 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { var controller = MidnightControlsConfig.getController(); var controllerName = controller.getName(); if (!controller.isConnected()) - return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.RED)); + return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.RED)); else if (!controller.isGamepad()) - return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.GOLD)); + return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.GOLD)); else - return option.getDisplayText(new LiteralText(controllerName)); + return option.getDisplayText(Text.literal(controllerName)); }, null); private final SpruceOption secondControllerOption = new SpruceCyclingOption("midnightcontrols.menu.controller2", amount -> { @@ -106,13 +104,13 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { option -> MidnightControlsConfig.getSecondController().map(controller -> { var controllerName = controller.getName(); if (!controller.isConnected()) - return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.RED)); + return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.RED)); else if (!controller.isGamepad()) - return option.getDisplayText(new LiteralText(controllerName).formatted(Formatting.GOLD)); + return option.getDisplayText(Text.literal(controllerName).formatted(Formatting.GOLD)); else - return option.getDisplayText(new LiteralText(controllerName)); - }).orElse(option.getDisplayText(SpruceTexts.OPTIONS_OFF.shallowCopy().formatted(Formatting.RED))), - new TranslatableText("midnightcontrols.tooltip.controller2")); + return option.getDisplayText(Text.literal(controllerName)); + }).orElse(option.getDisplayText(SpruceTexts.OPTIONS_OFF.copyContentOnly().formatted(Formatting.RED))), + Text.translatable("midnightcontrols.tooltip.controller2")); private final SpruceOption unfocusedInputOption; private final SpruceOption invertsRightXAxis; private final SpruceOption invertsRightYAxis; @@ -129,13 +127,13 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { return new SpruceDoubleOption(key, .25f, 1.f, 0.05f, () -> MidnightControlsConfig.getAxisMaxValue(axis), newValue -> MidnightControlsConfig.setAxisMaxValue(axis, newValue), - option -> option.getDisplayText(new LiteralText(String.format("%.2f", option.get()))), - new TranslatableText(key.replace("menu", "tooltip")) + option -> option.getDisplayText(Text.literal(String.format("%.2f", option.get()))), + Text.translatable(key.replace("menu", "tooltip")) ); } - private final MutableText controllerMappingsUrlText = new LiteralText("(") - .append(new LiteralText(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD)) + private final MutableText controllerMappingsUrlText = Text.literal("(") + .append(Text.literal(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD)) .append("),"); private static int searchNextAvailableController(int newId, boolean allowNone) { @@ -153,7 +151,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { } public MidnightControlsSettingsScreen(Screen parent, boolean hideControls) { - super(new TranslatableText("midnightcontrols.title.settings")); + super(Text.translatable("midnightcontrols.title.settings")); this.parent = parent; // General options this.inputModeOption = new SpruceCyclingOption("midnightcontrols.menu.controls_mode", @@ -165,18 +163,18 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { if (this.client.player != null) { ClientPlayNetworking.getSender().sendPacket(MidnightControls.CONTROLS_MODE_CHANNEL, this.mod.makeControlsModeBuffer(next)); } - }, option -> option.getDisplayText(new TranslatableText(MidnightControlsConfig.controlsMode.getTranslationKey())), - new TranslatableText("midnightcontrols.tooltip.controls_mode")); + }, option -> option.getDisplayText(Text.translatable(MidnightControlsConfig.controlsMode.getTranslationKey())), + Text.translatable("midnightcontrols.tooltip.controls_mode")); this.autoSwitchModeOption = new SpruceToggleBooleanOption("midnightcontrols.menu.auto_switch_mode", () -> MidnightControlsConfig.autoSwitchMode, - value -> MidnightControlsConfig.autoSwitchMode = value, new TranslatableText("midnightcontrols.tooltip.auto_switch_mode")); + value -> MidnightControlsConfig.autoSwitchMode = value, Text.translatable("midnightcontrols.tooltip.auto_switch_mode")); this.rotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.rotation_speed", 0.0, 100.0, .5f, () -> MidnightControlsConfig.rotationSpeed, - value -> MidnightControlsConfig.rotationSpeed = value, option -> option.getDisplayText(new LiteralText(String.valueOf(option.get()))), - new TranslatableText("midnightcontrols.tooltip.rotation_speed")); + value -> MidnightControlsConfig.rotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), + Text.translatable("midnightcontrols.tooltip.rotation_speed")); this.mouseSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.mouse_speed", 0.0, 150.0, .5f, () -> MidnightControlsConfig.mouseSpeed, - value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(new LiteralText(String.valueOf(option.get()))), - new TranslatableText("midnightcontrols.tooltip.mouse_speed")); + value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), + Text.translatable("midnightcontrols.tooltip.mouse_speed")); this.resetOption = SpruceSimpleActionOption.reset(btn -> { // TODO MidnightControlsConfig.init("midnightcontrols", MidnightControlsConfig.class); @@ -186,57 +184,57 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { // Gameplay options this.analogMovementOption = new SpruceToggleBooleanOption("midnightcontrols.menu.analog_movement", () -> MidnightControlsConfig.analogMovement, value -> MidnightControlsConfig.analogMovement = value, - new TranslatableText("midnightcontrols.tooltip.analog_movement")); + Text.translatable("midnightcontrols.tooltip.analog_movement")); this.autoJumpOption = new SpruceToggleBooleanOption("options.autoJump", - () -> this.client.options.autoJump, - newValue -> this.client.options.autoJump = newValue, + () -> this.client.options.getAutoJump().getValue(), + newValue -> this.client.options.getAutoJump().setValue(newValue), null); this.fastBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fast_block_placing", () -> MidnightControlsConfig.fastBlockPlacing, - value -> MidnightControlsConfig.fastBlockPlacing = value, new TranslatableText("midnightcontrols.tooltip.fast_block_placing")); + value -> MidnightControlsConfig.fastBlockPlacing = value, Text.translatable("midnightcontrols.tooltip.fast_block_placing")); this.frontBlockPlacingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.horizontal", () -> MidnightControlsConfig.horizontalReacharound, - value -> MidnightControlsConfig.horizontalReacharound = value, new TranslatableText("midnightcontrols.tooltip.reacharound.horizontal")); + value -> MidnightControlsConfig.horizontalReacharound = value, Text.translatable("midnightcontrols.tooltip.reacharound.horizontal")); this.verticalReacharoundOption = new SpruceToggleBooleanOption("midnightcontrols.menu.reacharound.vertical", () -> MidnightControlsConfig.verticalReacharound, - value -> MidnightControlsConfig.verticalReacharound = value, new TranslatableText("midnightcontrols.tooltip.reacharound.vertical")); + value -> MidnightControlsConfig.verticalReacharound = value, Text.translatable("midnightcontrols.tooltip.reacharound.vertical")); this.flyDriftingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fly_drifting", () -> MidnightControlsConfig.flyDrifting, - value -> MidnightControlsConfig.flyDrifting = value, new TranslatableText("midnightcontrols.tooltip.fly_drifting")); + value -> MidnightControlsConfig.flyDrifting = value, Text.translatable("midnightcontrols.tooltip.fly_drifting")); this.flyVerticalDriftingOption = new SpruceToggleBooleanOption("midnightcontrols.menu.fly_drifting_vertical", () -> MidnightControlsConfig.verticalFlyDrifting, - value -> MidnightControlsConfig.verticalFlyDrifting = value, new TranslatableText("midnightcontrols.tooltip.fly_drifting_vertical")); + value -> MidnightControlsConfig.verticalFlyDrifting = value, Text.translatable("midnightcontrols.tooltip.fly_drifting_vertical")); // Appearance options this.controllerTypeOption = new SpruceCyclingOption("midnightcontrols.menu.controller_type", amount -> MidnightControlsConfig.controllerType = MidnightControlsConfig.controllerType.next(), option -> option.getDisplayText(MidnightControlsConfig.controllerType.getTranslatedText()), - new TranslatableText("midnightcontrols.tooltip.controller_type")); + Text.translatable("midnightcontrols.tooltip.controller_type")); this.virtualMouseSkinOption = new SpruceCyclingOption("midnightcontrols.menu.virtual_mouse.skin", amount -> MidnightControlsConfig.virtualMouseSkin = MidnightControlsConfig.virtualMouseSkin.next(), option -> option.getDisplayText(MidnightControlsConfig.virtualMouseSkin.getTranslatedText()), null); this.hudEnableOption = new SpruceToggleBooleanOption("midnightcontrols.menu.hud_enable", () -> MidnightControlsConfig.hudEnable, - this.mod::setHudEnabled, new TranslatableText("midnightcontrols.tooltip.hud_enable")); + this.mod::setHudEnabled, Text.translatable("midnightcontrols.tooltip.hud_enable")); this.hudSideOption = new SpruceCyclingOption("midnightcontrols.menu.hud_side", amount -> MidnightControlsConfig.hudSide = MidnightControlsConfig.hudSide.next(), option -> option.getDisplayText(MidnightControlsConfig.hudSide.getTranslatedText()), - new TranslatableText("midnightcontrols.tooltip.hud_side")); + Text.translatable("midnightcontrols.tooltip.hud_side")); // Controller options this.rightDeadZoneOption = new SpruceDoubleOption("midnightcontrols.menu.right_dead_zone", 0.05, 1.0, .05f, () -> MidnightControlsConfig.rightDeadZone, value -> MidnightControlsConfig.rightDeadZone = value, option -> { var value = String.valueOf(option.get()); - return option.getDisplayText(new LiteralText(value.substring(0, Math.min(value.length(), 5)))); - }, new TranslatableText("midnightcontrols.tooltip.right_dead_zone")); + return option.getDisplayText(Text.literal(value.substring(0, Math.min(value.length(), 5)))); + }, Text.translatable("midnightcontrols.tooltip.right_dead_zone")); this.leftDeadZoneOption = new SpruceDoubleOption("midnightcontrols.menu.left_dead_zone", 0.05, 1.0, .05f, () -> MidnightControlsConfig.leftDeadZone, value -> MidnightControlsConfig.leftDeadZone = value, option -> { var value = String.valueOf(option.get()); - return option.getDisplayText(new LiteralText(value.substring(0, Math.min(value.length(), 5)))); - }, new TranslatableText("midnightcontrols.tooltip.left_dead_zone")); + return option.getDisplayText(Text.literal(value.substring(0, Math.min(value.length(), 5)))); + }, Text.translatable("midnightcontrols.tooltip.left_dead_zone")); this.invertsRightXAxis = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_right_x_axis", () -> MidnightControlsConfig.invertRightXAxis, value -> MidnightControlsConfig.invertRightXAxis = value, null); this.invertsRightYAxis = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_right_y_axis", () -> MidnightControlsConfig.invertRightYAxis, value -> MidnightControlsConfig.invertRightYAxis = value, null); this.unfocusedInputOption = new SpruceToggleBooleanOption("midnightcontrols.menu.unfocused_input", () -> MidnightControlsConfig.unfocusedInput, - value -> MidnightControlsConfig.unfocusedInput = value, new TranslatableText("midnightcontrols.tooltip.unfocused_input")); + value -> MidnightControlsConfig.unfocusedInput = value, Text.translatable("midnightcontrols.tooltip.unfocused_input")); this.virtualMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.virtual_mouse", () -> MidnightControlsConfig.virtualMouse, - value -> MidnightControlsConfig.virtualMouse = value, new TranslatableText("midnightcontrols.tooltip.virtual_mouse")); + value -> MidnightControlsConfig.virtualMouse = value, Text.translatable("midnightcontrols.tooltip.virtual_mouse")); } @Override @@ -246,9 +244,9 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { } @Override - public void onClose() { + public void close() { MidnightControlsConfig.save(); - super.onClose(); + super.close(); } private int getTextHeight() { @@ -273,22 +271,22 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { tabs.getList().setBackground(new MidnightControlsBackground()); this.addDrawableChild(tabs); - tabs.addSeparatorEntry(new TranslatableText("midnightcontrols.menu.separator.general")); - tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.general"), null, + tabs.addSeparatorEntry(Text.translatable("midnightcontrols.menu.separator.general")); + tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.general"), null, this::buildGeneralTab); - tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.gameplay"), null, + tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.gameplay"), null, this::buildGameplayTab); - tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.visual"), null, + tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.visual"), null, this::buildVisualTab); - tabs.addSeparatorEntry(new TranslatableText("options.controls")); - tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.controller_controls"), null, + tabs.addSeparatorEntry(Text.translatable("options.controls")); + tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.controller_controls"), null, this::buildControllerControlsTab); - tabs.addSeparatorEntry(new TranslatableText("midnightcontrols.menu.separator.controller")); - tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.controller"), null, + tabs.addSeparatorEntry(Text.translatable("midnightcontrols.menu.separator.controller")); + tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.controller"), null, this::buildControllerTab); - tabs.addTabEntry(new TranslatableText("midnightcontrols.menu.title.mappings.string"), null, + tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.mappings.string"), null, this::buildMappingsStringEditorTab); } @@ -332,17 +330,17 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { var root = new SpruceContainerWidget(Position.origin(), width, height); var aboutMappings1 = new SpruceLabelWidget(Position.of(0, 2), - new TranslatableText("midnightcontrols.controller.mappings.1", SDL2_GAMEPAD_TOOL), + Text.translatable("midnightcontrols.controller.mappings.1", SDL2_GAMEPAD_TOOL), width, true); var gamepadToolUrlLabel = new SpruceLabelWidget(Position.of(0, aboutMappings1.getHeight() + 4), this.controllerMappingsUrlText, width, label -> Util.getOperatingSystem().open(GAMEPAD_TOOL_URL), true); - gamepadToolUrlLabel.setTooltip(new TranslatableText("chat.link.open")); + gamepadToolUrlLabel.setTooltip(Text.translatable("chat.link.open")); var aboutMappings3 = new SpruceLabelWidget(Position.of(0, aboutMappings1.getHeight() + gamepadToolUrlLabel.getHeight() + 6), - new TranslatableText("midnightcontrols.controller.mappings.3", Formatting.GREEN.toString(), Formatting.RESET.toString()), + Text.translatable("midnightcontrols.controller.mappings.3", Formatting.GREEN.toString(), Formatting.RESET.toString()), width, true); int listHeight = height - 8 - aboutMappings1.getHeight() - aboutMappings3.getHeight() - gamepadToolUrlLabel.getHeight(); @@ -401,8 +399,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { bufferBuilder.vertex(matrix, (float)x2, (float)y2, 0.0F).color(r, g, b, t).next(); 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(); - bufferBuilder.end(); - BufferRenderer.draw(bufferBuilder); + BufferRenderer.drawWithShader(bufferBuilder.end()); RenderSystem.enableTexture(); RenderSystem.disableBlend(); matrixStack.pop(); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/ReloadControllerMappingsOption.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/ReloadControllerMappingsOption.java index bd3f1db..372cce3 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/ReloadControllerMappingsOption.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/ReloadControllerMappingsOption.java @@ -14,8 +14,7 @@ import dev.lambdaurora.spruceui.option.SpruceSimpleActionOption; import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; import net.minecraft.client.MinecraftClient; import net.minecraft.client.toast.SystemToast; -import net.minecraft.text.LiteralText; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; import java.util.function.Consumer; @@ -35,7 +34,7 @@ public class ReloadControllerMappingsOption { if (client.currentScreen instanceof MidnightControlsSettingsScreen) client.currentScreen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); client.getToastManager().add(SystemToast.create(client, SystemToast.Type.TUTORIAL_HINT, - new TranslatableText("midnightcontrols.controller.mappings.updated"), LiteralText.EMPTY)); - }, new TranslatableText("midnightcontrols.tooltip.reload_controller_mappings")); + Text.translatable("midnightcontrols.controller.mappings.updated"), Text.empty())); + }, Text.translatable("midnightcontrols.tooltip.reload_controller_mappings")); } } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java index 4a2c9a6..8ee1f17 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java @@ -13,7 +13,7 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.ring.RingPage; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; /** * Represents the controls ring screen. @@ -26,7 +26,7 @@ public class RingScreen extends Screen { protected final MidnightControlsClient mod; public RingScreen() { - super(new TranslatableText("midnightcontrols.menu.title.ring")); + super(Text.literal("midnightcontrols.menu.title.ring")); this.mod = MidnightControlsClient.get(); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java index 55809f3..8273a21 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java @@ -22,7 +22,7 @@ import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TexturedButtonWidget; import net.minecraft.client.option.KeyBinding; import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; -import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; import net.minecraft.util.Arm; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; @@ -52,7 +52,7 @@ public class TouchscreenOverlay extends Screen { public TouchscreenOverlay(@NotNull MidnightControlsClient mod) { - super(new LiteralText("Touchscreen overlay")); + super(Text.literal("Touchscreen overlay")); this.mod = mod; this.passEvents = true; } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerButtonWidget.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerButtonWidget.java index 7aac73a..d29c89a 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerButtonWidget.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerButtonWidget.java @@ -16,7 +16,6 @@ import dev.lambdaurora.spruceui.SpruceTexts; import dev.lambdaurora.spruceui.widget.AbstractSpruceIconButtonWidget; import net.minecraft.client.MinecraftClient; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; @@ -35,13 +34,13 @@ public class ControllerButtonWidget extends AbstractSpruceIconButtonWidget { public void update() { int length = binding.getButton().length; this.setMessage(this.binding.isNotBound() ? SpruceTexts.NOT_BOUND.copy() : - (length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : new LiteralText("<>"))); + (length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : Text.literal("<>"))); } @Override public Text getMessage() { if (this.binding.getButton().length > 1) - return LiteralText.EMPTY; + return Text.empty(); return super.getMessage(); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java index f8f2c67..ce2c823 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java @@ -19,7 +19,7 @@ import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; import net.minecraft.client.gui.screen.option.ControlsOptionsScreen; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; import org.aperlambda.lambdacommon.utils.function.Predicates; import java.util.ArrayList; @@ -46,7 +46,7 @@ public class ControllerControlsWidget extends SpruceContainerWidget { protected void init() { this.addChild(new SpruceButtonWidget(Position.of(this, this.width / 2 - 155, 18), 310, 20, - new TranslatableText("midnightcontrols.menu.keyboard_controls"), + Text.translatable("midnightcontrols.menu.keyboard_controls"), btn -> this.client.setScreen(new ControlsOptionsScreen(null, this.client.options)))); this.bindingsListWidget = new ControlsListWidget(Position.of(this, 0, 43), this.width, this.height - 43 - 35, this); this.addChild(this.bindingsListWidget); @@ -57,7 +57,7 @@ public class ControllerControlsWidget extends SpruceContainerWidget { @Override public void renderWidget(MatrixStack matrices, int mouseX, int mouseY, float delta) { - drawCenteredText(matrices, this.client.textRenderer, new TranslatableText("midnightcontrols.menu.title.controller_controls"), + drawCenteredText(matrices, this.client.textRenderer, Text.translatable("midnightcontrols.menu.title.controller_controls"), this.getX() + this.width / 2, this.getY() + 4, 16777215); this.resetButton.setActive(InputManager.streamBindings().anyMatch(Predicates.not(ButtonBinding::isDefault))); super.renderWidget(matrices, mouseX, mouseY, delta); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControlsListWidget.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControlsListWidget.java index 8e91d33..1282bbb 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControlsListWidget.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControlsListWidget.java @@ -27,9 +27,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.LiteralText; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -93,17 +91,17 @@ public class ControlsListWidget extends SpruceEntryListWidget MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton())) { protected Text getNarrationMessage() { - return new TranslatableText("narrator.controls.reset", bindingName); + return Text.translatable("narrator.controls.reset", bindingName); } }; this.children.add(this.resetButton); @@ -116,7 +114,7 @@ public class ControlsListWidget extends SpruceEntryListWidget ").formatted(Formatting.WHITE); + var text = Text.literal("> ").formatted(Formatting.WHITE); text.append(this.editButton.getMessage().copy().formatted(Formatting.YELLOW)); - this.editButton.setMessage(text.append(new LiteralText(" <").formatted(Formatting.WHITE))); + this.editButton.setMessage(text.append(Text.literal(" <").formatted(Formatting.WHITE))); } else if (!this.binding.isNotBound() && InputManager.hasDuplicatedBindings(this.binding)) { var text = this.editButton.getMessage().copy(); this.editButton.setMessage(text.formatted(Formatting.RED)); @@ -264,7 +262,7 @@ public class ControlsListWidget extends SpruceEntryListWidget { + this.addDrawableChild(new ButtonWidget(j, k, 150, 20, Text.translatable("midnightcontrols.menu.title.controller").append("..."), (button) -> { this.client.setScreen(new MidnightControlsSettingsScreen(this, false)); })); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/GameOptionsMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/GameOptionsMixin.java index 7ce3470..84291fc 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/GameOptionsMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/GameOptionsMixin.java @@ -10,6 +10,8 @@ package eu.midnightdust.midnightcontrols.client.mixin; import net.minecraft.client.option.GameOptions; +import net.minecraft.client.option.SimpleOption; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -22,13 +24,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; * Sets the default of the Auto-Jump option to false. */ @Mixin(GameOptions.class) -public class GameOptionsMixin { - @Shadow - public boolean autoJump; +public abstract class GameOptionsMixin { + + @Shadow public abstract SimpleOption getAutoJump(); @Inject(method = "load", at = @At("HEAD")) public void onInit(CallbackInfo ci) { // Set default value of the Auto-Jump option to false. - this.autoJump = false; + getAutoJump().setValue(false); } } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java index f98f39b..98796f2 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java @@ -138,7 +138,7 @@ public abstract class MinecraftClientMixin { hitResult = mod.reacharound.withSideForReacharound(hitResult, stackInHand); int previousStackCount = stackInHand.getCount(); - var result = this.interactionManager.interactBlock(this.player, this.world, hand, hitResult); + var result = this.interactionManager.interactBlock(this.player, hand, hitResult); if (result.isAccepted()) { if (result.shouldSwingHand()) { this.player.swingHand(hand); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/KeyBindingRingAction.java b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/KeyBindingRingAction.java index 8da8fa5..cf34e18 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/KeyBindingRingAction.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/KeyBindingRingAction.java @@ -15,7 +15,7 @@ import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.option.KeyBinding; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,7 +49,7 @@ public class KeyBindingRingAction extends RingAction { @Override public void drawIcon(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int x, int y, boolean hovered) { - drawCenteredText(matrices, textRenderer, new TranslatableText(this.getName()), x + 25, y + 25 - textRenderer.fontHeight / 2, 0xffffff); + drawCenteredText(matrices, textRenderer, Text.translatable(this.getName()), x + 25, y + 25 - textRenderer.fontHeight / 2, 0xffffff); } protected static class Factory implements RingAction.Factory { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingAction.java b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingAction.java index fb2be50..1062b26 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingAction.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingAction.java @@ -15,7 +15,6 @@ import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import org.aperlambda.lambdacommon.utils.Nameable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,7 +42,7 @@ public abstract class RingAction extends DrawableHelper implements Nameable { * @return the text name */ public Text getTextName() { - return new TranslatableText(this.getName()); + return Text.translatable(this.getName()); } /** diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingButtonMode.java b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingButtonMode.java index 9ba3e17..0a94c41 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingButtonMode.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingButtonMode.java @@ -10,7 +10,6 @@ package eu.midnightdust.midnightcontrols.client.ring; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import org.aperlambda.lambdacommon.utils.Nameable; import org.jetbrains.annotations.NotNull; @@ -31,7 +30,7 @@ public enum RingButtonMode implements Nameable { RingButtonMode(@NotNull String name) { this.name = name; - this.text = new TranslatableText(this.getTranslationKey()); + this.text = Text.translatable(this.getTranslationKey()); } /** diff --git a/src/main/resources/assets/midnightcontrols/lang/de_de.json b/src/main/resources/assets/midnightcontrols/lang/de_de.json index 5007465..0ffa312 100644 --- a/src/main/resources/assets/midnightcontrols/lang/de_de.json +++ b/src/main/resources/assets/midnightcontrols/lang/de_de.json @@ -31,6 +31,10 @@ "midnightcontrols.action.swap_hands": "Hände wechseln", "midnightcontrols.action.toggle_perspective": "Perspektive wechseln", "midnightcontrols.action.toggle_smooth_camera": "Cinematische Kamera", + "midnightcontrols.action.page_back": "Vorherige Seite", + "midnightcontrols.action.page_next": "Nächste Seite", + "midnightcontrols.action.take": "Item nehmen", + "midnightcontrols.action.take_all": "Stack nehmen", "midnightcontrols.action.use": "Benutzen", "midnightcontrols.action.zoom": "Zoom", "midnightcontrols.action.zoom_in": "Zoom erhöhen", diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index aa7b287..7e86297 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -31,6 +31,10 @@ "midnightcontrols.action.swap_hands": "Swap Hands", "midnightcontrols.action.toggle_perspective": "Toggle Perspective", "midnightcontrols.action.toggle_smooth_camera": "Toggle Cinematic Camera", + "midnightcontrols.action.page_back": "Previous Page", + "midnightcontrols.action.page_next": "Next Page", + "midnightcontrols.action.take": "Take Item", + "midnightcontrols.action.take_all": "Take Stack", "midnightcontrols.action.use": "Use", "midnightcontrols.action.zoom": "Zoom", "midnightcontrols.action.zoom_in": "Increase Zoom", From 34408d7a2a01866761c7efa576982f9f5b5f2564 Mon Sep 17 00:00:00 2001 From: Motschen Date: Sat, 25 Jun 2022 21:23:25 +0200 Subject: [PATCH 02/21] MidnightControls 1.2.0 - Touchscreen, Modded Keybinds, Bugfixes - Added #40 (Modded keybind support) - Added #20 (Touchscreen support) - Improved #13 (Sodium screen controller support) - Attempt to fix #31 & #38 (Jittery input on low FPS) - Fixed #35 (Front placing being broken) - Fixed #32 (Option to disable double tap to sprint) - Fixed #27 (Auto-adapt controller icons) - Fixed #19 (HUD-scaling on big scales) - Fixed #36 (Crash on game load) - Fixed reset option - Fixed scrolling in trading screens - Disable features that might be considered as cheats (install MidnightControlsExtra to enable) --- README.md | 8 +- build.gradle | 2 +- gradle.properties | 4 +- .../midnightcontrols/ControlsMode.java | 3 +- .../midnightcontrols/MidnightControls.java | 4 +- .../MidnightControlsFeature.java | 2 +- .../client/MidnightControlsClient.java | 72 ++- .../client/MidnightControlsConfig.java | 56 +- .../client/MidnightInput.java | 89 +-- .../client/MidnightReacharound.java | 2 +- .../client/compat/EmotecraftCompat.java | 49 -- .../client/compat/MidnightControlsCompat.java | 4 - .../compat/MidnightControlsMixinPlugin.java | 2 + .../client/compat/SodiumCompat.java | 40 ++ .../mixin/SodiumOptionsGUIAccessor.java | 19 + .../client/controller/ButtonBinding.java | 9 +- .../client/controller/Controller.java | 9 +- .../client/controller/InputHandlers.java | 6 +- .../client/controller/InputManager.java | 8 +- .../client/gui/MidnightControlsHud.java | 17 +- .../client/gui/MidnightControlsRenderer.java | 4 +- .../gui/MidnightControlsSettingsScreen.java | 28 +- .../client/gui/RingScreen.java | 6 +- .../client/gui/TouchscreenOverlay.java | 510 +++++++++--------- .../gui/widget/ControllerControlsWidget.java | 2 + .../widget/SilentTexturedButtonWidget.java | 26 + .../client/mixin/ClientPlayerEntityMixin.java | 9 +- .../CreativeInventoryScreenAccessor.java | 4 +- .../client/mixin/KeyBindingMixin.java | 2 +- .../mixin/KeyBindingRegistryImplAccessor.java | 17 + .../client/mixin/MinecraftClientMixin.java | 22 +- .../client/ring/MidnightRing.java | 20 +- .../client/ring/RingPage.java | 55 ++ .../assets/midnightcontrols/lang/de_de.json | 1 + .../assets/midnightcontrols/lang/en_us.json | 1 + .../resources/midnightcontrols.mixins.json | 3 +- .../midnightcontrols_compat.mixins.json | 1 + .../resourcepacks/bedrock/pack.mcmeta | 2 +- 38 files changed, 653 insertions(+), 465 deletions(-) delete mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/EmotecraftCompat.java create mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java create mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/SodiumOptionsGUIAccessor.java create mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/SilentTexturedButtonWidget.java create mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingRegistryImplAccessor.java diff --git a/README.md b/README.md index 268155f..06a4eaa 100644 --- a/README.md +++ b/README.md @@ -32,16 +32,16 @@ This mod also adds controller support. - Front block placing (be careful with this one) - New controls settings! - Many options in config to change to your liking. -- Many controllers supported and in a simply way your own controller mappings. +- Many controllers supported and in a simple way your own controller mappings. - An easy API for developers to add their own button bindings. ## 🎮 Supported Controllers: -- Dualshock controllers -- Dualsense controllers +- DualShock controllers +- DualSense controllers - Xbox controllers - Switch Pro controllers -- Joycons +- Joy-Cons - Steam controller and Steam Deck (WIP) - And many more! diff --git a/build.gradle b/build.gradle index 853b831..9a0fc90 100644 --- a/build.gradle +++ b/build.gradle @@ -110,7 +110,7 @@ dependencies { // modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}" modImplementation "org.quiltmc:quilt-json5:1.0.0" - //modImplementation "maven.modrinth:sodium:${project.sodium_version}" + modImplementation "maven.modrinth:sodium:${project.sodium_version}" //modImplementation("maven.modrinth:emi:${project.emi_version}") modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}" modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}" diff --git a/gradle.properties b/gradle.properties index ec8cf84..c01b66f 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.1.0 +mod_version = 1.2.0 maven_group = eu.midnightdust archives_base_name = midnightcontrols modrinth_id=bXX9h73M @@ -16,7 +16,7 @@ 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.55.2+1.19 -sodium_version=mc1.19-0.4.1 +sodium_version=mc1.19-0.4.2 spruceui_version=4.0.0+1.19 midnightlib_version=0.5.2 modmenu_version=4.0.0 diff --git a/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java b/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java index cb45f8b..fcc4523 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/ControlsMode.java @@ -24,7 +24,8 @@ import java.util.Optional; */ public enum ControlsMode implements Nameable { DEFAULT, - CONTROLLER; + CONTROLLER, + TOUCHSCREEN; /** * Returns the next controls mode available. diff --git a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java index fb1d0ae..063f578 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControls.java @@ -37,14 +37,14 @@ public class MidnightControls implements ModInitializer { public static final Identifier CONTROLS_MODE_CHANNEL = new Identifier(MidnightControlsConstants.CONTROLS_MODE_CHANNEL.toString()); public static final Identifier FEATURE_CHANNEL = new Identifier(MidnightControlsConstants.FEATURE_CHANNEL.toString()); public static final Identifier HELLO_CHANNEL = new Identifier(MidnightControlsConstants.HELLO_CHANNEL.toString()); - - public static final Text NOT_BOUND_TEXT = Text.translatable("midnightcontrols.not_bound"); + public static boolean isExtrasLoaded; public final Logger logger = LogManager.getLogger("MidnightControls"); @Override public void onInitialize() { INSTANCE = this; + isExtrasLoaded = FabricLoader.getInstance().isModLoaded("midnightcontrols-extra"); this.log("Initializing MidnightControls..."); ServerPlayNetworking.registerGlobalReceiver(HELLO_CHANNEL, (server, player, handler, buf, responseSender) -> { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java index 18a9cd4..316ad14 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/MidnightControlsFeature.java @@ -61,7 +61,7 @@ public class MidnightControlsFeature implements Nameable { * @return {@code true} if this feature is allowed, else {@code false} */ public boolean isAllowed() { - return this.allowed; + return MidnightControls.isExtrasLoaded && this.allowed; } /** diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index 36147eb..17713b7 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -16,10 +16,13 @@ import eu.midnightdust.midnightcontrols.MidnightControlsConstants; import eu.midnightdust.midnightcontrols.MidnightControlsFeature; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; +import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory; import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; 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.KeyBindingRegistryImplAccessor; import eu.midnightdust.midnightcontrols.client.ring.KeyBindingRingAction; import eu.midnightdust.midnightcontrols.client.ring.MidnightRing; import dev.lambdaurora.spruceui.hud.HudManager; @@ -51,6 +54,7 @@ import java.io.File; * @since 1.1.0 */ public class MidnightControlsClient extends MidnightControls implements ClientModInitializer { + public static boolean lateInitDone = 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"); @@ -60,8 +64,8 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_2, "key.categories.movement"); public static final KeyBinding BINDING_LOOK_LEFT = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "look_left"), InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_4, "key.categories.movement"); - /*public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(new Identifier(midnightcontrolsConstants.NAMESPACE, "ring"), - InputUtil.Type.MOUSE, GLFW.GLFW_MOUSE_BUTTON_5, "key.categories.misc");*/ + public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "ring"), + InputUtil.Type.MOUSE, GLFW.GLFW_MOUSE_BUTTON_5, "key.categories.misc"); public static final Identifier CONTROLLER_BUTTONS = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_buttons.png"); public static final Identifier CONTROLLER_EXPANDED = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_expanded.png"); public static final Identifier CONTROLLER_AXIS = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_axis.png"); @@ -83,10 +87,10 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo //KeyBindingHelper.registerKeyBinding(BINDING_RING); this.ring.registerAction("keybinding", KeyBindingRingAction.FACTORY); + this.ring.load(); - ClientPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL, (client, handler, buf, responseSender) -> { - responseSender.sendPacket(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(MidnightControlsConfig.controlsMode)); - }); + ClientPlayNetworking.registerGlobalReceiver(CONTROLS_MODE_CHANNEL, (client, handler, buf, responseSender) -> + responseSender.sendPacket(CONTROLS_MODE_CHANNEL, this.makeControlsModeBuffer(MidnightControlsConfig.controlsMode))); ClientPlayNetworking.registerGlobalReceiver(FEATURE_CHANNEL, (client, handler, buf, responseSender) -> { int features = buf.readVarInt(); for (int i = 0; i < features; i++) { @@ -102,23 +106,22 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo ClientPlayConnectionEvents.DISCONNECT.register(this::onLeave); ClientTickEvents.START_CLIENT_TICK.register(this.reacharound::tick); - ClientTickEvents.END_CLIENT_TICK.register(this::onTick); + ClientTickEvents.START_CLIENT_TICK.register(this::onTick); OpenScreenCallback.EVENT.register((client, screen) -> { -// if (screen == null && MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN) { -// screen = new TouchscreenOverlay(this); -// screen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); -// client.skipGameRender = false; -// client.currentScreen = screen; -// } else if (screen != null) { + if (screen == null && MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN) { + screen = new TouchscreenOverlay(this); + screen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); + client.skipGameRender = false; + client.currentScreen = screen; + } else if (screen != null) { this.input.onScreenOpen(client, client.getWindow().getWidth(), client.getWindow().getHeight()); - //} + } }); HudManager.register(this.hud = new MidnightControlsHud(this)); - FabricLoader.getInstance().getModContainer("midnightcontrols").ifPresent(modContainer -> { - ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","bedrock"), modContainer, ResourcePackActivationType.NORMAL); - }); + FabricLoader.getInstance().getModContainer("midnightcontrols").ifPresent(modContainer -> + ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("midnightcontrols","bedrock"), modContainer, ResourcePackActivationType.NORMAL)); } /** @@ -144,6 +147,35 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo MidnightControlsCompat.init(this); } + ButtonCategory category; + /** + * This method is called to initialize keybindings + */ + public void initKeybindings() { + if (lateInitDone) return; + 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")) { + 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); + } + } + } + InputManager.loadButtonBindings(); + lateInitDone = true; + } /** * This method is called every Minecraft tick. @@ -151,15 +183,15 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo * @param client the client instance */ public void onTick(@NotNull MinecraftClient client) { + this.initKeybindings(); this.input.tick(client); if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput)) this.input.tickController(client); - /*if (BINDING_RING.wasPressed()) { - client.openScreen(new RingScreen()); - }*/ + if (BINDING_RING.wasPressed()) { + client.setScreen(new RingScreen()); + } } - public void onRender(MinecraftClient client) { this.input.onRender(client.getTickDelta(), client); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index 35a75b3..c457a4b 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -11,6 +11,7 @@ package eu.midnightdust.midnightcontrols.client; 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; @@ -38,6 +39,7 @@ public class MidnightControlsConfig extends MidnightConfig { @Entry public static HudSide hudSide = HudSide.LEFT; // Gameplay @Entry public static boolean analogMovement = true; + @Entry public static boolean doubleTapToSprint = true; @Entry public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. @Entry 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 public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. @@ -45,8 +47,6 @@ public class MidnightControlsConfig extends MidnightConfig { @Entry public static boolean verticalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. @Entry public static boolean shouldRenderReacharoundOutline = true; @Entry public static int[] reacharoundOutlineColor = new int[]{255, 255, 255, 102}; - // Controller - @Entry public static ControllerType controllerType = ControllerType.DEFAULT; @Entry public static double rightDeadZone = 0.25; @Entry public static double leftDeadZone = 0.25; @Entry public static boolean invertRightYAxis = false; @@ -59,6 +59,7 @@ public class MidnightControlsConfig extends MidnightConfig { @Entry public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT; @Entry public static Object controllerID = 0; @Entry public static Object secondControllerID = -1; + @Entry public static ControllerType controllerType = ControllerType.DEFAULT; @Entry 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 public static Map BINDINGS = Map.of(); @@ -251,4 +252,55 @@ public class MidnightControlsConfig extends MidnightConfig { public static boolean isMovementAxis(int axis) { return axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X; } + + public static void reset() { + controlsMode = ControlsMode.DEFAULT; + autoSwitchMode = true; + debug = false; + hudEnable = true; + hudSide = HudSide.LEFT; + analogMovement = true; + doubleTapToSprint = true; + fastBlockPlacing = false; + flyDrifting = true; + verticalFlyDrifting = true; + horizontalReacharound = false; + verticalReacharound = false; + shouldRenderReacharoundOutline = true; + reacharoundOutlineColor = new int[]{255, 255, 255, 102}; + rightDeadZone = 0.25; + leftDeadZone = 0.25; + invertRightYAxis = false; + invertRightXAxis = false; + DEFAULT_MAX_VALUE = 1; + rotationSpeed = 40.0; + mouseSpeed = 25.0; + unfocusedInput = false; + virtualMouse = false; + virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT; + 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}; + } + + /** + * Gets the controller type from the controller's identifier. + * + * @return the controller name matches a type, else empty + */ + public static @NotNull ControllerType matchControllerToType() { + String controller = getController().getName().toLowerCase(); + if (controller.contains("xbox 360")) return ControllerType.XBOX_360; + else if (controller.contains("xbox") || controller.contains("afterglow")) return ControllerType.XBOX; + else if (controller.contains("steam deck")) return ControllerType.STEAM_DECK; + else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER; + else if (controller.contains("dualsense")) return ControllerType.DUALSENSE; + else if (controller.contains("dualshock") || controller.contains("ps4")) return ControllerType.DUALSHOCK; + else if (controller.contains("switch") || controller.contains("joy-con")) return ControllerType.SWITCH; + else if (controller.contains("ouya")) return ControllerType.OUYA; + else return ControllerType.DEFAULT; + } } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 241a386..3bc2592 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -10,7 +10,11 @@ package eu.midnightdust.midnightcontrols.client; import com.google.common.collect.ImmutableSet; +import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceOptionListWidget; +import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; +import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; @@ -28,6 +32,7 @@ import dev.lambdaurora.spruceui.widget.SpruceElement; import dev.lambdaurora.spruceui.widget.SpruceLabelWidget; import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget; import net.fabricmc.fabric.impl.item.group.CreativeGuiExtensions; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.ParentElement; @@ -37,6 +42,7 @@ import net.minecraft.client.gui.screen.advancement.AdvancementTab; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.screen.ingame.MerchantScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget; import net.minecraft.client.gui.screen.world.WorldListWidget; @@ -277,7 +283,7 @@ public class MidnightInput { } if (action == 0 || action == 2) { - if (client.currentScreen != null && isScreenInteractive(client.currentScreen) + if (client.currentScreen != null && (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT)) { if (this.actionGuiCooldown == 0) { @@ -304,11 +310,6 @@ public class MidnightInput { } } - if (this.handleInventory(client, button)) { - this.ignoreNextARelease = true; - return; - } - if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) { if (client.currentScreen != null && client.currentScreen.getClass() != TitleScreen.class) { if (!MidnightControlsCompat.handleMenuBack(client, client.currentScreen)) @@ -341,65 +342,6 @@ public class MidnightInput { } } /** - * Handles inventory interaction. - * - * @param client the client instance - * @param button the button pressed - * @return {@code true} if an inventory interaction was done - */ - private boolean handleInventory(@NotNull MinecraftClient client, int button) { -// if (!(client.currentScreen instanceof HandledScreen screen)) -// return false; -// -// if (client.interactionManager == null || client.player == null) -// return false; -// -// if (this.inventoryInteractionCooldown > 0) -// return true; -// -// if (button == GLFW.GLFW_GAMEPAD_BUTTON_B) { -// client.player.closeHandledScreen(); -// return true; -// } -// -// 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(); -// -// var accessor = (HandledScreenAccessor) screen; -// Slot slot = ((HandledScreenAccessor) client.currentScreen).midnightcontrols$getSlotAt(x, y); -// -// int slotId; -// if (slot == null) { -// if (client.player.currentScreenHandler.getCursorStack().isEmpty()) -// 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; -// switch (button) { -// case GLFW_GAMEPAD_BUTTON_A: -// if (screen instanceof CreativeInventoryScreen) -// if (((CreativeInventoryScreenAccessor) screen).midnightcontrols$isCreativeInventorySlot(slot)) -// actionType = SlotActionType.CLONE; -// if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))) -// actionType = SlotActionType.CLONE; -// break; -// case GLFW.GLFW_GAMEPAD_BUTTON_X: -// clickData = GLFW_MOUSE_BUTTON_2; -// break; -// case GLFW.GLFW_GAMEPAD_BUTTON_Y: -// actionType = SlotActionType.QUICK_MOVE; -// break; -// default: -// return false; -// } -// -// accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType); - return false; - } /** * Tries to go back. @@ -502,6 +444,14 @@ public class MidnightInput { } return; } + } else if (client.currentScreen instanceof MerchantScreen merchantScreen) { + if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) { + // @TODO allow rebinding to left stick + if (absValue >= deadZone) { + merchantScreen.mouseScrolled(0.0, 0.0, -(value * 1.5f)); + } + return; + } } else if (client.currentScreen instanceof AdvancementsScreen advancementsScreen) { if (axis == GLFW_GAMEPAD_AXIS_RIGHT_X || axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) { var accessor = (AdvancementsScreenAccessor) advancementsScreen; @@ -520,6 +470,14 @@ public class MidnightInput { element.mouseScrolled(0.0, 0.0, -value); return true; }); + client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget) + .map(element -> (SpruceEntryListWidget) element) + .filter(element -> element.getType().isFocused()) + .anyMatch(element -> { + MidnightControls.get().log(String.valueOf(value)); + element.mouseScrolled(0.0, 0.0, -value); + return true; + }); return; } } @@ -701,6 +659,7 @@ public class MidnightInput { } return false; } + if (FabricLoader.getInstance().isModLoaded("sodium")) SodiumCompat.handleInput(screen, direction.isLookingForward()); if (!screen.changeFocus(direction.isLookingForward())) { if (screen.changeFocus(direction.isLookingForward())) { this.actionGuiCooldown = 5; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightReacharound.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightReacharound.java index 1a0b10b..6c1f8f4 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightReacharound.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightReacharound.java @@ -144,7 +144,7 @@ public class MidnightReacharound { return null; } - return new BlockHitResult(client.crosshairTarget.getPos(), direction, blockPos, false); + return new BlockHitResult(new Vec3d(blockPos.getX(),blockPos.getY(),blockPos.getZ()), direction, blockPos, false); } return null; } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EmotecraftCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EmotecraftCompat.java deleted file mode 100644 index 0c13979..0000000 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EmotecraftCompat.java +++ /dev/null @@ -1,49 +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.MidnightControlsClient; -import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; -import io.github.kosmx.emotes.arch.gui.screen.ingame.FastChosseScreen; -import io.github.kosmx.emotes.main.network.ClientEmotePlay; -import org.jetbrains.annotations.NotNull; - -/** - * Represents a compatibility handler for Emotecraft. - * - * @author Motschen - * @version 1.4.3 - * @since 1.0.0 - */ -public class EmotecraftCompat implements CompatHandler { - @Override - public void handle(@NotNull MidnightControlsClient mod) { - new ButtonBinding.Builder("key.emotecraft.fastchoose") - .buttons(16) - .onlyInGame() - .cooldown(true) - .category(ButtonBinding.MISC_CATEGORY) - .action((client, button, value, action) -> { - client.setScreen(new FastChosseScreen(null)); - return true; - }) - .register(); - new ButtonBinding.Builder("key.emotecraft.stop") - .buttons(17) - .onlyInGame() - .cooldown(true) - .category(ButtonBinding.MISC_CATEGORY) - .action((client, button, value, action) -> { - ClientEmotePlay.clientStopLocalEmote(); - return true; - }) - .register(); - } -} 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 7c7459a..6f23cb2 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java @@ -53,10 +53,6 @@ public class MidnightControlsCompat { mod.log("Adding HQM compatibility..."); HANDLERS.add(new HQMCompat()); } - if (FabricLoader.getInstance().isModLoaded("emotecraft")) { - mod.log("Adding Emotecraft compatibility..."); - HANDLERS.add(new EmotecraftCompat()); - } HANDLERS.forEach(handler -> handler.handle(mod)); InputManager.loadButtonBindings(); } 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 d746747..f08a33c 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsMixinPlugin.java @@ -9,6 +9,7 @@ package eu.midnightdust.midnightcontrols.client.compat; +import net.fabricmc.loader.api.FabricLoader; import org.jetbrains.annotations.NotNull; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; @@ -33,6 +34,7 @@ public class MidnightControlsMixinPlugin implements IMixinConfigPlugin { this.putConditionalMixin("EntryWidgetAccessor", MidnightControlsCompat.isReiPresent()); this.putConditionalMixin("RecipeViewingScreenAccessor", MidnightControlsCompat.isReiPresent()); this.putConditionalMixin("VillagerRecipeViewingScreenAccessor", MidnightControlsCompat.isReiPresent()); + 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/compat/SodiumCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java new file mode 100644 index 0000000..1acf08c --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java @@ -0,0 +1,40 @@ +package eu.midnightdust.midnightcontrols.client.compat; + +import eu.midnightdust.midnightcontrols.MidnightControls; +import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; +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(); + InputManager.INPUT_MANAGER.targetMouseX = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterX()); + InputManager.INPUT_MANAGER.targetMouseY = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterY()); + MidnightControlsClient.get().input.actionGuiCooldown = 5; + 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; + final int max = accessor.getPages().size()-1; + int i = accessor.getPages().indexOf(accessor.getCurrentPage()); + i = (direction ? ((max > i) ? ++i : 0) : (i > 0 ? --i : max)); + MidnightControls.get().log(""+i); + optionsGUI.setPage(accessor.getPages().get(i)); + } + } +} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/SodiumOptionsGUIAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/SodiumOptionsGUIAccessor.java new file mode 100644 index 0000000..eaed0c3 --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/mixin/SodiumOptionsGUIAccessor.java @@ -0,0 +1,19 @@ +package eu.midnightdust.midnightcontrols.client.compat.mixin; + +import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI; +import me.jellysquid.mods.sodium.client.gui.options.OptionPage; +import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(value = SodiumOptionsGUI.class, remap = false) +public interface SodiumOptionsGUIAccessor { + @Accessor + List> getControls(); + @Accessor + List getPages(); + @Accessor + OptionPage getCurrentPage(); +} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java index 422a9eb..0c8e59f 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java @@ -13,6 +13,7 @@ import eu.midnightdust.midnightcontrols.client.ButtonState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.GameOptions; import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.resource.language.I18n; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.aperlambda.lambdacommon.utils.function.PairPredicate; @@ -75,9 +76,9 @@ public class ButtonBinding { public static final ButtonBinding SPRINT = new Builder("sprint").buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB).onlyInGame().register(); public static final ButtonBinding SWAP_HANDS = new Builder("swap_hands").buttons(GLFW_GAMEPAD_BUTTON_X).onlyInGame().cooldown().register(); public static final ButtonBinding TAB_LEFT = new Builder("tab_back").buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER) - .action(InputHandlers.handleHotbar(false)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements)).cooldown().register(); + .action(InputHandlers.handleHotbar(false)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements).or((client, binding) -> client.currentScreen != null && client.currentScreen.getClass().toString().contains("sodium"))).cooldown().register(); public static final ButtonBinding TAB_RIGHT = new Builder("tab_next").buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER) - .action(InputHandlers.handleHotbar(true)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements)).cooldown().register(); + .action(InputHandlers.handleHotbar(true)).filter(Predicates.or(InputHandlers::inInventory, InputHandlers::inAdvancements).or((client, binding) -> client.currentScreen != null && client.currentScreen.getClass().toString().contains("sodium"))).cooldown().register(); public static final ButtonBinding PAGE_LEFT = new Builder("page_back").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true)) .action(InputHandlers.handlePage(false)).filter(InputHandlers::inInventory).cooldown().register(); public static final ButtonBinding PAGE_RIGHT = new Builder("page_next").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true)) @@ -248,7 +249,7 @@ public class ButtonBinding { * @return the translation key */ public @NotNull String getTranslationKey() { - return "midnightcontrols.action." + this.getName(); + return I18n.hasTranslation("midnightcontrols.action." + this.getName()) ? "midnightcontrols.action." + this.getName() : this.getName(); } public @NotNull Text getText() { @@ -440,7 +441,7 @@ public class ButtonBinding { } public Builder(@NotNull Identifier identifier) { - this(identifier.getNamespace() + "." + identifier.getNamespace()); + this(identifier.getNamespace() + "." + identifier.getPath()); } /** diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/Controller.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/Controller.java index 5859047..87c397b 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/Controller.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/Controller.java @@ -13,6 +13,7 @@ import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.resource.language.I18n; import net.minecraft.client.toast.SystemToast; import net.minecraft.text.Text; import org.aperlambda.lambdacommon.utils.Nameable; @@ -136,7 +137,7 @@ public record Controller(int id) implements Nameable { } } - buffer.flip(); // Force Java 8 >.< + if (buffer != null) buffer.flip(); // Force Java 8 >.< return buffer; } @@ -149,7 +150,6 @@ public record Controller(int id) implements Nameable { File databaseFile = new File("config/gamecontrollerdatabase.txt"); try { BufferedInputStream in = new BufferedInputStream(new URL("https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt").openStream()); - BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(databaseFile)); byte[] dataBuffer = new byte[1024]; int bytesRead; @@ -159,11 +159,11 @@ public record Controller(int id) implements Nameable { out.close(); } catch (Exception ignored) {/* Just continue when internet connection is not available */} var database = ioResourceToBuffer(databaseFile.getPath(), 1024); - GLFW.glfwUpdateGamepadMappings(database); + if (database != null) GLFW.glfwUpdateGamepadMappings(database); if (!MidnightControlsClient.MAPPINGS_FILE.exists()) return; var buffer = ioResourceToBuffer(MidnightControlsClient.MAPPINGS_FILE.getPath(), 1024); - GLFW.glfwUpdateGamepadMappings(buffer); + if (buffer != null) GLFW.glfwUpdateGamepadMappings(buffer); } catch (IOException e) { e.printStackTrace(); } @@ -178,6 +178,7 @@ public record Controller(int id) implements Nameable { if (client != null) { client.getToastManager().add(SystemToast.create(client, SystemToast.Type.TUTORIAL_HINT, Text.translatable("midnightcontrols.controller.mappings.error"), Text.literal(string))); + MidnightControls.get().log(I18n.translate("midnightcontrols.controller.mappings.error")+string); } } } catch (Throwable e) { 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 18fb149..b42e4cf 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -13,11 +13,13 @@ import eu.midnightdust.midnightcontrols.client.ButtonState; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightInput; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; +import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat; 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.util.HandledScreenAccessor; import net.fabricmc.fabric.impl.item.group.CreativeGuiExtensions; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; @@ -64,7 +66,7 @@ public class InputHandlers { client.player.getInventory().selectedSlot = client.player.getInventory().selectedSlot == 0 ? 8 : client.player.getInventory().selectedSlot - 1; return true; } else if (client.currentScreen instanceof CreativeInventoryScreenAccessor inventory) { - int currentTab = inventory.getSelectedTab(); + int currentTab = CreativeInventoryScreenAccessor.getSelectedTab(); int nextTab = currentTab + (next ? 1 : -1); if (nextTab < 0) nextTab = ItemGroup.GROUPS.length - 1; @@ -105,7 +107,7 @@ public class InputHandlers { } } return true; - } + } else if (FabricLoader.getInstance().isModLoaded("sodium")) SodiumCompat.handleTabs(client.currentScreen, next); return false; }; } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputManager.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputManager.java index 5ed4253..9b8ce30 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputManager.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputManager.java @@ -42,10 +42,10 @@ public class InputManager { private static final List CATEGORIES = new ArrayList<>(); public static final Int2ObjectMap STATES = new Int2ObjectOpenHashMap<>(); public static final Int2FloatMap BUTTON_VALUES = new Int2FloatOpenHashMap(); - private int prevTargetMouseX = 0; - private int prevTargetMouseY = 0; - private int targetMouseX = 0; - private int targetMouseY = 0; + public int prevTargetMouseX = 0; + public int prevTargetMouseY = 0; + public int targetMouseX = 0; + public int targetMouseY = 0; protected InputManager() { } 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 a2b5c3c..127bc8f 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java @@ -53,6 +53,7 @@ public class MidnightControlsHud extends Hud { private String attackAction = ""; private String placeAction = ""; private int ticksDisplayedCrosshair = 0; + private static float scale = 1f; public MidnightControlsHud(@NotNull MidnightControlsClient mod) { super(new Identifier(MidnightControlsConstants.NAMESPACE, "hud/button_indicator")); @@ -71,8 +72,12 @@ 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); + } else scale = 1f; } + /** * Renders the midnightcontrols' HUD. */ @@ -80,10 +85,12 @@ public class MidnightControlsHud extends Hud { public void render(MatrixStack matrices, float tickDelta) { if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && this.client.currentScreen == null) { int y = bottom(2); - this.renderFirstIcons(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y); - this.renderSecondIcons(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y); - this.renderFirstSection(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : client.getWindow().getScaledWidth() - 2, y); - this.renderSecondSection(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : client.getWindow().getScaledWidth() - 2, y); + if (scale != 1f) matrices.scale(scale,scale,scale); + this.renderFirstIcons(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : (int) ((client.getWindow().getScaledWidth() - 2) * (1 / scale)), y); + this.renderSecondIcons(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : (int) ((client.getWindow().getScaledWidth() - 2) * (1 / scale)), y); + this.renderFirstSection(matrices, MidnightControlsConfig.hudSide == HudSide.LEFT ? 2 : (int) ((client.getWindow().getScaledWidth() - 2) * (1 / scale)), y); + this.renderSecondSection(matrices, MidnightControlsConfig.hudSide == HudSide.RIGHT ? 2 : (int) ((client.getWindow().getScaledWidth() - 2) * (1 / scale)), y); + if (scale != 1f) matrices.scale(1,1,1); } if (this.mod.reacharound.isLastReacharoundVertical()) { @@ -246,7 +253,7 @@ public class MidnightControlsHud extends Hud { } private int bottom(int y) { - return this.client.getWindow().getScaledHeight() - y - MidnightControlsRenderer.ICON_SIZE; + return (int) ((this.client.getWindow().getScaledHeight() * (1/scale)) - y - MidnightControlsRenderer.ICON_SIZE); } private int width(@NotNull ButtonBinding binding) { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsRenderer.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsRenderer.java index 9cdc41f..c1be1aa 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsRenderer.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsRenderer.java @@ -10,6 +10,8 @@ package eu.midnightdust.midnightcontrols.client.gui; import com.mojang.blaze3d.systems.RenderSystem; +import eu.midnightdust.midnightcontrols.MidnightControls; +import eu.midnightdust.midnightcontrols.client.ControllerType; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.MidnightInput; @@ -106,7 +108,7 @@ public class MidnightControlsRenderer { second = true; } - int controllerType = MidnightControlsConfig.controllerType.getId(); + int controllerType = MidnightControlsConfig.controllerType == ControllerType.DEFAULT ? MidnightControlsConfig.matchControllerToType().getId() : MidnightControlsConfig.controllerType.getId(); boolean axis = false; int buttonOffset = button * 15; switch (button) { 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 8941f10..a015f22 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -60,6 +60,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { private final SpruceOption resetOption; // Gameplay options private final SpruceOption analogMovementOption; + private final SpruceOption doubleTapToSprintOption; private final SpruceOption autoJumpOption; private final SpruceOption fastBlockPlacingOption; private final SpruceOption frontBlockPlacingOption; @@ -177,7 +178,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { Text.translatable("midnightcontrols.tooltip.mouse_speed")); this.resetOption = SpruceSimpleActionOption.reset(btn -> { // TODO - MidnightControlsConfig.init("midnightcontrols", MidnightControlsConfig.class); + MidnightControlsConfig.reset(); var client = MinecraftClient.getInstance(); this.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); }); @@ -185,6 +186,9 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { this.analogMovementOption = new SpruceToggleBooleanOption("midnightcontrols.menu.analog_movement", () -> MidnightControlsConfig.analogMovement, value -> MidnightControlsConfig.analogMovement = value, Text.translatable("midnightcontrols.tooltip.analog_movement")); + this.doubleTapToSprintOption = new SpruceToggleBooleanOption("midnightcontrols.menu.double_tap_to_sprint", + () -> MidnightControlsConfig.doubleTapToSprint, value -> MidnightControlsConfig.doubleTapToSprint = value, + Text.translatable("midnightcontrols.tooltip.double_tap_to_sprint")); this.autoJumpOption = new SpruceToggleBooleanOption("options.autoJump", () -> this.client.options.getAutoJump().getValue(), newValue -> this.client.options.getAutoJump().setValue(newValue), @@ -292,6 +296,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { public SpruceOptionListWidget buildGeneralTab(int width, int height) { var list = new SpruceOptionListWidget(Position.origin(), width, height); + list.setBackground(new MidnightControlsBackground(130)); list.addSingleOptionEntry(this.inputModeOption); list.addSingleOptionEntry(this.autoSwitchModeOption); list.addSingleOptionEntry(this.rotationSpeedOption); @@ -302,18 +307,21 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { public SpruceOptionListWidget buildGameplayTab(int width, int height) { var list = new SpruceOptionListWidget(Position.origin(), width, height); + list.setBackground(new MidnightControlsBackground(130)); list.addSingleOptionEntry(this.analogMovementOption); - list.addSingleOptionEntry(this.fastBlockPlacingOption); - list.addSingleOptionEntry(this.frontBlockPlacingOption); - list.addSingleOptionEntry(this.verticalReacharoundOption); - list.addSingleOptionEntry(this.flyDriftingOption); - list.addSingleOptionEntry(this.flyVerticalDriftingOption); + list.addSingleOptionEntry(this.doubleTapToSprintOption); + if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.fastBlockPlacingOption); + if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.frontBlockPlacingOption); + if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.verticalReacharoundOption); + if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.flyDriftingOption); + if (MidnightControls.isExtrasLoaded) list.addSingleOptionEntry(this.flyVerticalDriftingOption); list.addSingleOptionEntry(this.autoJumpOption); return list; } public SpruceOptionListWidget buildVisualTab(int width, int height) { var list = new SpruceOptionListWidget(Position.origin(), width, height); + list.setBackground(new MidnightControlsBackground(130)); list.addSingleOptionEntry(this.controllerTypeOption); list.addSingleOptionEntry(this.virtualMouseSkinOption); list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null)); @@ -352,6 +360,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { labels.addChild(aboutMappings3); var list = new SpruceOptionListWidget(Position.origin(), width, listHeight); + list.setBackground(new MidnightControlsBackground(130)); list.addSingleOptionEntry(this.controllerOption); list.addSingleOptionEntry(this.secondControllerOption); list.addSingleOptionEntry(this.unfocusedInputOption); @@ -377,6 +386,11 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { } public static class MidnightControlsBackground implements Background { + private int transparency = 160; + public MidnightControlsBackground() {} + public MidnightControlsBackground(int transparency) { + this.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")); @@ -388,7 +402,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { float r = (float)(color.getRed()) / 255.0F; float g = (float)(color.getGreen()) / 255.0F; float b = (float)(color.getBlue()) / 255.0F; - float t = (float)(160) / 255.0F; + float t = (float)(transparency) / 255.0F; BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); RenderSystem.enableBlend(); RenderSystem.disableTexture(); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java index 8ee1f17..5491e58 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java @@ -46,10 +46,10 @@ public class RingScreen extends Screen { @Override public boolean mouseReleased(double mouseX, double mouseY, int button) { - /*if (midnightcontrolsClient.BINDING_RING.matchesMouse(button)) { - this.onClose(); + if (mod.ring.getCurrentPage().onClick(client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight(), (int) mouseX, (int) mouseY)) { + this.close(); return true; - }*/ + } return false; } } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java index 8273a21..9a73ad6 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/TouchscreenOverlay.java @@ -9,18 +9,18 @@ package eu.midnightdust.midnightcontrols.client.gui; -import dev.lambdaurora.spruceui.widget.SpruceTexturedButtonWidget; +import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; import eu.midnightdust.midnightcontrols.client.HudSide; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import eu.midnightdust.midnightcontrols.client.gui.widget.SilentTexturedButtonWidget; import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor; import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.GameMenuScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TexturedButtonWidget; -import net.minecraft.client.option.KeyBinding; import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.text.Text; import net.minecraft.util.Arm; @@ -37,265 +37,259 @@ import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y; * Represents the touchscreen overlay */ public class TouchscreenOverlay extends Screen { - public static final Identifier WIDGETS_LOCATION = new Identifier("midnightcontrols", "textures/gui/widgets.png"); - private MidnightControlsClient mod; - private SpruceTexturedButtonWidget jumpButton; - private SpruceTexturedButtonWidget flyButton; - private SpruceTexturedButtonWidget flyUpButton; - private SpruceTexturedButtonWidget flyDownButton; - private int flyButtonEnableTicks = 0; - private int forwardButtonTick = 0; - private SpruceTexturedButtonWidget forwardLeftButton; - private SpruceTexturedButtonWidget forwardRightButton; - private SpruceTexturedButtonWidget startSneakButton; - private SpruceTexturedButtonWidget endSneakButton; + public static final Identifier WIDGETS_LOCATION = new Identifier("midnightcontrols", "textures/gui/widgets.png"); + private MidnightControlsClient mod; + private SilentTexturedButtonWidget jumpButton; + private SilentTexturedButtonWidget flyButton; + private SilentTexturedButtonWidget flyUpButton; + private SilentTexturedButtonWidget flyDownButton; + private int flyButtonEnableTicks = 0; + private int forwardButtonTick = 0; + private SilentTexturedButtonWidget forwardLeftButton; + private SilentTexturedButtonWidget forwardRightButton; + private SilentTexturedButtonWidget startSneakButton; + private SilentTexturedButtonWidget endSneakButton; - public TouchscreenOverlay(@NotNull MidnightControlsClient mod) - { + public TouchscreenOverlay(@NotNull MidnightControlsClient mod) { super(Text.literal("Touchscreen overlay")); this.mod = mod; this.passEvents = true; } -// @Override -// public boolean shouldPause() -// { -// return false; -// } -// -// @Override -// public boolean keyPressed(int keyCode, int scanCode, int modifiers) -// { -// super.keyPressed(keyCode,scanCode,modifiers); -// //return false; -// return true; -// } -// -// private void pauseGame(boolean bl) -// { -// if (this.client == null) -// return; -// boolean bl2 = this.client.isIntegratedServerRunning() && !this.client.getServer().isRemote(); -// if (bl2) { -// this.client.setScreen(new GameMenuScreen(!bl)); -// this.client.getSoundManager().pauseAll(); -// } else { -// this.client.setScreen(new GameMenuScreen(true)); -// } -// } -// -// /** -// * Updates the forward button ticks cooldown. -// * -// * @param state The button state. -// * -// */ -// private void updateForwardButtonsState(boolean state) -// { -// if (state) -// this.forwardButtonTick = -1; -// else -// this.forwardButtonTick = 20; -// } -// -// /** -// * Updates the jump buttons. -// */ -// private void updateJumpButtons() -// { -// if (this.client == null) -// return; -// if (!this.client.interactionManager.isFlyingLocked()) { -// boolean oldStateFly = this.flyButton.visible; -// this.jumpButton.visible = false; -// this.flyButton.visible = true; -// this.flyUpButton.visible = true; -// this.flyDownButton.visible = true; -// if (oldStateFly != this.flyButton.visible) { -// this.flyButtonEnableTicks = 5; -// this.handleJump(null, false); -// } else if (this.flyButtonEnableTicks > 0) -// this.flyButtonEnableTicks--; -// } else { -// this.jumpButton.visible = true; -// this.flyButton.visible = false; -// this.flyUpButton.visible = false; -// this.flyDownButton.visible = false; -// } -// } -// -// /** -// * Handles the jump button. -// * -// * @param btn The pressed button. -// * @param state The state of the jump button. -// */ -// private void handleJump(ButtonWidget btn, boolean state) -// { -// ((KeyBindingAccessor) this.client.options.keyJump).midnightcontrols$handlePressState(state); -// } -// -// @Override -// public void tick() -// { -// if (this.forwardButtonTick > 0) { -// this.forwardButtonTick--; -// } else if (this.forwardButtonTick == 0) { -// if (this.forwardLeftButton.visible) -// this.forwardLeftButton.visible = false; -// if (this.forwardRightButton.visible) -// this.forwardRightButton.visible = false; -// } -// this.updateJumpButtons(); -// } -// -// @Override -// protected void init() -// { -// super.init(); -// int scaledWidth = this.client.getWindow().getScaledWidth(); -// int scaledHeight = this.client.getWindow().getScaledHeight(); -// this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2 - 20, 0, 20, 20, 0, 106, 20, ButtonWidget.WIDGETS_LOCATION, 256, 256, -// btn -> this.client.setScreen(new ChatScreen("")), LiteralText.EMPTY)); -// this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2, 0, 20, 20, 0, 0, 20, WIDGETS_LOCATION, 256, 256, -// btn -> this.pauseGame(false))); -// // Inventory buttons. -// int inventoryButtonX = scaledWidth / 2; -// int inventoryButtonY = scaledHeight - 16 - 5; -// if (this.client.options.mainArm == Arm.LEFT) { -// inventoryButtonX = inventoryButtonX - 91 - 24; -// } else { -// inventoryButtonX = inventoryButtonX + 91 + 4; -// } -// this.addDrawableChild(new TexturedButtonWidget(inventoryButtonX, inventoryButtonY, 20, 20, 20, 0, 20, WIDGETS_LOCATION, 256, 256, -// btn -> { -// if (this.client.interactionManager.hasRidingInventory()) { -// this.client.player.openRidingInventory(); -// } else { -// this.client.getTutorialManager().onInventoryOpened(); -// this.client.openScreen(new InventoryScreen(this.client.player)); -// } -// })); -// int jumpButtonX, swapHandsX, sneakButtonX; -// int sneakButtonY = scaledHeight - 10 - 40 - 5; -// if (MidnightControlsConfig.hudSide == HudSide.LEFT) { -// jumpButtonX = scaledWidth - 20 - 20; -// swapHandsX = jumpButtonX - 5 - 40; -// sneakButtonX = 10 + 20 + 5; -// } else { -// jumpButtonX = 20; -// swapHandsX = jumpButtonX + 5 + 40; -// sneakButtonX = scaledWidth - 10 - 40 - 5; -// } -// // Swap items hand. -// this.addDrawableChild(new SpruceTexturedButtonWidget(swapHandsX, sneakButtonY, 20, 20, 0, 160, 20, WIDGETS_LOCATION, -// (btn, state) -> { -// if (state) { -// if (!this.client.player.isSpectator()) { -// this.client.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.SWAP_ITEM_WITH_OFFHAND, BlockPos.ORIGIN, Direction.DOWN)); -// } -// } -// })); -// // Drop -// this.addDrawableChild(new SpruceTexturedButtonWidget(swapHandsX, sneakButtonY + 5 + 20, 20, 20, 20, 160, 20, WIDGETS_LOCATION, -// (btn, state) -> ((KeyBindingAccessor) this.client.options.keyDrop).midnightcontrols$handlePressState(state))); -// // Jump keys -// this.addDrawableChild(this.jumpButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY, 20, 20, 0, 40, 20, WIDGETS_LOCATION, -// this::handleJump)); -// this.addDrawableChild(this.flyButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY, 20, 20, 20, 40, 20, WIDGETS_LOCATION, -// (btn, state) -> { -// if (this.flyButtonEnableTicks == 0) this.client..abilities.flying = false; -// })); -// this.addDrawableChild(this.flyUpButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY - 5 - 20, 20, 20, 40, 40, 20, WIDGETS_LOCATION, -// this::handleJump)); -// this.addDrawableChild(this.flyDownButton = new SpruceTexturedButtonWidget(jumpButtonX, sneakButtonY + 20 + 5, 20, 20, 60, 40, 20, WIDGETS_LOCATION, -// (btn, state) -> ((KeyBindingAccessor) this.client.options.keySneak).midnightcontrols$handlePressState(state))); -// this.updateJumpButtons(); -// // Movements keys -// this.addDrawableChild((this.startSneakButton = new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY, 20, 20, 0, 120, 20, WIDGETS_LOCATION, -// (btn, state) -> { -// if (state) { -// ((KeyBindingAccessor) this.client.options.keySneak).midnightcontrols$handlePressState(true); -// this.startSneakButton.setVisible(false); -// this.endSneakButton.setVisible(true); -// } -// }))); -// this.addDrawableChild((this.endSneakButton = new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY, 20, 20, 20, 120, 20, WIDGETS_LOCATION, -// (btn, state) -> { -// if (state) { -// ((KeyBindingAccessor) this.client.options.keySneak).midnightcontrols$handlePressState(false); -// this.endSneakButton.setVisible(false); -// this.startSneakButton.setVisible(true); -// } -// }))); -// this.endSneakButton.setVisible(false); -// this.addDrawableChild(this.forwardLeftButton = new SpruceTexturedButtonWidget(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20, 20, 20, 80, 80, 20, WIDGETS_LOCATION, -// (btn, state) -> { -// ((KeyBindingAccessor) this.client.options.keyForward).midnightcontrols$handlePressState(state); -// ((KeyBindingAccessor) this.client.options.keyLeft).midnightcontrols$handlePressState(state); -// this.updateForwardButtonsState(state); -// })); -// this.forwardLeftButton.setVisible(false); -// this.addDrawableChild(new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY - 5 - 20, 20, 20, 0, 80, 20, WIDGETS_LOCATION, -// (btn, state) -> { -// ((KeyBindingAccessor) this.client.options.keyForward).midnightcontrols$handlePressState(state); -// this.updateForwardButtonsState(state); -// this.forwardLeftButton.setVisible(true); -// this.forwardRightButton.setVisible(true); -// })); -// this.addDrawableChild(this.forwardRightButton = new SpruceTexturedButtonWidget(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20, 20, 20, 100, 80, 20, WIDGETS_LOCATION, -// (btn, state) -> { -// ((KeyBindingAccessor) this.client.options.keyForward).midnightcontrols$handlePressState(state); -// ((KeyBindingAccessor) this.client.options.keyRight).midnightcontrols$handlePressState(state); -// this.updateForwardButtonsState(state); -// })); -// this.forwardRightButton.setVisible(true); -// this.addDrawableChild(new SpruceTexturedButtonWidget(sneakButtonX + 20 + 5, sneakButtonY, 20, 20, 20, 80, 20, WIDGETS_LOCATION, -// (btn, state) -> ((KeyBindingAccessor) this.client.options.keyRight).midnightcontrols$handlePressState(state))); -// this.addDrawableChild(new SpruceTexturedButtonWidget(sneakButtonX, sneakButtonY + 20 + 5, 20, 20, 40, 80, 20, WIDGETS_LOCATION, -// (btn, state) -> ((KeyBindingAccessor) this.client.options.keyBack).midnightcontrols$handlePressState(state))); -// this.addDrawableChild(new SpruceTexturedButtonWidget(sneakButtonX - 20 - 5, sneakButtonY, 20, 20, 60, 80, 20, WIDGETS_LOCATION, -// (btn, state) -> ((KeyBindingAccessor) this.client.options.keyLeft).midnightcontrols$handlePressState(state))); -// -// this.children().forEach(button -> { -// if (button instanceof SpruceTexturedButtonWidget) { -// ((SpruceTexturedButtonWidget) button).setSilent(true); -// } -// }); -// } -// -// @Override -// public boolean mouseClicked(double mouseX, double mouseY, int button) -// { -// if (mouseY >= (double) (this.height - 22) && this.client != null && this.client.player != null) { -// int centerX = this.width / 2; -// if (mouseX >= (double) (centerX - 90) && mouseX <= (double) (centerX + 90)) { -// for (int slot = 0; slot < 9; ++slot) { -// int slotX = centerX - 90 + slot * 20 + 2; -// if (mouseX >= (double) slotX && mouseX <= (double) (slotX + 20)) { -// this.client.player.getInventory().selectedSlot = slot; -// return true; -// } -// } -// } -// } -// return super.mouseClicked(mouseX, mouseY, button); -// } -// -// @Override -// public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) -// { -// if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) { -// if (deltaY > 0.01) -// this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 2); -// else if (deltaY < 0.01) -// this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 1); -// -// if (deltaX > 0.01) -// this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 2); -// else if (deltaX < 0.01) -// this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 1); -// } -// return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); -// } + @Override + public boolean shouldPause() + { + return false; + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + super.keyPressed(keyCode,scanCode,modifiers); + //return false; + return true; + } + + private void pauseGame(boolean bl) { + if (this.client == null) + return; + boolean bl2 = this.client.isIntegratedServerRunning() && !this.client.getServer().isRemote(); + if (bl2) { + this.client.setScreen(new GameMenuScreen(!bl)); + this.client.getSoundManager().pauseAll(); + } else { + this.client.setScreen(new GameMenuScreen(true)); + } + } + + /** + * Updates the forward button ticks cooldown. + * + * @param state The button state. + * + */ + private void updateForwardButtonsState(boolean state) { + if (state) + this.forwardButtonTick = -1; + else + this.forwardButtonTick = 20; + } + + /** + * Updates the jump buttons. + */ + private void updateJumpButtons() { + if (this.client == null) + return; + if (!this.client.interactionManager.isFlyingLocked()) { + boolean oldStateFly = this.flyButton.isVisible(); + this.jumpButton.setVisible(false); + this.flyButton.setVisible(true); + this.flyUpButton.setVisible(true); + this.flyDownButton.setVisible(true); + if (oldStateFly != this.flyButton.isVisible()) { + this.flyButtonEnableTicks = 5; + this.setJump(false); + } else if (this.flyButtonEnableTicks > 0) + this.flyButtonEnableTicks--; + } else { + this.jumpButton.setVisible(true); + this.flyButton.setVisible(false); + this.flyUpButton.setVisible(false); + this.flyDownButton.setVisible(false); + } + } + + /** + * Handles the jump button. + * + * @param btn The pressed button. + */ + private void handleJump(SpruceButtonWidget btn) { + ((KeyBindingAccessor) this.client.options.jumpKey).midnightcontrols$handlePressState(btn.isActive()); + } + /** + * Handles the jump button. + * + * @param state The state. + */ + private void setJump(boolean state) { + ((KeyBindingAccessor) this.client.options.jumpKey).midnightcontrols$handlePressState(state); + } + + @Override + public void tick() { + if (this.forwardButtonTick > 0) { + this.forwardButtonTick--; + } else if (this.forwardButtonTick == 0) { + if (this.forwardLeftButton.isVisible()) + this.forwardLeftButton.setVisible(false); + if (this.forwardRightButton.isVisible()) + this.forwardRightButton.setVisible(false); + } + this.updateJumpButtons(); + } + + @Override + protected void init() { + super.init(); + int scaledWidth = this.client.getWindow().getScaledWidth(); + int scaledHeight = this.client.getWindow().getScaledHeight(); + this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2 - 20, 0, 20, 20, 0, 106, 20, new Identifier("textures/gui/widgets.png"), 256, 256, + btn -> this.client.setScreen(new ChatScreen("")), Text.empty())); + this.addDrawableChild(new TexturedButtonWidget(scaledWidth / 2, 0, 20, 20, 0, 0, 20, WIDGETS_LOCATION, 256, 256, + btn -> this.pauseGame(false))); + // Inventory buttons. + int inventoryButtonX = scaledWidth / 2; + int inventoryButtonY = scaledHeight - 16 - 5; + if (this.client.options.getMainArm().getValue() == Arm.LEFT) { + inventoryButtonX = inventoryButtonX - 91 - 24; + } else { + inventoryButtonX = inventoryButtonX + 91 + 4; + } + this.addDrawableChild(new TexturedButtonWidget(inventoryButtonX, inventoryButtonY, 20, 20, 20, 0, 20, WIDGETS_LOCATION, 256, 256, + btn -> { + if (this.client.interactionManager.hasRidingInventory()) { + this.client.player.openRidingInventory(); + } else { + this.client.getTutorialManager().onInventoryOpened(); + this.client.setScreen(new InventoryScreen(this.client.player)); + } + })); + int jumpButtonX, swapHandsX, sneakButtonX; + int sneakButtonY = scaledHeight - 10 - 40 - 5; + if (MidnightControlsConfig.hudSide == HudSide.LEFT) { + jumpButtonX = scaledWidth - 20 - 20; + swapHandsX = jumpButtonX - 5 - 40; + sneakButtonX = 10 + 20 + 5; + } else { + jumpButtonX = 20; + swapHandsX = jumpButtonX + 5 + 40; + sneakButtonX = scaledWidth - 10 - 40 - 5; + } + // Swap items hand. + this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY), 20, 20, Text.empty(), + button -> { + if (button.isActive()) { + if (!this.client.player.isSpectator()) { + this.client.getNetworkHandler().sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.SWAP_ITEM_WITH_OFFHAND, BlockPos.ORIGIN, Direction.DOWN)); + } + } + },0, 160, 20, WIDGETS_LOCATION)); + // Drop + this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY + 5 + 20), 20, 20, Text.empty(), btn -> + ((KeyBindingAccessor) this.client.options.dropKey).midnightcontrols$handlePressState(btn.isActive()), 0, 160, 20, WIDGETS_LOCATION)); + // Jump keys + this.addDrawableChild(this.jumpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(), this::handleJump, 0, 40, 20, WIDGETS_LOCATION)); + this.addDrawableChild(this.flyButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(),btn -> { + if (this.flyButtonEnableTicks == 0) this.client.player.getAbilities().flying = false; + }, 20, 40, 20, WIDGETS_LOCATION) + ); + this.addDrawableChild(this.flyUpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY - 5 - 20), 20, 20,Text.empty(), + this::handleJump, 40, 40, 20, WIDGETS_LOCATION + )); + this.addDrawableChild(this.flyDownButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY + 20 + 5), 20, 20, Text.empty(), + btn -> ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(btn.isActive()), 60, 40, 20, WIDGETS_LOCATION + )); + this.updateJumpButtons(); + // Movements keys + this.addDrawableChild((this.startSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.empty(), btn -> { + if (btn.isActive()) { + ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(true); + this.startSneakButton.setVisible(false); + this.endSneakButton.setVisible(true); + } + }, 0, 120, 20, WIDGETS_LOCATION)) + ); + this.addDrawableChild((this.endSneakButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY), 20, 20, Text.empty(), btn -> { + if (btn.isActive()) { + ((KeyBindingAccessor) this.client.options.sneakKey).midnightcontrols$handlePressState(false); + this.endSneakButton.setVisible(false); + this.startSneakButton.setVisible(true); + } + }, 20, 120, 20, WIDGETS_LOCATION))); + this.endSneakButton.setVisible(false); + this.addDrawableChild(this.forwardLeftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> { + ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive()); + ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()); + this.updateForwardButtonsState(btn.isActive()); + }, 80, 80, 20, WIDGETS_LOCATION + )); + this.forwardLeftButton.setVisible(false); + this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> { + ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive()); + this.updateForwardButtonsState(btn.isActive()); + this.forwardLeftButton.setVisible(true); + this.forwardRightButton.setVisible(true); + }, 0, 80, 20, WIDGETS_LOCATION + )); + this.addDrawableChild(this.forwardRightButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY - 5 - 20), 20, 20, Text.empty(), btn -> { + ((KeyBindingAccessor) this.client.options.forwardKey).midnightcontrols$handlePressState(btn.isActive()); + ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive()); + this.updateForwardButtonsState(btn.isActive()); + }, 100, 80, 20, WIDGETS_LOCATION + )); + this.forwardRightButton.setVisible(true); + this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX + 20 + 5, sneakButtonY), 20, 20, Text.empty(), + btn -> ((KeyBindingAccessor) this.client.options.rightKey).midnightcontrols$handlePressState(btn.isActive()), 20, 80, 20, WIDGETS_LOCATION + )); + this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX, sneakButtonY + 20 + 5), 20, 20, Text.empty(), + btn -> ((KeyBindingAccessor) this.client.options.backKey).midnightcontrols$handlePressState(btn.isActive()), 40, 80, 20, WIDGETS_LOCATION + )); + this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY), 20, 20, Text.empty(), + btn -> ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()), 60, 80, 20, WIDGETS_LOCATION + )); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (mouseY >= (double) (this.height - 22) && this.client != null && this.client.player != null) { + int centerX = this.width / 2; + if (mouseX >= (double) (centerX - 90) && mouseX <= (double) (centerX + 90)) { + for (int slot = 0; slot < 9; ++slot) { + int slotX = centerX - 90 + slot * 20 + 2; + if (mouseX >= (double) slotX && mouseX <= (double) (slotX + 20)) { + this.client.player.getInventory().selectedSlot = slot; + return true; + } + } + } + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) { + if (deltaY > 0.01) + this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 2); + else if (deltaY < 0.01) + this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs(deltaY / 5.0), 1); + + if (deltaX > 0.01) + this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 2); + else if (deltaX < 0.01) + this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_X, (float) Math.abs(deltaX / 5.0), 1); + } + return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + } } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java index ce2c823..aae9340 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java @@ -17,6 +17,7 @@ import dev.lambdaurora.spruceui.Position; import dev.lambdaurora.spruceui.SpruceTexts; import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; +import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen; import net.minecraft.client.gui.screen.option.ControlsOptionsScreen; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; @@ -49,6 +50,7 @@ public class ControllerControlsWidget extends SpruceContainerWidget { Text.translatable("midnightcontrols.menu.keyboard_controls"), btn -> this.client.setScreen(new ControlsOptionsScreen(null, this.client.options)))); this.bindingsListWidget = new ControlsListWidget(Position.of(this, 0, 43), this.width, this.height - 43 - 35, this); + this.bindingsListWidget.setBackground(new MidnightControlsSettingsScreen.MidnightControlsBackground(130)); this.addChild(this.bindingsListWidget); this.addChild(this.resetButton = new SpruceButtonWidget(Position.of(this, this.width / 2 - 155, this.height - 29), 150, 20, SpruceTexts.CONTROLS_RESET_ALL, diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/SilentTexturedButtonWidget.java b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/SilentTexturedButtonWidget.java new file mode 100644 index 0000000..7861ac5 --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/SilentTexturedButtonWidget.java @@ -0,0 +1,26 @@ +package eu.midnightdust.midnightcontrols.client.gui.widget; + +import dev.lambdaurora.spruceui.Position; +import dev.lambdaurora.spruceui.widget.SpruceTexturedButtonWidget; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class SilentTexturedButtonWidget extends SpruceTexturedButtonWidget { + public SilentTexturedButtonWidget(Position position, int width, int height, Text message, PressAction action, int u, int v, int hoveredVOffset, Identifier texture) { + super(position, width, height, message, action, u, v, hoveredVOffset, texture); + } + + public SilentTexturedButtonWidget(Position position, int width, int height, Text message, boolean showMessage, PressAction action, int u, int v, int hoveredVOffset, Identifier texture) { + super(position, width, height, message, showMessage, action, u, v, hoveredVOffset, texture); + } + + public SilentTexturedButtonWidget(Position position, int width, int height, Text message, PressAction action, int u, int v, int hoveredVOffset, Identifier texture, int textureWidth, int textureHeight) { + super(position, width, height, message, action, u, v, hoveredVOffset, texture, textureWidth, textureHeight); + } + + public SilentTexturedButtonWidget(Position position, int width, int height, Text message, boolean showMessage, PressAction action, int u, int v, int hoveredVOffset, Identifier texture, int textureWidth, int textureHeight) { + super(position, width, height, message, showMessage, action, u, v, hoveredVOffset, texture, textureWidth, textureHeight); + } + @Override + public void playDownSound() {} +} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ClientPlayerEntityMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ClientPlayerEntityMixin.java index 8872318..c9b8d06 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ClientPlayerEntityMixin.java @@ -10,6 +10,7 @@ package eu.midnightdust.midnightcontrols.client.mixin; import com.mojang.authlib.GameProfile; +import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.controller.MovementHandler; @@ -27,6 +28,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; /** @@ -53,10 +55,13 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity @Shadow protected abstract boolean isCamera(); + @Shadow protected int ticksLeftToDoubleTapSprint; + @Inject(method = "move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;move(Lnet/minecraft/entity/MovementType;Lnet/minecraft/util/math/Vec3d;)V")) public void onMove(MovementType type, Vec3d movement, CallbackInfo ci) { - var mod = MidnightControlsClient.get(); + if (!MidnightControlsConfig.doubleTapToSprint) ticksLeftToDoubleTapSprint = 0; + if (!MidnightControls.isExtrasLoaded) return; if (type == MovementType.SELF) { if (this.getAbilities().flying && (!MidnightControlsConfig.flyDrifting || !MidnightControlsConfig.verticalFlyDrifting)) { if (!this.hasMovementInput()) { @@ -79,7 +84,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity @Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isCamera()Z")) public void onTickMovement(CallbackInfo ci) { if (this.getAbilities().flying && this.isCamera()) { - if (MidnightControlsConfig.verticalFlyDrifting) + if (MidnightControlsConfig.verticalFlyDrifting || !MidnightControls.isExtrasLoaded) return; int moving = 0; if (this.input.sneaking) { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CreativeInventoryScreenAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CreativeInventoryScreenAccessor.java index e820aac..14bad62 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CreativeInventoryScreenAccessor.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CreativeInventoryScreenAccessor.java @@ -29,7 +29,9 @@ public interface CreativeInventoryScreenAccessor { * @return the selected tab index */ @Accessor("selectedTab") - int getSelectedTab(); + static int getSelectedTab() { + return 0; + } /** * Sets the selected tab. diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingMixin.java index 6d48cf2..0655e90 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingMixin.java @@ -28,7 +28,7 @@ public class KeyBindingMixin implements KeyBindingAccessor { if (!this.pressed) this.pressed = true; ++this.timesPressed; - return oldPressed != this.pressed; + return !oldPressed; } @Override diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingRegistryImplAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingRegistryImplAccessor.java new file mode 100644 index 0000000..d93e41d --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/KeyBindingRegistryImplAccessor.java @@ -0,0 +1,17 @@ +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 getModdedKeyBindings() { + return null; + } +} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java index 98796f2..b541eb4 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java @@ -54,10 +54,6 @@ public abstract class MinecraftClientMixin { @Nullable public ClientPlayerInteractionManager interactionManager; - @Shadow - @Nullable - public ClientWorld world; - @Shadow @Final public GameRenderer gameRenderer; @@ -104,18 +100,26 @@ public abstract class MinecraftClientMixin { this.midnightcontrols$lastTargetSide = side; } // Removed front placing sprinting as way too cheaty. - /*else if (this.player.isSprinting()) { - hitResult = midnightcontrolsClient.get().reacharound.getLastReacharoundResult(); + else if (this.player.isSprinting()) { + hitResult = MidnightControlsClient.get().reacharound.getLastReacharoundResult(); if (hitResult != null) { if (cooldown > 0) this.itemUseCooldown = 0; } - }*/ + } this.midnightcontrols$lastPos = this.player.getPos(); } - + // Applied three times for smooth camera turning even on low FPS + @Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Recorder;startTick()V", shift = At.Shift.AFTER)) + private void onPreRender(CallbackInfo ci) { + MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this)); + } @Inject(method = "render", at = @At("HEAD")) - private void onRender(boolean fullRender, CallbackInfo ci) { + private void onRender(CallbackInfo ci) { + MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this)); + } + @Inject(method = "render", at = @At("TAIL")) + private void onPostRender(CallbackInfo ci) { MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this)); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/MidnightRing.java b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/MidnightRing.java index df5e966..48b4057 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/MidnightRing.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/MidnightRing.java @@ -51,16 +51,16 @@ public final class MidnightRing { * Loads the ring from configuration. */ public void load() { -// List configPages = MidnightControlsConfig.ringPages; -// if (configPages != null) { -// this.pages.clear(); -// for (var configPage : configPages) { -// RingPage.parseRingPage(configPage).ifPresent(this.pages::add); -// } -// } -// if (this.pages.isEmpty()) { -// this.pages.add(RingPage.DEFAULT); -// } + List configPages = null; + if (configPages != null) { + this.pages.clear(); + for (var configPage : configPages) { + RingPage.parseRingPage(configPage).ifPresent(this.pages::add); + } + } + if (this.pages.isEmpty()) { + this.pages.add(RingPage.DEFAULT); + } } public @NotNull RingPage getCurrentPage() { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingPage.java b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingPage.java index 874b113..91ddba8 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingPage.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/ring/RingPage.java @@ -10,11 +10,15 @@ package eu.midnightdust.midnightcontrols.client.ring; import com.electronwill.nightconfig.core.Config; +import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.util.math.MatrixStack; import org.jetbrains.annotations.NotNull; +import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -36,6 +40,11 @@ public class RingPage extends DrawableHelper { for (int i = 0; i < 8; i++) { this.actions[i] = null; } + this.actions[0] = new DummyRingAction(null); + this.actions[1] = new KeyBindingRingAction(null, MidnightControlsClient.BINDING_LOOK_UP); + this.actions[2] = new KeyBindingRingAction(null, MidnightControlsClient.BINDING_LOOK_LEFT); + this.actions[3] = new KeyBindingRingAction(null, MidnightControlsClient.BINDING_LOOK_RIGHT); + this.actions[4] = new KeyBindingRingAction(null, MidnightControlsClient.BINDING_LOOK_DOWN); } /** @@ -83,6 +92,52 @@ public class RingPage extends DrawableHelper { private static boolean isHovered(int x, int y, int mouseX, int mouseY) { return mouseX >= x && mouseY >= y && mouseX <= x + MidnightRing.ELEMENT_SIZE && mouseY <= y + MidnightRing.ELEMENT_SIZE; } + /** + * Renders the ring page. + * + * @param width the screen width + * @param height the screen height + * @param mouseX the mouse X-coordinate + * @param mouseY the mouse Y-coordinate + */ + public boolean onClick(int width, int height, int mouseX, int mouseY) { + int centerX = width / 2; + int centerY = height / 2; + + int offset = MidnightRing.ELEMENT_SIZE + (MidnightRing.ELEMENT_SIZE / 2) + 5; + + int y = centerY - offset; + int x = centerX - offset; + for (int i = 0; i < 3; i++) { + var ringAction = this.actions[i]; + if (ringAction != null && isHovered(x,y,mouseX,mouseY)) { + ringAction.activate(RingButtonMode.PRESS); + return true; + } + x += 55; + } + y += 55; + x = centerX - offset; + for (int i = 3; i < 5; i++) { + var ringAction = this.actions[i]; + if (ringAction != null && isHovered(x,y,mouseX,mouseY)) { + ringAction.activate(RingButtonMode.PRESS); + return true; + } + x += 55 * 2; + } + y += 55; + x = centerX - offset; + for (int i = 5; i < 8; i++) { + var ringAction = this.actions[i]; + if (ringAction != null && isHovered(x,y,mouseX,mouseY)) { + ringAction.activate(RingButtonMode.PRESS); + return true; + } + x += 55; + } + return false; + } /** * Tries to parse a ring page configuration. diff --git a/src/main/resources/assets/midnightcontrols/lang/de_de.json b/src/main/resources/assets/midnightcontrols/lang/de_de.json index 0ffa312..9a71fae 100644 --- a/src/main/resources/assets/midnightcontrols/lang/de_de.json +++ b/src/main/resources/assets/midnightcontrols/lang/de_de.json @@ -92,6 +92,7 @@ "midnightcontrols.menu.controller2": "Zweiter Controller", "midnightcontrols.menu.controller_type": "Controller-Typ", "midnightcontrols.menu.controls_mode": "Modus", + "midnightcontrols.menu.double_tap_to_sprint": "Doppel-Tipp zum Sprinten", "midnightcontrols.menu.fast_block_placing": "Schnelles Bauen", "midnightcontrols.menu.fly_drifting": "Flug-Drifting", "midnightcontrols.menu.fly_drifting_vertical": "Vertikales Flug-Drifting", diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index 7e86297..6415da8 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -96,6 +96,7 @@ "midnightcontrols.menu.controller2": "Second Controller", "midnightcontrols.menu.controller_type": "Controller Type", "midnightcontrols.menu.controls_mode": "Mode", + "midnightcontrols.menu.double_tap_to_sprint": "Double-Tap to Sprint", "midnightcontrols.menu.fast_block_placing": "Fast Block Placing", "midnightcontrols.menu.fly_drifting": "Fly Drifting", "midnightcontrols.menu.fly_drifting_vertical": "Vertical Fly Drifting", diff --git a/src/main/resources/midnightcontrols.mixins.json b/src/main/resources/midnightcontrols.mixins.json index 0faa7c4..bec043d 100644 --- a/src/main/resources/midnightcontrols.mixins.json +++ b/src/main/resources/midnightcontrols.mixins.json @@ -16,7 +16,8 @@ "MinecraftClientMixin", "MouseMixin", "RecipeBookWidgetAccessor", - "WorldRendererMixin" + "WorldRendererMixin", + "KeyBindingRegistryImplAccessor" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/midnightcontrols_compat.mixins.json b/src/main/resources/midnightcontrols_compat.mixins.json index 040f2dc..89110a5 100644 --- a/src/main/resources/midnightcontrols_compat.mixins.json +++ b/src/main/resources/midnightcontrols_compat.mixins.json @@ -4,6 +4,7 @@ "plugin": "eu.midnightdust.midnightcontrols.client.compat.MidnightControlsMixinPlugin", "compatibilityLevel": "JAVA_16", "client": [ + "SodiumOptionsGUIAccessor" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/resourcepacks/bedrock/pack.mcmeta b/src/main/resources/resourcepacks/bedrock/pack.mcmeta index 77bcd3d..9915cb1 100644 --- a/src/main/resources/resourcepacks/bedrock/pack.mcmeta +++ b/src/main/resources/resourcepacks/bedrock/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { - "pack_format": 8, + "pack_format": 9, "description": "Makes the controller buttons look like from Bedrock Edition" } } From b3f7350de96301bc26d4448f26ba08d9c9532411 Mon Sep 17 00:00:00 2001 From: Motschen Date: Sat, 25 Jun 2022 22:21:51 +0200 Subject: [PATCH 03/21] MidnightControls 1.2.1 - Fix log spam --- build.gradle | 2 +- gradle.properties | 2 +- .../client/MidnightControlsClient.java | 10 +++++----- .../midnightcontrols/client/compat/SodiumCompat.java | 5 +++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 9a0fc90..3c9dcb2 100644 --- a/build.gradle +++ b/build.gradle @@ -110,7 +110,7 @@ dependencies { // modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}" modImplementation "org.quiltmc:quilt-json5:1.0.0" - modImplementation "maven.modrinth:sodium:${project.sodium_version}" + modApi "maven.modrinth:sodium:${project.sodium_version}" //modImplementation("maven.modrinth:emi:${project.emi_version}") modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}" modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}" diff --git a/gradle.properties b/gradle.properties index c01b66f..47f5d74 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.0 +mod_version = 1.2.1 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 17713b7..1da7e1e 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -64,8 +64,8 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_2, "key.categories.movement"); public static final KeyBinding BINDING_LOOK_LEFT = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "look_left"), InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_4, "key.categories.movement"); - public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "ring"), - InputUtil.Type.MOUSE, GLFW.GLFW_MOUSE_BUTTON_5, "key.categories.misc"); + public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "ring"), + InputUtil.Type.MOUSE, 0, "key.categories.misc"); public static final Identifier CONTROLLER_BUTTONS = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_buttons.png"); public static final Identifier CONTROLLER_EXPANDED = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_expanded.png"); public static final Identifier CONTROLLER_AXIS = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_axis.png"); @@ -188,9 +188,9 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput)) this.input.tickController(client); - if (BINDING_RING.wasPressed()) { - client.setScreen(new RingScreen()); - } +// if (BINDING_RING.wasPressed()) { +// client.setScreen(new RingScreen()); +// } } public void onRender(MinecraftClient client) { this.input.onRender(client.getTickDelta(), client); 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 1acf08c..c082ed4 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java @@ -2,6 +2,7 @@ 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; @@ -24,7 +25,7 @@ public class SodiumCompat { InputManager.INPUT_MANAGER.targetMouseX = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterX()); InputManager.INPUT_MANAGER.targetMouseY = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterY()); MidnightControlsClient.get().input.actionGuiCooldown = 5; - MidnightControls.get().log(i+" "+accessor.getControls().size()+" | " + dimensions.getCenterX() + " " + dimensions.getCenterY()); + if (MidnightControlsConfig.debug) MidnightControls.get().log(i+" "+accessor.getControls().size()+" | " + dimensions.getCenterX() + " " + dimensions.getCenterY()); } } public static void handleTabs(Screen screen, boolean direction) { @@ -33,7 +34,7 @@ public class SodiumCompat { final int max = accessor.getPages().size()-1; int i = accessor.getPages().indexOf(accessor.getCurrentPage()); i = (direction ? ((max > i) ? ++i : 0) : (i > 0 ? --i : max)); - MidnightControls.get().log(""+i); + if (MidnightControlsConfig.debug) MidnightControls.get().log(""+i); optionsGUI.setPage(accessor.getPages().get(i)); } } From d2e21f87235b2b9a0ba24e32243ff258cf71e03e Mon Sep 17 00:00:00 2001 From: Motschen Date: Mon, 27 Jun 2022 14:10:03 +0200 Subject: [PATCH 04/21] MidnightControls 1.2.2 - Important Bugfix Fix #45 Fix #44 --- gradle.properties | 2 +- .../client/MidnightControlsClient.java | 2 +- .../client/MidnightControlsConfig.java | 60 +++++++++---------- .../client/gui/MidnightControlsHud.java | 1 + 4 files changed, 33 insertions(+), 32 deletions(-) diff --git a/gradle.properties b/gradle.properties index 47f5d74..89510ac 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.1 +mod_version = 1.2.2 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 1da7e1e..2a5c56b 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -65,7 +65,7 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo public static final KeyBinding BINDING_LOOK_LEFT = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "look_left"), InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_4, "key.categories.movement"); public static final KeyBinding BINDING_RING = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "ring"), - InputUtil.Type.MOUSE, 0, "key.categories.misc"); + InputUtil.Type.KEYSYM, InputUtil.UNKNOWN_KEY.getCode(), "key.categories.misc"); public static final Identifier CONTROLLER_BUTTONS = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_buttons.png"); public static final Identifier CONTROLLER_EXPANDED = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_expanded.png"); public static final Identifier CONTROLLER_AXIS = new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/controller_axis.png"); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index c457a4b..e67e787 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -31,40 +31,40 @@ import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y; */ public class MidnightControlsConfig extends MidnightConfig { // General - @Entry public static ControlsMode controlsMode = ControlsMode.DEFAULT; - @Entry public static boolean autoSwitchMode = true; - @Entry public static boolean debug = false; + @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; // HUD - @Entry public static boolean hudEnable = true; - @Entry public static HudSide hudSide = HudSide.LEFT; + @Entry(name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true; + @Entry(name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT; // Gameplay - @Entry public static boolean analogMovement = true; - @Entry public static boolean doubleTapToSprint = true; - @Entry public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. - @Entry 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 public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. - @Entry public static boolean horizontalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. - @Entry public static boolean verticalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers. - @Entry public static boolean shouldRenderReacharoundOutline = true; - @Entry public static int[] reacharoundOutlineColor = new int[]{255, 255, 255, 102}; - @Entry public static double rightDeadZone = 0.25; - @Entry public static double leftDeadZone = 0.25; - @Entry public static boolean invertRightYAxis = false; - @Entry public static boolean invertRightXAxis = false; - @Entry public static double DEFAULT_MAX_VALUE = 1; - @Entry public static double rotationSpeed = 40.0; - @Entry public static double mouseSpeed = 25.0; - @Entry public static boolean unfocusedInput = false; - @Entry public static boolean virtualMouse = false; - @Entry public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT; - @Entry public static Object controllerID = 0; - @Entry public static Object secondControllerID = -1; - @Entry public static ControllerType controllerType = ControllerType.DEFAULT; - @Entry 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 public static Map BINDINGS = Map.of(); + @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.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") public static int[] reacharoundOutlineColor = new int[]{255, 255, 255, 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; + public static double DEFAULT_MAX_VALUE = 1; + @Entry(name = "midnightcontrols.menu.right_dead_zone") public static double rotationSpeed = 40.0; + @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; + @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 = 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(); private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?"); - @Entry 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[]{DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE}; /** * Loads the configuration 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 127bc8f..36067ae 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsHud.java @@ -83,6 +83,7 @@ public class MidnightControlsHud extends Hud { */ @Override public void render(MatrixStack matrices, float tickDelta) { + if (this.client == null) return; if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && this.client.currentScreen == null) { int y = bottom(2); if (scale != 1f) matrices.scale(scale,scale,scale); From 19ed068da9467f9c8ef50893aab0dfcf944e4e81 Mon Sep 17 00:00:00 2001 From: gyular Date: Tue, 28 Jun 2022 01:53:56 +0900 Subject: [PATCH 05/21] Added Korean Translation --- .../assets/midnightcontrols/lang/ko_kr.json | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/main/resources/assets/midnightcontrols/lang/ko_kr.json diff --git a/src/main/resources/assets/midnightcontrols/lang/ko_kr.json b/src/main/resources/assets/midnightcontrols/lang/ko_kr.json new file mode 100644 index 0000000..ae7a5e3 --- /dev/null +++ b/src/main/resources/assets/midnightcontrols/lang/ko_kr.json @@ -0,0 +1,158 @@ +{ + "midnightcontrols.midnightconfig.title": "MidnightControls 고급 설정", + "key.midnightcontrols.look_down": "아래쪽 보기", + "key.midnightcontrols.look_left": "왼쪽 보기", + "key.midnightcontrols.look_right": "오른쪽 보기", + "key.midnightcontrols.look_up": "위쪽 보기", + "key.midnightcontrols.ring": "컨트롤 링 표시", + "midnightcontrols.action.attack": "공격", + "midnightcontrols.action.back": "뒤로", + "midnightcontrols.action.chat": "채팅 열기", + "midnightcontrols.action.drop_item": "아이템 버리기", + "midnightcontrols.action.exit": "종료", + "midnightcontrols.action.forward": "앞으로", + "midnightcontrols.action.hit": "때리기", + "midnightcontrols.action.hotbar_left": "단축 바 왼쪽", + "midnightcontrols.action.hotbar_right": "단축 바 오른쪽", + "midnightcontrols.action.inventory": "보관함", + "midnightcontrols.action.jump": "점프", + "midnightcontrols.action.left": "왼쪽", + "midnightcontrols.action.pause_game": "게임 일시 중지", + "midnightcontrols.action.pick_block": "블록 집기", + "midnightcontrols.action.pickup": "집기", + "midnightcontrols.action.pickup_all": "모두 집기", + "midnightcontrols.action.place": "놓기", + "midnightcontrols.action.player_list": "플레이어 목록", + "midnightcontrols.action.quick_move": "빠른 이동", + "midnightcontrols.action.right": "오른쪽", + "midnightcontrols.action.screenshot": "스크린샷 찍기", + "midnightcontrols.action.sneak": "은신", + "midnightcontrols.action.sprint": "달리기", + "midnightcontrols.action.swap_hands": "손 전환", + "midnightcontrols.action.toggle_perspective": "시점 토글", + "midnightcontrols.action.toggle_smooth_camera": "시네마틱 카메라 토글", + "midnightcontrols.action.use": "사용", + "midnightcontrols.action.zoom": "확대/축소", + "midnightcontrols.action.zoom_in": "확대", + "midnightcontrols.action.zoom_out": "축소", + "midnightcontrols.action.zoom_reset": "확대/축소 초기화", + "midnightcontrols.action.key.emotecraft.fastchoose": "이모트 빠른 선택", + "midnightcontrols.action.key.emotecraft.stop": "이모트 중지", + "midnightcontrols.button.a": "A", + "midnightcontrols.button.b": "B", + "midnightcontrols.button.x": "X", + "midnightcontrols.button.y": "Y", + "midnightcontrols.button.left_bumper": "왼쪽 범퍼", + "midnightcontrols.button.right_bumper": "오른쪽 범퍼", + "midnightcontrols.button.back": "뒤로", + "midnightcontrols.button.start": "시작", + "midnightcontrols.button.guide": "가이드", + "midnightcontrols.button.left_thumb": "왼쪽 엄지", + "midnightcontrols.button.right_thumb": "오른쪽 엄지", + "midnightcontrols.button.dpad_up": "DPAD 위", + "midnightcontrols.button.dpad_right": "DPAD 오른쪽", + "midnightcontrols.button.dpad_down": "DPAD 아래", + "midnightcontrols.button.dpad_left": "DPAD 왼쪽", + "midnightcontrols.button.l4": "L4", + "midnightcontrols.button.l5": "L5", + "midnightcontrols.button.r4": "R4", + "midnightcontrols.button.r5": "L5", + "midnightcontrols.axis.left_x+": "왼쪽 X+", + "midnightcontrols.axis.left_y+": "왼쪽 Y+", + "midnightcontrols.axis.right_x+": "오른쪽 X+", + "midnightcontrols.axis.right_y+": "오른쪽 Y+", + "midnightcontrols.axis.left_trigger": "왼쪽 트리거", + "midnightcontrols.axis.right_trigger": "오른쪽 트리거", + "midnightcontrols.axis.left_x-": "왼쪽 X-", + "midnightcontrols.axis.left_y-": "왼쪽 Y-", + "midnightcontrols.axis.right_x-": "오른쪽 X-", + "midnightcontrols.axis.right_y-": "오른쪽 Y-", + "midnightcontrols.button.unknown": "알 수 없음 (%d)", + "midnightcontrols.controller.connected": "컨트롤러 %d 연결됨.", + "midnightcontrols.controller.disconnected": "컨트롤러 %d 연결 끊김.", + "midnightcontrols.controller.mappings.1": "컨트롤러 매핑을 설정하려면, %s을 사용하세요", + "midnightcontrols.controller.mappings.3": "그리고 매핑 파일 편집기에 매핑을 붙여 넣으세요.", + "midnightcontrols.controller.mappings.error": "매핑을 불러오던 중 오류.", + "midnightcontrols.controller.mappings.error.write": "파일에 매핑 작성 중 오류.", + "midnightcontrols.controller.mappings.updated": "매핑 업데이트됨!", + "midnightcontrols.controller_type.default": "기본", + "midnightcontrols.controller_type.dualshock": "듀얼쇼크", + "midnightcontrols.controller_type.switch": "스위치", + "midnightcontrols.controller_type.xbox": "엑스박스", + "midnightcontrols.controller_type.steam": "스팀", + "midnightcontrols.controller_type.ouya": "우야", + "midnightcontrols.controls_mode.default": "키보드/마우스", + "midnightcontrols.controls_mode.controller": "컨트롤러", + "midnightcontrols.controls_mode.touchscreen": "터치스크린", + "midnightcontrols.hud_side.left": "왼쪽", + "midnightcontrols.hud_side.right": "오른쪽", + "midnightcontrols.menu.analog_movement": "아날로그 움직임", + "midnightcontrols.menu.auto_switch_mode": "자동 전환 모드", + "midnightcontrols.menu.controller": "컨트롤러", + "midnightcontrols.menu.controller2": "보조 컨트롤러", + "midnightcontrols.menu.controller_type": "컨트롤러 종류", + "midnightcontrols.menu.controls_mode": "모드", + "midnightcontrols.menu.fast_block_placing": "빠른 블록 배치", + "midnightcontrols.menu.fly_drifting": "비행 관성", + "midnightcontrols.menu.fly_drifting_vertical": "비행 수직 관성", + "midnightcontrols.menu.hud_enable": "HUD 사용", + "midnightcontrols.menu.hud_side": "HUD 측면", + "midnightcontrols.menu.invert_right_x_axis": "오른쪽 X 반전", + "midnightcontrols.menu.invert_right_y_axis": "오른쪽 Y 반전", + "midnightcontrols.menu.keyboard_controls": "키보드 컨트롤...", + "midnightcontrols.menu.left_dead_zone": "왼쪽 데드 존", + "midnightcontrols.menu.mappings.open_input_str": "매핑 파일 편집기 열기", + "midnightcontrols.menu.max_left_x_value": "왼쪽 X 축 최댓값", + "midnightcontrols.menu.max_left_y_value": "왼쪽 Y 축 최댓값", + "midnightcontrols.menu.max_right_x_value": "오른쪽 X 축 최댓값", + "midnightcontrols.menu.max_right_y_value": "오른쪽 Y 축 최댓값", + "midnightcontrols.menu.mouse_speed": "마우스 속도", + "midnightcontrols.menu.reacharound.horizontal": "블록 전면 배치", + "midnightcontrols.menu.reacharound.vertical": "블록 수직 배치", + "midnightcontrols.menu.reload_controller_mappings": "컨트롤러 매핑 다시 불러오기", + "midnightcontrols.menu.right_dead_zone": "오른쪽 데드 존", + "midnightcontrols.menu.rotation_speed": "회전 속도", + "midnightcontrols.menu.separator.controller": "컨트롤러", + "midnightcontrols.menu.separator.general": "일반", + "midnightcontrols.menu.title": "MidnightControls - 설정", + "midnightcontrols.menu.title.controller": "컨트롤러 옵션", + "midnightcontrols.menu.title.controller_controls": "컨트롤러 제어", + "midnightcontrols.menu.title.gameplay": "게임플레이 옵션", + "midnightcontrols.menu.title.general": "일반 옵션", + "midnightcontrols.menu.title.hud": "HUD 옵션", + "midnightcontrols.menu.title.mappings.string": "매핑 파일 편집기", + "midnightcontrols.menu.title.visual": "외형 옵션", + "midnightcontrols.menu.unfocused_input": "언포커스 인풋", + "midnightcontrols.menu.virtual_mouse": "가상 마우스", + "midnightcontrols.menu.virtual_mouse.skin": "가상 마우스 스킨", + "midnightcontrols.narrator.unbound": "%s 해제됨", + "midnightcontrols.not_bound": "바인딩되지 않음", + "midnightcontrols.tooltip.analog_movement": "가능한 경우 아날로그 움직임을 사용합니다.", + "midnightcontrols.tooltip.auto_switch_mode": "컨트롤러가 연결되면 자동으로 컨트롤 모드가 컨트롤러로 전환됩니다.", + "midnightcontrols.tooltip.controller2": "보조 컨트롤러를 사용하려면 Joy-Cons 지원을 허용하세요.", + "midnightcontrols.tooltip.controller_type": "올바른 버튼을 표시할 컨트롤러 종류입니다.", + "midnightcontrols.tooltip.controls_mode": "컨트롤 모드.", + "midnightcontrols.tooltip.fast_block_placing": "크리에이티브 모드에서 비행하는 동안 사용자 속도에 따른 빠른 블록 배치를 사용합니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다.", + "midnightcontrols.tooltip.fly_drifting": "비행하는 동안 바닐라처럼 관성을 적용합니다.", + "midnightcontrols.tooltip.fly_drifting_vertical": "비행하는 동안 바닐라처럼 수직 관성을 적용합니다.", + "midnightcontrols.tooltip.hud_enable": "화면 컨트롤러 버튼 표시기 토글", + "midnightcontrols.tooltip.hud_side": "HUD 위치.", + "midnightcontrols.tooltip.left_dead_zone": "컨트롤러 왼쪽 아날로그 스틱 데드 존.", + "midnightcontrols.tooltip.max_left_x_value": "모드가 인식하는 왼쪽 X 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.", + "midnightcontrols.tooltip.max_left_y_value": "모드가 인식하는 왼쪽 Y 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.", + "midnightcontrols.tooltip.max_right_x_value": "모드가 인식하는 오른쪽 X 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.", + "midnightcontrols.tooltip.max_right_y_value": "모드가 인식하는 오른쪽 Y 축 최댓값을 변경합니다. 사용자의 축이 전체 범위를 사용하지 않고 느리게 보일 경우 유용합니다.", + "midnightcontrols.tooltip.mouse_speed": "컨트롤러의 에뮬레이트된 마우스 속도.", + "midnightcontrols.tooltip.reacharound.horizontal": "블록 전면 배치를 사용합니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다§r.", + "midnightcontrols.tooltip.reacharound.vertical": "블록 수직 배치를 사용합니다. 블록 아래에 다른 블록을 배치할 수 있습니다. §c일부 서버에선 치팅 행위로 취급될 수 있습니다§r.", + "midnightcontrols.tooltip.reload_controller_mappings": "컨트롤러 매핑 파일을 다시 불러옵니다.", + "midnightcontrols.tooltip.right_dead_zone": "컨트롤러 오른쪽 아날로그 스틱 데드 존", + "midnightcontrols.tooltip.rotation_speed": "컨트롤러 모드에서 적용되는 카메라 회전 속도.", + "midnightcontrols.tooltip.unfocused_input": "창이 활성화된 상태가 아니여도 컨트롤러 입력 허용.", + "midnightcontrols.tooltip.virtual_mouse": "분할 화면에선 도움 되는 가상 마우스를 사용합니다.", + "midnightcontrols.virtual_mouse.skin.default_light": "기본 라이트", + "midnightcontrols.virtual_mouse.skin.default_dark": "기본 다크", + "midnightcontrols.virtual_mouse.skin.second_light": "두 번째 라이트", + "midnightcontrols.virtual_mouse.skin.second_dark": "두 번째 다크", + "modmenu.descriptionTranslation.midnightcontrols": "컨트롤러 제어 및 전반적인 향상된 제어 기능을 추가합니다.\n안타깝게도 업데이트가 끊긴 LambdaControls의 Fork 버전입니다." +} \ No newline at end of file From b15766dfdbfb28e2b7c96b69d9b436f488879322 Mon Sep 17 00:00:00 2001 From: ronniedude <37117448+ronniedude@users.noreply.github.com> Date: Wed, 29 Jun 2022 16:55:15 -0400 Subject: [PATCH 06/21] Split rotationspeed option to allow for separate horizontal and vertical speed configurations (controller) --- .../midnightcontrols/client/MidnightControlsConfig.java | 4 +++- .../midnightdust/midnightcontrols/client/MidnightInput.java | 4 ++-- .../client/gui/MidnightControlsSettingsScreen.java | 6 ++++++ src/main/resources/assets/midnightcontrols/lang/de_de.json | 6 ++++-- src/main/resources/assets/midnightcontrols/lang/en_us.json | 6 ++++-- src/main/resources/assets/midnightcontrols/lang/es_mx.json | 6 ++++-- src/main/resources/assets/midnightcontrols/lang/fr_ca.json | 6 ++++-- src/main/resources/assets/midnightcontrols/lang/fr_fr.json | 6 ++++-- src/main/resources/assets/midnightcontrols/lang/tr_tr.json | 6 ++++-- src/main/resources/assets/midnightcontrols/lang/zh_cn.json | 6 ++++-- 10 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index e67e787..01eea8f 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -52,7 +52,8 @@ public class MidnightControlsConfig extends MidnightConfig { @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.right_dead_zone") public static double rotationSpeed = 40.0; + @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.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; @@ -274,6 +275,7 @@ public class MidnightControlsConfig extends MidnightConfig { invertRightXAxis = false; DEFAULT_MAX_VALUE = 1; rotationSpeed = 40.0; + yAxisRotationSpeed = 40.0; mouseSpeed = 25.0; unfocusedInput = false; virtualMouse = false; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 3bc2592..d9e89fc 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -637,9 +637,9 @@ public class MidnightInput { double powValue = Math.pow(value, 2.0); if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y) { if (state == 2) { - this.targetPitch = -MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.rotationSpeed * powValue) * 0.11D; + this.targetPitch = -MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.yAxisRotationSpeed * powValue) * 0.11D; } else if (state == 1) { - this.targetPitch = MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.rotationSpeed * powValue) * 0.11D; + this.targetPitch = MidnightControlsConfig.getRightYAxisSign() * (MidnightControlsConfig.yAxisRotationSpeed * powValue) * 0.11D; } } if (axis == GLFW_GAMEPAD_AXIS_RIGHT_X) { 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 a015f22..4b3b8d5 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -55,6 +55,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { private final SpruceOption inputModeOption; private final SpruceOption autoSwitchModeOption; private final SpruceOption rotationSpeedOption; + private final SpruceOption yAxisRotationSpeedOption; private final SpruceOption mouseSpeedOption; private final SpruceOption virtualMouseOption; private final SpruceOption resetOption; @@ -172,6 +173,10 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { () -> MidnightControlsConfig.rotationSpeed, value -> MidnightControlsConfig.rotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), Text.translatable("midnightcontrols.tooltip.rotation_speed")); + this.yAxisRotationSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.y_axis_rotation_speed", 0.0, 100.0, .5f, + () -> MidnightControlsConfig.yAxisRotationSpeed, + value -> MidnightControlsConfig.yAxisRotationSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), + Text.translatable("midnightcontrols.tooltip.y_axis_rotation_speed")); this.mouseSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.mouse_speed", 0.0, 150.0, .5f, () -> MidnightControlsConfig.mouseSpeed, value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))), @@ -300,6 +305,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { list.addSingleOptionEntry(this.inputModeOption); list.addSingleOptionEntry(this.autoSwitchModeOption); list.addSingleOptionEntry(this.rotationSpeedOption); + list.addSingleOptionEntry(this.yAxisRotationSpeedOption); list.addSingleOptionEntry(this.mouseSpeedOption); list.addSingleOptionEntry(this.virtualMouseOption); return list; diff --git a/src/main/resources/assets/midnightcontrols/lang/de_de.json b/src/main/resources/assets/midnightcontrols/lang/de_de.json index 9a71fae..2899547 100644 --- a/src/main/resources/assets/midnightcontrols/lang/de_de.json +++ b/src/main/resources/assets/midnightcontrols/lang/de_de.json @@ -112,7 +112,8 @@ "midnightcontrols.menu.reacharound.vertical": "Vertikales Umgreifen", "midnightcontrols.menu.reload_controller_mappings": "Controller-Mappings neuladen", "midnightcontrols.menu.right_dead_zone": "Rechte tote Zone", - "midnightcontrols.menu.rotation_speed": "Rotationsgeschwindigkeit", + "midnightcontrols.menu.rotation_speed": "Rotationsgeschwindigkeit (X-Achse)", + "midnightcontrols.menu.y_axis_rotation_speed": "Rotationsgeschwindigkeit (Y-Achse)", "midnightcontrols.menu.separator.controller": "Controller", "midnightcontrols.menu.separator.general": "Generell", "midnightcontrols.menu.title": "MidnightControls - Einstellungen", @@ -148,7 +149,8 @@ "midnightcontrols.tooltip.reacharound.vertical": "Aktiviert vertikales Platzieren von Blöcken, §cwird von manchen Servern als cheaten eingestuft§r.", "midnightcontrols.tooltip.reload_controller_mappings": "Lädt die Controller-Mappings neu.", "midnightcontrols.tooltip.right_dead_zone": "Die tote Zone für den rechten Analogstick.", - "midnightcontrols.tooltip.rotation_speed": "Die Kamerarotationsgeschwindigkeit im Controllermodus.", + "midnightcontrols.tooltip.rotation_speed": "Die Kamerarotationsgeschwindigkeit im Controllermodus. (X-Achse)", + "midnightcontrols.tooltip.y_axis_rotation_speed": "Die Kamerarotationsgeschwindigkeit im Controllermodus. (Y-Achse)", "midnightcontrols.tooltip.unfocused_input": "Erlaube Controllereingabe auch wenn das Fenster nicht fokussiert ist.", "midnightcontrols.tooltip.virtual_mouse": "Aktiviere die virtuelle Maus.", "midnightcontrols.virtual_mouse.skin.default_light": "Standard Hell", diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index 6415da8..3256143 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -116,7 +116,8 @@ "midnightcontrols.menu.reacharound.vertical": "Vertical Reacharound", "midnightcontrols.menu.reload_controller_mappings": "Reload Controller Mappings", "midnightcontrols.menu.right_dead_zone": "Right Dead Zone", - "midnightcontrols.menu.rotation_speed": "Rotation Speed", + "midnightcontrols.menu.rotation_speed": "X Axis Rotation Speed", + "midnightcontrols.menu.y_axis_rotation_speed": "Y Axis Rotation Speed", "midnightcontrols.menu.separator.controller": "Controller", "midnightcontrols.menu.separator.general": "General", "midnightcontrols.menu.title": "MidnightControls - Settings", @@ -152,7 +153,8 @@ "midnightcontrols.tooltip.reacharound.vertical": "Enables vertical reacharound, §cmight be considered cheating on some servers§r.", "midnightcontrols.tooltip.reload_controller_mappings": "Reloads the controller mappings file.", "midnightcontrols.tooltip.right_dead_zone": "The dead zone for the controller's right analogue stick.", - "midnightcontrols.tooltip.rotation_speed": "The camera rotation speed in controller mode.", + "midnightcontrols.tooltip.rotation_speed": "The camera X Axis rotation speed in controller mode.", + "midnightcontrols.tooltip.y_axis_rotation_speed": "The camera Y Axis rotation speed in controller mode.", "midnightcontrols.tooltip.unfocused_input": "Allow controller input when the window is not focused.", "midnightcontrols.tooltip.virtual_mouse": "Enable the virtual mouse which is handful in the case of a splitscreen.", "midnightcontrols.virtual_mouse.skin.default_light": "Default Light", diff --git a/src/main/resources/assets/midnightcontrols/lang/es_mx.json b/src/main/resources/assets/midnightcontrols/lang/es_mx.json index f61731a..b4a55cf 100644 --- a/src/main/resources/assets/midnightcontrols/lang/es_mx.json +++ b/src/main/resources/assets/midnightcontrols/lang/es_mx.json @@ -104,7 +104,8 @@ "midnightcontrols.menu.reacharound.vertical": "Alcance vertical", "midnightcontrols.menu.reload_controller_mappings": "Recargar asignaciones de controlador", "midnightcontrols.menu.right_dead_zone": "Zona muerta derecha", - "midnightcontrols.menu.rotation_speed": "Velocidad de rotación", + "midnightcontrols.menu.rotation_speed": "Velocidad de rotación (eje X)", + "midnightcontrols.menu.y_axis_rotation_speed": "Velocidad de rotación (eje Y)", "midnightcontrols.menu.separator.controller": "Controlador", "midnightcontrols.menu.separator.general": "General", "midnightcontrols.menu.title": "midnightcontrols - Configuraciones", @@ -140,7 +141,8 @@ "midnightcontrols.tooltip.reacharound.vertical": "Habilita el alcance vertical, §cpodría considerarse trampa en algunos servidores§r.", "midnightcontrols.tooltip.reload_controller_mappings": "Vuelve a cargar el archivo de asignaciones del controlador.", "midnightcontrols.tooltip.right_dead_zone": "La zona muerta de la palanca analógica derecha del controlador.", - "midnightcontrols.tooltip.rotation_speed": "La velocidad de rotación de la cámara en modo controlador.", + "midnightcontrols.tooltip.rotation_speed": "La velocidad de rotación de la cámara en modo controlador. (eje X)", + "midnightcontrols.tooltip.y_axis_rotation_speed": "La velocidad de rotación de la cámara en modo controlador. (eje Y)", "midnightcontrols.tooltip.unfocused_input": "Habilita entrada del controlador cuando la ventana no está enfocada.", "midnightcontrols.tooltip.virtual_mouse": "Habilite el ratón virtual que es útil en el caso de una pantalla dividida.", "midnightcontrols.virtual_mouse.skin.default_light": "Ligera por defecto", diff --git a/src/main/resources/assets/midnightcontrols/lang/fr_ca.json b/src/main/resources/assets/midnightcontrols/lang/fr_ca.json index d8129ad..cae89a5 100644 --- a/src/main/resources/assets/midnightcontrols/lang/fr_ca.json +++ b/src/main/resources/assets/midnightcontrols/lang/fr_ca.json @@ -104,7 +104,8 @@ "midnightcontrols.menu.reacharound.vertical": "Placement vertical", "midnightcontrols.menu.reload_controller_mappings": "Recharger les manettes", "midnightcontrols.menu.right_dead_zone": "Zone morte axe droit", - "midnightcontrols.menu.rotation_speed": "Vitesse de rotation", + "midnightcontrols.menu.rotation_speed": "Vitesse de rotation (X)", + "midnightcontrols.menu.y_axis_rotation_speed": "Vitesse de rotation (Y)", "midnightcontrols.menu.separator.general": "Général", "midnightcontrols.menu.separator.controller": "Manette", "midnightcontrols.menu.title": "midnightcontrols - Paramètres", @@ -140,7 +141,8 @@ "midnightcontrols.tooltip.reacharound.vertical": "Active le placement vertical de blocs, c'est-à-dire de blocs en dessous du bloc sur lequel vous êtes placé, §cpeut être considérer comme de la triche sur certains serveurs§r.", "midnightcontrols.tooltip.reload_controller_mappings": "Recharge le fichier de configuration des manettes.", "midnightcontrols.tooltip.right_dead_zone": "Zone morte de l'axe droit de la manette.", - "midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra.", + "midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra. (X)", + "midnightcontrols.tooltip.y_axis_rotation_speed": "Change la vitesse de rotation de la caméra. (Y)", "midnightcontrols.tooltip.unfocused_input": "Autorise les entrées manette quand la fenêtre n'est pas sélectionnée.", "midnightcontrols.tooltip.virtual_mouse": "Active la souris virtuelle qui est pratique dans le cas d'un écran partagé.", "midnightcontrols.virtual_mouse.skin.default_light": "défaut clair", diff --git a/src/main/resources/assets/midnightcontrols/lang/fr_fr.json b/src/main/resources/assets/midnightcontrols/lang/fr_fr.json index d8129ad..cae89a5 100644 --- a/src/main/resources/assets/midnightcontrols/lang/fr_fr.json +++ b/src/main/resources/assets/midnightcontrols/lang/fr_fr.json @@ -104,7 +104,8 @@ "midnightcontrols.menu.reacharound.vertical": "Placement vertical", "midnightcontrols.menu.reload_controller_mappings": "Recharger les manettes", "midnightcontrols.menu.right_dead_zone": "Zone morte axe droit", - "midnightcontrols.menu.rotation_speed": "Vitesse de rotation", + "midnightcontrols.menu.rotation_speed": "Vitesse de rotation (X)", + "midnightcontrols.menu.y_axis_rotation_speed": "Vitesse de rotation (Y)", "midnightcontrols.menu.separator.general": "Général", "midnightcontrols.menu.separator.controller": "Manette", "midnightcontrols.menu.title": "midnightcontrols - Paramètres", @@ -140,7 +141,8 @@ "midnightcontrols.tooltip.reacharound.vertical": "Active le placement vertical de blocs, c'est-à-dire de blocs en dessous du bloc sur lequel vous êtes placé, §cpeut être considérer comme de la triche sur certains serveurs§r.", "midnightcontrols.tooltip.reload_controller_mappings": "Recharge le fichier de configuration des manettes.", "midnightcontrols.tooltip.right_dead_zone": "Zone morte de l'axe droit de la manette.", - "midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra.", + "midnightcontrols.tooltip.rotation_speed": "Change la vitesse de rotation de la caméra. (X)", + "midnightcontrols.tooltip.y_axis_rotation_speed": "Change la vitesse de rotation de la caméra. (Y)", "midnightcontrols.tooltip.unfocused_input": "Autorise les entrées manette quand la fenêtre n'est pas sélectionnée.", "midnightcontrols.tooltip.virtual_mouse": "Active la souris virtuelle qui est pratique dans le cas d'un écran partagé.", "midnightcontrols.virtual_mouse.skin.default_light": "défaut clair", diff --git a/src/main/resources/assets/midnightcontrols/lang/tr_tr.json b/src/main/resources/assets/midnightcontrols/lang/tr_tr.json index e16c88a..a3c5fd5 100644 --- a/src/main/resources/assets/midnightcontrols/lang/tr_tr.json +++ b/src/main/resources/assets/midnightcontrols/lang/tr_tr.json @@ -98,7 +98,8 @@ "midnightcontrols.menu.reacharound.horizontal": "Alt Öne Blok Koyma", "midnightcontrols.menu.reacharound.vertical": "En Alta Blok Koyma", "midnightcontrols.menu.reload_controller_mappings": "Oyun Kolu Eşleştirmelerini Yenile", - "midnightcontrols.menu.rotation_speed": "Dönme Hızı", + "midnightcontrols.menu.rotation_speed": "Dönme Hızı (X)", + "midnightcontrols.menu.y_axis_rotation_speed": "Dönme Hızı (Y)", "midnightcontrols.menu.title": "midnightcontrols - Ayarlar", "midnightcontrols.menu.title.controller": "Oyun Kolu Seçenekleri", "midnightcontrols.menu.title.controller_controls": "Oyun Kolu Kontrolleri", @@ -124,7 +125,8 @@ "midnightcontrols.tooltip.reacharound.horizontal": "Hızlı blok koymayı etkinleştirir. §cBazı sunucular bunun hile olduğunu düşünebilir.§r.", "midnightcontrols.tooltip.reacharound.vertical": "En alta blok koymayı etkinleştirir. §cBazı sunucular bunun hile olduğunu düşünebilir.§r.", "midnightcontrols.tooltip.reload_controller_mappings": "Oyun kolu için eşleştirme dosyasını yeniler.", - "midnightcontrols.tooltip.rotation_speed": "Oyun kolu modunda olan kamera dönme hızı", + "midnightcontrols.tooltip.rotation_speed": "Oyun kolu modunda olan kamera dönme hızı (X)", + "midnightcontrols.tooltip.y_axis_rotation_speed": "Oyun kolu modunda olan kamera dönme hızı (Y)", "midnightcontrols.tooltip.unfocused_input": "Oyun penceresinde değilken oyun kolu girişine izine verir.", "midnightcontrols.tooltip.virtual_mouse": "Sanal fareyi etkinleştirir. Çift ekran oynanılacağı zaman işe yarar.", "midnightcontrols.virtual_mouse.skin.default_light": "Varsayılan Aydınlık Tema", diff --git a/src/main/resources/assets/midnightcontrols/lang/zh_cn.json b/src/main/resources/assets/midnightcontrols/lang/zh_cn.json index c04a639..1b53081 100644 --- a/src/main/resources/assets/midnightcontrols/lang/zh_cn.json +++ b/src/main/resources/assets/midnightcontrols/lang/zh_cn.json @@ -104,7 +104,8 @@ "midnightcontrols.menu.reacharound.vertical": "垂直方向方块放置辅助", "midnightcontrols.menu.reload_controller_mappings": "重新加载手柄按键映射", "midnightcontrols.menu.right_dead_zone": "右摇杆死区", - "midnightcontrols.menu.rotation_speed": "镜头旋转速度", + "midnightcontrols.menu.rotation_speed": "镜头旋转速度 (X)", + "midnightcontrols.menu.y_axis_rotation_speed": "镜头旋转速度 (Y)", "midnightcontrols.menu.separator.controller": "手柄", "midnightcontrols.menu.separator.general": "通用", "midnightcontrols.menu.title": "midnightcontrols — 设置", @@ -140,7 +141,8 @@ "midnightcontrols.tooltip.reacharound.vertical": "启用垂直方向方块放置辅助,可在脚下方块的下方放置方块。\n§c在部分服务器可能会被认定为作弊。", "midnightcontrols.tooltip.reload_controller_mappings": "重新加载手柄的按键映射文件。", "midnightcontrols.tooltip.right_dead_zone": "右摇杆配置的死区。\n死区决定摇杆要偏离中心位置多远才能让摇杆的输入有效。", - "midnightcontrols.tooltip.rotation_speed": "手柄操作模式下的镜头旋转速度。", + "midnightcontrols.tooltip.rotation_speed": "手柄操作模式下的镜头旋转速度。(X)", + "midnightcontrols.tooltip.y_axis_rotation_speed": "手柄操作模式下的镜头旋转速度。(Y)", "midnightcontrols.tooltip.unfocused_input": "即使游戏窗口处于非活动状态,也允许手柄进行按键输入。", "midnightcontrols.tooltip.virtual_mouse": "启用虚拟鼠标,在分屏的情况下很有用。", "midnightcontrols.virtual_mouse.skin.default_light": "默认样式(白色)", From df7c7bbdadeac6fa2989f129e18d49df78ccf3be Mon Sep 17 00:00:00 2001 From: Motschen Date: Thu, 30 Jun 2022 21:29:59 +0200 Subject: [PATCH 07/21] 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); } } } From b24a158b9bc39b5d499b1f10f283abba2d6ee46f Mon Sep 17 00:00:00 2001 From: Ivan <88715280+Ivanoks@users.noreply.github.com> Date: Sat, 2 Jul 2022 02:12:07 +0600 Subject: [PATCH 08/21] Add files via upload --- .../assets/midnightcontrols/lang/ru_ru.json | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 src/main/resources/assets/midnightcontrols/lang/ru_ru.json diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json new file mode 100644 index 0000000..915add9 --- /dev/null +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -0,0 +1,165 @@ +{ + "midnightcontrols.midnightconfig.title": "Расширенная Конфигурация MidnightControls", + "key.midnightcontrols.look_down": "Смотреть Вниз", + "key.midnightcontrols.look_left": "Смотреть Налево", + "key.midnightcontrols.look_right": "Смотреть Направо", + "key.midnightcontrols.look_up": "Смотерть Вверх", + "key.midnightcontrols.ring": "Показать Кольцо Управления", + "midnightcontrols.action.attack": "Атаковать", + "midnightcontrols.action.back": "Назад", + "midnightcontrols.action.chat": "Открыть Чат", + "midnightcontrols.action.drop_item": "Выбросить Предмет", + "midnightcontrols.action.exit": "Выйти", + "midnightcontrols.action.forward": "Вперед", + "midnightcontrols.action.hit": "Ударить", + "midnightcontrols.action.hotbar_left": "Панель Быстрого Доступа Налево", + "midnightcontrols.action.hotbar_right": "Панель Быстрого Доступа Направо", + "midnightcontrols.action.inventory": "Инвентарь", + "midnightcontrols.action.jump": "Прыжок", + "midnightcontrols.action.left": "Налево", + "midnightcontrols.action.pause_game": "Приостановить игру", + "midnightcontrols.action.pick_block": "Выбор Блок", + "midnightcontrols.action.pickup": "Разделить", + "midnightcontrols.action.pickup_all": "Взять Всё", + "midnightcontrols.action.place": "Поставить", + "midnightcontrols.action.player_list": "Лист Игроков", + "midnightcontrols.action.quick_move": "Переложить", + "midnightcontrols.action.right": "Направо", + "midnightcontrols.action.screenshot": "Сделать Скриншот", + "midnightcontrols.action.sneak": "Красться", + "midnightcontrols.action.sprint": "Бег", + "midnightcontrols.action.swap_hands": "Поменять Руку", + "midnightcontrols.action.toggle_perspective": "Переключить Преспективу", + "midnightcontrols.action.toggle_smooth_camera": "Переключить Кинематографическую Камеру", + "midnightcontrols.action.page_back": "Предыдущая Страница", + "midnightcontrols.action.page_next": "Следующая Страница", + "midnightcontrols.action.take": "Взять Предмет", + "midnightcontrols.action.take_all": "Взять Стак", + "midnightcontrols.action.use": "Использовать", + "midnightcontrols.action.zoom": "Приблизить", + "midnightcontrols.action.zoom_in": "Увеличить Масштаб", + "midnightcontrols.action.zoom_out": "Уменьшить Масштаб", + "midnightcontrols.action.zoom_reset": "Сбросить Масштаб", + "midnightcontrols.action.key.emotecraft.fastchoose": "Быстрый Выбор Эмоции", + "midnightcontrols.action.key.emotecraft.stop": "Прекратить Эмоцию", + "midnightcontrols.button.a": "A", + "midnightcontrols.button.b": "B", + "midnightcontrols.button.x": "X", + "midnightcontrols.button.y": "Y", + "midnightcontrols.button.left_bumper": "Левый Бампер", + "midnightcontrols.button.right_bumper": "Правый Бампер", + "midnightcontrols.button.back": "Назад", + "midnightcontrols.button.start": "Старт", + "midnightcontrols.button.guide": "Гайд Кнопка", + "midnightcontrols.button.left_thumb": "Левый Стик", + "midnightcontrols.button.right_thumb": "Правый Стик", + "midnightcontrols.button.dpad_up": "Крестовина Вверх", + "midnightcontrols.button.dpad_right": "Крестовина Вправо", + "midnightcontrols.button.dpad_down": "Крестовина Вниз", + "midnightcontrols.button.dpad_left": "Крестовина Влево", + "midnightcontrols.button.l4": "L4", + "midnightcontrols.button.l5": "L5", + "midnightcontrols.button.r4": "R4", + "midnightcontrols.button.r5": "L5", + "midnightcontrols.axis.left_x+": "Левый Стик X+", + "midnightcontrols.axis.left_y+": "Левый Стик Y+", + "midnightcontrols.axis.right_x+": "Правый Стик X+", + "midnightcontrols.axis.right_y+": "Правый Стик Y+", + "midnightcontrols.axis.left_trigger": "Левый Триггер", + "midnightcontrols.axis.right_trigger": "Правый Триггер", + "midnightcontrols.axis.left_x-": "Левый Стик X-", + "midnightcontrols.axis.left_y-": "Левый Стик Y-", + "midnightcontrols.axis.right_x-": "Правый Стик X-", + "midnightcontrols.axis.right_y-": "Правый Стик Y-", + "midnightcontrols.button.unknown": "Неизвестный (%d)", + "midnightcontrols.controller.connected": "Контроллер %d Был Присоединен.", + "midnightcontrols.controller.disconnected": "Контроллер %d Был Отключён.", + "midnightcontrols.controller.mappings.1": "Чтобы настроить раскладку контроллера, используйте %s", + "midnightcontrols.controller.mappings.3": "и вставте ваш итог в редактор файлов раскладок.", + "midnightcontrols.controller.mappings.error": "Ошибка при загрузке раскладки.", + "midnightcontrols.controller.mappings.error.write": "Ошибка при записи раскладки в файл.", + "midnightcontrols.controller.mappings.updated": "Раскладка обновлена!", + "midnightcontrols.controller_type.default": "По обычному", + "midnightcontrols.controller_type.dualshock": "DualShock", + "midnightcontrols.controller_type.switch": "Switch", + "midnightcontrols.controller_type.xbox": "Xbox", + "midnightcontrols.controller_type.steam": "Steam", + "midnightcontrols.controller_type.ouya": "OUYA", + "midnightcontrols.controls_mode.default": "Клавиатура/Мышь", + "midnightcontrols.controls_mode.controller": "Контроллер", + "midnightcontrols.controls_mode.touchscreen": "Сенсорный Экран", + "midnightcontrols.hud_side.left": "Больше Налево", + "midnightcontrols.hud_side.right": "Больше Направо", + "midnightcontrols.menu.analog_movement": "Аналоговое Движение", + "midnightcontrols.menu.auto_switch_mode": "Автоматическое Переключение", + "midnightcontrols.menu.controller": "Контроллер", + "midnightcontrols.menu.controller2": "Дополнительный Контроллер", + "midnightcontrols.menu.controller_type": "Тип контроллера", + "midnightcontrols.menu.controls_mode": "Тип", + "midnightcontrols.menu.double_tap_to_sprint": "Два Раза По Левому Стику, Чтобы Начать Бегать", + "midnightcontrols.menu.fast_block_placing": "Быстрая Поставка Блоков", + "midnightcontrols.menu.fly_drifting": "Инерция При Летание", + "midnightcontrols.menu.fly_drifting_vertical": "Вертикальная Инерция При Летание", + "midnightcontrols.menu.hud_enable": "Включить Худ Иконок Контроллера", + "midnightcontrols.menu.hud_side": "Расположение Худа", + "midnightcontrols.menu.invert_right_x_axis": "Инвертировать Правый X", + "midnightcontrols.menu.invert_right_y_axis": "Инвертировать Правый Y", + "midnightcontrols.menu.keyboard_controls": "Клавиатурная Настройка...", + "midnightcontrols.menu.left_dead_zone": "Мертвая Зона Левого Стика", + "midnightcontrols.menu.mappings.open_input_str": "Открыть Редактор Файлов Раскладок", + "midnightcontrols.menu.max_left_x_value": "Максимальное Значение Ось Левого X", + "midnightcontrols.menu.max_left_y_value": "Максимальное Значение Ось Левого Y", + "midnightcontrols.menu.max_right_x_value": "Максимальное Значение Ось Правого X", + "midnightcontrols.menu.max_right_y_value": "Максимальное Значение Ось Правого Y", + "midnightcontrols.menu.mouse_speed": "Скорость Курсора", + "midnightcontrols.menu.reacharound.horizontal": "Размещение Переднего Блока", + "midnightcontrols.menu.reacharound.vertical": "Вертикальный Охват", + "midnightcontrols.menu.reload_controller_mappings": "Перезагрузить Раскладку Контроллера", + "midnightcontrols.menu.right_dead_zone": "Мертвая Зона Правого Стика", + "midnightcontrols.menu.rotation_speed": "Скорость Вращения По Оси X", + "midnightcontrols.menu.y_axis_rotation_speed": "Скорость Вращения По Оси Y", + "midnightcontrols.menu.separator.controller": "Контроллер", + "midnightcontrols.menu.separator.general": "Общие", + "midnightcontrols.menu.title": "MidnightControls - Настройки", + "midnightcontrols.menu.title.controller": "Настройки Контроллера", + "midnightcontrols.menu.title.controller_controls": "Управление Контроллером", + "midnightcontrols.menu.title.gameplay": "Во Время Игры Настройки", + "midnightcontrols.menu.title.general": "Общие Настройки", + "midnightcontrols.menu.title.hud": "Настройка Худа", + "midnightcontrols.menu.title.mappings.string": "Редактор Файлов Раскладок", + "midnightcontrols.menu.title.visual": "Настройка Внешнего Вида", + "midnightcontrols.menu.unfocused_input": "Несфокусированный Ввод", + "midnightcontrols.menu.virtual_mouse": "Виртуальныя Мышка", + "midnightcontrols.menu.virtual_mouse.skin": "Дизайн Виртуальной Мышки", + "midnightcontrols.narrator.unbound": "Освобождённый %s", + "midnightcontrols.not_bound": "Не Назначанно", + "midnightcontrols.tooltip.analog_movement": "Включает аналоговое движение, когда это возможно.", + "midnightcontrols.tooltip.auto_switch_mode": "Автоматическое переключение на новый, только подключенный контроллер.", + "midnightcontrols.tooltip.controller2": "Дополнительный контроллер, например для Джой-конов.", + "midnightcontrols.tooltip.controller_type": "Тип контроллера, чтобы правильно сопоставить иконки кнопок.", + "midnightcontrols.tooltip.controls_mode": "Тип контроля над игрой.", + "midnightcontrols.tooltip.fast_block_placing": "Во время полета в творческом режиме позволяет быстро размещать блоки в зависимости от вашей скорости. §cНа некоторых серверах это может расцениваться как читерство.§r", + "midnightcontrols.tooltip.fly_drifting": "Во время полета включает ванильную инерцию.", + "midnightcontrols.tooltip.fly_drifting_vertical": "Во время полета включает ванильную вертикальную инерцию.", + "midnightcontrols.tooltip.hud_enable": "Переключает видение иконок кнопок контроллера на экране.", + "midnightcontrols.tooltip.hud_side": "Расположение худа.", + "midnightcontrols.tooltip.left_dead_zone": "Мертвая зона для левого аналогового стика контроллера.", + "midnightcontrols.tooltip.max_left_x_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.", + "midnightcontrols.tooltip.max_left_y_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.", + "midnightcontrols.tooltip.max_right_x_value": "Изменяет то, что мод в итоге считает максимальным значением для правой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.", + "midnightcontrols.tooltip.max_right_y_value": "Изменяет то, что мод в итоге считает максимальным значением для правой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.", + "midnightcontrols.tooltip.mouse_speed": "Скорость мыши, эмулируемая контроллером.", + "midnightcontrols.tooltip.reacharound.horizontal": "Позволяет размещать передний блок перед собой. §cМожет рассматриваться как читерство на некоторых серверах§r.", + "midnightcontrols.tooltip.reacharound.vertical": "Обеспечивает вертикальный охват. §cМожет рассматриваться как мошенничество на некоторых серверах§r.", + "midnightcontrols.tooltip.reload_controller_mappings": "Перезагружает файл раскладки контроллеров.", + "midnightcontrols.tooltip.right_dead_zone": "Мертвая зона для правого аналогового стика контроллера.", + "midnightcontrols.tooltip.rotation_speed": "Скорость вращения камеры по оси X в режиме контроллера.", + "midnightcontrols.tooltip.y_axis_rotation_speed": "Скорость вращения камеры по оси Y в режиме контроллера.", + "midnightcontrols.tooltip.unfocused_input": "Разрешить ввод с контроллера, даже если игра на сфокусирована.", + "midnightcontrols.tooltip.virtual_mouse": "Включить виртуальную мышь, очень полезно при игре двоём на одном компьютере.", + "midnightcontrols.virtual_mouse.skin.default_light": "Обычный Светлый", + "midnightcontrols.virtual_mouse.skin.default_dark": "Обычный Тёмный", + "midnightcontrols.virtual_mouse.skin.second_light": "Дополнительный Светлый", + "midnightcontrols.virtual_mouse.skin.second_dark": "Дополнительный Тёмный", + "modmenu.descriptionTranslation.midnightcontrols": "Добавление ​​поддержки контроллера и улучшенние элементов управления в целом.\nРазветвлен от LambdaControls, поддержка которого, к сожалению, прекращена.." +} \ No newline at end of file From dd8e62c73ebd7c03e0a5e5938d8935eadf45ecc0 Mon Sep 17 00:00:00 2001 From: Ivan <88715280+Ivanoks@users.noreply.github.com> Date: Sat, 2 Jul 2022 03:03:52 +0600 Subject: [PATCH 09/21] Update ru_ru.json --- src/main/resources/assets/midnightcontrols/lang/ru_ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json index 915add9..c812372 100644 --- a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -19,7 +19,7 @@ "midnightcontrols.action.left": "Налево", "midnightcontrols.action.pause_game": "Приостановить игру", "midnightcontrols.action.pick_block": "Выбор Блок", - "midnightcontrols.action.pickup": "Разделить", + "midnightcontrols.action.pickup": "Взять Половину", "midnightcontrols.action.pickup_all": "Взять Всё", "midnightcontrols.action.place": "Поставить", "midnightcontrols.action.player_list": "Лист Игроков", @@ -162,4 +162,4 @@ "midnightcontrols.virtual_mouse.skin.second_light": "Дополнительный Светлый", "midnightcontrols.virtual_mouse.skin.second_dark": "Дополнительный Тёмный", "modmenu.descriptionTranslation.midnightcontrols": "Добавление ​​поддержки контроллера и улучшенние элементов управления в целом.\nРазветвлен от LambdaControls, поддержка которого, к сожалению, прекращена.." -} \ No newline at end of file +} From c8dba43b9042a9b7c950b467a9cf2eb0126ad21c Mon Sep 17 00:00:00 2001 From: Madis Otenurm Date: Sat, 2 Jul 2022 12:44:08 +0300 Subject: [PATCH 10/21] Update en_us.json --- src/main/resources/assets/midnightcontrols/lang/en_us.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index 3256143..d94560c 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -138,6 +138,7 @@ "midnightcontrols.tooltip.controller2": "Second controller to use, which allows Joy-Cons support for example.", "midnightcontrols.tooltip.controller_type": "The controller type to display the correct buttons.", "midnightcontrols.tooltip.controls_mode": "The controls mode.", + "midnightcontrols.tooltip.double_tap_to_sprint": "Toggles whether the Wark Forwards key (default W) makes the player sprint when quickly double-tapped" "midnightcontrols.tooltip.fast_block_placing": "While flying in creative mode, enables fast block placing depending on your speed. §cOn some servers this might be considered as cheating.", "midnightcontrols.tooltip.fly_drifting": "While flying, enables Vanilla drifting/inertia.", "midnightcontrols.tooltip.fly_drifting_vertical": "While flying, enables Vanilla vertical drifting/intertia.", @@ -162,4 +163,4 @@ "midnightcontrols.virtual_mouse.skin.second_light": "Second Light", "midnightcontrols.virtual_mouse.skin.second_dark": "Second Dark", "modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued." -} \ No newline at end of file +} From 965ab5715957a3bd598fb5379ab85551ce2733e8 Mon Sep 17 00:00:00 2001 From: Madis Otenurm Date: Sat, 2 Jul 2022 16:12:47 +0300 Subject: [PATCH 11/21] Oops --- src/main/resources/assets/midnightcontrols/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index d94560c..bba5d1c 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -138,7 +138,7 @@ "midnightcontrols.tooltip.controller2": "Second controller to use, which allows Joy-Cons support for example.", "midnightcontrols.tooltip.controller_type": "The controller type to display the correct buttons.", "midnightcontrols.tooltip.controls_mode": "The controls mode.", - "midnightcontrols.tooltip.double_tap_to_sprint": "Toggles whether the Wark Forwards key (default W) makes the player sprint when quickly double-tapped" + "midnightcontrols.tooltip.double_tap_to_sprint": "Toggles whether the Walk Forwards key makes the player sprint when quickly double-tapped", "midnightcontrols.tooltip.fast_block_placing": "While flying in creative mode, enables fast block placing depending on your speed. §cOn some servers this might be considered as cheating.", "midnightcontrols.tooltip.fly_drifting": "While flying, enables Vanilla drifting/inertia.", "midnightcontrols.tooltip.fly_drifting_vertical": "While flying, enables Vanilla vertical drifting/intertia.", From 1a3d7ce22536ab72283a4aed85fbc3372798337f Mon Sep 17 00:00:00 2001 From: Madis Otenurm Date: Sat, 2 Jul 2022 16:42:40 +0300 Subject: [PATCH 12/21] Create et_ee.json --- .../assets/midnightcontrols/lang/et_ee.json | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 src/main/resources/assets/midnightcontrols/lang/et_ee.json diff --git a/src/main/resources/assets/midnightcontrols/lang/et_ee.json b/src/main/resources/assets/midnightcontrols/lang/et_ee.json new file mode 100644 index 0000000..8e71dda --- /dev/null +++ b/src/main/resources/assets/midnightcontrols/lang/et_ee.json @@ -0,0 +1,130 @@ +{ + "midnightcontrols.midnightconfig.title": "MidnightControls täpsem seadistus", + "key.midnightcontrols.look_down": "Vaata alla", + "key.midnightcontrols.look_left": "Vaata vasakule", + "key.midnightcontrols.look_right": "Vaata paremale", + "key.midnightcontrols.look_up": "Vaata üles", + "key.midnightcontrols.ring": "Kuva juhtnupuringi", + "midnightcontrols.action.attack": "Ründa", + "midnightcontrols.action.back": "Tagasi", + "midnightcontrols.action.chat": "Ava vestlus", + "midnightcontrols.action.drop_item": "Viska ese", + "midnightcontrols.action.exit": "Välju", + "midnightcontrols.action.forward": "Edasi", + "midnightcontrols.action.hit": "Löö", + "midnightcontrols.action.hotbar_left": "Plokiriba vasakule", + "midnightcontrols.action.hotbar_right": "Plokiriba paremale", + "midnightcontrols.action.inventory": "Seljakott", + "midnightcontrols.action.jump": "Hüppa", + "midnightcontrols.action.left": "Vasakule", + "midnightcontrols.action.pause_game": "Mäng pausile", + "midnightcontrols.action.pick_block": "Vali plokk", + "midnightcontrols.action.pickup": "Korja üles", + "midnightcontrols.action.pickup_all": "Korja kõik üles", + "midnightcontrols.action.place": "Aseta", + "midnightcontrols.action.player_list": "Mängijate loend", + "midnightcontrols.action.quick_move": "Kiirliigutus", + "midnightcontrols.action.right": "Paremale", + "midnightcontrols.action.screenshot": "Loo kuvatõmmis", + "midnightcontrols.action.sneak": "Hiili", + "midnightcontrols.action.sprint": "Jookse", + "midnightcontrols.action.swap_hands": "Vaheta käsi", + "midnightcontrols.action.toggle_perspective": "Lülita perspektiivi", + "midnightcontrols.action.toggle_smooth_camera": "Lülita kinemaatilist kaamerat", + "midnightcontrols.action.page_back": "Eelmine leht", + "midnightcontrols.action.page_next": "Järgmine leht", + "midnightcontrols.action.take": "Võta ese", + "midnightcontrols.action.take_all": "Võta kuhi", + "midnightcontrols.action.use": "Kasuta", + "midnightcontrols.action.zoom": "Suumi", + "midnightcontrols.action.zoom_in": "Suurenda suumi", + "midnightcontrols.action.zoom_out": "Vähenda suumi", + "midnightcontrols.action.zoom_reset": "Lähtesta suum", + "midnightcontrols.action.key.emotecraft.fastchoose": "Vali kiirelt liigutus", + "midnightcontrols.action.key.emotecraft.stop": "Peata liigutus", + + "midnightcontrols.button.left_bumper": "Vasak külgnupp", + "midnightcontrols.button.right_bumper": "Parem külgnupp", + + "midnightcontrols.button.left_thumb": "Vasak pöidlanupp", + "midnightcontrols.button.right_thumb": "Parem pöidlanupp", + "midnightcontrols.button.dpad_up": "DPAD üles", + "midnightcontrols.button.dpad_right": "DPAD paremale", + "midnightcontrols.button.dpad_down": "DPAD alla", + "midnightcontrols.button.dpad_left": "DPAD vasakule", + + "midnightcontrols.axis.left_x+": "Vasak X+", + "midnightcontrols.axis.left_y+": "Vasak Y+", + "midnightcontrols.axis.right_x+": "Parem X+", + "midnightcontrols.axis.right_y+": "Parem Y+", + "midnightcontrols.axis.left_trigger": "Vasak käiviti", + "midnightcontrols.axis.right_trigger": "Parem käiviti", + "midnightcontrols.axis.left_x-": "Vasak X-", + "midnightcontrols.axis.left_y-": "Vasak Y-", + "midnightcontrols.axis.right_x-": "Parem X-", + "midnightcontrols.axis.right_y-": "Parem Y-", + "midnightcontrols.button.unknown": "Teadmata (%d)", + "midnightcontrols.controller.connected": "Mängupult %d ühendatud.", + "midnightcontrols.controller.disconnected": "Mängupult %d lahti ühendatud.", + "midnightcontrols.controller.mappings.1": "Mängupuldi vastenduste seadistamiseks palun kasuta %s", + "midnightcontrols.controller.mappings.3": "ning aseta vastendus vastenduste failiredaktorisse.", + "midnightcontrols.controller.mappings.error": "Vastenduste laadimisel esines viga.", + "midnightcontrols.controller.mappings.error.write": "Vastenduste faili kirjutamisel esines viga.", + "midnightcontrols.controller.mappings.updated": "Vastendused uuendatud!", + "midnightcontrols.controller_type.default": "vaikimisi", + + "midnightcontrols.controls_mode.default": "Klaviatuur/hiir", + "midnightcontrols.controls_mode.controller": "Mängupult", + "midnightcontrols.controls_mode.touchscreen": "Puuteekraan", + "midnightcontrols.hud_side.left": "vasak", + "midnightcontrols.hud_side.right": "parem", + "midnightcontrols.menu.analog_movement": "Analoogliikumine", + "midnightcontrols.menu.auto_switch_mode": "Vaheta režiimi automaatselt", + "midnightcontrols.menu.controller": "Mängupult", + "midnightcontrols.menu.controller2": "Teine mängupult", + "midnightcontrols.menu.controller_type": "Mängupuldi tüüp", + "midnightcontrols.menu.controls_mode": "Režiim", + "midnightcontrols.menu.double_tap_to_sprint": "Jooksmiseks topeltkoputa", + "midnightcontrols.menu.fast_block_placing": "Kiire plokiasetus", + "midnightcontrols.menu.fly_drifting": "Lennutriivimine", + "midnightcontrols.menu.fly_drifting_vertical": "Vertikaalne lennutriivimine", + "midnightcontrols.menu.hud_enable": "Nähtav liides", + "midnightcontrols.menu.hud_side": "Liidese pool", + "midnightcontrols.menu.invert_right_x_axis": "Pööratud parem X", + "midnightcontrols.menu.invert_right_y_axis": "Pööratud parem Y", + "midnightcontrols.menu.keyboard_controls": "Klaviatuuri juhtnupud...", + "midnightcontrols.menu.left_dead_zone": "Vasak surnud tsoon", + "midnightcontrols.menu.mappings.open_input_str": "Ava vastenduste failiredaktor", + "midnightcontrols.menu.max_left_x_value": "Vasaku X-telje maks. väärtus", + "midnightcontrols.menu.max_left_y_value": "Vasaku Y-telje maks. väärtus", + "midnightcontrols.menu.max_right_x_value": "Parema X-telje maks. väärtus", + "midnightcontrols.menu.max_right_y_value": "Parema Y-telje maks. väärtus", + "midnightcontrols.menu.mouse_speed": "Hiire kiirus", + "midnightcontrols.menu.reacharound.horizontal": "Ploki etteasetus", + "midnightcontrols.menu.reacharound.vertical": "Vertikaalne ümberasetus", + "midnightcontrols.menu.reload_controller_mappings": "Laadi mängupuldi vastendused uuesti", + "midnightcontrols.menu.right_dead_zone": "Parem surnud tsoon", + "midnightcontrols.menu.rotation_speed": "X-telje pöördekiirus", + "midnightcontrols.menu.y_axis_rotation_speed": "Y-telje pöördekiirus", + "midnightcontrols.menu.separator.controller": "Mängupult", + "midnightcontrols.menu.separator.general": "Üldine", + "midnightcontrols.menu.title": "MidnightControls - seaded", + "midnightcontrols.menu.title.controller": "Mängupuldi valikud", + "midnightcontrols.menu.title.controller_controls": "Mängupuldi juhtnupud", + "midnightcontrols.menu.title.gameplay": "Mängukogemuse valikud", + "midnightcontrols.menu.title.general": "Üldised valikud", + "midnightcontrols.menu.title.hud": "Liidese valikud", + "midnightcontrols.menu.title.mappings.string": "Vastenduste failiredaktor", + "midnightcontrols.menu.title.visual": "Välimuse valikud", + "midnightcontrols.menu.unfocused_input": "Fookustamata sisend", + "midnightcontrols.menu.virtual_mouse": "Virtuaalne hiir", + "midnightcontrols.menu.virtual_mouse.skin": "Virtuaalse hiire välimus", + "midnightcontrols.narrator.unbound": "Määramata %s", + "midnightcontrols.not_bound": "määramata", + + "midnightcontrols.virtual_mouse.skin.default_light": "vaikimisi hele", + "midnightcontrols.virtual_mouse.skin.default_dark": "vaikimisi tume", + "midnightcontrols.virtual_mouse.skin.second_light": "teine hele", + "midnightcontrols.virtual_mouse.skin.second_dark": "teine tume", + "modmenu.descriptionTranslation.midnightcontrols": "Lisab mängupuldi toe ning täiendab juhtnuppe üldiselt.\nFork loodud LambdaControls-ist, mille toetamine kahjuks lõpetati." + } From 73ab8456e7aa7e475ef8df1ee800e478cfe9b386 Mon Sep 17 00:00:00 2001 From: Ivan <88715280+Ivanoks@users.noreply.github.com> Date: Sat, 2 Jul 2022 20:00:45 +0600 Subject: [PATCH 13/21] Update ru_ru.json Added subtitle about double-tap for run. + fix the extra characters in line 165. --- src/main/resources/assets/midnightcontrols/lang/ru_ru.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json index c812372..809f023 100644 --- a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -138,6 +138,7 @@ "midnightcontrols.tooltip.controller2": "Дополнительный контроллер, например для Джой-конов.", "midnightcontrols.tooltip.controller_type": "Тип контроллера, чтобы правильно сопоставить иконки кнопок.", "midnightcontrols.tooltip.controls_mode": "Тип контроля над игрой.", + "midnightcontrols.tooltip.double_tap_to_sprint": "При двойном перемещением на левый стик, персонаж начинает бежать.", "midnightcontrols.tooltip.fast_block_placing": "Во время полета в творческом режиме позволяет быстро размещать блоки в зависимости от вашей скорости. §cНа некоторых серверах это может расцениваться как читерство.§r", "midnightcontrols.tooltip.fly_drifting": "Во время полета включает ванильную инерцию.", "midnightcontrols.tooltip.fly_drifting_vertical": "Во время полета включает ванильную вертикальную инерцию.", @@ -161,5 +162,5 @@ "midnightcontrols.virtual_mouse.skin.default_dark": "Обычный Тёмный", "midnightcontrols.virtual_mouse.skin.second_light": "Дополнительный Светлый", "midnightcontrols.virtual_mouse.skin.second_dark": "Дополнительный Тёмный", - "modmenu.descriptionTranslation.midnightcontrols": "Добавление ​​поддержки контроллера и улучшенние элементов управления в целом.\nРазветвлен от LambdaControls, поддержка которого, к сожалению, прекращена.." + "modmenu.descriptionTranslation.midnightcontrols": "Добавление поддержки контроллера и улучшенние элементов управления в целом.\nРазветвлен от LambdaControls, поддержка которого, к сожалению, прекращена.." } From f586647e07441a1e60702c35d4d31cf6865a2488 Mon Sep 17 00:00:00 2001 From: Madis Otenurm Date: Sat, 2 Jul 2022 17:02:47 +0300 Subject: [PATCH 14/21] Update et_ee.json --- src/main/resources/assets/midnightcontrols/lang/et_ee.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/et_ee.json b/src/main/resources/assets/midnightcontrols/lang/et_ee.json index 8e71dda..cb2b0d5 100644 --- a/src/main/resources/assets/midnightcontrols/lang/et_ee.json +++ b/src/main/resources/assets/midnightcontrols/lang/et_ee.json @@ -73,9 +73,9 @@ "midnightcontrols.controller.mappings.updated": "Vastendused uuendatud!", "midnightcontrols.controller_type.default": "vaikimisi", - "midnightcontrols.controls_mode.default": "Klaviatuur/hiir", - "midnightcontrols.controls_mode.controller": "Mängupult", - "midnightcontrols.controls_mode.touchscreen": "Puuteekraan", + "midnightcontrols.controls_mode.default": "klaviatuur/hiir", + "midnightcontrols.controls_mode.controller": "mängupult", + "midnightcontrols.controls_mode.touchscreen": "puuteekraan", "midnightcontrols.hud_side.left": "vasak", "midnightcontrols.hud_side.right": "parem", "midnightcontrols.menu.analog_movement": "Analoogliikumine", From 8e0e444d153f275da170bb784463d42a39983424 Mon Sep 17 00:00:00 2001 From: Ivan <88715280+Ivanoks@users.noreply.github.com> Date: Sat, 2 Jul 2022 20:07:07 +0600 Subject: [PATCH 15/21] Update ru_ru.json Changed the word format in line 99. --- src/main/resources/assets/midnightcontrols/lang/ru_ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json index 809f023..0352bab 100644 --- a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -96,7 +96,7 @@ "midnightcontrols.menu.controller2": "Дополнительный Контроллер", "midnightcontrols.menu.controller_type": "Тип контроллера", "midnightcontrols.menu.controls_mode": "Тип", - "midnightcontrols.menu.double_tap_to_sprint": "Два Раза По Левому Стику, Чтобы Начать Бегать", + "midnightcontrols.menu.double_tap_to_sprint": "Дважды Отвести Левый Стик, Чтобы Начать Бежать", "midnightcontrols.menu.fast_block_placing": "Быстрая Поставка Блоков", "midnightcontrols.menu.fly_drifting": "Инерция При Летание", "midnightcontrols.menu.fly_drifting_vertical": "Вертикальная Инерция При Летание", From 98d2cdae63fe6cbfe3676ab59db94ce1c2eb3b9a Mon Sep 17 00:00:00 2001 From: KiskaUWU <108581720+KiskaUWU@users.noreply.github.com> Date: Sun, 3 Jul 2022 00:39:28 +1000 Subject: [PATCH 16/21] Update ru_ru.json --- src/main/resources/assets/midnightcontrols/lang/ru_ru.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json index 0352bab..6a00ed4 100644 --- a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -100,7 +100,7 @@ "midnightcontrols.menu.fast_block_placing": "Быстрая Поставка Блоков", "midnightcontrols.menu.fly_drifting": "Инерция При Летание", "midnightcontrols.menu.fly_drifting_vertical": "Вертикальная Инерция При Летание", - "midnightcontrols.menu.hud_enable": "Включить Худ Иконок Контроллера", + "midnightcontrols.menu.hud_enable": "Включить Иконоки Контроллера", "midnightcontrols.menu.hud_side": "Расположение Худа", "midnightcontrols.menu.invert_right_x_axis": "Инвертировать Правый X", "midnightcontrols.menu.invert_right_y_axis": "Инвертировать Правый Y", @@ -125,7 +125,7 @@ "midnightcontrols.menu.title.controller_controls": "Управление Контроллером", "midnightcontrols.menu.title.gameplay": "Во Время Игры Настройки", "midnightcontrols.menu.title.general": "Общие Настройки", - "midnightcontrols.menu.title.hud": "Настройка Худа", + "midnightcontrols.menu.title.hud": "Настройка Интерфейса" "midnightcontrols.menu.title.mappings.string": "Редактор Файлов Раскладок", "midnightcontrols.menu.title.visual": "Настройка Внешнего Вида", "midnightcontrols.menu.unfocused_input": "Несфокусированный Ввод", @@ -143,7 +143,7 @@ "midnightcontrols.tooltip.fly_drifting": "Во время полета включает ванильную инерцию.", "midnightcontrols.tooltip.fly_drifting_vertical": "Во время полета включает ванильную вертикальную инерцию.", "midnightcontrols.tooltip.hud_enable": "Переключает видение иконок кнопок контроллера на экране.", - "midnightcontrols.tooltip.hud_side": "Расположение худа.", + "midnightcontrols.tooltip.hud_side": "Расположение интерфейса.", "midnightcontrols.tooltip.left_dead_zone": "Мертвая зона для левого аналогового стика контроллера.", "midnightcontrols.tooltip.max_left_x_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.", "midnightcontrols.tooltip.max_left_y_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.", From bda436d8632ef2ca19b635e86f24fdfdb8919ba7 Mon Sep 17 00:00:00 2001 From: Ivan <88715280+Ivanoks@users.noreply.github.com> Date: Sat, 2 Jul 2022 20:42:13 +0600 Subject: [PATCH 17/21] Update ru_ru.json Fix the 128 ",". --- src/main/resources/assets/midnightcontrols/lang/ru_ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json index 6a00ed4..01fe0e2 100644 --- a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -125,7 +125,7 @@ "midnightcontrols.menu.title.controller_controls": "Управление Контроллером", "midnightcontrols.menu.title.gameplay": "Во Время Игры Настройки", "midnightcontrols.menu.title.general": "Общие Настройки", - "midnightcontrols.menu.title.hud": "Настройка Интерфейса" + "midnightcontrols.menu.title.hud": "Настройка Интерфейса", "midnightcontrols.menu.title.mappings.string": "Редактор Файлов Раскладок", "midnightcontrols.menu.title.visual": "Настройка Внешнего Вида", "midnightcontrols.menu.unfocused_input": "Несфокусированный Ввод", From 9e879f923028559c4332242f4dc8b4732ef76043 Mon Sep 17 00:00:00 2001 From: KiskaUWU <108581720+KiskaUWU@users.noreply.github.com> Date: Sun, 3 Jul 2022 00:50:56 +1000 Subject: [PATCH 18/21] Update ru_ru.json --- src/main/resources/assets/midnightcontrols/lang/ru_ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json index 01fe0e2..f4a46b0 100644 --- a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -101,7 +101,7 @@ "midnightcontrols.menu.fly_drifting": "Инерция При Летание", "midnightcontrols.menu.fly_drifting_vertical": "Вертикальная Инерция При Летание", "midnightcontrols.menu.hud_enable": "Включить Иконоки Контроллера", - "midnightcontrols.menu.hud_side": "Расположение Худа", + "midnightcontrols.menu.hud_side": "Расположение Интерфейса", "midnightcontrols.menu.invert_right_x_axis": "Инвертировать Правый X", "midnightcontrols.menu.invert_right_y_axis": "Инвертировать Правый Y", "midnightcontrols.menu.keyboard_controls": "Клавиатурная Настройка...", @@ -143,7 +143,7 @@ "midnightcontrols.tooltip.fly_drifting": "Во время полета включает ванильную инерцию.", "midnightcontrols.tooltip.fly_drifting_vertical": "Во время полета включает ванильную вертикальную инерцию.", "midnightcontrols.tooltip.hud_enable": "Переключает видение иконок кнопок контроллера на экране.", - "midnightcontrols.tooltip.hud_side": "Расположение интерфейса.", + "midnightcontrols.tooltip.hud_side": "Расположение интерфейса в определённую сторону.", "midnightcontrols.tooltip.left_dead_zone": "Мертвая зона для левого аналогового стика контроллера.", "midnightcontrols.tooltip.max_left_x_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси X. Полезно, если ваша ось не использует весь диапазон и кажется медленной.", "midnightcontrols.tooltip.max_left_y_value": "Изменяет то, что мод в итоге считает максимальным значением для левой оси Y. Полезно, если ваша ось не использует весь диапазон и кажется медленной.", From e3052343d3afc674d5315f0c3d4b9b5a190275e3 Mon Sep 17 00:00:00 2001 From: KiskaUWU <108581720+KiskaUWU@users.noreply.github.com> Date: Sun, 3 Jul 2022 00:57:17 +1000 Subject: [PATCH 19/21] Update ru_ru.json --- src/main/resources/assets/midnightcontrols/lang/ru_ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json index f4a46b0..babb55c 100644 --- a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -98,7 +98,7 @@ "midnightcontrols.menu.controls_mode": "Тип", "midnightcontrols.menu.double_tap_to_sprint": "Дважды Отвести Левый Стик, Чтобы Начать Бежать", "midnightcontrols.menu.fast_block_placing": "Быстрая Поставка Блоков", - "midnightcontrols.menu.fly_drifting": "Инерция При Летание", + "midnightcontrols.menu.fly_drifting": "Инерция При Полёте", "midnightcontrols.menu.fly_drifting_vertical": "Вертикальная Инерция При Летание", "midnightcontrols.menu.hud_enable": "Включить Иконоки Контроллера", "midnightcontrols.menu.hud_side": "Расположение Интерфейса", From c247e51d007a2115c2b66a0f50147177125fe5f8 Mon Sep 17 00:00:00 2001 From: KiskaUWU <108581720+KiskaUWU@users.noreply.github.com> Date: Sun, 3 Jul 2022 00:58:28 +1000 Subject: [PATCH 20/21] Update ru_ru.json --- src/main/resources/assets/midnightcontrols/lang/ru_ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json index babb55c..4322882 100644 --- a/src/main/resources/assets/midnightcontrols/lang/ru_ru.json +++ b/src/main/resources/assets/midnightcontrols/lang/ru_ru.json @@ -99,7 +99,7 @@ "midnightcontrols.menu.double_tap_to_sprint": "Дважды Отвести Левый Стик, Чтобы Начать Бежать", "midnightcontrols.menu.fast_block_placing": "Быстрая Поставка Блоков", "midnightcontrols.menu.fly_drifting": "Инерция При Полёте", - "midnightcontrols.menu.fly_drifting_vertical": "Вертикальная Инерция При Летание", + "midnightcontrols.menu.fly_drifting_vertical": "Вертикальная Инерция При Полёте", "midnightcontrols.menu.hud_enable": "Включить Иконоки Контроллера", "midnightcontrols.menu.hud_side": "Расположение Интерфейса", "midnightcontrols.menu.invert_right_x_axis": "Инвертировать Правый X", From 735b9e87186157cb20fce3904679ff16ae4589e9 Mon Sep 17 00:00:00 2001 From: Motschen Date: Tue, 5 Jul 2022 21:15:31 +0200 Subject: [PATCH 21/21] MidnightControls 1.4.0 - Many Improvements and Fixes - EMI compat! (Switch page keybinds & more) - Expose more keybindings - Fix Compatibility with Quilt Creative Extension - Improve Auto Switch mode (Automatically switch gamepad on connection changes) - Fix triggers not working on some (slightly broken) controllers - Fix #57 (Broken stack pickup) - Fix #56 (Unused language strings) - Fix #52 (Rebound perspective button blocking actions) - Fix #46 (Button overlap with Crawl mod) - Fix #59 (D-Pad can switch EMI buttons when in Inventories) --- build.gradle | 4 +- gradle.properties | 4 +- .../client/ControllerType.java | 18 ++--- .../client/MidnightControlsClient.java | 1 - .../client/MidnightControlsConfig.java | 25 ++++-- .../client/MidnightInput.java | 72 +++++++++++------- .../client/compat/EMICompat.java | 41 ++++++++++ .../client/compat/MidnightControlsCompat.java | 8 +- .../client/compat/SodiumCompat.java | 6 +- .../client/controller/ButtonBinding.java | 17 ++++- .../client/controller/InputHandlers.java | 47 ++++++++---- .../client/controller/InputManager.java | 4 + .../client/gui/MidnightControlsHud.java | 4 +- .../gui/MidnightControlsSettingsScreen.java | 3 + .../mixin/ControlsOptionsScreenMixin.java | 27 +++++-- .../client/mixin/HandledScreenMixin.java | 8 +- .../client/mixin/MinecraftClientMixin.java | 10 ++- .../client/mixin/MouseMixin.java | 4 + .../client/util/MouseAccessor.java | 1 + .../assets/midnightcontrols/lang/de_de.json | 2 +- .../assets/midnightcontrols/lang/en_us.json | 21 +++-- .../textures/gui/midnightcontrols_button.png | Bin 0 -> 10059 bytes 22 files changed, 238 insertions(+), 89 deletions(-) create mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/compat/EMICompat.java create mode 100644 src/main/resources/assets/midnightcontrols/textures/gui/midnightcontrols_button.png diff --git a/build.gradle b/build.gradle index 3c9dcb2..49aeede 100644 --- a/build.gradle +++ b/build.gradle @@ -110,8 +110,8 @@ dependencies { // modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}" modImplementation "org.quiltmc:quilt-json5:1.0.0" - modApi "maven.modrinth:sodium:${project.sodium_version}" - //modImplementation("maven.modrinth:emi:${project.emi_version}") + modCompileOnly "maven.modrinth:sodium:${project.sodium_version}" + modImplementation("maven.modrinth:emi:${project.emi_version}") modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}" modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}" diff --git a/gradle.properties b/gradle.properties index ce1255f..cad3cf6 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.3.0 +mod_version = 1.4.0 maven_group = eu.midnightdust archives_base_name = midnightcontrols modrinth_id=bXX9h73M @@ -22,7 +22,7 @@ midnightlib_version=0.5.2 modmenu_version=4.0.0 emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric bendylib_version=2.0.+ -emi_version=0.1.1+1.18.2 +emi_version=0.2.0+1.19 # Ok Zoomer and LibZoomer are temporarily disabled for the time being, as we are currently using Reflection at runtime instead in OkZoomerCompat due to there being two major, completely incompatible API versions. # ok_zoomer_version=5.0.0-beta.3+1.17.1 diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java b/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java index a3b388e..20aecd0 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/ControllerType.java @@ -24,15 +24,15 @@ import java.util.Optional; * @since 1.0.0 */ public enum ControllerType implements Nameable { - DEFAULT(0, Text.of("Default")), - DUALSHOCK(1, Text.of("Dualshock")), - DUALSENSE(2, Text.of("Dualsense")), - SWITCH(3, Text.of("Switch")), - XBOX_360(4, Text.of("Xbox 360")), - XBOX(5, Text.of("Xbox")), - STEAM_DECK(6, Text.of("Steam Deck")), - STEAM_CONTROLLER(7, Text.of("Steam Controller")), - OUYA(8, Text.of("Ouya")); + DEFAULT(0), + DUALSHOCK(1), + DUALSENSE(2), + SWITCH(3), + XBOX_360(4), + XBOX(5), + STEAM_DECK(6), + STEAM_CONTROLLER(7), + OUYA(8); private final int id; private final Text text; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java index 1d0ead5..3c344bb 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsClient.java @@ -20,7 +20,6 @@ import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory; import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; 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.KeyBindingRegistryImplAccessor; import eu.midnightdust.midnightcontrols.client.ring.KeyBindingRingAction; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index bb2aae5..5cfd05d 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -16,6 +16,7 @@ import eu.midnightdust.midnightcontrols.MidnightControlsFeature; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; +import net.minecraft.client.MinecraftClient; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; @@ -23,13 +24,13 @@ import org.lwjgl.glfw.GLFW; import java.util.*; import java.util.regex.Pattern; -import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_LEFT_X; -import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y; +import static org.lwjgl.glfw.GLFW.*; /** * Represents MidnightControls configuration. */ public class MidnightControlsConfig extends MidnightConfig { + public static boolean isEditing = false; // 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; @@ -60,11 +61,12 @@ 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 = 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 = "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", "hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen"); @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[]{1, 1, 1, 1}; + @Entry public static boolean triggerFix = true; /** * Loads the configuration @@ -92,12 +94,23 @@ public class MidnightControlsConfig extends MidnightConfig { */ public static Controller getController() { var raw = MidnightControlsConfig.controllerID; + Controller controller = Controller.byId(GLFW.GLFW_JOYSTICK_1); if (raw instanceof Number) { - return Controller.byId(((Number) raw).intValue()); + controller = Controller.byId(((Number) raw).intValue()); } else if (raw instanceof String) { - return Controller.byGuid((String) raw).orElse(Controller.byId(GLFW.GLFW_JOYSTICK_1)); + controller = Controller.byGuid((String) raw).orElse(Controller.byId(GLFW.GLFW_JOYSTICK_1)); } - return Controller.byId(GLFW.GLFW_JOYSTICK_1); + if ((!controller.isConnected() || !controller.isGamepad()) && MidnightControlsConfig.autoSwitchMode && !isEditing) { + for (int i = 0; i < GLFW.GLFW_JOYSTICK_LAST; ++i) { + Controller gamepad = Controller.byId(i); + if (gamepad.isConnected() && gamepad.isGamepad()) { + controller = gamepad; + i = GLFW_JOYSTICK_LAST; + } + } + } + if (controller.isConnected() && controller.isGamepad() && MidnightControlsConfig.autoSwitchMode && !isEditing) MidnightControlsConfig.controlsMode = ControlsMode.CONTROLLER; + return controller; } /** diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 947627a..093dcb0 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -11,8 +11,8 @@ package eu.midnightdust.midnightcontrols.client; import com.google.common.collect.ImmutableSet; import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget; -import dev.lambdaurora.spruceui.widget.container.SpruceOptionListWidget; import eu.midnightdust.midnightcontrols.MidnightControls; +import eu.midnightdust.midnightcontrols.client.compat.EMICompat; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; @@ -31,7 +31,6 @@ import dev.lambdaurora.spruceui.widget.AbstractSprucePressableButtonWidget; import dev.lambdaurora.spruceui.widget.SpruceElement; import dev.lambdaurora.spruceui.widget.SpruceLabelWidget; import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget; -import net.fabricmc.fabric.impl.item.group.CreativeGuiExtensions; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; @@ -51,8 +50,6 @@ import net.minecraft.client.gui.widget.EntryListWidget; import net.minecraft.client.gui.widget.PressableWidget; import net.minecraft.client.gui.widget.SliderWidget; import net.minecraft.screen.slot.Slot; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; import org.aperlambda.lambdacommon.utils.Pair; import org.jetbrains.annotations.NotNull; @@ -129,6 +126,7 @@ public class MidnightInput { InputManager.updateStates(); var controller = MidnightControlsConfig.getController(); + if (controller.isConnected()) { var state = controller.getState(); this.fetchButtonInput(client, state, false); @@ -141,10 +139,7 @@ public class MidnightInput { this.fetchAxeInput(client, state, true); }); - boolean allowInput = true; - - if (this.controlsInput != null && this.controlsInput.focusedBinding != null) - allowInput = false; + boolean allowInput = this.controlsInput == null || this.controlsInput.focusedBinding == null; if (allowInput) InputManager.updateBindings(client); @@ -194,7 +189,7 @@ public class MidnightInput { float rotationPitch = (float) (player.prevPitch + (this.targetPitch / 0.10) * tickDelta); client.player.setYaw(rotationYaw); client.player.setPitch(MathHelper.clamp(rotationPitch, -90.f, 90.f)); - if (client.player.isRiding()) { + if (client.player.isRiding() && client.player.getVehicle() != null) { client.player.getVehicle().onPassengerLookAround(client.player); } client.getTutorialManager().onUpdateMouse(this.targetPitch, this.targetYaw); @@ -322,7 +317,7 @@ public class MidnightInput { if (button == GLFW.GLFW_GAMEPAD_BUTTON_A && client.currentScreen != null && !isScreenInteractive(client.currentScreen) && this.actionGuiCooldown == 0) { - if (client.currentScreen instanceof CreativeInventoryScreen creativeScreen && ((HandledScreenAccessor) creativeScreen).midnightcontrols$getSlotAt( + if (client.currentScreen instanceof HandledScreen handledScreen && ((HandledScreenAccessor) handledScreen).midnightcontrols$getSlotAt( client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(), client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()) != null) return; if (!this.ignoreNextARelease) { @@ -335,7 +330,7 @@ public class MidnightInput { Screen.wrapScreenError(() -> client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1), "mouseReleased event handler", client.currentScreen.getClass().getCanonicalName()); } - this.actionGuiCooldown = 5; + //this.actionGuiCooldown = 5; } else { this.ignoreNextARelease = false; } @@ -371,11 +366,24 @@ public class MidnightInput { private void handleAxe(@NotNull MinecraftClient client, int axis, float value, float absValue, int state) { int asButtonState = value > .5f ? 1 : (value < -.5f ? 2 : 0); + if (axis == GLFW_GAMEPAD_AXIS_LEFT_TRIGGER || axis == GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER || axis == ButtonBinding.controller2Button(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER) - || axis == ButtonBinding.controller2Button(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER)) - if (asButtonState == 2) + || axis == ButtonBinding.controller2Button(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER)) { + if (asButtonState == 2) { asButtonState = 0; + } + else { + // Fixes Triggers not working correctly on some controllers + if (MidnightControlsConfig.triggerFix) { + value = 1.0f; + absValue = 1.0f; + state = 1; + asButtonState = 1; + } + if (MidnightControlsConfig.debug) System.out.println(axis + " "+ value + " " + absValue + " " + state); + } + } { boolean currentPlusState = asButtonState == 1; @@ -463,19 +471,20 @@ public class MidnightInput { } } else if (client.currentScreen != null) { if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone) { + float finalValue = value; client.currentScreen.children().stream().filter(element -> element instanceof EntryListWidget) .map(element -> (EntryListWidget) element) .filter(element -> element.getType().isFocused()) .anyMatch(element -> { - element.mouseScrolled(0.0, 0.0, -value); + element.mouseScrolled(0.0, 0.0, -finalValue); return true; }); client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget) .map(element -> (SpruceEntryListWidget) element) .filter(element -> element.getType().isFocused()) .anyMatch(element -> { - MidnightControls.get().log(String.valueOf(value)); - element.mouseScrolled(0.0, 0.0, -value); + MidnightControls.get().log(String.valueOf(finalValue)); + element.mouseScrolled(0.0, 0.0, -finalValue); return true; }); return; @@ -653,23 +662,28 @@ public class MidnightInput { } private boolean changeFocus(@NotNull Screen screen, NavigationDirection direction) { - if (screen instanceof SpruceScreen spruceScreen) { - if (spruceScreen.onNavigation(direction, false)) { - this.actionGuiCooldown = 5; + if (!isScreenInteractive(screen) && !screen.getClass().getCanonicalName().contains("me.jellysquid.mods.sodium.client.gui")) return false; + try { + if (screen instanceof SpruceScreen spruceScreen) { + if (spruceScreen.onNavigation(direction, false)) { + this.actionGuiCooldown = 5; + } + return false; } - return false; - } - if (FabricLoader.getInstance().isModLoaded("sodium")) SodiumCompat.handleInput(screen, direction.isLookingForward()); - if (!screen.changeFocus(direction.isLookingForward())) { - if (screen.changeFocus(direction.isLookingForward())) { + if (FabricLoader.getInstance().isModLoaded("sodium")) + SodiumCompat.handleInput(screen, direction.isLookingForward()); + if (!screen.changeFocus(direction.isLookingForward())) { + if (screen.changeFocus(direction.isLookingForward())) { + this.actionGuiCooldown = 5; + return false; + } + return true; + } else { this.actionGuiCooldown = 5; return false; } - return true; - } else { - this.actionGuiCooldown = 5; - return false; - } + } catch (Exception exception) {MidnightControls.get().warn("Unknown exception encountered while trying to change focus: "+exception);} + return false; } public static boolean isScreenInteractive(@NotNull Screen screen) { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EMICompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EMICompat.java new file mode 100644 index 0000000..cf9706f --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EMICompat.java @@ -0,0 +1,41 @@ +package eu.midnightdust.midnightcontrols.client.compat; + +import dev.emi.emi.screen.EmiScreen; +import dev.emi.emi.screen.EmiScreenManager; +import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; +import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; +import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory; +import eu.midnightdust.midnightcontrols.client.controller.InputManager; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import org.aperlambda.lambdacommon.Identifier; +import org.jetbrains.annotations.NotNull; +import org.lwjgl.glfw.GLFW; + +public class EMICompat implements CompatHandler { + public static boolean handleTabs(boolean direction) { + if (MidnightControlsClient.get().input.actionGuiCooldown == 0 &&EmiScreenManager.searchLeft != null && EmiScreenManager.searchRight != null) { + if (direction) EmiScreenManager.searchRight.onPress(); + else EmiScreenManager.searchLeft.onPress(); + MidnightControlsClient.get().input.actionGuiCooldown = 5; + return true; + } + return false; + } + @Override + public void handle(@NotNull MidnightControlsClient mod) { + ButtonCategory category = new ButtonCategory(new Identifier("midnightcontrols","category.emi")); + InputManager.registerCategory(category); + new ButtonBinding.Builder("emi_page_left") + .buttons(GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true)) + .category(category) + .action((client,action,value,buttonState)->handleTabs(false)).cooldown() + .filter(((client, buttonBinding) -> client.currentScreen instanceof HandledScreen || client.currentScreen instanceof EmiScreen)) + .register(); + new ButtonBinding.Builder("emi_page_right") + .buttons(GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, ButtonBinding.axisAsButton(GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, true)) + .category(category) + .action((client,action,value,buttonState)->handleTabs(true)).cooldown() + .filter(((client, buttonBinding) -> client.currentScreen instanceof HandledScreen || client.currentScreen instanceof EmiScreen)) + .register(); + } +} 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 f646a86..caf70a8 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/MidnightControlsCompat.java @@ -45,10 +45,10 @@ public class MidnightControlsCompat { mod.log("Adding Ok Zoomer compatibility..."); HANDLERS.add(new OkZoomerCompat()); } - /*if (isReiPresent()) { - mod.log("Adding REI compatiblity..."); - HANDLERS.add(new ReiCompat()); - }*/ + if (isEMIPresent()) { + mod.log("Adding EMI compatibility..."); + HANDLERS.add(new EMICompat()); + } if (FabricLoader.getInstance().isModLoaded("hardcorequesting") && LambdaReflection.doesClassExist(HQMCompat.GUI_BASE_CLASS_PATH)) { mod.log("Adding HQM compatibility..."); HANDLERS.add(new HQMCompat()); 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 c082ed4..7964921 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/SodiumCompat.java @@ -22,8 +22,10 @@ public class SodiumCompat { i = (direction ? ((max > i) ? ++i : 0) : (i > 0 ? --i : max)); var dimensions = accessor.getControls().get(i).getDimensions(); - InputManager.INPUT_MANAGER.targetMouseX = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterX()); - InputManager.INPUT_MANAGER.targetMouseY = (int) (client.getWindow().getScaleFactor() * dimensions.getCenterY()); + 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()); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java index 0c8e59f..9dfe509 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/ButtonBinding.java @@ -62,6 +62,9 @@ public class ButtonBinding { .action(MovementHandler.HANDLER).onlyInGame().register(); public static final ButtonBinding SCREENSHOT = new Builder("screenshot").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_A) .action(InputHandlers::handleScreenshot).cooldown().register(); + + public static final ButtonBinding DEBUG_SCREEN = new Builder("debug_screen").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_B) + .action((client,binding,value,action) -> {if (action == ButtonState.PRESS) client.options.debugEnabled = !client.options.debugEnabled; return true;}).cooldown().register(); public static final ButtonBinding SLOT_DOWN = new Builder("slot_down").buttons(GLFW_GAMEPAD_BUTTON_DPAD_DOWN) .action(InputHandlers.handleInventorySlotPad(1)).onlyInInventory().cooldown().register(); public static final ButtonBinding SLOT_LEFT = new Builder("slot_left").buttons(GLFW_GAMEPAD_BUTTON_DPAD_LEFT) @@ -89,7 +92,7 @@ public class ButtonBinding { .action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register(); public static final ButtonBinding QUICK_MOVE = new Builder("quick_move").buttons(GLFW_GAMEPAD_BUTTON_Y) .action(InputHandlers.handleActions()).filter(InputHandlers::inInventory).cooldown().register(); - public static final ButtonBinding TOGGLE_PERSPECTIVE = new Builder("toggle_perspective").buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_Y).cooldown().register(); + public static final ButtonBinding TOGGLE_PERSPECTIVE = new Builder("toggle_perspective").filter(InputHandlers::inGame).buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP, GLFW_GAMEPAD_BUTTON_Y).cooldown().register(); public static final ButtonBinding USE = new Builder("use").buttons(axisAsButton(GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, true)).register(); private int[] button; @@ -387,18 +390,26 @@ public class ButtonBinding { ButtonBinding.HOTBAR_RIGHT, ButtonBinding.INVENTORY, ButtonBinding.SWAP_HANDS, + ButtonBinding.TAB_LEFT, + ButtonBinding.TAB_RIGHT, ButtonBinding.PAGE_LEFT, ButtonBinding.PAGE_RIGHT, ButtonBinding.TAKE, ButtonBinding.TAKE_ALL, - ButtonBinding.QUICK_MOVE + ButtonBinding.QUICK_MOVE, + ButtonBinding.SLOT_UP, + ButtonBinding.SLOT_DOWN, + ButtonBinding.SLOT_LEFT, + ButtonBinding.SLOT_RIGHT )); MULTIPLAYER_CATEGORY = InputManager.registerDefaultCategory("key.categories.multiplayer", category -> category.registerAllBindings(ButtonBinding.CHAT, ButtonBinding.PLAYER_LIST)); MISC_CATEGORY = InputManager.registerDefaultCategory("key.categories.misc", category -> category.registerAllBindings( ButtonBinding.SCREENSHOT, + ButtonBinding.TOGGLE_PERSPECTIVE, + ButtonBinding.PAUSE_GAME, //SMOOTH_CAMERA, - ButtonBinding.TOGGLE_PERSPECTIVE + ButtonBinding.DEBUG_SCREEN )); } 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 8e6e881..4885c4e 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -9,23 +9,28 @@ package eu.midnightdust.midnightcontrols.client.controller; +import com.google.common.collect.ImmutableSet; import eu.midnightdust.midnightcontrols.client.ButtonState; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; import eu.midnightdust.midnightcontrols.client.MidnightInput; +import eu.midnightdust.midnightcontrols.client.compat.EMICompat; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat; 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.util.HandledScreenAccessor; +import eu.midnightdust.midnightcontrols.client.util.MouseAccessor; import net.fabricmc.fabric.impl.item.group.CreativeGuiExtensions; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; +import net.minecraft.client.gui.hud.DebugHud; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.ingame.InventoryScreen; +import net.minecraft.client.gui.widget.PressableWidget; import net.minecraft.client.util.ScreenshotRecorder; import net.minecraft.item.ItemGroup; import net.minecraft.item.Items; @@ -118,9 +123,27 @@ public class InputHandlers { var screen = (HandledScreenAccessor) client.currentScreen; try { if (next) { - ((CreativeGuiExtensions) screen).fabric_nextPage(); + 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 { - ((CreativeGuiExtensions) screen).fabric_previousPage(); + 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; + }); } } catch (Exception ignored) {} } @@ -144,6 +167,7 @@ public class InputHandlers { int slotId; if (slot == null) { if (button.getName().equals("take_all")) { + ((MouseAccessor) client.mouse).setLeftButtonClicked(true); return false; } slotId = accessor.midnightcontrols$isClickOutsideBounds(x, y, accessor.getX(), accessor.getY(), GLFW_MOUSE_BUTTON_1) ? -999 : -1; @@ -155,24 +179,21 @@ public class InputHandlers { MidnightControlsClient.get().input.inventoryInteractionCooldown = 5; switch (button.getName()) { - case "take_all": - if (accessor instanceof CreativeInventoryScreen) { - if (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot)) + 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; - 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": + } + case "take": { clickData = GLFW_MOUSE_BUTTON_2; break; - case "quick_move": + } + case "quick_move": { actionType = SlotActionType.QUICK_MOVE; break; + } default: return false; } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputManager.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputManager.java index 9b8ce30..0acfbbc 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputManager.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputManager.java @@ -51,6 +51,10 @@ public class InputManager { } public void tick(@NotNull MinecraftClient client) { + if (MidnightControlsConfig.autoSwitchMode && !MidnightControlsConfig.isEditing && MidnightControlsConfig.controlsMode != ControlsMode.TOUCHSCREEN) + if (MidnightControlsConfig.getController().isConnected() && MidnightControlsConfig.getController().isGamepad()) + MidnightControlsConfig.controlsMode = ControlsMode.CONTROLLER; + else MidnightControlsConfig.controlsMode = ControlsMode.DEFAULT; if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) { this.controllerTick(client); } 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 1263049..d27bbbc 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.getWindow().getScaleFactor() >= 4) { - scale = (float) (0.75f * (client.getWindow().getScaleFactor()-3)); + if (client.options.getGuiScale().getValue() >= 4) { + scale = 0.75f; } else scale = 1f; } 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 4b3b8d5..22ef957 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -154,6 +154,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { public MidnightControlsSettingsScreen(Screen parent, boolean hideControls) { super(Text.translatable("midnightcontrols.title.settings")); + MidnightControlsConfig.isEditing = true; this.parent = parent; // General options this.inputModeOption = new SpruceCyclingOption("midnightcontrols.menu.controls_mode", @@ -248,12 +249,14 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { @Override public void removed() { + MidnightControlsConfig.isEditing = false; MidnightControlsConfig.save(); super.removed(); } @Override public void close() { + MidnightControlsConfig.isEditing = false; MidnightControlsConfig.save(); super.close(); } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ControlsOptionsScreenMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ControlsOptionsScreenMixin.java index c8e50e0..1a8daa5 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ControlsOptionsScreenMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ControlsOptionsScreenMixin.java @@ -9,14 +9,18 @@ package eu.midnightdust.midnightcontrols.client.mixin; +import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget; import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.option.ControlsOptionsScreen; import net.minecraft.client.gui.screen.option.GameOptionsScreen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.option.GameOptions; import net.minecraft.text.Text; +import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -26,16 +30,27 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; */ @Mixin(ControlsOptionsScreen.class) public abstract class ControlsOptionsScreenMixin extends GameOptionsScreen { + @Unique private final boolean showAlternativeButton = FabricLoader.getInstance().isModLoaded("crawl"); public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text text) { super(parent, gameOptions, text); } + @Inject(method = "init", at = @At(value = "INVOKE", ordinal = 1, shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/option/ControlsOptionsScreen;addDrawableChild(Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;")) + private void addAlternativeControllerButton(CallbackInfo ci) { + if (showAlternativeButton) { + this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 + 158, this.height / 6 - 12, 20, 20,0,0,20, new Identifier("midnightcontrols", "textures/gui/midnightcontrols_button.png"), 32, 64, (button) -> { + this.client.setScreen(new MidnightControlsSettingsScreen(this, false)); + }, Text.translatable("midnightcontrols.menu.title.controller"))); + } + } @Inject(method = "init", at = @At(value = "INVOKE", ordinal = 4, shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/option/ControlsOptionsScreen;addDrawableChild(Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;")) private void addControllerButton(CallbackInfo ci) { - int i = this.width / 2 - 155; - int j = i + 160; - int k = this.height / 6 - 12 + 48;; - this.addDrawableChild(new ButtonWidget(j, k, 150, 20, Text.translatable("midnightcontrols.menu.title.controller").append("..."), (button) -> { - this.client.setScreen(new MidnightControlsSettingsScreen(this, false)); - })); + if (!showAlternativeButton) { + int i = this.width / 2 - 155; + int j = i + 160; + int k = this.height / 6 - 12 + 48; + this.addDrawableChild(new ButtonWidget(j, k, 150, 20, Text.translatable("midnightcontrols.menu.title.controller").append("..."), (button) -> { + this.client.setScreen(new MidnightControlsSettingsScreen(this, false)); + })); + } } } 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 eea2062..619233a 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/HandledScreenMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/HandledScreenMixin.java @@ -59,8 +59,8 @@ 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(); - if (client.getWindow().getScaleFactor() >= 4) { - scale = (float) (0.75f * (client.getWindow().getScaleFactor()-3)); + if (client.options.getGuiScale().getValue() >= 4) { + scale = 0.75f; } 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); @@ -74,7 +74,9 @@ public abstract class HandledScreenMixin implements HandledScreenAccessor { y -= 24; } 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 = (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); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java index b541eb4..068d199 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MinecraftClientMixin.java @@ -109,7 +109,11 @@ public abstract class MinecraftClientMixin { } this.midnightcontrols$lastPos = this.player.getPos(); } - // Applied three times for smooth camera turning even on low FPS + // Applied multiple times for smooth camera turning even on low FPS + @Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;startTick()V", shift = At.Shift.BEFORE)) + private void onPrePreRender(CallbackInfo ci) { + MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this)); + } @Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Recorder;startTick()V", shift = At.Shift.AFTER)) private void onPreRender(CallbackInfo ci) { MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this)); @@ -122,6 +126,10 @@ public abstract class MinecraftClientMixin { private void onPostRender(CallbackInfo ci) { MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this)); } + @Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;endTick()V", shift = At.Shift.AFTER)) + private void onPostPostRender(CallbackInfo ci) { + MidnightControlsClient.get().onRender((MinecraftClient) (Object) (this)); + } @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V", shift = At.Shift.AFTER)) private void renderVirtualCursor(boolean fullRender, CallbackInfo ci) { diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MouseMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MouseMixin.java index 3e014d6..211f002 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MouseMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/MouseMixin.java @@ -20,6 +20,7 @@ import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -35,6 +36,9 @@ public abstract class MouseMixin implements MouseAccessor { @Final private MinecraftClient client; + @Accessor + public abstract void setLeftButtonClicked(boolean value); + @Invoker("onCursorPos") public abstract void midnightcontrols$onCursorPos(long window, double x, double y); diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/util/MouseAccessor.java b/src/main/java/eu/midnightdust/midnightcontrols/client/util/MouseAccessor.java index 9b97031..0b6e004 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/util/MouseAccessor.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/util/MouseAccessor.java @@ -14,4 +14,5 @@ package eu.midnightdust.midnightcontrols.client.util; */ public interface MouseAccessor { void midnightcontrols$onCursorPos(long window, double x, double y); + void setLeftButtonClicked(boolean value); } diff --git a/src/main/resources/assets/midnightcontrols/lang/de_de.json b/src/main/resources/assets/midnightcontrols/lang/de_de.json index 2899547..39622d0 100644 --- a/src/main/resources/assets/midnightcontrols/lang/de_de.json +++ b/src/main/resources/assets/midnightcontrols/lang/de_de.json @@ -83,7 +83,7 @@ "midnightcontrols.controller_type.ouya": "OUYA", "midnightcontrols.controls_mode.default": "Tastatur/Maus", "midnightcontrols.controls_mode.controller": "Controller", - "midnightcontrols.controls_mode.touchscreen": "Touchscreen", + "midnightcontrols.controls_mode.touchscreen": "Touchscreen (In Arbeit)", "midnightcontrols.hud_side.left": "links", "midnightcontrols.hud_side.right": "rechts", "midnightcontrols.menu.analog_movement": "Analoge Bewegung", diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index bba5d1c..b9ca512 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -8,6 +8,7 @@ "midnightcontrols.action.attack": "Attack", "midnightcontrols.action.back": "Back", "midnightcontrols.action.chat": "Open Chat", + "midnightcontrols.action.debug_screen": "Open Debug HUD (F3)", "midnightcontrols.action.drop_item": "Drop Item", "midnightcontrols.action.exit": "Exit", "midnightcontrols.action.forward": "Forward", @@ -26,6 +27,10 @@ "midnightcontrols.action.quick_move": "Quick move", "midnightcontrols.action.right": "Right", "midnightcontrols.action.screenshot": "Take Screenshot", + "midnightcontrols.action.slot_up": "Move Slot up", + "midnightcontrols.action.slot_down": "Move Slot down", + "midnightcontrols.action.slot_left": "Move Slot left", + "midnightcontrols.action.slot_right": "Move Slot right", "midnightcontrols.action.sneak": "Sneak", "midnightcontrols.action.sprint": "Sprint", "midnightcontrols.action.swap_hands": "Swap Hands", @@ -33,6 +38,8 @@ "midnightcontrols.action.toggle_smooth_camera": "Toggle Cinematic Camera", "midnightcontrols.action.page_back": "Previous Page", "midnightcontrols.action.page_next": "Next Page", + "midnightcontrols.action.tab_back": "Previous Tab", + "midnightcontrols.action.tab_next": "Next Tab", "midnightcontrols.action.take": "Take Item", "midnightcontrols.action.take_all": "Take Stack", "midnightcontrols.action.use": "Use", @@ -40,8 +47,9 @@ "midnightcontrols.action.zoom_in": "Increase Zoom", "midnightcontrols.action.zoom_out": "Decrease Zoom", "midnightcontrols.action.zoom_reset": "Reset Zoom", - "midnightcontrols.action.key.emotecraft.fastchoose": "Fast Choose Emote", - "midnightcontrols.action.key.emotecraft.stop": "Stop Emote", + "midnightcontrols.action.emi_page_left": "Previous Page", + "midnightcontrols.action.emi_page_right": "Next Page", + "midnightcontrols.category.emi": "EMI", "midnightcontrols.button.a": "A", "midnightcontrols.button.b": "B", "midnightcontrols.button.x": "X", @@ -79,15 +87,18 @@ "midnightcontrols.controller.mappings.error": "Error while loading mappings.", "midnightcontrols.controller.mappings.error.write": "Error while writing mappings to file.", "midnightcontrols.controller.mappings.updated": "Updated mappings!", - "midnightcontrols.controller_type.default": "default", + "midnightcontrols.controller_type.default": "Default", "midnightcontrols.controller_type.dualshock": "DualShock", + "midnightcontrols.controller_type.dualsense": "DualSense", "midnightcontrols.controller_type.switch": "Switch", "midnightcontrols.controller_type.xbox": "Xbox", - "midnightcontrols.controller_type.steam": "Steam", + "midnightcontrols.controller_type.xbox_360": "Xbox 360", + "midnightcontrols.controller_type.steam_controller": "Steam Controller", + "midnightcontrols.controller_type.steam_deck": "Steam Deck", "midnightcontrols.controller_type.ouya": "OUYA", "midnightcontrols.controls_mode.default": "Keyboard/Mouse", "midnightcontrols.controls_mode.controller": "Controller", - "midnightcontrols.controls_mode.touchscreen": "Touchscreen", + "midnightcontrols.controls_mode.touchscreen": "Touchscreen (WIP)", "midnightcontrols.hud_side.left": "left", "midnightcontrols.hud_side.right": "right", "midnightcontrols.menu.analog_movement": "Analog Movement", diff --git a/src/main/resources/assets/midnightcontrols/textures/gui/midnightcontrols_button.png b/src/main/resources/assets/midnightcontrols/textures/gui/midnightcontrols_button.png new file mode 100644 index 0000000000000000000000000000000000000000..4d35fd2d3a8a2fbea366879e2dc3aca8562a1e1b GIT binary patch literal 10059 zcmeHsXHb(}*KR^pq=_I1h>;>SkdROk2puU3f}m7|KoSTo^diLoN);(e2SE`jB2uJD zM*-1*^xmX5DM}LrPVnjTy)$Rtne&}r&pngmzE`>STGw8CC2JC{r>nt0$4LhO02s71 z)vl92i2wi)aDs+>=ldfd2LPbIc*oG#{W{tU z^&xu;X;-`Zi7#3fu{bbI7|(E>-T!{*Tiv{qxcub+?s}EG$4$v!;mGsWxS%)pC7aoI zYPT|E`j?|(FSHIS>TH?|RjJ3G@zsStIg`CxdGYhfIcqbc^R@n?O~cVywT{J#({a|@%pPc;&d2r)Jiyw;z1j{ZL zgYSt<2l{WuJDTQgXLtSh{as!C6$5-wnm>>t70ZeRY5Tq@HRd+^+X)&H<2yTu{?D~G zo=~^uzOAafidUmH@)gESiL1b#r9N-=7q&b0>r0q27OCn@(;CANwI&b#$hOCP`wIC& zm*y%}9n#+C-uoo6-8&Vwbo$DWg{##SK9eOi!?mJ$)(OX0-ys)#rO|SMLsOQ1(p7nh zx_!Ed^UekZegk7u4GI)9UdnlH4xs(Z;W97mNTo%*dC`Xp55E6Es;e^u`A5(AI=Y+ za>$$Q)PDJ@Z2WR6YHRe$>)NexjSRkrRJIBF8eIMlpn~?gxF-*u$V28ML|@ft8+(-X z4Hz3}U1&FbW7kutnxlS&CcwB1Hx|+kPBk3%NxbDX;vbD-%JaM~`{S{}HMxTau!*co zpGyvY?p^MkIalVb@$rJgn*Ow%J;5OCoz_OuX^62}nD=+)n9eS1Pmealof&!DK$xL= zIERTm?h+4_H>u*i>kQcQq5|(y?7o@HDRBLJ@FCo_QFW*N!vSZ->t{G!)jJw1`uA6R zMfLqhC;VF!(pLfyAxECmiPI%X+c)fG&dRm6i7bgp?Ig)1`|pvi1lEhF`ske!uN*EM z7{B$X+9TMZqf$*J>soQ#>WvppUTHe7N;NGL%ihK%y(n+V?c8>1UBYTFt{R3?40F*J zs_vOfYK+)f^IX2=)?PA@B$brk6X0l$KmWL3$l#J-z6G)+iKi=J+gc8bH}m_xQX%GO zhz{ss@zghXqk(Kwlk!@(*%VNhm=K<+d0q3J`CA5wla}xCrzDx9II*)9x6x>=&4%V&KTJX2fi?r!g}!d&E4s@A6U#mWzR#ZTrJTKB3@EiWpX zX@i5K>x{fQ?p#=Vx$o`zeY|mGPodSCa_8GLUf~**&RV~P5m%LaNb=XPG5E1?NhQ4WWXI7kRHF#_Y3!mE-O` z{&2!!WjX()S$?zSj-&8L+4~YDpHjL%uH3owL%%#$yTOX^Dk0oauuWKbzMrx)w_39_ zW(Ov7eF&4Tp5Ai1yaS;ZH}C{vVQ-v)S}QX%DvAu`j5vufb|;L1apvVD(dzZJNNdDU zu%?4g`9tud^hBts9ymEWP~EAo@VyOCMX#hw!H0Zo6W7pEQ-_VR7q2T zD&6VvT|m{d%xUgwb_{|Z1$`}*NqKW>3V^|V-cVk&Lg1!4pI*B`F}tO>Gu_MR%1B3$ zYC~g6CKkk$JI)~;@sVe2LX9D@HI{NzI;?KcHfqHM`#2$}V8*`b9M`)&l~BE6x4?>? zAqq&f^kLAW^#~SX(Ojo*_8VbPjI@uN5{RDLL5V%t5XjvmUH#Prx%KJ66aAZeD{KvM zl?x9U0|2ijYO$wB?L_Hfc=kQ3^0|Cr`!^`$k&OM+hEWW|jSZvKdX<8cLnf_*Y)r4x z=*5~@Kt5c~RIgw4Bs4jcC$I-v9z-?HNI@0y66Xq7%#90I`g|y{)7wu$;Tv=A< z1g(AYivBDG*%O+U2p z)ZJx3|LjB-mikn@Aw5dtTkv&*@`Cetwj9yS)F#pRf%&HeXOgF{JpIaQ2OT(1aaKG~ zOzt^7uGQXGeH-J8w@BqwShD?mNkqHn4CaSajBe(UgTmvIk8g9Ux|q#psUTNBwzQtd z(})ZiV>@RzuqRl;1%9TTrDtNDs|#cbn^m&8y~VhAJnb1fyyn9wpAk?PY6e0 zXK5x*<&;Xj4ZT;V;#8^gBV_ggWzhmhAZM;= zZD!P~*L*iU%{Lb@`0-Nv*`@Rr_ZFP z`m?aks4{?sv$$mTS=ZX92*xri4^i;iaOvqo_w1nsskZmYx1<}x4ddOQuW0b^SQnhH zoUqv>Tz(&K!_bs;JD3u6-c_EhBBmEGsqUBX@)Ypnf@#^fqQF#?AQiw`w`@0z2oP>!&_P;DrE!iLk2*clg=1&&E9o zs8;`0l676ikHuj5=}okSSgKJqO%Oai@MZ?J1qcfxQtVzBR#*roJ~!5OaRQ#a_MY9h z!QO^h>Q+QZZKqNX@_?VC@~0ppr$;Y!ymF{k#Zb!)LAMvJT{<^8C^EM#6Z z)0=IJy-juF3XkmN{b)Ao-nRv0L!b+l`?jYagBaT)qyAPj6?^+PGah&p)%F`K{thvT*!)79&Ajl)N81z2c+(9{vb&y7EH2YhT*T-XzE6`sitinZq9>I78>tSj!0y}FUYu@m=9 zICH+)MIj_`UA)sywqvJw`i(Ae66T!k^^;4-a_`aRWsNJ`z+%VAskd3ez74aCkaf(5 z7c1JzDJpqXH5pwpY{Ww|P|4C(|9I;nWlUC~q)bEOMacCRD^eL=JDxk+YssE>75Ri+ zLqlDM^~f`wH=aDZ8S7j{S`!?_(HMdiR@~dsnLOJ80P>37&S-0UtUJgGYlC+}@vc?Z z^Mddg6t9t#4n)UU6>E#vyyJ>BxT9-meaGG!f#FqDpp*ATk^vmC?r4y=ql1$h(i_G5 z3l~YgKNd^yf_|B}+oO1mb@V{01XnBwE)ExmfYrV6o|3!@bRcxYyo!jadJm{gPq*?jv;=-P{X=eyW*YQ z@dPK(F(%rI;Ngzqvj*b$4_i%Gp_auY- z9?*aEa5E&2z!KN7ZUhfkYpl8_*2$gk?+_U4KmDCOTpfO;gRz#tI$#~irf%d_q5oJ? zLrX{RPmf~?Z19fGzr4s~|HIN9kNbYqnlL5=((AHpCn5+y2XN8uPk%s+(!dN3O z6I>n9eqHVAe&Q3PJ6vu=kmG!hxyprOOza)ANXm=dh0mXY2@8seAm%CW4{|O@ zRaY$9o#1LnAUL3Sk3#|-d;Y1`As;6U+8wQicE^%IA(E0vhzt?}H z{$@|W;Bh|xH|yiW1Csx3%Qf+C3D!2dc*AkeQvfka#XmVz7F z6N~v3CmHKEm9;I}$p%aA9>16CA9DPECTJ4IXiAU|BKh}d-1=x0vY<>MgA*( z|E23+y8bH${ww2utLtC7{woIlE8~Bw>;D;DbbpOgSSRwYATRQ;XE<4k>J9ZM1B( zKv4zNw2}_(aIGwU_1CQdcN>|2?Mg9?W5`JfB@H6{5=FFtkj5awXd%9W%JxC&RZ+c_ zG}zbf1ABnicJY8Z$)UPpz7~zMVG-LYg~wwJf;Q#a9fB%I(R)H`=@GU^GJEAzT&3+K z@yODjic?~8iaOXIMH+9pNDfg(37)Y1VSD#@~6)| zyH$L93=jphqRnDYTP~|{QR21lqkLXo>_%MPGsZ+Ew}+LE_cSEIx0Fz`n;W-Y?hvxP z!n82~(zgXaY!!FVXUb~H)Q^x9D5Qbe4HT0>vY!g2OLajk&p*-5Z9+d650J*Goiw}k zL~5Z;3R@fgI{>Dkb&q;RVB1(ih#yzr0dVK%T9b+tv2N#(#S+&bKSIpwsA_8<^yr0# zc`YFxEeK3fH{>YvytT_*GvlxuJ8H)-;FhhstA!aB4+=HTX?Pzg%)@HQQS*EH5^ETN z1iV^q|=;mZXI@h4o=VH8eK&FLeXt}-MP4wp4cI+z5rMoTq zhi`N=oGG6+jKB*SChTu)e{A7z{dSnY;4waLZbrI$@Yt&+IjSRprZdBbNDcgk_)L-p zj0EE5M=#W%+(p(!K}^O=d}A3&Lzwx|I-Xi30Z8KN0QH`=!g|5p!7A6*0X*G4$CtUX zl@!pKRp3@z9eZG!2zK!hrcu0L`)#{7(=<@Oqv|ZoEa3&}RZptN&u%%x_EX0FXERBN zfjk;!M}Uzpm+UP&BB~)uEhmCD%cP@fjFVCgtm{_C-m~wzVp)1(@D&eem~w^s1=R-| z0cRX>Ie|$&`iRTI3ptOo@u!58iex;3-+F}Vs5*I$v(kxLoXL5~^vO)Gl;|ALi9V?{ z^<2S(J<#hRS`nP4O=-*miDs8Ht~a76taq=JAsR9Q%ZL-=HD`oeI_|^VPdGOSvnUFs zY&tX}WWXc7L@2O(A}()|()-$e4Ld0O zu^7!;^W8on#Rc>+F z+iMLfzv|^^uvk}Bf=&85d%3P@*&UfgdKkmo2REl#rN(#Er|FXGoJF3FjuYy`-POGL z6!*G|M(y29)*Bf%BD&~UeF+?&kX69`TjNISsnOD1-bH~wODH}H-iUdW(PN(+ylkIW z{aXA|rns_d*ag4u2^kOqH+K3?{k_rIdqP!NF)cQx=gKm9_4Q8$$`PgP00(Y_(I*$J z{J!nCryWk`IVo4KM2en6l;!X9a27W-Dkj=gJi#8}n;0C^6qn@#e(qGI`M-$@>ZTC0 z@+*D$B&gdj|B{zIbA4Ms4KrQQ>ZbRFRbP9;>q)L6$KkWXW+T2bNtumnv9}HUPpw@W zYMHy@_3g*ogUT3dH4|V*V9i2ctMULPjmqHZeO*||+q9oeHJIinQ)weP!gY0A4XV<9W3N?}Tq~&C-;}<3w4Ur7 z$AjQIyTshNGj2fvXU5P~^$dFN)4r+Wo_l6=3HG%-59rIEJLY%q^=+iu_aoDD`;j7b z6}c(hUCnjFm-MF6PA$VBbv{%zp_y5)g8LKS5wjMR+$QP#Hu@D5sy*%w95Fe_e+=}E zmfY!CgE{s49O#JCR&wv^g%WrDGDOlH;=wk4bDiXexT%Kl^{loYa z-^=LAO>Q zIc`p#{W1X9ONxiIANZ{2`*7v)3#2C#umRV3bL;ZYl%pJw=&R${@1_mu)5BlJDW7)( z5~xVi_v!oB;)%-=eHR-F&aRK#x7l1uk@5GBc+V7Z$zVDyHQ_6&AqlWZXq(Btv4+ps zq2PzEygo^G=9CdymRK($b?|bZBxrDWP)D2Qs5#d9KT5@e<2H;C)U@RFP-V(QaIFJn&`M z_@rdyf@)!CEpWo1fo9%Zt-2=c|Nr#?^zE+Ci*56}SX2@DXFEVkU01D8#WLvs05K?E AF#rGn literal 0 HcmV?d00001