private void ChangeHealth(float amt, HealthChangeType type)
    {
        _health += amt;

        //TODO: Die, update effective max....
        if (_health < 0.0f)
        {
            GetComponent <PlayerEventMessenger>().SendDeathEvent(gameObject, "PlayerHealth");
            _health = 0.0f;
        }

        _healthBar.OnHealthChange(_health / _maxHealth, _maxEffectiveHealth / _maxHealth);
    }
        /// <summary>
        /// Generalized private health diff calculation function
        /// </summary>
        /// <param name="changeType">HealthChangeType representing type of change</param>
        /// <param name="amount">Integer change</param>
        /// <returns>|change in HP|</returns>
        private float ChangeHealth (HealthChangeType changeType, float amount) {
            float diff = 0;

            switch (changeType) {
                case HealthChangeType.Damage:
                    diff = hp - amount < 0 ? 0 : -amount;
                    break;
                case HealthChangeType.Heal:
                    diff = hp + amount > MAX_HP ? MAX_HP - hp : amount;
                    break;
                default:
                    // NOTE(jordan): use UnityEngine's Debug, not System's Console.WriteLine
                    Debug.LogError(string.Format("Unrecognized HealthChangeType: {0}", changeType));
                    break;
            }

            Debug.Log(string.Format("HP Change: {0}", diff));
            hp += diff;
            return diff;
        }
 public void ReceiveHealthChangeEvent(GameObject source, string sourceName, float damage, HealthChangeType type)
 {
     ChangeHealth(damage, type);
 }
 public void SendHealthChangeEvent(GameObject source, string sourceName, float damage, HealthChangeType type)
 {
     foreach (HealthChangeEventReceiver healthChangeEventReceiver in _healthChangeEventReceivers)
         healthChangeEventReceiver.ReceiveHealthChangeEvent(source, sourceName, damage, type);
 }
示例#5
0
    /// <summary>
    /// 计算技能伤害/治疗
    /// </summary>
    /// <param name="member"></param>
    /// <param name="target">技能目标</param>
    /// <param name="type">伤害或治疗</param>
    /// <param name="unitType">伤害/治疗值类型</param>
    /// <param name="calculationType">计算类型</param>
    /// <param name="value">具体值, 必须大于等于0</param>
    /// <returns>伤害/治疗具体量</returns>
    public static float GetHurtForSkill(DisplayOwner member, DisplayOwner target, DemageOrCure type, HealthChangeType unitType, HealthChangeCalculationType calculationType, float value)
    {
        if (member == null ||
            member.ClusterData == null ||
            target == null ||
            target.ClusterData == null ||
            target.ClusterData.AllData.MemberData == null)
        {
            throw new Exception("目标对象为空.");
        }
        if (value < 0)
        {
            throw new Exception("伤害/治疗值不能为负数.");
        }
        var result = 0f;

        // 区分伤害类型
        switch (calculationType)
        {
        case HealthChangeCalculationType.Fix:
        {
            var zhanqianJueduizhi   = member.ClusterData.AllData.MemberData.Attack1;
            var zhandouJueduizhiAdd = 0.0f;
            var zhanqianBaifenbiAdd = 0.0f;
            var zhandouBaifenbiAdd  = 0.0f;

            // 伤害能力
            var huoli = (zhanqianJueduizhi + zhandouJueduizhiAdd) * (1 + zhanqianBaifenbiAdd + zhandouBaifenbiAdd);
            // 减伤
            var jianshanglv = AdjustJianshang(member, target);
            // 克制关系
            var kezhixishu = AdjustKezhi(member, target);
            //if (unitType == HealthChangeType.Percentage)
            //{
            //    result = target.ClusterData.AllData.MemberData.TotalHp*value;
            //}

            var shanghaijiacheng = 0.0f;
            var mianyijiacheng   = 0.0f;
            var jinengjiacheng   = 0.0f;

            // 计算增伤
            shanghaijiacheng = GetDemageUpper(member, target);

            // 计算减伤
            mianyijiacheng = GetDemageLower(member, target);

            result = huoli * (1 - jianshanglv) * kezhixishu *
                     (1 + Mathf.Max(-0.8f, (shanghaijiacheng - mianyijiacheng))) + jinengjiacheng;
        }
        break;

        case HealthChangeCalculationType.Calculation:

            break;
        }

        return(result);
    }
示例#6
0
    public void ReceiveHealthChangeEvent(GameObject source, string sourceName, float damage, HealthChangeType type)
    {
        PlayerInfo player = PlayerInfoManager.instance.GetAttachedPlayer(source);
        int        index  = PlayerInfoManager.instance.GetFirstIndexOfTeam(player.team) + player.positionInTeam;

        if ((type & HealthChangeType.Heal) == 0)
        {
            _uiElements[index].AddDamageDealt(-damage);
        }
        else
        {
            _uiElements[index].AddHealingDone(damage);
        }
    }