Compare commits

...

3 Commits

4 changed files with 70 additions and 6 deletions

View File

@@ -36,6 +36,7 @@ namespace KCM
private static void Client_Disconnected(object sender, DisconnectedEventArgs e) private static void Client_Disconnected(object sender, DisconnectedEventArgs e)
{ {
Main.CleanupMultiplayerSession();
Main.helper.Log("Client disconnected event start"); Main.helper.Log("Client disconnected event start");
try try
{ {

42
Main.cs
View File

@@ -106,11 +106,51 @@ namespace KCM
public static string PlayerSteamID = SteamUser.GetSteamID().ToString(); public static string PlayerSteamID = SteamUser.GetSteamID().ToString();
public static KCMSteamManager KCMSteamManager = null; public static KCMSteamManager KCMSteamManager = null;
public static LobbyManager lobbyManager = null;
public static SteamServer steamServer = new SteamServer(); public static SteamServer steamServer = new SteamServer();
public static Riptide.Transports.Steam.SteamClient steamClient = new Riptide.Transports.Steam.SteamClient(steamServer); public static Riptide.Transports.Steam.SteamClient steamClient = new Riptide.Transports.Steam.SteamClient(steamServer);
public static ushort currentClient = 0; public static ushort currentClient = 0;
public static void CleanupMultiplayerSession()
{
if (helper == null) return; // Avoid running if mod is not fully initialized
helper.Log("--- Starting Multiplayer Session Cleanup ---");
// Disconnect client
if (KCClient.client != null && KCClient.client.IsConnected)
{
helper.Log("Disconnecting client...");
KCClient.client.Disconnect();
}
// Stop server
if (KCServer.server != null && KCServer.IsRunning)
{
helper.Log("Stopping server...");
KCServer.server.Stop();
}
// Clear player lists
if (kCPlayers.Count > 0 || clientSteamIds.Count > 0)
{
helper.Log($"Clearing {kCPlayers.Count} KCPlayer entries and {clientSteamIds.Count} client steam IDs.");
kCPlayers.Clear();
clientSteamIds.Clear();
}
// Destroy persistent managers
if (lobbyManager != null)
{
helper.Log("Destroying LobbyManager.");
Destroy(lobbyManager.gameObject);
lobbyManager = null;
}
helper.Log("--- Multiplayer Session Cleanup Finished ---");
}
#region "SceneLoaded" #region "SceneLoaded"
private void SceneLoaded(KCModHelper helper) private void SceneLoaded(KCModHelper helper)
{ {
@@ -123,7 +163,7 @@ namespace KCM
KCMSteamManager = new GameObject("KCMSteamManager").AddComponent<KCMSteamManager>(); KCMSteamManager = new GameObject("KCMSteamManager").AddComponent<KCMSteamManager>();
DontDestroyOnLoad(KCMSteamManager); DontDestroyOnLoad(KCMSteamManager);
var lobbyManager = new GameObject("LobbyManager").AddComponent<LobbyManager>(); lobbyManager = new GameObject("LobbyManager").AddComponent<LobbyManager>();
DontDestroyOnLoad(lobbyManager); DontDestroyOnLoad(lobbyManager);
//SteamFriends.InviteUserToGame(new CSteamID(76561198036307537), "test"); //SteamFriends.InviteUserToGame(new CSteamID(76561198036307537), "test");

View File

@@ -21,12 +21,12 @@ namespace KCM.ServerLobby
public void Start() public void Start()
{ {
banner = transform.Find("PlayerBanner").GetComponent<RawImage>();
SetValues(); SetValues();
InvokeRepeating("SetValues", 0, 0.25f); InvokeRepeating("SetValues", 0, 0.25f);
banner = transform.Find("PlayerBanner").GetComponent<RawImage>();
transform.Find("PlayerBanner").GetComponent<Button>().onClick.AddListener(() => transform.Find("PlayerBanner").GetComponent<Button>().onClick.AddListener(() =>
{ {
Main.TransitionTo(MenuState.NameAndBanner);//ChooseBannerUI Hooks required, as well as townnameui Main.TransitionTo(MenuState.NameAndBanner);//ChooseBannerUI Hooks required, as well as townnameui

View File

@@ -1,4 +1,4 @@
using KCM.Packets; using KCM.Packets;
using KCM.Packets.State; using KCM.Packets.State;
using KCM.StateManagement.Observers; using KCM.StateManagement.Observers;
using System; using System;
@@ -6,12 +6,15 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using UnityEngine;
using static KCM.StateManagement.Observers.Observer; using static KCM.StateManagement.Observers.Observer;
namespace KCM.StateManagement.BuildingState namespace KCM.StateManagement.BuildingState
{ {
public class BuildingStateManager public class BuildingStateManager
{ {
private static readonly Dictionary<Guid, float> lastUpdateTime = new Dictionary<Guid, float>();
private const float UpdateInterval = 0.1f; // 10 times per second
public static void BuildingStateChanged(object sender, StateUpdateEventArgs args) public static void BuildingStateChanged(object sender, StateUpdateEventArgs args)
{ {
@@ -23,9 +26,29 @@ namespace KCM.StateManagement.BuildingState
try try
{ {
Observer observer = (Observer)sender; Observer observer = (Observer)sender;
Building building = (Building)observer.state; Building building = (Building)observer.state;
if (building == null)
{
if(observer != null)
{
UnityEngine.Object.Destroy(observer.gameObject);
}
return;
}
Guid guid = building.guid;
if (lastUpdateTime.ContainsKey(guid) && Time.time < lastUpdateTime[guid] + UpdateInterval)
{
return; // Not time to update yet
}
if (!lastUpdateTime.ContainsKey(guid))
lastUpdateTime.Add(guid, Time.time);
else
lastUpdateTime[guid] = Time.time;
//Main.helper.Log("Should send building network update for: " + building.UniqueName); //Main.helper.Log("Should send building network update for: " + building.UniqueName);
new BuildingStatePacket() new BuildingStatePacket()
@@ -57,4 +80,4 @@ namespace KCM.StateManagement.BuildingState
} }
} }
} }
} }