From a5586d0e3e80b506342f26270d3943d7c2c2a230 Mon Sep 17 00:00:00 2001 From: MhaWay Date: Tue, 19 May 2026 23:16:00 +0200 Subject: [PATCH 1/2] Use shared entry transition for bootstrap reconnect --- Source/Client/Session/Rejoiner.cs | 28 +++++++++++-------- ...otstrapConfiguratorWindow.BootstrapFlow.cs | 27 ++++++++++++------ 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/Source/Client/Session/Rejoiner.cs b/Source/Client/Session/Rejoiner.cs index a69c0ff3..dadd2408 100644 --- a/Source/Client/Session/Rejoiner.cs +++ b/Source/Client/Session/Rejoiner.cs @@ -7,18 +7,8 @@ namespace Multiplayer.Client; public static class Rejoiner { - public static void DoRejoin() + public static void ReturnToEntry(Action onFinished) { - Multiplayer.Client.Send(Packets.Client_RequestRejoin); - - Multiplayer.Client.ChangeState(ConnectionStateEnum.ClientLoading); - Multiplayer.Client.Lenient = true; - - Multiplayer.session.desynced = false; - - Log.Message("Multiplayer: rejoining"); - - // From GenScene.GoToMainMenu LongEventHandler.ClearQueuedEvents(); LongEventHandler.QueueLongEvent(() => { @@ -28,8 +18,22 @@ public static void DoRejoin() LongEventHandler.ExecuteWhenFinished(() => { MpUI.ClearWindowStack(); - Find.WindowStack.Add(new RejoiningWindow()); + onFinished?.Invoke(); }); }, "Entry", "LoadingLongEvent", true, null, false); } + + public static void DoRejoin() + { + Multiplayer.Client.Send(Packets.Client_RequestRejoin); + + Multiplayer.Client.ChangeState(ConnectionStateEnum.ClientLoading); + Multiplayer.Client.Lenient = true; + + Multiplayer.session.desynced = false; + + Log.Message("Multiplayer: rejoining"); + + ReturnToEntry(() => Find.WindowStack.Add(new RejoiningWindow())); + } } diff --git a/Source/Client/Windows/BootstrapConfiguratorWindow.BootstrapFlow.cs b/Source/Client/Windows/BootstrapConfiguratorWindow.BootstrapFlow.cs index 06ce0608..e6cdc812 100644 --- a/Source/Client/Windows/BootstrapConfiguratorWindow.BootstrapFlow.cs +++ b/Source/Client/Windows/BootstrapConfiguratorWindow.BootstrapFlow.cs @@ -328,25 +328,36 @@ private void FinalizeBootstrapSave(string path) StatusText = statusText ?? string.Empty }; - saveUploadStatus = "Save created. Returning to menu..."; - LongEventHandler.QueueLongEvent(ReturnToMenuAndReconnect, "Returning to menu", false, null); + saveUploadStatus = "Save created. Returning to entry..."; + LongEventHandler.ExecuteWhenFinished(ReturnToEntryAndReconnect); } - private void ReturnToMenuAndReconnect() + private void ReturnToEntryAndReconnect() { - GenScene.GoToMainMenu(); - LongEventHandler.ExecuteWhenFinished(ReconnectAfterReturningToMenu); + try + { + Log.Message("Bootstrap: returning to entry for save upload reconnect"); + Rejoiner.ReturnToEntry(ReconnectAfterReturningToEntry); + } + catch (Exception exception) + { + saveUploadStatus = $"Return to entry failed: {exception.GetType().Name}: {exception.Message}"; + bootstrapSaveQueued = false; + Log.Error($"Bootstrap return to entry failed: {exception}"); + } } - private void ReconnectAfterReturningToMenu() + private void ReconnectAfterReturningToEntry() { if (Current.ProgramState != ProgramState.Entry || Current.Game != null) { - saveUploadStatus = "Waiting to finish returning to menu..."; - LongEventHandler.ExecuteWhenFinished(ReconnectAfterReturningToMenu); + saveUploadStatus = "Waiting to finish returning to entry..."; + LongEventHandler.ExecuteWhenFinished(ReconnectAfterReturningToEntry); return; } + Multiplayer.StopMultiplayer(); + saveUploadStatus = "Reconnecting to upload save..."; if (reconnectConnector == null) From a0ebb6e17c7d275b3e2b1288b7500e899726f2ad Mon Sep 17 00:00:00 2001 From: MhaWay Date: Tue, 19 May 2026 23:19:11 +0200 Subject: [PATCH 2/2] Add missing System import for Rejoiner helper --- Source/Client/Session/Rejoiner.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Client/Session/Rejoiner.cs b/Source/Client/Session/Rejoiner.cs index dadd2408..1d1f4c48 100644 --- a/Source/Client/Session/Rejoiner.cs +++ b/Source/Client/Session/Rejoiner.cs @@ -1,4 +1,5 @@ -using Multiplayer.Client.Util; +using System; +using Multiplayer.Client.Util; using Multiplayer.Common; using Verse; using Verse.Profile;