From 6be1ccc16fc15b01b3a85de04ba78a00df55622f Mon Sep 17 00:00:00 2001 From: Sakura-TA Date: Tue, 24 Mar 2026 11:40:58 +0800 Subject: [PATCH 1/2] fix AreaSource using faction-based data --- Source/Client/Comp/Map/MultiplayerMapComp.cs | 18 +++++++++- Source/Client/Patches/AreaSource.cs | 36 ++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 Source/Client/Patches/AreaSource.cs diff --git a/Source/Client/Comp/Map/MultiplayerMapComp.cs b/Source/Client/Comp/Map/MultiplayerMapComp.cs index 16e4ad956..cee878d7a 100644 --- a/Source/Client/Comp/Map/MultiplayerMapComp.cs +++ b/Source/Client/Comp/Map/MultiplayerMapComp.cs @@ -220,8 +220,23 @@ public int GetFactionId(ZoneManager zoneManager) { return factionData.First(kv => kv.Value.zoneManager == zoneManager).Key; } + public AreaManager AllAreaManager() + { + AreaManager areaManager = new AreaManager(this.map); + + foreach (var data in factionData) + { + foreach (var area in data.Value.areaManager.AllAreas) + { + areaManager.areas.Add(area); + } + } + return areaManager; + } } + + [HarmonyPatch(typeof(MapDrawer), nameof(MapDrawer.DrawMapMesh))] static class ForceShowDialogs { @@ -235,7 +250,8 @@ static void Prefix(MapDrawer __instance) { var newDialog = comp.mapDialogs.First().Dialog; //If NO mapdialogs (Dialog_NodeTrees) are open, add the first one to the window stack - if (!Find.WindowStack.IsOpen(typeof(Dialog_NodeTree)) && !Find.WindowStack.IsOpen(newDialog.GetType())) { + if (!Find.WindowStack.IsOpen(typeof(Dialog_NodeTree)) && !Find.WindowStack.IsOpen(newDialog.GetType())) + { Find.WindowStack.Add(newDialog); } } diff --git a/Source/Client/Patches/AreaSource.cs b/Source/Client/Patches/AreaSource.cs new file mode 100644 index 000000000..9f5935d02 --- /dev/null +++ b/Source/Client/Patches/AreaSource.cs @@ -0,0 +1,36 @@ +using HarmonyLib; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Multiplayer.Client.Patches +{ + [HarmonyPatch(typeof(AreaSource))] + static class AreaSource_Patch + { + static AreaManager old_manager; + + [HarmonyPatch(nameof(AreaSource.ComputeAll))] + [HarmonyPatch(nameof(AreaSource.UpdateIncrementally))] + static void Prefix(AreaSource __instance) + { + if (Multiplayer.Client == null || !Multiplayer.GameComp.multifaction) return; + old_manager = __instance.map.areaManager; + __instance.map.areaManager = __instance.map.MpComp().AllAreaManager(); + } + + [HarmonyPatch(nameof(AreaSource.ComputeAll))] + [HarmonyPatch(nameof(AreaSource.UpdateIncrementally))] + static void Finalizer(AreaSource __instance) + { + if (Multiplayer.Client == null || !Multiplayer.GameComp.multifaction) return; + + // restore original + __instance.map.areaManager = old_manager; + old_manager = null; + } + } +} From a09b9006c76052bb95b31f8d29e4a772d2ef9c0a Mon Sep 17 00:00:00 2001 From: Sakura-TA Date: Wed, 25 Mar 2026 03:22:24 +0800 Subject: [PATCH 2/2] using __state instead of local variable --- Source/Client/Patches/AreaSource.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Source/Client/Patches/AreaSource.cs b/Source/Client/Patches/AreaSource.cs index 9f5935d02..3644e5986 100644 --- a/Source/Client/Patches/AreaSource.cs +++ b/Source/Client/Patches/AreaSource.cs @@ -11,26 +11,23 @@ namespace Multiplayer.Client.Patches [HarmonyPatch(typeof(AreaSource))] static class AreaSource_Patch { - static AreaManager old_manager; - [HarmonyPatch(nameof(AreaSource.ComputeAll))] [HarmonyPatch(nameof(AreaSource.UpdateIncrementally))] - static void Prefix(AreaSource __instance) + static void Prefix(AreaSource __instance, ref AreaManager __state) { if (Multiplayer.Client == null || !Multiplayer.GameComp.multifaction) return; - old_manager = __instance.map.areaManager; + __state = __instance.map.areaManager; __instance.map.areaManager = __instance.map.MpComp().AllAreaManager(); } [HarmonyPatch(nameof(AreaSource.ComputeAll))] [HarmonyPatch(nameof(AreaSource.UpdateIncrementally))] - static void Finalizer(AreaSource __instance) + static void Finalizer(AreaSource __instance, AreaManager __state) { if (Multiplayer.Client == null || !Multiplayer.GameComp.multifaction) return; // restore original - __instance.map.areaManager = old_manager; - old_manager = null; + __instance.map.areaManager = __state; } } }