diff --git a/LoadSaveOverrides/MultiplayerSaveContainer.cs b/LoadSaveOverrides/MultiplayerSaveContainer.cs index 92aac8d..ea29ce2 100644 --- a/LoadSaveOverrides/MultiplayerSaveContainer.cs +++ b/LoadSaveOverrides/MultiplayerSaveContainer.cs @@ -25,7 +25,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) { try @@ -71,7 +70,7 @@ namespace KCM.LoadSaveOverrides this.FireManagerSaveData = new FireManager.FireManagerSaveData().Pack(FireManager.inst); this.DragonSpawnSaveData = new DragonSpawn.DragonSpawnSaveData().Pack(DragonSpawn.inst); this.UnitSystemSaveData = new UnitSystem.UnitSystemSaveData().Pack(UnitSystem.inst); - this.RaidSystemSaveData2 = new RaiderSystem.RaiderSystemSaveData2().Pack(RaiderSystem.inst); + this.RaidSystemSaveData2 = new RaiderSystem.RaiderSystemSaveData2().Pack(raiderSystem.inst); if (ShipSystem.inst != null) { @@ -103,10 +102,8 @@ namespace KCM.LoadSaveOverrides public override object Unpack(object obj) { - //original Player reset was up here foreach (var kvp in players) { - KCPlayer player; if (!Main.kCPlayers.TryGetValue(kvp.Key, out player)) @@ -121,7 +118,6 @@ namespace KCM.LoadSaveOverrides foreach (var player in Main.kCPlayers.Values) player.inst.Reset(); - AIBrainsContainer.inst.ClearAIs(); this.CameraSaveData.Unpack(Cam.inst); this.WorldSaveData.Unpack(World.inst); @@ -133,10 +129,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"); Player.PlayerSaveData clientPlayerData = null; @@ -150,10 +142,9 @@ namespace KCM.LoadSaveOverrides clientPlayerData = kvp.Value; } else - { // Maybe ?? + { Main.helper.Log("Loading player data: " + kvp.Key); - KCPlayer player; if (!Main.kCPlayers.TryGetValue(kvp.Key, out player)) @@ -166,52 +157,61 @@ namespace KCM.LoadSaveOverrides Player.inst = player.inst; Main.helper.Log($"Number of landmasses: {World.inst.NumLandMasses}"); - //Reset was here before unpack kvp.Value.Unpack(player.inst); Player.inst = oldPlayer; - player.banner = player.inst.PlayerLandmassOwner.bannerIdx; player.kingdomName = TownNameUI.inst.townName; } } - clientPlayerData.Unpack(Player.inst); // Unpack the current client player last so that loading of villagers works correctly. + clientPlayerData.Unpack(Player.inst); Main.helper.Log("unpacked player data"); Main.helper.Log("Setting banner and name"); var client = Main.kCPlayers[SteamUser.GetSteamID().ToString()]; - client.banner = Player.inst.PlayerLandmassOwner.bannerIdx; client.kingdomName = TownNameUI.inst.townName; Main.helper.Log("Finished unpacking player data"); - // Fix AI brains save/load system to restore villager AI state - bool flag2 = this.AIBrainsSaveData != null; - if (flag2) + Main.helper.Log("Unpacking AI brains"); + bool flag10 = this.AIBrainsSaveData != null; + if (flag10) { try { - Main.helper.Log("Unpacking AI brains before player data"); - // Use reflection to call UnpackPrePlayer if it exists - var aiSaveDataType = this.AIBrainsSaveData.GetType(); - var unpackPrePlayerMethod = aiSaveDataType.GetMethod("UnpackPrePlayer", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - if (unpackPrePlayerMethod != null) - { - unpackPrePlayerMethod.Invoke(this.AIBrainsSaveData, new object[] { AIBrainsContainer.inst }); - } - else - { - Main.helper.Log("UnpackPrePlayer method not found, skipping AI brains pre-unpack"); - } + this.AIBrainsSaveData.Unpack(AIBrainsContainer.inst); + Main.helper.Log("AI brains unpacked successfully"); } catch (Exception e) { - Main.helper.Log("Error unpacking AI brains pre-player: " + e.Message); + Main.helper.Log("Error unpacking AI brains: " + e.Message); + Main.helper.Log("Attempting to reinitialize AI systems"); + try + { + AIBrainsContainer.inst.ClearAIs(); + Main.helper.Log("AI systems reinitialized"); + } + catch (Exception ex) + { + Main.helper.Log("Failed to reinitialize AI systems: " + ex.Message); + } + } + } + else + { + Main.helper.Log("No AI brains save data found, initializing fresh AI"); + try + { + Main.helper.Log("Fresh AI initialization completed"); + } + catch (Exception e) + { + Main.helper.Log("Failed fresh AI initialization: " + e.Message); } } @@ -259,7 +259,7 @@ namespace KCM.LoadSaveOverrides bool flag8 = this.RaidSystemSaveData2 != null; if (flag8) { - this.RaidSystemSaveData2.Unpack(RaiderSystem.inst); + this.RaidSystemSaveData2.Unpack(raiderSystem.inst); } Main.helper.Log("Unpacking orders manager"); bool flag9 = this.OrdersManagerSaveData != null; @@ -271,77 +271,7 @@ namespace KCM.LoadSaveOverrides bool flag10 = this.AIBrainsSaveData != null; if (flag10) { - try - { - this.AIBrainsSaveData.Unpack(AIBrainsContainer.inst); - Main.helper.Log("AI brains unpacked successfully"); - } - catch (Exception e) - { - Main.helper.Log("Error unpacking AI brains: " + e.Message); - Main.helper.Log("Attempting to reinitialize AI systems"); - try - { - AIBrainsContainer.inst.ClearAIs(); - // Force villager system refresh instead of direct brain access - if (VillagerSystem.inst != null) - { - var villagerSystemType = typeof(VillagerSystem); - var refreshMethods = villagerSystemType.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) - .Where(m => m.Name.Contains("Refresh") || m.Name.Contains("Update") || m.Name.Contains("Restart")); - - foreach (var method in refreshMethods) - { - if (method.GetParameters().Length == 0) - { - try - { - method.Invoke(VillagerSystem.inst, null); - Main.helper.Log($"Called VillagerSystem.{method.Name} for AI reinit"); - } - catch { } - } - } - } - Main.helper.Log("AI systems reinitialized"); - } - catch (Exception ex) - { - Main.helper.Log("Failed to reinitialize AI systems: " + ex.Message); - } - } - } - else - { - Main.helper.Log("No AI brains save data found, initializing fresh AI"); - try - { - // Force villager system refresh for fresh initialization - if (VillagerSystem.inst != null) - { - var villagerSystemType = typeof(VillagerSystem); - var refreshMethods = villagerSystemType.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) - .Where(m => m.Name.Contains("Refresh") || m.Name.Contains("Update") || m.Name.Contains("Restart")); - - foreach (var method in refreshMethods) - { - if (method.GetParameters().Length == 0) - { - try - { - method.Invoke(VillagerSystem.inst, null); - Main.helper.Log($"Called VillagerSystem.{method.Name} for fresh AI"); - } - catch { } - } - } - } - Main.helper.Log("Fresh AI initialization completed"); - } - catch (Exception e) - { - Main.helper.Log("Failed fresh AI initialization: " + e.Message); - } + this.AIBrainsSaveData.Unpack(AIBrainsContainer.inst); } Main.helper.Log("Unpacking custom save data"); bool flag11 = this.CustomSaveData != null; @@ -365,7 +295,6 @@ namespace KCM.LoadSaveOverrides Main.helper.Log(e.ToString()); } - World.inst.UpscaleFeatures(); Player.inst.RefreshVisibility(true); for (int i = 0; i < Player.inst.Buildings.Count; i++) @@ -373,7 +302,6 @@ namespace KCM.LoadSaveOverrides Player.inst.Buildings.data[i].UpdateMaterialSelection(); } - // Increase loadTickDelay values to ensure proper initialization Type playerType = typeof(Player); FieldInfo loadTickDelayField = playerType.GetField("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic); if (loadTickDelayField != null) @@ -381,7 +309,6 @@ namespace KCM.LoadSaveOverrides loadTickDelayField.SetValue(Player.inst, 3); } - // UnitSystem.inst.loadTickDelay = 3; Type unitSystemType = typeof(UnitSystem); loadTickDelayField = unitSystemType.GetField("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic); if (loadTickDelayField != null) @@ -389,7 +316,6 @@ namespace KCM.LoadSaveOverrides loadTickDelayField.SetValue(UnitSystem.inst, 3); } - // JobSystem.inst.loadTickDelay = 3; Type jobSystemType = typeof(JobSystem); loadTickDelayField = jobSystemType.GetField("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic); if (loadTickDelayField != null) @@ -397,7 +323,6 @@ namespace KCM.LoadSaveOverrides loadTickDelayField.SetValue(JobSystem.inst, 3); } - // VillagerSystem.inst.loadTickDelay = 3; Type villagerSystemType = typeof(VillagerSystem); loadTickDelayField = villagerSystemType.GetField("loadTickDelay", BindingFlags.Instance | BindingFlags.NonPublic); if (loadTickDelayField != null) @@ -405,203 +330,10 @@ namespace KCM.LoadSaveOverrides loadTickDelayField.SetValue(VillagerSystem.inst, 3); } - // Force AI system restart after load - try - { - Main.helper.Log("Forcing AI system restart after load"); - - // Force villager system refresh instead of direct brain access - if (VillagerSystem.inst != null) - { - var villagerSystemType = typeof(VillagerSystem); - var refreshMethods = villagerSystemType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) - .Where(m => m.Name.Contains("Refresh") || m.Name.Contains("Rebuild") || m.Name.Contains("Update") || m.Name.Contains("Restart")); - - foreach (var method in refreshMethods) - { - if (method.GetParameters().Length == 0) - { - try - { - method.Invoke(VillagerSystem.inst, null); - Main.helper.Log($"Called VillagerSystem.{method.Name}()"); - } - catch { } - } - } - } - - // Force job system refresh - if (JobSystem.inst != null) - { - try - { - var jobSystemRefreshType = typeof(JobSystem); - var refreshMethods = jobSystemRefreshType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) - .Where(m => m.Name.Contains("Refresh") || m.Name.Contains("Rebuild") || m.Name.Contains("Update")); - - foreach (var method in refreshMethods) - { - if (method.GetParameters().Length == 0) - { - try - { - method.Invoke(JobSystem.inst, null); - Main.helper.Log($"Called JobSystem.{method.Name}()"); - } - catch { } - } - } - } - catch (Exception e) - { - Main.helper.Log($"Error refreshing job system: {e.Message}"); - } - } - - Main.helper.Log("AI system restart completed"); - } - catch (Exception e) - { - Main.helper.Log($"Error during AI system restart: {e.Message}"); - } - Main.helper.Log($"Setting kingdom name to: {kingdomNames[Main.PlayerSteamID]}"); TownNameUI.inst.SetTownName(kingdomNames[Main.PlayerSteamID]); - // Perform villager state resync after loading completes - try - { - Main.helper.Log("Starting villager state resync after load"); - - // Simple resync without async complications - Main.helper.Log("Performing villager resync"); - - // Force villager system refresh - if (VillagerSystem.inst != null) - { - try - { - var villagerSystemType = typeof(VillagerSystem); - var refreshMethods = villagerSystemType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) - .Where(m => m.Name.Contains("Refresh") || m.Name.Contains("Update") || m.Name.Contains("Restart")); - - foreach (var method in refreshMethods) - { - if (method.GetParameters().Length == 0) - { - try - { - method.Invoke(VillagerSystem.inst, null); - Main.helper.Log($"Called VillagerSystem.{method.Name}()"); - } - catch { } - } - } - } - catch (Exception e) - { - Main.helper.Log($"Error refreshing villager system: {e.Message}"); - } - } - - // Force job system refresh - if (JobSystem.inst != null) - { - try - { - var jobSystemRefreshType = typeof(JobSystem); - var refreshMethods = jobSystemRefreshType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) - .Where(m => m.Name.Contains("Refresh") || m.Name.Contains("Update") || m.Name.Contains("Restart")); - - foreach (var method in refreshMethods) - { - if (method.GetParameters().Length == 0) - { - try - { - method.Invoke(JobSystem.inst, null); - Main.helper.Log($"Called JobSystem.{method.Name}()"); - } - catch { } - } - } - } - catch (Exception e) - { - Main.helper.Log($"Error refreshing job system: {e.Message}"); - } - } - - Main.helper.Log("Villager state resync completed"); - } - catch (Exception e) - { - Main.helper.Log($"Error during villager resync: {e.Message}"); - } - - // Ensure villager is in correct system lists - if (v.workerJob != null && Player.inst != null) - { - if (!Player.inst.Workers.Contains(v)) - { - Player.inst.Workers.Add(v); - } - } - else if (v.workerJob == null && Player.inst != null) - { - if (!Player.inst.Homeless.Contains(v)) - { - Player.inst.Homeless.Add(v); - } - } - } - catch (Exception e) - { - Main.helper.Log($"Error resyncing villager {i}: {e.Message}"); - } - } - } - - // Force job system to re-evaluate all jobs - if (JobSystem.inst != null) - { - try - { - var jobSystemType = typeof(JobSystem); - var updateMethods = jobSystemType.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) - .Where(m => (m.Name.Contains("Update") || m.Name.Contains("Refresh")) && m.GetParameters().Length == 0); - - foreach (var method in updateMethods) - { - try - { - method.Invoke(JobSystem.inst, null); - Main.helper.Log($"Called JobSystem.{method.Name} for resync"); - } - catch { } - } - } - catch (Exception e) - { - Main.helper.Log($"Error updating job system: {e.Message}"); - } - } - - Main.helper.Log("Villager state resync completed"); - } - catch (Exception e) - { - Main.helper.Log($"Error in delayed villager resync: {e.Message}"); - } - }); - } - catch (Exception e) - { - Main.helper.Log($"Error starting villager resync: {e.Message}"); - } - return obj; } } -} +} \ No newline at end of file