Exemple #1
0
    //执行一次攻击,一般的攻击。proc-触发
    public void PerformAttack(BaseNPC target, bool useCastAttackOrb, bool prcoessProcs, bool skipCooldown, bool ignoreInvis = false, bool useProjectile = false, bool fakeAttack = false, bool neverMiss = false)
    {
        int hitChance = 0;

        if (neverMiss)
        {
            hitChance = 100;
        }
        if (!this.GetModifierState(Modifier_State.MODIFIER_STATE_INVULNERABLE))        //无敌状态
        {
            //Miss chance = 1 - [Π^n (1 - evasionn) x (1 - Min(sum of all sources of blind, 100%)) x (1 - uphill miss chance)]
            hitChance = (1 - EntityAttribute.CalcAndUpdateValue(target, EntityAttributeType.Evasion) / 100) * (1 - Math.Min(EntityAttribute.CalcAndUpdateValue(this, EntityAttributeType.MissRate), 100) / 100);
            if (hitChance < UnityEngine.Random.Range(0f, 1f))           //击中
            {
                //Damage = { [Main Damage × (1 +   Percentage Bonuses) + FlatBonuses] × Crit Multiplier - Blocked Damage } × Armor Multipliers × General Damage Multipliers
                int damage = (EntityAttribute.CalcAndUpdateValue(this, EntityAttributeType.AttackDamage) - EntityAttribute.CalcAndUpdateValue(target, EntityAttributeType.DamageBlock)) * EntityAttribute.CalcAndUpdateValue(this, EntityAttributeType.AttackOutgoModifier) / 100 * EntityAttribute.CalcAndUpdateValue(target, EntityAttributeType.AttackIncomeModifier) / 100;
                target.TakeDamage(DamageType.DAMAGE_TYPE_PHYSICAL, damage);
                this.TriggerModifierEvent(ModifierEventType.OnDealDamage);
                target.TriggerModifierEvent(ModifierEventType.OnTakeDamage);
            }
            else
            {
            }
        }

        // if(!fakeAttack)
        // {
        //  TriggerModifierEvent(ModifierEventType.OnAttack);
        // }
    }
