From 4a48d2c7218054c12884557be67f166737310e9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=C3=AFs=20Saraiva?= <53227802+Kisakay@users.noreply.github.com> Date: Mon, 19 Oct 2026 18:41:56 +0200 Subject: [PATCH] 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. --- atlas/root/distribution.json | 8 +- ...yer-1.1.2.jar => nosingleplayer-1.1.3.jar} | Bin 2292471 -> 2294172 bytes mods/nosingleplayer/README.md | 9 +- mods/nosingleplayer/build.gradle | 94 ++++++++++++++++++ mods/nosingleplayer/gradle.properties | 2 +- .../mixin/PauseScreenMixin.java | 45 +++++++++ .../mixin/TitleScreenMixin.java | 7 +- .../main/resources/nosingleplayer.mixins.json | 1 + sync-mods.sh | 5 +- 9 files changed, 158 insertions(+), 13 deletions(-) rename atlas/root/servers/SurviePote-26.3/fabricmods/required/{nosingleplayer-1.1.2.jar => nosingleplayer-1.1.3.jar} (99%) create mode 100644 mods/nosingleplayer/src/main/java/fr/surviepote/nosingleplayer/mixin/PauseScreenMixin.java diff --git a/atlas/root/distribution.json b/atlas/root/distribution.json index 97a53fd..04b5d37 100644 --- a/atlas/root/distribution.json +++ b/atlas/root/distribution.json @@ -407,13 +407,13 @@ } }, { - "id": "fr.surviepote:nosingleplayer:1.1.2@jar", + "id": "fr.surviepote:nosingleplayer:1.1.3@jar", "name": "NoSingleplayer (SurviePote)", "type": "FabricMod", "artifact": { - "size": 2292471, - "url": "https://git.kisakay.com/k/mc/raw/branch/main/atlas/root/servers/SurviePote-26.3/fabricmods/required/nosingleplayer-1.1.2.jar", - "MD5": "2ba50ec99adb670cdb34fe41b0e3d7dd" + "size": 2294172, + "url": "https://git.kisakay.com/k/mc/raw/branch/main/atlas/root/servers/SurviePote-26.3/fabricmods/required/nosingleplayer-1.1.3.jar", + "MD5": "577674ec296cbc75ac9da009b8d6532e" } }, { diff --git a/atlas/root/servers/SurviePote-26.3/fabricmods/required/nosingleplayer-1.1.2.jar b/atlas/root/servers/SurviePote-26.3/fabricmods/required/nosingleplayer-1.1.3.jar similarity index 99% rename from atlas/root/servers/SurviePote-26.3/fabricmods/required/nosingleplayer-1.1.2.jar rename to atlas/root/servers/SurviePote-26.3/fabricmods/required/nosingleplayer-1.1.3.jar index f3a20686a1c9b626c05bd3fec093d804f2c87106..d534fae23683ad359408a7c7593cc1151bf288fa 100644 GIT binary patch delta 6122 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 Y`Cm#>e98>U3<2aVqjnZ0Ptf%y#N3J delta 4551 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 + lib.name.contains(':natives-linux') && (lib.rules == null || lib.rules.any { it.action == 'allow' && (it.os == null || it.os.name == 'linux') }) + }.collect { lib -> + zipTree(new File(survieCommon, "libraries/${lib.downloads.artifact.path}")) + }) + into(layout.buildDirectory.dir('runClient/natives')) + include('**/*.so') + eachFile { f -> f.path = f.name } +} + +tasks.register('runClient', JavaExec) { + dependsOn('extractClientNatives', 'jar') + group = 'fabric' + description = 'Lance le client Minecraft avec le mod (dev visuel, sans loom).' + + def versionJson = new groovy.json.JsonSlurper().parse( + new File(survieCommon, "versions/${mcVersion}/${mcVersion}.json")) + def fabricJson = new groovy.json.JsonSlurper().parse( + new File(survieCommon, "versions/${mcVersion}-fabric-${loaderVersion}/${mcVersion}-fabric-${loaderVersion}.json")) + def mavenToPath = { String coord -> + def parts = coord.split(':') + return "${parts[0].replace('.', '/')}/${parts[1]}/${parts[2]}/${parts[1]}-${parts[2]}.jar" + } + + doFirst { + def modsDir = layout.buildDirectory.dir('runClient/game/mods').get().asFile + delete(modsDir) + modsDir.mkdirs() + copy { + from(tasks.named('jar')) + into(modsDir) + } + } + + // NixOS : dlopen ne voit ni libGL ni libvulkan sans LD_LIBRARY_PATH (cf launcher). + def nixStore = new File('/nix/store') + def glDirs = [] + ['/run/opengl-driver/lib', '/run/current-system/sw/lib'].each { d -> + if (new File(d).exists()) glDirs << d + } + if (nixStore.exists()) { + nixStore.eachDir { e -> + def n = e.name + if (n.contains('libglvnd') || n.contains('vulkan-loader') || n.contains('alsa-lib') + || n.contains('pulseaudio') || (n.contains('pipewire') && !n.contains('python'))) { + def lib = new File(e, 'lib') + if (lib.exists()) glDirs << lib.absolutePath + } + } + } + def prevLd = System.getenv('LD_LIBRARY_PATH') + environment('LD_LIBRARY_PATH', (prevLd ? prevLd + ':' : '') + glDirs.join(':')) + if (!System.getenv('SDL_VIDEODRIVER') && (System.getenv('WAYLAND_DISPLAY') || new File('/run/user/1000/wayland-1').exists())) { + environment('SDL_VIDEODRIVER', 'wayland') + } + + javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(25) } + classpath = files( + new File(survieCommon, "versions/${mcVersion}/${mcVersion}.jar"), + versionJson.libraries.findAll { lib -> + !(lib.name.contains(':natives-')) && (lib.rules == null || lib.rules.any { it.action == 'allow' && (it.os == null || it.os.name == 'linux') }) + }.collect { new File(survieCommon, "libraries/${it.downloads.artifact.path}") }, + fabricJson.libraries.collect { new File(survieCommon, "libraries/${mavenToPath(it.name)}") } + ) + mainClass = 'net.fabricmc.loader.impl.launch.knot.KnotClient' + args = [ + '--gameDir', layout.buildDirectory.dir('runClient/game').get().asFile.absolutePath, + '--assetsDir', new File(survieCommon, 'assets').absolutePath, + '--assetIndex', versionJson.assetIndex.id, + '--version', "${project.archives_base_name}-dev", + '--username', 'Dev', '--uuid', '00000000-0000-0000-0000-000000000000', + '--accessToken', '0', '--versionType', 'release' + ] + jvmArgs = [ + "-Djava.library.path=${layout.buildDirectory.dir('runClient/natives').get().asFile.absolutePath}", + '-Xmx4G' + ] + systemProperties['org.lwjgl.util.Debug'] = 'false' +} diff --git a/mods/nosingleplayer/gradle.properties b/mods/nosingleplayer/gradle.properties index e7c3c26..767c77e 100644 --- a/mods/nosingleplayer/gradle.properties +++ b/mods/nosingleplayer/gradle.properties @@ -5,7 +5,7 @@ loader_version=0.20.0 loom_version=1.19.1 # Mod Properties -mod_version=1.1.2 +mod_version=1.1.3 maven_group=fr.surviepote archives_base_name=nosingleplayer diff --git a/mods/nosingleplayer/src/main/java/fr/surviepote/nosingleplayer/mixin/PauseScreenMixin.java b/mods/nosingleplayer/src/main/java/fr/surviepote/nosingleplayer/mixin/PauseScreenMixin.java new file mode 100644 index 0000000..5026de9 --- /dev/null +++ b/mods/nosingleplayer/src/main/java/fr/surviepote/nosingleplayer/mixin/PauseScreenMixin.java @@ -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); + } +} diff --git a/mods/nosingleplayer/src/main/java/fr/surviepote/nosingleplayer/mixin/TitleScreenMixin.java b/mods/nosingleplayer/src/main/java/fr/surviepote/nosingleplayer/mixin/TitleScreenMixin.java index 4edcc96..989f442 100644 --- a/mods/nosingleplayer/src/main/java/fr/surviepote/nosingleplayer/mixin/TitleScreenMixin.java +++ b/mods/nosingleplayer/src/main/java/fr/surviepote/nosingleplayer/mixin/TitleScreenMixin.java @@ -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" }) diff --git a/mods/nosingleplayer/src/main/resources/nosingleplayer.mixins.json b/mods/nosingleplayer/src/main/resources/nosingleplayer.mixins.json index 81e2174..36c4f74 100644 --- a/mods/nosingleplayer/src/main/resources/nosingleplayer.mixins.json +++ b/mods/nosingleplayer/src/main/resources/nosingleplayer.mixins.json @@ -7,6 +7,7 @@ "TitleScreenRenderMixin", "TitleScreenTextMixin", "RealmsNotificationsMixin", + "PauseScreenMixin", "ScreenAccessor" ], "injectors": { diff --git a/sync-mods.sh b/sync-mods.sh index 7aa6595..7588888 100755 --- a/sync-mods.sh +++ b/sync-mods.sh @@ -54,10 +54,11 @@ cp -u "$HOME/.local/share/PrismLauncher/instances/26.3/minecraft/resourcepacks/F cp -u "$HOME/.local/share/PrismLauncher/instances/26.3/minecraft/shaderpacks/Revelation-dev.zip" "atlas/root/servers/SurviePote-26.3/files/shaderpacks/" 2>/dev/null || true echo "== mod maison nosingleplayer (build si besoin) ==" -if [ ! -f mods/nosingleplayer/build/libs/nosingleplayer-1.1.2.jar ]; then +if [ ! -f mods/nosingleplayer/build/libs/nosingleplayer-1.1.3.jar ]; then (cd mods/nosingleplayer && ./gradlew build 2>&1 | tail -n 2) || echo "BUILD nosingleplayer échoué (réseau/gradle requis)" fi -cp -u mods/nosingleplayer/build/libs/nosingleplayer-1.1.2.jar "$ATLAS_MODS/" 2>/dev/null || true +cp -u mods/nosingleplayer/build/libs/nosingleplayer-1.1.3.jar "$ATLAS_MODS/" 2>/dev/null || true +rm -f "$ATLAS_MODS"/nosingleplayer-1.1.2.jar "$ATLAS_MODS"/nosingleplayer-1.1.1.jar "$ATLAS_MODS"/nosingleplayer-1.1.0.jar "$ATLAS_MODS"/nosingleplayer-1.0.0.jar # Note : environment=client (menu titre), inutile côté serveur. echo "== regen distribution.json =="