From 40369ffe4b02cb654e6c3ebe316a141e2ba6de7b Mon Sep 17 00:00:00 2001 From: b3ni15 Date: Mon, 15 Dec 2025 09:15:31 +0100 Subject: [PATCH] fix: Improve player retrieval logic and handle non-existent clients in PlayerEntryScript --- Main.cs | 58 ++++++++++++++++++++++---------- ServerLobby/PlayerEntryScript.cs | 13 +++++-- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/Main.cs b/Main.cs index f8393c5..998e6be 100644 --- a/Main.cs +++ b/Main.cs @@ -57,7 +57,21 @@ namespace KCM public static KCPlayer GetPlayerByClientID(ushort clientId) { - return kCPlayers[clientSteamIds[clientId]]; + if (TryGetPlayerByClientID(clientId, out KCPlayer player)) + { + return player; + } + return null; + } + + public static bool TryGetPlayerByClientID(ushort clientId, out KCPlayer player) + { + player = null; + if (clientSteamIds.TryGetValue(clientId, out string steamId)) + { + return kCPlayers.TryGetValue(steamId, out player); + } + return false; } public static Player GetPlayerByTeamID(int teamId) // Need to replace building / production types so that the correct player is used. IResourceStorage and IResourceProvider, and jobs @@ -166,11 +180,6 @@ namespace KCM lobbyManager = new GameObject("LobbyManager").AddComponent(); DontDestroyOnLoad(lobbyManager); - //SteamFriends.InviteUserToGame(new CSteamID(76561198036307537), "test"); - //SteamMatchmaking.lobby - - //Main.helper.Log($"Timer duration for hazardpay {Player.inst.hazardPayWarmup.Duration}"); - try { @@ -187,10 +196,7 @@ namespace KCM FirstSibling = true, OnClick = () => { - //Constants.MainMenuUI_T.Find("TopLevelUICanvas/TopLevel").gameObject.SetActive(false); SfxSystem.PlayUiSelect(); - - //ServerBrowser.serverBrowserRef.SetActive(true); TransitionTo(MenuState.ServerBrowser); } }; @@ -298,9 +304,6 @@ namespace KCM helper.Log("Preload start in main"); try { - - - //MainMenuPatches.Patch(); Main.helper = helper; helper.Log(helper.modPath); @@ -1294,14 +1297,35 @@ namespace KCM { Main.helper.Log("Attempting to load save from server"); - using (MemoryStream ms = new MemoryStream(saveBytes)) + try { - BinaryFormatter bf = new BinaryFormatter(); - bf.Binder = new MultiplayerSaveDeserializationBinder(); - saveContainer = (MultiplayerSaveContainer)bf.Deserialize(ms); + using (MemoryStream ms = new MemoryStream(saveBytes)) + { + BinaryFormatter bf = new BinaryFormatter(); + bf.Binder = new MultiplayerSaveDeserializationBinder(); + saveContainer = (MultiplayerSaveContainer)bf.Deserialize(ms); + } + + Main.helper.Log("Deserialize complete, calling Unpack..."); + saveContainer.Unpack(null); + Main.helper.Log("Unpack complete!"); + } + catch (Exception e) + { + Main.helper.Log("Error loading save from server"); + Main.helper.Log(e.Message); + Main.helper.Log(e.StackTrace); + if (e.InnerException != null) + { + Main.helper.Log("Inner exception: " + e.InnerException.Message); + Main.helper.Log(e.InnerException.StackTrace); + } + } + finally + { + memoryStreamHook = false; } - memoryStreamHook = false; return false; } diff --git a/ServerLobby/PlayerEntryScript.cs b/ServerLobby/PlayerEntryScript.cs index ab5c65a..006db99 100644 --- a/ServerLobby/PlayerEntryScript.cs +++ b/ServerLobby/PlayerEntryScript.cs @@ -37,13 +37,20 @@ namespace KCM.ServerLobby { try { - KCPlayer player; - Main.kCPlayers.TryGetValue(Main.GetPlayerByClientID(Client).steamId, out player); + // First check if the client still exists + if (!Main.TryGetPlayerByClientID(Client, out KCPlayer player) || player == null) + { + // Client no longer exists, stop the repeating invoke and destroy this entry + CancelInvoke("SetValues"); + Destroy(gameObject); + return; + } + transform.Find("PlayerName").GetComponent().text = player.name; transform.Find("Ready").gameObject.SetActive(player.ready); var bannerTexture = World.inst.liverySets[player.banner].banners; - + banner.texture = bannerTexture; } catch (Exception ex)