From 10fa1bc1d22079aab3ca20286a5fc799f04d74c1 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Tue, 21 Feb 2023 01:16:25 +0100 Subject: [PATCH] Fix first round after a server restart being displayed as number 0 (#14194) --- .../GameTicking/GameTicker.GamePreset.cs | 23 +++++++++++++++++++ .../GameTicking/GameTicker.Player.cs | 2 ++ .../GameTicking/GameTicker.RoundFlow.cs | 20 ++-------------- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/Content.Server/GameTicking/GameTicker.GamePreset.cs b/Content.Server/GameTicking/GameTicker.GamePreset.cs index 7956a3d7d8..41622d6e82 100644 --- a/Content.Server/GameTicking/GameTicker.GamePreset.cs +++ b/Content.Server/GameTicking/GameTicker.GamePreset.cs @@ -1,5 +1,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Threading.Tasks; +using Content.Server.GameTicking.Events; using Content.Server.GameTicking.Presets; using Content.Server.GameTicking.Rules; using Content.Server.Ghost.Components; @@ -241,6 +243,27 @@ namespace Content.Server.GameTicking mind.TransferTo(ghost); return true; } + + private void IncrementRoundNumber() + { + var playerIds = _playerGameStatuses.Keys.Select(player => player.UserId).ToArray(); + var serverName = _configurationManager.GetCVar(CCVars.AdminLogsServerName); + + // TODO FIXME AAAAAAAAAAAAAAAAAAAH THIS IS BROKEN + // Task.Run as a terrible dirty workaround to avoid synchronization context deadlock from .Result here. + // This whole setup logic should be made asynchronous so we can properly wait on the DB AAAAAAAAAAAAAH + var task = Task.Run(async () => + { + var server = await _db.AddOrGetServer(serverName); + return await _db.AddNewRound(server, playerIds); + }); + + _taskManager.BlockWaitOnTask(task); + RoundId = task.GetAwaiter().GetResult(); + + var startingEvent = new RoundStartingEvent(RoundId); + RaiseLocalEvent(startingEvent); + } } public sealed class GhostAttemptHandleEvent : HandledEntityEventArgs diff --git a/Content.Server/GameTicking/GameTicker.Player.cs b/Content.Server/GameTicking/GameTicker.Player.cs index d785878d45..10edb7d096 100644 --- a/Content.Server/GameTicking/GameTicker.Player.cs +++ b/Content.Server/GameTicking/GameTicker.Player.cs @@ -128,6 +128,7 @@ namespace Content.Server.GameTicking _chatManager.DispatchServerMessage(session, Loc.GetString("game-ticker-player-join-game-message")); _playerGameStatuses[session.UserId] = PlayerGameStatus.JoinedGame; + _db.AddRoundPlayers(RoundId, session.UserId); RaiseNetworkEvent(new TickerJoinGameEvent(), session.ConnectedClient); } @@ -135,6 +136,7 @@ namespace Content.Server.GameTicking private void PlayerJoinLobby(IPlayerSession session) { _playerGameStatuses[session.UserId] = LobbyEnabled ? PlayerGameStatus.NotReadyToPlay : PlayerGameStatus.ReadyToPlay; + _db.AddRoundPlayers(RoundId, session.UserId); var client = session.ConnectedClient; RaiseNetworkEvent(new TickerJoinLobbyEvent(), client); diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index ab88cccc63..5e45894c16 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -180,24 +180,6 @@ namespace Content.Server.GameTicking RoundLengthMetric.Set(0); - var playerIds = _playerGameStatuses.Keys.Select(player => player.UserId).ToArray(); - var serverName = _configurationManager.GetCVar(CCVars.AdminLogsServerName); - - // TODO FIXME AAAAAAAAAAAAAAAAAAAH THIS IS BROKEN - // Task.Run as a terrible dirty workaround to avoid synchronization context deadlock from .Result here. - // This whole setup logic should be made asynchronous so we can properly wait on the DB AAAAAAAAAAAAAH - var task = Task.Run(async () => - { - var server = await _db.AddOrGetServer(serverName); - return await _db.AddNewRound(server, playerIds); - }); - - _taskManager.BlockWaitOnTask(task); - RoundId = task.GetAwaiter().GetResult(); - - var startingEvent = new RoundStartingEvent(RoundId); - RaiseLocalEvent(startingEvent); - var readyPlayers = new List(); var readyPlayerProfiles = new Dictionary(); @@ -392,6 +374,7 @@ namespace Content.Server.GameTicking LobbySong = _robustRandom.Pick(_lobbyMusicCollection.PickFiles).ToString(); RandomizeLobbyBackground(); ResettingCleanup(); + IncrementRoundNumber(); if (!LobbyEnabled) { @@ -405,6 +388,7 @@ namespace Content.Server.GameTicking _roundStartTime = _gameTiming.CurTime + LobbyDuration; SendStatusToAll(); + UpdateInfoText(); ReqWindowAttentionAll(); } -- 2.52.0