From 80f65d665bcd87464bba1d66bc2da2c5d12325de Mon Sep 17 00:00:00 2001 From: Ovalord <1Don7H4v3@m41L.com> Date: Fri, 16 Mar 2018 12:28:34 +0100 Subject: [PATCH] Core/Pets: updated many pet damage formulars and apply spellpower bonus for warlock pets --- src/server/game/Entities/Pet/Pet.cpp | 15 +++++ src/server/game/Entities/Unit/StatSystem.cpp | 62 ++++++++++++-------- src/server/game/Spells/SpellEffects.cpp | 10 ++++ 3 files changed, 62 insertions(+), 25 deletions(-) diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 05e061e9281..0ae324c2c1c 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1056,6 +1056,21 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel - 30 - (petlevel / 4))); SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel - 30 + (petlevel / 4))); } + case 50675: // Ebon Imp + case 89: // Summon Infernal + case 11859: // Summon Doomguard + { + if (!pInfo) + { + SetCreateMana(28 + 10 * petlevel); + SetCreateHealth(28 + 30 * petlevel); + } + + int32 bonus_dmg = (int32(m_owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC)* 0.071429f)); + SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float((petlevel * 4 - petlevel) + bonus_dmg)); + SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float((petlevel * 4 + petlevel) + bonus_dmg)); + break; + } } break; } diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 09e619aec20..7bd98a9ccab 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -1094,6 +1094,9 @@ void Guardian::UpdateMaxHealth() case ENTRY_BLOODWORM: multiplicator = 1.0f; break; + case ENTRY_WATER_ELEMENTAL: + multiplicator = 7.5; + break; default: multiplicator = 14.0f; break; @@ -1135,6 +1138,10 @@ void Guardian::UpdateMaxHealth() } } + // Glyph of Voidwalker + if (GetEntry() == ENTRY_VOIDWALKER && GetOwner() && GetOwner()->HasAura(56247)) + value += value * 0.20f; + SetMaxHealth((uint32)value); } @@ -1145,21 +1152,27 @@ void Guardian::UpdateMaxPower(Powers power) float addValue = (power == POWER_MANA) ? GetStat(STAT_INTELLECT) - GetCreateStat(STAT_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, BASE_VALUE) + GetCreatePowers(power); value *= GetModifierValue(unitMod, BASE_PCT); value += GetModifierValue(unitMod, TOTAL_VALUE) + addValue * multiplicator; value *= GetModifierValue(unitMod, TOTAL_PCT); + if (Unit* owner = GetOwner()) + { + switch (GetEntry()) + { + case ENTRY_IMP: + case ENTRY_FELHUNTER: + case ENTRY_FELGUARD: + case ENTRY_SUCCUBUS: + case ENTRY_VOIDWALKER: + value = (7.5 * getLevel() / 80) * GetOwner()->GetStat(STAT_INTELLECT) + GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power); + break; + default: + break; + } + } + SetMaxPower(power, uint32(value)); } @@ -1182,26 +1195,21 @@ void Guardian::UpdateAttackPowerAndDamage(bool ranged) { if (IsHunterPet()) //hunter pets benefit from owner's attack power { - float mod = 1.0f; //Hunter contribution modifier - bonusAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.22f * mod; - if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(34453, EFFECT_1, owner->GetGUID())) // Animal Handler - { - AddPct(bonusAP, aurEff->GetAmount()); - AddPct(val, aurEff->GetAmount()); - } - SetBonusDamage(int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.1287f * mod)); + float mod = 0.425f; //Hunter contribution modifier + bonusAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK) * mod; + SetBonusDamage(int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.0687f)); } else if (IsPetGhoul()) //ghouls benefit from deathknight's attack power (may be summon pet or not) { - bonusAP = owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.22f; - SetBonusDamage(int32(owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.1287f)); + bonusAP = owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.12f; + SetBonusDamage(int32(owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.06287f)); } else if (IsSpiritWolf()) //wolf benefit from shaman's attack power { - float dmg_multiplier = 0.31f; + float dmg_multiplier = 0.50f; if (m_owner->GetAuraEffect(63271, 0)) // Glyph of Feral Spirit - dmg_multiplier = 0.61f; - bonusAP = owner->GetTotalAttackPowerValue(BASE_ATTACK) * dmg_multiplier; + dmg_multiplier = 0.80f; + bonusAP += owner->GetTotalAttackPowerValue(BASE_ATTACK) * dmg_multiplier; SetBonusDamage(int32(owner->GetTotalAttackPowerValue(BASE_ATTACK) * dmg_multiplier)); } //demons benefit from warlocks shadow or fire damage @@ -1212,8 +1220,8 @@ void Guardian::UpdateAttackPowerAndDamage(bool ranged) int32 maximum = (fire > shadow) ? fire : shadow; if (maximum < 0) maximum = 0; - SetBonusDamage(int32(maximum * 0.15f)); - bonusAP = maximum * 0.57f; + SetBonusDamage(int32(maximum * 0.07f)); + bonusAP += maximum * 0.25f; } //water elementals benefit from mage's frost damage else if (GetEntry() == ENTRY_WATER_ELEMENTAL) @@ -1223,6 +1231,10 @@ void Guardian::UpdateAttackPowerAndDamage(bool ranged) frost = 0; SetBonusDamage(int32(frost * 0.4f)); } + else if (GetEntry() == ENTRY_RUNIC_WEAPON) + { + bonusAP = owner->GetTotalAttackPowerValue(BASE_ATTACK); + } } SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, val + bonusAP); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 194b8427640..96ecd58ba2c 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -420,6 +420,16 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) damage += damage / 6; } } + + // Warlock Pets deal 50% of the coefficient's spell power bonus as bonus damage + if (m_caster->IsPet()) + { + if (Unit* owner = m_caster->GetCharmerOrOwner()) + { + damage = CalculatePct(owner->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE, effIndex), 50); + damage = unitTarget->SpellDamageBonusTaken(owner, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); + } + } break; } case SPELLFAMILY_PRIEST: