From 93ebd95f8a02642ec1e66b9b6c108dc0344fbb05 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 16 Aug 2020 02:22:10 +0200 Subject: [PATCH] Fix async issues with SpawnPlayer. Fixes #1705 --- Content.Server/GameTicking/GameTicker.cs | 26 ++++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 8c3ed03f1b..bef68e027d 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -264,7 +264,7 @@ namespace Content.Server.GameTicking // Spawn everybody in! foreach (var (player, job) in assignedJobs) { - SpawnPlayer(player, job, false); + SpawnPlayer(player, profiles[player.Name], job, false); } // Time to start the preset. @@ -344,7 +344,7 @@ namespace Content.Server.GameTicking if (LobbyEnabled) _playerJoinLobby(targetPlayer); else - SpawnPlayer(targetPlayer); + SpawnPlayerAsync(targetPlayer); } public void MakeObserve(IPlayerSession player) @@ -358,7 +358,7 @@ namespace Content.Server.GameTicking { if (!_playersInLobby.ContainsKey(player)) return; - SpawnPlayer(player, jobId); + SpawnPlayerAsync(player, jobId); } public void ToggleReady(IPlayerSession player, bool ready) @@ -620,7 +620,7 @@ namespace Content.Server.GameTicking _playerJoinLobby(player); } - + EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResetLayouts(); @@ -684,13 +684,13 @@ namespace Content.Server.GameTicking return; } - SpawnPlayer(session); + SpawnPlayerAsync(session); } else { if (data.Mind.CurrentEntity == null) { - SpawnPlayer(session); + SpawnPlayerAsync(session); } else { @@ -744,14 +744,22 @@ namespace Content.Server.GameTicking }, _updateShutdownCts.Token); } - private async void SpawnPlayer(IPlayerSession session, string jobId = null, bool lateJoin = true) + private async void SpawnPlayerAsync(IPlayerSession session, string jobId = null, bool lateJoin = true) { - _playerJoinGame(session); - var character = (HumanoidCharacterProfile) (await _prefsManager .GetPreferencesAsync(session.SessionId.Username)) .SelectedCharacter; + SpawnPlayer(session, character, jobId, lateJoin); + } + + private void SpawnPlayer(IPlayerSession session, + HumanoidCharacterProfile character, + string jobId = null, + bool lateJoin = true) + { + _playerJoinGame(session); + var data = session.ContentData(); data.WipeMind(); data.Mind = new Mind(session.SessionId)