From 3cb131c273c7f432727d7780aac40b2d9968fb15 Mon Sep 17 00:00:00 2001 From: Cristian Vintila <127750549+cristianvnt@users.noreply.github.com> Date: Thu, 5 Feb 2026 22:08:32 +0200 Subject: [PATCH] Scripts/Spells: Implement druid talent Flower Walk (#31532) --- .../world/master/2026_02_05_06_world.sql | 4 ++ src/server/scripts/Spells/spell_druid.cpp | 67 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 sql/updates/world/master/2026_02_05_06_world.sql diff --git a/sql/updates/world/master/2026_02_05_06_world.sql b/sql/updates/world/master/2026_02_05_06_world.sql new file mode 100644 index 0000000000..f77f538c1a --- /dev/null +++ b/sql/updates/world/master/2026_02_05_06_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_dru_flower_walk', 'spell_dru_flower_walk_heal'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(22812, 'spell_dru_flower_walk'), +(439902, 'spell_dru_flower_walk_heal'); diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 0998935b6c..ef8b90b214 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -46,6 +46,7 @@ enum DruidSpells SPELL_DRUID_ASTRAL_SMOLDER_DAMAGE = 394061, SPELL_DRUID_BALANCE_T10_BONUS = 70718, SPELL_DRUID_BALANCE_T10_BONUS_PROC = 70721, + SPELL_DRUID_BARKSKIN = 22812, SPELL_DRUID_BEAR_FORM = 5487, SPELL_DRUID_BLESSING_OF_CENARIUS = 40452, SPELL_DRUID_BLESSING_OF_ELUNE = 40446, @@ -91,6 +92,8 @@ enum DruidSpells SPELL_DRUID_FORMS_TRINKET_MOONKIN = 37343, SPELL_DRUID_FORMS_TRINKET_NONE = 37344, SPELL_DRUID_FORMS_TRINKET_TREE = 37342, + SPELL_DRUID_FLOWER_WALK = 439901, + SPELL_DRUID_FLOWER_WALK_HEAL = 439902, SPELL_DRUID_FULL_MOON = 274283, SPELL_DRUID_GALACTIC_GUARDIAN_AURA = 213708, SPELL_DRUID_GERMINATION = 155675, @@ -942,6 +945,68 @@ private: float _damageMultiplier = 0.0f; }; +// 439901 - Flower Walk +// Triggered by 22812 - Barkskin +class spell_dru_flower_walk : public AuraScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ SPELL_DRUID_FLOWER_WALK_HEAL }) + && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } }); + } + + bool Load() override + { + return GetCaster()->HasAura(SPELL_DRUID_FLOWER_WALK); + } + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_DRUID_FLOWER_WALK_HEAL, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR | TRIGGERED_SUPPRESS_CASTER_ANIM); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dru_flower_walk::HandlePeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +// 439902 - Flower Walk (Heal) +class spell_dru_flower_walk_heal : public SpellScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }); + } + + void FilterTargets(std::list& targets) + { + Unit* caster = GetCaster(); + int32 maxTargets = GetEffectInfo(EFFECT_1).CalcValue(caster); + + if (targets.size() > 1) + targets.remove(caster); + + Trinity::SelectRandomInjuredTargets(targets, maxTargets, true, caster); + + if (targets.empty()) + targets.push_back(caster); + } + + void PreventEffect(WorldObject*& target) + { + if (target->ToUnit() == GetCaster()) + target = nullptr; + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_flower_walk_heal::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dru_flower_walk_heal::PreventEffect, EFFECT_0, TARGET_UNIT_TARGET_ALLY); + } +}; + // 37336 - Druid Forms Trinket class spell_dru_forms_trinket : public AuraScript { @@ -2947,6 +3012,8 @@ void AddSC_druid_spell_scripts() RegisterSpellScript(spell_dru_embrace_of_the_dream_effect); RegisterSpellAndAuraScriptPair(spell_dru_entangling_roots, spell_dru_entangling_roots_aura); RegisterSpellScript(spell_dru_ferocious_bite); + RegisterSpellScript(spell_dru_flower_walk); + RegisterSpellScript(spell_dru_flower_walk_heal); RegisterSpellScript(spell_dru_forms_trinket); RegisterSpellScript(spell_dru_galactic_guardian); RegisterSpellScript(spell_dru_germination);