예제 #1
0
        private void UpdateTargetHUD(Character target)
        {
            // update health text
            if ((bool)CombatHUD.config.GetValue(Settings.EnemyHealth))
            {
                if (!m_targetHealthText.gameObject.activeSelf)
                {
                    m_targetHealthText.gameObject.SetActive(true);
                }
                m_targetHealthText.text = Math.Round(target.Stats.CurrentHealth) + " / " + Math.Round(target.Stats.ActiveMaxHealth);
                m_targetHealthText.rectTransform.position  = RectTransformUtility.WorldToScreenPoint(m_LinkedCharacter.CharacterCamera.CameraScript, target.UIBarPosition);
                m_targetHealthText.rectTransform.position += Vector3.up * CombatHUD.Rel(10f, true);
            }
            else if (m_targetHealthText.gameObject.activeSelf)
            {
                m_targetHealthText.gameObject.SetActive(false);
            }

            if ((bool)CombatHUD.config.GetValue(Settings.EnemyStatus))
            {
                if (!m_statusHolder.activeSelf)
                {
                    m_statusHolder.SetActive(true);
                }
                UpdateStatuses(target);
            }
            else if (m_statusHolder.activeSelf)
            {
                m_statusHolder.SetActive(false);
            }
        }
예제 #2
0
        private static bool IsScreenPosVisible(ref Vector3 screenPos, int splitID)
        {
            //var rect = HUDManager.Instance.HUDCanvas.GetComponent<RectTransform>().rect;

            float y1 = 0f;
            float y2 = 1080f;

            // x is always the same (1920)
            screenPos.x *= CombatHUD.Rel(1920f);

            if (SplitScreenManager.Instance.LocalPlayerCount == 1)
            {
                // single player height is 1080
                screenPos.y *= CombatHUD.Rel(1080f, true);
                return(screenPos.z > 0f && screenPos.x >= 0f && screenPos.x <= 1920f && screenPos.y >= y1 && screenPos.y <= y2);
            }
            else
            {
                // split height is 540
                screenPos.y *= CombatHUD.Rel(540f, true);

                if (splitID == 0)
                {
                    y1           = CombatHUD.Rel(540f, true);
                    screenPos.y += y1;
                    return(screenPos.z > 0f && screenPos.x >= 0f && screenPos.x <= CombatHUD.Rel(1920f) && screenPos.y >= y1 && screenPos.y <= y2);
                }
                else
                {
                    y2 = CombatHUD.Rel(540f, true);
                    return(screenPos.z > 0f && screenPos.x >= 0f && screenPos.x <= CombatHUD.Rel(1920f) && screenPos.y >= y1 && screenPos.y <= y2);
                }
            }
        }
예제 #3
0
        private void UpdateTarget()
        {
            var target = m_LinkedCharacter.TargetingSystem.LockedCharacter;

            if (target.UID != m_lastTargetUID)
            {
                m_lastTargetUID = target.UID;
                UpdateOnTargetChange();
            }

            if (CombatHUD.IsHudHidden(this.Split_ID))
            {
                DisableHolders();
            }
            else
            {
                UpdateTargetHUD(target);

                if ((bool)CombatHUD.config.GetValue(Settings.EnemyInfobox))
                {
                    UpdateInfobox(target);
                }

                EnableHolders();
            }
        }
예제 #4
0
        internal void Awake()
        {
            Instance = this;

            var harmony = new Harmony(GUID);

            harmony.PatchAll();

            HUDConfig.Init(Config);

            SL.OnPacksLoaded += Setup;

            Logger.LogMessage($"{NAME} started, version {VERSION}");
        }
예제 #5
0
        internal void Awake()
        {
            Instance = this;

            var harmony = new Harmony(GUID);

            harmony.PatchAll();

            config = SetupConfig();
            config.Register();

            SL.OnPacksLoaded += Setup;

            Debug.Log($"{NAME} started, version {VERSION}");
        }
