diff options
-rw-r--r-- | src/server/scripts/Spells/spell_druid.cpp | 1495 |
1 files changed, 622 insertions, 873 deletions
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index dcbf42e46c6..c26f9dadc17 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -99,87 +99,65 @@ enum MiscSpells }; // 22812 - Barkskin -class spell_dru_barkskin : public SpellScriptLoader +class spell_dru_barkskin : public AuraScript { - public: - spell_dru_barkskin() : SpellScriptLoader("spell_dru_barkskin") { } - - class spell_dru_barkskin_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_barkskin_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DRUID_BARKSKIN_01 }); - } + PrepareAuraScript(spell_dru_barkskin); - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_BARKSKIN_01); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_BARKSKIN_01 }); + } - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_barkskin_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); - } - }; + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_BARKSKIN_01); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_barkskin_AuraScript(); - } + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_barkskin::OnRemove, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + } }; // 1178 - Bear Form (Passive) // 9635 - Dire Bear Form (Passive) -class spell_dru_bear_form_passive : public SpellScriptLoader +class spell_dru_bear_form_passive : public AuraScript { - 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); + PrepareAuraScript(spell_dru_bear_form_passive); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( + 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 = -27; - break; - case SPELL_DRUID_DIRE_BEAR_FORM_PASSIVE: - mod = -16; - 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); - } - }; + 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; - AuraScript* GetAuraScript() const override - { - return new spell_dru_bear_form_passive_AuraScript(); + int32 mod = 0; + switch (GetId()) + { + case SPELL_DRUID_BEAR_FORM_PASSIVE: + mod = -27; + break; + case SPELL_DRUID_DIRE_BEAR_FORM_PASSIVE: + mod = -16; + break; + default: + return; } + amount += mod; + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_bear_form_passive::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_BASE_RESISTANCE_PCT); + } }; // 50334 - Berserk @@ -204,309 +182,254 @@ class spell_dru_berserk : public AuraScript }; // -1850 - Dash -class spell_dru_dash : public SpellScriptLoader +class spell_dru_dash : public AuraScript { - public: - spell_dru_dash() : SpellScriptLoader("spell_dru_dash") { } - - class spell_dru_dash_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_dash_AuraScript); + PrepareAuraScript(spell_dru_dash); - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // do not set speed if not in cat form - if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT) - amount = 0; - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED); - } - }; + void CalculateAmount(AuraEffect const* /*aurEff*/, int32 &amount, bool & /*canBeRecalculated*/) + { + // do not set speed if not in cat form + if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT) + amount = 0; + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_dash_AuraScript(); - } + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED); + } }; // -48516 - Eclipse -class spell_dru_eclipse : public SpellScriptLoader +class spell_dru_eclipse : public AuraScript { - public: - spell_dru_eclipse() : SpellScriptLoader("spell_dru_eclipse") { } - - class spell_dru_eclipse_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_eclipse_AuraScript); + PrepareAuraScript(spell_dru_eclipse); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - SPELL_DRUID_ECLIPSE_LUNAR_PROC, - SPELL_DRUID_ECLIPSE_SOLAR_PROC + SPELL_DRUID_ECLIPSE_LUNAR_PROC, + SPELL_DRUID_ECLIPSE_SOLAR_PROC }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (eventInfo.GetActor()->HasAura(SPELL_DRUID_ECLIPSE_LUNAR_PROC) || eventInfo.GetActor()->HasAura(SPELL_DRUID_ECLIPSE_SOLAR_PROC)) - return false; + } - return true; - } + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetActor()->HasAura(SPELL_DRUID_ECLIPSE_LUNAR_PROC) || eventInfo.GetActor()->HasAura(SPELL_DRUID_ECLIPSE_SOLAR_PROC)) + return false; - bool CheckSolar(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo || !(spellInfo->SpellFamilyFlags[0] & 4)) // Starfire - return false; + return true; + } - return _solarProcCooldownEnd <= GameTime::GetGameTimeSteadyPoint(); - } + bool CheckSolar(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || !(spellInfo->SpellFamilyFlags[0] & 4)) // Starfire + return false; - bool CheckLunar(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo || !(spellInfo->SpellFamilyFlags[0] & 1)) // Wrath - return false; + return _solarProcCooldownEnd <= GameTime::GetGameTimeSteadyPoint(); + } - // Reduced lunar proc chance (60% of normal) - if (!roll_chance_i(60)) - return false; + bool CheckLunar(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || !(spellInfo->SpellFamilyFlags[0] & 1)) // Wrath + return false; - return _lunarProcCooldownEnd <= GameTime::GetGameTimeSteadyPoint(); - } + // Reduced lunar proc chance (60% of normal) + if (!roll_chance_i(60)) + return false; - void ProcSolar(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + return _lunarProcCooldownEnd <= GameTime::GetGameTimeSteadyPoint(); + } - _solarProcCooldownEnd = GameTime::GetGameTimeSteadyPoint() + Seconds(30); - eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_DRUID_ECLIPSE_SOLAR_PROC, aurEff); - } + void ProcSolar(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - void ProcLunar(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + _solarProcCooldownEnd = GameTime::GetGameTimeSteadyPoint() + Seconds(30); + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_DRUID_ECLIPSE_SOLAR_PROC, aurEff); + } - _lunarProcCooldownEnd = GameTime::GetGameTimeSteadyPoint() + Seconds(30); - eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_DRUID_ECLIPSE_LUNAR_PROC, aurEff); - } + void ProcLunar(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dru_eclipse_AuraScript::CheckProc); + _lunarProcCooldownEnd = GameTime::GetGameTimeSteadyPoint() + Seconds(30); + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_DRUID_ECLIPSE_LUNAR_PROC, aurEff); + } - DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_eclipse_AuraScript::CheckSolar, EFFECT_0, SPELL_AURA_DUMMY); - DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_eclipse_AuraScript::CheckLunar, EFFECT_1, SPELL_AURA_DUMMY); + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dru_eclipse::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dru_eclipse_AuraScript::ProcSolar, EFFECT_0, SPELL_AURA_DUMMY); - OnEffectProc += AuraEffectProcFn(spell_dru_eclipse_AuraScript::ProcLunar, EFFECT_1, SPELL_AURA_DUMMY); - } + DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_eclipse::CheckSolar, EFFECT_0, SPELL_AURA_DUMMY); + DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_eclipse::CheckLunar, EFFECT_1, SPELL_AURA_DUMMY); - std::chrono::steady_clock::time_point _lunarProcCooldownEnd = std::chrono::steady_clock::time_point::min(); - std::chrono::steady_clock::time_point _solarProcCooldownEnd = std::chrono::steady_clock::time_point::min(); - }; + OnEffectProc += AuraEffectProcFn(spell_dru_eclipse::ProcSolar, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_dru_eclipse::ProcLunar, EFFECT_1, SPELL_AURA_DUMMY); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_eclipse_AuraScript(); - } + std::chrono::steady_clock::time_point _lunarProcCooldownEnd = std::chrono::steady_clock::time_point::min(); + std::chrono::steady_clock::time_point _solarProcCooldownEnd = std::chrono::steady_clock::time_point::min(); }; // 5229 - Enrage -class spell_dru_enrage : public SpellScriptLoader +class spell_dru_enrage : public AuraScript { - public: - spell_dru_enrage() : SpellScriptLoader("spell_dru_enrage") { } - - class spell_dru_enrage_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_enrage_AuraScript); + PrepareAuraScript(spell_dru_enrage); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - SPELL_DRUID_KING_OF_THE_JUNGLE, - SPELL_DRUID_ENRAGE_MOD_DAMAGE, - SPELL_DRUID_ENRAGED_DEFENSE, - SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS + SPELL_DRUID_KING_OF_THE_JUNGLE, + SPELL_DRUID_ENRAGE_MOD_DAMAGE, + SPELL_DRUID_ENRAGED_DEFENSE, + SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS }); - } - - void RecalculateBaseArmor() - { - // Recalculate modifies the list while we're iterating through it, so let's copy it instead - Unit::AuraEffectList const& auras = GetTarget()->GetAuraEffectsByType(SPELL_AURA_MOD_BASE_RESISTANCE_PCT); - std::vector<AuraEffect*> aurEffs(auras.begin(), auras.end()); + } - for (AuraEffect* aurEff : aurEffs) - { - SpellInfo const* spellInfo = aurEff->GetSpellInfo(); - // Dire- / Bear Form (Passive) - if (spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && spellInfo->SpellFamilyFlags.HasFlag(0x0, 0x0, 0x2)) - aurEff->RecalculateAmount(); - } - } + void RecalculateBaseArmor() + { + // Recalculate modifies the list while we're iterating through it, so let's copy it instead + Unit::AuraEffectList const& auras = GetTarget()->GetAuraEffectsByType(SPELL_AURA_MOD_BASE_RESISTANCE_PCT); + std::vector<AuraEffect*> aurEffs(auras.begin(), auras.end()); - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (AuraEffect const* aurEff = target->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_0)) - { - CastSpellExtraArgs args(TRIGGERED_FULL_MASK); - args.AddSpellBP0(aurEff->GetAmount()); - target->CastSpell(target, SPELL_DRUID_ENRAGE_MOD_DAMAGE, args); - } + for (AuraEffect* aurEff : aurEffs) + { + SpellInfo const* spellInfo = aurEff->GetSpellInfo(); + // Dire- / Bear Form (Passive) + if (spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && spellInfo->SpellFamilyFlags.HasFlag(0x0, 0x0, 0x2)) + aurEff->RecalculateAmount(); + } + } - // Item - Druid T10 Feral 4P Bonus - if (target->HasAura(SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS)) - target->CastSpell(target, SPELL_DRUID_ENRAGED_DEFENSE, true); + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (AuraEffect const* aurEff = target->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_0)) + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.AddSpellBP0(aurEff->GetAmount()); + target->CastSpell(target, SPELL_DRUID_ENRAGE_MOD_DAMAGE, args); + } - RecalculateBaseArmor(); - } + // Item - Druid T10 Feral 4P Bonus + if (target->HasAura(SPELL_DRUID_ITEM_T10_FERAL_4P_BONUS)) + target->CastSpell(target, SPELL_DRUID_ENRAGED_DEFENSE, true); - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_ENRAGE_MOD_DAMAGE); - GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_ENRAGED_DEFENSE); + RecalculateBaseArmor(); + } - RecalculateBaseArmor(); - } + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_ENRAGE_MOD_DAMAGE); + GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_ENRAGED_DEFENSE); - void Register() override - { - 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); - } - }; + RecalculateBaseArmor(); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_enrage_AuraScript(); - } + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_enrage::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_enrage::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE, AURA_EFFECT_HANDLE_REAL); + } }; // 37336 - Druid Forms Trinket -class spell_dru_forms_trinket : public SpellScriptLoader +class spell_dru_forms_trinket : public AuraScript { -public: - spell_dru_forms_trinket() : SpellScriptLoader("spell_dru_forms_trinket") { } + PrepareAuraScript(spell_dru_forms_trinket); - class spell_dru_forms_trinket_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_dru_forms_trinket_AuraScript); + return ValidateSpellInfo( + { + SPELL_DRUID_FORMS_TRINKET_BEAR, + SPELL_DRUID_FORMS_TRINKET_CAT, + SPELL_DRUID_FORMS_TRINKET_MOONKIN, + SPELL_DRUID_FORMS_TRINKET_NONE, + SPELL_DRUID_FORMS_TRINKET_TREE + }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_DRUID_FORMS_TRINKET_BEAR, - SPELL_DRUID_FORMS_TRINKET_CAT, - SPELL_DRUID_FORMS_TRINKET_MOONKIN, - SPELL_DRUID_FORMS_TRINKET_NONE, - SPELL_DRUID_FORMS_TRINKET_TREE - }); - } + bool CheckProc(ProcEventInfo& eventInfo) + { + Unit* target = eventInfo.GetActor(); - bool CheckProc(ProcEventInfo& eventInfo) + switch (target->GetShapeshiftForm()) { - Unit* target = eventInfo.GetActor(); - - switch (target->GetShapeshiftForm()) - { - case FORM_BEAR: - case FORM_DIREBEAR: - case FORM_CAT: - case FORM_MOONKIN: - case FORM_NONE: - case FORM_TREE: - return true; - default: - break; - } - - return false; + case FORM_BEAR: + case FORM_DIREBEAR: + case FORM_CAT: + case FORM_MOONKIN: + case FORM_NONE: + case FORM_TREE: + return true; + default: + break; } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* target = eventInfo.GetActor(); - uint32 triggerspell = 0; - - switch (target->GetShapeshiftForm()) - { - case FORM_BEAR: - case FORM_DIREBEAR: - triggerspell = SPELL_DRUID_FORMS_TRINKET_BEAR; - break; - case FORM_CAT: - triggerspell = SPELL_DRUID_FORMS_TRINKET_CAT; - break; - case FORM_MOONKIN: - triggerspell = SPELL_DRUID_FORMS_TRINKET_MOONKIN; - break; - case FORM_NONE: - triggerspell = SPELL_DRUID_FORMS_TRINKET_NONE; - break; - case FORM_TREE: - triggerspell = SPELL_DRUID_FORMS_TRINKET_TREE; - break; - default: - return; - } + return false; + } - target->CastSpell(target, triggerspell, aurEff); + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* target = eventInfo.GetActor(); + uint32 triggerspell = 0; + + switch (target->GetShapeshiftForm()) + { + case FORM_BEAR: + case FORM_DIREBEAR: + triggerspell = SPELL_DRUID_FORMS_TRINKET_BEAR; + break; + case FORM_CAT: + triggerspell = SPELL_DRUID_FORMS_TRINKET_CAT; + break; + case FORM_MOONKIN: + triggerspell = SPELL_DRUID_FORMS_TRINKET_MOONKIN; + break; + case FORM_NONE: + triggerspell = SPELL_DRUID_FORMS_TRINKET_NONE; + break; + case FORM_TREE: + triggerspell = SPELL_DRUID_FORMS_TRINKET_TREE; + break; + default: + return; } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dru_forms_trinket_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dru_forms_trinket_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; + target->CastSpell(target, triggerspell, aurEff); + } - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dru_forms_trinket_AuraScript(); + DoCheckProc += AuraCheckProcFn(spell_dru_forms_trinket::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_forms_trinket::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; // -33943 - Flight Form -class spell_dru_flight_form : public SpellScriptLoader +class spell_dru_flight_form : public SpellScript { - public: - spell_dru_flight_form() : SpellScriptLoader("spell_dru_flight_form") { } - - class spell_dru_flight_form_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_flight_form_SpellScript); - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->IsInDisallowedMountForm()) - return SPELL_FAILED_NOT_SHAPESHIFT; + PrepareSpellScript(spell_dru_flight_form); - return SPELL_CAST_OK; - } + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (caster->IsInDisallowedMountForm()) + return SPELL_FAILED_NOT_SHAPESHIFT; - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_dru_flight_form_SpellScript::CheckCast); - } - }; + return SPELL_CAST_OK; + } - SpellScript* GetSpellScript() const override - { - return new spell_dru_flight_form_SpellScript(); - } + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_dru_flight_form::CheckCast); + } }; // 22842 - Frenzied Regeneration @@ -545,705 +468,531 @@ class spell_dru_frenzied_regeneration : public AuraScript }; // 63057 - Glyph of Barkskin -class spell_dru_glyph_of_barkskin : public SpellScriptLoader +class spell_dru_glyph_of_barkskin : public AuraScript { - public: - spell_dru_glyph_of_barkskin() : SpellScriptLoader("spell_dru_glyph_of_barkskin") { } - - class spell_dru_glyph_of_barkskin_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_glyph_of_barkskin_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DRUID_BARKSKIN_01 }); - } + PrepareAuraScript(spell_dru_glyph_of_barkskin); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(nullptr, SPELL_DRUID_BARKSKIN_01, aurEff); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_BARKSKIN_01 }); + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_barkskin_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(nullptr, SPELL_DRUID_BARKSKIN_01, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_glyph_of_barkskin_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_barkskin::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 54832 - Glyph of Innervate -class spell_dru_glyph_of_innervate : public SpellScriptLoader +class spell_dru_glyph_of_innervate : public AuraScript { - public: - spell_dru_glyph_of_innervate() : SpellScriptLoader("spell_dru_glyph_of_innervate") { } - - class spell_dru_glyph_of_innervate_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_glyph_of_innervate_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN }); - } + PrepareAuraScript(spell_dru_glyph_of_innervate); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN }); + } - Unit* caster = eventInfo.GetActor(); - SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN); - int32 amount = CalculatePct(static_cast<int32>(caster->GetCreatePowerValue(POWER_MANA)), aurEff->GetAmount()); + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - ASSERT(spellInfo->GetMaxTicks() > 0); - amount /= spellInfo->GetMaxTicks(); + Unit* caster = eventInfo.GetActor(); + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN); + int32 amount = CalculatePct(static_cast<int32>(caster->GetCreatePowerValue(POWER_MANA)), aurEff->GetAmount()); - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(amount); - caster->CastSpell(nullptr, SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN, args); - } + ASSERT(spellInfo->GetMaxTicks() > 0); + amount /= spellInfo->GetMaxTicks(); - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_innervate_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(amount); + caster->CastSpell(nullptr, SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN, args); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_glyph_of_innervate_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_innervate::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 54821 - Glyph of Rake -class spell_dru_glyph_of_rake : public SpellScriptLoader +class spell_dru_glyph_of_rake : public AuraScript { - public: - spell_dru_glyph_of_rake() : SpellScriptLoader("spell_dru_glyph_of_rake") { } + PrepareAuraScript(spell_dru_glyph_of_rake); - class spell_dru_glyph_of_rake_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_glyph_of_rake_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget()->GetTypeId() == TYPEID_UNIT; - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED }); + } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED, aurEff); - } + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget()->GetTypeId() == TYPEID_UNIT; + } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dru_glyph_of_rake_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_rake_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_glyph_of_rake_AuraScript(); - } + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dru_glyph_of_rake::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_rake::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 54754 - Glyph of Rejuvenation -class spell_dru_glyph_of_rejuvenation : public SpellScriptLoader +class spell_dru_glyph_of_rejuvenation : public AuraScript { - public: - spell_dru_glyph_of_rejuvenation() : SpellScriptLoader("spell_dru_glyph_of_rejuvenation") { } + PrepareAuraScript(spell_dru_glyph_of_rejuvenation); - class spell_dru_glyph_of_rejuvenation_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_glyph_of_rejuvenation_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget()->HealthBelowPct(50); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL }); + } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget()->HealthBelowPct(50); + } - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount())); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL, args); - } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dru_glyph_of_rejuvenation_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_rejuvenation_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount())); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL, args); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_glyph_of_rejuvenation_AuraScript(); - } + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dru_glyph_of_rejuvenation::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_rejuvenation::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 54815 - Glyph of Shred -class spell_dru_glyph_of_shred : public SpellScriptLoader +class spell_dru_glyph_of_shred : public AuraScript { - public: - spell_dru_glyph_of_shred() : SpellScriptLoader("spell_dru_glyph_of_shred") { } + PrepareAuraScript(spell_dru_glyph_of_shred); - class spell_dru_glyph_of_shred_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_glyph_of_shred_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - SPELL_DRUID_GLYPH_OF_RIP, - SPELL_DRUID_RIP_DURATION_LACERATE_DMG + SPELL_DRUID_GLYPH_OF_RIP, + SPELL_DRUID_RIP_DURATION_LACERATE_DMG }); - } + } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - Unit* caster = eventInfo.GetActor(); - // try to find spell Rip on the target - if (AuraEffect const* rip = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, caster->GetGUID())) - { - // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip - uint32 countMin = rip->GetBase()->GetMaxDuration(); + Unit* caster = eventInfo.GetActor(); + // try to find spell Rip on the target + if (AuraEffect const* rip = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, caster->GetGUID())) + { + // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip + uint32 countMin = rip->GetBase()->GetMaxDuration(); - // just Rip's max duration without other spells - uint32 countMax = rip->GetSpellInfo()->GetMaxDuration(); + // just Rip's max duration without other spells + uint32 countMax = rip->GetSpellInfo()->GetMaxDuration(); - // add possible auras' and Glyph of Shred's max duration - countMax += 3 * aurEff->GetAmount() * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds - countMax += caster->HasAura(SPELL_DRUID_GLYPH_OF_RIP) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds - countMax += caster->HasAura(SPELL_DRUID_RIP_DURATION_LACERATE_DMG) ? 4 * IN_MILLISECONDS : 0; // T7 set bonus -> +4 seconds + // add possible auras' and Glyph of Shred's max duration + countMax += 3 * aurEff->GetAmount() * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds + countMax += caster->HasAura(SPELL_DRUID_GLYPH_OF_RIP) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds + countMax += caster->HasAura(SPELL_DRUID_RIP_DURATION_LACERATE_DMG) ? 4 * IN_MILLISECONDS : 0; // T7 set bonus -> +4 seconds - // if min < max -> that means caster didn't cast 3 shred yet - // so set Rip's duration and max duration - if (countMin < countMax) - { - rip->GetBase()->SetDuration(rip->GetBase()->GetDuration() + aurEff->GetAmount() * IN_MILLISECONDS); - rip->GetBase()->SetMaxDuration(countMin + aurEff->GetAmount() * IN_MILLISECONDS); - } - } - } - - void Register() override + // if min < max -> that means caster didn't cast 3 shred yet + // so set Rip's duration and max duration + if (countMin < countMax) { - OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_shred_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + rip->GetBase()->SetDuration(rip->GetBase()->GetDuration() + aurEff->GetAmount() * IN_MILLISECONDS); + rip->GetBase()->SetMaxDuration(countMin + aurEff->GetAmount() * IN_MILLISECONDS); } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_dru_glyph_of_shred_AuraScript(); } + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_shred::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 54846 - Glyph of Starfire -class spell_dru_glyph_of_starfire : public SpellScriptLoader +class spell_dru_glyph_of_starfire : public SpellScript { - public: - spell_dru_glyph_of_starfire() : SpellScriptLoader("spell_dru_glyph_of_starfire") { } + PrepareSpellScript(spell_dru_glyph_of_starfire); - class spell_dru_glyph_of_starfire_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_glyph_of_starfire_SpellScript); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_INCREASED_MOONFIRE_DURATION, SPELL_DRUID_NATURES_SPLENDOR }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) + { + if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00000002, 0, 0, caster->GetGUID())) { - return ValidateSpellInfo({ SPELL_DRUID_INCREASED_MOONFIRE_DURATION, SPELL_DRUID_NATURES_SPLENDOR }); - } + Aura* aura = aurEff->GetBase(); - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) + uint32 countMin = aura->GetMaxDuration(); + uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000; + if (caster->HasAura(SPELL_DRUID_INCREASED_MOONFIRE_DURATION)) + countMax += 3000; + if (caster->HasAura(SPELL_DRUID_NATURES_SPLENDOR)) + countMax += 3000; + + if (countMin < countMax) { - if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00000002, 0, 0, caster->GetGUID())) - { - Aura* aura = aurEff->GetBase(); - - uint32 countMin = aura->GetMaxDuration(); - uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000; - if (caster->HasAura(SPELL_DRUID_INCREASED_MOONFIRE_DURATION)) - countMax += 3000; - if (caster->HasAura(SPELL_DRUID_NATURES_SPLENDOR)) - countMax += 3000; - - if (countMin < countMax) - { - aura->SetDuration(uint32(aura->GetDuration() + 3000)); - aura->SetMaxDuration(countMin + 3000); - } - } + aura->SetDuration(uint32(aura->GetDuration() + 3000)); + aura->SetMaxDuration(countMin + 3000); } } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dru_glyph_of_starfire_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dru_glyph_of_starfire_SpellScript(); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dru_glyph_of_starfire::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 54845 - Glyph of Starfire -class spell_dru_glyph_of_starfire_dummy : public SpellScriptLoader +class spell_dru_glyph_of_starfire_dummy : public AuraScript { - public: - spell_dru_glyph_of_starfire_dummy() : SpellScriptLoader("spell_dru_glyph_of_starfire_dummy") { } - - class spell_dru_glyph_of_starfire_dummy_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_glyph_of_starfire_dummy_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT }); - } + PrepareAuraScript(spell_dru_glyph_of_starfire_dummy); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT, aurEff); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT }); + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_starfire_dummy_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_glyph_of_starfire_dummy_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_starfire_dummy::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 34246 - Idol of the Emerald Queen // 60779 - Idol of Lush Moss -class spell_dru_idol_lifebloom : public SpellScriptLoader +class spell_dru_idol_lifebloom : public AuraScript { - public: - spell_dru_idol_lifebloom() : SpellScriptLoader("spell_dru_idol_lifebloom") { } - - class spell_dru_idol_lifebloom_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_idol_lifebloom_AuraScript); + PrepareAuraScript(spell_dru_idol_lifebloom); - void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) - { - if (!spellMod) - { - spellMod = new SpellModifier(GetAura()); - spellMod->op = SPELLMOD_DOT; - spellMod->type = SPELLMOD_FLAT; - spellMod->spellId = GetId(); - spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; - } - spellMod->value = aurEff->GetAmount() / 7; - } - - void Register() override - { - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dru_idol_lifebloom_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) + { + if (!spellMod) { - return new spell_dru_idol_lifebloom_AuraScript(); + spellMod = new SpellModifier(GetAura()); + spellMod->op = SPELLMOD_DOT; + spellMod->type = SPELLMOD_FLAT; + spellMod->spellId = GetId(); + spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; } + spellMod->value = aurEff->GetAmount() / 7; + } + + void Register() override + { + DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dru_idol_lifebloom::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 29166 - Innervate -class spell_dru_innervate : public SpellScriptLoader +class spell_dru_innervate : public AuraScript { - public: - spell_dru_innervate() : SpellScriptLoader("spell_dru_innervate") { } + PrepareAuraScript(spell_dru_innervate); - class spell_dru_innervate_AuraScript : public AuraScript + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + if (!aurEff->GetTotalTicks()) { - PrepareAuraScript(spell_dru_innervate_AuraScript); - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) - { - if (!aurEff->GetTotalTicks()) - { - amount = 0; - return; - } - - if (Unit* caster = GetCaster()) - amount = int32(CalculatePct(caster->GetCreatePowerValue(POWER_MANA), amount) / aurEff->GetTotalTicks()); - else - amount = 0; - } + amount = 0; + return; + } - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_innervate_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); - } - }; + if (Unit* caster = GetCaster()) + amount = int32(CalculatePct(caster->GetCreatePowerValue(POWER_MANA), amount) / aurEff->GetTotalTicks()); + else + amount = 0; + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_innervate_AuraScript(); - } + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_innervate::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); + } }; // -5570 - Insect Swarm -class spell_dru_insect_swarm : public SpellScriptLoader +class spell_dru_insect_swarm : public AuraScript { - public: - spell_dru_insect_swarm() : SpellScriptLoader("spell_dru_insect_swarm") { } + PrepareAuraScript(spell_dru_insect_swarm); - class spell_dru_insect_swarm_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_insect_swarm_AuraScript); - - void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) - { - if (!aurEff->GetTotalTicks()) - return; - - if (Unit* caster = GetCaster()) - if (AuraEffect const* relicAurEff = caster->GetAuraEffect(SPELL_DRUID_ITEM_T8_BALANCE_RELIC, EFFECT_0)) - amount += relicAurEff->GetAmount() / aurEff->GetTotalTicks(); - } + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + if (!aurEff->GetTotalTicks()) + return; - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; + if (Unit* caster = GetCaster()) + if (AuraEffect const* relicAurEff = caster->GetAuraEffect(SPELL_DRUID_ITEM_T8_BALANCE_RELIC, EFFECT_0)) + amount += relicAurEff->GetAmount() / aurEff->GetTotalTicks(); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_insect_swarm_AuraScript(); - } + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm::CalculateAmount, EFFECT_0,SPELL_AURA_PERIODIC_DAMAGE); + } }; // 24932 - Leader of the Pack -class spell_dru_leader_of_the_pack : public SpellScriptLoader +class spell_dru_leader_of_the_pack : public AuraScript { - public: - spell_dru_leader_of_the_pack() : SpellScriptLoader("spell_dru_leader_of_the_pack") { } - - class spell_dru_leader_of_the_pack_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_leader_of_the_pack_AuraScript); + PrepareAuraScript(spell_dru_leader_of_the_pack); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - SPELL_DRUID_IMP_LEADER_OF_THE_PACK_R1, - SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL, - SPELL_DRUID_IMP_LEADER_OF_THE_PACK_MANA + SPELL_DRUID_IMP_LEADER_OF_THE_PACK_R1, + SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL, + SPELL_DRUID_IMP_LEADER_OF_THE_PACK_MANA }); - } + } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - if (!aurEff->GetAmount()) - return; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + if (!aurEff->GetAmount()) + return; - Unit* caster = eventInfo.GetActor(); - if (caster->GetSpellHistory()->HasCooldown(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL)) - return; + Unit* caster = eventInfo.GetActor(); + if (caster->GetSpellHistory()->HasCooldown(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL)) + return; - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(caster->CountPctFromMaxHealth(aurEff->GetAmount())); - caster->CastSpell(nullptr, SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL, args); + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(caster->CountPctFromMaxHealth(aurEff->GetAmount())); + caster->CastSpell(nullptr, SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL, args); - // Because of how proc system works, we can't store proc cd on db, it would be applied to entire aura - // so aura could only proc once per 6 seconds, independently of caster - caster->GetSpellHistory()->AddCooldown(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL, 0, Seconds(6)); + // Because of how proc system works, we can't store proc cd on db, it would be applied to entire aura + // so aura could only proc once per 6 seconds, independently of caster + caster->GetSpellHistory()->AddCooldown(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL, 0, Seconds(6)); - // only proc on self - if (aurEff->GetCasterGUID() != caster->GetGUID()) - return; + // only proc on self + if (aurEff->GetCasterGUID() != caster->GetGUID()) + return; - AuraEffect const* impLotpMana = caster->GetAuraEffectOfRankedSpell(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_R1, EFFECT_0, aurEff->GetCasterGUID()); + AuraEffect const* impLotpMana = caster->GetAuraEffectOfRankedSpell(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_R1, EFFECT_0, aurEff->GetCasterGUID()); ASSERT(impLotpMana); - CastSpellExtraArgs args2(aurEff); - args2.AddSpellBP0(CalculatePct(caster->GetMaxPower(POWER_MANA), impLotpMana->GetSpellInfo()->Effects[EFFECT_1].CalcValue())); - caster->CastSpell(nullptr, SPELL_DRUID_IMP_LEADER_OF_THE_PACK_MANA, args2); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dru_leader_of_the_pack_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; + CastSpellExtraArgs args2(aurEff); + args2.AddSpellBP0(CalculatePct(caster->GetMaxPower(POWER_MANA), impLotpMana->GetSpellInfo()->Effects[EFFECT_1].CalcValue())); + caster->CastSpell(nullptr, SPELL_DRUID_IMP_LEADER_OF_THE_PACK_MANA, args2); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_leader_of_the_pack_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_leader_of_the_pack::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } }; // -33763 - Lifebloom -class spell_dru_lifebloom : public SpellScriptLoader +class spell_dru_lifebloom : public AuraScript { - public: - spell_dru_lifebloom() : SpellScriptLoader("spell_dru_lifebloom") { } + PrepareAuraScript(spell_dru_lifebloom); - class spell_dru_lifebloom_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_lifebloom_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo( + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( { - SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, - SPELL_DRUID_LIFEBLOOM_ENERGIZE + SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, + SPELL_DRUID_LIFEBLOOM_ENERGIZE }); - } - - void OnRemoveEffect(Unit* target, AuraEffect const* aurEff, uint32 stack) - { - int32 healAmount = aurEff->GetAmount(); - if (Unit* caster = GetCaster()) - { - // restore mana - CastSpellExtraArgs args(aurEff); - args.OriginalCaster = GetCasterGUID(); - args.AddSpellBP0(CalculatePct(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * stack / 2); - caster->CastSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, args); - } + } - CastSpellExtraArgs args(aurEff); - args.OriginalCaster = GetCasterGUID(); - args.AddSpellBP0(healAmount); - target->CastSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, args); - } + void OnRemoveEffect(Unit* target, AuraEffect const* aurEff, uint32 stack) + { + int32 healAmount = aurEff->GetAmount(); + if (Unit* caster = GetCaster()) + { + // restore mana + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = GetCasterGUID(); + args.AddSpellBP0(CalculatePct(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * stack / 2); + caster->CastSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, args); + } - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // Final heal only on duration end - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = GetCasterGUID(); + args.AddSpellBP0(healAmount); + target->CastSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, args); + } - // final heal - OnRemoveEffect(GetUnitOwner(), aurEff, GetStackAmount()); - } + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // Final heal only on duration end + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; - void HandleDispel(DispelInfo* dispelInfo) - { - if (Unit* target = GetUnitOwner()) - if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) - OnRemoveEffect(target, aurEff, dispelInfo->GetRemovedCharges()); // final heal - } + // final heal + OnRemoveEffect(GetUnitOwner(), aurEff, GetStackAmount()); + } - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterDispel += AuraDispelFn(spell_dru_lifebloom_AuraScript::HandleDispel); - } - }; + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* target = GetUnitOwner()) + if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) + OnRemoveEffect(target, aurEff, dispelInfo->GetRemovedCharges()); // final heal + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_lifebloom_AuraScript(); - } + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterDispel += AuraDispelFn(spell_dru_lifebloom::HandleDispel); + } }; // -48496 - Living Seed -class spell_dru_living_seed : public SpellScriptLoader +class spell_dru_living_seed : public AuraScript { - public: - spell_dru_living_seed() : SpellScriptLoader("spell_dru_living_seed") { } + PrepareAuraScript(spell_dru_living_seed); - class spell_dru_living_seed_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_living_seed_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DRUID_LIVING_SEED_PROC }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({SPELL_DRUID_LIVING_SEED_PROC}); + } - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount())); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_LIVING_SEED_PROC, args); - } + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount())); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_LIVING_SEED_PROC, args); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_living_seed_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_living_seed::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 48504 - Living Seed (Proc) -class spell_dru_living_seed_proc : public SpellScriptLoader +class spell_dru_living_seed_proc : public AuraScript { - public: - spell_dru_living_seed_proc() : SpellScriptLoader("spell_dru_living_seed_proc") { } + PrepareAuraScript(spell_dru_living_seed_proc); - class spell_dru_living_seed_proc_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_living_seed_proc_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DRUID_LIVING_SEED_HEAL }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(aurEff->GetAmount()); - GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_LIVING_SEED_HEAL, args); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({SPELL_DRUID_LIVING_SEED_HEAL}); + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(aurEff->GetAmount()); + GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_LIVING_SEED_HEAL, args); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_living_seed_proc_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_proc::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 69366 - Moonkin Form passive -class spell_dru_moonkin_form_passive : public SpellScriptLoader +class spell_dru_moonkin_form_passive : public AuraScript { - public: - spell_dru_moonkin_form_passive() : SpellScriptLoader("spell_dru_moonkin_form_passive") { } - - class spell_dru_moonkin_form_passive_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_moonkin_form_passive_AuraScript); - - public: - spell_dru_moonkin_form_passive_AuraScript() - { - absorbPct = 0; - } + PrepareAuraScript(spell_dru_moonkin_form_passive); - private: - uint32 absorbPct; +public: + spell_dru_moonkin_form_passive() + { + absorbPct = 0; + } - bool Load() override - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } +private: + uint32 absorbPct; - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } + bool Load() override + { + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; + } - void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) - { - // reduces all damage taken while Stunned in Moonkin Form - if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<<MECHANIC_STUN)) - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_moonkin_form_passive_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dru_moonkin_form_passive_AuraScript::Absorb, EFFECT_0); - } - }; + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // reduces all damage taken while Stunned in Moonkin Form + if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && + GetTarget()->HasAuraWithMechanic(1 << MECHANIC_STUN)) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_moonkin_form_passive_AuraScript(); - } + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_moonkin_form_passive::CalculateAmount, EFFECT_0, + SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dru_moonkin_form_passive::Absorb, EFFECT_0); + } }; // 16864 - Omen of Clarity -class spell_dru_omen_of_clarity : public SpellScriptLoader +class spell_dru_omen_of_clarity : public AuraScript { - public: - spell_dru_omen_of_clarity() : SpellScriptLoader("spell_dru_omen_of_clarity") { } + PrepareAuraScript(spell_dru_omen_of_clarity); - class spell_dru_omen_of_clarity_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_omen_of_clarity_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - SPELL_DRUID_BALANCE_T10_BONUS, - SPELL_DRUID_BALANCE_T10_BONUS_PROC + SPELL_DRUID_BALANCE_T10_BONUS, + SPELL_DRUID_BALANCE_T10_BONUS_PROC }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - Unit* target = GetTarget(); - if (target->HasAura(SPELL_DRUID_BALANCE_T10_BONUS)) - target->CastSpell(nullptr, SPELL_DRUID_BALANCE_T10_BONUS_PROC, aurEff); - } + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dru_omen_of_clarity_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + Unit* target = GetTarget(); + if (target->HasAura(SPELL_DRUID_BALANCE_T10_BONUS)) + target->CastSpell(nullptr, SPELL_DRUID_BALANCE_T10_BONUS_PROC, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_dru_omen_of_clarity_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_omen_of_clarity::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } }; // 48391 - Owlkin Frenzy @@ -2379,31 +2128,31 @@ class spell_dru_wild_growth : public SpellScriptLoader void AddSC_druid_spell_scripts() { - new spell_dru_barkskin(); - new spell_dru_bear_form_passive(); + RegisterAuraScript(spell_dru_barkskin); + RegisterAuraScript(spell_dru_bear_form_passive); RegisterAuraScript(spell_dru_berserk); - new spell_dru_dash(); - new spell_dru_eclipse(); - new spell_dru_enrage(); - new spell_dru_forms_trinket(); - new spell_dru_flight_form(); + RegisterAuraScript(spell_dru_dash); + RegisterAuraScript(spell_dru_eclipse); + RegisterAuraScript(spell_dru_enrage); + RegisterAuraScript(spell_dru_forms_trinket); + RegisterSpellScript(spell_dru_flight_form); RegisterAuraScript(spell_dru_frenzied_regeneration); - new spell_dru_glyph_of_barkskin(); - new spell_dru_glyph_of_innervate(); - new spell_dru_glyph_of_rake(); - new spell_dru_glyph_of_rejuvenation(); - new spell_dru_glyph_of_shred(); - new spell_dru_glyph_of_starfire(); - new spell_dru_glyph_of_starfire_dummy(); - new spell_dru_idol_lifebloom(); - new spell_dru_innervate(); - new spell_dru_insect_swarm(); - new spell_dru_leader_of_the_pack(); - new spell_dru_lifebloom(); - new spell_dru_living_seed(); - new spell_dru_living_seed_proc(); - new spell_dru_moonkin_form_passive(); - new spell_dru_omen_of_clarity(); + RegisterAuraScript(spell_dru_glyph_of_barkskin); + RegisterAuraScript(spell_dru_glyph_of_innervate); + RegisterAuraScript(spell_dru_glyph_of_rake); + RegisterAuraScript(spell_dru_glyph_of_rejuvenation); + RegisterAuraScript(spell_dru_glyph_of_shred); + RegisterSpellScript(spell_dru_glyph_of_starfire); + RegisterAuraScript(spell_dru_glyph_of_starfire_dummy); + RegisterAuraScript(spell_dru_idol_lifebloom); + RegisterAuraScript(spell_dru_innervate); + RegisterAuraScript(spell_dru_insect_swarm); + RegisterAuraScript(spell_dru_leader_of_the_pack); + RegisterAuraScript(spell_dru_lifebloom); + RegisterAuraScript(spell_dru_living_seed); + RegisterAuraScript(spell_dru_living_seed_proc); + RegisterAuraScript(spell_dru_moonkin_form_passive); + RegisterAuraScript(spell_dru_omen_of_clarity); new spell_dru_owlkin_frenzy(); new spell_dru_predatory_strikes(); new spell_dru_primal_tenacity(); |