From b05c3415f29f36e7ba2f023d1905f9543517abcf Mon Sep 17 00:00:00 2001 From: devbeni Date: Sun, 14 Dec 2025 13:09:32 +0100 Subject: [PATCH] =?UTF-8?q?codex=20tal=C3=A1n=20fix=C3=A1lta=20idk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LoadSaveOverrides/MultiplayerSaveContainer.cs | 10 +--- Main.cs | 19 +++--- Packets/Network/ServerHandshake.cs | 13 +++- ResourceStorageHelper.cs | 60 +++++++++++++++++++ 4 files changed, 83 insertions(+), 19 deletions(-) create mode 100644 ResourceStorageHelper.cs diff --git a/LoadSaveOverrides/MultiplayerSaveContainer.cs b/LoadSaveOverrides/MultiplayerSaveContainer.cs index 0731e9d..ff1c81b 100644 --- a/LoadSaveOverrides/MultiplayerSaveContainer.cs +++ b/LoadSaveOverrides/MultiplayerSaveContainer.cs @@ -1,5 +1,4 @@ using Assets.Code; -using Assets.Interface; using Riptide; using Riptide.Transports; using Steamworks; @@ -25,7 +24,6 @@ namespace KCM.LoadSaveOverrides Main.helper.Log($"Saving data for {Main.kCPlayers.Count} ({KCServer.server.ClientCount}) players."); - //this.PlayerSaveData = new PlayerSaveDataOverride().Pack(Player.inst); foreach (var player in Main.kCPlayers.Values) { Main.helper.Log($"Attempting to pack data for: " + player.name + $"({player.steamId})"); @@ -58,7 +56,6 @@ namespace KCM.LoadSaveOverrides public override object Unpack(object obj) { - //original Player reset was up here foreach (var kvp in players) { @@ -89,7 +86,6 @@ namespace KCM.LoadSaveOverrides this.TownNameSaveData.Unpack(TownNameUI.inst); - //TownNameUI.inst.townName = kingdomNames[Main.PlayerSteamID]; TownNameUI.inst.SetTownName(kingdomNames[Main.PlayerSteamID]); Main.helper.Log("Unpacking player data"); @@ -270,14 +266,14 @@ namespace KCM.LoadSaveOverrides if (building == null) continue; // Re-register resource storages - var storages = building.GetComponents(); + var storages = KCM.ResourceStorageHelper.GetStorages(building); foreach (var storage in storages) { - if (storage != null && !storage.IsPrivate()) + if (storage != null && !KCM.ResourceStorageHelper.IsPrivate(storage)) { try { - FreeResourceManager.inst.AddResourceStorage(storage); + KCM.ResourceStorageHelper.Register(storage); } catch (Exception e) { diff --git a/Main.cs b/Main.cs index 8e7db32..3053ea9 100644 --- a/Main.cs +++ b/Main.cs @@ -1,6 +1,5 @@ using Assets.Code; using Assets.Code.UI; -using Assets.Interface; using Harmony; using KCM.Enums; using KCM.LoadSaveOverrides; @@ -645,17 +644,17 @@ namespace KCM if (KCClient.client.IsConnected) { LogStep(true); - __instance.Buildings.Add(b); - IResourceStorage[] storages = b.GetComponents(); - LogStep(); - for (int i = 0; i < storages.Length; i++) + __instance.Buildings.Add(b); + Component[] storages = ResourceStorageHelper.GetStorages(b); + LogStep(); + for (int i = 0; i < storages.Length; i++) + { + bool flag = !ResourceStorageHelper.IsPrivate(storages[i]); + if (flag) { - bool flag = !storages[i].IsPrivate(); - if (flag) - { - FreeResourceManager.inst.AddResourceStorage(storages[i]); - } + ResourceStorageHelper.Register(storages[i]); } + } LogStep(); int landMass = b.LandMass(); Home res = b.GetComponent(); diff --git a/Packets/Network/ServerHandshake.cs b/Packets/Network/ServerHandshake.cs index a605357..8b6484d 100644 --- a/Packets/Network/ServerHandshake.cs +++ b/Packets/Network/ServerHandshake.cs @@ -33,12 +33,21 @@ namespace KCM.Packets.Network CloudSystem.inst.BaseFreq = 4.5f; Weather.inst.SetSeason(Weather.Season.Summer); - //inst = new KCClient(KCServer.IsRunning ? "Ryan" : "Orion"); KCClient.inst = new KCClient(SteamFriends.GetPersonaName()); Main.helper.Log("Sending client connected. Client ID is: " + clientId); - Main.kCPlayers.Add(Main.PlayerSteamID, new KCPlayer(KCClient.inst.Name, clientId, Main.PlayerSteamID)); + KCPlayer localPlayer; + if (!Main.kCPlayers.TryGetValue(Main.PlayerSteamID, out localPlayer)) + { + localPlayer = new KCPlayer(KCClient.inst.Name, clientId, Main.PlayerSteamID); + Main.kCPlayers.Add(Main.PlayerSteamID, localPlayer); + } + else + { + localPlayer.id = clientId; + localPlayer.name = KCClient.inst.Name; + } Player.inst.PlayerLandmassOwner.teamId = clientId * 10 + 2; diff --git a/ResourceStorageHelper.cs b/ResourceStorageHelper.cs new file mode 100644 index 0000000..5e5ca43 --- /dev/null +++ b/ResourceStorageHelper.cs @@ -0,0 +1,60 @@ +using System; +using System.Linq; +using System.Reflection; +using UnityEngine; + +namespace KCM +{ + internal static class ResourceStorageHelper + { + private static Type resourceStorageType; + private static MethodInfo getComponentsMethod; + private static MethodInfo isPrivateMethod; + private static MethodInfo addResourceStorageMethod; + + private static void EnsureInitialized() + { + if (resourceStorageType != null) + return; + + resourceStorageType = AppDomain.CurrentDomain + .GetAssemblies() + .Select(a => a.GetType("Assets.Interface.IResourceStorage", false)) + .FirstOrDefault(t => t != null); + + if (resourceStorageType == null) + return; + + getComponentsMethod = typeof(Component).GetMethod("GetComponents", new[] { typeof(Type) }); + isPrivateMethod = resourceStorageType.GetMethod("IsPrivate", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + addResourceStorageMethod = typeof(FreeResourceManager).GetMethod("AddResourceStorage", new[] { resourceStorageType }); + } + + public static Component[] GetStorages(Component owner) + { + EnsureInitialized(); + if (resourceStorageType == null || getComponentsMethod == null) + return Array.Empty(); + + return (Component[])getComponentsMethod.Invoke(owner, new object[] { resourceStorageType }); + } + + public static bool IsPrivate(Component storage) + { + EnsureInitialized(); + if (isPrivateMethod == null) + return true; + + return (bool)isPrivateMethod.Invoke(storage, null); + } + + public static void Register(Component storage) + { + EnsureInitialized(); + if (addResourceStorageMethod == null || FreeResourceManager.inst == null) + return; + + addResourceStorageMethod.Invoke(FreeResourceManager.inst, new object[] { storage }); + } + } +}