예제 #6
0
        public static void AddDamageLabel(DamageList damageList, Vector3 hitPosition, Character target)
        {
            if (damageList.TotalDamage < (float)CombatHUD.config.GetValue(Settings.MinimumDamage))
            {
                return;
            }

            if (target.IsAI && !(bool)CombatHUD.config.GetValue(Settings.PlayerDamageLabels))
            {
                return;
            }

            if (!target.IsAI && !(bool)CombatHUD.config.GetValue(Settings.EnemyDamageLabels))
            {
                return;
            }

            Color damagecolor = Color.white;

            if (!(bool)CombatHUD.config.GetValue(Settings.DisableColors))
            {
                float highest = 0f;
                foreach (DamageType type in damageList.List)
                {
                    if (type.Damage > highest)
                    {
                        highest     = type.Damage;
                        damagecolor = GetDmgColor(type.Type);
                    }
                }
            }

            var x = CombatHUD.Rel(30f);
            var y = CombatHUD.Rel(15f, true);

            DamageLabel label = new DamageLabel
            {
                CreationTime = Time.time,
                TextColor    = damagecolor,
                Damage       = damageList.TotalDamage,
                HitWorldPos  = hitPosition,
                Target       = target,
                ranXpos      = UnityEngine.Random.Range(-x, x),
                ranYpos      = UnityEngine.Random.Range(-y, y)
            };

            ActiveLabels.Add(label);
        }
예제 #7
0
        internal void Awake()
        {
            Instance = this;

            try
            {
                var harmony = new Harmony(GUID);
                harmony.PatchAll();

                HUDConfig.Init(Config);

                SL.OnPacksLoaded += Setup;

                Logger.LogMessage($"{NAME} started, version {VERSION}");
            }
            catch (Exception e)
            {
                Logger.LogMessage("Exception setting up CombatHUD: " + e);
            }
        }
예제 #8
0
        private void UpdateOnTargetChange()
        {
            var target = m_LinkedCharacter.TargetingSystem.LockedCharacter;

            m_infoboxName.text = target.Name;

            // only update status immunities when we change targets.
            List <string> immunityTags = new List <string>();

            var statusNaturalImmunities = (TagSourceSelector[])At.GetField(target.Stats, "m_statusEffectsNaturalImmunity");

            foreach (var tagSelector in statusNaturalImmunities)
            {
                immunityTags.Add(tagSelector.Tag.TagName);
            }

            var statusImmunities = (Dictionary <Tag, List <string> >)At.GetField(target.Stats, "m_statusEffectsImmunity");

            foreach (var entry in statusImmunities)
            {
                if (entry.Value.Count > 0)
                {
                    immunityTags.Add(entry.Key.TagName);
                }
            }

            if (immunityTags.Count > 0)
            {
                m_infoboxNoImmuneText.gameObject.SetActive(false);
                float offset = 0f;
                var   pos    = m_infoboxNoImmuneText.rectTransform.position;

                if (immunityTags.Contains("Bleeding"))
                {
                    m_infoboxBleedingSprite.gameObject.SetActive(true);
                    m_infoboxBleedingSprite.rectTransform.position = new Vector3(pos.x, pos.y - 2f, 0);
                    offset += CombatHUD.Rel(22f);
                }
                else
                {
                    m_infoboxBleedingSprite.gameObject.SetActive(false);
                }
                if (immunityTags.Contains("Burning"))
                {
                    m_infoboxBurningSprite.gameObject.SetActive(true);
                    m_infoboxBurningSprite.rectTransform.position = new Vector3(pos.x + offset, pos.y - 2f, 0);
                    offset += CombatHUD.Rel(22f);
                }
                else
                {
                    m_infoboxBurningSprite.gameObject.SetActive(false);
                }
                if (immunityTags.Contains("Poison"))
                {
                    m_infoboxPoisonSprite.gameObject.SetActive(true);
                    m_infoboxPoisonSprite.rectTransform.position = new Vector3(pos.x + offset, pos.y - 2f, 0);
                }
                else
                {
                    m_infoboxPoisonSprite.gameObject.SetActive(false);
                }
            }
            else
            {
                m_infoboxNoImmuneText.gameObject.SetActive(true);

                m_infoboxBurningSprite.gameObject.SetActive(false);
                m_infoboxBleedingSprite.gameObject.SetActive(false);
                m_infoboxPoisonSprite.gameObject.SetActive(false);
            }
        }
