public static void Postfix(CombatHUDTargetingComputer __instance, List <LocalizableText> ___weaponNames, UIManager ___uiManager) { // Skip processing if we're not initialized properly if (__instance == null || __instance?.ActivelyShownCombatant?.Combat == null || __instance.WeaponList == null) { return; } if (__instance.ActivelyShownCombatant is BattleTech.Building building && ModState.AmbushBuildingGUIDToTurrets.ContainsKey(building.GUID)) { Mod.Log.Trace?.Write($"TargetingHUD target {CombatantUtils.Label(__instance.ActivelyShownCombatant)} is trapped enemy building"); // Replicate RefreshWeaponList here as it expects an AbstractActor Turret turret = ModState.AmbushBuildingGUIDToTurrets[building.GUID]; for (int i = 0; i < ___weaponNames.Count; i++) { if (turret != null && i < turret.Weapons.Count) { Weapon weapon = turret.Weapons[i]; ___weaponNames[i].SetText(weapon.UIName); if (!weapon.HasAmmo) { ___weaponNames[i].color = ___uiManager.UIColorRefs.qualityD; } else { switch (weapon.DamageLevel) { case ComponentDamageLevel.Functional: ___weaponNames[i].color = ___uiManager.UIColorRefs.qualityA; break; case ComponentDamageLevel.Misaligned: case ComponentDamageLevel.Penalized: ___weaponNames[i].color = ___uiManager.UIColorRefs.structureUndamaged; break; case ComponentDamageLevel.NonFunctional: case ComponentDamageLevel.Destroyed: ___weaponNames[i].color = ___uiManager.UIColorRefs.qualityD; break; } } if (!___weaponNames[i].transform.parent.gameObject.activeSelf) { ___weaponNames[i].transform.parent.gameObject.SetActive(true); } } else if (___weaponNames[i].transform.parent.gameObject.activeSelf) { ___weaponNames[i].transform.parent.gameObject.SetActive(false); } } __instance.WeaponList.SetActive(true); Transform weaponListT = __instance.WeaponList?.transform?.parent?.Find("tgtWeaponsLabel"); GameObject weaponsLabel = weaponListT.gameObject; weaponsLabel.SetActive(true); } }
public static void Postfix(CombatHUDTargetingComputer __instance) { try { if (__instance.ActivelyShownCombatant != null && __instance.ActivelyShownCombatant is Mech mech) { Logger.Debug($"[CombatHUDTargetingComputer_RefreshActorInfo_POSTFIX] ({mech.DisplayName}) mech.MechDef.MechTags: {String.Join(", ", mech.MechDef.MechTags.ToArray())}"); } } catch (Exception e) { Logger.Error(e); } }
public static void Postfix(CombatHUDTargetingComputer __instance, MessageCenterMessage message, CombatHUD ___HUD) { // LowVisibility.Logger.Debug("CombatHUDTargetingComputer:OnActorHovered:post - entered."); if (__instance != null) { EncounterObjectMessage encounterObjectMessage = message as EncounterObjectMessage; ICombatant combatant = ___HUD.Combat.FindCombatantByGUID(encounterObjectMessage.affectedObjectGuid); if (combatant != null) { AbstractActor abstractActor = combatant as AbstractActor; if (combatant.team != ___HUD.Combat.LocalPlayerTeam && (abstractActor == null || ___HUD.Combat.LocalPlayerTeam.VisibilityToTarget(abstractActor) >= VisibilityLevel.Blip0Minimum)) { Traverse.Create(__instance).Property("HoveredCombatant").SetValue(combatant); } } } }
private static void SetArmorDisplayActive(CombatHUDTargetingComputer __instance, bool active) { if (__instance.ActivelyShownCombatant is Mech mech) { __instance.MechArmorDisplay.gameObject.SetActive(active); } else if (__instance.ActivelyShownCombatant is Vehicle vehicle) { __instance.VehicleArmorDisplay.gameObject.SetActive(active); } else if (__instance.ActivelyShownCombatant is Turret turret) { __instance.TurretArmorDisplay.gameObject.SetActive(active); } else if (__instance.ActivelyShownCombatant is BattleTech.Building building) { __instance.BuildingArmorDisplay.gameObject.SetActive(active); } }
// TODO: Dangerous PREFIX false here! public static bool Prefix(CombatHUDTargetingComputer __instance, CombatHUD ___HUD) { //Mod.Log.Trace?.Write("CHUDTC:U:pre - entered."); CombatGameState Combat = ___HUD?.Combat; UIModule_Update(__instance); if (__instance.ActorInfo != null) { __instance.ActorInfo.DisplayedCombatant = __instance.ActivelyShownCombatant; } if (__instance.ActivelyShownCombatant == null || (__instance.ActivelyShownCombatant.team != Combat.LocalPlayerTeam && !Combat.HostilityMatrix.IsFriendly(__instance.ActivelyShownCombatant.team.GUID, Combat.LocalPlayerTeamGuid) && Combat.LocalPlayerTeam.VisibilityToTarget(__instance.ActivelyShownCombatant) < VisibilityLevel.Blip0Minimum) ) { if (__instance.Visible) { __instance.Visible = false; } } else { if (!__instance.Visible) { __instance.Visible = true; } if (__instance.ActivelyShownCombatant != null) { Traverse method = Traverse.Create(__instance).Method("UpdateStructureAndArmor", new Type[] { }); method.GetValue(); } } return(false); }
public static void EnhanceWeaponLoadout(CombatHUDTargetingComputer __instance, List <TMPro.TextMeshProUGUI> ___weaponNames, UIManager ___uiManager) { try { UIColorRefs colours = ___uiManager.UIColorRefs; AbstractActor actor = __instance.ActivelyShownCombatant as AbstractActor; List <Weapon> weapons = actor?.Weapons; if (actor == null || weapons == null || colours == null) { return; } if (ByType == null) { ByType = LerpWeaponColours(colours); DisableLoadoutLineWrap(___weaponNames); } float close = 0, medium = 0, far = 0; for (int i = Math.Min(___weaponNames.Count, weapons.Count) - 1; i >= 0; i--) { Weapon w = weapons[i]; if (w == null || !w.CanFire) { continue; } float damage = w.DamagePerShot * w.ShotsWhenFired; if (Settings.ShowDamageInLoadout) { ___weaponNames[i].text = ___weaponNames[i].text.Replace(" +", "+") + MetaColour + " (" + damage + ")"; } if (ByType.Length > 0 && ___weaponNames[i].color == colours.qualityA) { if ((int)w.Category < ByType.Length) { ___weaponNames[i].color = ByType[(int)w.Category]; } } if (w.MaxRange <= 90) { close += damage; } else if (w.MaxRange <= 360) { medium += damage; } else { far += damage; } } if (Settings.ShowAlphaDamageInLoadout != null && HasDamageLabel(colours.white)) { loadout.text = string.Format(Settings.ShowAlphaDamageInLoadout, close + medium + far, close, medium, far, medium + far); } if (Settings.ShowMeleeDamageInLoadout && actor is Mech mech) { int start = weapons.Count, dmg = (int)(mech.MeleeWeapon?.DamagePerShot * mech.MeleeWeapon?.ShotsWhenFired); string format = Settings.ShowDamageInLoadout ? "{0} {1}({2})" : "{0} {1}{2}"; if (start < ___weaponNames.Count && dmg > 0) { SetWeapon(___weaponNames[start], colours.white, format, Translate("Melee"), MetaColour, dmg); } dmg = (int)(mech.DFAWeapon?.DamagePerShot * mech.DFAWeapon?.ShotsWhenFired); if (actor.WorkingJumpjets > 0 && start + 1 < ___weaponNames.Count && dmg > 0) { SetWeapon(___weaponNames[start + 1], colours.white, format, Translate("DFA"), MetaColour, dmg); } } } catch (Exception ex) { Error(ex); } }
public static void Postfix(CombatHUDTargetingComputer __instance, List <TextMeshProUGUI> ___weaponNames) { if (__instance == null || __instance.ActivelyShownCombatant == null || __instance.ActivelyShownCombatant.Combat == null || __instance.ActivelyShownCombatant.Combat.HostilityMatrix == null || __instance.WeaponList == null) { Mod.Log.Debug?.Write($"CHTC:RAI ~~~ TC, target, or WeaponList is null, skipping."); return; } if (ModState.LastPlayerActorActivated == null) { Mod.Log.Error?.Write("Attempting to refresh ActorInfo, but LastPlayerActorActivated is null. This should never happen!"); } if (__instance.ActivelyShownCombatant.Combat.HostilityMatrix.IsLocalPlayerFriendly(__instance.ActivelyShownCombatant.team.GUID)) { Mod.Log.Debug?.Write($"CHTC:RAI ~~~ target:{CombatantUtils.Label(__instance.ActivelyShownCombatant)} friendly, resetting."); __instance.WeaponList.SetActive(true); return; } // Only enemies or neutrals below this point Mod.Log.Debug?.Write($"CHTC:RAI ~~~ target:{CombatantUtils.Label(__instance.ActivelyShownCombatant)} is enemy"); try { if (__instance.ActivelyShownCombatant is AbstractActor target) { float range = Vector3.Distance(ModState.LastPlayerActorActivated.CurrentPosition, target.CurrentPosition); bool hasVisualScan = VisualLockHelper.CanSpotTarget(ModState.LastPlayerActorActivated, ModState.LastPlayerActorActivated.CurrentPosition, target, target.CurrentPosition, target.CurrentRotation, target.Combat.LOS); SensorScanType scanType = SensorLockHelper.CalculateSharedLock(target, ModState.LastPlayerActorActivated); Mod.Log.Debug?.Write($"CHTC:RAI ~~~ LastActivated:{CombatantUtils.Label(ModState.LastPlayerActorActivated)} vs. enemy:{CombatantUtils.Label(target)} " + $"at range: {range} has scanType:{scanType} visualScan:{hasVisualScan}"); // Build the CAC side-panel try { BuildCACDialogForTarget(ModState.LastPlayerActorActivated, __instance.ActivelyShownCombatant, range, hasVisualScan, scanType); } catch (Exception e) { Mod.Log.Error?.Write(e, $"Failed to initialize CAC SidePanel for source: {CombatantUtils.Label(ModState.LastPlayerActorActivated)} and " + $"target: {CombatantUtils.Label(__instance.ActivelyShownCombatant)}!"); } if (scanType >= SensorScanType.StructAndWeaponID) { __instance.WeaponList.SetActive(true); SetArmorDisplayActive(__instance, true); } else if (scanType >= SensorScanType.ArmorAndWeaponType || hasVisualScan) { SetArmorDisplayActive(__instance, true); ObfuscateWeaponLabels(___weaponNames, target); // Update the summary display __instance.WeaponList.SetActive(true); Transform weaponListT = __instance.WeaponList?.transform?.parent?.Find("tgtWeaponsLabel"); GameObject weaponsLabel = weaponListT.gameObject; TextMeshProUGUI labelText = weaponsLabel.GetComponent <TextMeshProUGUI>(); labelText.SetText(new Text(Mod.LocalizedText.TargetingComputer[ModText.LT_TARG_COMP_UNIDENTIFIED]).ToString()); } else { SetArmorDisplayActive(__instance, false); __instance.WeaponList.SetActive(false); Transform weaponListT = __instance.WeaponList?.transform?.parent?.Find("tgtWeaponsLabel"); GameObject weaponsLabel = weaponListT.gameObject; weaponsLabel.SetActive(false); } } else if (__instance.ActivelyShownCombatant is BattleTech.Building building) { Mod.Log.Debug?.Write($"CHTC:RAI ~~~ target:{CombatantUtils.Label(__instance.ActivelyShownCombatant)} is enemy building"); SetArmorDisplayActive(__instance, true); __instance.WeaponList.SetActive(false); Transform weaponListT = __instance.WeaponList?.transform?.parent?.Find("tgtWeaponsLabel"); GameObject weaponsLabel = weaponListT.gameObject; weaponsLabel.SetActive(false); } else { // WTF } } catch (Exception e) { Mod.Log.Error?.Write(e, "Failed to RefreshActorInfo!"); } }