From 21282ba055f891dc46f44d2d0339efbcdcc235f3 Mon Sep 17 00:00:00 2001 From: Extremelyd1 Date: Sat, 13 Jan 2024 12:45:21 +0100 Subject: [PATCH] Empty scene server crash (#100) * Check for null or empty scene on client enter scene * Set defaults for server player data --- HKMP/Game/Server/ServerManager.cs | 14 +++++++++++++- HKMP/Game/Server/ServerPlayerData.cs | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/HKMP/Game/Server/ServerManager.cs b/HKMP/Game/Server/ServerManager.cs index 7c6efb7f..480c9119 100644 --- a/HKMP/Game/Server/ServerManager.cs +++ b/HKMP/Game/Server/ServerManager.cs @@ -240,10 +240,12 @@ private void OnHelloServer(ushort id, HelloServer helloServer) { return; } - playerData.CurrentScene = helloServer.SceneName; + // Specifically set the position, scale and animation before current scene so that when we check if current + // scene exists, we have all other data set playerData.Position = helloServer.Position; playerData.Scale = helloServer.Scale; playerData.AnimationId = helloServer.AnimationClipId; + playerData.CurrentScene = helloServer.SceneName; var clientInfo = new List<(ushort, string)>(); @@ -321,6 +323,16 @@ private void OnClientEnterScene(ServerPlayerData playerData) { var enterSceneList = new List(); var alreadyPlayersInScene = false; + // Edge case where the scene of the player is empty (uninitialized) and we don't want to match with other + // uninitialized players. Otherwise, it causes issues where other parts of the player data for other players + // could be null and result in NREs further down the line + if (string.IsNullOrEmpty(playerData.CurrentScene)) { + _netServer.GetUpdateManagerForClient(playerData.Id)?.AddPlayerAlreadyInSceneData( + enterSceneList, + true + ); + } + foreach (var idPlayerDataPair in _playerData) { // Skip source player if (idPlayerDataPair.Key == playerData.Id) { diff --git a/HKMP/Game/Server/ServerPlayerData.cs b/HKMP/Game/Server/ServerPlayerData.cs index 29bef4f4..94c25592 100644 --- a/HKMP/Game/Server/ServerPlayerData.cs +++ b/HKMP/Game/Server/ServerPlayerData.cs @@ -25,7 +25,7 @@ internal class ServerPlayerData : IServerPlayer { public string CurrentScene { get; set; } /// - public Vector2 Position { get; set; } + public Vector2 Position { get; set; } = Vector2.Zero; /// public bool Scale { get; set; } @@ -34,7 +34,7 @@ internal class ServerPlayerData : IServerPlayer { public bool HasMapIcon { get; set; } /// - public Vector2 MapPosition { get; set; } + public Vector2 MapPosition { get; set; } = Vector2.Zero; /// public ushort AnimationId { get; set; }