From c55266798599722b9de3016122d4a4d8f72b3770 Mon Sep 17 00:00:00 2001 From: isXander Date: Sun, 14 May 2023 22:51:25 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9E=95=20TitleScreen=20and=20OptionsScreen?= =?UTF-8?q?=20guides?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screenop/vanilla/PauseScreenMixin.java | 24 ++++++++ .../screenop/vanilla/TitleScreenMixin.java | 19 ++++++ .../controlify/screenop/ScreenProcessor.java | 12 ++++ .../compat/vanilla/PauseScreenProcessor.java | 58 +++++++++++++++++++ .../compat/vanilla/TitleScreenProcessor.java | 49 ++++++++++++++++ src/main/resources/controlify.mixins.json | 2 + 6 files changed, 164 insertions(+) create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/PauseScreenMixin.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/TitleScreenMixin.java create mode 100644 src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java create mode 100644 src/main/java/dev/isxander/controlify/screenop/compat/vanilla/TitleScreenProcessor.java diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/PauseScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/PauseScreenMixin.java new file mode 100644 index 0000000..4956f0c --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/PauseScreenMixin.java @@ -0,0 +1,24 @@ +package dev.isxander.controlify.mixins.feature.screenop.vanilla; + +import dev.isxander.controlify.screenop.ScreenProcessor; +import dev.isxander.controlify.screenop.ScreenProcessorProvider; +import dev.isxander.controlify.screenop.compat.vanilla.PauseScreenProcessor; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.PauseScreen; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(PauseScreen.class) +public class PauseScreenMixin implements ScreenProcessorProvider { + @Shadow private @Nullable Button disconnectButton; + + @Unique private final PauseScreenProcessor processor + = new PauseScreenProcessor((PauseScreen) (Object) this, () -> disconnectButton); + + @Override + public ScreenProcessor screenProcessor() { + return processor; + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/TitleScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/TitleScreenMixin.java new file mode 100644 index 0000000..fa2fea2 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/TitleScreenMixin.java @@ -0,0 +1,19 @@ +package dev.isxander.controlify.mixins.feature.screenop.vanilla; + +import dev.isxander.controlify.screenop.ScreenProcessor; +import dev.isxander.controlify.screenop.ScreenProcessorProvider; +import dev.isxander.controlify.screenop.compat.vanilla.TitleScreenProcessor; +import net.minecraft.client.gui.screens.TitleScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(TitleScreen.class) +public class TitleScreenMixin implements ScreenProcessorProvider { + @Unique private final ScreenProcessor processor + = new TitleScreenProcessor((TitleScreen) (Object) this); + + @Override + public ScreenProcessor screenProcessor() { + return processor; + } +} diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index efa8905..cb7c65c 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java @@ -13,6 +13,7 @@ import dev.isxander.controlify.virtualmouse.VirtualMouseBehaviour; import dev.isxander.controlify.virtualmouse.VirtualMouseHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ComponentPath; +import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.components.tabs.Tab; import net.minecraft.client.gui.components.tabs.TabNavigationBar; @@ -20,6 +21,7 @@ import net.minecraft.client.gui.navigation.FocusNavigationEvent; import net.minecraft.client.gui.navigation.ScreenDirection; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvents; import org.lwjgl.glfw.GLFW; @@ -223,6 +225,16 @@ public class ScreenProcessor { return tree; } + protected final Optional getWidget(String translationKey) { + var translatedName = Component.translatable(translationKey).getString(); + + return screen.children().stream() + .filter(child -> child instanceof AbstractWidget) + .map(AbstractWidget.class::cast) + .filter(widget -> widget.getMessage().getString().equals(translatedName)) + .findAny(); + } + public static void playClackSound() { minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); } 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 new file mode 100644 index 0000000..8599172 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java @@ -0,0 +1,58 @@ +package dev.isxander.controlify.screenop.compat.vanilla; + +import dev.isxander.controlify.api.buttonguide.ButtonGuideApi; +import dev.isxander.controlify.api.buttonguide.ButtonGuidePredicate; +import dev.isxander.controlify.api.buttonguide.ButtonRenderPosition; +import dev.isxander.controlify.controller.Controller; +import dev.isxander.controlify.screenop.ScreenProcessor; +import net.minecraft.client.gui.components.AbstractButton; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.OptionsScreen; +import net.minecraft.client.gui.screens.PauseScreen; + +import java.util.function.Supplier; + +public class PauseScreenProcessor extends ScreenProcessor { + private final Supplier