diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4db69da..8a7a4aa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,10 +7,10 @@ github_release = "2.+" machete = "1.+" grgit = "5.0.+" -minecraft = "1.19.4-pre1" +minecraft = "1.19.4-rc1" quilt_mappings = "1" -fabric_loader = "0.14.16" -fabric_api = "0.74.1+1.19.4" +fabric_loader = "0.14.17" +fabric_api = "0.75.1+1.19.4" mixin_extras = "0.2.0-beta.1" yet_another_config_lib = "2.3.0+beta.3+update.1.19.4-SNAPSHOT" mod_menu = "6.1.0-alpha.1" diff --git a/src/main/java/dev/isxander/controlify/Controlify.java b/src/main/java/dev/isxander/controlify/Controlify.java index 69f72a4..346efbe 100644 --- a/src/main/java/dev/isxander/controlify/Controlify.java +++ b/src/main/java/dev/isxander/controlify/Controlify.java @@ -65,10 +65,10 @@ public class Controlify implements ControlifyApi { var controller = Controller.createOrGet(jid, controllerHIDService.fetchType()); LOGGER.info("Controller found: " + controller.name()); + config().loadOrCreateControllerData(controller); + if (config().currentControllerUid().equals(controller.uid())) setCurrentController(controller); - - config().loadOrCreateControllerData(controller); } } diff --git a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java index ad63cc5..9eddbee 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java +++ b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java @@ -29,6 +29,7 @@ import net.minecraft.network.chat.Component; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -89,6 +90,8 @@ public class YACLHelper { var config = controller.config(); var def = controller.defaultConfig(); + Function percentFormatter = v -> Component.literal(String.format("%.0f%%", v*100)); + var basicGroup = OptionGroup.createBuilder() .name(Component.translatable("controlify.gui.group.basic")) .tooltip(Component.translatable("controlify.gui.group.basic.tooltip")) @@ -96,13 +99,13 @@ public class YACLHelper { .name(Component.translatable("controlify.gui.horizontal_look_sensitivity")) .tooltip(Component.translatable("controlify.gui.horizontal_look_sensitivity.tooltip")) .binding(def.horizontalLookSensitivity, () -> config.horizontalLookSensitivity, v -> config.horizontalLookSensitivity = v) - .controller(opt -> new FloatSliderController(opt, 0.1f, 2f, 0.05f, v -> Component.literal(String.format("%.0f%%", v*100)))) + .controller(opt -> new FloatSliderController(opt, 0.1f, 2f, 0.05f, percentFormatter)) .build()) .option(Option.createBuilder(float.class) .name(Component.translatable("controlify.gui.vertical_look_sensitivity")) .tooltip(Component.translatable("controlify.gui.vertical_look_sensitivity.tooltip")) .binding(def.verticalLookSensitivity, () -> config.verticalLookSensitivity, v -> config.verticalLookSensitivity = v) - .controller(opt -> new FloatSliderController(opt, 0.1f, 2f, 0.05f, v -> Component.literal(String.format("%.0f%%", v*100)))) + .controller(opt -> new FloatSliderController(opt, 0.1f, 2f, 0.05f, percentFormatter)) .build()) .option(Option.createBuilder(boolean.class) .name(Component.translatable("controlify.gui.toggle_sprint")) @@ -132,7 +135,13 @@ public class YACLHelper { .name(Component.translatable("controlify.gui.vmouse_sensitivity")) .tooltip(Component.translatable("controlify.gui.vmouse_sensitivity.tooltip")) .binding(def.virtualMouseSensitivity, () -> config.virtualMouseSensitivity, v -> config.virtualMouseSensitivity = v) - .controller(opt -> new FloatSliderController(opt, 0.1f, 2f, 0.05f, v -> Component.literal(String.format("%.0f%%", v*100)))) + .controller(opt -> new FloatSliderController(opt, 0.1f, 2f, 0.05f, percentFormatter)) + .build()) + .option(Option.createBuilder(float.class) + .name(Component.translatable("controlify.gui.chat_screen_offset")) + .tooltip(Component.translatable("controlify.gui.chat_screen_offset.tooltip")) + .binding(def.chatKeyboardHeight, () -> config.chatKeyboardHeight, v -> config.chatKeyboardHeight = v) + .controller(opt -> new FloatSliderController(opt, 0f, 0.8f, 0.1f, percentFormatter)) .build()); if (controller instanceof GamepadController gamepad) { diff --git a/src/main/java/dev/isxander/controlify/controller/ControllerConfig.java b/src/main/java/dev/isxander/controlify/controller/ControllerConfig.java index ddc5593..04bbab9 100644 --- a/src/main/java/dev/isxander/controlify/controller/ControllerConfig.java +++ b/src/main/java/dev/isxander/controlify/controller/ControllerConfig.java @@ -18,6 +18,8 @@ public abstract class ControllerConfig { public boolean showGuide = true; + public float chatKeyboardHeight = 0f; + public boolean calibrated = false; public abstract void setDeadzone(int axis, float deadzone); diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/chatkbheight/ChatComponentMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/chatkbheight/ChatComponentMixin.java new file mode 100644 index 0000000..7d4f81c --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/chatkbheight/ChatComponentMixin.java @@ -0,0 +1,61 @@ +package dev.isxander.controlify.mixins.feature.chatkbheight; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.mojang.blaze3d.vertex.PoseStack; +import dev.isxander.controlify.Controlify; +import dev.isxander.controlify.controller.Controller; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.ChatComponent; +import net.minecraft.client.gui.screens.ChatScreen; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ChatComponent.class) +public class ChatComponentMixin { + @Shadow @Final private Minecraft minecraft; + + @Inject(method = "render", at = @At("HEAD")) + private void translateRender(PoseStack matrices, int tickDelta, int i, int j, CallbackInfo ci) { + if (!(minecraft.screen instanceof ChatScreen)) + return; + + Controller controller = Controlify.instance().currentController(); + matrices.pushPose(); + if (controller.config().chatKeyboardHeight == 0) return; + matrices.translate(0, -controller.config().chatKeyboardHeight * minecraft.getWindow().getGuiScaledHeight(), 0); + } + + @Inject(method = "render", at = @At("TAIL")) + private void finishTranslateRender(PoseStack matrices, int tickDelta, int i, int j, CallbackInfo ci) { + if (!(minecraft.screen instanceof ChatScreen)) + return; + + matrices.popPose(); + } + + @ModifyConstant(method = "render", constant = @Constant(intValue = 40)) + private int modifyChatOffset(int original) { + if (!(minecraft.screen instanceof ChatScreen)) + return original; + + Controller controller = Controlify.instance().currentController(); + if (controller.config().chatKeyboardHeight == 0) return original; + return 16; + } + + @ModifyVariable(method = "screenToChatY", at = @At("HEAD"), ordinal = 0, argsOnly = true) + private double modifyScreenY(double original) { + if (!(minecraft.screen instanceof ChatScreen)) + return original; + + Controller controller = Controlify.instance().currentController(); + if (controller.config().chatKeyboardHeight == 0) return original; + + return original + - controller.config().chatKeyboardHeight * minecraft.getWindow().getGuiScaledHeight() + + 24; + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/chatkbheight/ChatScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/chatkbheight/ChatScreenMixin.java new file mode 100644 index 0000000..29db306 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/chatkbheight/ChatScreenMixin.java @@ -0,0 +1,39 @@ +package dev.isxander.controlify.mixins.feature.chatkbheight; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.isxander.controlify.Controlify; +import dev.isxander.controlify.controller.Controller; +import net.minecraft.client.gui.screens.ChatScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ChatScreen.class) +public abstract class ChatScreenMixin extends Screen { + protected ChatScreenMixin(Component title) { + super(title); + } + + @Inject(method = "render", at = @At("HEAD")) + private void translateRender(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { + matrices.pushPose(); + + Controller controller = Controlify.instance().currentController(); + matrices.translate(0, -controller.config().chatKeyboardHeight * this.height, 0); + } + + @Inject(method = "render", at = @At("TAIL")) + private void finishTranslateRender(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { + matrices.popPose(); + } + + @ModifyVariable(method = "mouseClicked", at = @At("HEAD"), ordinal = 1, argsOnly = true) + private double modifyClickY(double original) { + Controller controller = Controlify.instance().currentController(); + return original + controller.config().chatKeyboardHeight * this.height; + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreateWorldScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreateWorldScreenMixin.java index d090160..bc3557b 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreateWorldScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreateWorldScreenMixin.java @@ -36,6 +36,6 @@ public class CreateWorldScreenMixin implements ScreenProcessorProvider { if (newIndex < 0) newIndex = tabs.size() - 1; if (newIndex >= tabs.size()) newIndex = 0; - tabNavigationBar.selectTab(newIndex); + tabNavigationBar.selectTab(newIndex, true); } } diff --git a/src/main/resources/assets/controlify/lang/en_us.json b/src/main/resources/assets/controlify/lang/en_us.json index 1ea48b6..704f5cf 100644 --- a/src/main/resources/assets/controlify/lang/en_us.json +++ b/src/main/resources/assets/controlify/lang/en_us.json @@ -24,6 +24,8 @@ "controlify.gui.show_guide.tooltip": "Show a HUD in-game displaying actions you can do with controller buttons.", "controlify.gui.vmouse_sensitivity": "Virtual Mouse Sensitivity", "controlify.gui.vmouse_sensitivity.tooltip": "How fast the virtual mouse moves.", + "controlify.gui.chat_screen_offset": "On-screen keyboard height", + "controlify.gui.chat_screen_offset.tooltip": "How far up the system on-screen keyboard is. This shifts up the chat box so you can see the chat whilst typing.\nThis is extremely useful on the steamdeck.", "controlify.gui.controller_theme": "Controller Theme", "controlify.gui.controller_theme.tooltip": "The theme to use for rendering controller buttons.", "controlify.gui.custom_name": "Display Name", diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index d3b4a5f..6fc45af 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -23,6 +23,8 @@ "feature.accessibility.LocalPlayerMixin", "feature.autoswitch.ToastComponentAccessor", "feature.bind.KeyMappingAccessor", + "feature.chatkbheight.ChatComponentMixin", + "feature.chatkbheight.ChatScreenMixin", "feature.guide.ClientPacketListenerMixin", "feature.guide.GuiMixin", "feature.screenop.vanilla.AbstractButtonMixin",