diff --git a/data/sql/updates/pending_db_world/rev_1634677151304244900.sql b/data/sql/updates/pending_db_world/rev_1634677151304244900.sql new file mode 100644 index 000000000..cea5139af --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1634677151304244900.sql @@ -0,0 +1,6 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1634677151304244900'); + +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_dru_bear_form_passive'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(1178,'spell_dru_bear_form_passive'), +(9635,'spell_dru_bear_form_passive'); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index a3fba370e..ebe520e7f 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -519,17 +519,6 @@ int32 AuraEffect::CalculateAmount(Unit* caster) case SPELL_AURA_MANA_SHIELD: m_canBeRecalculated = false; break; - case SPELL_AURA_MOD_BASE_RESISTANCE_PCT: - if (!caster) - break; - if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DRUID) - { - if (GetId() == 1178 && caster->HasAura(5229) && !caster->HasAura(70726)) // Feral t10 4p - amount -= 48; // percentage - else if (GetId() == 9635 && caster->HasAura(5229) && !caster->HasAura(70726)) // Feral t10 4p - amount -= 57; // percentage - } - break; case SPELL_AURA_MOD_DAMAGE_PERCENT_DONE: // Titan's Grip if (!caster) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 7e841a38d..e8abdc959 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1843,25 +1843,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b target->RemoveAura(63531); } } - - break; - case SPELLFAMILY_DRUID: - if (!caster) - break; - // Reduce base armor of bear form and dire bear form - if (GetId() == 5229) - { - if (target->HasAura(70726)) // Item - Druid T10 Feral 4P Bonus - { - if (apply) - target->CastSpell(target, 70725, true); - } - else - { - // Enrage armor reduction - target->HandleStatModifier(UNIT_MOD_ARMOR, BASE_PCT, target->GetShapeshiftForm() == FORM_DIREBEAR ? -16.0f : -27.0f, apply); - } - } break; } } diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 26ea151be..802c8ad43 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -55,6 +55,62 @@ enum DruidSpells SPELL_DRUID_SAVAGE_ROAR = 62071, SPELL_DRUID_TIGER_S_FURY_ENERGIZE = 51178, SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950, + SPELL_DRUID_BEAR_FORM_PASSIVE = 1178, + SPELL_DRUID_DIRE_BEAR_FORM_PASSIVE = 9635, + SPELL_DRUID_ENRAGE = 5229, + SPELL_DRUID_ENRAGED_DEFENSE = 70725, + SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS = 70726, +}; + +// 1178 - Bear Form (Passive) +// 9635 - Dire Bear Form (Passive) +class spell_dru_bear_form_passive : public SpellScriptLoader +{ + public: + spell_dru_bear_form_passive() : SpellScriptLoader("spell_dru_bear_form_passive") { } + + class spell_dru_bear_form_passive_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_bear_form_passive_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_ENRAGE, SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS }); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (!GetUnitOwner()->HasAura(SPELL_DRUID_ENRAGE) || GetUnitOwner()->HasAura(SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS)) + { + return; + } + + int32 mod = 0; + switch (GetId()) + { + case SPELL_DRUID_BEAR_FORM_PASSIVE: + mod = -48; + break; + case SPELL_DRUID_DIRE_BEAR_FORM_PASSIVE: + mod = -59; + break; + default: + return; + } + + amount += mod; + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_bear_form_passive_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_BASE_RESISTANCE_PCT); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_bear_form_passive_AuraScript(); + } }; // 70723 - Item - Druid T10 Balance 4P Bonus @@ -417,30 +473,64 @@ class spell_dru_enrage : public SpellScriptLoader public: spell_dru_enrage() : SpellScriptLoader("spell_dru_enrage") { } - class spell_dru_enrage_SpellScript : public SpellScript + class spell_dru_enrage_AuraScript : public AuraScript { - PrepareSpellScript(spell_dru_enrage_SpellScript); + PrepareAuraScript(spell_dru_enrage_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_DRUID_KING_OF_THE_JUNGLE, SPELL_DRUID_ENRAGE_MOD_DAMAGE }); + return ValidateSpellInfo({ SPELL_DRUID_KING_OF_THE_JUNGLE, SPELL_DRUID_ENRAGE_MOD_DAMAGE, SPELL_DRUID_ENRAGED_DEFENSE, SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS }); } - void OnHit() + void RecalculateBaseArmor() { - if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_0)) - GetHitUnit()->CastCustomSpell(SPELL_DRUID_ENRAGE_MOD_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); + Unit::AuraEffectList const& auras = GetTarget()->GetAuraEffectsByType(SPELL_AURA_MOD_BASE_RESISTANCE_PCT); + for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) + { + SpellInfo const* spellInfo = (*i)->GetSpellInfo(); + // Dire- / Bear Form (Passive) + if (spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && spellInfo->SpellFamilyFlags.HasFlag(0x0, 0x0, 0x2)) + { + (*i)->RecalculateAmount(); + } + } + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (AuraEffect const* aurEff = target->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_0)) + { + target->CastCustomSpell(SPELL_DRUID_ENRAGE_MOD_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true); + } + + // Item - Druid T10 Feral 4P Bonus + if (target->HasAura(SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS)) + { + target->CastSpell(target, SPELL_DRUID_ENRAGED_DEFENSE, true); + } + + RecalculateBaseArmor(); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_ENRAGE_MOD_DAMAGE); + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_ENRAGED_DEFENSE); + + RecalculateBaseArmor(); } void Register() override { - AfterHit += SpellHitFn(spell_dru_enrage_SpellScript::OnHit); + AfterEffectApply += AuraEffectApplyFn(spell_dru_enrage_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_enrage_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE, AURA_EFFECT_HANDLE_REAL); } }; - SpellScript* GetSpellScript() const override + AuraScript* GetAuraScript() const override { - return new spell_dru_enrage_SpellScript(); + return new spell_dru_enrage_AuraScript(); } }; @@ -1408,6 +1498,7 @@ public: void AddSC_druid_spell_scripts() { + new spell_dru_bear_form_passive(); new spell_dru_t10_balance_4p_bonus(); new spell_dru_nurturing_instinct(); new spell_dru_feral_swiftness();