Ejemplo n.º 1
0
        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);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }