diff options
| author | Rosa <rosaontheweb@proton.me> | 2026-05-19 17:40:02 -0400 |
|---|---|---|
| committer | Rosa <rosaontheweb@proton.me> | 2026-05-19 17:40:02 -0400 |
| commit | cdb7b6faffa3d708a936b36197996d0beb5be82c (patch) | |
| tree | 6e75255a3cb2e4f742e345f2da56d7464070bf70 /src/main/java/club/eviltransgenders/autoreconnect | |
the mod works
Diffstat (limited to 'src/main/java/club/eviltransgenders/autoreconnect')
3 files changed, 91 insertions, 0 deletions
diff --git a/src/main/java/club/eviltransgenders/autoreconnect/AutoReconnect.java b/src/main/java/club/eviltransgenders/autoreconnect/AutoReconnect.java new file mode 100644 index 0000000..d756c23 --- /dev/null +++ b/src/main/java/club/eviltransgenders/autoreconnect/AutoReconnect.java @@ -0,0 +1,45 @@ +package club.eviltransgenders.autoreconnect; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.ConnectScreen; +import net.minecraft.client.gui.screens.DisconnectedScreen; +import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.resolver.ServerAddress; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.network.chat.Component; + +public final class AutoReconnect implements ClientModInitializer { + private static AutoReconnect instance; + private long reconnectTimer; + public ServerData lastServerData; + + @Override + public void onInitializeClient() { + instance = this; + ScreenEvents.AFTER_INIT.register(this::afterScreenInit); + } + + public void afterScreenInit(Minecraft client, Screen screen, int scaledWidth, int scaledHeight) { + if (screen instanceof DisconnectedScreen) { + this.reconnectTimer = 5 * 20; + ScreenEvents.afterTick(screen).register(this::afterScreenTick); + } + } + + public void afterScreenTick(Screen screen) { + if (--this.reconnectTimer <= 0) { + ConnectScreen.startConnecting(new JoinMultiplayerScreen(new TitleScreen()), Minecraft.getInstance(), ServerAddress.parseString(this.lastServerData.ip), this.lastServerData, false, null); + } else { + ((Button) screen.children().getLast()).setMessage(Component.translatable("gui.autoreconnect.reconnect", this.reconnectTimer / 20)); + } + } + + public static AutoReconnect getInstance() { + return instance; + } +} diff --git a/src/main/java/club/eviltransgenders/autoreconnect/mixin/ConnectScreenMixin.java b/src/main/java/club/eviltransgenders/autoreconnect/mixin/ConnectScreenMixin.java new file mode 100644 index 0000000..dd2e4a1 --- /dev/null +++ b/src/main/java/club/eviltransgenders/autoreconnect/mixin/ConnectScreenMixin.java @@ -0,0 +1,20 @@ +package club.eviltransgenders.autoreconnect.mixin; + +import club.eviltransgenders.autoreconnect.AutoReconnect; +import net.minecraft.client.gui.screens.ConnectScreen; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.resolver.ServerAddress; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.TransferState; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(ConnectScreen.class) +public abstract class ConnectScreenMixin { + @Inject(at = @At("HEAD"), method = "connect") + private void updateLastServerData(Minecraft client, ServerAddress hostAndPort, ServerData serverData, TransferState transferState, CallbackInfo ci) { + AutoReconnect.getInstance().lastServerData = serverData; + } +} diff --git a/src/main/java/club/eviltransgenders/autoreconnect/mixin/DisconnectedScreenMixin.java b/src/main/java/club/eviltransgenders/autoreconnect/mixin/DisconnectedScreenMixin.java new file mode 100644 index 0000000..99a59f9 --- /dev/null +++ b/src/main/java/club/eviltransgenders/autoreconnect/mixin/DisconnectedScreenMixin.java @@ -0,0 +1,26 @@ +package club.eviltransgenders.autoreconnect.mixin; + +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.layouts.LinearLayout; +import net.minecraft.client.gui.screens.DisconnectedScreen; +import net.minecraft.network.chat.Component; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(DisconnectedScreen.class) +public abstract class DisconnectedScreenMixin { + @Shadow + @Final + private LinearLayout layout; + + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/layouts/LinearLayout;visitWidgets(Ljava/util/function/Consumer;)V"), method = "init") + private void addAutoReconnectButtons(CallbackInfo ci) { + Button reconnectButton = Button.builder(Component.translatable("gui.autoreconnect.reconnect"), btn -> {}).width(200).build(); + this.layout.addChild(reconnectButton); + this.layout.arrangeElements(); + } +} |