Exemple #2
0
    //计算新的值并更新这个值
    public static int CalcAndUpdateValue(BaseEntity source, EntityAttributeType type)
    {
        //属性值的变换大致遵循这样的公式:(Base+∑Bonus)*(Percentage1 + 1)*(Percentage2 + 1)··· + ∑Bonus
        int   intValue = 0;
        float floatVal = 0f;

        BaseNPC _source;

        switch (type)
        {
        case EntityAttributeType.MoveSpeed:
            _source = source as BaseNPC;
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                intValue = _source.BaseAttribute.moveSpeed;                         //基础值
                int maxVal   = -1;
                int finalVal = -1;

                int   baseBonus = 0;
                float perBonus  = 1f;                        //百分比的增长值
                float perBonus1 = 1f;                        //百分比的增长值
                int   extBonus  = 0;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    //绝对值的优先级是最高的
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE, out val))                            //速度的绝对值
                    {
                        finalVal = Math.Max(val.GetVal <int>(_source.Level), finalVal);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE_MIN, out val))                            //最小速度的绝对值
                    {
                        finalVal = Math.Max(val.GetVal <int>(_source.Level), finalVal);
                    }
                    else if (finalVal < 0 && iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_BASE_OVERRIDE, out val))
                    {
                        intValue = val.GetVal <int>(_source.Level);
                    }
                    else if (finalVal < 0 && iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, out val))                             //基础值的加成
                    {
                        baseBonus += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, out val))
                    {
                        perBonus *= (100 + val.GetVal <int>(_source.Level)) / 100;
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE_UNIQUE, out val))                             //unique表示不可叠加
                    {
                        perBonus1 *= (100 + val.GetVal <int>(_source.Level)) / 100;
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE_UNIQUE_2, out val))                             //unique表示不可叠加
                    {
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_BONUS_UNIQUE, out val))
                    {
                        baseBonus += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_BONUS_UNIQUE_2, out val))                             //unique表示不可叠加
                    {
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_LIMIT, out val))                             //最终值达到的上限
                    {
                        maxVal = Math.Min(val.GetVal <int>(_source.Level), maxVal);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MOVESPEED_MAX, out val))
                    {
                        maxVal = Math.Min(val.GetVal <int>(_source.Level), maxVal);
                    }

                    if (finalVal < 0)
                    {
                        intValue = maxVal > 0 ? Math.Min(finalVal, maxVal) : finalVal;
                    }
                    else
                    {
                        intValue = (int)((intValue + baseBonus) * perBonus + extBonus);
                        intValue = maxVal > 0 ? Math.Min(intValue, maxVal) : intValue;
                    }

                    _source.Attribute.moveSpeed = intValue;
                }
            }
            break;

        case EntityAttributeType.StatusResistance:
            //Total status resistance = 1 − ((1 - Strength × 0.15% on strength heroes) × (1 − first resistance bonus) × (1 − second resistance bonus))
            _source = source as BaseNPC;
            if (_source != null)
            {
                //基础值
                floatVal = 1 - EntityAttribute.CalcAndUpdateValue(source, EntityAttributeType.Strength) * 0.0015f;
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    //加成值
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_STATUS_RESISTANCE_BONUS, out val))
                    {
                        floatVal *= (100 - val.GetVal <int>(_source.Level)) / 100;
                    }
                }
                floatVal = 1 - floatVal;
                _source.Attribute.statusResistance = floatVal;
            }
            else
            {
                floatVal = (1 - (1 - EntityAttribute.CalcAndUpdateValue(source, EntityAttributeType.Strength) * 0.0015f));
                source.Attribute.statusResistance = floatVal;
            }

            break;

        case EntityAttributeType.MagicResistance:
            _source = source as BaseNPC;
            //Total magic resistance = 1 − ((1 − natural resistance) × (1 - Intelligence × 0.15% on intelligence heroes) × (1 − first resistance bonus) × (1 − second resistance bonus) × (1 + first resistance reduction) × (1 + second resistance reduction))
            if (_source != null)
            {
                //main armor
                floatVal = 1f;
                if (_source != null)
                {
                    var tmp      = _source.Modifiers;
                    int count    = tmp.Count;
                    int finalVal = 0;
                    for (int i = 0; i < count; i++)
                    {
                        var            iter = tmp[i].Properties;
                        AbilitySpecial val;
                        //加成值
                        if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, out val))
                        {
                            floatVal *= (1 - val.GetVal <int>(_source.Level) / 100);
                        }
                        else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MAGICAL_RESISTANCE_DECREPIFY_UNIQUE, out val))
                        {
                            finalVal = Math.Max(finalVal, val.GetVal <int>(_source.Level));
                        }
                        else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MAGICAL_RESISTANCE_DIRECT_MODIFICATION, out val))                                 //?直接修改变化值
                        {
                            //floatVal += val.GetVal<float>(_source.Level);
                        }
                    }

                    _source.Attribute.magicResistance = (1 - _source.BaseAttribute.magicResistance) * (1 - EntityAttribute.CalcAndUpdateValue(_source, EntityAttributeType.Intellect) * 0.0015f) * floatVal * (1 - finalVal / 100);
                }
            }
            else
            {
                floatVal = 1 - source.BaseAttribute.magicResistance;
            }
            break;

        case EntityAttributeType.PhysicArmor:
            _source = source as BaseNPC;
            //main armor = base armor + (agility/6);
            //illusions能够从unit中继承值了main armor的属性
            if (_source != null)
            {
                //main armor
                floatVal = _source.BaseAttribute.physicArmor + EntityAttribute.CalcAndUpdateValue(source, EntityAttributeType.Agility) / 6;
                if (_source != null)
                {
                    var   tmp      = _source.Modifiers;
                    int   count    = tmp.Count;
                    float finalVal = 0f;
                    float bonus    = 0f;
                    for (int i = 0; i < count; i++)
                    {
                        var            iter = tmp[i].Properties;
                        AbilitySpecial val;
                        //加成值
                        if (finalVal > -1 && iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, out val))
                        {
                            bonus += val.GetVal <float>(_source.Level);
                        }
                        else if (finalVal > -1 && iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS_UNIQUE, out val))
                        {
                            finalVal = Math.Max(finalVal, val.GetVal <float>(_source.Level));
                        }
                        else if (finalVal > -1 && iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS_UNIQUE_ACTIVE, out val))
                        {
                            finalVal = Math.Max(finalVal, val.GetVal <float>(_source.Level));
                        }
                        else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_IGNORE_PHYSICAL_ARMOR, out val))                                 //这个优先级最高
                        {
                            finalVal = -2f;
                            break;
                        }
                    }
                    if (finalVal > -1)
                    {
                        _source.Attribute.physicArmor = floatVal + Math.Max(bonus, finalVal);
                    }
                    else
                    {
                        _source.Attribute.physicArmor = 0f;
                    }
                }
            }
            else
            {
                floatVal = source.BaseAttribute.physicArmor;
            }
            break;

        case EntityAttributeType.DamageBlock:
            //格挡的伤害比较特殊,需要根据每个装备或者buff单独计算,不会叠加,而且跟自身的格挡是无关的
            _source = source as BaseNPC;
            if (_source != null)
            {
                intValue = _source.BaseAttribute.damageBlock;
                if (_source != null)
                {
                    var tmp   = _source.Modifiers;
                    int count = tmp.Count;
                    for (int i = 0; i < count; i++)
                    {
                        var            iter = tmp[i].Properties;
                        AbilitySpecial val;
                        //加成值
                        if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_TOTAL_CONSTANT_BLOCK, out val))
                        {
                            intValue += val.GetVal <int>(_source.Level);
                        }
                        else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_TOTAL_CONSTANT_BLOCK_UNAVOIDABLE_PRE_ARMOR, out val))
                        {
                            intValue += val.GetVal <int>(_source.Level);
                        }
                        else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MAGICAL_CONSTANT_BLOCK, out val))                                 //
                        {
                        }
                        else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PHYSICAL_CONSTANT_BLOCK, out val))
                        {
                        }
                        else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PHYSICAL_CONSTANT_BLOCK_SPECIAL, out val))
                        {
                        }

                        _source.Attribute.damageBlock = intValue;                                 //格挡伤害值
                    }
                }
            }
            else
            {
            }
            break;

        case EntityAttributeType.AttackSpeed:
            //Attack time = BAT / [(100 + IAS) × 0.01] = 1 / (attacks per second)
            floatVal = source.BaseAttribute.attackSpeed;                     //基础攻击速度
            _source  = source as BaseNPC;
            if (_source != null)
            {
                //一点敏捷提高一点攻击速度
                intValue = EntityAttribute.CalcAndUpdateValue(_source, EntityAttributeType.Agility);
                var   tmp      = _source.Modifiers;
                float finalVal = -1f;
                int   count    = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    //加成值
                    if (finalVal < 0 && iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_ATTACKSPEED_BASE_OVERRIDE, out val))
                    {
                        floatVal = val.GetVal <float>(_source.Level);
                    }
                    else if (finalVal < 0 && iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_BASE_ATTACK_TIME_CONSTANT, out val))
                    {
                        finalVal = Math.Max(finalVal, val.GetVal <float>(_source.Level));
                    }
                }

                if (finalVal < 0)
                {
                    intValue = Math.Min(-80, intValue);
                    intValue = Math.Max(500, intValue);
                    floatVal = floatVal / ((100 + intValue) * 0.01f);
                    _source.Attribute.attackSpeed = floatVal;                             //更新后的数值
                }
                else
                {
                    _source.Attribute.attackSpeed = 1 / finalVal;
                }
            }
            else
            {
                _source.Attribute.attackSpeed = floatVal;
            }
            break;

        case EntityAttributeType.CastRange:
            _source  = source as BaseNPC;
            intValue = source.BaseAttribute.castRange;
            if (_source != null)
            {
                var tmp      = _source.Modifiers;
                int count    = tmp.Count;
                int stackVal = 0;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_CAST_RANGE_BONUS, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_CAST_RANGE_BONUS_STACKING, out val))
                    {
                        //stackVal += val.GetVal<int>(_source.Level);
                    }
                }

                //更新值
                _source.Attribute.castRange = intValue;
            }
            break;

        case EntityAttributeType.AttackRange:
            _source  = source as BaseNPC;
            intValue = source.BaseAttribute.attackRange;
            if (_source != null)
            {
                var tmp    = _source.Modifiers;
                int count  = tmp.Count;
                int maxVal = 0;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_ATTACK_RANGE_BONUS, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_ATTACK_RANGE_BONUS_UNIQUE, out val))
                    {
                        //intValue = val.GetVal<int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MAX_ATTACK_RANGE, out val))
                    {
                        maxVal = Math.Max(maxVal, val.GetVal <int>(_source.Level));
                    }

                    intValue = maxVal > 0 ? Math.Min(intValue, maxVal) : intValue;
                }
            }
            break;

        case EntityAttributeType.Evasion:
            _source  = source as BaseNPC;
            floatVal = 1 - source.BaseAttribute.evasion / 100;
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_EVASION_CONSTANT, out val))
                    {
                        floatVal *= (1 - val.GetVal <int>(_source.Level) / 100);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_NEGATIVE_EVASION_CONSTANT, out val))
                    {
                        floatVal *= (1 - val.GetVal <int>(_source.Level) / 100);
                    }
                }

                _source.Attribute.evasion = 100 - (int)(floatVal * 100);                         //
                return(_source.Attribute.evasion);
            }
            else
            {
            }
            break;

        case EntityAttributeType.MissRate:                 //miss rate是相加
            _source  = source as BaseNPC;
            intValue = source.BaseAttribute.missRate;
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MISS_PERCENTAGE, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                }

                _source.Attribute.missRate = intValue;
                return(intValue);
            }
            else
            {
            }
            break;

        case EntityAttributeType.Crit:                 //计算暴击率
            _source  = source as BaseNPC;
            intValue = source.BaseAttribute.crit;
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PREATTACK_TARGET_CRITICALSTRIKE, out val))                             //目标的暴击率?
                    {
                        //intValue += val.GetVal<int>(_source.Level);
                    }
                }

                _source.Attribute.crit = intValue;
            }
            else
            {
            }
            break;

        case EntityAttributeType.AttackDamage:
            //Damage = { [Main Damage × (1 +   Percentage Bonuses) + FlatBonuses] × Crit Multiplier - Blocked Damage } × Armor Multipliers × General Damage Multipliers
            //此处的计算只计算到Main Damage × (1 +   Percentage Bonuses) + FlatBonuses] × Crit Multiplier,后续的需要在确定目标之后才能计算
            //只是计算了单outgoing的伤害,
            _source  = source as BaseNPC;
            intValue = source.BaseAttribute.attackDamage;
            if (_source != null)
            {
                //根据主属性计算主伤害
                switch (_source.Attribute.mainAttr)
                {
                case MainAttribute.ATTRIBUTE_AGILITY:
                    intValue += EntityAttribute.CalcAndUpdateValue(_source, EntityAttributeType.Agility);
                    break;

                case MainAttribute.ATTRIBUTE_INTELLECT:
                    intValue += EntityAttribute.CalcAndUpdateValue(_source, EntityAttributeType.Intellect);
                    break;

                case MainAttribute.ATTRIBUTE_STRENGTH:
                    intValue += EntityAttribute.CalcAndUpdateValue(_source, EntityAttributeType.Strength);
                    break;
                }
                var tmp           = _source.Modifiers;
                int count         = tmp.Count;
                int perBonus      = 0;
                int finalPerBonus = 0;
                int flatBonus     = 0;
                int postCrit      = 0;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, out val))
                    {
                        flatBonus += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE_POST_CRIT, out val))                             //在计算了暴击之后的攻击增加
                    {
                        postCrit += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_BASEATTACK_BONUSDAMAGE, out val))                             //基础攻击增加
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_BASEDAMAGEOUTGOING_PERCENTAGE_UNIQUE, out val))                             //?难道是在计算基础damage的时候引入
                    {
                        finalPerBonus = Math.Max(finalPerBonus, val.GetVal <int>(_source.Level));
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_BASEDAMAGEOUTGOING_PERCENTAGE, out val))
                    {
                        perBonus += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PRE_ATTACK, out val))                             //这个值增加在哪里,亦或就是基础值
                    {
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_OVERRIDE_ATTACK_MAGICAL, out val))                            //?覆写魔法攻击,覆写的是基础值?
                    {
                    }

                    /* 这部分触发攻击伤害,需要在modifier中特殊计算,不能单独计算
                     * else if(iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE_PROC, out val))
                     * {
                     *
                     * }
                     * else if(iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_MAGICAL, out val))
                     * {
                     *
                     * }else if(iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_PHYSICAL, out val))
                     * {
                     *
                     * }else if(iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_PURE, out val))
                     * {
                     *
                     * }else if(iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_PROCATTACK_FEEDBACK, out val))
                     * {
                     *
                     * }
                     */
                }

                intValue = (intValue * (1 + Math.Max(perBonus, finalPerBonus) / 100) + flatBonus) * EntityAttribute.CalcAndUpdateValue(_source, EntityAttributeType.Crit);
                return(intValue);
            }
            break;

        case EntityAttributeType.AttackIncomeModifier:
            //incomming相关计算,这部分在目标上
            _source  = source as BaseNPC;
            intValue = 100;                     //默认没有伤害加深
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_INCOMING_PHYSICAL_DAMAGE_PERCENTAGE, out val))
                    {
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_INCOMING_SPELL_DAMAGE_CONSTANT, out val))
                    {
                    }
                }

                return(intValue);
            }
            return(intValue);

        case EntityAttributeType.AttackOutgoModifier:
            //incomming相关计算,这部分在目标上
            _source  = source as BaseNPC;
            intValue = 100;                     //默认没有伤害加深
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MAGICDAMAGEOUTGOING_PERCENTAGE, out val))                            //魔法攻击加成
                    {
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE_ILLUSION, out val))                             //幻影的加成
                    {
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_TOTALDAMAGEOUTGOING_PERCENTAGE, out val))                             //?总的加成,好像跟前面的没有区别
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                }
                return(intValue);
            }
            return(intValue);

        case EntityAttributeType.IncomeSpellModifier:
            _source  = source as BaseNPC;
            floatVal = 1f;
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_INCOMING_SPELL_DAMAGE_CONSTANT, out val))
                    {
                        floatVal = (val.GetVal <int>(_source.Level)) / 100;
                    }
                }

                _source.Attribute.spellDamage = floatVal;
            }
            else
            {
            }
            break;

        case EntityAttributeType.SpellDamage:
            _source  = source as BaseNPC;
            floatVal = source.BaseAttribute.spellDamage + EntityAttribute.CalcAndUpdateValue(source, EntityAttributeType.Intellect) / 1400;
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;

                float bonusVal = 1f;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_SPELL_AMPLITY_PERCENTAGE, out val))
                    {
                        bonusVal += val.GetVal <int>(_source.Level);
                    }
                }

                _source.Attribute.spellDamage = floatVal * (1 + bonusVal / 100);
            }
            else
            {
            }
            break;

        case EntityAttributeType.Mana:
            intValue = source.Attribute.mana;
            break;

        case EntityAttributeType.MaxMana:
            intValue = source.BaseAttribute.maxMana + EntityAttribute.CalcAndUpdateValue(source, EntityAttributeType.Intellect) * 14;
            _source  = source as BaseNPC;

            if (_source != null)
            {
                var tmp      = _source.Modifiers;
                int count    = tmp.Count;
                int finalVal = 0;
                int bonus    = 0;
                floatVal = 1f;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_HEALTH_BONUS, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MIN_HEALTH, out val))
                    {
                        finalVal = Math.Min(finalVal, val.GetVal <int>(_source.Level));
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_EXTRA_HEALTH_BONUS, out val))                            //在percentage之后识别
                    {
                        bonus += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_EXTRA_HEALTH_PERCENTAGE, out val))
                    {
                        floatVal *= (100 + val.GetVal <int>(_source.Level)) / 100;
                    }
                }

                source.Attribute.maxHealth = (int)((intValue + bonus) * floatVal);
            }
            else
            {
            }
            break;

        case EntityAttributeType.Health:
            intValue = source.Attribute.health;
            break;

        case EntityAttributeType.MaxHealth:
            intValue = source.BaseAttribute.maxHealth + EntityAttribute.CalcAndUpdateValue(source, EntityAttributeType.Strength) * 20;
            _source  = source as BaseNPC;

            if (_source != null)
            {
                var tmp      = _source.Modifiers;
                int count    = tmp.Count;
                int finalVal = 0;
                int bonus    = 0;
                floatVal = 1f;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_HEALTH_BONUS, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_MIN_HEALTH, out val))
                    {
                        finalVal = Math.Min(finalVal, val.GetVal <int>(_source.Level));
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_EXTRA_HEALTH_BONUS, out val))                            //在percentage之后识别
                    {
                        bonus += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_EXTRA_HEALTH_PERCENTAGE, out val))
                    {
                        floatVal *= (100 + val.GetVal <int>(_source.Level)) / 100;
                    }
                }

                source.Attribute.maxHealth = (int)((intValue + bonus) * floatVal);
            }
            else
            {
            }
            break;

        case EntityAttributeType.HealthGegen:
            //Health Regeneration = (Base + Sum of Flat Bonuses) × (1 + strength × (5/700))
            //intValue = (int)((source.BaseAttribute.healthRegen + ) * (1 + EntityAttribute.CalcAndUpdateValue(source,EntityAttributeType.Strength) * 5 /700));

            _source = source as BaseNPC;

            if (_source != null)
            {
                var   tmp   = _source.Modifiers;
                int   count = tmp.Count;
                float bonus = 0;
                floatVal = _source.BaseAttribute.healthRegen;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, out val))
                    {
                        bonus += val.GetVal <float>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE, out val))
                    {
                        floatVal *= (1 + val.GetVal <int>(_source.Level) / 100);
                    }
                }
                _source.Attribute.healthRegen = (_source.BaseAttribute.healthRegen + bonus) * floatVal;
            }
            else
            {
            }
            break;

        case EntityAttributeType.HealModifier:
            //Health Regeneration = (Base + Sum of Flat Bonuses) × (1 + strength × (5/700))
            //intValue = (int)((source.BaseAttribute.healthRegen + ) * (1 + EntityAttribute.CalcAndUpdateValue(source,EntityAttributeType.Strength) * 5 /700));

            _source = source as BaseNPC;

            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                floatVal = 1f;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_HEAL_AMPLIFY_PERCENTAGE, out val))
                    {
                        floatVal *= (1 + val.GetVal <float>(_source.Level) / 100);
                    }
                }
                //return floatVal;
            }
            else
            {
            }
            break;

        case EntityAttributeType.Strength:
            //intValue =
            _source = source as BaseNPC;
            //基础的力量值
            intValue = source.BaseAttribute.strength;                    // + source.BaseAttribute.strengthGain * source.Level; 升级的效果在外面处理
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                    else if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_EXTRA_STRENGTH_BONUS, out val))                             //最外层的增加
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                }
                _source.Attribute.strength = intValue;
            }
            break;

        case EntityAttributeType.Agility:
            //intValue =
            _source = source as BaseNPC;
            //基础的力量值
            intValue = source.BaseAttribute.agility;                    // + source.BaseAttribute.strengthGain * source.Level; 升级的效果在外面处理
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_STATS_AGILITY_BONUS, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                }
                _source.Attribute.strength = intValue;
            }
            break;

        case EntityAttributeType.Intellect:
            //intValue =
            _source = source as BaseNPC;
            //基础的力量值
            intValue = source.BaseAttribute.intellect;                    // + source.BaseAttribute.strengthGain * source.Level; 升级的效果在外面处理
            if (_source != null)
            {
                var tmp   = _source.Modifiers;
                int count = tmp.Count;
                for (int i = 0; i < count; i++)
                {
                    var            iter = tmp[i].Properties;
                    AbilitySpecial val;
                    if (iter.TryGetValue(Modifier_Property.MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, out val))
                    {
                        intValue += val.GetVal <int>(_source.Level);
                    }
                }
                _source.Attribute.strength = intValue;
            }
            break;
        }
        return(intValue);
    }