Exemple #1
0
        public override void Tick(float dT)
        {
            // 每秒变化 (仇恨消失) (每秒回血回蓝) (Status)
            m_secondTimer += dT;
            if (m_secondTimer >= 1.0f)
            {
                m_secondTimer -= 1.0f;

                // 处理仇恨消失
                var unitEn = EM_Sight.s_instance.GetUnitVisibleEnumerator();
                while (unitEn.MoveNext())
                {
                    // 无伤害信息
                    if (unitEn.Current.m_dmgDict.Count == 0)
                    {
                        continue;
                    }
                    // 若已死亡
                    if (unitEn.Current.m_IsDead)
                    {
                        unitEn.Current.m_dmgDict.Clear();
                        continue;
                    }
                    // 若不在被攻击状态
                    if (MyTimer.CheckTimeUp(unitEn.Current.m_isAttackedTimer))
                    {
                        unitEn.Current.m_dmgDict.Clear();
                        continue;
                    }
                    var hatredEn       = unitEn.Current.m_dmgDict.GetEnumerator();
                    var hTarRemoveList = new List <int> ();
                    while (hatredEn.MoveNext())
                    {
                        // 仇恨目标下线或死亡
                        var tar = EM_Sight.s_instance.GetUnitVisibleByNetworkId(hatredEn.Current.Key);
                        if (tar == null || tar.m_IsDead)
                        {
                            hTarRemoveList.Add(hatredEn.Current.Key);
                            continue;
                        }
                    }
                    for (int i = 0; i < hTarRemoveList.Count; i++)
                    {
                        unitEn.Current.m_dmgDict.Remove(hTarRemoveList[i]);
                    }
                }

                // 每秒回血回蓝
                unitEn = EM_Sight.s_instance.GetUnitVisibleEnumerator();
                while (unitEn.MoveNext())
                {
                    if (unitEn.Current.m_IsDead)
                    {
                        continue;
                    }
                    int newHP = unitEn.Current.m_curHp + unitEn.Current.m_DeltaHpPerSecond;
                    int newMP = unitEn.Current.m_curMp + unitEn.Current.m_DeltaMpPerSecond;
                    unitEn.Current.m_curHp = Math.Max(Math.Min(newHP, unitEn.Current.m_MaxHp), 0);
                    unitEn.Current.m_curMp = Math.Max(Math.Min(newMP, unitEn.Current.m_MaxMp), 0);
                }

                // 移除超时的状态 计算状态
                var allUnitStatusEn = EM_Status.s_instance.GetAllUnitStatusEn();
                while (allUnitStatusEn.MoveNext())
                {
                    int    netId      = allUnitStatusEn.Current.Key;
                    var    statusList = allUnitStatusEn.Current.Value;
                    E_Unit unit       = EM_Sight.s_instance.GetUnitVisibleByNetworkId(netId);
                    if (unit == null)
                    {
                        continue;
                    }
                    var statusToRemoveList = new List <int> ();
                    for (int i = 0; i < statusList.Count; i++)
                    {
                        if (MyTimer.CheckTimeUp(statusList[i].m_endTime))
                        {
                            statusToRemoveList.Add(i);
                        }
                        else
                        {
                            m_statusHandlerDict[statusList[i].m_Type].TickPerSecond(statusList[i], unit);
                        }
                    }
                    for (int i = 0; i < statusToRemoveList.Count; i++)
                    {
                        m_statusHandlerDict[statusList[statusToRemoveList[i]].m_Type].Remove(statusList[statusToRemoveList[i]], unit);
                    }
                    EM_Status.s_instance.RemoveOrderedStatus(unit.m_networkId, statusToRemoveList);
                }
            }
        }