From 21282ba055f891dc46f44d2d0339efbcdcc235f3 Mon Sep 17 00:00:00 2001 From: Extremelyd1 Date: Sat, 13 Jan 2024 12:45:21 +0100 Subject: [PATCH 1/3] 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; } From f810ffc594f68e9290cc7537262a8cd2ffb4e6bf Mon Sep 17 00:00:00 2001 From: Extremelyd1 Date: Sat, 13 Jan 2024 14:35:18 +0100 Subject: [PATCH 2/3] Bump version number --- HKMP/Version.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HKMP/Version.cs b/HKMP/Version.cs index 3b2d4b69..7ba9d607 100644 --- a/HKMP/Version.cs +++ b/HKMP/Version.cs @@ -7,5 +7,5 @@ internal static class Version { /// /// The version as a string. /// - public const string String = "2.4.1"; + public const string String = "2.4.2"; } From 8e02a1caa509c012a59a394f4175203e23f87b4e Mon Sep 17 00:00:00 2001 From: im-apbecker <165831479+im-apbecker@users.noreply.github.com> Date: Wed, 10 Apr 2024 08:55:07 -0600 Subject: [PATCH 3/3] Simplify port processing at the top level (#102) --- HKMPServer/HkmpServer.cs | 36 +++++------------------------------- 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/HKMPServer/HkmpServer.cs b/HKMPServer/HkmpServer.cs index 55790e40..20d42fd6 100644 --- a/HKMPServer/HkmpServer.cs +++ b/HKMPServer/HkmpServer.cs @@ -26,7 +26,9 @@ public void Initialize(string[] args) { return; } - if (string.IsNullOrEmpty(args[0]) || !ParsePort(args[0], out var port)) { + var portArg = args[0]; + + if (string.IsNullOrEmpty(portArg) || !ushort.TryParse(portArg, out var port)) { Logger.Info("Invalid port, should be an integer between 0 and 65535"); return; } @@ -47,7 +49,7 @@ public void Initialize(string[] args) { /// The input manager for command-line input. /// The logging class for logging to console. private void StartServer( - int port, + ushort port, ServerSettings serverSettings, ConsoleInputManager consoleInputManager, ConsoleLogger consoleLogger @@ -60,7 +62,7 @@ ConsoleLogger consoleLogger var serverManager = new ConsoleServerManager(netServer, serverSettings, packetManager, consoleLogger); serverManager.Initialize(); - serverManager.Start(port); + serverManager.Start((int)port); // TODO: make an event in ServerManager that we can register for so we know when the server shuts down consoleInputManager.ConsoleInputEvent += input => { @@ -71,33 +73,5 @@ ConsoleLogger consoleLogger }; consoleInputManager.Start(); } - - /// - /// Try to parse the given input as a networking port. - /// - /// The string to parse. - /// Will be set to the parsed port if this method returns true, or 0 if the method - /// returns false. - /// True if the given input was parsed as a valid port, false otherwise. - private static bool ParsePort(string input, out int port) { - if (!int.TryParse(input, out port)) { - return false; - } - - if (!IsValidPort(port)) { - return false; - } - - return true; - } - - /// - /// Returns true if the given port is a valid networking port. - /// - /// The port to check. - /// True if the port is valid, false otherwise. - private static bool IsValidPort(int port) { - return port >= 0 && port <= 65535; - } } }