예제 #1
0
        public override void UpdateArmor()
        {
            float    baseValue   = 0.0f;
            float    value       = 0.0f;
            float    bonus_armor = 0.0f;
            UnitMods unitMod     = UnitMods.Armor;

            // hunter pets gain 35% of owner's armor value, warlock pets gain 100% of owner's armor
            if (IsHunterPet())
            {
                bonus_armor = MathFunctions.CalculatePct(GetOwner().GetArmor(), 70);
            }
            else if (IsPet())
            {
                bonus_armor = GetOwner().GetArmor();
            }

            value     = GetModifierValue(unitMod, UnitModifierType.BaseValue);
            baseValue = value;
            value    *= GetModifierValue(unitMod, UnitModifierType.BasePCT);
            value    += GetModifierValue(unitMod, UnitModifierType.TotalValue) + bonus_armor;
            value    *= GetModifierValue(unitMod, UnitModifierType.TotalPCT);

            SetArmor((int)baseValue, (int)(value - baseValue));
        }
예제 #2
0
        public override void UpdateMaxPower(PowerType power)
        {
            UnitMods unitMod = UnitMods.PowerStart + (int)power;

            float addValue      = (power == PowerType.Mana) ? GetStat(Stats.Intellect) - GetCreateStat(Stats.Intellect) : 0.0f;
            float multiplicator = 15.0f;

            switch (GetEntry())
            {
            case ENTRY_IMP:
                multiplicator = 4.95f;
                break;

            case ENTRY_VOIDWALKER:
            case ENTRY_SUCCUBUS:
            case ENTRY_FELHUNTER:
            case ENTRY_FELGUARD:
                multiplicator = 11.5f;
                break;

            default:
                multiplicator = 15.0f;
                break;
            }

            float value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetCreatePowers(power);

            value *= GetModifierValue(unitMod, UnitModifierType.BasePCT);
            value += GetModifierValue(unitMod, UnitModifierType.TotalValue) + addValue * multiplicator;
            value *= GetModifierValue(unitMod, UnitModifierType.TotalPCT);

            SetMaxPower(power, (int)value);
        }
예제 #3
0
        public override void UpdateDamagePhysical(WeaponAttackType attType)
        {
            if (attType > WeaponAttackType.BaseAttack)
            {
                return;
            }

            float  bonusDamage = 0.0f;
            Player playerOwner = m_owner.ToPlayer();

            if (playerOwner != null)
            {
                //force of nature
                if (GetEntry() == ENTRY_TREANT)
                {
                    int spellDmg = playerOwner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Nature] - playerOwner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Nature];
                    if (spellDmg > 0)
                    {
                        bonusDamage = spellDmg * 0.09f;
                    }
                }
                //greater fire elemental
                else if (GetEntry() == ENTRY_FIRE_ELEMENTAL)
                {
                    int spellDmg = playerOwner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Fire] - playerOwner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Fire];
                    if (spellDmg > 0)
                    {
                        bonusDamage = spellDmg * 0.4f;
                    }
                }
            }

            UnitMods unitMod = UnitMods.DamageMainHand;

            float att_speed = GetBaseAttackTime(WeaponAttackType.BaseAttack) / 1000.0f;

            float base_value  = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base) + GetTotalAttackPowerValue(attType, false) / 3.5f * att_speed + bonusDamage;
            float base_pct    = GetPctModifierValue(unitMod, UnitModifierPctType.Base);
            float total_value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Total);
            float total_pct   = GetPctModifierValue(unitMod, UnitModifierPctType.Total);

            float weapon_mindamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage);
            float weapon_maxdamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MaxDamage);

            float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
            float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;

            SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MinDamage), mindamage);
            SetUpdateFieldStatValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.MaxDamage), maxdamage);
        }
