From 308b41094f58be875c4372e87eb732ec6fdd4fa9 Mon Sep 17 00:00:00 2001 From: Motschen Date: Fri, 9 Dec 2022 20:02:59 +0100 Subject: [PATCH] MidnightControls 1.7.2 - Port to 1.19.3, various new options - Update to 1.19.3 (Tabbing through creative tabs behaves the same as before, that was hard) - Add an option to move the chat input field to the top of the screen for better input on devices using an on-screen keyboard - Add an option to make the left joystick behave like a mouse in every screen - Add a button to more easily access the Advanced Config --- build.gradle | 6 +- gradle.properties | 18 ++--- .../client/MidnightControlsConfig.java | 4 +- .../client/MidnightInput.java | 2 +- .../client/compat/EMICompat.java | 8 +-- .../client/controller/InputHandlers.java | 49 +++++++++++--- .../gui/MidnightControlsSettingsScreen.java | 22 ++++-- .../client/gui/RingScreen.java | 5 +- .../client/mixin/ChatScreenMixin.java | 35 ++++++++++ .../mixin/ControlsOptionsScreenMixin.java | 23 +------ .../CreativeInventoryScreenAccessor.java | 5 +- .../assets/midnightcontrols/lang/en_us.json | 4 ++ .../lang/{zh_tw => zh_tw.json} | 64 +++++++++--------- .../resources/midnightcontrols.mixins.json | 1 + .../textures/gui/controller_buttons.png | Bin 4553 -> 4981 bytes .../resourcepacks/bedrock/pack.mcmeta | 2 +- .../resourcepacks/legacy/pack.mcmeta | 2 +- 17 files changed, 157 insertions(+), 93 deletions(-) create mode 100644 src/main/java/eu/midnightdust/midnightcontrols/client/mixin/ChatScreenMixin.java rename src/main/resources/assets/midnightcontrols/lang/{zh_tw => zh_tw.json} (83%) 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 135cd2e7b74ed3ca5a43650f735ea83b919f3ef7..4eab1afe58278796dde446a24e33e7e17a9310cb 100644 GIT binary patch delta 4851 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 XW5S)kIdk3qv%HzHwNdF=kC^`f;|DBj 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." } }