fix: Improve player retrieval logic and handle non-existent clients in PlayerEntryScript

This commit is contained in:
2025-12-15 09:15:31 +01:00
parent fc089afcc0
commit 40369ffe4b
2 changed files with 51 additions and 20 deletions

58
Main.cs
View File

@@ -57,7 +57,21 @@ namespace KCM
public static KCPlayer GetPlayerByClientID(ushort clientId) 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 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<LobbyManager>(); lobbyManager = new GameObject("LobbyManager").AddComponent<LobbyManager>();
DontDestroyOnLoad(lobbyManager); DontDestroyOnLoad(lobbyManager);
//SteamFriends.InviteUserToGame(new CSteamID(76561198036307537), "test");
//SteamMatchmaking.lobby
//Main.helper.Log($"Timer duration for hazardpay {Player.inst.hazardPayWarmup.Duration}");
try try
{ {
@@ -187,10 +196,7 @@ namespace KCM
FirstSibling = true, FirstSibling = true,
OnClick = () => OnClick = () =>
{ {
//Constants.MainMenuUI_T.Find("TopLevelUICanvas/TopLevel").gameObject.SetActive(false);
SfxSystem.PlayUiSelect(); SfxSystem.PlayUiSelect();
//ServerBrowser.serverBrowserRef.SetActive(true);
TransitionTo(MenuState.ServerBrowser); TransitionTo(MenuState.ServerBrowser);
} }
}; };
@@ -298,9 +304,6 @@ namespace KCM
helper.Log("Preload start in main"); helper.Log("Preload start in main");
try try
{ {
//MainMenuPatches.Patch();
Main.helper = helper; Main.helper = helper;
helper.Log(helper.modPath); helper.Log(helper.modPath);
@@ -1294,14 +1297,35 @@ namespace KCM
{ {
Main.helper.Log("Attempting to load save from server"); Main.helper.Log("Attempting to load save from server");
using (MemoryStream ms = new MemoryStream(saveBytes)) try
{ {
BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream(saveBytes))
bf.Binder = new MultiplayerSaveDeserializationBinder(); {
saveContainer = (MultiplayerSaveContainer)bf.Deserialize(ms); 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; return false;
} }

View File

@@ -37,13 +37,20 @@ namespace KCM.ServerLobby
{ {
try try
{ {
KCPlayer player; // First check if the client still exists
Main.kCPlayers.TryGetValue(Main.GetPlayerByClientID(Client).steamId, out player); 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<TextMeshProUGUI>().text = player.name; transform.Find("PlayerName").GetComponent<TextMeshProUGUI>().text = player.name;
transform.Find("Ready").gameObject.SetActive(player.ready); transform.Find("Ready").gameObject.SetActive(player.ready);
var bannerTexture = World.inst.liverySets[player.banner].banners; var bannerTexture = World.inst.liverySets[player.banner].banners;
banner.texture = bannerTexture; banner.texture = bannerTexture;
} }
catch (Exception ex) catch (Exception ex)