public static void RedrawFogOfWar(AbstractActor activeActor) { if (!Mod.Config.FogOfWar.RedrawFogOfWarOnActivation) { return; } FogOfWarSystem fowSystem = LazySingletonBehavior <FogOfWarView> .Instance.FowSystem; if (fowSystem == null) { Mod.Log.Error?.Write("FogOfWarSystem could not be found - this should never happen!"); return; } Mod.Log.Debug?.Write($"Redrawing FOW for actor: {CombatantUtils.Label(activeActor)}"); Traverse viewersT = Traverse.Create(fowSystem).Field("viewers"); List <AbstractActor> viewers = viewersT.GetValue <List <AbstractActor> >(); viewers.Clear(); // Reset FoW to being unseen fowSystem.WipeToValue(Mod.Config.FogOfWar.ShowTerrainThroughFogOfWar ? FogOfWarState.Surveyed : FogOfWarState.Unknown); // Add the actor as a viewer fowSystem.AddViewer(activeActor); // Check lancemates; if they have vision sharing add them as well foreach (string lanceGuid in activeActor?.lance?.unitGuids) { if (!lanceGuid.Equals(activeActor.GUID)) { ICombatant lanceMateC = activeActor.Combat.FindCombatantByGUID(lanceGuid); if (lanceMateC is AbstractActor lanceActor) { EWState lanceState = new EWState(lanceActor); if (lanceState.SharesVision()) { fowSystem.AddViewer(lanceActor); } } } } }
public static bool Prefix(FogOfWarSystem __instance, AbstractActor unit, List <AbstractActor> ___viewers) { if (__instance == null || unit == null) { return(true); } if (unit.IsDead || !__instance.Combat.HostilityMatrix.IsLocalPlayerFriendly(unit.team)) { // Skip processing if the unit is an enemy or dead return(false); } else if (__instance.Combat.HostilityMatrix.IsLocalPlayerFriendly(unit.team) && !___viewers.Contains(unit)) { __instance.AddViewer(unit); } return(true); }