예제 #9
0
        private void UpdateStatuses(Character target)
        {
            // update status icons
            float offset         = 0f;
            float offsetInterval = CombatHUD.Rel(30f, true);

            var barPos = RectTransformUtility.WorldToScreenPoint(m_LinkedCharacter.CharacterCamera.CameraScript, target.UIBarPosition);
            var pos    = barPos + new Vector2(CombatHUD.Rel(225f), 0);

            var statuses = target.StatusEffectMngr.Statuses;

            // Key: Status Identifier, float: Buildup / opacity
            var displayDict = new Dictionary <string, float>();

            foreach (var status in statuses)
            {
                if (!displayDict.ContainsKey(status.IdentifierName))
                {
                    displayDict.Add(status.IdentifierName, 100f);
                }
            }

            if ((bool)CombatHUD.config.GetValue(Settings.EnemyBuildup))
            {
                var buildupDict = (IDictionary)At.GetField(target.StatusEffectMngr, "m_statusBuildUp");
                foreach (string name in buildupDict.Keys)
                {
                    if (displayDict.ContainsKey(name) || buildupDict[name] == null)
                    {
                        continue;
                    }

                    if (s_buildupField == null)
                    {
                        s_buildupField = buildupDict[name].GetType().GetField("BuildUp");
                    }

                    float value = (float)s_buildupField.GetValue(buildupDict[name]);

                    if (value > 0 && value < 100)
                    {
                        displayDict.Add(name, value);
                    }
                }
            }

            for (int i = 0; i < m_statusHolder.transform.childCount; i++)
            {
                var holder = m_statusHolder.transform.GetChild(i);

                if (i >= displayDict.Count)
                {
                    if (holder.gameObject.activeSelf)
                    {
                        holder.gameObject.SetActive(false);
                    }
                }
                else
                {
                    var entry = displayDict.ElementAt(i);

                    if (!s_statusIcons.ContainsKey(entry.Key))
                    {
                        var status = ResourcesPrefabManager.Instance.GetStatusEffectPrefab(entry.Key);
                        if (!status)
                        {
                            s_statusIcons.Add(entry.Key, null);
                            continue;
                        }

                        var icon = status.OverrideIcon ?? status.StatusIcon;
                        s_statusIcons.Add(entry.Key, icon);
                    }

                    var sprite = s_statusIcons[entry.Key];
                    if (!sprite)
                    {
                        continue;
                    }

                    if (s_cachedImages == null)
                    {
                        s_cachedImages = new Image[m_statusHolder.transform.childCount];
                        for (int j = 0; j < m_statusHolder.transform.childCount; j++)
                        {
                            s_cachedImages[j] = m_statusHolder.transform.GetChild(j).Find("Image").GetComponent <Image>();
                        }
                    }

                    if (s_cachedImages[i].sprite != sprite)
                    {
                        s_cachedImages[i].sprite = sprite;
                    }

                    holder.position = new Vector3(pos.x, pos.y + offset);

                    var text = holder.Find("Text").GetComponent <Text>();

                    if (!holder.gameObject.activeSelf)
                    {
                        holder.gameObject.SetActive(true);
                    }

                    if (displayDict[entry.Key] >= 100f)
                    {
                        if ((bool)CombatHUD.config.GetValue(Settings.EnemyStatusTimers))
                        {
                            var status = statuses.Find(it => it.IdentifierName == entry.Key);

                            TimeSpan t = TimeSpan.FromSeconds(status.RemainingLifespan);
                            var      s = $"{t.Minutes}:{t.Seconds:00}";
                            text.text  = s;
                            text.color = Color.white;

                            if (!text.gameObject.activeSelf)
                            {
                                text.gameObject.SetActive(true);
                            }

                            offset -= offsetInterval;
                        }
                        else if (text.gameObject.activeSelf)
                        {
                            text.gameObject.SetActive(false);
                        }
                    }
                    else
                    {
                        var parentRect = holder.GetComponent <RectTransform>();
                        parentRect.position = new Vector3(pos.x, pos.y + offset);
                        offset -= offsetInterval;

                        var buildupTxt = holder.GetComponentInChildren <Text>();
                        buildupTxt.text  = Math.Round(displayDict[entry.Key]) + "%";
                        buildupTxt.color = new Color(1.0f, 0.5f, 0.5f, displayDict[entry.Key] * 0.01f + 0.25f);

                        if (!text.gameObject.activeSelf)
                        {
                            text.gameObject.SetActive(true);
                        }
                    }
                }
            }
        }
