diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 18 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_druid.cpp | 66 | 
2 files changed, 66 insertions, 18 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 09658b3d9df..782dffff1a2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6305,24 +6305,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere                      return true;                  }              } -            // Eclipse -            if (dummySpell->SpellIconID == 2856 && GetTypeId() == TYPEID_PLAYER) -            { -                if (!procSpell || effIndex != 0) -                    return false; - -                bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1); - -                if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f))) -                    return false; - -                target = this; -                if (target->HasAura(isWrathSpell ? 48517 : 48518)) -                    return false; - -                triggered_spell_id = isWrathSpell ? 48518 : 48517; -                break; -            }              break;          }          case SPELLFAMILY_ROGUE: diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 05d58ea7b78..0bf5ab01f45 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -31,6 +31,8 @@ enum DruidSpells  {      SPELL_DRUID_BEAR_FORM_PASSIVE           = 1178,      SPELL_DRUID_DIRE_BEAR_FORM_PASSIVE      = 9635, +    SPELL_DRUID_ECLIPSE_LUNAR_PROC          = 48518, +    SPELL_DRUID_ECLIPSE_SOLAR_PROC          = 48517,      SPELL_DRUID_FORMS_TRINKET_BEAR          = 37340,      SPELL_DRUID_FORMS_TRINKET_CAT           = 37341,      SPELL_DRUID_FORMS_TRINKET_MOONKIN       = 37343, @@ -138,6 +140,69 @@ class spell_dru_dash : public SpellScriptLoader          }  }; +class spell_dru_eclipse : public SpellScriptLoader +{ +public: +    spell_dru_eclipse() : SpellScriptLoader("spell_dru_eclipse") { } + +    class spell_dru_eclipse_AuraScript : public AuraScript +    { +        PrepareAuraScript(spell_dru_eclipse_AuraScript); + +        bool Validate(SpellInfo const* /*spellInfo*/) override +        { +            if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_ECLIPSE_LUNAR_PROC)) +                return false; +            if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_ECLIPSE_SOLAR_PROC)) +                return false; +            return true; +        } + +        bool CheckProc(ProcEventInfo& eventInfo) +        { +            if (!eventInfo.GetSpellInfo()) +                return false; + +            if (eventInfo.GetActor()->HasAura(SPELL_DRUID_ECLIPSE_LUNAR_PROC) || eventInfo.GetActor()->HasAura(SPELL_DRUID_ECLIPSE_SOLAR_PROC)) +                return false; + +            // Triggered by Wrath? +            if (eventInfo.GetSpellInfo()->SpellFamilyFlags[0] & 1) +                return roll_chance_f(GetSpellInfo()->ProcChance * 0.6f) && _lunarProcCooldownEnd <= std::chrono::steady_clock::now(); + +            return _solarProcCooldownEnd <= std::chrono::steady_clock::now(); +        } + +        void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +        { +            if (eventInfo.GetSpellInfo()->SpellFamilyFlags[0] & 1) +            { +                _lunarProcCooldownEnd = std::chrono::steady_clock::now() + Seconds(aurEff->GetAmount()); +                eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_DRUID_ECLIPSE_LUNAR_PROC, TRIGGERED_FULL_MASK, nullptr, aurEff); +            } +            else +            { +                _solarProcCooldownEnd = std::chrono::steady_clock::now() + Seconds(aurEff->GetAmount()); +                eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_DRUID_ECLIPSE_SOLAR_PROC, TRIGGERED_FULL_MASK, nullptr, aurEff); +            } +        } + +        void Register() override +        { +            DoCheckProc += AuraCheckProcFn(spell_dru_eclipse_AuraScript::CheckProc); +            OnEffectProc += AuraEffectProcFn(spell_dru_eclipse_AuraScript::HandleProc, EFFECT_0, 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(); +    }; + +    AuraScript* GetAuraScript() const override +    { +        return new spell_dru_eclipse_AuraScript(); +    } +}; +  // 5229 - Enrage  class spell_dru_enrage : public SpellScriptLoader  { @@ -1371,6 +1436,7 @@ void AddSC_druid_spell_scripts()  {      new spell_dru_bear_form_passive();      new spell_dru_dash(); +    new spell_dru_eclipse();      new spell_dru_enrage();      new spell_dru_forms_trinket();      new spell_dru_glyph_of_starfire();  | 
