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);
            }
        }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
        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);
                    }
                }
            }
        }
Beispiel #4
0
 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);
     }
 }
Beispiel #5
0
        // 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);
        }
Beispiel #6
0
        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); }
        }
Beispiel #7
0
        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!");
            }
        }