예제 #10
0
        private void UpdateStatuses(Character target)
        {
            // update status icons
            float offset         = 0f;
            float offsetInterval = CombatHUD.Rel(30f, true);

            var barPos = RectTransformUtility.WorldToScreenPoint(m_LinkedCharacter.CharacterCamera.CameraScript, target.UIBarPosition);
            var pos    = barPos + new Vector2(CombatHUD.Rel(225f), 0);

            for (int i = 0; i < m_StatusHolder.transform.childCount; i++)
            {
                var    obj        = m_StatusHolder.transform.GetChild(i).gameObject;
                string identifier = obj.name;
                var    status     = target.StatusEffectMngr.Statuses.Find(x => x.IdentifierName == identifier);

                if (!status)
                {
                    obj.SetActive(false);
                }
                else
                {
                    var parentRect = obj.GetComponent <RectTransform>();
                    parentRect.position = new Vector3(pos.x, pos.y + offset);

                    var text = parentRect.transform.Find("Text").GetComponent <Text>();

                    if ((bool)CombatHUD.config.GetValue(Settings.EnemyStatusTimers))
                    {
                        TimeSpan t = TimeSpan.FromSeconds(status.RemainingLifespan);
                        var      s = string.Format("{0}:{1}", t.Minutes, t.Seconds.ToString("00"));
                        text.text  = s;
                        text.color = Color.white;

                        if (!text.gameObject.activeSelf)
                        {
                            text.gameObject.SetActive(true);
                        }
                        if (!obj.activeSelf)
                        {
                            obj.SetActive(true);
                        }

                        offset -= offsetInterval;
                    }
                    else if (text.gameObject.activeSelf)
                    {
                        text.gameObject.SetActive(false);
                    }
                }
            }

            // buildups
            if ((bool)CombatHUD.config.GetValue(Settings.EnemyBuildup))
            {
                var         m_statusBuildup = At.GetValue(typeof(StatusEffectManager), target.StatusEffectMngr, "m_statusBuildUp") as IDictionary;
                IDictionary dict            = m_statusBuildup as IDictionary;
                FieldInfo   buildupField    = m_statusBuildup.GetType().GetGenericArguments()[1].GetField("BuildUp");

                foreach (string name in dict.Keys)
                {
                    //GameObject holder = null;
                    if (m_StatusHolder.transform.Find(name) is Transform t)
                    {
                        var holder = t.gameObject;
                        if (holder.activeSelf)
                        {
                            // status is already active (ie. its 100%)
                            continue;
                        }

                        float value = (float)buildupField.GetValue(dict[name]);

                        if (value > 0 && value < 100)
                        {
                            var parentRect = holder.GetComponent <RectTransform>();
                            parentRect.position = new Vector3(pos.x, pos.y + offset);
                            offset -= offsetInterval;

                            var text = holder.GetComponentInChildren <Text>();
                            text.text  = Math.Round(value) + "%";
                            text.color = new Color(1.0f, 0.5f, 0.5f, value * 0.01f + 0.25f);

                            if (!holder.activeSelf)
                            {
                                holder.SetActive(true);
                            }
                        }
                    }
                }
            }
        }
        internal void Update()
        {
            if (NetworkLevelLoader.Instance.IsGameplayLoading || NetworkLevelLoader.Instance.IsGameplayPaused)
            {
                if (!wasInMenu)
                {
                    for (int i = 0; i < m_labelHolders.Count; i++)
                    {
                        if (m_labelHolders[i].activeSelf)
                        {
                            m_labelHolders[i].SetActive(false);
                        }
                    }
                    wasInMenu = true;
                }

                return;
            }

            wasInMenu = false;

            List <StatusEffectInfo> statusInfos = new List <StatusEffectInfo>();

            for (int i = 0; i < SplitScreenManager.Instance.LocalPlayers.Count; i++)
            {
                var player = SplitScreenManager.Instance.LocalPlayers[i].AssignedCharacter;

                if (!player || CombatHUD.IsHudHidden(i))
                {
                    continue;
                }

                UpdateVitalText(player);

                if ((bool)CombatHUD.config.GetValue(Settings.PlayerStatusTimers))
                {
                    try
                    {
                        UpdatePlayerStatuses(i, ref statusInfos);
                    }
                    catch //(Exception e)
                    {
                        //Debug.LogError("Error updating statuses: " + e.Message);
                    }
                }
            }

            // update text holders
            for (int i = 0; i < m_labelHolders.Count; i++)
            {
                if (i >= statusInfos.Count || !(bool)CombatHUD.config.GetValue(Settings.PlayerStatusTimers))
                {
                    if (m_labelHolders[i].activeSelf)
                    {
                        m_labelHolders[i].SetActive(false);
                    }
                }
                else
                {
                    var text = m_labelHolders[i].GetComponent <Text>();

                    var iconRect  = statusInfos[i].LinkedIcon.RectTransform;
                    var posOffset = new Vector3(0, CombatHUD.Rel(25f, true), 0);
                    text.GetComponent <RectTransform>().position = iconRect.position + posOffset;

                    TimeSpan t = TimeSpan.FromSeconds(statusInfos[i].TimeRemaining);
                    text.text = t.Minutes + ":" + t.Seconds.ToString("00");

                    if (statusInfos[i].TimeRemaining < 15)
                    {
                        text.color = Color.red;
                    }
                    else
                    {
                        text.color = Color.white;
                    }
                    if (!m_labelHolders[i].activeSelf)
                    {
                        m_labelHolders[i].SetActive(true);
                    }
                }
            }
        }
