Ejemplo n.º 1
0
            static void Postfix(CombatHUDActorInfo __instance, bool?isSelected, ICombatant ___displayedCombatant, AbstractActor ___displayedActor, Mech ___displayedMech)
            {
                try
                {
                    if (__instance.EvasiveDisplay == null || ___displayedActor == null)
                    {
                        return;
                    }

                    Logger.Debug($"---");
                    Logger.Debug($"[CombatHUDActorInfo_RefreshEvasiveDisplay_POSTFIX] ___displayedActor: { ___displayedActor.DisplayName}");
                    Logger.Info($"[CombatHUDActorInfo_RefreshEvasiveDisplay_POSTFIX] ___displayedActor.JumpedLastRound: {___displayedActor.JumpedLastRound}");
                    Logger.Info($"[CombatHUDActorInfo_RefreshEvasiveDisplay_POSTFIX] ___displayedActor.HasMovedThisRound: {___displayedActor.HasMovedThisRound}");

                    int sustainableEvasion = ___displayedActor.GetSustainableEvasion();
                    Logger.Debug($"[CombatHUDActorInfo_RefreshEvasiveDisplay_POSTFIX] sustainableEvasion: {sustainableEvasion}");

                    bool willJumpOrHasJumped = ___displayedActor.JumpedLastRound;
                    Logger.Debug($"[CombatHUDActorInfo_RefreshEvasiveDisplay_POSTFIX] willJumpOrHasJumped: {willJumpOrHasJumped}");

                    bool isCurrentlySelected = (isSelected == null) ? (__instance.HUD.SelectedActor == ___displayedActor) : isSelected.Value;
                    Logger.Info($"[CombatHUDActorInfo_RefreshEvasiveDisplay_POSTFIX] isCurrentlySelected: {isCurrentlySelected}");

                    bool suppressCoilPips = isCurrentlySelected && !___displayedActor.HasMovedThisRound;
                    Logger.Debug($"[CombatHUDActorInfo_RefreshEvasiveDisplay_POSTFIX] suppressCoilPips: {suppressCoilPips}");



                    Utilities.ColorEvasivePips(__instance.EvasiveDisplay, willJumpOrHasJumped, sustainableEvasion, suppressCoilPips);
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
Ejemplo n.º 2
0
        public static void CombatHUDActorInfo_SubscribeToMessages_Postfix(CombatHUDActorInfo __instance)
        {
            // Unsubscribe immediately so we don't process messages
            MethodInfo onFloatieMI       = AccessTools.Method(typeof(CombatHUDActorInfo), "OnFloatie", new Type[] { typeof(MessageCenterMessage) }, null);
            Delegate   onFloatieDelegate = onFloatieMI.CreateDelegate(typeof(ReceiveMessageCenterMessage), __instance);

            Mod.Log.Info("Unsubscribing from CombatHUDActorInfo:OnFloatie messages.");
            __instance.Combat.MessageCenter.RemoveSubscriber(MessageCenterMessageType.FloatieMessage, (ReceiveMessageCenterMessage)onFloatieDelegate);
        }
            public static void Postfix(CombatHUDActorInfo __instance, MessageCenterMessage message, AbstractActor ___displayedActor)
            {
                Mod.Log.Trace?.Write("CHUDAI:OSC entered");

                StealthChangedMessage stealthChangedMessage = message as StealthChangedMessage;

                if (___displayedActor != null && stealthChangedMessage.affectedObjectGuid == ___displayedActor.GUID && __instance.StealthDisplay != null)
                {
                    VfxHelper.CalculateMimeticPips(__instance.StealthDisplay, ___displayedActor);
                }
            }
            public static void Postfix(CombatHUDActorInfo __instance, AbstractActor ___displayedActor)
            {
                Mod.Log.Trace?.Write("CHUDAI:RAI entered");

                if (___displayedActor == null || ModState.LastPlayerActorActivated == null)
                {
                    return;
                }

                if (__instance.StealthDisplay != null)
                {
                    VfxHelper.CalculateMimeticPips(__instance.StealthDisplay, ___displayedActor);
                }
            }
            public static void Postfix(CombatHUDActorInfo __instance, AbstractActor ___displayedActor,
                                       BattleTech.Building ___displayedBuilding, ICombatant ___displayedCombatant)
            {
                if (__instance == null || ___displayedActor == null)
                {
                    return;
                }

                try {
                    bool            isEnemyOrNeutral = false;
                    VisibilityLevel visibilityLevel  = VisibilityLevel.None;
                    if (___displayedCombatant != null)
                    {
                        if (___displayedCombatant.IsForcedVisible)
                        {
                            visibilityLevel = VisibilityLevel.LOSFull;
                        }
                        else if (___displayedBuilding != null)
                        {
                            visibilityLevel = __instance.Combat.LocalPlayerTeam.VisibilityToTarget(___displayedBuilding);
                        }
                        else if (___displayedActor != null)
                        {
                            if (__instance.Combat.HostilityMatrix.IsLocalPlayerFriendly(___displayedActor.team))
                            {
                                visibilityLevel = VisibilityLevel.LOSFull;
                            }
                            else
                            {
                                visibilityLevel  = __instance.Combat.LocalPlayerTeam.VisibilityToTarget(___displayedActor);
                                isEnemyOrNeutral = true;
                            }
                        }
                    }

                    Traverse setGOActiveMethod = Traverse.Create(__instance).Method("SetGOActive", new Type[] { typeof(MonoBehaviour), typeof(bool) });
                    // The actual method should handle allied and friendly units fine, so we can just change it for enemies
                    if (isEnemyOrNeutral && visibilityLevel >= VisibilityLevel.Blip0Minimum && ___displayedActor != null)
                    {
                        SensorScanType scanType      = SensorLockHelper.CalculateSharedLock(___displayedActor, ModState.LastPlayerActorActivated);
                        bool           hasVisualScan = VisualLockHelper.CanSpotTarget(ModState.LastPlayerActorActivated, ModState.LastPlayerActorActivated.CurrentPosition,
                                                                                      ___displayedActor, ___displayedActor.CurrentPosition, ___displayedActor.CurrentRotation, ___displayedActor.Combat.LOS);

                        Mod.Log.Debug?.Write($"Updating item visibility for enemy: {CombatantUtils.Label(___displayedActor)} to scanType: {scanType} and " +
                                             $"hasVisualScan: {hasVisualScan} from lastActivated: {CombatantUtils.Label(ModState.LastPlayerActorActivated)}");

                        // Values that are always displayed
                        setGOActiveMethod.GetValue(__instance.NameDisplay, true);
                        setGOActiveMethod.GetValue(__instance.PhaseDisplay, true);

                        if (scanType >= SensorScanType.StructAndWeaponID)
                        {
                            // Show unit summary
                            setGOActiveMethod.GetValue(__instance.DetailsDisplay, true);

                            // Show active state
                            setGOActiveMethod.GetValue(__instance.InspiredDisplay, false);

                            // Show armor and struct
                            setGOActiveMethod.GetValue(__instance.ArmorBar, true);
                            setGOActiveMethod.GetValue(__instance.StructureBar, true);

                            if (___displayedActor as Mech != null)
                            {
                                setGOActiveMethod.GetValue(__instance.StabilityDisplay, true);
                                setGOActiveMethod.GetValue(__instance.HeatDisplay, true);
                            }
                            else
                            {
                                setGOActiveMethod.GetValue(__instance.StabilityDisplay, false);
                                setGOActiveMethod.GetValue(__instance.HeatDisplay, false);
                            }
                        }
                        else if (scanType >= SensorScanType.ArmorAndWeaponType || hasVisualScan)
                        {
                            // Show unit summary
                            setGOActiveMethod.GetValue(__instance.DetailsDisplay, false);

                            // Show active state
                            setGOActiveMethod.GetValue(__instance.InspiredDisplay, false);

                            // Show armor and struct
                            setGOActiveMethod.GetValue(__instance.ArmorBar, true);
                            setGOActiveMethod.GetValue(__instance.StructureBar, true);

                            setGOActiveMethod.GetValue(__instance.StabilityDisplay, false);
                            setGOActiveMethod.GetValue(__instance.HeatDisplay, false);
                        }
                        else
                        {
                            // Hide unit summary
                            setGOActiveMethod.GetValue(__instance.DetailsDisplay, false);

                            // Hide active state
                            setGOActiveMethod.GetValue(__instance.InspiredDisplay, false);

                            // Hide armor and struct
                            setGOActiveMethod.GetValue(__instance.ArmorBar, false);
                            setGOActiveMethod.GetValue(__instance.StructureBar, false);

                            setGOActiveMethod.GetValue(__instance.StabilityDisplay, false);
                            setGOActiveMethod.GetValue(__instance.HeatDisplay, false);
                        }

                        // TODO: DEBUG TESTING
                        if (__instance.MarkDisplay != null)
                        {
                            setGOActiveMethod.GetValue(__instance.MarkDisplay, true);
                        }

                        CombatHUDStateStack stateStack = (CombatHUDStateStack)Traverse.Create(__instance).Property("StateStack").GetValue();
                        setGOActiveMethod.GetValue(stateStack, false);
                    }
                    else
                    {
                        if (__instance.MarkDisplay != null && ___displayedActor != null)
                        {
                            setGOActiveMethod.GetValue(__instance.MarkDisplay, ___displayedActor.IsMarked);
                        }
                    }
                } catch (Exception e) {
                    Mod.Log.Info?.Write($"Error updating item visibility! Error was: {e.Message}");
                }
            }