diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenMixin.java index f3e31c1..e437f6d 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenMixin.java @@ -14,7 +14,7 @@ public class JoinMultiplayerScreenMixin implements ScreenProcessorProvider { @Shadow protected ServerSelectionList serverSelectionList; @Unique private final JoinMultiplayerScreenProcessor controlify$processor - = new JoinMultiplayerScreenProcessor((JoinMultiplayerScreen) (Object) this, serverSelectionList); + = new JoinMultiplayerScreenProcessor((JoinMultiplayerScreen) (Object) this, () -> serverSelectionList); @Override public ScreenProcessor screenProcessor() { diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index bbc9924..47801dd 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java @@ -260,8 +260,16 @@ public class ScreenProcessor { return tree; } + protected final Optional getWidget(Component message) { + return screen.children().stream() + .filter(child -> child instanceof AbstractWidget) + .map(AbstractWidget.class::cast) + .filter(widget -> widget.getMessage().equals(message)) + .findAny(); + } + protected final Optional getWidget(String translationKey) { - var translatedName = Component.translatable(translationKey).getString(); + String translatedName = Component.translatable(translationKey).getString(); return screen.children().stream() .filter(child -> child instanceof AbstractWidget) diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/JoinMultiplayerScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/JoinMultiplayerScreenProcessor.java index b23d8a8..f70af85 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/JoinMultiplayerScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/JoinMultiplayerScreenProcessor.java @@ -1,25 +1,50 @@ 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.Button; +import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; import net.minecraft.client.gui.screens.multiplayer.ServerSelectionList; +import net.minecraft.network.chat.CommonComponents; + +import java.util.function.Supplier; public class JoinMultiplayerScreenProcessor extends ScreenProcessor { - private final ServerSelectionList list; + private final Supplier listSupplier; - public JoinMultiplayerScreenProcessor(JoinMultiplayerScreen screen, ServerSelectionList list) { + public JoinMultiplayerScreenProcessor(JoinMultiplayerScreen screen, Supplier listSupplier) { super(screen); - this.list = list; + this.listSupplier = listSupplier; } @Override protected void handleButtons(Controller controller) { - if (screen.getFocused() instanceof Button && controller.bindings().GUI_BACK.justPressed()) { - screen.setFocused(list); + if (controller.bindings().GUI_BACK.justPressed()) { + this.getWidget(CommonComponents.GUI_BACK).ifPresent(back -> { + if (!back.isFocused()) { + ServerSelectionList list = listSupplier.get(); + list.setSelected(null); + list.setFocused(null); + + screen.setFocused(back); + } else { + ((AbstractButton) back).onPress(); + } + }); } super.handleButtons(controller); } + + @Override + public void onWidgetRebuild() { + this.getWidget(CommonComponents.GUI_BACK).ifPresent(button -> { + ButtonGuideApi.addGuideToButton((AbstractButton) button, controller -> controller.bindings().GUI_BACK, ButtonRenderPosition.TEXT, ButtonGuidePredicate.ALWAYS); + }); + + super.onWidgetRebuild(); + } } 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 2d93783..3f2f312 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 @@ -13,6 +13,6 @@ public class ServerSelectionListEntryComponentProcessor implements ComponentProc return true; } - return true; + return false; } }