예제 #12
0
        internal void Update()
        {
            //cleanup dead labels first
            var maxLifespan = (float)CombatHUD.config.GetValue(Settings.LabelLifespan);

            for (int z = 0; z < ActiveLabels.Count; z++)
            {
                if (Time.time - ActiveLabels[z].CreationTime > maxLifespan || !ActiveLabels[z].Target)
                {
                    ActiveLabels.RemoveAt(z);
                    z--;
                }
            }

            float ceiling = (float)CombatHUD.config.GetValue(Settings.DamageCeiling);
            int   minsize = (int)(float)CombatHUD.config.GetValue(Settings.MinFontSize);
            int   maxsize = (int)(float)CombatHUD.config.GetValue(Settings.MaxFontSize);

            if (maxsize < minsize)
            {
                maxsize = minsize;
            }

            var m_hideUI        = (bool)At.GetValue(typeof(Global), Global.Instance, "m_hideUI");
            var m_playerShowHUD = (bool[])At.GetValue(typeof(OptionManager), null, "m_playerShowHUD");

            for (int i = 0; i < SplitScreenManager.Instance.LocalPlayerCount; i++)
            {
                var player = SplitScreenManager.Instance.LocalPlayers[i];

                if (!player.AssignedCharacter)
                {
                    continue;
                }

                // dont show damage labels if player is in menu
                bool disable = false;
                if (m_hideUI || !m_playerShowHUD[i] || MenuManager.Instance.IsMapDisplayed ||
                    (player.AssignedCharacter.CharacterUI.GetCurrentMenu() is MenuPanel panel && panel.IsDisplayed))
                {
                    disable = true;
                }

                var camera = player.CameraScript;
                int offset = i * 30;

                for (int j = 0 + offset; j < LabelHolders.Count; j++)
                {
                    if (disable || j - offset >= ActiveLabels.Count)
                    {
                        if (LabelHolders[j].activeSelf)
                        {
                            LabelHolders[j].SetActive(false);
                        }
                    }
                    else
                    {
                        var labelInfo   = ActiveLabels[j - offset];
                        var labelHolder = LabelHolders[j];

                        var pos = (bool)CombatHUD.config.GetValue(Settings.LabelsStayAtHitPos) ? labelInfo.HitWorldPos : labelInfo.Target.CenterPosition;

                        float damageStrength = (float)((decimal)labelInfo.Damage / (decimal)ceiling); // set damage "strength"
                        float time           = Time.time - labelInfo.CreationTime;
                        var   timeOffset     = Mathf.Lerp(0.3f, 0.07f, damageStrength) * time;

                        var   screenPos = camera.WorldToViewportPoint(pos + new Vector3(0, timeOffset));
                        float distance  = Vector3.Distance(player.AssignedCharacter.transform.position, pos);

                        if (IsScreenPosVisible(ref screenPos, i) && distance < (float)CombatHUD.config.GetValue(Settings.MaxDistance))
                        {
                            screenPos += new Vector3
                                         (
                                CombatHUD.Rel(labelInfo.ranXpos),
                                CombatHUD.Rel(labelInfo.ranYpos, true)
                                         );

                            labelHolder.GetComponent <RectTransform>().position = screenPos;

                            var text = labelHolder.GetComponent <Text>();
                            text.text     = Math.Round(labelInfo.Damage).ToString();
                            text.fontSize = (int)Mathf.Lerp(minsize, maxsize, damageStrength);
                            text.color    = labelInfo.TextColor;

                            if (!LabelHolders[j].activeSelf)
                            {
                                LabelHolders[j].SetActive(true);
                            }
                        }
                        else if (LabelHolders[j].activeSelf)
                        {
                            LabelHolders[j].SetActive(false);
                        }
                    }
                }
            }
        }