From 6bf74dda430962c2b4f4fdc3afb211fd30428fbf Mon Sep 17 00:00:00 2001 From: devbeni Date: Sat, 13 Dec 2025 19:29:33 +0100 Subject: [PATCH] kisebb fixek elv. --- LoadSaveOverrides/MultiplayerSaveContainer.cs | 20 +++++- Main.cs | 65 +++++++++++++++---- 2 files changed, 72 insertions(+), 13 deletions(-) diff --git a/LoadSaveOverrides/MultiplayerSaveContainer.cs b/LoadSaveOverrides/MultiplayerSaveContainer.cs index 3c821d3..1c85a5c 100644 --- a/LoadSaveOverrides/MultiplayerSaveContainer.cs +++ b/LoadSaveOverrides/MultiplayerSaveContainer.cs @@ -71,7 +71,25 @@ namespace KCM.LoadSaveOverrides 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.ShipSystemSaveData = new ShipSystem.ShipSystemSaveData().Pack(ShipSystem.inst); + + if (ShipSystem.inst != null) + { + try + { + this.ShipSystemSaveData = new ShipSystem.ShipSystemSaveData().Pack(ShipSystem.inst); + } + catch (Exception ex) + { + Main.helper.Log("Error packing ShipSystem for save; skipping ShipSystemSaveData."); + Main.helper.Log(ex.ToString()); + this.ShipSystemSaveData = null; + } + } + else + { + this.ShipSystemSaveData = null; + } + this.AIBrainsSaveData = new AIBrainsContainer.SaveData().Pack(AIBrainsContainer.inst); this.SiegeMonsterSaveData = new SiegeMonster.SiegeMonsterSaveData().Pack(null); this.CartSystemSaveData = new CartSystem.CartSystemSaveData().Pack(CartSystem.inst); diff --git a/Main.cs b/Main.cs index 3652e09..7bbd423 100644 --- a/Main.cs +++ b/Main.cs @@ -1597,6 +1597,12 @@ namespace KCM if (KCClient.client.IsConnected) { var bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic; + var landmassOwner = p.PlayerLandmassOwner; + if (landmassOwner == null) + { + Main.helper.Log("PlayerLandmassOwner was null during PlayerSaveData.Pack; using vanilla save pack."); + return true; + } Main.helper.Log("Running patched player pack method"); Main.helper.Log("Saving banner system"); @@ -1608,8 +1614,8 @@ namespace KCM __instance.GetType().GetField("upgrades", bindingFlags).SetValue(__instance, new List()); - Main.helper.Log("Saving player bannerIdx"); - __instance.bannerIdx = p.PlayerLandmassOwner.bannerIdx; + Main.helper.Log("Saving player bannerIdx"); + __instance.bannerIdx = landmassOwner.bannerIdx; Main.helper.Log("Saving player WorkersArray"); __instance.WorkersArray = new Villager.VillagerSaveData[p.Workers.Count]; @@ -1622,11 +1628,13 @@ namespace KCM } } - Main.helper.Log("Saving player HomelessData"); + Main.helper.Log("Saving player HomelessData"); __instance.HomelessData = new List(); for (int k = 0; k < p.Homeless.Count; k++) { - __instance.HomelessData.Add(p.Homeless.data[k].guid); + var homeless = p.Homeless.data[k]; + if (homeless != null) + __instance.HomelessData.Add(homeless.guid); } __instance.structures = new List(); __instance.subStructures = new List(); @@ -1634,17 +1642,35 @@ namespace KCM Main.helper.Log("Saving player structures"); World.inst.ForEachTile(0, 0, World.inst.GridWidth, World.inst.GridHeight, delegate (int x, int z, Cell cell) { - bool flag4 = cell.OccupyingStructure.Count > 0; + if (cell == null) + return; + + bool flag4 = cell.OccupyingStructure != null && cell.OccupyingStructure.Count > 0; if (flag4) { List occupyingStructureData = new List(); for (int i3 = 0; i3 < cell.OccupyingStructure.Count; i3++) { var building = cell.OccupyingStructure[i3]; - bool flag5 = Vector3.Distance(cell.OccupyingStructure[i3].transform.position.xz(), cell.Position.xz()) <= 1E-05f; - if (flag5 && building.TeamID() == p.PlayerLandmassOwner.teamId) + if (building == null) + continue; + + var buildingTransform = building.transform; + if (buildingTransform == null) + continue; + + bool flag5 = Vector3.Distance(buildingTransform.position.xz(), cell.Position.xz()) <= 1E-05f; + if (flag5 && building.TeamID() == landmassOwner.teamId) { - occupyingStructureData.Add(new Building.BuildingSaveData().Pack(cell.OccupyingStructure[i3])); + try + { + occupyingStructureData.Add(new Building.BuildingSaveData().Pack(building)); + } + catch (Exception ex) + { + Main.helper.Log("Error packing structure for save: " + (building.UniqueName ?? string.Empty)); + Main.helper.Log(ex.ToString()); + } } } bool flag6 = occupyingStructureData.Count > 0; @@ -1653,17 +1679,32 @@ namespace KCM __instance.structures.Add(occupyingStructureData.ToArray()); } } - bool flag7 = cell.SubStructure.Count > 0; + bool flag7 = cell.SubStructure != null && cell.SubStructure.Count > 0; if (flag7) { List subStructureData = new List(); for (int i4 = 0; i4 < cell.SubStructure.Count; i4++) { var building = cell.SubStructure[i4]; - bool flag8 = Vector3.Distance(cell.SubStructure[i4].transform.position.xz(), cell.Position.xz()) <= 1E-05f; - if (flag8 && building.TeamID() == p.PlayerLandmassOwner.teamId) + if (building == null) + continue; + + var buildingTransform = building.transform; + if (buildingTransform == null) + continue; + + bool flag8 = Vector3.Distance(buildingTransform.position.xz(), cell.Position.xz()) <= 1E-05f; + if (flag8 && building.TeamID() == landmassOwner.teamId) { - subStructureData.Add(new Building.BuildingSaveData().Pack(cell.SubStructure[i4])); + try + { + subStructureData.Add(new Building.BuildingSaveData().Pack(building)); + } + catch (Exception ex) + { + Main.helper.Log("Error packing sub-structure for save: " + (building.UniqueName ?? string.Empty)); + Main.helper.Log(ex.ToString()); + } } } bool flag9 = subStructureData.Count > 0;