From 7e2aeb5e0e5c79a8fb0f8d92a5b866f29027fecd Mon Sep 17 00:00:00 2001 From: encode42 Date: Wed, 5 Aug 2026 23:38:17 -0400 Subject: [PATCH] feat: return to title screen --- .../myserver/accessors/MinecraftAccessor.java | 8 ++++ .../myserver/mixin/MinecraftMixin.java | 44 +++++++++++++++++++ .../myserver/mixin/TitleScreenMixin.java | 8 ++-- src/main/resources/myserver.mixins.json | 33 +++++++------- 4 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 src/main/java/dev/encode42/myserver/accessors/MinecraftAccessor.java create mode 100644 src/main/java/dev/encode42/myserver/mixin/MinecraftMixin.java diff --git a/src/main/java/dev/encode42/myserver/accessors/MinecraftAccessor.java b/src/main/java/dev/encode42/myserver/accessors/MinecraftAccessor.java new file mode 100644 index 0000000..af4717e --- /dev/null +++ b/src/main/java/dev/encode42/myserver/accessors/MinecraftAccessor.java @@ -0,0 +1,8 @@ +package dev.encode42.myserver.accessors; + +import org.spongepowered.asm.mixin.Unique; + +public interface MinecraftAccessor { + @Unique + void myserver$setSpecialServer(boolean isSpecial); +} diff --git a/src/main/java/dev/encode42/myserver/mixin/MinecraftMixin.java b/src/main/java/dev/encode42/myserver/mixin/MinecraftMixin.java new file mode 100644 index 0000000..2a911e7 --- /dev/null +++ b/src/main/java/dev/encode42/myserver/mixin/MinecraftMixin.java @@ -0,0 +1,44 @@ +package dev.encode42.myserver.mixin; + +import dev.encode42.myserver.accessors.MinecraftAccessor; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +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.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Minecraft.class) +public class MinecraftMixin implements MinecraftAccessor { + @Unique + private boolean myserver$isSpecialServer = false; + + @ModifyVariable( + method = "disconnectFromWorld", + at = @At( + value = "LOAD", + ordinal = 1 + ), + name = "localServer" + ) + private boolean checkSpecialServer(boolean localServer) { + return localServer || this.myserver$isSpecialServer; + } + + @Inject( + method = "disconnectFromWorld", + at = @At( + value = "TAIL" + ) + ) + private void modifyDisconnectWorld(Component message, CallbackInfo ci) { + this.myserver$isSpecialServer = false; + } + + @Override + public void myserver$setSpecialServer(boolean isSpecial) { + this.myserver$isSpecialServer = isSpecial; + } +} diff --git a/src/main/java/dev/encode42/myserver/mixin/TitleScreenMixin.java b/src/main/java/dev/encode42/myserver/mixin/TitleScreenMixin.java index 7efcb71..ccebe52 100644 --- a/src/main/java/dev/encode42/myserver/mixin/TitleScreenMixin.java +++ b/src/main/java/dev/encode42/myserver/mixin/TitleScreenMixin.java @@ -1,6 +1,7 @@ package dev.encode42.myserver.mixin; import dev.encode42.myserver.MyServer; +import dev.encode42.myserver.accessors.MinecraftAccessor; import dev.encode42.myserver.config.MyServerConfig; import eu.midnightdust.lib.config.MidnightConfig; import net.minecraft.client.Minecraft; @@ -12,7 +13,6 @@ import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.ConnectScreen; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.TitleScreen; -import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.resolver.ServerAddress; import net.minecraft.network.chat.Component; @@ -51,7 +51,7 @@ public class TitleScreenMixin extends Screen { Button joinServerButton = Button.builder( Component.translatable("selectServer.select"), (_) -> { - Screen joinMultiplayerScreen = new JoinMultiplayerScreen(this); + Screen titleScreen = new TitleScreen(); if (!hasAddress) { this.minecraft.gui.setScreen(MidnightConfig.getScreen(this, MyServer.MOD_ID)); @@ -59,7 +59,9 @@ public class TitleScreenMixin extends Screen { return; } - ConnectScreen.startConnecting(joinMultiplayerScreen, this.minecraft, ServerAddress.parseString(data.ip), data, false, null); + ((MinecraftAccessor) this.minecraft).myserver$setSpecialServer(true); + + ConnectScreen.startConnecting(titleScreen, this.minecraft, ServerAddress.parseString(data.ip), data, false, null); } ) .width(TitleScreenMixin.JOIN_BUTTON_WIDTH - TitleScreenMixin.JOIN_BUTTON_PADDING) diff --git a/src/main/resources/myserver.mixins.json b/src/main/resources/myserver.mixins.json index e006a0a..05bfb93 100644 --- a/src/main/resources/myserver.mixins.json +++ b/src/main/resources/myserver.mixins.json @@ -1,18 +1,19 @@ { - "required": true, - "minVersion": "0.8", - "package": "dev.encode42.myserver.mixin", - "compatibilityLevel": "JAVA_25", - "mixins": [ - ], - "client": [ - "ButtonAccessor", - "TitleScreenMixin" - ], - "injectors": { - "defaultRequire": 1 - }, - "overwrites": { - "requireAnnotations": true - } + "required": true, + "minVersion": "0.8", + "package": "dev.encode42.myserver.mixin", + "compatibilityLevel": "JAVA_25", + "mixins": [ + ], + "client": [ + "ButtonAccessor", + "MinecraftMixin", + "TitleScreenMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "overwrites": { + "requireAnnotations": true + } } -- 2.54.0