diff options
-rw-r--r-- | sql/updates/world/master/2023_08_13_02_world.sql | 8 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_druid.cpp | 87 |
2 files changed, 95 insertions, 0 deletions
diff --git a/sql/updates/world/master/2023_08_13_02_world.sql b/sql/updates/world/master/2023_08_13_02_world.sql new file mode 100644 index 00000000000..c4f93aa8dbe --- /dev/null +++ b/sql/updates/world/master/2023_08_13_02_world.sql @@ -0,0 +1,8 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (392315); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(392315,0x00,7,0x00000010,0x00000000,0x00000000,0x00000000,0x0,0x0,0x2,0x2,0x403,0x0,0x0,0,0,0,0); -- Luxuriant Soil + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_dru_luxuriant_soil', 'spell_dru_germination'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(774, 'spell_dru_germination'), +(392315, 'spell_dru_luxuriant_soil'); diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 70fe5014d81..6eb88b3e76d 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -22,8 +22,10 @@ */ #include "ScriptMgr.h" +#include "CellImpl.h" #include "Containers.h" #include "DB2Stores.h" +#include "GridNotifiersImpl.h" #include "Player.h" #include "Spell.h" #include "SpellAuraEffects.h" @@ -72,6 +74,7 @@ enum DruidSpells SPELL_DRUID_FORMS_TRINKET_NONE = 37344, SPELL_DRUID_FORMS_TRINKET_TREE = 37342, SPELL_DRUID_GALACTIC_GUARDIAN_AURA = 213708, + SPELL_DRUID_GERMINATION = 155675, SPELL_DRUID_GLYPH_OF_STARS = 114301, SPELL_DRUID_GLYPH_OF_STARS_VISUAL = 114302, SPELL_DRUID_GORE_PROC = 93622, @@ -91,6 +94,8 @@ enum DruidSpells SPELL_DRUID_MASS_ENTANGLEMENT = 102359, SPELL_DRUID_MOONFIRE_DAMAGE = 164812, SPELL_DRUID_PROWL = 5215, + SPELL_DRUID_REJUVENATION = 774, + SPELL_DRUID_REJUVENATION_GERMINATION = 155777, SPELL_DRUID_REJUVENATION_T10_PROC = 70691, SPELL_DRUID_RESTORATION_T10_2P_BONUS = 70658, SPELL_DRUID_SAVAGE_ROAR = 62071, @@ -733,6 +738,48 @@ class spell_dru_galactic_guardian : public AuraScript } }; +// 774 - Rejuvenation +class spell_dru_germination : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_REJUVENATION, SPELL_DRUID_GERMINATION, SPELL_DRUID_REJUVENATION_GERMINATION }); + } + + void PickRejuvenationVariant(WorldObject*& target) const + { + Unit* caster = GetCaster(); + + // Germination talent. + if (caster->HasAura(SPELL_DRUID_GERMINATION)) + { + Unit* unitTarget = target->ToUnit(); + Aura* rejuvenationAura = unitTarget->GetAura(SPELL_DRUID_REJUVENATION, caster->GetGUID()); + Aura* germinationAura = unitTarget->GetAura(SPELL_DRUID_REJUVENATION_GERMINATION, caster->GetGUID()); + + // if target doesn't have Rejuventation, cast passes through. + if (!rejuvenationAura) + return; + + // if target has Rejuvenation, but not Germination, or Germination has lower remaining duration than Rejuvenation, then cast Germination + if (germinationAura && germinationAura->GetDuration() >= rejuvenationAura->GetDuration()) + return; + + caster->CastSpell(target, SPELL_DRUID_REJUVENATION_GERMINATION, + CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR) + .SetTriggeringSpell(GetSpell())); + + // prevent aura refresh (but cast must still happen to consume mana) + target = nullptr; + } + } + + void Register() override + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dru_germination::PickRejuvenationVariant, EFFECT_0, TARGET_UNIT_TARGET_ALLY); + } +}; + // 24858 - Moonkin Form class spell_dru_glyph_of_stars : public AuraScript { @@ -968,6 +1015,44 @@ class spell_dru_lunar_inspiration : public AuraScript } }; +// 392315 - Luxuriant Soil +class spell_dru_luxuriant_soil : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_REJUVENATION }); + } + + static bool CheckProc(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/) + { + return roll_chance_i(aurEff->GetAmount()); + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const + { + Unit* rejuvCaster = GetTarget(); + + // let's use the ProcSpell's max. range. + float spellRange = eventInfo.GetSpellInfo()->GetMaxRange(); + + std::vector<Unit*> targetList; + Trinity::WorldObjectSpellNearbyTargetCheck check(spellRange, rejuvCaster, eventInfo.GetSpellInfo(), TARGET_CHECK_ALLY, nullptr, TARGET_OBJECT_TYPE_UNIT); + Trinity::UnitListSearcher searcher(rejuvCaster, targetList, check); + Cell::VisitAllObjects(rejuvCaster, searcher, spellRange); + + if (targetList.empty()) + return; + + rejuvCaster->CastSpell(Trinity::Containers::SelectRandomContainerElement(targetList), SPELL_DRUID_REJUVENATION, TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_POWER_AND_REAGENT_COST | TRIGGERED_IGNORE_CAST_IN_PROGRESS); + } + + void Register() override + { + DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_luxuriant_soil::CheckProc, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_dru_luxuriant_soil::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + // 8921 - Moonfire class spell_dru_moonfire : public SpellScript { @@ -1791,6 +1876,7 @@ void AddSC_druid_spell_scripts() RegisterSpellScript(spell_dru_ferocious_bite); RegisterSpellScript(spell_dru_forms_trinket); RegisterSpellScript(spell_dru_galactic_guardian); + RegisterSpellScript(spell_dru_germination); RegisterSpellScript(spell_dru_glyph_of_stars); RegisterSpellScript(spell_dru_gore); RegisterSpellScript(spell_dru_incapacitating_roar); @@ -1800,6 +1886,7 @@ void AddSC_druid_spell_scripts() RegisterSpellScript(spell_dru_item_t6_trinket); RegisterSpellScript(spell_dru_lifebloom); RegisterSpellScript(spell_dru_lunar_inspiration); + RegisterSpellScript(spell_dru_luxuriant_soil); RegisterSpellScript(spell_dru_moonfire); RegisterSpellScript(spell_dru_omen_of_clarity); RegisterSpellScript(spell_dru_prowl); |