예제 #4
0
        public override void UpdateDamagePhysical(WeaponAttackType attType)
        {
            if (attType > WeaponAttackType.BaseAttack)
            {
                return;
            }

            float bonusDamage = 0.0f;

            if (GetOwner().IsTypeId(TypeId.Player))
            {
                //force of nature
                if (GetEntry() == ENTRY_TREANT)
                {
                    int spellDmg = GetOwner().GetInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Nature) - GetOwner().GetInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Nature);
                    if (spellDmg > 0)
                    {
                        bonusDamage = spellDmg * 0.09f;
                    }
                }
                //greater fire elemental
                else if (GetEntry() == ENTRY_FIRE_ELEMENTAL)
                {
                    int spellDmg = GetOwner().GetInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Fire) - GetOwner().GetInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Fire);
                    if (spellDmg > 0)
                    {
                        bonusDamage = spellDmg * 0.4f;
                    }
                }
            }

            UnitMods unitMod = UnitMods.DamageMainHand;

            float att_speed = GetBaseAttackTime(WeaponAttackType.BaseAttack) / 1000.0f;

            float base_value  = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetTotalAttackPowerValue(attType) / 3.5f * att_speed + bonusDamage;
            float base_pct    = GetModifierValue(unitMod, UnitModifierType.BasePCT);
            float total_value = GetModifierValue(unitMod, UnitModifierType.TotalValue);
            float total_pct   = GetModifierValue(unitMod, UnitModifierType.TotalPCT);

            float weapon_mindamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage);
            float weapon_maxdamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MaxDamage);

            float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
            float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;

            SetStatFloatValue(UnitFields.MinDamage, mindamage);
            SetStatFloatValue(UnitFields.MaxDamage, maxdamage);
        }
예제 #5
0
        public override void UpdateMaxHealth()
        {
            UnitMods unitMod = UnitMods.Health;
            float    stamina = GetStat(Stats.Stamina) - GetCreateStat(Stats.Stamina);

            float multiplicator;

            switch (GetEntry())
            {
            case ENTRY_IMP:
                multiplicator = 8.4f;
                break;

            case ENTRY_VOIDWALKER:
                multiplicator = 11.0f;
                break;

            case ENTRY_SUCCUBUS:
                multiplicator = 9.1f;
                break;

            case ENTRY_FELHUNTER:
                multiplicator = 9.5f;
                break;

            case ENTRY_FELGUARD:
                multiplicator = 11.0f;
                break;

            case ENTRY_BLOODWORM:
                multiplicator = 1.0f;
                break;

            default:
                multiplicator = 10.0f;
                break;
            }

            float value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base) + GetCreateHealth();

            value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base);
            value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total) + stamina * multiplicator;
            value *= GetPctModifierValue(unitMod, UnitModifierPctType.Total);

            SetMaxHealth((uint)value);
        }
예제 #6
0
        public override void UpdateMaxPower(PowerType power)
        {
            if (GetPowerIndex(power) == (uint)PowerType.Max)
            {
                return;
            }

            UnitMods unitMod = UnitMods.PowerStart + (int)power;

            float value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base) + GetCreatePowers(power);

            value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base);
            value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total);
            value *= GetPctModifierValue(unitMod, UnitModifierPctType.Total);

            SetMaxPower(power, (int)value);
        }
