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