diff --git a/build.gradle b/build.gradle index b7e2e1a..343bec3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '0.12-SNAPSHOT' + id 'fabric-loom' version '1.0-SNAPSHOT' id 'java-library' id 'maven-publish' id 'com.github.johnrengelman.shadow' version '7.0.0' @@ -32,7 +32,7 @@ boolean isMCVersionNonRelease() { } String getMCVersionString() { - if (isMCVersionNonRelease()) { + if (isMCVersionNonRelease() || project.minecraft_version == "1.19.3") { return project.minecraft_version } def version = project.minecraft_version.split('\\.') @@ -113,7 +113,7 @@ dependencies { modCompileOnlyApi "io.github.cottonmc:LibGui:${project.libgui_version}" modCompileOnlyApi "org.quiltmc:quilt-json5:1.0.0" modCompileOnly "maven.modrinth:sodium:${project.sodium_version}" - modCompileOnlyApi "maven.modrinth:emi:${project.emi_version}" + modImplementation "maven.modrinth:emi:${project.emi_version}" modCompileOnlyApi "maven.modrinth:emotecraft:${project.emotecraft_version}" modCompileOnlyApi "io.github.kosmx:bendy-lib:${project.bendylib_version}" modCompileOnlyApi "dev.isxander:yet-another-config-lib:${project.yacl_version}" diff --git a/gradle.properties b/gradle.properties index 871f9bc..c928629 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=22w43a -yarn_mappings=22w43a+build.4 -loader_version=0.14.10 +minecraft_version=1.19.3 +yarn_mappings=1.19.3+build.2 +loader_version=0.14.11 # Mod Properties -mod_version = 1.7.1 +mod_version = 1.7.2 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.65.1+1.19.3 +fabric_version=0.68.1+1.19.3 sodium_version=mc1.19.2-0.4.4 -spruceui_version=4.0.0+1.19 -midnightlib_version=0.6.1+22w43a -modmenu_version=4.0.6 +spruceui_version=4.1.0+1.19.3 +midnightlib_version=1.1.0-fabric +modmenu_version=5.0.1 emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric bendylib_version=2.0.+ -emi_version=0.4.0+1.19 +emi_version=0.5.0+1.19.3 libgui_version=6.0.0+1.19 inventorytabs_version=inventorytabs-0.9.beta-1.19.x clothconfig_version=7.0.72 diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index 7f09b3c..d8a88e6 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -41,6 +41,7 @@ public class MidnightControlsConfig extends MidnightConfig { // HUD @Entry(name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true; @Entry(name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT; + @Entry(name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false; // Gameplay @Entry(name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true; @Entry(name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true; @@ -61,6 +62,7 @@ public class MidnightControlsConfig extends MidnightConfig { @Entry(name = "midnightcontrols.menu.rotation_speed") public static double rotationSpeed = 40.0; //used for x-axis, name kept for compatability @Entry(name = "midnightcontrols.menu.y_axis_rotation_speed") public static double yAxisRotationSpeed = rotationSpeed; @Entry(name = "midnightcontrols.menu.mouse_speed") public static double mouseSpeed = 25.0; + @Entry(name = "midnightcontrols.menu.joystick_as_mouse") public static boolean joystickAsMouse = false; @Entry(name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false; @Entry(name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false; @Entry(name = "midnightcontrols.menu.virtual_mouse.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT; @@ -350,7 +352,7 @@ public class MidnightControlsConfig extends MidnightConfig { 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("dualsense") || controller.contains("ps5")) return ControllerType.DUALSENSE; else if (controller.contains("dualshock") || controller.contains("ps4") || controller.contains("sony")) return ControllerType.DUALSHOCK; else if (controller.contains("switch") || controller.contains("joy-con") || controller.contains("wii") || controller.contains("nintendo")) return ControllerType.SWITCH; else if (controller.contains("ouya")) return ControllerType.OUYA; diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 30c98c2..97a6905 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -858,7 +858,7 @@ public class MidnightInput { } public static boolean isScreenInteractive(@NotNull Screen screen) { - return !(screen instanceof HandledScreen || MidnightControlsConfig.mouseScreens.stream().anyMatch(a -> screen.getClass().toString().contains(a)) + return !(screen instanceof HandledScreen || MidnightControlsConfig.joystickAsMouse || MidnightControlsConfig.mouseScreens.stream().anyMatch(a -> screen.getClass().toString().contains(a)) || (screen instanceof SpruceScreen && ((SpruceScreen) screen).requiresCursor()) || MidnightControlsCompat.requireMouseOnScreen(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 index 7e02be8..7809fab 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EMICompat.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/EMICompat.java @@ -1,6 +1,6 @@ package eu.midnightdust.midnightcontrols.client.compat; -import dev.emi.emi.EmiConfig; +import dev.emi.emi.config.EmiConfig; import dev.emi.emi.screen.EmiScreen; import dev.emi.emi.screen.EmiScreenManager; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; @@ -14,9 +14,9 @@ import org.lwjgl.glfw.GLFW; public class EMICompat implements CompatHandler { public static boolean handleTabs(boolean direction) { - if (isEMIEnabled() && MidnightControlsClient.get().input.actionGuiCooldown == 0 && EmiScreenManager.searchLeft != null && EmiScreenManager.searchRight != null) { - if (direction) EmiScreenManager.searchRight.onPress(); - else EmiScreenManager.searchLeft.onPress(); + if (isEMIEnabled() && MidnightControlsClient.get().input.actionGuiCooldown == 0 && EmiScreenManager.getSearchPanel() != null && EmiScreenManager.getSearchPanel().pageLeft != null && EmiScreenManager.getSearchPanel().pageRight != null) { + if (direction) EmiScreenManager.getSearchPanel().pageRight.onPress(); + else EmiScreenManager.getSearchPanel().pageLeft.onPress(); MidnightControlsClient.get().input.actionGuiCooldown = 5; return true; } 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 8394c14..7488f47 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -22,16 +22,17 @@ import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAcce 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.client.itemgroup.CreativeGuiExtensions; +import net.fabricmc.fabric.impl.client.itemgroup.FabricCreativeGuiComponents; +import net.fabricmc.fabric.impl.itemgroup.FabricItemGroup; +import net.fabricmc.fabric.impl.itemgroup.ItemGroupHelper; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.hud.SpectatorHud; -import net.minecraft.client.gui.hud.spectator.SpectatorMenu; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; import net.minecraft.client.gui.screen.ingame.*; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import net.minecraft.client.gui.widget.PressableWidget; -import net.minecraft.client.input.Input; import net.minecraft.client.util.ScreenshotRecorder; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroups; @@ -43,9 +44,9 @@ import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; import java.util.Comparator; +import java.util.List; 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; @@ -57,9 +58,17 @@ import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2; * @version 1.7.0 * @since 1.1.0 */ +@SuppressWarnings("UnstableApiUsage") public class InputHandlers { private InputHandlers() { } + private static List getVisibleGroups(CreativeInventoryScreen screen) { + return ItemGroupHelper.sortedGroups.stream() + .filter(itemGroup -> { + if (FabricCreativeGuiComponents.COMMON_GROUPS.contains(itemGroup)) return true; + return ((CreativeGuiExtensions)screen).fabric_currentPage() == ((FabricItemGroup)itemGroup).getPage() && itemGroup.shouldDisplay() && (!itemGroup.equals(ItemGroups.OPERATOR) || ItemGroups.operatorEnabled); + }).toList(); + } public static PressAction handleHotbar(boolean next) { return (client, button, value, action) -> { @@ -86,13 +95,31 @@ public class InputHandlers { } else if (client.currentScreen instanceof RingScreen) { MidnightControlsClient.get().ring.cyclePage(next); } else if (client.currentScreen instanceof CreativeInventoryScreenAccessor inventory) { - int currentTab = CreativeInventoryScreenAccessor.getSelectedTab(); - int nextTab = currentTab + (next ? 1 : -1); - if (nextTab < 0) - nextTab = ItemGroups.GROUPS.length - 1; - else if (nextTab >= ItemGroups.GROUPS.length) - nextTab = 0; - inventory.midnightcontrols$setSelectedTab(ItemGroups.GROUPS[nextTab]); + ItemGroup currentTab = CreativeInventoryScreenAccessor.getSelectedTab(); + int currentColumn = currentTab.getColumn(); + ItemGroup.Row currentRow = currentTab.getRow(); + ItemGroup newTab = null; + List visibleTabs = getVisibleGroups((CreativeInventoryScreen) client.currentScreen); + for (ItemGroup tab : visibleTabs) { + if (tab.getRow().equals(currentRow) && ((newTab == null && ((next && tab.getColumn() > currentColumn) || + (!next && tab.getColumn() < currentColumn))) || (newTab != null && ((next && tab.getColumn() > currentColumn && tab.getColumn() < newTab.getColumn()) || + (!next && tab.getColumn() < currentColumn && tab.getColumn() > newTab.getColumn()))))) + newTab = tab; + } + if (newTab == null) + for (ItemGroup tab : visibleTabs) { + if ((tab.getRow().compareTo(currentRow)) != 0 && ((next && newTab == null || next && newTab.getColumn() > tab.getColumn()) || (!next && newTab == null) || (!next && newTab.getColumn() < tab.getColumn()))) + newTab = tab; + } + if (newTab == null) { + for (ItemGroup tab : visibleTabs) { + if ((next && tab.getRow() == ItemGroup.Row.TOP && tab.getColumn() == 0) || + !next && tab.getRow() == ItemGroup.Row.BOTTOM && (newTab == null || tab.getColumn() > newTab.getColumn())) + newTab = tab; + } + } + if (newTab == null || newTab.equals(currentTab)) newTab = ItemGroups.getDefaultTab(); + inventory.midnightcontrols$setSelectedTab(newTab); return true; } else if (client.currentScreen instanceof InventoryScreen || client.currentScreen instanceof CraftingScreen || client.currentScreen instanceof AbstractFurnaceScreen) { RecipeBookWidget recipeBook; 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 9b1f826..d926cdc 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -57,8 +57,10 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { private final SpruceOption rotationSpeedOption; private final SpruceOption yAxisRotationSpeedOption; private final SpruceOption mouseSpeedOption; + private final SpruceOption joystickAsMouseOption; private final SpruceOption virtualMouseOption; private final SpruceOption resetOption; + private final SpruceOption advancedConfigOption; // Gameplay options private final SpruceOption analogMovementOption; private final SpruceOption doubleTapToSprintOption; @@ -75,6 +77,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { private final SpruceOption virtualMouseSkinOption; private final SpruceOption hudEnableOption; private final SpruceOption hudSideOption; + private final SpruceOption moveChatOption; // Controller options private final SpruceOption controllerOption = new SpruceCyclingOption("midnightcontrols.menu.controller", @@ -184,12 +187,16 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { 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()))), - Text.translatable("midnightcontrols.tooltip.mouse_speed")); + Text.translatable("midnightcontrols.tooltip.joystick_as_mouse")); + this.joystickAsMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.joystick_as_mouse", + () -> MidnightControlsConfig.joystickAsMouse, value -> MidnightControlsConfig.joystickAsMouse = value, + Text.translatable("midnightcontrols.tooltip.joystick_as_mouse")); this.resetOption = SpruceSimpleActionOption.reset(btn -> { MidnightControlsConfig.reset(); var client = MinecraftClient.getInstance(); this.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); }); + this.advancedConfigOption = SpruceSimpleActionOption.of("midnightcontrols.midnightconfig.title", button -> client.setScreen(MidnightControlsConfig.getScreen(this, "midnightcontrols"))); // Gameplay options this.analogMovementOption = new SpruceToggleBooleanOption("midnightcontrols.menu.analog_movement", () -> MidnightControlsConfig.analogMovement, value -> MidnightControlsConfig.analogMovement = value, @@ -232,6 +239,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { amount -> MidnightControlsConfig.hudSide = MidnightControlsConfig.hudSide.next(), option -> option.getDisplayText(MidnightControlsConfig.hudSide.getTranslatedText()), Text.translatable("midnightcontrols.tooltip.hud_side")); + this.moveChatOption = new SpruceToggleBooleanOption("midnightcontrols.menu.move_chat", () -> MidnightControlsConfig.moveChat, + value -> MidnightControlsConfig.moveChat = value, Text.translatable("midnightcontrols.tooltip.move_chat")); // Controller options this.toggleControllerProfileOption = new SpruceToggleBooleanOption("midnightcontrols.menu.separate_controller_profile", () -> MidnightControlsConfig.controllerBindingProfiles.containsKey(MidnightControlsConfig.getController().getGuid()), value -> { if (value) { @@ -290,8 +299,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { this.buildTabs(); this.addDrawableChild(this.resetOption.createWidget(Position.of(this.width / 2 - 155, this.height - 29), 150)); - this.addDrawableChild(ButtonWidget.method_46430(SpruceTexts.GUI_DONE, btn -> this.client.setScreen(this.parent)) - .method_46434(this.width / 2 - 155 + 160, this.height - 29, 150, 20).method_46431()); + this.addDrawableChild(ButtonWidget.builder(SpruceTexts.GUI_DONE, btn -> this.client.setScreen(this.parent)) + .dimensions(this.width / 2 - 155 + 160, this.height - 29, 150, 20).build()); } public void buildTabs() { @@ -329,6 +338,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { list.addSingleOptionEntry(this.yAxisRotationSpeedOption); list.addSingleOptionEntry(this.mouseSpeedOption); list.addSingleOptionEntry(this.virtualMouseOption); + list.addSingleOptionEntry(this.joystickAsMouseOption); + list.addSingleOptionEntry(this.advancedConfigOption); return list; } @@ -356,6 +367,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null)); list.addSingleOptionEntry(this.hudEnableOption); list.addSingleOptionEntry(this.hudSideOption); + list.addSingleOptionEntry(this.moveChatOption); return list; } @@ -437,13 +449,13 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { RenderSystem.enableBlend(); RenderSystem.disableTexture(); RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.setShader(GameRenderer::getPositionColorProgram); bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); bufferBuilder.vertex(matrix, (float)x1, (float)y2, 0.0F).color(r, g, b, t).next(); 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(); - BufferRenderer.drawWithShader(bufferBuilder.end()); + BufferRenderer.drawWithGlobalProgram(bufferBuilder.end()); RenderSystem.enableTexture(); RenderSystem.disableBlend(); matrixStack.pop(); 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 0c79651..30df0e5 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/gui/RingScreen.java @@ -10,7 +10,6 @@ package eu.midnightdust.midnightcontrols.client.gui; import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; -import eu.midnightdust.midnightcontrols.client.ring.MidnightRing; import eu.midnightdust.midnightcontrols.client.ring.RingButtonMode; import eu.midnightdust.midnightcontrols.client.ring.RingPage; import net.minecraft.client.gui.screen.Screen; @@ -37,8 +36,8 @@ public class RingScreen extends Screen { protected void init() { super.init(); if (mod.ring.getMaxPages() > 1) { - this.addDrawableChild(ButtonWidget.method_46430(Text.of("◀"), button -> this.mod.ring.cyclePage(false)).method_46434(5, 5, 20, 20).method_46431()); - this.addDrawableChild(ButtonWidget.method_46430(Text.of("▶"), button -> this.mod.ring.cyclePage(true)).method_46434(width - 25, 5, 20, 20).method_46431()); + this.addDrawableChild(ButtonWidget.builder(Text.of("◀"), button -> this.mod.ring.cyclePage(false)).dimensions(5, 5, 20, 20).build()); + this.addDrawableChild(ButtonWidget.builder(Text.of("▶"), button -> this.mod.ring.cyclePage(true)).dimensions(width - 25, 5, 20, 20).build()); } } diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ChatScreenMixin.java b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ChatScreenMixin.java new file mode 100644 index 0000000..1650538 --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ChatScreenMixin.java @@ -0,0 +1,35 @@ +package eu.midnightdust.midnightcontrols.client.mixin; + +import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import net.minecraft.client.gui.screen.ChatScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +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.callback.CallbackInfo; + +@Mixin(ChatScreen.class) +public abstract class ChatScreenMixin extends Screen { + @Shadow protected TextFieldWidget chatField; + + protected ChatScreenMixin(Text title) { + super(title); + } + + @Inject(at = @At("TAIL"), method = "init") + private void midnightcontrols$moveInputField(CallbackInfo ci) { + if (MidnightControlsConfig.moveChat) chatField.setY(4); + } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/TextFieldWidget;setTextFieldFocused(Z)V", shift = At.Shift.AFTER)) + private void midnightcontrols$moveInputFieldBackground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { + if (MidnightControlsConfig.moveChat) matrices.translate(0f, -this.height + 16, 0f); + } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/TextFieldWidget;render(Lnet/minecraft/client/util/math/MatrixStack;IIF)V", shift = At.Shift.BEFORE)) + private void midnightcontrols$dontMoveOtherStuff(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { + if (MidnightControlsConfig.moveChat) matrices.translate(0f, this.height - 16, 0f); + } +} 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 9d29580..46dbb41 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ControlsOptionsScreenMixin.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ControlsOptionsScreenMixin.java @@ -11,16 +11,13 @@ 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; @@ -30,27 +27,13 @@ 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) { - if (!showAlternativeButton) { - int i = this.width / 2 - 155; - int j = i + 160; - int k = this.height / 6 - 12 + 48; - this.addDrawableChild(ButtonWidget.method_46430(Text.translatable("midnightcontrols.menu.title.controller").append("..."), (button) -> { - this.client.setScreen(new MidnightControlsSettingsScreen(this, false)); - }).method_46434(j, k, 150, 20).method_46431()); - } + 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"))); } } 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 14bad62..94961cf 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CreativeInventoryScreenAccessor.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/mixin/CreativeInventoryScreenAccessor.java @@ -11,6 +11,7 @@ package eu.midnightdust.midnightcontrols.client.mixin; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemGroups; import net.minecraft.screen.slot.Slot; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,8 +30,8 @@ public interface CreativeInventoryScreenAccessor { * @return the selected tab index */ @Accessor("selectedTab") - static int getSelectedTab() { - return 0; + static ItemGroup getSelectedTab() { + return ItemGroups.getDefaultTab(); } /** diff --git a/src/main/resources/assets/midnightcontrols/lang/en_us.json b/src/main/resources/assets/midnightcontrols/lang/en_us.json index 15f998e..4651850 100644 --- a/src/main/resources/assets/midnightcontrols/lang/en_us.json +++ b/src/main/resources/assets/midnightcontrols/lang/en_us.json @@ -140,6 +140,7 @@ "midnightcontrols.menu.hud_side": "HUD Side", "midnightcontrols.menu.invert_right_x_axis": "Invert Right X", "midnightcontrols.menu.invert_right_y_axis": "Invert Right Y", + "midnightcontrols.menu.joystick_as_mouse": "Always use left stick as mouse", "midnightcontrols.menu.keyboard_controls": "Keyboard Controls...", "midnightcontrols.menu.left_dead_zone": "Left Stick Dead Zone", "midnightcontrols.menu.mappings.open_input_str": "Open Mappings File Editor", @@ -148,6 +149,7 @@ "midnightcontrols.menu.max_right_x_value": "Right X Axis Max Value", "midnightcontrols.menu.max_right_y_value": "Right Y Axis Max Value", "midnightcontrols.menu.mouse_speed": "Mouse Speed", + "midnightcontrols.menu.move_chat": "Move chat input box to top", "midnightcontrols.menu.reacharound.horizontal": "Front Block Placing", "midnightcontrols.menu.reacharound.vertical": "Vertical Reacharound", "midnightcontrols.menu.reload_controller_mappings": "Reload Controller Mappings", @@ -181,12 +183,14 @@ "midnightcontrols.tooltip.fly_drifting_vertical": "While flying, enables Vanilla vertical drifting/intertia.", "midnightcontrols.tooltip.hud_enable": "Toggles the on-screen controller button indicator.", "midnightcontrols.tooltip.hud_side": "The position of the HUD.", + "midnightcontrols.tooltip.joystick_as_mouse": "Make the joystick behave like a mouse in every menu.", "midnightcontrols.tooltip.left_dead_zone": "The dead zone for the controller's left analog stick.", "midnightcontrols.tooltip.max_left_x_value": "Changes what the mod considers the highest value for the left X axis. Useful if your axis does not use the full range and seems slow.", "midnightcontrols.tooltip.max_left_y_value": "Changes what the mod considers the highest value for the left Y axis. Useful if your axis does not use the full range and seems slow.", "midnightcontrols.tooltip.max_right_x_value": "Changes what the mod considers the highest value for the right X axis. Useful if your axis does not use the full range and seems slow.", "midnightcontrols.tooltip.max_right_y_value": "Changes what the mod considers the highest value for the right Y axis. Useful if your axis does not use the full range and seems slow.", "midnightcontrols.tooltip.mouse_speed": "The controller's emulated mouse speed.", + "midnightcontrols.tooltip.move_chat": "Moves the chat input field to the top, for better input on devices with on-screen keyboards.", "midnightcontrols.tooltip.reacharound.horizontal": "Enables front block placing, §cmight be considered cheating on some servers§r.", "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.", diff --git a/src/main/resources/assets/midnightcontrols/lang/zh_tw b/src/main/resources/assets/midnightcontrols/lang/zh_tw.json similarity index 83% rename from src/main/resources/assets/midnightcontrols/lang/zh_tw rename to src/main/resources/assets/midnightcontrols/lang/zh_tw.json index 2c32ff0..64b0844 100644 --- a/src/main/resources/assets/midnightcontrols/lang/zh_tw +++ b/src/main/resources/assets/midnightcontrols/lang/zh_tw.json @@ -6,7 +6,7 @@ "key.midnightcontrols.ring": "顯示額外按鍵菜單", "midnightcontrols.action.attack": "攻擊", "midnightcontrols.action.back": "向後移動", - "midnightcontrols.action.chat": "打開聊天室", + "midnightcontrols.action.chat": "打開聊天欄", "midnightcontrols.action.drop_item": "丟棄所選物品", "midnightcontrols.action.exit": "退出", "midnightcontrols.action.forward": "向前移動", @@ -19,14 +19,14 @@ "midnightcontrols.action.pause_game": "暫停遊戲", "midnightcontrols.action.pick_block": "選取方塊", "midnightcontrols.action.pickup": "拿取一個/拿取一半", - "midnightcontrols.action.pickup_all": "拿取一组/拿取全部", + "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.sprint": "疾跑", "midnightcontrols.action.swap_hands": "與副手交換", "midnightcontrols.action.toggle_perspective": "切換視角", "midnightcontrols.action.toggle_smooth_camera": "切換電影視角", @@ -54,8 +54,8 @@ "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_trigger": "左扳機鍵", + "midnightcontrols.axis.right_trigger": "右扳機鍵", "midnightcontrols.axis.left_x-": "左搖桿左(X軸負向)", "midnightcontrols.axis.left_y-": "左搖桿下(Y軸負向)", "midnightcontrols.axis.right_x-": "右搖桿左(X軸負向)", @@ -63,12 +63,12 @@ "midnightcontrols.button.unknown": "未知(%d)", "midnightcontrols.controller.connected": "手把 %d 已連接。", "midnightcontrols.controller.disconnected": "手把 %d 已斷開。", - "midnightcontrols.controller.mappings.1": "請使用 %s 配置手把對應", - "midnightcontrols.controller.mappings.3": "並將對應文件放入此位置:`%s.minecraft/config/gamecontrollerdb.txt%s`。", - "midnightcontrols.controller.mappings.error": "發生錯誤,無法讀取對應文件。", - "midnightcontrols.controller.mappings.error.write": "發生錯誤,無法保存對應文件。", - "midnightcontrols.controller.mappings.updated": "對應已更新!", - "midnightcontrols.controller_type.default": "重設", + "midnightcontrols.controller.mappings.1": "請使用 %s 配置手把按鍵映射", + "midnightcontrols.controller.mappings.3": "並將按鍵映射文件放入此路徑:`%s.minecraft/config/gamecontrollerdb.txt%s`。", + "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", @@ -92,9 +92,9 @@ "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.keyboard_controls": "鍵盤控制…", "midnightcontrols.menu.left_dead_zone": "左搖桿死區", - "midnightcontrols.menu.mappings.open_input_str": "編輯對應文件", + "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軸最大值識別範圍", @@ -102,7 +102,7 @@ "midnightcontrols.menu.mouse_speed": "鼠標移動速度", "midnightcontrols.menu.reacharound.horizontal": "水平方向方塊放置輔助", "midnightcontrols.menu.reacharound.vertical": "垂直方向方塊放置輔助", - "midnightcontrols.menu.reload_controller_mappings": "重新加载手把對應", + "midnightcontrols.menu.reload_controller_mappings": "重新加載手把按鍵映射", "midnightcontrols.menu.right_dead_zone": "右搖桿死區", "midnightcontrols.menu.rotation_speed": "鏡頭旋轉速度 (X)", "midnightcontrols.menu.y_axis_rotation_speed": "鏡頭旋轉速度 (Y)", @@ -111,42 +111,42 @@ "midnightcontrols.menu.title": "midnightcontrols — 設置", "midnightcontrols.menu.title.controller": "手把選項", "midnightcontrols.menu.title.controller_controls": "手把控制", - "midnightcontrols.menu.title.gameplay": "遊戲内容選項", + "midnightcontrols.menu.title.gameplay": "遊戲內容選項", "midnightcontrols.menu.title.general": "通用選項", "midnightcontrols.menu.title.hud": "HUD選項", - "midnightcontrols.menu.title.mappings.string": "編輯對應文件", + "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.menu.virtual_mouse.skin": "虛擬鼠標指針樣式", + "midnightcontrols.narrator.unbound": "取消綁定 %s", + "midnightcontrols.not_bound": "未綁定", "midnightcontrols.tooltip.analog_movement": "若遊戲機制允許,則可根據推動搖桿的力度與幅度決定移動的速度。", "midnightcontrols.tooltip.auto_switch_mode": "如果已有手把連接,則自動切換為手把操作模式。", - "midnightcontrols.tooltip.controller2": "使用額外的手把,比如將一左一右的兩個 Joy-Con 合為一个功能完全的手把。", + "midnightcontrols.tooltip.controller2": "使用額外的手把,比如將一左一右的兩個 Joy-Con 合為一個功能完全的手把。", "midnightcontrols.tooltip.controller_type": "選擇手把類型,以顯示對應的按鍵圖標。", "midnightcontrols.tooltip.controls_mode": "操作模式", - "midnightcontrols.tooltip.fast_block_placing": "在創造模式中處於飛行狀態時,可以根據你飛行的速度快速放置方塊。\n§c在部分伺服器可能会被認定為作弊。", + "midnightcontrols.tooltip.fast_block_placing": "在創造模式中處於飛行狀態時,可以根據你飛行的速度快速放置方塊。\n§c在部分服務器可能會被認定為作弊。", "midnightcontrols.tooltip.fly_drifting": "處於飛行狀態時,啟用原版的水平方向飛行慣性(緩停滑行)。", "midnightcontrols.tooltip.fly_drifting_vertical": "處於飛行狀態時,啟用原版的垂直方向飛行慣性(緩停滑行)。", "midnightcontrols.tooltip.hud_enable": "顯示手把按鍵操作提示。", "midnightcontrols.tooltip.hud_side": "HUD的位置位於畫面的哪一側。", "midnightcontrols.tooltip.left_dead_zone": "左搖桿配置的死區。\n死區決定搖桿要偏離中心位置多遠才能讓搖桿的輸入有效。", - "midnightcontrols.tooltip.max_left_x_value": "更改左搖桿X軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值,導致在識別搖桿輸入的精確認值的情况下,左右移動較為緩慢等问题,本项可能会有所帮助。", - "midnightcontrols.tooltip.max_left_y_value": "更改左搖桿Y軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值,導致在識別搖桿輸入的精確認值的情况下,前后移動較為緩慢等问题,本项可能会有所帮助。", - "midnightcontrols.tooltip.max_right_x_value": "更改右搖桿X軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值,導致鏡頭左右旋轉較為緩慢等問题,本項可能會有所幫助。", - "midnightcontrols.tooltip.max_right_y_value": "更改右搖桿Y軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值,導致鏡頭上下旋轉較為緩慢等問题,本項可能會有所幫助。", + "midnightcontrols.tooltip.max_left_x_value": "更改左搖桿X軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值,導致在識別搖桿輸入的精確值的情況下,左右移動較為緩慢等問題,本項可能會有所幫助。", + "midnightcontrols.tooltip.max_left_y_value": "更改左搖桿Y軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值,導致在識別搖桿輸入的精確值的情況下,前後移動較為緩慢等問題,本項可能會有所幫助。", + "midnightcontrols.tooltip.max_right_x_value": "更改右搖桿X軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值,導致鏡頭左右旋轉較為緩慢等問題,本項可能會有所幫助。", + "midnightcontrols.tooltip.max_right_y_value": "更改右搖桿Y軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值,導致鏡頭上下旋轉較為緩慢等問題,本項可能會有所幫助。", "midnightcontrols.tooltip.mouse_speed": "手把模擬的鼠標的移動速度。", - "midnightcontrols.tooltip.reacharound.horizontal": "啟用水平方向方塊放置輔助,可在腳下方塊的前方放置方塊。\n§c在部分伺服器可能會被認定為作弊。", - "midnightcontrols.tooltip.reacharound.vertical": "啟用垂直方向方塊放置輔助,可在腳下方塊的下方放置方塊。\n§c在部分伺服器可能會被認定為作弊。", - "midnightcontrols.tooltip.reload_controller_mappings": "重新加載手把的對應文件。", + "midnightcontrols.tooltip.reacharound.horizontal": "啟用水平方向方塊放置輔助,可在腳下方塊的前方放置方塊。\n§c在部分服務器可能會被認定為作弊。", + "midnightcontrols.tooltip.reacharound.vertical": "啟用垂直方向方塊放置輔助,可在腳下方塊的下方放置方塊。\n§c在部分服務器可能會被認定為作弊。", + "midnightcontrols.tooltip.reload_controller_mappings": "重新加載手把的按鍵映射文件。", "midnightcontrols.tooltip.right_dead_zone": "右搖桿配置的死區。\n死區決定搖桿要偏離中心位置多遠才能讓搖桿的輸入有效。", "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.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": "額外樣式(黑色)" -} +} \ No newline at end of file diff --git a/src/main/resources/midnightcontrols.mixins.json b/src/main/resources/midnightcontrols.mixins.json index 5691852..80b8185 100644 --- a/src/main/resources/midnightcontrols.mixins.json +++ b/src/main/resources/midnightcontrols.mixins.json @@ -15,6 +15,7 @@ "KeyBindingMixin", "MinecraftClientMixin", "MouseMixin", + "ChatScreenMixin", "RecipeBookWidgetAccessor", "WorldRendererMixin", "KeyBindingRegistryImplAccessor", diff --git a/src/main/resources/resourcepacks/bedrock/assets/midnightcontrols/textures/gui/controller_buttons.png b/src/main/resources/resourcepacks/bedrock/assets/midnightcontrols/textures/gui/controller_buttons.png index 135cd2e..4eab1af 100644 Binary files a/src/main/resources/resourcepacks/bedrock/assets/midnightcontrols/textures/gui/controller_buttons.png and b/src/main/resources/resourcepacks/bedrock/assets/midnightcontrols/textures/gui/controller_buttons.png differ diff --git a/src/main/resources/resourcepacks/bedrock/pack.mcmeta b/src/main/resources/resourcepacks/bedrock/pack.mcmeta index 776b2b6..13abd37 100644 --- a/src/main/resources/resourcepacks/bedrock/pack.mcmeta +++ b/src/main/resources/resourcepacks/bedrock/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { - "pack_format": 9, + "pack_format": 12, "description": "Makes controller tooltips use similar icons to Bedrock Edition" } } diff --git a/src/main/resources/resourcepacks/legacy/pack.mcmeta b/src/main/resources/resourcepacks/legacy/pack.mcmeta index 7ec8688..5d18928 100644 --- a/src/main/resources/resourcepacks/legacy/pack.mcmeta +++ b/src/main/resources/resourcepacks/legacy/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { - "pack_format": 9, + "pack_format": 12, "description": "Makes controller icons look similar to Legacy Console Edit." } }