예제 #7
0
        public override void UpdateAttackPowerAndDamage(bool ranged = false)
        {
            if (ranged)
            {
                return;
            }

            float    val     = 0.0f;
            float    bonusAP = 0.0f;
            UnitMods unitMod = UnitMods.AttackPower;

            if (GetEntry() == ENTRY_IMP)                                   // imp's attack power
            {
                val = GetStat(Stats.Strength) - 10.0f;
            }
            else
            {
                val = 2 * GetStat(Stats.Strength) - 20.0f;
            }

            Player owner = GetOwner() ? GetOwner().ToPlayer() : null;

            if (owner != null)
            {
                if (IsHunterPet())                      //hunter pets benefit from owner's attack power
                {
                    float mod = 1.0f;                   //Hunter contribution modifier
                    bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.RangedAttack) * 0.22f * mod;
                    SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.RangedAttack) * 0.1287f * mod));
                }
                else if (IsPetGhoul()) //ghouls benefit from deathknight's attack power (may be summon pet or not)
                {
                    bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * 0.22f;
                    SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * 0.1287f));
                }
                else if (IsSpiritWolf()) //wolf benefit from shaman's attack power
                {
                    float dmg_multiplier = 0.31f;
                    bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * dmg_multiplier;
                    SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * dmg_multiplier));
                }
                //demons benefit from warlocks shadow or fire damage
                else if (IsPet())
                {
                    int fire    = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Fire] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Fire];
                    int shadow  = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Shadow] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Shadow];
                    int maximum = (fire > shadow) ? fire : shadow;
                    if (maximum < 0)
                    {
                        maximum = 0;
                    }
                    SetBonusDamage((int)(maximum * 0.15f));
                    bonusAP = maximum * 0.57f;
                }
                //water elementals benefit from mage's frost damage
                else if (GetEntry() == ENTRY_WATER_ELEMENTAL)
                {
                    int frost = owner.m_activePlayerData.ModDamageDonePos[(int)SpellSchools.Frost] - owner.m_activePlayerData.ModDamageDoneNeg[(int)SpellSchools.Frost];
                    if (frost < 0)
                    {
                        frost = 0;
                    }
                    SetBonusDamage((int)(frost * 0.4f));
                }
            }

            SetStatFlatModifier(UnitMods.AttackPower, UnitModifierFlatType.Base, val + bonusAP);

            //in BASE_VALUE of UNIT_MOD_ATTACK_POWER for creatures we store data of meleeattackpower field in DB
            float base_attPower      = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base) * GetPctModifierValue(unitMod, UnitModifierPctType.Base);
            float attPowerMultiplier = GetPctModifierValue(unitMod, UnitModifierPctType.Total) - 1.0f;

            SetAttackPower((int)base_attPower);
            SetAttackPowerMultiplier(attPowerMultiplier);

            //automatically update weapon damage after attack power modification
            UpdateDamagePhysical(WeaponAttackType.BaseAttack);
        }
예제 #8
0
        public override void UpdateAttackPowerAndDamage(bool ranged = false)
        {
            if (ranged)
            {
                return;
            }

            float    val     = 0.0f;
            float    bonusAP = 0.0f;
            UnitMods unitMod = UnitMods.AttackPower;

            if (GetEntry() == ENTRY_IMP)                                   // imp's attack power
            {
                val = GetStat(Stats.Strength) - 10.0f;
            }
            else
            {
                val = 2 * GetStat(Stats.Strength) - 20.0f;
            }

            Unit owner = GetOwner();

            if (owner != null && owner.IsTypeId(TypeId.Player))
            {
                if (IsHunterPet())                      //hunter pets benefit from owner's attack power
                {
                    float mod = 1.0f;                   //Hunter contribution modifier
                    bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.RangedAttack) * 0.22f * mod;
                    SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.RangedAttack) * 0.1287f * mod));
                }
                else if (IsPetGhoul()) //ghouls benefit from deathknight's attack power (may be summon pet or not)
                {
                    bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * 0.22f;
                    SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * 0.1287f));
                }
                else if (IsSpiritWolf()) //wolf benefit from shaman's attack power
                {
                    float dmg_multiplier = 0.31f;
                    if (GetOwner().GetAuraEffect(63271, 0) != null) // Glyph of Feral Spirit
                    {
                        dmg_multiplier = 0.61f;
                    }
                    bonusAP = owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * dmg_multiplier;
                    SetBonusDamage((int)(owner.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack) * dmg_multiplier));
                }
                //demons benefit from warlocks shadow or fire damage
                else if (IsPet())
                {
                    int fire    = (int)((owner.GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Fire)) + owner.GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Fire));
                    int shadow  = (int)((owner.GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Shadow)) + owner.GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Shadow));
                    int maximum = (fire > shadow) ? fire : shadow;
                    if (maximum < 0)
                    {
                        maximum = 0;
                    }
                    SetBonusDamage((int)(maximum * 0.15f));
                    bonusAP = maximum * 0.57f;
                }
                //water elementals benefit from mage's frost damage
                else if (GetEntry() == ENTRY_WATER_ELEMENTAL)
                {
                    int frost = (int)((owner.GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Frost)) + owner.GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Frost));
                    if (frost < 0)
                    {
                        frost = 0;
                    }
                    SetBonusDamage((int)(frost * 0.4f));
                }
            }

            SetModifierValue(UnitMods.AttackPower, UnitModifierType.BaseValue, val + bonusAP);

            //in BASE_VALUE of UNIT_MOD_ATTACK_POWER for creatures we store data of meleeattackpower field in DB
            float base_attPower      = GetModifierValue(unitMod, UnitModifierType.BaseValue) * GetModifierValue(unitMod, UnitModifierType.BasePCT);
            float attPowerMultiplier = GetModifierValue(unitMod, UnitModifierType.TotalPCT) - 1.0f;

            //UNIT_FIELD_(RANGED)_ATTACK_POWER field
            SetInt32Value(UnitFields.AttackPower, (int)base_attPower);
            //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
            SetFloatValue(UnitFields.AttackPowerMultiplier, attPowerMultiplier);

            //automatically update weapon damage after attack power modification
            UpdateDamagePhysical(WeaponAttackType.BaseAttack);
        }
