From 9dd45f35f77c246e75b80fab39b23fcaa4699364 Mon Sep 17 00:00:00 2001 From: FangkuaiYa <2683748223@qq.com> Date: Sat, 15 Aug 2026 13:16:55 +0800 Subject: [PATCH] Fix --- src/Empostor.Server/Net/State/Game.State.cs | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/Empostor.Server/Net/State/Game.State.cs b/src/Empostor.Server/Net/State/Game.State.cs index ad8696d..d4ae7e1 100644 --- a/src/Empostor.Server/Net/State/Game.State.cs +++ b/src/Empostor.Server/Net/State/Game.State.cs @@ -116,22 +116,13 @@ namespace Empostor.Server.Net.State private async ValueTask CheckLimboPlayers() { - foreach (var (_, player) in _players.Where(x => x.Value.Limbo == LimboStates.WaitingForHost)) + var limboPlayers = _players.Where(x => x.Value.Limbo == LimboStates.WaitingForHost); + foreach (var (_, player) in limboPlayers) { - // Pull players out of limbo and start their spawn timeout so a failed - // spawn is not silently stuck. Clear any stale Character too, so the - // spawn timeout can actually fire (a leftover Character != null would - // skip the timeout and leave the player stuck). - // (The PR's HandleJoinGameNext approach would re-set WaitingForHost - // and leave the player stuck on the wait-for-host screen, so we keep - // the direct pull-out instead.) - player.Character = null; - player.InitializeSpawnTimeout(); - using var message = MessageWriter.Get(MessageType.Reliable); - WriteJoinedGameMessage(message, true, player); - WriteAlterGameMessage(message, false, IsPublic); - player.Limbo = LimboStates.NotLimbo; - await SendToAsync(message, player.Client.Id); + // Pull the player out of limbo via HandleJoinGameNew (not + // HandleJoinGameNext, which re-sets WaitingForHost and would + // leave the player stuck on the wait-for-host screen). + await HandleJoinGameNew(player, false); } } }