nosingleplayer 1.1.3: fix connexion + bouton Quitter SurviePote

- TitleScreenMixin : TransferState null sur startConnecting -> connexion
  normale, corrige "This server does not accept transfers".
- PauseScreenMixin (nouveau) : renomme le bouton de deconnexion du menu
  Echap en "Quitter SurviePote" et redirige vers l'ecran d'accueil
  (TitleScreen) au lieu de la liste des serveurs.
- build.gradle : tache runClient (dev sans loom) reutilisant
  ~/.surviepote/common.
- Jar 1.1.3 copie dans l'atlas + distribution.json regenere.
This commit is contained in:
Anaïs Saraiva
2026-10-19 18:41:56 +02:00
parent 159a594b2c
commit 4a48d2c721
9 changed files with 158 additions and 13 deletions
@@ -0,0 +1,45 @@
package fr.surviepote.nosingleplayer.mixin;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.PauseScreen;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.network.chat.CommonComponents;
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.Redirect;
@Mixin(PauseScreen.class)
public abstract class PauseScreenMixin {
@Unique
private static final Component SURVIEPOTE_QUIT = Component.literal("Quitter SurviePote");
// Quitte le monde comme le bouton vanilla, mais renvoie vers l'écran d'accueil
// (au lieu de la liste des serveurs pour un serveur distant).
@Unique
private static void surviepote$quitToTitle(Button button) {
button.active = false;
Minecraft minecraft = Minecraft.getInstance();
// Conserve la gestion vanilla du brouillon de signalement, puis redirige.
minecraft.getReportingContext().draftReportHandled(minecraft, minecraft.gui.screen(), () -> {
minecraft.disconnectFromWorld(ClientLevel.DEFAULT_QUIT_MESSAGE);
minecraft.setScreenAndShow(new TitleScreen());
}, true);
}
@Redirect(method = "createPauseMenu",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/gui/components/Button;builder(Lnet/minecraft/network/chat/Component;Lnet/minecraft/client/gui/components/Button$OnPress;)Lnet/minecraft/client/gui/components/Button$Builder;"))
private static Button.Builder surviepote$relabelDisconnect(Component message, Button.OnPress onPress) {
// createPauseMenu ne crée que deux boutons via Button.builder : "Retour au jeu"
// et "Déconnexion". On ne remplace que ce dernier.
if (message.getString().equals(CommonComponents.GUI_DISCONNECT.getString())) {
return Button.builder(SURVIEPOTE_QUIT, PauseScreenMixin::surviepote$quitToTitle);
}
return Button.builder(message, onPress);
}
}
@@ -2,7 +2,6 @@ package fr.surviepote.nosingleplayer.mixin;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Button;
@@ -13,7 +12,6 @@ import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.ConnectScreen;
import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.TransferState;
import net.minecraft.client.multiplayer.resolver.ServerAddress;
import net.minecraft.network.chat.Component;
import fr.surviepote.nosingleplayer.NoSingleplayer;
@@ -86,8 +84,9 @@ public abstract class TitleScreenMixin {
Button join = Button.builder(Component.literal("Rejoindre SurviePote"), pressed -> {
ServerData data = new ServerData("SurviePote", SERVER_HOST, ServerData.Type.OTHER);
ConnectScreen.startConnecting(self, minecraft, ServerAddress.parseString(SERVER_HOST), data, false,
new TransferState(Map.of(), Map.of(), false));
// TransferState null = connexion normale. En passer un déclenche une connexion
// de type "transfert", que le serveur refuse ("This server does not accept transfers").
ConnectScreen.startConnecting(self, minecraft, ServerAddress.parseString(SERVER_HOST), data, false, null);
}).bounds(joinX, joinY, 200, 20).build();
((ScreenAccessor) self).surviepote$getRenderables().add(join);
@SuppressWarnings({ "unchecked", "rawtypes" })
@@ -7,6 +7,7 @@
"TitleScreenRenderMixin",
"TitleScreenTextMixin",
"RealmsNotificationsMixin",
"PauseScreenMixin",
"ScreenAccessor"
],
"injectors": {