예제 #9
0
        public override void UpdateDamagePhysical(WeaponAttackType attType)
        {
            if (attType > WeaponAttackType.BaseAttack)
            {
                return;
            }

            float bonusDamage = 0.0f;

            if (GetOwner().IsTypeId(TypeId.Player))
            {
                //force of nature
                if (GetEntry() == ENTRY_TREANT)
                {
                    int spellDmg = (int)((GetOwner().GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Nature)) + GetOwner().GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Nature));
                    if (spellDmg > 0)
                    {
                        bonusDamage = spellDmg * 0.09f;
                    }
                }
                //greater fire elemental
                else if (GetEntry() == ENTRY_FIRE_ELEMENTAL)
                {
                    int spellDmg = (int)((GetOwner().GetUInt32Value(PlayerFields.ModDamageDonePos + (int)SpellSchools.Fire)) + GetOwner().GetUInt32Value(PlayerFields.ModDamageDoneNeg + (int)SpellSchools.Fire));
                    if (spellDmg > 0)
                    {
                        bonusDamage = spellDmg * 0.4f;
                    }
                }
            }

            UnitMods unitMod = UnitMods.DamageMainHand;

            float att_speed = GetBaseAttackTime(WeaponAttackType.BaseAttack) / 1000.0f;

            float base_value  = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetTotalAttackPowerValue(attType) / 3.5f * att_speed + bonusDamage;
            float base_pct    = GetModifierValue(unitMod, UnitModifierType.BasePCT);
            float total_value = GetModifierValue(unitMod, UnitModifierType.TotalValue);
            float total_pct   = GetModifierValue(unitMod, UnitModifierType.TotalPCT);

            float weapon_mindamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage);
            float weapon_maxdamage = GetWeaponDamageRange(WeaponAttackType.BaseAttack, WeaponDamageRange.MaxDamage);

            float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
            float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;

            var mDummy = GetAuraEffectsByType(AuraType.ModAttackspeed);

            foreach (var eff in mDummy)
            {
                switch (eff.GetSpellInfo().Id)
                {
                case 61682:
                case 61683:
                    MathFunctions.AddPct(ref mindamage, -eff.GetAmount());
                    MathFunctions.AddPct(ref maxdamage, -eff.GetAmount());
                    break;

                default:
                    break;
                }
            }

            SetStatFloatValue(UnitFields.MinDamage, mindamage);
            SetStatFloatValue(UnitFields.MaxDamage, maxdamage);
        }