Scripts/Spells: Implement Germination and Luxuriant Soil (#29178)

Co-authored-by: Shauren <shauren.trinity@gmail.com>
This commit is contained in:
Teleqraph
2023-08-14 00:38:23 +02:00
committed by GitHub
parent 95893cf53c
commit 0b70e7d2dc
2 changed files with 95 additions and 0 deletions

View File

@@ -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');

View File

@@ -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);