From b4d22c2614533577700263c328e010416b3e66b9 Mon Sep 17 00:00:00 2001 From: isXander Date: Fri, 10 Apr 2026 16:11:31 +0100 Subject: [PATCH 1/3] port to 26.2-snapshot-2 --- buildSrc/build.gradle.kts | 2 +- gradle.properties | 2 +- .../dev/isxander/controlify/Controlify.java | 32 ++++---- .../controlify/api/guide/InGameFacts.java | 2 +- .../controlify/bindings/BindContext.java | 19 ++--- .../controlify/bindings/RadialIcons.java | 7 +- .../output/KeyMappingEmulationOutput.java | 3 +- .../OpenControlifySettingsAction.java | 3 +- .../SimpleVoiceChatCompat.java | 3 +- .../controller/haptic/HDHapticComponent.java | 8 +- .../fixes/boatfix/AnalogBoatInput.java | 4 +- .../gui/controllers/BindController.java | 3 +- .../controlify/gui/guide/GuideDomain.java | 2 +- .../controlify/gui/guide/GuideRenderer.java | 4 +- .../gui/guide/InGameButtonGuide.java | 15 ++-- .../gui/screen/AskToMapControllerScreen.java | 5 +- .../gui/screen/BindConsumerScreen.java | 3 +- .../gui/screen/BluetoothWarningScreen.java | 3 +- .../gui/screen/ControlifySettingsScreen.java | 14 ++-- .../screen/ControllerConfigScreenFactory.java | 5 +- .../screen/ControllerMappingMakerScreen.java | 3 +- .../controlify/gui/screen/NoSDLScreen.java | 22 ------ .../controlify/gui/screen/RadialItems.java | 8 +- .../gui/screen/RadialMenuScreen.java | 3 +- .../controlify/hid/ControllerHIDService.java | 4 +- .../ingame/ControllerPlayerMovement.java | 3 +- .../controlify/ingame/InGameInputHandler.java | 36 ++++++--- .../controlify/mixins/core/GuiMixin.java | 79 +++++++++++++++++-- .../controlify/mixins/core/HudMixin.java | 21 +++++ .../mixins/core/MinecraftMixin.java | 72 +---------------- .../mixins/feature/bind/GuiAccessor.java | 14 ++++ .../mixins/feature/bind/GuiMixin.java | 27 ++++--- .../mixins/feature/bind/HudMixin.java | 25 ++++++ .../mixins/feature/bind/MinecraftMixin.java | 19 ----- .../mixins/feature/font/FontAccessor.java | 4 +- .../ingame/{GuiMixin.java => HudMixin.java} | 11 ++- .../guide/ingame/MinecraftAccessor.java | 4 +- .../feature/guide/ingame/PlayerAccessor.java | 4 +- .../AbstractContainerScreenAccessor.java | 16 ++-- .../hdhaptics/SoundBufferAccessor.java | 8 +- .../hdhaptics/SoundEngineAccessor.java | 4 +- .../hdhaptics/SoundManagerAccessor.java | 4 +- ...{BoatMixin.java => AbstractBoatMixin.java} | 2 +- .../{MinecraftMixin.java => GuiMixin.java} | 16 ++-- .../feature/screenop/ScreenAccessor.java | 19 ++--- .../impl/chat/ChatComponentMixin.java | 12 +-- .../impl/chat/CommandSuggestionsMixin.java | 20 ++++- .../impl/elements/AbstractWidgetMixin.java | 5 +- .../screenop/impl/elements/EditBoxMixin.java | 9 ++- .../JoinMultiplayerScreenAccessor.java | 4 +- .../outofgame/OptionsSubScreenAccessor.java | 4 +- .../impl/outofgame/PauseScreenAccessor.java | 2 +- .../outofgame/SelectWorldScreenAccessor.java | 8 +- .../outofgame/TabNavigationBarAccessor.java | 8 +- .../feature/steamdeck/ScreenshotAccessor.java | 4 +- .../ui/AbstractSelectionListAccessor.java | 4 +- .../feature/util/ConnectScreenMixin.java | 7 +- .../mixins/feature/virtualmouse/GuiMixin.java | 26 ++++++ .../virtualmouse/InputConstantsMixin.java | 2 +- .../feature/virtualmouse/MinecraftMixin.java | 9 +-- .../virtualmouse/MouseHandlerAccessor.java | 16 ++-- .../AbstractContainerScreenMixin.java | 18 +++-- .../{LoomMixin.java => LoomScreenMixin.java} | 2 +- .../snapping/RecipeBookComponentAccessor.java | 16 ++-- .../snapping/RecipeBookPageAccessor.java | 12 +-- .../virtualmouse/snapping/ScreenMixin.java | 3 +- .../controlify/rumble/BasicRumbleEffect.java | 5 +- .../controlify/screenop/ScreenProcessor.java | 15 ++-- .../AbstractContainerScreenProcessor.java | 8 +- ...nguageSelectionListComponentProcessor.java | 3 +- .../compat/vanilla/PauseScreenProcessor.java | 3 +- .../vanilla/RecipeBookScreenProcessor.java | 14 ++-- .../vanilla/SelectWorldScreenProcessor.java | 5 +- ...rSelectionListEntryComponentProcessor.java | 2 +- .../compat/vanilla/TitleScreenProcessor.java | 3 +- .../WorldListEntryComponentProcessor.java | 2 +- .../keyboard/KeyboardOverlayScreen.java | 6 +- .../dev/isxander/controlify/utils/CUtil.java | 7 -- .../utils/ControllerSetupWizard.java | 2 +- .../controlify/utils/DebugOverlayHelper.java | 15 +++- .../controlify/utils/GsonCodecAdapter.java | 24 ------ .../utils/InitialScreenRegistryDuck.java | 10 ++- .../controlify/utils/MinecraftUtil.java | 63 +++++++++++++++ .../isxander/controlify/utils/ToastUtils.java | 17 ---- .../controlify/virtualmouse/SnapUtils.java | 13 ++- .../virtualmouse/VirtualMouseHandler.java | 48 +++++------ .../wireless/LowBatteryNotifier.java | 6 +- .../controlify-compat.iris.mixins.json | 3 + ...y-compat.reeses-sodium-options.mixins.json | 3 + ...olify-compat.simple-voice-chat.mixins.json | 3 + .../controlify-compat.sodium.mixins.json | 3 + .../controlify-compat.yacl.mixins.json | 3 + .../controlify-platform.fabric.mixins.json | 3 + .../controlify-platform.neoforge.mixins.json | 3 + src/main/resources/controlify.mixins.json | 16 ++-- src/main/templates/fabric.mod.json | 4 +- versions/26.2-fabric/gradle.properties | 20 +++++ versions/current | 2 +- versions/versions.json | 3 +- 99 files changed, 636 insertions(+), 459 deletions(-) delete mode 100644 src/main/java/dev/isxander/controlify/gui/screen/NoSDLScreen.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/core/HudMixin.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/bind/GuiAccessor.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/bind/HudMixin.java delete mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/bind/MinecraftMixin.java rename src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/{GuiMixin.java => HudMixin.java} (81%) rename src/main/java/dev/isxander/controlify/mixins/feature/patches/analogueboat/{BoatMixin.java => AbstractBoatMixin.java} (97%) rename src/main/java/dev/isxander/controlify/mixins/feature/screenop/{MinecraftMixin.java => GuiMixin.java} (77%) create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/GuiMixin.java rename src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/{LoomMixin.java => LoomScreenMixin.java} (96%) delete mode 100644 src/main/java/dev/isxander/controlify/utils/GsonCodecAdapter.java create mode 100644 src/main/java/dev/isxander/controlify/utils/MinecraftUtil.java delete mode 100644 src/main/java/dev/isxander/controlify/utils/ToastUtils.java create mode 100644 versions/26.2-fabric/gradle.properties diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 6685b1647..9ae9769e2 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -33,6 +33,6 @@ dependencies { implementation(plugin("dev.isxander.modstitch.base", "0.8.4")) implementation(plugin("dev.isxander.secrets", "0.1.0")) implementation(plugin("dev.kikugie.stonecutter", "0.8.2")) - implementation(plugin("fabric-loom", "1.14.9")) + implementation(plugin("fabric-loom", "1.16.1")) implementation(plugin("net.neoforged.moddev", "2.0.137")) } diff --git a/gradle.properties b/gradle.properties index abaad8ed9..f0ddb0aaa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ pub.curseforgeSlug=controlify pub.modrinthId=DOUdJVEm githubProject=isXander/Controlify -deps.fabricLoader=0.18.4 +deps.fabricLoader=0.19.1 deps.sdl3Target=3.2.18.release-3.2.18 deps.sdl34jBuild=79 deps.hid4java=0.8.0 diff --git a/src/main/java/dev/isxander/controlify/Controlify.java b/src/main/java/dev/isxander/controlify/Controlify.java index 0e91bd9e7..4afa48d32 100644 --- a/src/main/java/dev/isxander/controlify/Controlify.java +++ b/src/main/java/dev/isxander/controlify/Controlify.java @@ -173,7 +173,7 @@ public void preInitialiseControlify() { }); PlatformClientUtil.addHudLayer(CUtil.rl("button_guide"), (graphics, deltaTracker) -> - inGameButtonGuide().ifPresent(guide -> guide.renderHud(graphics, deltaTracker.getGameTimeDeltaPartialTick(false)))); + inGameButtonGuide().ifPresent(guide -> guide.extractRenderState(graphics, deltaTracker.getGameTimeDeltaPartialTick(false)))); PlatformMainUtil.applyToControlifyEntrypoint(entrypoint -> { try { @@ -386,7 +386,7 @@ private void onControllerAdded(ControllerEntity controller, boolean hotplugged) ); if (hotplugged) { - ToastUtils.sendToast( + MinecraftUtil.sendToast( Component.translatable("controlify.toast.controller_connected.title"), Component.translatable("controlify.toast.controller_connected.description", controller.name()), false @@ -410,7 +410,7 @@ private void onControllerRemoved(ControllerEntity controller) { this.selectFirstConnectedController(); } - ToastUtils.sendToast( + MinecraftUtil.sendToast( Component.translatable("controlify.toast.controller_disconnected.title"), Component.translatable("controlify.toast.controller_disconnected.description", controller.name()), false @@ -429,14 +429,14 @@ private void selectFirstConnectedController() { * Only the current controller ticks. */ public void tick(Minecraft client) { - if (minecraft.getOverlay() == null) { + if (MinecraftUtil.getOverlay() == null) { if (currentSetupWizard != null && currentSetupWizard.isDone()) { currentSetupWizard = null; } - if (!setupWizards.isEmpty() && !(minecraft.screen instanceof DontInteruptScreen)) { + if (!setupWizards.isEmpty() && !(MinecraftUtil.getScreen() instanceof DontInteruptScreen)) { currentSetupWizard = setupWizards.poll(); - minecraft.setScreen(currentSetupWizard.start(minecraft.screen)); + MinecraftUtil.setScreen(currentSetupWizard.start(MinecraftUtil.getScreen())); } } @@ -493,8 +493,8 @@ private void tickActiveController(ControllerEntity controller, boolean outOfFocu ControllerStateView state = input.stateNow(); Optional rumbleManager = controller.rumble().map(RumbleComponent::rumbleManager); - boolean isPaused = minecraft.isPaused() || minecraft.screen instanceof PauseScreen; - boolean isConfigScreen = minecraft.screen instanceof YACLScreen; + boolean isPaused = minecraft.isPaused() || MinecraftUtil.getScreen() instanceof PauseScreen; + boolean isConfigScreen = MinecraftUtil.getScreen() instanceof YACLScreen; rumbleManager.ifPresent(rumble -> rumble.setSilent(outOfFocus || (isPaused && !isConfigScreen) || currentInputMode() == InputMode.KEYBOARD_MOUSE)); if (outOfFocus) { @@ -515,7 +515,7 @@ private void tickActiveController(ControllerEntity controller, boolean outOfFocu if (consecutiveInputSwitches > 100) { CUtil.LOGGER.warn("Controlify detected current controller to be constantly giving input and has been disabled."); - ToastUtils.sendToast( + MinecraftUtil.sendToast( Component.translatable("controlify.toast.faulty_input.title"), Component.translatable("controlify.toast.faulty_input.description"), true @@ -530,8 +530,8 @@ private void tickActiveController(ControllerEntity controller, boolean outOfFocu } if (this.currentInputMode().isController()) { - if (minecraft.screen != null) { - ScreenProcessorProvider.provide(minecraft.screen).onControllerUpdate(controller); + if (MinecraftUtil.getScreen() != null) { + ScreenProcessorProvider.provide(MinecraftUtil.getScreen()).onControllerUpdate(controller); } ControlifyEvents.ACTIVE_CONTROLLER_TICKED.invoke(new ControlifyEvents.ControllerStateUpdate(controller)); @@ -611,8 +611,8 @@ public boolean setInputMode(@NotNull InputMode newInputMode) { } // notify current screen of input mode change - if (minecraft.screen != null) { - ScreenProcessorProvider.provide(minecraft.screen).onInputModeChanged(newInputMode); + if (MinecraftUtil.getScreen() != null) { + ScreenProcessorProvider.provide(MinecraftUtil.getScreen()).onInputModeChanged(newInputMode); } // notify event listeners of input mode change @@ -673,12 +673,12 @@ public void hideMouse(boolean hide, boolean moveMouse) { ? GLFW.GLFW_CURSOR_HIDDEN : GLFW.GLFW_CURSOR_NORMAL ); - if (minecraft.screen != null) { + if (MinecraftUtil.getScreen() != null) { var mouseHandlerAccessor = (MouseHandlerAccessor) minecraft.mouseHandler; if (hide && !virtualMouseHandler().isVirtualMouseEnabled() && moveMouse) { // stop mouse hovering over last element before hiding cursor but don't actually move it // so when the user switches back to mouse it will be in the same place - mouseHandlerAccessor.invokeOnMove(handle, -50, -50); + mouseHandlerAccessor.controlify$invokeOnMove(handle, -50, -50); } } } @@ -722,7 +722,7 @@ public void notifyNewServer(ServerData data) { return; if (config().getSettings().globalSettings().seenServers.add(data.ip)) { - ToastUtils.sendToast( + MinecraftUtil.sendToast( Component.translatable("controlify.toast.new_server.title"), Component.translatable("controlify.toast.new_server.description", data.name), true diff --git a/src/main/java/dev/isxander/controlify/api/guide/InGameFacts.java b/src/main/java/dev/isxander/controlify/api/guide/InGameFacts.java index 8b9828f75..9ac3673ff 100644 --- a/src/main/java/dev/isxander/controlify/api/guide/InGameFacts.java +++ b/src/main/java/dev/isxander/controlify/api/guide/InGameFacts.java @@ -48,7 +48,7 @@ private InGameFacts() {} /** When the player is in a state where pressing jump will cause the elytra to deploy */ public static final Fact CAN_ELYTRA_FLY = register( CUtil.rl("can_elytra_fly"), - ctx -> ((PlayerAccessor) ctx.player()).callCanGlide() + ctx -> ((PlayerAccessor) ctx.player()).controlify$callCanGlide() && !ctx.player().onClimbable() && !ctx.player().onGround() && !ctx.player().isInLiquid() diff --git a/src/main/java/dev/isxander/controlify/bindings/BindContext.java b/src/main/java/dev/isxander/controlify/bindings/BindContext.java index 150b4c112..0ac0b0ae2 100644 --- a/src/main/java/dev/isxander/controlify/bindings/BindContext.java +++ b/src/main/java/dev/isxander/controlify/bindings/BindContext.java @@ -4,6 +4,7 @@ import dev.isxander.controlify.gui.screen.RadialMenuScreen; import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.utils.CUtil; +import dev.isxander.controlify.utils.MinecraftUtil; import dev.isxander.controlify.virtualmouse.VirtualMouseBehaviour; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -23,42 +24,42 @@ public record BindContext(Identifier id, Function isApplicab public static final BindContext IN_GAME = register( "in_game", - mc -> mc.screen == null && mc.level != null && mc.player != null + mc -> MinecraftUtil.getScreen() == null && mc.level != null && mc.player != null ); public static final BindContext ANY_SCREEN = register( "screen", - mc -> mc.screen != null + mc -> MinecraftUtil.getScreen() != null ); public static final BindContext REGULAR_SCREEN = register( "regular_screen", - mc -> mc.screen != null + mc -> MinecraftUtil.getScreen() != null && !Controlify.instance().virtualMouseHandler().isVirtualMouseEnabled() ); public static final BindContext CONTAINER = register( "container", - mc -> mc.screen instanceof AbstractContainerScreen + mc -> MinecraftUtil.getScreen() instanceof AbstractContainerScreen ); public static final BindContext V_MOUSE_CURSOR = register( "vmouse_cursor", - mc -> mc.screen != null - && ScreenProcessorProvider.provide(mc.screen).virtualMouseBehaviour().hasCursor() + mc -> MinecraftUtil.getScreen() != null + && ScreenProcessorProvider.provide(MinecraftUtil.getScreen()).virtualMouseBehaviour().hasCursor() && Controlify.instance().virtualMouseHandler().isVirtualMouseEnabled() ); public static final BindContext V_MOUSE_COMPAT = register( "vmouse_compat", - mc -> mc.screen != null - && ScreenProcessorProvider.provide(mc.screen).virtualMouseBehaviour() == VirtualMouseBehaviour.ENABLED + mc -> MinecraftUtil.getScreen() != null + && ScreenProcessorProvider.provide(MinecraftUtil.getScreen()).virtualMouseBehaviour() == VirtualMouseBehaviour.ENABLED && Controlify.instance().virtualMouseHandler().isVirtualMouseEnabled() ); public static final BindContext RADIAL_MENU = register( "radial_menu", - mc -> mc.screen instanceof RadialMenuScreen + mc -> MinecraftUtil.getScreen() instanceof RadialMenuScreen ); private static BindContext register(String path, Function predicate) { diff --git a/src/main/java/dev/isxander/controlify/bindings/RadialIcons.java b/src/main/java/dev/isxander/controlify/bindings/RadialIcons.java index 8aca0d7cc..e2493be0e 100644 --- a/src/main/java/dev/isxander/controlify/bindings/RadialIcons.java +++ b/src/main/java/dev/isxander/controlify/bindings/RadialIcons.java @@ -4,7 +4,6 @@ import dev.isxander.controlify.utils.CUtil; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; @@ -70,7 +69,11 @@ private static void addPotionEffects(Map map) { Holder effect = BuiltInRegistries.MOB_EFFECT.wrapAsHolder(entry.getValue()); - Identifier sprite = Gui.getMobEffectSprite(effect); + //? if >=26.2 { + Identifier sprite = net.minecraft.client.gui.Hud.getMobEffectSprite(effect); + //?} else { + /*Identifier sprite = net.minecraft.client.gui.Gui.getMobEffectSprite(effect); + *///?} map.put(key.identifier().withPrefix("effect/"), (graphics, x, y, a) -> { var pose = graphics.pose().pushMatrix(); diff --git a/src/main/java/dev/isxander/controlify/bindings/output/KeyMappingEmulationOutput.java b/src/main/java/dev/isxander/controlify/bindings/output/KeyMappingEmulationOutput.java index d697ac4d3..edff6cfd7 100644 --- a/src/main/java/dev/isxander/controlify/bindings/output/KeyMappingEmulationOutput.java +++ b/src/main/java/dev/isxander/controlify/bindings/output/KeyMappingEmulationOutput.java @@ -5,6 +5,7 @@ import dev.isxander.controlify.bindings.KeyMappingHandle; import dev.isxander.controlify.bindings.StateAccess; import dev.isxander.controlify.controller.ControllerEntity; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -37,7 +38,7 @@ private void push() { if (ControlifyApi.get().getCurrentController().orElse(null) != controller) return; // only emulate current controller - if (Minecraft.getInstance().screen != null) + if (MinecraftUtil.getScreen() != null) return; // minecraft keybinds don't work in gui screens it conflicts KeyMappingHandle handle = (KeyMappingHandle) keyMapping; diff --git a/src/main/java/dev/isxander/controlify/compatibility/fancymenu/OpenControlifySettingsAction.java b/src/main/java/dev/isxander/controlify/compatibility/fancymenu/OpenControlifySettingsAction.java index 65c164b51..5aa175793 100644 --- a/src/main/java/dev/isxander/controlify/compatibility/fancymenu/OpenControlifySettingsAction.java +++ b/src/main/java/dev/isxander/controlify/compatibility/fancymenu/OpenControlifySettingsAction.java @@ -3,6 +3,7 @@ import de.keksuccino.fancymenu.customization.action.Action; import dev.isxander.controlify.gui.screen.ControlifySettingsScreen; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; @@ -20,7 +21,7 @@ public boolean hasValue() { @Override public void execute(@Nullable String s) { - ControlifySettingsScreen.openScreen(Minecraft.getInstance().screen); + ControlifySettingsScreen.openScreen(MinecraftUtil.getScreen()); } @Override diff --git a/src/main/java/dev/isxander/controlify/compatibility/simplevoicechat/SimpleVoiceChatCompat.java b/src/main/java/dev/isxander/controlify/compatibility/simplevoicechat/SimpleVoiceChatCompat.java index 324d0b0b2..55de1f94e 100644 --- a/src/main/java/dev/isxander/controlify/compatibility/simplevoicechat/SimpleVoiceChatCompat.java +++ b/src/main/java/dev/isxander/controlify/compatibility/simplevoicechat/SimpleVoiceChatCompat.java @@ -8,6 +8,7 @@ import dev.isxander.controlify.api.bind.InputBindingSupplier; import dev.isxander.controlify.compatibility.simplevoicechat.mixins.KeyEventsAccessor; import dev.isxander.controlify.controller.ControllerEntity; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.network.chat.CommonComponents; @@ -98,7 +99,7 @@ public static boolean isWhisperDown() { } private static void checkConnected() { - if (Minecraft.getInstance().getOverlay() == null && Minecraft.getInstance().screen == null) { + if (MinecraftUtil.getOverlay() == null && MinecraftUtil.getScreen() == null) { ((KeyEventsAccessor) ClientManager.instance().getKeyEvents()).invokeCheckConnected(); } } diff --git a/src/main/java/dev/isxander/controlify/controller/haptic/HDHapticComponent.java b/src/main/java/dev/isxander/controlify/controller/haptic/HDHapticComponent.java index 307dc21f1..620dbeb6a 100644 --- a/src/main/java/dev/isxander/controlify/controller/haptic/HDHapticComponent.java +++ b/src/main/java/dev/isxander/controlify/controller/haptic/HDHapticComponent.java @@ -54,8 +54,8 @@ public void playHaptic(SoundEvent sound) { .getSound(randomSource).getLocation(); SoundManager soundManager = Minecraft.getInstance().getSoundManager(); - SoundEngine soundEngine = ((SoundManagerAccessor) soundManager).getSoundEngine(); - SoundBufferLibrary bufferLibrary = ((SoundEngineAccessor) soundEngine).getSoundBuffers(); + SoundEngine soundEngine = ((SoundManagerAccessor) soundManager).controlify$getSoundEngine(); + SoundBufferLibrary bufferLibrary = ((SoundEngineAccessor) soundEngine).controlify$getSoundBuffers(); Identifier soundId = location.withPrefix("sounds/").withSuffix(".ogg"); @@ -75,8 +75,8 @@ private CompletableFuture getSoundData(Identifier id, Complet return sound .thenApply(soundBuffer -> hapticData.computeIfAbsent(id, key -> { var accessor = (SoundBufferAccessor) soundBuffer; - ByteBuffer bytes = accessor.getData(); - AudioFormat format = accessor.getFormat(); + ByteBuffer bytes = accessor.controlify$getData(); + AudioFormat format = accessor.controlify$getFormat(); if (bytes == null) { return null; diff --git a/src/main/java/dev/isxander/controlify/fixes/boatfix/AnalogBoatInput.java b/src/main/java/dev/isxander/controlify/fixes/boatfix/AnalogBoatInput.java index 1119f5f43..a3a50ef6a 100644 --- a/src/main/java/dev/isxander/controlify/fixes/boatfix/AnalogBoatInput.java +++ b/src/main/java/dev/isxander/controlify/fixes/boatfix/AnalogBoatInput.java @@ -1,9 +1,9 @@ package dev.isxander.controlify.fixes.boatfix; -import dev.isxander.controlify.mixins.feature.patches.analogueboat.BoatMixin; +import dev.isxander.controlify.mixins.feature.patches.analogueboat.AbstractBoatMixin; /** - * @see BoatMixin + * @see AbstractBoatMixin */ public interface AnalogBoatInput { void controlify$setAnalogInput(float forward, float right); diff --git a/src/main/java/dev/isxander/controlify/gui/controllers/BindController.java b/src/main/java/dev/isxander/controlify/gui/controllers/BindController.java index 4ffdd94dd..a5c6abff0 100644 --- a/src/main/java/dev/isxander/controlify/gui/controllers/BindController.java +++ b/src/main/java/dev/isxander/controlify/gui/controllers/BindController.java @@ -10,6 +10,7 @@ import dev.isxander.controlify.gui.screen.BindConsumerScreen; import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.screenop.ScreenProcessor; +import dev.isxander.controlify.utils.MinecraftUtil; import dev.isxander.yacl3.api.Controller; import dev.isxander.yacl3.api.Option; import dev.isxander.yacl3.api.utils.Dimension; @@ -105,7 +106,7 @@ public boolean mouseClicked(MouseButtonEvent mouseButtonEvent, boolean doubleCli private void openConsumerScreen() { awaitingControllerInput = true; - Minecraft.getInstance().setScreen(new BindConsumerScreen(this::getPressedBind, control.option(), this, Minecraft.getInstance().screen)); + MinecraftUtil.setScreen(new BindConsumerScreen(this::getPressedBind, control.option(), this, MinecraftUtil.getScreen())); } @Override diff --git a/src/main/java/dev/isxander/controlify/gui/guide/GuideDomain.java b/src/main/java/dev/isxander/controlify/gui/guide/GuideDomain.java index 78b5ebd1b..69381a51f 100644 --- a/src/main/java/dev/isxander/controlify/gui/guide/GuideDomain.java +++ b/src/main/java/dev/isxander/controlify/gui/guide/GuideDomain.java @@ -189,7 +189,7 @@ public void registerDynamicRule(Rule rule) { @Override public void render(GuiGraphicsExtractor graphics, boolean bottomAligned, boolean textContrast) { - GuideRenderer.render(graphics, this, Minecraft.getInstance(), bottomAligned, textContrast); + GuideRenderer.extractRenderState(graphics, this, Minecraft.getInstance(), bottomAligned, textContrast); } @Override diff --git a/src/main/java/dev/isxander/controlify/gui/guide/GuideRenderer.java b/src/main/java/dev/isxander/controlify/gui/guide/GuideRenderer.java index d4d4ba9ff..3cbb2bb83 100644 --- a/src/main/java/dev/isxander/controlify/gui/guide/GuideRenderer.java +++ b/src/main/java/dev/isxander/controlify/gui/guide/GuideRenderer.java @@ -9,7 +9,7 @@ public final class GuideRenderer { private GuideRenderer() {} - public static void render(GuiGraphicsExtractor graphics, GuideDomain domain, Minecraft minecraft, boolean bottomAligned, boolean textContrast) { + public static void extractRenderState(GuiGraphicsExtractor graphics, GuideDomain domain, Minecraft minecraft, boolean bottomAligned, boolean textContrast) { int width = minecraft.getWindow().getGuiScaledWidth(); int height = minecraft.getWindow().getGuiScaledHeight(); @@ -61,7 +61,7 @@ public Renderable(GuideDomain domain, Minecraft minecraft, boolean bottomAlig @Override public void extractRenderState(@NonNull GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) { - GuideRenderer.render(graphics, domain, minecraft, bottomAligned, textContrast); + GuideRenderer.extractRenderState(graphics, domain, minecraft, bottomAligned, textContrast); } public void setBottomAligned(boolean bottomAligned) { diff --git a/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java b/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java index c8831b824..e203c82c5 100644 --- a/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java +++ b/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java @@ -4,6 +4,7 @@ import dev.isxander.controlify.controller.ControllerEntity; import dev.isxander.controlify.api.guide.InGameCtx; import dev.isxander.controlify.mixins.feature.guide.ingame.MinecraftAccessor; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -16,14 +17,18 @@ public InGameButtonGuide(ControllerEntity controller, Minecraft minecraft) { this.minecraft = minecraft; } - public void renderHud(GuiGraphicsExtractor graphics, float tickDelta) { + public void extractRenderState(GuiGraphicsExtractor graphics, float tickDelta) { boolean debugOpen = minecraft.getDebugOverlay().showDebugScreen(); - boolean hideGui = minecraft.options.hideGui; - boolean screenOpen = minecraft.screen != null; + //? if >=26.2 { + boolean hideGui = minecraft.gui.hud.isHidden(); + //?} else { + /*boolean hideGui = minecraft.options.hideGui; + *///?} + boolean screenOpen = MinecraftUtil.getScreen() != null; GenericControllerSettings.GuideSettings settings = controller.settings().generic.guide; if (!debugOpen && !hideGui && !screenOpen && settings.showIngameGuide) { - GuideRenderer.render(graphics, GuideDomains.IN_GAME, minecraft, settings.ingameGuideBottom, true); + GuideRenderer.extractRenderState(graphics, GuideDomains.IN_GAME, minecraft, settings.ingameGuideBottom, true); } } @@ -32,7 +37,7 @@ public void tick() { if (settings.showIngameGuide) { if (minecraft.hitResult == null) { - ((MinecraftAccessor) minecraft).invokePick(1f); + ((MinecraftAccessor) minecraft).controlify$invokePick(1f); } GuideDomains.IN_GAME.updateGuides(new InGameCtx(minecraft, minecraft.player, minecraft.level, minecraft.hitResult, controller, settings.verbosity), minecraft.font); } diff --git a/src/main/java/dev/isxander/controlify/gui/screen/AskToMapControllerScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/AskToMapControllerScreen.java index f3c095f23..1659e970c 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/AskToMapControllerScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/AskToMapControllerScreen.java @@ -1,6 +1,7 @@ package dev.isxander.controlify.gui.screen; import dev.isxander.controlify.controller.ControllerEntity; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.ConfirmScreen; import net.minecraft.client.gui.screens.Screen; @@ -11,9 +12,9 @@ public AskToMapControllerScreen(ControllerEntity controller, Screen lastScreen) super( (confirmed) -> { if (confirmed) { - Minecraft.getInstance().setScreen(ControllerMappingMakerScreen.createGamepadMapping(controller.input().orElseThrow(), lastScreen)); + MinecraftUtil.setScreen(ControllerMappingMakerScreen.createGamepadMapping(controller.input().orElseThrow(), lastScreen)); } else { - Minecraft.getInstance().setScreen(lastScreen); + MinecraftUtil.setScreen(lastScreen); } }, Component.translatable("controlify.ask_to_map_controller.title"), diff --git a/src/main/java/dev/isxander/controlify/gui/screen/BindConsumerScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/BindConsumerScreen.java index 8d530ec50..28d7d3305 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/BindConsumerScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/BindConsumerScreen.java @@ -5,6 +5,7 @@ import dev.isxander.controlify.gui.controllers.BindController; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ScreenProcessorProvider; +import dev.isxander.controlify.utils.MinecraftUtil; import dev.isxander.yacl3.api.Option; import dev.isxander.yacl3.api.utils.Dimension; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -64,7 +65,7 @@ public void tick() { if (ticksTillClose == 0) { widgetToFocus.awaitingControllerInput = false; // don't call setScreen because will cause background to re-init - minecraft.screen = backgroundScreen; + MinecraftUtil.forceSetScreen(backgroundScreen); } } diff --git a/src/main/java/dev/isxander/controlify/gui/screen/BluetoothWarningScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/BluetoothWarningScreen.java index ae29d6a4b..ad855fa67 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/BluetoothWarningScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/BluetoothWarningScreen.java @@ -2,6 +2,7 @@ import dev.isxander.controlify.Controlify; import dev.isxander.controlify.controller.misc.BluetoothDeviceComponent; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.ConfirmScreen; import net.minecraft.client.gui.screens.Screen; @@ -16,7 +17,7 @@ public BluetoothWarningScreen(BluetoothDeviceComponent bt, Screen nextScreen) { Controlify.instance().config().saveSafely(); } - Minecraft.getInstance().setScreen(nextScreen); + MinecraftUtil.setScreen(nextScreen); }, Component.translatable("controlify.bluetooth_warning.title"), Component.translatable("controlify.bluetooth_warning.desc"), diff --git a/src/main/java/dev/isxander/controlify/gui/screen/ControlifySettingsScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/ControlifySettingsScreen.java index 80544490e..aab58c145 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/ControlifySettingsScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/ControlifySettingsScreen.java @@ -11,8 +11,8 @@ import dev.isxander.controlify.mixins.feature.ui.AbstractSelectionListAccessor; import dev.isxander.controlify.screenop.ScreenControllerEventListener; import dev.isxander.controlify.utils.CUtil; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.*; import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; @@ -49,7 +49,7 @@ public ControlifySettingsScreen(@Nullable Screen parent) { public static ControlifySettingsScreen openScreen(@Nullable Screen parent) { var screen = new ControlifySettingsScreen(parent); - Minecraft.getInstance().setScreen(screen); + MinecraftUtil.setScreen(screen); return screen; } @@ -97,7 +97,7 @@ protected void init() { globalSettingsButton = rowHelper.addChild( Button.builder( Component.translatable("controlify.gui.global_settings.title"), - btn -> minecraft.setScreen(GlobalSettingsScreenFactory.createGlobalSettingsScreen(this)) + btn -> MinecraftUtil.setScreen(GlobalSettingsScreenFactory.createGlobalSettingsScreen(this)) ).build() ); doneButton = rowHelper.addChild( @@ -175,8 +175,8 @@ public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX super.extractBackground(graphics, mouseX, mouseY, a); Identifier texture = minecraft.level == null - ? AbstractSelectionListAccessor.getMenuListBackground() - : AbstractSelectionListAccessor.getInWorldMenuListBackground(); + ? AbstractSelectionListAccessor.controlify$getMenuListBackground() + : AbstractSelectionListAccessor.controlify$getInWorldMenuListBackground(); graphics.blit( RenderPipelines.GUI_TEXTURED, @@ -198,7 +198,7 @@ public void onControllerInput(ControllerEntity controller) { @Override public void onClose() { - minecraft.setScreen(parent); + MinecraftUtil.setScreen(parent); } private boolean hasController() { @@ -301,7 +301,7 @@ private void onSettingsButtonPressed() { defaultSettings, this.controller ); - minecraft.setScreen(screen); + MinecraftUtil.setScreen(screen); } private void updateControllerInfo(boolean force) { diff --git a/src/main/java/dev/isxander/controlify/gui/screen/ControllerConfigScreenFactory.java b/src/main/java/dev/isxander/controlify/gui/screen/ControllerConfigScreenFactory.java index 6b360a3ca..c8ba70390 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/ControllerConfigScreenFactory.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/ControllerConfigScreenFactory.java @@ -27,6 +27,7 @@ import dev.isxander.controlify.rumble.RumbleState; import dev.isxander.controlify.server.ServerPolicies; import dev.isxander.controlify.utils.CUtil; +import dev.isxander.controlify.utils.MinecraftUtil; import dev.isxander.yacl3.api.*; import dev.isxander.yacl3.api.controller.*; import net.minecraft.ChatFormatting; @@ -414,7 +415,7 @@ private Optional makeControllerMappingGroup( .option(ButtonOption.createBuilder() .name(Component.translatable("controlify.gui.create_gamepad_mapping")) .description(OptionDescription.of(Component.translatable("controlify.gui.create_gamepad_mapping.tooltip"))) - .action((screen, button) -> Minecraft.getInstance().setScreen(ControllerMappingMakerScreen.createGamepadMapping(input, screen))) + .action((screen, button) -> MinecraftUtil.setScreen(ControllerMappingMakerScreen.createGamepadMapping(input, screen))) .build()) .option(ButtonOption.createBuilder() .name(Component.translatable("controlify.gui.clear_mapping")) @@ -642,7 +643,7 @@ private Optional makeBindsCategory( .build()) .action((screen, opt) -> { if (Minecraft.getInstance().level == null) return; - Minecraft.getInstance().setScreen(new RadialMenuScreen( + MinecraftUtil.setScreen(new RadialMenuScreen( controller.orElseThrow(), null, RadialItems.createBindings(controller.get()), diff --git a/src/main/java/dev/isxander/controlify/gui/screen/ControllerMappingMakerScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/ControllerMappingMakerScreen.java index 24ad020dd..4babf12e4 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/ControllerMappingMakerScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/ControllerMappingMakerScreen.java @@ -11,6 +11,7 @@ import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.utils.CUtil; +import dev.isxander.controlify.utils.MinecraftUtil; import dev.isxander.controlify.utils.render.RenderUtils; import dev.isxander.controlify.utils.ColorUtils; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -211,7 +212,7 @@ private void mapAsNone() { @Override public void onClose() { - minecraft.setScreen(lastScreen); + MinecraftUtil.setScreen(lastScreen); DeviceSettings deviceSettings = Controlify.instance().config().getSettings() .getOrCreateDeviceSettings(inputComponent.getController().uid()); deviceSettings.mapping = mappingBuilder.build(); diff --git a/src/main/java/dev/isxander/controlify/gui/screen/NoSDLScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/NoSDLScreen.java deleted file mode 100644 index b6c8db7dd..000000000 --- a/src/main/java/dev/isxander/controlify/gui/screen/NoSDLScreen.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.isxander.controlify.gui.screen; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.AlertScreen; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.CommonComponents; -import net.minecraft.network.chat.Component; - -public class NoSDLScreen extends AlertScreen { - public NoSDLScreen(Runnable actionHandler, Screen parent) { - super( - () -> { - actionHandler.run(); - Minecraft.getInstance().setScreen(parent); - }, - Component.translatable("controlify.gui.no_sdl.title"), - Component.translatable("controlify.gui.no_sdl.message"), - CommonComponents.GUI_OK, - false - ); - } -} diff --git a/src/main/java/dev/isxander/controlify/gui/screen/RadialItems.java b/src/main/java/dev/isxander/controlify/gui/screen/RadialItems.java index ec9e8bd55..734c5d034 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/RadialItems.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/RadialItems.java @@ -149,7 +149,13 @@ public static RadialMenuScreen.RadialItem[] createDebug() { ), new RadialItemRecord( Component.translatable("controlify.radial.debug.reload_packs"), - RadialIcons.getIcons().get(RadialIcons.getItem(Items.PINK_DYE)), + RadialIcons.getIcons().get( + //? if >=26.2 { + RadialIcons.getItem(Items.DYE.pink()) + //?} else { + /*RadialIcons.getItem(Items.PINK_DYE) + *///?} + ), () -> { DebugOverlayHelper.reloadResourcePacks(); return true; diff --git a/src/main/java/dev/isxander/controlify/gui/screen/RadialMenuScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/RadialMenuScreen.java index bc586c5e2..383a93040 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/RadialMenuScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/RadialMenuScreen.java @@ -12,6 +12,7 @@ import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.sound.ControlifyClientSounds; import dev.isxander.controlify.utils.CUtil; +import dev.isxander.controlify.utils.MinecraftUtil; import dev.isxander.controlify.utils.animation.api.Animation; import dev.isxander.controlify.utils.animation.api.EasingFunction; import dev.isxander.controlify.virtualmouse.VirtualMouseBehaviour; @@ -219,7 +220,7 @@ private void finishEditing() { @Override public void onClose() { Controlify.instance().config().saveIfDirty(); - minecraft.setScreen(parent); + MinecraftUtil.setScreen(parent); } @Override diff --git a/src/main/java/dev/isxander/controlify/hid/ControllerHIDService.java b/src/main/java/dev/isxander/controlify/hid/ControllerHIDService.java index 6ce701672..16e6f514e 100644 --- a/src/main/java/dev/isxander/controlify/hid/ControllerHIDService.java +++ b/src/main/java/dev/isxander/controlify/hid/ControllerHIDService.java @@ -7,7 +7,7 @@ import dev.isxander.controlify.debug.DebugProperties; import dev.isxander.controlify.driver.sdl.SDLNativesLoader; import dev.isxander.controlify.utils.CUtil; -import dev.isxander.controlify.utils.ToastUtils; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.network.chat.Component; import org.hid4java.*; @@ -78,7 +78,7 @@ private ControllerHIDInfo fetchType0(int jid) { if (firstFetch) { firstFetch = false; if (isDisabled() && !SDLNativesLoader.isLoaded()) { - ToastUtils.sendToast( + MinecraftUtil.sendToast( Component.translatable("controlify.error.hid"), Component.translatable("controlify.error.hid.desc"), true diff --git a/src/main/java/dev/isxander/controlify/ingame/ControllerPlayerMovement.java b/src/main/java/dev/isxander/controlify/ingame/ControllerPlayerMovement.java index f45240911..39fb87712 100644 --- a/src/main/java/dev/isxander/controlify/ingame/ControllerPlayerMovement.java +++ b/src/main/java/dev/isxander/controlify/ingame/ControllerPlayerMovement.java @@ -4,6 +4,7 @@ import dev.isxander.controlify.bindings.ControlifyBindings; import dev.isxander.controlify.api.bind.InputBinding; import dev.isxander.controlify.controller.ControllerEntity; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.player.KeyboardInput; import net.minecraft.client.player.LocalPlayer; @@ -24,7 +25,7 @@ public ControllerPlayerMovement(ControllerEntity controller, LocalPlayer player) @Override public void tick() { - if (Minecraft.getInstance().screen != null || player == null) { + if (MinecraftUtil.getScreen() != null || player == null) { this.setMoveVec(0, 0); this.keyPresses = Input.EMPTY; diff --git a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java index 9c9c8c8a9..32a0aa130 100644 --- a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java +++ b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java @@ -19,6 +19,7 @@ import dev.isxander.controlify.utils.ControllerUtils; import dev.isxander.controlify.utils.DebugOverlayHelper; import dev.isxander.controlify.utils.HoldRepeatHelper; +import dev.isxander.controlify.utils.MinecraftUtil; import dev.isxander.controlify.utils.animation.api.Animation; import dev.isxander.controlify.utils.animation.api.EasingFunction; import net.minecraft.client.CameraType; @@ -84,7 +85,7 @@ public void inputTick() { } protected void handleKeybinds() { - if (minecraft.screen != null) + if (MinecraftUtil.getScreen() != null) return; if (ControlifyBindings.PAUSE.on(controller).justPressed()) { @@ -134,7 +135,7 @@ protected void handleKeybinds() { minecraft.player.sendOpenInventory(); } else { minecraft.getTutorial().onOpenInventory(); - minecraft.setScreen(new InventoryScreen(minecraft.player)); + MinecraftUtil.setScreen(new InventoryScreen(minecraft.player)); } } @@ -149,7 +150,11 @@ protected void handleKeybinds() { } } if (ControlifyBindings.TOGGLE_HUD_VISIBILITY.on(controller).justPressed()) { - minecraft.options.hideGui = !minecraft.options.hideGui; + //? if >=26.2 { + minecraft.gui.hud.toggle(); + //?} else { + /*minecraft.options.hideGui = !minecraft.options.hideGui; + *///?} } if (ControlifyBindings.SHOW_PLAYER_LIST.on(controller).justPressed()) { @@ -170,7 +175,7 @@ protected void handleKeybinds() { DebugOverlayHelper.toggleProfilerOverlay(); } if (ControlifyBindings.DEBUG_RADIAL.on(controller).justPressed()) { - minecraft.setScreen(new RadialMenuScreen( + MinecraftUtil.setScreen(new RadialMenuScreen( controller, ControlifyBindings.DEBUG_RADIAL.on(controller), RadialItems.createDebug(), @@ -181,7 +186,7 @@ protected void handleKeybinds() { if (ControlifyBindings.TAKE_SCREENSHOT.on(controller).justPressed()) { // get file before it takes and writes the screenshot (which changes the next name) - File screenshotFile = ScreenshotAccessor.invokeGetFile( + File screenshotFile = ScreenshotAccessor.controlify$invokeGetFile( new File(minecraft.gameDirectory, "screenshots") ); @@ -189,7 +194,12 @@ protected void handleKeybinds() { this.minecraft.gameDirectory, this.minecraft.getMainRenderTarget(), component -> this.minecraft.execute(() -> { - this.minecraft.gui.getChat().addClientSystemMessage(component); + //? if >=26.2 { + this.minecraft.gui.hud.getChat() + //?} else { + /*this.minecraft.gui.getChat() + *///?} + .addClientSystemMessage(component); // TODO: this currently does not work, yet to debug why not SteamDeckDriver.getDeck().ifPresent(deck -> { @@ -207,7 +217,7 @@ protected void handleKeybinds() { } if (ControlifyBindings.RADIAL_MENU.on(controller).justPressed()) { - minecraft.setScreen(new RadialMenuScreen( + MinecraftUtil.setScreen(new RadialMenuScreen( controller, ControlifyBindings.RADIAL_MENU.on(controller), RadialItems.createBindings(controller), @@ -217,7 +227,7 @@ protected void handleKeybinds() { } if (ControlifyBindings.GAME_MODE_SWITCHER.on(controller).justPressed()) { - minecraft.setScreen(new RadialMenuScreen( + MinecraftUtil.setScreen(new RadialMenuScreen( controller, ControlifyBindings.GAME_MODE_SWITCHER.on(controller), RadialItems.createGameModes(), @@ -227,7 +237,7 @@ protected void handleKeybinds() { } if (ControlifyBindings.HOTBAR_SLOT_SELECT.on(controller).justPressed()) { - minecraft.setScreen(new RadialMenuScreen( + MinecraftUtil.setScreen(new RadialMenuScreen( controller, ControlifyBindings.HOTBAR_SLOT_SELECT.on(controller), RadialItems.createHotbarItemSelect(), @@ -236,9 +246,9 @@ protected void handleKeybinds() { )); } - if (minecraft.player.hasInfiniteMaterials()) { + if (minecraft.player != null && minecraft.player.hasInfiniteMaterials()) { if (ControlifyBindings.HOTBAR_LOAD_RADIAL.on(controller).justPressed()) { - minecraft.setScreen(new RadialMenuScreen( + MinecraftUtil.setScreen(new RadialMenuScreen( controller, ControlifyBindings.HOTBAR_LOAD_RADIAL.on(controller), RadialItems.createHotbarLoad(), @@ -247,7 +257,7 @@ protected void handleKeybinds() { )); } if (ControlifyBindings.HOTBAR_SAVE_RADIAL.on(controller).justPressed()) { - minecraft.setScreen(new RadialMenuScreen( + MinecraftUtil.setScreen(new RadialMenuScreen( controller, ControlifyBindings.HOTBAR_SAVE_RADIAL.on(controller), RadialItems.createHotbarSave(), @@ -451,7 +461,7 @@ private boolean isAiming(Player player) { private boolean canProcessLookInput() { boolean mouseNotGrabbed = !minecraft.mouseHandler.isMouseGrabbed() && !controlify.config().getSettings().globalSettings().outOfFocusInput; boolean outOfFocus = !minecraft.isWindowActive() && !controlify.config().getSettings().globalSettings().outOfFocusInput; - boolean screenVisible = minecraft.screen != null; + boolean screenVisible = MinecraftUtil.getScreen() != null; boolean playerExists = minecraft.player != null; return !mouseNotGrabbed && !outOfFocus && !screenVisible && playerExists; diff --git a/src/main/java/dev/isxander/controlify/mixins/core/GuiMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/GuiMixin.java index aed793327..c04878806 100644 --- a/src/main/java/dev/isxander/controlify/mixins/core/GuiMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/GuiMixin.java @@ -1,16 +1,79 @@ package dev.isxander.controlify.mixins.core; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import dev.isxander.controlify.Controlify; -import dev.isxander.controlify.ingame.InGameInputHandler; -import net.minecraft.client.gui.Gui; +import dev.isxander.controlify.api.ControlifyApi; +import dev.isxander.controlify.utils.InitialScreenRegistryDuck; +import dev.isxander.controlify.utils.MinecraftUtil; +import dev.isxander.controlify.utils.MouseMinecraftCallNotifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; 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; -@Mixin(Gui.class) -public class GuiMixin { - @ModifyExpressionValue(method = "extractTabList", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/KeyMapping;isDown()Z")) - private boolean shouldShowPlayerList(boolean keyDown) { - return keyDown || Controlify.instance().inGameInputHandler().map(InGameInputHandler::shouldShowPlayerList).orElse(false); +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +@Mixin( + //? if >=26.2 { + net.minecraft.client.gui.Gui.class + //?} else { + /*Minecraft.class + *///?} +) +public class GuiMixin implements InitialScreenRegistryDuck { + @Unique + private final List> initialScreenCallbacks = new ArrayList<>(); + @Unique private boolean initialScreensHappened = false; + + // Ideally, this would be done in MouseHandler#releaseMouse, but moving + // the mouse before the screen init is bad, because some mods (e.g. PuzzleLib) + // have custom mouse events that call into screens, events that have not been + // initialised yet in Screen#init. Causing NPEs and many strange issues. + @Inject(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;releaseMouse()V")) + private void notifyInjectionToNotRun(Screen screen, CallbackInfo ci) { + ((MouseMinecraftCallNotifier) Minecraft.getInstance().mouseHandler).controlify$imFromMinecraftSetScreen(); + } + + /** + * Without this, the mouse would be left in the middle of the + * screen, hovering over whatever is there which would look wrong + * as there is a focus as well. + */ + @Inject( + method = "setScreen", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/gui/screens/Screen;init(II)V", + shift = At.Shift.AFTER + ) + ) + private void hideMouseAfterRelease(Screen screen, CallbackInfo ci) { + if (ControlifyApi.get().currentInputMode().isController()) { + Controlify.instance().hideMouse(true, true); + } + } + + @WrapMethod(method = "addInitialScreens") + private boolean injectCustomInitialScreens(List> screens, Operation original) { + boolean result = original.call(screens); + screens.addAll(initialScreenCallbacks); + initialScreensHappened = true; + return result; + } + + @Override + public void controlify$registerInitialScreen(Function screenFactory) { + if (initialScreensHappened) { + Screen lastScreen = MinecraftUtil.getScreen(); + MinecraftUtil.setScreen(screenFactory.apply(() -> MinecraftUtil.setScreen(lastScreen))); + } else { + initialScreenCallbacks.add(screenFactory); + } } } diff --git a/src/main/java/dev/isxander/controlify/mixins/core/HudMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/HudMixin.java new file mode 100644 index 000000000..6e59df615 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/core/HudMixin.java @@ -0,0 +1,21 @@ +package dev.isxander.controlify.mixins.core; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import dev.isxander.controlify.Controlify; +import dev.isxander.controlify.ingame.InGameInputHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin( + //? if >=26.2 { + net.minecraft.client.gui.Hud.class + //?} else { + /*net.minecraft.client.gui.Gui.class + *///?} +) +public class HudMixin { + @ModifyExpressionValue(method = "extractTabList", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/KeyMapping;isDown()Z")) + private boolean shouldShowPlayerList(boolean keyDown) { + return keyDown || Controlify.instance().inGameInputHandler().map(InGameInputHandler::shouldShowPlayerList).orElse(false); + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java index 29474a832..f75cf99dd 100644 --- a/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java @@ -1,74 +1,24 @@ package dev.isxander.controlify.mixins.core; -import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import dev.isxander.controlify.Controlify; -import dev.isxander.controlify.api.ControlifyApi; import dev.isxander.controlify.controllermanager.ControllerManager; -import dev.isxander.controlify.utils.InitialScreenRegistryDuck; -import dev.isxander.controlify.utils.MouseMinecraftCallNotifier; import dev.isxander.controlify.utils.animation.impl.Animator; import net.minecraft.CrashReport; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; -import net.minecraft.client.MouseHandler; -import net.minecraft.client.gui.screens.Screen; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; 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.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - @Mixin(Minecraft.class) -public abstract class MinecraftMixin implements InitialScreenRegistryDuck { - @Shadow public abstract void setScreen(@Nullable Screen screen); - +public abstract class MinecraftMixin { @Shadow public abstract DeltaTracker getDeltaTracker(); - @Shadow @Final public MouseHandler mouseHandler; - @Shadow @Nullable public Screen screen; - @Shadow - public abstract void emergencySaveAndCrash(CrashReport crashReport); - - @Unique private final List> initialScreenCallbacks = new ArrayList<>(); - @Unique private boolean initialScreensHappened = false; - - // Ideally, this would be done in MouseHandler#releaseMouse, but moving - // the mouse before the screen init is bad, because some mods (e.g. PuzzleLib) - // have custom mouse events that call into screens, events that have not been - // initialised yet in Screen#init. Causing NPEs and many strange issues. - @Inject(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;releaseMouse()V")) - private void notifyInjectionToNotRun(Screen screen, CallbackInfo ci) { - ((MouseMinecraftCallNotifier) mouseHandler).controlify$imFromMinecraftSetScreen(); - } - - /** - * Without this, the mouse would be left in the middle of the - * screen, hovering over whatever is there which would look wrong - * as there is a focus as well. - */ - @Inject( - method = "setScreen", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/gui/screens/Screen;init(II)V", - shift = At.Shift.AFTER - ) - ) - private void hideMouseAfterRelease(Screen screen, CallbackInfo ci) { - if (ControlifyApi.get().currentInputMode().isController()) { - Controlify.instance().hideMouse(true, true); - } - } + public abstract void emergencySaveAndCrash(CrashReport partialReport); @Inject(method = "onGameLoadFinished", at = @At("RETURN")) private void initControlifyNow(CallbackInfo ci) { @@ -110,26 +60,8 @@ private void tickAnimator(CallbackInfo ci) { Animator.INSTANCE.tick(getTickDelta()); } - @WrapMethod(method = "addInitialScreens") - private boolean injectCustomInitialScreens(List> screens, Operation original) { - boolean result = original.call(screens); - screens.addAll(initialScreenCallbacks); - initialScreensHappened = true; - return result; - } - @Unique private float getTickDelta() { return getDeltaTracker().getGameTimeDeltaTicks(); } - - @Override - public void controlify$registerInitialScreen(Function screenFactory) { - if (initialScreensHappened) { - Screen lastScreen = this.screen; - setScreen(screenFactory.apply(() -> setScreen(lastScreen))); - } else { - initialScreenCallbacks.add(screenFactory); - } - } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/bind/GuiAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/bind/GuiAccessor.java new file mode 100644 index 000000000..b1f92d136 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/bind/GuiAccessor.java @@ -0,0 +1,14 @@ +package dev.isxander.controlify.mixins.feature.bind; + +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.screens.Screen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Gui.class) +public interface GuiAccessor { + //? if >=26.2 { + @Accessor("screen") + void controlify$setScreenField(Screen screen); + //?} +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/bind/GuiMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/bind/GuiMixin.java index 577bae988..fdce12063 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/bind/GuiMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/bind/GuiMixin.java @@ -1,23 +1,24 @@ package dev.isxander.controlify.mixins.feature.bind; -import dev.isxander.controlify.gui.screen.RadialMenuScreen; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; -import org.spongepowered.asm.mixin.Final; +import dev.isxander.controlify.api.ControlifyApi; +import dev.isxander.controlify.controller.ControllerEntity; +import dev.isxander.controlify.controller.input.InputComponent; 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(Gui.class) +@Mixin( + //? if >=26.2 { + net.minecraft.client.gui.Gui.class + //?} else { + /*net.minecraft.client.Minecraft.class + *///?} +) public class GuiMixin { - @Shadow @Final private Minecraft minecraft; - - @Inject(method = "extractCrosshair", at = @At("HEAD"), cancellable = true) - private void shouldRenderCrosshair(CallbackInfo ci) { - if (minecraft.screen instanceof RadialMenuScreen) { - ci.cancel(); - } + @Inject(method = "setScreen", at = @At("HEAD")) + private void notifyBindGuiOutputOfScreenChange(CallbackInfo ci) { + ControlifyApi.get().getCurrentController().flatMap(ControllerEntity::input) + .ifPresent(InputComponent::notifyGuiPressOutputsOfNavigate); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/bind/HudMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/bind/HudMixin.java new file mode 100644 index 000000000..8d45c9388 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/bind/HudMixin.java @@ -0,0 +1,25 @@ +package dev.isxander.controlify.mixins.feature.bind; + +import dev.isxander.controlify.gui.screen.RadialMenuScreen; +import dev.isxander.controlify.utils.MinecraftUtil; +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.callback.CallbackInfo; + +@Mixin( + //? if >=26.2 { + net.minecraft.client.gui.Hud.class + //?} else { + /*net.minecraft.client.gui.Gui.class + *///?} +) +public class HudMixin { + + @Inject(method = "extractCrosshair", at = @At("HEAD"), cancellable = true) + private void shouldRenderCrosshair(CallbackInfo ci) { + if (MinecraftUtil.getScreen() instanceof RadialMenuScreen) { + ci.cancel(); + } + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/bind/MinecraftMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/bind/MinecraftMixin.java deleted file mode 100644 index d5d7b44ba..000000000 --- a/src/main/java/dev/isxander/controlify/mixins/feature/bind/MinecraftMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package dev.isxander.controlify.mixins.feature.bind; - -import dev.isxander.controlify.api.ControlifyApi; -import dev.isxander.controlify.controller.ControllerEntity; -import dev.isxander.controlify.controller.input.InputComponent; -import net.minecraft.client.Minecraft; -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.callback.CallbackInfo; - -@Mixin(Minecraft.class) -public class MinecraftMixin { - @Inject(method = "setScreen", at = @At("HEAD")) - private void notifyBindGuiOutputOfScreenChange(CallbackInfo ci) { - ControlifyApi.get().getCurrentController().flatMap(ControllerEntity::input) - .ifPresent(InputComponent::notifyGuiPressOutputsOfNavigate); - } -} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/font/FontAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/font/FontAccessor.java index ade233f5e..d8a4f0fa0 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/font/FontAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/font/FontAccessor.java @@ -8,6 +8,6 @@ @Mixin(Font.class) public interface FontAccessor { - @Invoker - BakedGlyph invokeGetGlyph(int i, Style style); + @Invoker("getGlyph") + BakedGlyph controlfy$invokeGetGlyph(int i, Style style); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/GuiMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/HudMixin.java similarity index 81% rename from src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/GuiMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/HudMixin.java index af21ca645..5d70ab198 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/GuiMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/HudMixin.java @@ -3,7 +3,6 @@ import dev.isxander.controlify.Controlify; import dev.isxander.controlify.gui.guide.InGameButtonGuide; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -11,8 +10,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(Gui.class) -public class GuiMixin { +@Mixin( + //? if >=26.2 { + net.minecraft.client.gui.Hud.class + //?} else { + /*net.minecraft.client.gui.Gui.class + *///?} +) +public class HudMixin { @Shadow @Final private Minecraft minecraft; @Inject(method = "tick()V", at = @At("RETURN")) diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/MinecraftAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/MinecraftAccessor.java index 08c43d718..871902918 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/MinecraftAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/MinecraftAccessor.java @@ -6,6 +6,6 @@ @Mixin(Minecraft.class) public interface MinecraftAccessor { - @Invoker - void invokePick(float partialTicks); + @Invoker("pick") + void controlify$invokePick(float partialTicks); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/PlayerAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/PlayerAccessor.java index 1474f9d79..8b313bfce 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/PlayerAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/guide/ingame/PlayerAccessor.java @@ -6,6 +6,6 @@ @Mixin(Player.class) public interface PlayerAccessor { - @Invoker - boolean callCanGlide(); + @Invoker("canGlide") + boolean controlify$callCanGlide(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/AbstractContainerScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/AbstractContainerScreenAccessor.java index c393088a5..63a8206fc 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/AbstractContainerScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/AbstractContainerScreenAccessor.java @@ -8,15 +8,15 @@ @Mixin(AbstractContainerScreen.class) public interface AbstractContainerScreenAccessor { - @Accessor - Slot getHoveredSlot(); + @Accessor("hoveredSlot") + Slot controlify$getHoveredSlot(); - @Invoker - boolean invokeHasClickedOutside(double mouseX, double mouseY, int left, int top); + @Invoker("hasClickedOutside") + boolean controlify$invokeHasClickedOutside(double mouseX, double mouseY, int left, int top); - @Accessor - int getLeftPos(); + @Accessor("leftPos") + int controlify$getLeftPos(); - @Accessor - int getTopPos(); + @Accessor("topPos") + int controlify$getTopPos(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundBufferAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundBufferAccessor.java index 89e667abd..0327d4d3e 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundBufferAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundBufferAccessor.java @@ -10,9 +10,9 @@ @Mixin(SoundBuffer.class) public interface SoundBufferAccessor { - @Accessor - @Nullable ByteBuffer getData(); + @Accessor("data") + @Nullable ByteBuffer controlify$getData(); - @Accessor - AudioFormat getFormat(); + @Accessor("format") + AudioFormat controlify$getFormat(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundEngineAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundEngineAccessor.java index 845859e9d..0e82905a4 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundEngineAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundEngineAccessor.java @@ -7,6 +7,6 @@ @Mixin(SoundEngine.class) public interface SoundEngineAccessor { - @Accessor - SoundBufferLibrary getSoundBuffers(); + @Accessor("soundBuffers") + SoundBufferLibrary controlify$getSoundBuffers(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundManagerAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundManagerAccessor.java index 788bac9d0..ec7545e4b 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundManagerAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/hdhaptics/SoundManagerAccessor.java @@ -7,6 +7,6 @@ @Mixin(SoundManager.class) public interface SoundManagerAccessor { - @Accessor - SoundEngine getSoundEngine(); + @Accessor("soundEngine") + SoundEngine controlify$getSoundEngine(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/patches/analogueboat/BoatMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/patches/analogueboat/AbstractBoatMixin.java similarity index 97% rename from src/main/java/dev/isxander/controlify/mixins/feature/patches/analogueboat/BoatMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/patches/analogueboat/AbstractBoatMixin.java index 8855dadf6..7046f14eb 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/patches/analogueboat/BoatMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/patches/analogueboat/AbstractBoatMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(AbstractBoat.class) -public abstract class BoatMixin implements AnalogBoatInput { +public abstract class AbstractBoatMixin implements AnalogBoatInput { @Shadow private float deltaRotation; @Shadow private boolean inputLeft; @Shadow private boolean inputRight; diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/MinecraftMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/GuiMixin.java similarity index 77% rename from src/main/java/dev/isxander/controlify/mixins/feature/screenop/MinecraftMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/GuiMixin.java index 212023607..ab8301119 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/MinecraftMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/GuiMixin.java @@ -3,24 +3,28 @@ import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.llamalad7.mixinextras.sugar.Local; import dev.isxander.controlify.screenop.ComponentProcessorProvider; -import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.screenop.keyboard.KeyboardOverlayScreen; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; 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.callback.CallbackInfo; -@Mixin(Minecraft.class) -public class MinecraftMixin { +@Mixin( + //? if >=26.2 { + net.minecraft.client.gui.Gui.class + //?} else { + /*net.minecraft.client.Minecraft.class + *///?} +) +public class GuiMixin { @Inject(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;updateTitle()V")) private void changeScreen(Screen screen, CallbackInfo ci) { ComponentProcessorProvider.REGISTRY.clearCache(); } @WrapWithCondition(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;removed()V")) - private boolean preventRemovingOldScreen(Screen oldScreen, @Local(argsOnly = true) Screen newScreen) { - return !(newScreen instanceof KeyboardOverlayScreen); + private boolean preventRemovingOldScreen(Screen oldScreen, @Local(argsOnly = true, name = "screen") Screen screen) { + return !(screen instanceof KeyboardOverlayScreen); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/ScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/ScreenAccessor.java index ef12a8309..6ffbb7ae9 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/ScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/ScreenAccessor.java @@ -2,8 +2,6 @@ import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.components.Renderable; -import net.minecraft.client.gui.navigation.FocusNavigationEvent; -import net.minecraft.client.gui.navigation.ScreenDirection; import net.minecraft.client.gui.screens.Screen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -13,18 +11,15 @@ @Mixin(Screen.class) public interface ScreenAccessor { - @Invoker - FocusNavigationEvent.ArrowNavigation invokeCreateArrowEvent(ScreenDirection direction); + @Invoker("changeFocus") + void controlify$invokeChangeFocus(ComponentPath path); - @Invoker - void invokeChangeFocus(ComponentPath path); + @Invoker("clearFocus") + void controlify$invokeClearFocus(); - @Invoker - void invokeClearFocus(); - - @Invoker + @Invoker("setInitialFocus") void invokeSetInitialFocus(); - @Accessor - List getRenderables(); + @Accessor("renderables") + List controlify$getRenderables(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/chat/ChatComponentMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/chat/ChatComponentMixin.java index d57283491..fa34531e9 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/chat/ChatComponentMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/chat/ChatComponentMixin.java @@ -4,21 +4,15 @@ import com.llamalad7.mixinextras.expression.Expression; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import dev.isxander.controlify.screenop.keyboard.ChatKeyboardDucky; -import net.minecraft.client.Minecraft; +import dev.isxander.controlify.utils.MinecraftUtil; 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.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(ChatComponent.class) public abstract class ChatComponentMixin { - @Shadow - @Final - private Minecraft minecraft; @Unique private static final int VANILLA_CHAT_PADDING = 40; @Unique private static final int SHIFTED_CHAT_PADDING = 20; @@ -30,7 +24,7 @@ public abstract class ChatComponentMixin { at = @At("MIXINEXTRAS:EXPRESSION") ) private int modifyChatOffset(int y) { - if (minecraft.screen instanceof ChatScreen chat) + if (MinecraftUtil.getScreen() instanceof ChatScreen chat) return (int) (y * (1 - ChatKeyboardDucky.getKeyboardShiftAmount(chat))); return y; } @@ -40,7 +34,7 @@ private int modifyChatOffset(int y) { at = @At(value = "CONSTANT", args = "intValue=" + VANILLA_CHAT_PADDING) ) private int modifyChatToInputPadding(int padding) { - if (minecraft.screen instanceof ChatScreen chat) { + if (MinecraftUtil.getScreen() instanceof ChatScreen chat) { if (ChatKeyboardDucky.getKeyboardShiftAmount(chat) > 0) { return SHIFTED_CHAT_PADDING; } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/chat/CommandSuggestionsMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/chat/CommandSuggestionsMixin.java index 198991e22..13c2f631e 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/chat/CommandSuggestionsMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/chat/CommandSuggestionsMixin.java @@ -3,10 +3,12 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import dev.isxander.controlify.screenop.keyboard.ChatKeyboardDucky; import dev.isxander.controlify.screenop.compat.vanilla.ChatScreenProcessor; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.CommandSuggestions; import net.minecraft.client.gui.screens.ChatScreen; import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -22,9 +24,23 @@ public class CommandSuggestionsMixin implements ChatScreenProcessor.CmdSuggestio @Nullable private CommandSuggestions.@Nullable SuggestionsList suggestions; - @ModifyExpressionValue(method = {"renderUsage", "showSuggestions"}, at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/screens/Screen;height:I")) + @ModifyExpressionValue( + method = { + //? if >=26.2 { + "extractUsage", + //?} else { + /*"renderUsage", + *///?} + "showSuggestions" + }, + at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/gui/screens/Screen;height:I", + opcode = Opcodes.GETFIELD + ) + ) private int modifyUsageHeight(int height) { - if (minecraft.screen instanceof ChatScreen chat) + if (MinecraftUtil.getScreen() instanceof ChatScreen chat) return (int) (height * (1 - ChatKeyboardDucky.getKeyboardShiftAmount(chat))); return height; } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/elements/AbstractWidgetMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/elements/AbstractWidgetMixin.java index 68fdf0a5b..6314677d3 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/elements/AbstractWidgetMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/elements/AbstractWidgetMixin.java @@ -4,6 +4,7 @@ import dev.isxander.controlify.Controlify; import dev.isxander.controlify.controller.ControllerEntity; import dev.isxander.controlify.screenop.ScreenProcessorProvider; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.input.MouseButtonEvent; @@ -20,11 +21,13 @@ public class AbstractWidgetMixin { ) ) private boolean openKeyboardInVmouseMode(AbstractWidget instance, MouseButtonEvent event, boolean doubleClick) { + assert MinecraftUtil.getScreen() != null; + Controlify controlify = Controlify.instance(); ControllerEntity controller = controlify.getCurrentController().orElse(null); if (controller != null && controlify.virtualMouseHandler().isVirtualMouseEnabled()) { - var screenProcessor = ScreenProcessorProvider.provide(Minecraft.getInstance().screen); + var screenProcessor = ScreenProcessorProvider.provide(MinecraftUtil.getScreen()); return !screenProcessor.tryOpenKeyboard(controller, (AbstractWidget) (Object) this); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/elements/EditBoxMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/elements/EditBoxMixin.java index ff13634da..76d110f03 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/elements/EditBoxMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/elements/EditBoxMixin.java @@ -12,6 +12,7 @@ import dev.isxander.controlify.screenop.keyboard.CommonKeyboardHints; import dev.isxander.controlify.screenop.keyboard.ComponentKeyboardBehaviour; import dev.isxander.controlify.screenop.keyboard.KeyboardOverlayScreen; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -53,7 +54,11 @@ public EditBoxMixin(int x, int y, int width, int height, Component message) { * If the edit box has some text, the hint will be minimally rendered */ @ModifyExpressionValue(method = "extractWidgetRenderState", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Font;plainSubstrByWidth(Ljava/lang/String;I)Ljava/lang/String;")) - private String renderHintText(String renderedValue, @Local(argsOnly = true) GuiGraphicsExtractor graphics, @Share("renderHint") LocalBooleanRef renderHint) { + private String renderHintText( + String renderedValue, + @Local(argsOnly = true, name = "graphics") GuiGraphicsExtractor graphics, + @Share("renderHint") LocalBooleanRef renderHint + ) { renderHint.set(false); ControlifyApi.get().getCurrentController().ifPresent(controller -> { @@ -61,7 +66,7 @@ private String renderHintText(String renderedValue, @Local(argsOnly = true) GuiG && controller.settings().generic.keyboard.showOnScreenKeyboard && controller.settings().generic.guide.showScreenGuides && ControlifyApi.get().currentInputMode().isController() - && !(Minecraft.getInstance().screen instanceof KeyboardOverlayScreen) + && !(MinecraftUtil.getScreen() instanceof KeyboardOverlayScreen) && processor.getKeyboardBehaviour() instanceof ComponentKeyboardBehaviour.Handled ) { int textX = this.getX() + (this.isBordered() ? 2 : 0) + 2; diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/JoinMultiplayerScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/JoinMultiplayerScreenAccessor.java index 6f02c53c1..b7cd2f1d7 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/JoinMultiplayerScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/JoinMultiplayerScreenAccessor.java @@ -7,6 +7,6 @@ @Mixin(JoinMultiplayerScreen.class) public interface JoinMultiplayerScreenAccessor { - @Accessor - Button getSelectButton(); + @Accessor("selectButton") + Button controlify$getSelectButton(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/OptionsSubScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/OptionsSubScreenAccessor.java index 78359c700..d21848fda 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/OptionsSubScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/OptionsSubScreenAccessor.java @@ -7,6 +7,6 @@ @Mixin(OptionsSubScreen.class) public interface OptionsSubScreenAccessor { - @Accessor - Screen getLastScreen(); + @Accessor("lastScreen") + Screen controlify$getLastScreen(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/PauseScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/PauseScreenAccessor.java index 1dabd05e1..7e31236b7 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/PauseScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/PauseScreenAccessor.java @@ -6,6 +6,6 @@ @Mixin(PauseScreen.class) public interface PauseScreenAccessor { - @Accessor + @Accessor("showPauseMenu") boolean getShowPauseMenu(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/SelectWorldScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/SelectWorldScreenAccessor.java index f64bc7810..d68fc21cc 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/SelectWorldScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/SelectWorldScreenAccessor.java @@ -8,9 +8,9 @@ @Mixin(SelectWorldScreen.class) public interface SelectWorldScreenAccessor { - @Accessor - Button getPlayWorldButton(); + @Accessor("playWorldButton") + Button controlify$getPlayWorldButton(); - @Accessor - WorldSelectionList getList(); + @Accessor("list") + WorldSelectionList controlify$getList(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/TabNavigationBarAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/TabNavigationBarAccessor.java index efd7c6199..f5e1090fc 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/TabNavigationBarAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/outofgame/TabNavigationBarAccessor.java @@ -9,9 +9,9 @@ @Mixin(TabNavigationBar.class) public interface TabNavigationBarAccessor { - @Accessor - ImmutableList getTabs(); + @Accessor("tabs") + ImmutableList controlify$getTabs(); - @Accessor - TabManager getTabManager(); + @Accessor("tabManager") + TabManager controlify$getTabManager(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/steamdeck/ScreenshotAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/steamdeck/ScreenshotAccessor.java index a188ad6cc..615e4e529 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/steamdeck/ScreenshotAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/steamdeck/ScreenshotAccessor.java @@ -8,8 +8,8 @@ @Mixin(Screenshot.class) public interface ScreenshotAccessor { - @Invoker - static File invokeGetFile(File file) { + @Invoker("getFile") + static File controlify$invokeGetFile(File file) { throw new AssertionError(); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/ui/AbstractSelectionListAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/ui/AbstractSelectionListAccessor.java index bbd51e0b3..e37f3e70e 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/ui/AbstractSelectionListAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/ui/AbstractSelectionListAccessor.java @@ -8,12 +8,12 @@ @Mixin(AbstractSelectionList.class) public interface AbstractSelectionListAccessor { @Accessor("MENU_LIST_BACKGROUND") - static Identifier getMenuListBackground() { + static Identifier controlify$getMenuListBackground() { throw new AssertionError(); } @Accessor("INWORLD_MENU_LIST_BACKGROUND") - static Identifier getInWorldMenuListBackground() { + static Identifier controlify$getInWorldMenuListBackground() { throw new AssertionError(); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/util/ConnectScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/util/ConnectScreenMixin.java index 778243f45..40e7580ba 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/util/ConnectScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/util/ConnectScreenMixin.java @@ -16,11 +16,12 @@ public class ConnectScreenMixin { @Inject(method = "connect", at = @At("HEAD")) private void onConnect( - Minecraft client, - ServerAddress address, @Nullable ServerData serverInfo, + Minecraft minecraft, + ServerAddress hostAndPort, + @Nullable ServerData server, @Nullable TransferState transferState, CallbackInfo ci ) { - Controlify.instance().notifyNewServer(serverInfo); + Controlify.instance().notifyNewServer(server); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/GuiMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/GuiMixin.java new file mode 100644 index 000000000..1321e0cc3 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/GuiMixin.java @@ -0,0 +1,26 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse; + +import dev.isxander.controlify.Controlify; +import dev.isxander.controlify.virtualmouse.VirtualMouseHandler; +import net.minecraft.client.gui.screens.Screen; +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.callback.CallbackInfo; + +import java.util.Optional; + +@Mixin( + //? if >=26.2 { + net.minecraft.client.gui.Gui.class + //?} else { + /*net.minecraft.client.Minecraft.class + *///?} +) +public class GuiMixin { + @Inject(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;updateTitle()V")) + private void onScreenChanged(Screen screen, CallbackInfo ci) { + Optional.ofNullable(Controlify.instance().virtualMouseHandler()) + .ifPresent(VirtualMouseHandler::onScreenChanged); + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/InputConstantsMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/InputConstantsMixin.java index b27860703..9cfbb15b7 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/InputConstantsMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/InputConstantsMixin.java @@ -15,7 +15,7 @@ public class InputConstantsMixin { // must modify isKeyDown here because Screen.hasShiftDown has some instances that ask for this directly. @ModifyReturnValue(method = "isKeyDown", at = @At("RETURN")) - private static boolean modifyIsKeyDown(boolean keyDown, @Local(argsOnly = true) int key) { + private static boolean modifyIsKeyDown(boolean keyDown, @Local(argsOnly = true, name = "key") int key) { if (key == GLFW.GLFW_KEY_LEFT_SHIFT) { ControllerEntity controller = Controlify.instance().getCurrentController().orElse(null); if (controller == null) return keyDown; diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/MinecraftMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/MinecraftMixin.java index 692857fcf..ec991cff8 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/MinecraftMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/MinecraftMixin.java @@ -3,7 +3,6 @@ import dev.isxander.controlify.Controlify; import dev.isxander.controlify.virtualmouse.VirtualMouseHandler; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,14 +12,8 @@ @Mixin(Minecraft.class) public class MinecraftMixin { - @Inject(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;updateTitle()V")) - private void onScreenChanged(Screen screen, CallbackInfo ci) { - Optional.ofNullable(Controlify.instance().virtualMouseHandler()) - .ifPresent(VirtualMouseHandler::onScreenChanged); - } - @Inject(method = "runTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;handleAccumulatedMovement()V")) - private void onUpdateMouse(boolean tick, CallbackInfo ci) { + private void onUpdateMouse(boolean advanceGameTime, CallbackInfo ci) { Optional.ofNullable(Controlify.instance().virtualMouseHandler()) .ifPresent(VirtualMouseHandler::updateMouse); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/MouseHandlerAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/MouseHandlerAccessor.java index 78f4389c6..b538b1ab2 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/MouseHandlerAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/MouseHandlerAccessor.java @@ -7,15 +7,15 @@ @Mixin(MouseHandler.class) public interface MouseHandlerAccessor { - @Invoker - void invokeOnMove(long window, double x, double y); + @Invoker("onMove") + void controlify$invokeOnMove(long window, double x, double y); - @Invoker - void invokeOnButton(long l, net.minecraft.client.input.MouseButtonInfo mouseButtonInfo, int i); + @Invoker("onButton") + void controlify$invokeOnButton(long l, net.minecraft.client.input.MouseButtonInfo mouseButtonInfo, int i); - @Invoker - void invokeOnScroll(long window, double scrollDeltaX, double scrollDeltaY); + @Invoker("onScroll") + void controlify$invokeOnScroll(long window, double scrollDeltaX, double scrollDeltaY); - @Accessor - void setMouseGrabbed(boolean mouseGrabbed); + @Accessor("mouseGrabbed") + void controlify$setMouseGrabbed(boolean mouseGrabbed); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java index 70df05e12..88e566f78 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java @@ -14,21 +14,25 @@ @Mixin(AbstractContainerScreen.class) public abstract class AbstractContainerScreenMixin extends ScreenMixin implements ISnapBehaviour { - @Shadow public abstract T getMenu(); + @Shadow + public abstract T getMenu(); + + @Shadow + protected int leftPos; - @Shadow protected int leftPos; + @Shadow + protected int topPos; - @Shadow protected int topPos; + @Final @Shadow + protected int imageWidth; - @Shadow protected int imageHeight; + @Final @Shadow + protected int imageHeight; @Shadow @Final protected T menu; - @Shadow - protected int imageWidth; - @Override public void controlify$collectSnapPoints(Consumer consumer) { super.controlify$collectSnapPoints(consumer); diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/LoomMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/LoomScreenMixin.java similarity index 96% rename from src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/LoomMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/LoomScreenMixin.java index e0b3535b0..b5b7526ac 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/LoomMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/LoomScreenMixin.java @@ -14,7 +14,7 @@ import java.util.function.Consumer; @Mixin(LoomScreen.class) -public abstract class LoomMixin extends AbstractContainerScreenMixin implements ISnapBehaviour { +public abstract class LoomScreenMixin extends AbstractContainerScreenMixin implements ISnapBehaviour { @Unique private static final int COLUMNS = 4, ROWS = 4, SLOTS = COLUMNS * ROWS; @Unique private static final int BTN_SIZE = 14; diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookComponentAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookComponentAccessor.java index 08d3c3a4f..e3148714a 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookComponentAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookComponentAccessor.java @@ -11,15 +11,15 @@ @Mixin(RecipeBookComponent.class) public interface RecipeBookComponentAccessor { - @Accessor - RecipeBookPage getRecipeBookPage(); + @Accessor("recipeBookPage") + RecipeBookPage controlify$getRecipeBookPage(); - @Accessor - List getTabButtons(); + @Accessor("tabButtons") + List controlify$getTabButtons(); - @Accessor - RecipeBookTabButton getSelectedTab(); + @Accessor("selectedTab") + RecipeBookTabButton controlify$getSelectedTab(); - @Accessor - CycleButton getFilterButton(); + @Accessor("filterButton") + CycleButton controlify$getFilterButton(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookPageAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookPageAccessor.java index f143f9788..8a59d787d 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookPageAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/RecipeBookPageAccessor.java @@ -10,12 +10,12 @@ @Mixin(RecipeBookPage.class) public interface RecipeBookPageAccessor { - @Accessor - List getButtons(); + @Accessor("buttons") + List controlify$getButtons(); - @Accessor - ImageButton getForwardButton(); + @Accessor("forwardButton") + ImageButton controlify$getForwardButton(); - @Accessor - ImageButton getBackButton(); + @Accessor("backButton") + ImageButton controlify$getBackButton(); } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java index 48bb43f0e..1cd2b96a3 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java @@ -8,6 +8,7 @@ import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,7 +21,7 @@ public abstract class ScreenMixin implements ISnapBehaviour { @Shadow public int width; @Shadow public int height; - @Shadow protected @Nullable Minecraft minecraft; + @Final @Shadow protected @Nullable Minecraft minecraft; @Override public void controlify$collectSnapPoints(Consumer consumer) { diff --git a/src/main/java/dev/isxander/controlify/rumble/BasicRumbleEffect.java b/src/main/java/dev/isxander/controlify/rumble/BasicRumbleEffect.java index 3199c4ed5..f1a02cfdb 100644 --- a/src/main/java/dev/isxander/controlify/rumble/BasicRumbleEffect.java +++ b/src/main/java/dev/isxander/controlify/rumble/BasicRumbleEffect.java @@ -1,5 +1,6 @@ package dev.isxander.controlify.rumble; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import org.apache.commons.lang3.Validate; @@ -150,7 +151,7 @@ public static BasicRumbleEffect join(BasicRumbleEffect... effects) { } public static BooleanSupplier finishOnScreenChange() { - Screen screen = Minecraft.getInstance().screen; - return () -> screen != Minecraft.getInstance().screen; + Screen screen = MinecraftUtil.getScreen(); + return () -> screen != MinecraftUtil.getScreen(); } } diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index 5e08d3f56..dfc930564 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java @@ -15,11 +15,11 @@ import dev.isxander.controlify.screenop.keyboard.*; import dev.isxander.controlify.sound.ControlifyClientSounds; import dev.isxander.controlify.utils.HoldRepeatHelper; +import dev.isxander.controlify.utils.MinecraftUtil; import dev.isxander.controlify.virtualmouse.VirtualMouseBehaviour; import dev.isxander.controlify.virtualmouse.VirtualMouseHandler; import net.minecraft.client.InputType; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -33,7 +33,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvents; import org.jetbrains.annotations.Nullable; -import org.lwjgl.glfw.GLFW; import java.util.*; import java.util.function.Supplier; @@ -83,7 +82,7 @@ public void onInputModeChanged(InputMode mode) { .anyMatch(component -> ComponentProcessorProvider.provide(component).shouldKeepFocusOnKeyboardMode(this)); if (!shouldKeepFocus) { - ((ScreenAccessor) screen).invokeClearFocus(); + ((ScreenAccessor) screen).controlify$invokeClearFocus(); } } case CONTROLLER, MIXED -> { @@ -182,7 +181,7 @@ protected void handleComponentNavigation(ControllerEntity controller) { } return () -> { - ((ScreenAccessor) screen).invokeChangeFocus(path); + ((ScreenAccessor) screen).controlify$invokeChangeFocus(path); return true; }; } @@ -240,8 +239,8 @@ protected void handleTabNavigation(ControllerEntity controller) { .findAny() .ifPresent(navBar -> { var accessor = (TabNavigationBarAccessor) navBar; - List tabs = accessor.getTabs(); - int currentIndex = tabs.indexOf(accessor.getTabManager().getCurrentTab()); + List tabs = accessor.controlify$getTabs(); + int currentIndex = tabs.indexOf(accessor.controlify$getTabManager().getCurrentTab()); int newIndex = currentIndex + (prevTab ? -1 : 1); if (newIndex < 0) newIndex = tabs.size() - 1; @@ -267,7 +266,7 @@ public void onWidgetRebuild() { public void onVirtualMouseToggled(boolean enabled) { if (enabled) { - ((ScreenAccessor) screen).invokeClearFocus(); + ((ScreenAccessor) screen).controlify$invokeClearFocus(); } else { ((ScreenAccessor) screen).invokeSetInitialFocus(); } @@ -303,7 +302,7 @@ public boolean tryOpenKeyboard(ControllerEntity controller, @Nullable GuiEventLi KeyboardOverlayScreen.KeyboardPositioner positioner ) -> { if (controller.settings().generic.keyboard.showOnScreenKeyboard) { - minecraft.setScreen(new KeyboardOverlayScreen(screen, layout, inputTarget, positioner)); + MinecraftUtil.setScreen(new KeyboardOverlayScreen(screen, layout, inputTarget, positioner)); } return true; } diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractContainerScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractContainerScreenProcessor.java index f8b2b0b04..c1d04144d 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractContainerScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractContainerScreenProcessor.java @@ -57,11 +57,11 @@ protected void handleScreenVMouse(ControllerEntity controller, VirtualMouseHandl var ctx = new ContainerCtx( hoveredSlot.get(), screen.getMenu().getCarried(), - accessor.invokeHasClickedOutside( + accessor.controlify$invokeHasClickedOutside( vmouse.getCurrentX(1f), vmouse.getCurrentY(1f), - accessor.getLeftPos(), - accessor.getTopPos() + accessor.controlify$getLeftPos(), + accessor.controlify$getTopPos() ), controller, controller.settings().generic.guide.verbosity @@ -122,7 +122,7 @@ public void onInputModeChanged(InputMode mode) { private void setRenderGuide(boolean render) { render &= ControlifyApi.get().getCurrentController().map(c -> c.settings().generic.guide.showScreenGuides).orElse(false); - List renderables = ((ScreenAccessor) screen).getRenderables(); + List renderables = ((ScreenAccessor) screen).controlify$getRenderables(); if (render) { renderables.add(guideRenderable); diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/LanguageSelectionListComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/LanguageSelectionListComponentProcessor.java index a39f10320..a4991c98b 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/LanguageSelectionListComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/LanguageSelectionListComponentProcessor.java @@ -5,6 +5,7 @@ import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.mixins.feature.screenop.impl.outofgame.OptionsSubScreenAccessor; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; public class LanguageSelectionListComponentProcessor implements ComponentProcessor { @@ -26,7 +27,7 @@ public boolean overrideControllerButtons(ScreenProcessor screen, ControllerEn minecraft.options.save(); } - minecraft.setScreen(((OptionsSubScreenAccessor) screen.screen).getLastScreen()); + MinecraftUtil.setScreen(((OptionsSubScreenAccessor) screen.screen).controlify$getLastScreen()); return true; } diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java index 773fe776b..3bf34fd7a 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java @@ -6,6 +6,7 @@ import dev.isxander.controlify.controller.ControllerEntity; import dev.isxander.controlify.mixins.feature.screenop.impl.outofgame.PauseScreenAccessor; import dev.isxander.controlify.screenop.ScreenProcessor; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.options.OptionsScreen; @@ -27,7 +28,7 @@ protected void handleButtons(ControllerEntity controller) { super.handleButtons(controller); if (ControlifyBindings.GUI_ABSTRACT_ACTION_1.on(controller).justPressed()) { - minecraft.setScreen(new OptionsScreen(screen, minecraft.options, true)); + MinecraftUtil.setScreen(new OptionsScreen(screen, minecraft.options, true)); } if (ControlifyBindings.GUI_ABSTRACT_ACTION_2.on(controller).justPressed()) { screen.setFocused(disconnectButtonSupplier.get()); diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/RecipeBookScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/RecipeBookScreenProcessor.java index 905af13a4..66fdd760b 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/RecipeBookScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/RecipeBookScreenProcessor.java @@ -4,14 +4,10 @@ import dev.isxander.controlify.controller.ControllerEntity; import dev.isxander.controlify.mixins.feature.virtualmouse.snapping.RecipeBookComponentAccessor; import dev.isxander.controlify.mixins.feature.virtualmouse.snapping.RecipeBookPageAccessor; -import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.virtualmouse.VirtualMouseHandler; import net.minecraft.client.gui.components.ImageButton; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; import net.minecraft.client.gui.screens.recipebook.RecipeBookTabButton; -import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; import java.util.List; import java.util.function.Predicate; @@ -45,19 +41,19 @@ protected void handleScreenVMouse(ControllerEntity controller, VirtualMouseHandl if (!recipeBookComponent.isVisible()) return; RecipeBookComponentAccessor componentAccessor = (RecipeBookComponentAccessor) recipeBookComponent; - RecipeBookPageAccessor pageAccessor = (RecipeBookPageAccessor) componentAccessor.getRecipeBookPage(); + RecipeBookPageAccessor pageAccessor = (RecipeBookPageAccessor) componentAccessor.controlify$getRecipeBookPage(); List tabs = componentAccessor - .getTabButtons() + .controlify$getTabButtons() .stream().filter(tab -> tab.visible) .toList(); - RecipeBookTabButton selectedTab = componentAccessor.getSelectedTab(); + RecipeBookTabButton selectedTab = componentAccessor.controlify$getSelectedTab(); ImageButton button = null; if (ControlifyBindings.VMOUSE_PAGE_NEXT.on(controller).justPressed()) { - button = pageAccessor.getForwardButton(); + button = pageAccessor.controlify$getForwardButton(); } if (ControlifyBindings.VMOUSE_PAGE_PREV.on(controller).justPressed()) { - button = pageAccessor.getBackButton(); + button = pageAccessor.controlify$getBackButton(); } if (ControlifyBindings.VMOUSE_PAGE_DOWN.on(controller).justPressed()) { int index = tabs.indexOf(selectedTab); diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SelectWorldScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SelectWorldScreenProcessor.java index 7a910355a..488cabd76 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SelectWorldScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SelectWorldScreenProcessor.java @@ -4,6 +4,7 @@ import dev.isxander.controlify.controller.ControllerEntity; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.mixins.feature.screenop.impl.outofgame.SelectWorldScreenAccessor; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen; @@ -19,13 +20,13 @@ protected void handleButtons(ControllerEntity controller) { if (ControlifyBindings.GUI_ABSTRACT_ACTION_1.on(controller).justPressed()) { playClackSound(); var minecraft = Minecraft.getInstance(); - CreateWorldScreen.openFresh(minecraft, () -> minecraft.setScreen(screen)); + CreateWorldScreen.openFresh(minecraft, () -> MinecraftUtil.setScreen(screen)); return; } if (screen.getFocused() != null && screen.getFocused() instanceof Button) { if (ControlifyBindings.GUI_BACK.on(controller).guiPressed().get()) { - screen.setFocused(((SelectWorldScreenAccessor) screen).getList()); + screen.setFocused(((SelectWorldScreenAccessor) screen).controlify$getList()); return; } } diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/ServerSelectionListEntryComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/ServerSelectionListEntryComponentProcessor.java index 4b35befa0..55e1d7a22 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/ServerSelectionListEntryComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/ServerSelectionListEntryComponentProcessor.java @@ -10,7 +10,7 @@ public class ServerSelectionListEntryComponentProcessor implements ComponentProc @Override public boolean overrideControllerButtons(ScreenProcessor screen, ControllerEntity controller) { if (ControlifyBindings.GUI_PRESS.on(controller).guiPressed().get()) { - screen.screen.setFocused(((JoinMultiplayerScreenAccessor) screen.screen).getSelectButton()); + screen.screen.setFocused(((JoinMultiplayerScreenAccessor) screen.screen).controlify$getSelectButton()); return true; } diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java index 444968203..c29a1cd00 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java @@ -5,6 +5,7 @@ import dev.isxander.controlify.bindings.ControlifyBindings; import dev.isxander.controlify.controller.ControllerEntity; import dev.isxander.controlify.screenop.ScreenProcessor; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.screens.options.OptionsScreen; import net.minecraft.client.gui.screens.TitleScreen; @@ -27,7 +28,7 @@ protected void handleButtons(ControllerEntity controller) { if (ControlifyBindings.GUI_ABSTRACT_ACTION_1.on(controller).justPressed()) { if (getWidget("menu.options").isPresent()) { - minecraft.setScreen(new OptionsScreen(screen, minecraft.options, false)); + MinecraftUtil.setScreen(new OptionsScreen(screen, minecraft.options, false)); playClackSound(); } } diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/WorldListEntryComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/WorldListEntryComponentProcessor.java index 548addef5..977d3f79b 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/WorldListEntryComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/WorldListEntryComponentProcessor.java @@ -12,7 +12,7 @@ public class WorldListEntryComponentProcessor implements ComponentProcessor { public boolean overrideControllerButtons(ScreenProcessor screen, ControllerEntity controller) { if (ControlifyBindings.GUI_PRESS.on(controller).guiPressed().get()) { var selectWorldScreen = (SelectWorldScreen) screen.screen; - selectWorldScreen.setFocused(((SelectWorldScreenAccessor) selectWorldScreen).getPlayWorldButton()); + selectWorldScreen.setFocused(((SelectWorldScreenAccessor) selectWorldScreen).controlify$getPlayWorldButton()); return true; } diff --git a/src/main/java/dev/isxander/controlify/screenop/keyboard/KeyboardOverlayScreen.java b/src/main/java/dev/isxander/controlify/screenop/keyboard/KeyboardOverlayScreen.java index 70b05406a..d30da772e 100644 --- a/src/main/java/dev/isxander/controlify/screenop/keyboard/KeyboardOverlayScreen.java +++ b/src/main/java/dev/isxander/controlify/screenop/keyboard/KeyboardOverlayScreen.java @@ -2,6 +2,8 @@ import com.mojang.blaze3d.platform.InputConstants; import dev.isxander.controlify.Controlify; +import dev.isxander.controlify.mixins.feature.screenop.GuiMixin; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.navigation.ScreenAxis; import net.minecraft.client.gui.navigation.ScreenRectangle; @@ -21,7 +23,7 @@ * instead of adding and removing widgets, where focus to the keyboard could * be lost without the keyboard closing. * - * @see dev.isxander.controlify.mixins.feature.screenop.MinecraftMixin#preventRemovingOldScreen(Screen, Screen) + * @see GuiMixin#preventRemovingOldScreen(Screen, Screen) * this mixin prevents calling removed() on the underlying screen when this overlay is presented, since it will be restored */ public class KeyboardOverlayScreen extends Screen { @@ -115,7 +117,7 @@ public void tick() { public void onClose() { // restore the previous screen without calling minecraft.setScreen // so the screen is not reinitialised - this.minecraft.screen = this.backgroundScreen; + MinecraftUtil.forceSetScreen(this.backgroundScreen); Controlify.instance().virtualMouseHandler().onScreenChanged(); } diff --git a/src/main/java/dev/isxander/controlify/utils/CUtil.java b/src/main/java/dev/isxander/controlify/utils/CUtil.java index 3984fee13..8f4fea95c 100644 --- a/src/main/java/dev/isxander/controlify/utils/CUtil.java +++ b/src/main/java/dev/isxander/controlify/utils/CUtil.java @@ -1,8 +1,5 @@ package dev.isxander.controlify.utils; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.serialization.*; import dev.isxander.controlify.utils.log.ControlifyLogger; import net.minecraft.util.Util; @@ -31,10 +28,6 @@ public static Identifier rl(String path) { return Identifier.fromNamespaceAndPath("controlify", path); } - public static BufferBuilder beginBuffer(VertexFormat.Mode mode, VertexFormat format) { - return Tesselator.getInstance().begin(mode, format); - } - public static final boolean IS_POJAV_LAUNCHER = System.getenv("POJAV_NATIVEDIR") != null; /** diff --git a/src/main/java/dev/isxander/controlify/utils/ControllerSetupWizard.java b/src/main/java/dev/isxander/controlify/utils/ControllerSetupWizard.java index 4e55c8b76..aba2e7acc 100644 --- a/src/main/java/dev/isxander/controlify/utils/ControllerSetupWizard.java +++ b/src/main/java/dev/isxander/controlify/utils/ControllerSetupWizard.java @@ -38,7 +38,7 @@ public Screen start(Screen resultantScreen) { } public boolean isDone() { - Screen screen = Minecraft.getInstance().screen; + Screen screen = MinecraftUtil.getScreen(); return screen == null || screens.stream().noneMatch(resultantScreen -> resultantScreen == screen); } diff --git a/src/main/java/dev/isxander/controlify/utils/DebugOverlayHelper.java b/src/main/java/dev/isxander/controlify/utils/DebugOverlayHelper.java index 4228ff139..56408f53b 100644 --- a/src/main/java/dev/isxander/controlify/utils/DebugOverlayHelper.java +++ b/src/main/java/dev/isxander/controlify/utils/DebugOverlayHelper.java @@ -2,6 +2,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.ChatComponent; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.client.gui.components.debug.DebugScreenEntries; @@ -64,14 +65,20 @@ public static void startStopProfiling() { } } + private static ChatComponent getChat() { + //? if >=26.2 { + return mc.gui.hud.getChat(); + //?} else { + /*return mc.gui.getChat(); + *///?} + } + public static void clearChat() { - mc.gui.getChat().clearMessages(false); + getChat().clearMessages(false); } private static void debugComponent(ChatFormatting formatting, Component message) { - mc - .gui - .getChat() + getChat() .addClientSystemMessage( Component.empty().append(Component.translatable("debug.prefix").withStyle(formatting, ChatFormatting.BOLD)).append(CommonComponents.SPACE).append(message) ); diff --git a/src/main/java/dev/isxander/controlify/utils/GsonCodecAdapter.java b/src/main/java/dev/isxander/controlify/utils/GsonCodecAdapter.java deleted file mode 100644 index 1c2fb1cdb..000000000 --- a/src/main/java/dev/isxander/controlify/utils/GsonCodecAdapter.java +++ /dev/null @@ -1,24 +0,0 @@ -package dev.isxander.controlify.utils; - -import com.google.gson.*; -import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; - -import java.lang.reflect.Type; - -/** - * Allows codecs to be used as Json(De)Serializers for GSON usage. - * @param codec codec to use - * @param type to encode/decode - */ -public record GsonCodecAdapter(Codec codec) implements JsonSerializer, JsonDeserializer { - @Override - public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { - return codec.encodeStart(JsonOps.INSTANCE, src).getOrThrow(); - } - - @Override - public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return codec.parse(JsonOps.INSTANCE, json).getOrThrow(); - } -} diff --git a/src/main/java/dev/isxander/controlify/utils/InitialScreenRegistryDuck.java b/src/main/java/dev/isxander/controlify/utils/InitialScreenRegistryDuck.java index d984bafc7..be74e20ed 100644 --- a/src/main/java/dev/isxander/controlify/utils/InitialScreenRegistryDuck.java +++ b/src/main/java/dev/isxander/controlify/utils/InitialScreenRegistryDuck.java @@ -8,7 +8,15 @@ public interface InitialScreenRegistryDuck { void controlify$registerInitialScreen(Function screenFactory); + static InitialScreenRegistryDuck get() { + //? if >=26.2 { + return (InitialScreenRegistryDuck) Minecraft.getInstance().gui; + //?} else { + /*return (InitialScreenRegistryDuck) Minecraft.getInstance(); + *///?} + } + static void registerInitialScreen(Function screenFactory) { - ((InitialScreenRegistryDuck) Minecraft.getInstance()).controlify$registerInitialScreen(screenFactory); + get().controlify$registerInitialScreen(screenFactory); } } diff --git a/src/main/java/dev/isxander/controlify/utils/MinecraftUtil.java b/src/main/java/dev/isxander/controlify/utils/MinecraftUtil.java new file mode 100644 index 000000000..24cc46ac3 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/utils/MinecraftUtil.java @@ -0,0 +1,63 @@ +package dev.isxander.controlify.utils; + +import dev.isxander.controlify.mixins.feature.bind.GuiAccessor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.toasts.SystemToast; +import net.minecraft.client.gui.screens.Overlay; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; + +public final class MinecraftUtil { + private MinecraftUtil() { + } + + private static final Minecraft minecraft = Minecraft.getInstance(); + + + public static void setScreen(@Nullable Screen screen) { + //? if >=26.2 { + minecraft.gui.setScreen(screen); + //?} else { + /*minecraft.setScreen(screen); + *///?} + } + + public static void forceSetScreen(@Nullable Screen screen) { + //? if >=26.2 { + ((GuiAccessor) minecraft.gui).controlify$setScreenField(screen); + //?} else { + /*minecraft.screen = screen; + *///?} + } + + @Contract(pure = true) + public static @Nullable Screen getScreen() { + //? if >=26.2 { + return minecraft.gui.screen(); + //?} else { + /*return minecraft.screen; + *///?} + } + + @Contract(pure = true) + public static @Nullable Overlay getOverlay() { + //? if >=26.2 { + return minecraft.gui.overlay(); + //?} else { + /*return minecraft.getOverlay(); + *///?} + } + + public static void sendToast(Component title, Component message, boolean longer) { + var toastId = longer ? SystemToast.SystemToastId.UNSECURE_SERVER_WARNING : SystemToast.SystemToastId.PERIODIC_NOTIFICATION; + + //? if >=26.2 { + SystemToast.add(minecraft.gui.toastManager(), toastId, title, message); + //?} else { + /*SystemToast toast = SystemToast.multiline(minecraft, toastId, title, message); + minecraft.getToastManager().addToast(toast); + *///?} + } +} diff --git a/src/main/java/dev/isxander/controlify/utils/ToastUtils.java b/src/main/java/dev/isxander/controlify/utils/ToastUtils.java deleted file mode 100644 index f9148ddc4..000000000 --- a/src/main/java/dev/isxander/controlify/utils/ToastUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.isxander.controlify.utils; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.toasts.SystemToast; -import net.minecraft.network.chat.Component; - -public class ToastUtils { - public static void sendToast(Component title, Component message, boolean longer) { - SystemToast toast = SystemToast.multiline( - Minecraft.getInstance(), - longer ? SystemToast.SystemToastId.UNSECURE_SERVER_WARNING : SystemToast.SystemToastId.PERIODIC_NOTIFICATION, - title, - message - ); - Minecraft.getInstance().getToastManager().addToast(toast); - } -} diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/SnapUtils.java b/src/main/java/dev/isxander/controlify/virtualmouse/SnapUtils.java index e6649cd15..ab2e97101 100644 --- a/src/main/java/dev/isxander/controlify/virtualmouse/SnapUtils.java +++ b/src/main/java/dev/isxander/controlify/virtualmouse/SnapUtils.java @@ -6,7 +6,6 @@ import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; import org.joml.Vector2i; -import java.util.Collection; import java.util.function.Consumer; public final class SnapUtils { @@ -16,34 +15,34 @@ private SnapUtils() { public static void addRecipeSnapPoints(RecipeBookComponent recipeBookComponent, Consumer consumer) { if (recipeBookComponent.isVisible()) { RecipeBookComponentAccessor componentAccessor = (RecipeBookComponentAccessor) recipeBookComponent; - componentAccessor.getTabButtons().forEach(button -> { + componentAccessor.controlify$getTabButtons().forEach(button -> { int x = button.getX() + button.getWidth() / 2; int y = button.getY() + button.getHeight() / 2; consumer.accept(new SnapPoint(new Vector2i(x, y), 20)); }); - var filterButton = componentAccessor.getFilterButton(); + var filterButton = componentAccessor.controlify$getFilterButton(); if (filterButton.visible) { int x = filterButton.getX() + filterButton.getWidth() / 2; int y = filterButton.getY() + filterButton.getHeight() / 2; consumer.accept(new SnapPoint(new Vector2i(x, y), 14)); } - RecipeBookPageAccessor pageAccessor = (RecipeBookPageAccessor) componentAccessor.getRecipeBookPage(); - pageAccessor.getButtons().forEach(button -> { + RecipeBookPageAccessor pageAccessor = (RecipeBookPageAccessor) componentAccessor.controlify$getRecipeBookPage(); + pageAccessor.controlify$getButtons().forEach(button -> { int x = button.getX() + button.getWidth() / 2; int y = button.getY() + button.getHeight() / 2; consumer.accept(new SnapPoint(new Vector2i(x, y), 21)); }); - var forwardButton = pageAccessor.getForwardButton(); + var forwardButton = pageAccessor.controlify$getForwardButton(); if (forwardButton.visible) { int x = forwardButton.getX() + forwardButton.getWidth() / 2 - 2; int y = forwardButton.getY() + forwardButton.getHeight() / 2; consumer.accept(new SnapPoint(new Vector2i(x, y), 10)); } - var backButton = pageAccessor.getBackButton(); + var backButton = pageAccessor.controlify$getBackButton(); if (backButton.visible) { int x = backButton.getX() + backButton.getWidth() / 2 + 2; int y = backButton.getY() + backButton.getHeight() / 2; diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java index b9c95c374..3ec0eb6ee 100644 --- a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java +++ b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java @@ -59,6 +59,8 @@ public VirtualMouseHandler() { } public void handleControllerInput(ControllerEntity controller) { + if (MinecraftUtil.getScreen() == null) return; + if (ControlifyBindings.VMOUSE_TOGGLE.on(controller).justPressed()) { toggleVirtualMouse(); } @@ -155,7 +157,7 @@ public void handleControllerInput(ControllerEntity controller) { holdRepeatHelper.onNavigate(); } - VirtualMouseBehaviour vmouseBehaviour = ScreenProcessorProvider.provide(minecraft.screen) + VirtualMouseBehaviour vmouseBehaviour = ScreenProcessorProvider.provide(MinecraftUtil.getScreen()) .virtualMouseBehaviour(); if (vmouseBehaviour.isDefaultOr(VirtualMouseBehaviour.ENABLED)) { handleCompatibilityBinds(controller); @@ -164,9 +166,9 @@ public void handleControllerInput(ControllerEntity controller) { handleScroll(controller); } - if (ControlifyBindings.GUI_BACK.on(controller).justPressed() && minecraft.screen != null) { + if (ControlifyBindings.GUI_BACK.on(controller).justPressed() && MinecraftUtil.getScreen() != null) { ScreenProcessor.playClackSound(); - minecraft.screen.onClose(); + MinecraftUtil.getScreen().onClose(); } } @@ -207,7 +209,7 @@ public void handleScroll(ControllerEntity controller) { private void simulateMousePress(int button, int action, int modifiers) { var mouseHandler = (MouseHandlerAccessor) minecraft.mouseHandler; var windowHandle = minecraft.getWindow().handle(); - mouseHandler.invokeOnButton(windowHandle, new MouseButtonInfo(button, modifiers), action); + mouseHandler.controlify$invokeOnButton(windowHandle, new MouseButtonInfo(button, modifiers), action); } public void updateMouse() { @@ -220,7 +222,7 @@ public void updateMouse() { currentX = Mth.lerp(delta, currentX, targetX); currentY = Mth.lerp(delta, currentY, targetY); - ((MouseHandlerAccessor) minecraft.mouseHandler).invokeOnMove(windowHandle, currentX, currentY); + ((MouseHandlerAccessor) minecraft.mouseHandler).controlify$invokeOnMove(windowHandle, currentX, currentY); } else { currentX = targetX; currentY = targetY; @@ -232,7 +234,7 @@ public void updateMouse() { var currentScrollX = scrollX * delta; scrollX -= currentScrollX; - ((MouseHandlerAccessor) minecraft.mouseHandler).invokeOnScroll(windowHandle, currentScrollX, currentScrollY); + ((MouseHandlerAccessor) minecraft.mouseHandler).controlify$invokeOnScroll(windowHandle, currentScrollX, currentScrollY); } else { scrollX = scrollY = 0; } @@ -328,13 +330,13 @@ public void snapToPoint(SnapPoint snapPoint, Vector2dc scaleFactor) { targetY = currentY = snapPoint.position().y() / scaleFactor.y(); var windowHandle = minecraft.getWindow().handle(); - ((MouseHandlerAccessor) minecraft.mouseHandler).invokeOnMove(windowHandle, currentX, currentY); + ((MouseHandlerAccessor) minecraft.mouseHandler).controlify$invokeOnMove(windowHandle, currentX, currentY); } public void onScreenChanged() { var windowHandle = minecraft.getWindow().handle(); - if (minecraft.screen != null) { + if (MinecraftUtil.getScreen() != null) { if (requiresVirtualMouse()) { enableVirtualMouse(); } else { @@ -407,8 +409,8 @@ public void enableVirtualMouse() { setMousePosition(); ControlifyEvents.VIRTUAL_MOUSE_TOGGLED.invoke(new ControlifyEvents.VirtualMouseToggled(true)); - if (minecraft.screen != null) { - ScreenProcessorProvider.provide(minecraft.screen).onVirtualMouseToggled(true); + if (MinecraftUtil.getScreen() != null) { + ScreenProcessorProvider.provide(MinecraftUtil.getScreen()).onVirtualMouseToggled(true); } } @@ -418,7 +420,7 @@ public void disableVirtualMouse() { var windowHandle = minecraft.getWindow().handle(); // make sure minecraft doesn't think the mouse is grabbed when it isn't - ((MouseHandlerAccessor) minecraft.mouseHandler).setMouseGrabbed(false); + ((MouseHandlerAccessor) minecraft.mouseHandler).controlify$setMouseGrabbed(false); Controlify.instance().hideMouse(true, true); GLFW.glfwSetInputMode(windowHandle, GLFW.GLFW_CURSOR, GLFW.GLFW_CURSOR_NORMAL); @@ -428,8 +430,8 @@ public void disableVirtualMouse() { targetY = currentY = minecraft.mouseHandler.ypos(); ControlifyEvents.VIRTUAL_MOUSE_TOGGLED.invoke(new ControlifyEvents.VirtualMouseToggled(false)); - if (minecraft.screen != null) { - ScreenProcessorProvider.provide(minecraft.screen).onVirtualMouseToggled(false); + if (MinecraftUtil.getScreen() != null) { + ScreenProcessorProvider.provide(MinecraftUtil.getScreen()).onVirtualMouseToggled(false); } } @@ -443,16 +445,16 @@ private void setMousePosition() { public boolean requiresVirtualMouse() { var isController = Controlify.instance().currentInputMode().isController(); - var hasScreen = minecraft.screen != null; + var hasScreen = MinecraftUtil.getScreen() != null; if (isController && hasScreen) { - return switch (ScreenProcessorProvider.provide(minecraft.screen).virtualMouseBehaviour()) { + return switch (ScreenProcessorProvider.provide(MinecraftUtil.getScreen()).virtualMouseBehaviour()) { case DEFAULT -> Controlify.instance().config() .getSettings() .globalSettings() .virtualMouseScreens .stream() - .anyMatch(s -> s.isAssignableFrom(minecraft.screen.getClass())); + .anyMatch(s -> s.isAssignableFrom(MinecraftUtil.getScreen().getClass())); case ENABLED, CURSOR_ONLY, CURSOR_SCROLL -> true; case DISABLED -> false; }; @@ -462,10 +464,10 @@ public boolean requiresVirtualMouse() { } public void toggleVirtualMouse() { - if (minecraft.screen == null) return; + if (MinecraftUtil.getScreen() == null) return; - if (ScreenProcessorProvider.provide(minecraft.screen).virtualMouseBehaviour() != VirtualMouseBehaviour.DEFAULT) { - ToastUtils.sendToast( + if (ScreenProcessorProvider.provide(MinecraftUtil.getScreen()).virtualMouseBehaviour() != VirtualMouseBehaviour.DEFAULT) { + MinecraftUtil.sendToast( Component.translatable("controlify.toast.vmouse_unavailable.title"), Component.translatable("controlify.toast.vmouse_unavailable.description"), false @@ -474,13 +476,13 @@ public void toggleVirtualMouse() { } var screens = Controlify.instance().config().getSettings().globalSettings().virtualMouseScreens; - var screenClass = minecraft.screen.getClass(); + var screenClass = MinecraftUtil.getScreen().getClass(); if (screens.contains(screenClass)) { screens.remove(screenClass); disableVirtualMouse(); Controlify.instance().hideMouse(true, false); - ToastUtils.sendToast( + MinecraftUtil.sendToast( Component.translatable("controlify.toast.vmouse_disabled.title"), Component.translatable("controlify.toast.vmouse_disabled.description"), false @@ -489,7 +491,7 @@ public void toggleVirtualMouse() { screens.add(screenClass); enableVirtualMouse(); - ToastUtils.sendToast( + MinecraftUtil.sendToast( Component.translatable("controlify.toast.vmouse_enabled.title"), Component.translatable("controlify.toast.vmouse_enabled.description"), false @@ -517,7 +519,7 @@ public void preventScrollingThisTick() { } private Set collectSnapPoints() { - if (minecraft.screen instanceof ISnapBehaviour snapBehaviour) { + if (MinecraftUtil.getScreen() instanceof ISnapBehaviour snapBehaviour) { Set points = new HashSet<>(); snapBehaviour.controlify$collectSnapPoints(points::add); return points; diff --git a/src/main/java/dev/isxander/controlify/wireless/LowBatteryNotifier.java b/src/main/java/dev/isxander/controlify/wireless/LowBatteryNotifier.java index 593c47019..3f6dcc97a 100644 --- a/src/main/java/dev/isxander/controlify/wireless/LowBatteryNotifier.java +++ b/src/main/java/dev/isxander/controlify/wireless/LowBatteryNotifier.java @@ -5,12 +5,10 @@ import dev.isxander.controlify.controller.battery.BatteryLevelComponent; import dev.isxander.controlify.controller.ControllerEntity; import dev.isxander.controlify.controllermanager.ControllerManager; -import dev.isxander.controlify.utils.ToastUtils; +import dev.isxander.controlify.utils.MinecraftUtil; import net.minecraft.network.chat.Component; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; public class LowBatteryNotifier { @@ -40,7 +38,7 @@ public static void tick() { if (batteryLevel instanceof PowerState.Depleting depleting && depleting.percent() <= 10) { if (!notifiedControllers.contains(uid)) { - ToastUtils.sendToast( + MinecraftUtil.sendToast( Component.translatable("controlify.toast.low_battery.title"), Component.translatable("controlify.toast.low_battery.message", controller.name(), depleting.percent() + "%"), true diff --git a/src/main/resources/controlify-compat.iris.mixins.json b/src/main/resources/controlify-compat.iris.mixins.json index e47322631..fcae699ce 100644 --- a/src/main/resources/controlify-compat.iris.mixins.json +++ b/src/main/resources/controlify-compat.iris.mixins.json @@ -8,6 +8,9 @@ "injectors": { "defaultRequire": 1 }, + "overwrites": { + "requireAnnotations": true + }, "plugin": "dev.isxander.controlify.compatibility.iris.IrisMixinPlugin", "compatibilityLevel": "JAVA_25", "client": [ diff --git a/src/main/resources/controlify-compat.reeses-sodium-options.mixins.json b/src/main/resources/controlify-compat.reeses-sodium-options.mixins.json index 559de3377..42ac8ca05 100644 --- a/src/main/resources/controlify-compat.reeses-sodium-options.mixins.json +++ b/src/main/resources/controlify-compat.reeses-sodium-options.mixins.json @@ -8,6 +8,9 @@ "injectors": { "defaultRequire": 1 }, + "overwrites": { + "requireAnnotations": true + }, "plugin": "dev.isxander.controlify.compatibility.rso.RSOMixinPlugin", "compatibilityLevel": "JAVA_25", "client": [ diff --git a/src/main/resources/controlify-compat.simple-voice-chat.mixins.json b/src/main/resources/controlify-compat.simple-voice-chat.mixins.json index 77c64a1f0..a6d1d1394 100644 --- a/src/main/resources/controlify-compat.simple-voice-chat.mixins.json +++ b/src/main/resources/controlify-compat.simple-voice-chat.mixins.json @@ -8,6 +8,9 @@ "injectors": { "defaultRequire": 1 }, + "overwrites": { + "requireAnnotations": true + }, "plugin": "dev.isxander.controlify.compatibility.simplevoicechat.SVCMixinPlugin", "compatibilityLevel": "JAVA_25", "client": [ diff --git a/src/main/resources/controlify-compat.sodium.mixins.json b/src/main/resources/controlify-compat.sodium.mixins.json index be37053d3..542e4aaa1 100644 --- a/src/main/resources/controlify-compat.sodium.mixins.json +++ b/src/main/resources/controlify-compat.sodium.mixins.json @@ -8,6 +8,9 @@ "injectors": { "defaultRequire": 1 }, + "overwrites": { + "requireAnnotations": true + }, "plugin": "dev.isxander.controlify.compatibility.sodium.SodiumMixinPlugin", "compatibilityLevel": "JAVA_25", "client": [ diff --git a/src/main/resources/controlify-compat.yacl.mixins.json b/src/main/resources/controlify-compat.yacl.mixins.json index e197cb2ba..2da3063e2 100644 --- a/src/main/resources/controlify-compat.yacl.mixins.json +++ b/src/main/resources/controlify-compat.yacl.mixins.json @@ -8,6 +8,9 @@ "injectors": { "defaultRequire": 1 }, + "overwrites": { + "requireAnnotations": true + }, "plugin": "dev.isxander.controlify.compatibility.yacl.YACLMixinPlugin", "compatibilityLevel": "JAVA_25", "client": [ diff --git a/src/main/resources/controlify-platform.fabric.mixins.json b/src/main/resources/controlify-platform.fabric.mixins.json index 265b861a4..5b48e4f5f 100644 --- a/src/main/resources/controlify-platform.fabric.mixins.json +++ b/src/main/resources/controlify-platform.fabric.mixins.json @@ -8,6 +8,9 @@ "injectors": { "defaultRequire": 1 }, + "overwrites": { + "requireAnnotations": true + }, "compatibilityLevel": "JAVA_25", "client": [ "CreativeModeInventoryScreenAccessor", diff --git a/src/main/resources/controlify-platform.neoforge.mixins.json b/src/main/resources/controlify-platform.neoforge.mixins.json index 34b7a5a67..4820f8c39 100644 --- a/src/main/resources/controlify-platform.neoforge.mixins.json +++ b/src/main/resources/controlify-platform.neoforge.mixins.json @@ -8,6 +8,9 @@ "injectors": { "defaultRequire": 1 }, + "overwrites": { + "requireAnnotations": true + }, "compatibilityLevel": "JAVA_25", "client": [ "CreativeModeInventoryScreenAccessor", diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index ddb7cb7f0..f924794ca 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -9,23 +9,28 @@ "defaultRequire": 1 }, "compatibilityLevel": "JAVA_25", + "overwrites": { + "requireAnnotations": true + }, "client": [ "core.ClientPacketListenerMixin", "core.GLXMixin", "core.GuiMixin", + "core.HudMixin", "core.KeyboardHandlerMixin", "core.MinecraftMixin", "core.MouseHandlerMixin", "feature.accessibility.LocalPlayerMixin", + "feature.bind.GuiAccessor", "feature.bind.GuiMixin", + "feature.bind.HudMixin", "feature.bind.KeyMappingMixin", - "feature.bind.MinecraftMixin", "feature.bind.ToggleKeyMappingMixin", "feature.font.FontAccessor", "feature.font.KeybindContentsMixin", "feature.font.TranslatableContentsMixin", "feature.guide.ingame.ClientPacketListenerMixin", - "feature.guide.ingame.GuiMixin", + "feature.guide.ingame.HudMixin", "feature.guide.ingame.MinecraftAccessor", "feature.guide.ingame.PlayerAccessor", "feature.guide.screen.AbstractButtonMixin", @@ -37,7 +42,7 @@ "feature.hdhaptics.SoundManagerAccessor", "feature.input.MinecraftMixin", "feature.oofinput.MinecraftMixin", - "feature.patches.analogueboat.BoatMixin", + "feature.patches.analogueboat.AbstractBoatMixin", "feature.patches.analogueboat.LocalPlayerMixin", "feature.patches.keymessages.ClientPacketListenerMixin", "feature.patches.keymessages.MovementTutorialStepInstanceMixin", @@ -63,7 +68,7 @@ "feature.rumble.waterland.LocalPlayerMixin", "feature.rumble.waterland.PlayerMixin", "feature.screenop.ContainerEventHandlerMixin", - "feature.screenop.MinecraftMixin", + "feature.screenop.GuiMixin", "feature.screenop.ScreenAccessor", "feature.screenop.ScreenMixin", "feature.screenop.impl.bundle.BundleMouseActionsMixin", @@ -103,6 +108,7 @@ "feature.steamdeck.ScreenshotAccessor", "feature.ui.AbstractSelectionListAccessor", "feature.util.ConnectScreenMixin", + "feature.virtualmouse.GuiMixin", "feature.virtualmouse.InputConstantsMixin", "feature.virtualmouse.MinecraftMixin", "feature.virtualmouse.MouseHandlerAccessor", @@ -111,7 +117,7 @@ "feature.virtualmouse.snapping.AbstractRecipeBookScreenMixin", "feature.virtualmouse.snapping.CreativeModeInventoryScreenMixin", "feature.virtualmouse.snapping.EnchantmentScreenMixin", - "feature.virtualmouse.snapping.LoomMixin", + "feature.virtualmouse.snapping.LoomScreenMixin", "feature.virtualmouse.snapping.RecipeBookComponentAccessor", "feature.virtualmouse.snapping.RecipeBookPageAccessor", "feature.virtualmouse.snapping.ScreenMixin", diff --git a/src/main/templates/fabric.mod.json b/src/main/templates/fabric.mod.json index 9563f949c..2b806d34f 100644 --- a/src/main/templates/fabric.mod.json +++ b/src/main/templates/fabric.mod.json @@ -30,9 +30,9 @@ }, "icon": "icon.png", "depends": { - "fabricloader": ">=0.18.0", + "fabricloader": ">=0.19.1", "minecraft": "${mc}", - "java": ">=21", + "java": ">=25", "yet_another_config_lib_v3": ">=3.8.0" }, "suggests": { diff --git a/versions/26.2-fabric/gradle.properties b/versions/26.2-fabric/gradle.properties new file mode 100644 index 000000000..a67e33411 --- /dev/null +++ b/versions/26.2-fabric/gradle.properties @@ -0,0 +1,20 @@ +modstitch.platform=fabric-loom + +mcVersion=26.2-snapshot-2 + +deps.fabricApi=0.145.5+26.2 +deps.yacl=3.9.3+26.2-fabric +deps.modMenu=18.0.0-alpha.7 +deps.modMenu.noRuntime=true +deps.sodium=0.8.9+mc26.1.1 +deps.sodium.noRuntime=true +deps.iris=1.10.9+26.1-fabric +deps.iris.noRuntime=true +deps.simpleVoiceChat=fabric-2.6.15+26.2-snapshot-2 +deps.fancyMenu=3.8.6-26.1.1-fabric +deps.fancyMenu.noRuntime=true + +meta.mcDep=~26.2-alpha.2 +meta.fapiDep=>=0.145.5 + +pub.stableMC=26.2 diff --git a/versions/current b/versions/current index 0bd139e88..0aa801d15 100644 --- a/versions/current +++ b/versions/current @@ -1 +1 @@ -26.1-fabric \ No newline at end of file +26.2-fabric \ No newline at end of file diff --git a/versions/versions.json b/versions/versions.json index 206f69db2..9af34b9cb 100644 --- a/versions/versions.json +++ b/versions/versions.json @@ -2,7 +2,8 @@ "$schema": "https://codeberg.org/stonecutter/stonecutter/raw/branch/0.7/tools/settings-schema.json", "branches": { "": [ - "26.1-fabric:26.1", "26.1-neoforge:26.1" + "26.1-fabric:26.1", "26.1-neoforge:26.1", + "26.2-fabric:26.2" ] } } From 8a65671d98b7a9152ac7e8380c75c4c9c8ad0166 Mon Sep 17 00:00:00 2001 From: Xander Date: Tue, 16 Jun 2026 19:20:55 +0100 Subject: [PATCH 2/3] port to 26.2 --- .../mixins/VideoSettingsScreenMixin.java | 8 ++++++- .../controlify/ingame/InGameInputHandler.java | 9 ++++++-- .../guide/screen/TabNavigationBarMixin.java | 6 +++++- .../impl/sign/SignEditScreenMixin.java | 4 +++- .../reacharound/ReachAroundHandler.java | 3 ++- .../reacharound/ReachAroundMode.java | 8 ++++++- .../controlify/utils/DebugOverlayHelper.java | 6 +++++- versions/26.2-fabric/gradle.properties | 21 ++++++++----------- versions/26.2-neoforge/gradle.properties | 17 +++++++++++++++ versions/versions.json | 2 +- 10 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 versions/26.2-neoforge/gradle.properties diff --git a/src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/VideoSettingsScreenMixin.java b/src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/VideoSettingsScreenMixin.java index 3aedd2bbc..3f23e8ddc 100644 --- a/src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/VideoSettingsScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/VideoSettingsScreenMixin.java @@ -21,9 +21,15 @@ @Mixin(VideoSettingsScreen.class) public abstract class VideoSettingsScreenMixin extends Screen implements ScreenProcessorProvider, SodiumScreenOperations { - @Shadow private FlatButtonWidget applyButton; + //? if >=26.2 { + @Shadow private net.caffeinemc.mods.sodium.client.gui.widgets.KeyBoundButtonWidget applyButton; + @Shadow private net.caffeinemc.mods.sodium.client.gui.widgets.KeyBoundButtonWidget closeButton; + @Shadow private net.caffeinemc.mods.sodium.client.gui.widgets.KeyBoundButtonWidget undoButton; + //?} else { + /*@Shadow private FlatButtonWidget applyButton; @Shadow private FlatButtonWidget closeButton; @Shadow private FlatButtonWidget undoButton; + *///?} @Shadow private OptionListWidget optionList; @Unique private Page controlify$currentPage = null; diff --git a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java index 32a0aa130..a7200c529 100644 --- a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java +++ b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java @@ -146,7 +146,8 @@ protected void handleKeybinds() { minecraft.gameRenderer.checkEntityPostEffect(minecraft.options.getCameraType().isFirstPerson() ? minecraft.getCameraEntity() : null); } - minecraft.levelRenderer.needsUpdate(); + //? if <26.2 + //minecraft.levelRenderer.needsUpdate(); } } if (ControlifyBindings.TOGGLE_HUD_VISIBILITY.on(controller).justPressed()) { @@ -192,7 +193,11 @@ protected void handleKeybinds() { Screenshot.grab( this.minecraft.gameDirectory, - this.minecraft.getMainRenderTarget(), + //? if >=26.2 { + this.minecraft.gameRenderer.mainRenderTarget(), + //?} else { + /*this.minecraft.getMainRenderTarget(), + *///?} component -> this.minecraft.execute(() -> { //? if >=26.2 { this.minecraft.gui.hud.getChat() diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/TabNavigationBarMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/TabNavigationBarMixin.java index 3b4026522..e3cf63875 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/TabNavigationBarMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/guide/screen/TabNavigationBarMixin.java @@ -23,7 +23,11 @@ public class TabNavigationBarMixin { @Shadow @Final private ImmutableList tabButtons; - @Inject(method = "extractRenderState", at = @At("RETURN")) + //? if >=26.2 { + @Inject(method = "extractWidgetRenderState", at = @At("RETURN")) + //?} else { + /*@Inject(method = "extractRenderState", at = @At("RETURN")) + *///?} private void renderControllerButtonOverlay(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta, CallbackInfo ci) { if (Controlify.instance().currentInputMode().isController()) { Controlify.instance().getCurrentController().ifPresent(c -> { diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/sign/SignEditScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/sign/SignEditScreenMixin.java index 7984b0515..8bdd51fa8 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/sign/SignEditScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/impl/sign/SignEditScreenMixin.java @@ -24,12 +24,14 @@ private float modifySignY(float original) { } - @Definition(id = "sign", method = "Lnet/minecraft/client/gui/GuiGraphicsExtractor;sign(Lnet/minecraft/client/model/Model$Simple;FLnet/minecraft/world/level/block/state/properties/WoodType;IIII)V") + //? if <26.2 { + /*@Definition(id = "sign", method = "Lnet/minecraft/client/gui/GuiGraphicsExtractor;sign(Lnet/minecraft/client/model/Model$Simple;FLnet/minecraft/world/level/block/state/properties/WoodType;IIII)V") @Expression("?.sign(?, ?, ?, ?, @(66), ?, @(168))") @ModifyExpressionValue(method = "extractSignBackground", at = @At("MIXINEXTRAS:EXPRESSION")) private int modifySignRenderY(int original) { return (int) (original - calculateOverlap()); } + *///?} @Unique diff --git a/src/main/java/dev/isxander/controlify/reacharound/ReachAroundHandler.java b/src/main/java/dev/isxander/controlify/reacharound/ReachAroundHandler.java index 0657c7370..9af4d2b7e 100644 --- a/src/main/java/dev/isxander/controlify/reacharound/ReachAroundHandler.java +++ b/src/main/java/dev/isxander/controlify/reacharound/ReachAroundHandler.java @@ -5,6 +5,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; public class ReachAroundHandler { public static HitResult getReachAroundHitResult(Entity entity, HitResult hitResult) { @@ -27,7 +28,7 @@ public static HitResult getReachAroundHitResult(Entity entity, HitResult hitResu // this allows all interaction with blocks, such as opening containers, ringing bells, etc. // this is consistent with bedrock edition behaviour, tested - return new BlockHitResult(supportingBlockPos.getCenter(), entity.getDirection(), supportingBlockPos, false); + return new BlockHitResult(Vec3.atCenterOf(supportingBlockPos), entity.getDirection(), supportingBlockPos, false); } private static boolean canReachAround(Entity cameraEntity) { diff --git a/src/main/java/dev/isxander/controlify/reacharound/ReachAroundMode.java b/src/main/java/dev/isxander/controlify/reacharound/ReachAroundMode.java index a98664250..9e060ace0 100644 --- a/src/main/java/dev/isxander/controlify/reacharound/ReachAroundMode.java +++ b/src/main/java/dev/isxander/controlify/reacharound/ReachAroundMode.java @@ -12,7 +12,13 @@ public enum ReachAroundMode implements NameableEnum, StringRepresentable { OFF((minecraft, controlify) -> false), - SINGLEPLAYER_ONLY((minecraft, controlify) -> minecraft.isSingleplayer()), + SINGLEPLAYER_ONLY((minecraft, controlify) -> + //? if >=26.2 { + minecraft.hasSingleplayerServer() + //?} else { + /*minecraft.isSingleplayer() + *///?} + ), SINGLEPLAYER_AND_LAN((minecraft, controlify) -> minecraft.isLocalServer()), EVERYWHERE((minecraft, controlify) -> true); diff --git a/src/main/java/dev/isxander/controlify/utils/DebugOverlayHelper.java b/src/main/java/dev/isxander/controlify/utils/DebugOverlayHelper.java index 56408f53b..f9d6a094f 100644 --- a/src/main/java/dev/isxander/controlify/utils/DebugOverlayHelper.java +++ b/src/main/java/dev/isxander/controlify/utils/DebugOverlayHelper.java @@ -31,7 +31,11 @@ public static void toggleProfilerOverlay() { } public static void reloadChunks() { - mc.levelRenderer.allChanged(); + //? if >=26.2 { + mc.levelExtractor.allChanged(); + //?} else { + /*mc.levelRenderer.allChanged(); + *///?} debugFeedbackTranslated("debug.reload_chunks.message"); } diff --git a/versions/26.2-fabric/gradle.properties b/versions/26.2-fabric/gradle.properties index a67e33411..381602297 100644 --- a/versions/26.2-fabric/gradle.properties +++ b/versions/26.2-fabric/gradle.properties @@ -1,20 +1,17 @@ modstitch.platform=fabric-loom -mcVersion=26.2-snapshot-2 +mcVersion=26.2 -deps.fabricApi=0.145.5+26.2 -deps.yacl=3.9.3+26.2-fabric -deps.modMenu=18.0.0-alpha.7 -deps.modMenu.noRuntime=true -deps.sodium=0.8.9+mc26.1.1 -deps.sodium.noRuntime=true -deps.iris=1.10.9+26.1-fabric -deps.iris.noRuntime=true -deps.simpleVoiceChat=fabric-2.6.15+26.2-snapshot-2 +deps.fabricApi=0.152.1+26.2 +deps.yacl=3.9.4+26.2-fabric +deps.modMenu=20.0.0-beta.2 +deps.sodium=0.9.0+mc26.2 +deps.iris=1.11.0+26.2-fabric +deps.simpleVoiceChat=fabric-2.6.18+26.2 deps.fancyMenu=3.8.6-26.1.1-fabric deps.fancyMenu.noRuntime=true -meta.mcDep=~26.2-alpha.2 -meta.fapiDep=>=0.145.5 +meta.mcDep=~26.2 +meta.fapiDep=>=0.152.1 pub.stableMC=26.2 diff --git a/versions/26.2-neoforge/gradle.properties b/versions/26.2-neoforge/gradle.properties new file mode 100644 index 000000000..bd55a053a --- /dev/null +++ b/versions/26.2-neoforge/gradle.properties @@ -0,0 +1,17 @@ +modstitch.platform=moddevgradle + +mcVersion=26.2 + +deps.neoForge=26.2.0.0-beta +deps.yacl=3.9.4+26.2-neoforge +deps.sodium=0.9.0+mc26.2 +deps.iris=1.10.9+26.1-neoforge +deps.iris.noRuntime=true +deps.simpleVoiceChat=neoforge-2.6.18+26.2 +deps.fancyMenu=3.8.6-26.1.1-neoforge +deps.fancyMenu.noRuntime=true + +meta.mcDep=[26.2,26.3) +meta.loaderDep=[26.2,26.3) + +pub.stableMC=26.2 diff --git a/versions/versions.json b/versions/versions.json index 9af34b9cb..a6b0ec099 100644 --- a/versions/versions.json +++ b/versions/versions.json @@ -3,7 +3,7 @@ "branches": { "": [ "26.1-fabric:26.1", "26.1-neoforge:26.1", - "26.2-fabric:26.2" + "26.2-fabric:26.2", "26.2-neoforge:26.2" ] } } From 4fbbe407646b977270fced9fa262bf69ddf41207 Mon Sep 17 00:00:00 2001 From: Xander Date: Tue, 16 Jun 2026 19:27:59 +0100 Subject: [PATCH 3/3] Fix typo Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../isxander/controlify/mixins/feature/font/FontAccessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/font/FontAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/font/FontAccessor.java index d8a4f0fa0..bebef0754 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/font/FontAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/font/FontAccessor.java @@ -9,5 +9,5 @@ @Mixin(Font.class) public interface FontAccessor { @Invoker("getGlyph") - BakedGlyph controlfy$invokeGetGlyph(int i, Style style); + BakedGlyph controlify$invokeGetGlyph(int i, Style style); }