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); } }
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}"); } }