diff --git a/Source/Client/Factions/FactionRepeater.cs b/Source/Client/Factions/FactionRepeater.cs index 7fd1a811..9d2aa709 100644 --- a/Source/Client/Factions/FactionRepeater.cs +++ b/Source/Client/Factions/FactionRepeater.cs @@ -16,7 +16,7 @@ public static bool Template(IDictionary factionIdToData, Action da { if (Multiplayer.Client == null || ignore) return true; - var spectatorId = Multiplayer.WorldComp.spectatorFaction.loadID; + var spectatorId = Multiplayer.WorldComp.spectatorFaction?.loadID; ignore = true; foreach (var (id, data) in factionIdToData) { diff --git a/Source/Client/MultiplayerAPIBridge.cs b/Source/Client/MultiplayerAPIBridge.cs index 9e1d39ed..cd65acae 100644 --- a/Source/Client/MultiplayerAPIBridge.cs +++ b/Source/Client/MultiplayerAPIBridge.cs @@ -5,6 +5,7 @@ using Multiplayer.API; using Multiplayer.Client; using Verse; +using Multiplayer.Client.Factions; using Multiplayer.Client.Patches; using RimWorld; @@ -199,5 +200,26 @@ public void SetThingFilterContext(ThingFilterContext context) { ThingFilterMarkers.DrawnThingFilter = context; } + + public bool IsMultifaction => Client.Multiplayer.GameComp.multifaction; + + public Faction SpectatorFaction => Client.Multiplayer.WorldComp.spectatorFaction; + + public void PushFaction(Map map, Faction faction) => FactionExtensions.PushFaction(map, faction); + + public void PopFaction(Map map = null) => FactionExtensions.PopFaction(map); + + public void RepeatForWorldFactions(Action action) + { + bool ignore = false; + FactionRepeater.Template(Client.Multiplayer.game?.worldComp.factionData, _ => action(), null, ref ignore); + } + + public void RepeatForMapFactions(Map map, Action action) + { + if (map == null) throw new ArgumentNullException(nameof(map)); + bool ignore = false; + FactionRepeater.Template(map.MpComp()?.factionData, _ => action(), map, ref ignore); + } } }