You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1300 lines
66 KiB

-- DruidRestoration.lua
-- August 2025
-- Patch 11.2
if UnitClassBase( "player" ) ~= "DRUID" then return end
local addon, ns = ...
local Hekili = _G[ addon ]
local class, state = Hekili.Class, Hekili.State
local spec = Hekili:NewSpecialization( 105 )
---- Local function declarations for increased performance
-- Strings
local strformat = string.format
-- Tables
local insert, remove, sort, wipe = table.insert, table.remove, table.sort, table.wipe
-- Math
local abs, ceil, floor, max, sqrt = math.abs, math.ceil, math.floor, math.max, math.sqrt
-- Common WoW APIs, comment out unneeded per-spec
-- local GetSpellCastCount = C_Spell.GetSpellCastCount
-- local GetSpellInfo = C_Spell.GetSpellInfo
-- local GetSpellInfo = ns.GetUnpackedSpellInfo
-- local GetPlayerAuraBySpellID = C_UnitAuras.GetPlayerAuraBySpellID
-- local FindUnitBuffByID, FindUnitDebuffByID = ns.FindUnitBuffByID, ns.FindUnitDebuffByID
-- local IsSpellOverlayed = C_SpellActivationOverlay.IsSpellOverlayed
-- local IsSpellKnownOrOverridesKnown = C_SpellBook.IsSpellInSpellBook
-- local IsActiveSpell = ns.IsActiveSpell
-- Specialization-specific local functions (if any)
spec:RegisterResource( Enum.PowerType.Mana )
spec:RegisterResource( Enum.PowerType.Energy )
spec:RegisterResource( Enum.PowerType.ComboPoints )
spec:RegisterResource( Enum.PowerType.LunarPower )
spec:RegisterResource( Enum.PowerType.Rage )
-- Talents
spec:RegisterTalents( {
-- Druid
aessinas_renewal = { 82232, 474678, 1 }, -- When a hit deals more than $s1% of your maximum health, instantly heal for $s2% of your health. This effect cannot occur more than once every $s3 seconds
astral_influence = { 82210, 197524, 1 }, -- Increases the range of all of your spells by $s1 yards
circle_of_the_heavens = { 104078, 474541, 1 }, -- Magical damage dealt by your spells increased by $s1%
circle_of_the_wild = { 104078, 474530, 1 }, -- Physical damage dealt by your abilities increased by $s1%
cyclone = { 82229, 33786, 1 }, -- Tosses the enemy target into the air, disorienting them but making them invulnerable for up to $s1 sec. Only one target can be affected by your Cyclone at a time
feline_swiftness = { 82236, 131768, 1 }, -- Increases your movement speed by $s1%
fluid_form = { 82246, 449193, 1 }, -- Shred, Rake, and Skull Bash can be used in any form and shift you into Cat Form, if necessary. Mangle can be used in any form and shifts you into Bear Form. Wrath and Starfire shift you into Moonkin Form, if known
forestwalk = { 82243, 400129, 1 }, -- Casting Regrowth increases your movement speed and healing received by $s1% for $s2 sec
frenzied_regeneration = { 82220, 22842, 1 }, -- Heals you for $s1% health over $s2 sec, and increases healing received by $s3%
gale_winds = { 104079, 400142, 1 }, -- Increases Typhoon's radius by $s1% and its range by $s2 yds
grievous_wounds = { 82239, 474526, 1 }, -- Rake, Rip, and Thrash damage increased by $s1%
heart_of_the_wild = { 82231, 319454, 1 }, -- Abilities not associated with your specialization are substantially empowered for $s1 sec. Balance: Cast time of Balance spells reduced by $s2% and damage increased by $s3%. Feral: Gain $s4 Combo Point every $s5 sec while in Cat Form and Physical damage increased by $s6%. Guardian: Bear Form gives an additional $s7% Stamina, multiple uses of Ironfur may overlap, and Frenzied Regeneration has $s8 charges
hibernate = { 82211, 2637, 1 }, -- Forces the enemy target to sleep for up to $s2 sec$s$s3 Any damage will awaken the target. Only one target can be forced to hibernate at a time. Only works on Beasts and Dragonkin
improved_barkskin = { 104085, 327993, 1 }, -- Barkskin's duration is increased by $s1 sec
improved_natures_cure = { 104084, 392378, 1 }, -- Nature's Cure additionally removes all Curse and Poison effects
improved_stampeding_roar = { 82230, 288826, 1 }, -- Cooldown reduced by $s1 sec
incapacitating_roar = { 82237, 99, 1 }, -- Shift into Bear Form and invoke the spirit of Ursol to let loose a deafening roar, incapacitating all enemies within $s1 yards for $s2 sec. Damage may cancel the effect
incessant_tempest = { 104079, 400140, 1 }, -- Reduces the cooldown of Typhoon by $s1 sec
innervate = { 100175, 29166, 1 }, -- Infuse a friendly healer with energy, allowing them to cast spells without spending mana for $s1 sec
instincts_of_the_claw = { 104081, 449184, 1 }, -- Ferocious Bite and Maul damage increased by $s1%
ironfur = { 82227, 192081, 1 }, -- Increases armor by $s1 for $s2 sec
killer_instinct = { 82225, 108299, 2 }, -- Physical damage and Armor increased by $s1%
lingering_healing = { 82240, 231040, 1 }, -- Rejuvenation's duration is increased by $s1 sec. Regrowth's duration is increased by $s2 sec when cast on yourself
lore_of_the_grove = { 104080, 449185, 1 }, -- Moonfire and Sunfire damage increased by $s1%
lycaras_inspiration = { 92229, 1232897, 1 }, -- You gain a bonus while in each form inspired by the breadth of your Druidic knowledge: No Form: $s1% Magic Damage Cat Form: $s2% Stamina Bear Form: $s3% Movement Speed Moonkin Form: $s4% Area damage taken reduction
lycaras_teachings = { 82233, 378988, 2 }, -- You gain $s1% of a stat while in each form: No Form: Haste Cat Form: Critical Strike Bear Form: Versatility Moonkin Form: Mastery
maim = { 82221, 22570, 1 }, -- Finishing move that causes Physical damage and stuns the target. Damage and duration increased per combo point: $s1 point : $s2 damage, $s3 sec $s4 points: $s5 damage, $s6 sec $s7 points: $s8 damage, $s9 sec $s10 points: $s11 damage, $s12 sec $s13 points: $s14 damage, $s15 sec
mass_entanglement = { 82207, 102359, 1 }, -- Roots the target and all enemies within $s1 yards in place for $s2 sec. Damage may interrupt the effect. Usable in all shapeshift forms
matted_fur = { 100177, 385786, 1 }, -- When you use Barkskin or Survival Instincts, absorb $s1 damage for $s2 sec
mighty_bash = { 82237, 5211, 1 }, -- Invokes the spirit of Ursoc to stun the target for $s1 sec. Usable in all shapeshift forms
moonkin_form = { 82208, 24858, 1 }, -- Shapeshift into Moonkin Form, increasing the damage of your spells by $s1% and your armor by $s2%, and granting protection from Polymorph effects. The act of shapeshifting frees you from movement impairing effects
natural_recovery = { 82206, 377796, 1 }, -- Healing you receive is increased by $s1%
natures_vigil = { 82244, 124974, 1 }, -- For $s1 sec, all single-target healing also damages a nearby enemy target for $s2% of the healing done
nurturing_instinct = { 82214, 33873, 2 }, -- Magical damage and healing increased by $s1%
oakskin = { 100176, 449191, 1 }, -- Survival Instincts and Barkskin reduce damage taken by an additional $s1%
perfectlyhoned_instincts = { 104082, 1213597, 1 }, -- Well-Honed Instincts can trigger up to once every $s1 sec
primal_fury = { 82224, 159286, 1 }, -- While in Cat Form, when you critically strike with an attack that generates a combo point, you gain an additional combo point. Damage over time cannot trigger this effect. Mangle critical strike damage increased by $s1%
rake = { 82199, 1822, 1 }, -- Rake the target for $s$s3 Bleed damage and an additional $s$s4 Bleed damage over $s5 sec. While stealthed, Rake will also stun the target for $s6 sec and deal $s7% increased damage. Awards $s8 combo point
rejuvenation = { 82217, 774, 1 }, -- Heals the target for $s1 over $s2 sec. You can apply Rejuvenation twice to the same target
renewal = { 82232, 108238, 1 }, -- Instantly heals you for $s1% of maximum health. Usable in all shapeshift forms
rip = { 82222, 1079, 1 }, -- Finishing move that causes Bleed damage over time. Lasts longer per combo point. $s1 point : $s2 over $s3 sec $s4 points: $s5 over $s6 sec $s7 points: $s8 over $s9 sec $s10 points: $s11 million over $s12 sec $s13 points: $s14 million over $s15 sec
skull_bash = { 82242, 106839, 1 }, -- You charge and bash the target's skull, interrupting spellcasting and preventing any spell in that school from being cast for $s1 sec
soothe = { 82229, 2908, 1 }, -- Soothes the target, dispelling all enrage effects
stampeding_roar = { 82234, 106898, 1 }, -- Shift into Bear Form and let loose a wild roar, increasing the movement speed of all friendly players within $s1 yards by $s2% for $s3 sec
starfire = { 91044, 197628, 1 }, -- Call down a burst of energy, causing $s$s3 Arcane damage to the target, and $s$s4 Arcane damage to all other enemies within $s5 yards. Deals reduced damage beyond $s6 targets
starlight_conduit = { 100223, 451211, 1 }, -- Wrath, Starsurge, and Starfire damage increased by $s1%. Starsurge's cooldown is reduced by $s2 sec and its mana cost is reduced by $s3%
starsurge = { 82200, 197626, 1 }, -- Launch a surge of stellar energies at the target, dealing $s$s2 Astral damage
sunfire = { 93714, 93402, 1 }, -- A quick beam of solar light burns the enemy for $s$s3 Nature damage and then an additional $s$s4 Nature damage over $s5 sec
symbiotic_relationship = { 100173, 474750, 1 }, -- Form a bond with an ally. Your self-healing also heals your bonded ally for $s1% of the amount healed. Your healing to your bonded ally also heals you for $s2% of the amount healed
thick_hide = { 82228, 16931, 1 }, -- Reduces all damage taken by $s1%
thrash = { 82223, 106832, 1 }, -- Thrash all nearby enemies, dealing immediate physical damage and periodic bleed damage. Damage varies by shapeshift form
tiger_dash = { 82198, 252216, 1 }, -- Shift into Cat Form and increase your movement speed by $s1%, reducing gradually over $s2 sec
typhoon = { 82209, 132469, 1 }, -- Blasts targets within $s1 yards in front of you with a violent Typhoon, knocking them back and reducing their movement speed by $s2% for $s3 sec. Usable in all shapeshift forms
ursine_vigor = { 100174, 377842, 1 }, -- For $s1 sec after shifting into Bear Form, your health and armor are increased by $s2%
ursocs_spirit = { 82219, 449182, 1 }, -- Stamina increased by $s1%. Stamina in Bear Form is increased by an additional $s2%
ursols_vortex = { 82207, 102793, 1 }, -- Conjures a vortex of wind for $s1 sec at the destination, reducing the movement speed of all enemies within $s2 yards by $s3%. The first time an enemy attempts to leave the vortex, winds will pull that enemy back to its center. Usable in all shapeshift forms
verdant_heart = { 82218, 301768, 1 }, -- Frenzied Regeneration and Barkskin increase all healing received by $s1%
wellhoned_instincts = { 82235, 377847, 1 }, -- When you fall below $s1% health, you cast Frenzied Regeneration, up to once every $s2 sec
wild_charge = { 82198, 102401, 1 }, -- Fly to a nearby ally's position
wild_growth = { 82205, 48438, 1 }, -- Heals up to $s1 injured allies within $s2 yards of the target for $s3 over $s4 sec. Healing starts high and declines over the duration
-- Restoration
abundance = { 82052, 207383, 1 }, -- For each Rejuvenation you have active, Regrowth's cost is reduced by $s1% and critical effect chance is increased by $s2%, up to a maximum of $s3%
budding_leaves = { 82072, 392167, 2 }, --
call_of_the_elder_druid = { 82067, 426784, 1 }, --
cenarion_ward = { 82052, 102351, 1 }, -- Protects a friendly target for $s2 sec$s$s3 Any damage taken will consume the ward and heal the target for $s4 over $s5 sec
cenarius_guidance = { 82063, 393371, 1 }, -- Incarnation: Tree of Life During Incarnation: Tree of Life, you summon a Grove Guardian every $s3 sec. The cooldown of Incarnation: Tree of Life is reduced by $s4 sec when Grove Guardians fade. Convoke the Spirits Convoke the Spirits' cooldown is reduced by $s7% and its duration and number of spells cast is reduced by $s8%. Convoke the Spirits has an increased chance to use an exceptional spell or ability
convoke_the_spirits = { 82064, 391528, 1 }, -- Call upon the spirits for an eruption of energy, channeling a rapid flurry of $s1 Druid spells and abilities over $s2 sec. You will cast Wild Growth, Swiftmend, Moonfire, Wrath, Regrowth, Rejuvenation, Rake, and Thrash on appropriate nearby targets, favoring your current shapeshift form
cultivation = { 82056, 200390, 1 }, -- When Rejuvenation heals a target below $s1% health, it applies Cultivation to the target, healing them for $s2 over $s3 sec
dream_of_cenarius = { 82066, 158504, 1 }, --
dreamstate = { 82053, 392162, 1 }, -- While channeling Tranquility, your other Druid spell cooldowns are reduced by up to $s1 seconds
efflorescence = { 82057, 145205, 1 }, -- Grows a healing blossom at the target location, restoring $s1 health to three injured allies within $s2 yards every $s3 sec for $s4 sec. Limit $s5
embrace_of_the_dream = { 82070, 392124, 1 }, --
flash_of_clarity = { 82083, 392220, 1 }, -- Clearcast Regrowths heal for an additional $s1%
flourish = { 82073, 197721, 1 }, -- Extends the duration of all of your heal over time effects on friendly targets within $s1 yards by $s2 sec, and increases the rate of your heal over time effects by $s3% for $s4 sec. Affected allies are healed for $s5 million, split evenly among them
forests_flow = { 103873, 470581, 1 }, --
germination = { 82071, 155675, 1 }, -- You can apply Rejuvenation twice to the same target. Rejuvenation's duration is increased by $s1 sec
grove_guardians = { 82043, 102693, 1 }, -- Summons a Treant which will immediately cast Swiftmend on your current target, healing for $s1. The Treant will cast Nourish on that target or a nearby ally periodically, healing for $s2. Lasts $s3 sec
grove_tending = { 82047, 383192, 1 }, -- Swiftmend heals the target for $s1 over $s2 sec
harmonious_blooming = { 82065, 392256, 1 }, -- Lifebloom counts for $s1 stacks of Mastery: Harmony
improved_ironbark = { 82081, 382552, 1 }, -- Ironbark's cooldown is reduced by $s1 sec
improved_regrowth = { 82055, 231032, 1 }, -- Regrowth's initial heal has a $s1% increased chance for a critical effect if the target is already affected by Regrowth
improved_wild_growth = { 82045, 328025, 1 }, --
incarnation_tree_of_life = { 82064, 33891, 1 }, -- Shapeshift into the Tree of Life, increasing healing done by $s1%, increasing armor by $s2%, and granting protection from Polymorph effects. Functionality of Rejuvenation, Wild Growth, Regrowth, Entangling Roots, and Wrath is enhanced. Lasts $s3 sec. You may shapeshift in and out of this form for its duration
inner_peace = { 82053, 197073, 1 }, --
invigorate = { 82070, 392160, 1 }, -- Refreshes the duration of your active Lifebloom and Rejuvenation effects on the target and causes them to complete $s1% faster
ironbark = { 82082, 102342, 1 }, -- The target's skin becomes as tough as Ironwood, reducing damage taken by $s1% for $s2 sec. Allies protected by your Ironbark also receive $s3% of the healing from each of your active Rejuvenations
lifebloom = { 82049, 33763, 1 }, -- Heals the target for $s1 over $s2 sec. When Lifebloom expires or is dispelled, the target is instantly healed for $s3. May be active on one target at a time
liveliness = { 82074, 426702, 1 }, -- Your damage over time effects deal their damage $s1% faster, and your healing over time effects heal $s2% faster
master_shapeshifter = { 82074, 289237, 1 }, --
natures_splendor = { 82051, 392288, 1 }, --
natures_swiftness = { 82050, 132158, 1 }, -- Your next Regrowth, Rebirth, or Entangling Roots is instant, free, castable in all forms, and heals for an additional $s1%
nourish = { 82043, 50464, 1 }, -- Heals a friendly target for $s1. Receives $s2% bonus from Mastery: Harmony
nurturing_dormancy = { 82076, 392099, 1 }, -- When your Rejuvenation heals a full health target, its duration is increased by $s1 sec, up to a maximum total increase of $s2 sec per cast
overgrowth = { 82061, 203651, 1 }, -- Apply Lifebloom, Rejuvenation, Wild Growth, and Regrowth's heal over time effect to an ally
passing_seasons = { 82051, 382550, 1 }, --
photosynthesis = { 82073, 274902, 1 }, --
power_of_the_archdruid = { 82077, 392302, 1 }, --
prosperity = { 82079, 200383, 1 }, --
rampant_growth = { 82058, 404521, 1 }, -- Regrowth's healing over time is increased by $s1%, and it also applies to the target of your Lifebloom
reforestation = { 82069, 392356, 1 }, -- Every $s1 casts of Swiftmend grants you Incarnation: Tree of Life for $s2 sec
regenerative_heartwood = { 82075, 392116, 1 }, -- Allies protected by your Ironbark also receive $s1% of the healing from each of your active Rejuvenations and Ironbark's duration is increased by $s2 sec
regenesis = { 82062, 383191, 2 }, --
renewing_surge = { 103874, 470562, 1 }, --
soul_of_the_forest = { 82059, 158478, 1 }, -- Swiftmend increases the healing of your next Regrowth or Rejuvenation by $s1%, or your next Wild Growth by $s2%
spring_blossoms = { 82061, 207385, 1 }, -- Each target healed by Efflorescence is healed for an additional $s1 over $s2 sec
stonebark = { 82081, 197061, 1 }, --
thriving_vegetation = { 82068, 447131, 2 }, -- Rejuvenation instantly heals your target for $s1% of its total periodic effect and Regrowth's duration is increased by $s2 sec
tranquil_mind = { 92674, 403521, 1 }, --
tranquility = { 82054, 740, 1 }, -- Heals all allies within $s1 yards for $s2 million over $s3 sec. Each heal heals the target for another $s4 over $s5 sec, stacking. Healing decreased beyond $s6 targets
twinleaf = { 103875, 470540, 1 }, --
undergrowth = { 82077, 392301, 1 }, -- You may Lifebloom two targets at once, but Lifebloom's healing is reduced by $s1%
unstoppable_growth = { 82080, 382559, 2 }, --
verdancy = { 82060, 392325, 1 }, --
verdant_infusion = { 82079, 392410, 1 }, -- Swiftmend no longer consumes a heal over time effect, and extends the duration of your heal over time effects on the target by $s1 sec
waking_dream = { 82046, 392221, 1 }, --
wild_synthesis = { 94535, 400533, 1 }, -- Nourish Regrowth decreases the cast time of your next Nourish by $s3% and causes it to receive an additional $s4% bonus from Mastery: Harmony. Stacks up to $s5 times. Grove Guardians Treants from Grove Guardians also cast Wild Growth immediately when summoned, healing $s8 allies within $s9 yds for $s10 over $s11 sec
wildwood_roots = { 103876, 470549, 1 }, -- Abundance now also reduces the cast time of Regrowth by $s1% per stack. Cenarion Ward's cooldown is reduced by $s2 sec and its duration is increased by $s3 sec
yseras_gift = { 82048, 145108, 1 }, -- Heals you for $s1% of your maximum health every $s2 sec. If you are at full health, an injured party or raid member will be healed instead
-- Keeper Of The Grove
blooming_infusion = { 94601, 429433, 1 }, -- Every $s1 Regrowths you cast makes your next Wrath, Starfire, or Entangling Roots instant and increases damage it deals by $s2%. Every $s3 Starsurges you cast makes your next Regrowth or Entangling roots instant
bounteous_bloom = { 94591, 429215, 1 }, -- Your Grove Guardians' healing is increased by $s1%
cenarius_might = { 94604, 455797, 1 }, -- Casting Swiftmend increases your Haste by $s1% for $s2 sec
control_of_the_dream = { 94592, 434249, 1 }, -- Time elapsed while your major abilities are available to be used or at maximum charges is subtracted from that ability's cooldown after the next time you use it, up to $s1 seconds. Affects Nature's Swiftness, Incarnation: Tree of Life, and Convoke the Spirits
dream_surge = { 94600, 433831, 1 }, -- Grove Guardians causes your next targeted heal to create $s1 Dream Petals near the target, healing up to $s2 nearby allies for $s3. Stacks up to $s4 charges
durability_of_nature = { 94605, 429227, 1 }, -- Your Grove Guardians' Nourish and Swiftmend spells also apply a Minor Cenarion Ward that heals the target for $s1 over $s2 sec the next time they take damage
early_spring = { 94591, 428937, 1 }, -- Grove Guardians cooldown reduced by $s1 sec
expansiveness = { 94602, 429399, 1 }, -- Your maximum mana is increased by $s1%
groves_inspiration = { 94595, 429402, 1 }, -- Wrath and Starfire damage increased by $s1%. Regrowth, Wild Growth, and Swiftmend healing increased by $s2%
harmony_of_the_grove = { 94606, 428731, 1 }, -- Each of your Grove Guardians increases your healing done by $s1% while active
potent_enchantments = { 94595, 429420, 1 }, -- Reforestation grants Tree of Life for $s1 additional sec
power_of_nature = { 94605, 428859, 1 }, -- Your Grove Guardians increase the healing of your Rejuvenation, Efflorescence, and Lifebloom by $s1% while active
power_of_the_dream = { 94592, 434220, 1 }, -- Healing spells cast with Dream Surge generate an additional Dream Petal
protective_growth = { 94593, 433748, 1 }, -- Your Regrowth protects you, reducing damage you take by $s1% while your Regrowth is on you
treants_of_the_moon = { 94599, 428544, 1 }, -- Your Grove Guardians cast Moonfire on nearby targets about once every $s1 sec
-- Wildstalker
bond_with_nature = { 94625, 439929, 1 }, -- Healing you receive is increased by $s1%
bursting_growth = { 94630, 440120, 1 }, -- When Bloodseeker Vines expire or you use Ferocious Bite on their target they explode in thorns, dealing $s$s2 physical damage to nearby enemies. Damage reduced above $s3 targets. When Symbiotic Blooms expire or you cast Rejuvenation on their target flowers grow around their target, healing them and up to $s4 nearby allies for $s5
entangling_vortex = { 94622, 439895, 1 }, -- Enemies pulled into Ursol's Vortex are rooted in place for $s1 sec. Damage may cancel the effect
flower_walk = { 94622, 439901, 1 }, -- During Barkskin your movement speed is increased by $s1% and every second flowers grow beneath your feet that heal up to $s2 nearby injured allies for $s3
harmonious_constitution = { 94625, 440116, 1 }, -- Your Regrowth's healing to yourself is increased by $s1%
hunt_beneath_the_open_skies = { 94629, 439868, 1 }, -- Damage and healing while in Cat Form increased by $s1%. Moonfire and Sunfire damage increased by $s2%
implant = { 94628, 440118, 1 }, -- Casting Swiftmend or Wild Growth causes a Symbiotic Bloom to grow on a target for $s1 sec
lethal_preservation = { 94624, 455461, 1 }, -- When you remove an effect with Soothe or Nature's Cure, gain a combo point and heal for $s1% of your maximum health. If you are at full health an injured party or raid member will be healed instead
resilient_flourishing = { 94631, 439880, 1 }, -- Bloodseeker Vines and Symbiotic Blooms last $s1 additional sec. When a target afflicted by Bloodseeker Vines dies, the vines jump to a valid nearby target for their remaining duration
root_network = { 94631, 439882, 1 }, -- Each active Bloodseeker Vine increases the damage your abilities deal by $s1%. Each active Symbiotic Bloom increases the healing of your spells by $s2%
strategic_infusion = { 94623, 439890, 1 }, -- Attacking from Prowl increases the chance for Shred, Rake, and Swipe to critically strike by $s1% for $s2 sec. Casting Regrowth increases the chance for your periodic heals to critically heal by $s3% for $s4 sec
thriving_growth = { 94626, 439528, 1 }, -- Rip and Rake damage has a chance to cause Bloodseeker Vines to grow on the victim, dealing $s$s2 Bleed damage over $s3 sec. Wild Growth, Regrowth, and Efflorescence healing has a chance to cause Symbiotic Blooms to grow on the target, healing for $s4 over $s5 sec. Multiple instances of these can overlap
twin_sprouts = { 94628, 440117, 1 }, -- When Bloodseeker Vines or Symbiotic Blooms grow, they have a $s1% chance to cause another growth of the same type to immediately grow on a valid nearby target
vigorous_creepers = { 94627, 440119, 1 }, -- Bloodseeker Vines increase the damage your abilities deal to affected enemies by $s1%. Symbiotic Blooms increase the healing your spells do to affected targets by $s2%
wildstalkers_power = { 94621, 439926, 1 }, -- Rip and Ferocious Bite damage increased by $s1%. Rejuvenation, Efflorescence, and Lifebloom healing increased by $s2%
} )
-- PvP Talents
spec:RegisterPvpTalents( {
ancient_of_lore = 5668, -- (473909)
deep_roots = 700, -- (233755) Increases the amount of damage required to cancel your Entangling Roots by $s1%
disentanglement = 59, -- (233673)
early_spring = 1215, -- (203624)
entangling_bark = 692, -- (247543)
forest_guardian = 5687, -- (1217474)
high_winds = 838, -- (200931) Increases the range of Cyclone, Typhoon, and Entangling Roots by $s1 yds
malornes_swiftness = 5514, -- (236147) Your Travel Form movement speed while within a Battleground or Arena is increased by $s1% and you always move at $s2% movement speed while in Travel Form
thorns = 697, -- (1217017) Casting Barkskin or Ironbark sprouts thorns on you for $s2 sec. When victim to melee attacks, thorns deals $s$s3 Nature damage back to the attacker. Attackers also have their movement speed reduced by $s4% for $s5 sec
tireless_pursuit = 5649, -- (377801) For $s1 sec after leaving Cat Form or Travel Form, you retain up to $s2% movement speed
} )
local mod_liveliness_hot = setfenv( function( dur )
if not talent.liveliness.enabled then return dur end
return dur * 0.95
end, state )
local mod_liveliness_dot = setfenv( function( dur )
if not talent.liveliness.enabled then return dur end
return dur * 0.75
end, state )
-- Auras
spec:RegisterAuras( {
abundance = {
id = 207640,
duration = 3600,
max_stack = 12
},
call_of_the_elder_druid = {
id = 426790,
duration = 60,
max_stack = 1,
copy = "oath_of_the_elder_druid"
},
cenarion_ward = {
id = 102351,
duration = 30,
max_stack = 1,
dot = "buff",
friendly = true
},
cenarion_ward_hot = {
id = 102352,
duration = 8,
tick_time = function() return mod_liveliness_hot( 2 ) end,
dot = "buff",
friendly = true,
max_stack = 1
},
-- [393381] During Incarnation: Tree of Life, you summon a Grove Guardian every $393418t sec. The cooldown of Incarnation: Tree of Life is reduced by ${$s1/-1000}.1 sec when Grove Guardians fade.
cenarius_guidance = {
id = 393418,
duration = 30,
tick_time = 10,
max_stack = 1,
},
clearcasting = {
id = 16870,
duration = 15,
max_stack = 1
},
cultivation = {
id = 200389,
duration = 6,
dot = "buff",
friendly = true,
max_stack = 1
},
efflorescence = {
id = 145205,
duration = 30,
tick_time = function() return mod_liveliness_hot( 2 ) end,
max_stack = 1,
},
flourish = {
id = 197721,
duration = 8,
max_stack = 1
},
grove_guardians = {
id = 102693,
duration = 15,
max_stack = 5,
generate = function( t )
local expires = action.grove_guardians.lastCast + 15
if expires > query_time then
t.name = action.grove_guardians.name
t.count = 1
t.expires = expires
t.applied = expires - 15
t.caster = "player"
return
end
t.count = 0
t.expires = 0
t.applied = 0
t.caster = "nobody"
end,
},
grove_tending = {
id = 383193,
duration = 9,
max_stack = 1,
copy = 279793 -- Azerite.
},
harmony_of_the_grove = {
id = 428737,
duration = 15,
max_stack = 3
},
-- The actual incarn buff
incarnation = {
id = 117679,
duration = 30,
max_stack = 1
},
-- This is the form
incarnation_tree_of_life = {
id = 33891,
duration = 3600,
max_stack = 1,
copy = "tree_of_life_form"
},
ironbark = {
id = 102342,
duration = function() return talent.regenerative_heartwood.enabled and 16 or 12 end,
max_stack = 1
},
-- talent = double lifebloom. Both spellID and actual buff spellID change.
lifebloom = {
id = function() return talent.undergrowth.enabled and 188550 or 33763 end,
duration = 15,
tick_time = function() return haste * mod_liveliness_hot( 1 ) end,
max_stack = 1,
dot = "buff",
friendly = true,
copy = { 33763, 188550 }
},
natures_swiftness = {
id = 132158,
duration = 3600,
max_stack = 1,
onRemove = function()
setCooldown( "natures_swiftness", spec.abilities.natures_swiftness.cooldown )
end,
},
natures_vigil = {
id = 124974,
duration = 15,
max_stack = 1,
},
-- You have recently gained Heart of the Wild from Oath of the Elder Druid.
oath_of_the_elder_druid = {
id = 338643,
duration = 60,
max_stack = 1,
},
power_of_the_archdruid = {
id = 392303,
duration = 15,
max_stack = 1
},
reforestation = {
id = 392360,
duration = 3600,
max_stack = 3,
},
regrowth = {
id = 8936,
duration = function() return 12 + 3 * talent.thriving_vegetation.rank end,
tick_time = function() return haste * mod_liveliness_hot( 2 ) end,
dot = "buff",
friendly = true,
max_stack = 1
},
rejuvenation = {
id = 774,
duration = function() return 12 + 3 * talent.improved_rejuvenation.rank end,
tick_time = function() return haste * mod_liveliness_hot( 3 ) end,
dot = "buff",
friendly = true,
max_stack = 1
},
rejuvenation_germination = {
id = 155777,
duration = function () return spec.auras.rejuvenation.duration end,
tick_time = function() return haste * mod_liveliness_hot( 3 ) end,
dot = "buff",
friendly = true,
max_stack = 1
},
renewing_bloom = {
id = 364686,
duration = 8,
tick_time = function() return mod_liveliness_hot( 1 ) end,
max_stack = 1
},
soul_of_the_forest = {
id = 114108,
duration = 15,
max_stack = 1,
},
symbiotic_relationship = {
id = 474754,
duration = 3600,
dot = "buff",
friendly = true,
max_stack = 1,
},
spring_blossoms = {
id = 207386,
duration = 6,
dot = "buff",
friendly = true,
max_stack = 1,
},
tranquility = {
id = 740,
duration = function() return 5 * haste end,
generate = function( t )
if buff.casting.up and buff.casting.v1 == 740 then
t.applied = buff.casting.applied
t.duration = buff.casting.duration
t.expires = buff.casting.expires
t.stack = 1
t.caster = "player"
return
end
t.applied = 0
t.duration = spec.auras.tranquility.duration
t.expires = 0
t.stack = 0
t.caster = "nobody"
end,
tick_time = function() return haste end, -- Interval between each tick based on haste
max_stack = 1
},
tranquility_hot = {
id = 157982,
duration = 8,
tick_time = function() return mod_liveliness_hot( 2 ) end,
max_stack = 5
},
wild_growth = {
id = 48438,
duration = 7,
tick_time = function() return mod_liveliness_hot( 1 ) end,
dot = "buff",
friendly = true,
max_stack = 1
},
wild_synthesis = {
id = 400534,
duration = 3600,
max_stack = 3
},
} )
spec:RegisterPet( "treants",
54983,
"grove_guardians",
15,
54983 )
spec:RegisterTotem( "treants", 54983 )
spec:RegisterGear({
-- The War Within
tww3 = {
items = { 237685, 237680, 237683, 237681, 237682 },
auras = {
-- Keeper of the Grove
-- Dryad A dryad is assisting you! $s1 seconds remaining
-- https://www.wowhead.com/spell=1236556
dryad = {
id = 1236556,
duration = 5, -- 10 for balance
max_stack = 1
},
-- Dryad's Favor The healing of your next Swiftmend is increased by $s1 and it splashes $s2% of its healing done to nearby allies, reduced beyond $s3 targets. $s4 seconds remaining
-- https://www.wowhead.com/spell=1236807
dryads_favor = {
id = 1236807,
duration = 45,
max_stack = 2
},
-- New tier set hot version
-- https://www.wowhead.com/spell=1236573
tranquility = {
id = 1236573,
duration = 8,
max_stack = 5
},
-- New tier set version on dryad
starfall = {
id = 1236607,
duration = 10,
max_stack = 1
},
}
},
tww2 = {
items = { 229310, 229308, 229306, 229307, 229305 }
},
-- Dragonflight
tier31 = {
items = { 207252, 207253, 207254, 207255, 207257, 217193, 217195, 217191, 217192, 217194 }
},
tier30 = {
items = { 202518, 202516, 202515, 202514, 202513 }
},
} )
spec:RegisterStateFunction( "break_stealth", function ()
removeBuff( "shadowmeld" )
if buff.prowl.up then
setCooldown( "prowl", 6 )
removeBuff( "prowl" )
end
end )
-- Function to remove any form currently active.
spec:RegisterStateFunction( "unshift", function()
if conduit.tireless_pursuit.enabled and ( buff.cat_form.up or buff.travel_form.up ) then applyBuff( "tireless_pursuit" ) end
removeBuff( "tree_of_life_form" )
removeBuff( "cat_form" )
removeBuff( "bear_form" )
removeBuff( "travel_form" )
removeBuff( "moonkin_form" )
removeBuff( "travel_form" )
removeBuff( "aquatic_form" )
removeBuff( "stag_form" )
end )
-- Function to apply form that is passed into it via string.
spec:RegisterStateFunction( "shift", function( form )
if conduit.tireless_pursuit.enabled and ( buff.cat_form.up or buff.travel_form.up ) then applyBuff( "tireless_pursuit" ) end
removeBuff( "tree_of_life_form" )
removeBuff( "cat_form" )
removeBuff( "bear_form" )
removeBuff( "travel_form" )
removeBuff( "moonkin_form" )
removeBuff( "travel_form" )
removeBuff( "aquatic_form" )
removeBuff( "stag_form" )
applyBuff( form )
if form == "bear_form" and pvptalent.celestial_guardian.enabled then
applyBuff( "celestial_guardian" )
end
if form == "bear_form" or form == "cat_form" and talent.call_of_the_elder_druid.enabled and debuff.oath_of_the_elder_druid.down then
applyBuff( "heart_of_the_wild", 15 )
applyDebuff( "player", "oath_of_the_elder_druid" )
end
end )
spec:RegisterHook( "runHandler", function( ability )
local a = class.abilities[ ability ]
if not a or a.startsCombat then
break_stealth()
end
if buff.ravenous_frenzy.up and ability ~= "ravenous_frenzy" then
stat.haste = stat.haste + 0.01
addStack( "ravenous_frenzy", nil, 1 )
end
end )
local TranquilityTickHandler = setfenv( function()
addStack( "tranquility_hot" )
if talent.dreamstate.enabled then
for ability, _ in pairs( class.abilities ) do
reduceCooldown( ability, 4 )
end
end
end, state )
local ComboPointPeriodic = setfenv( function()
gain( 1, "combo_points" )
end, state )
local TreantSpawnPeriodic = setfenv( function()
summonPet( "treants", 15 )
addStack( "grove_guardians" ) -- Just for tracking.
if talent.harmony_of_the_grove.enabled then addStack( "harmony_of_the_grove" ) end
end, state )
spec:RegisterHook( "reset_precast", function ()
if buff.casting.up and buff.casting.v1 == 740 then
local tickInterval = spec.auras.tranquility.tick_time
local tick, expires = buff.casting.applied, buff.casting.expires
for i = 1, 4 do
tick = tick + tickInterval
if tick > query_time and tick < expires then
state:QueueAuraEvent( "tranquility_tick", TranquilityTickHandler, tick, "AURA_TICK" )
end
end
end
if buff.heart_of_the_wild.up then
local tick, expires = buff.heart_of_the_wild.applied, buff.heart_of_the_wild.expires
for i = 2, expires - query_time, 2 do
tick = query_time + i
if tick < expires then
state:QueueAuraEvent( "incarnation_combo_point_perodic", ComboPointPeriodic, tick, "AURA_TICK" )
end
end
end
if buff.incarnation.up then
local tick, expires = buff.incarnation.applied, buff.incarnation.expires
for i = 10, expires - query_time, 10 do
tick = query_time + i
if tick < expires then
state:QueueAuraEvent( "tree_of_life_treant_spawn", TreantSpawnPeriodic, tick, "AURA_TICK" )
end
end
end
end )
-- Abilities
spec:RegisterAbilities( {
-- Protects a friendly target for 30 sec. Any damage taken will consume the ward and heal the target for 11,054 over 8 sec.
cenarion_ward = {
id = 102351,
cast = 0,
cooldown = 30,
gcd = "spell",
spend = 0.09,
spendType = "mana",
talent = "cenarion_ward",
startsCombat = false,
texture = 132137,
handler = function ()
active_dot.cenarion_ward = active_dot.cenarion_ward + 1
end,
},
-- Grows a healing blossom at the target location, restoring 676 health to three injured allies within 10 yards every 1.7 sec for 30 sec. Limit 1.
efflorescence = {
id = 145205,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 0.17,
spendType = "mana",
talent = "efflorescence",
startsCombat = false,
texture = 134222,
handler = function ()
applyBuff( "efflorescence" )
end,
},
-- Extends the duration of all of your heal over time effects on friendly targets within 60 yards by 8 sec, and increases the rate of your heal over time effects by 100% for 8 sec.
flourish = {
id = 197721,
cast = 0,
cooldown = 60,
gcd = "spell",
talent = "flourish",
startsCombat = false,
texture = 538743,
toggle = "cooldowns",
handler = function ()
applyBuff( "flourish" )
if buff.cenarion_ward.up then buff.cenarion_ward.expires = buff.cenarion_ward.expires + 8 end
if buff.grove_tending.up then buff.grove_tending.expires = buff.grove_tending.expires + 8 end
if buff.lifebloom_2.up then buff.lifebloom_2.expires = buff.lifebloom_2.expires + 8 end
if buff.lifebloom.up then buff.lifebloom.expires = buff.lifebloom.expires + 8 end
if buff.regrowth.up then buff.regrowth.expires = buff.regrowth.expires + 8 end
if buff.rejuvenation_germination.up then buff.rejuvenation_germination.expires = buff.rejuvenation_germination.expires + 8 end
if buff.rejuvenation.up then buff.rejuvenation.expires = buff.rejuvenation.expires + 8 end
if buff.renewing_bloom.up then buff.renewing_bloom.expires = buff.renewing_bloom.expires + 8 end
if buff.tranquility_hot.up then buff.tranquility_hot.expires = buff.tranquility_hot.expires + 8 end
if buff.wild_growth.up then buff.wild_growth.expires = buff.wild_growth.expires + 8 end
end,
},
-- Summons a Treant which will immediately cast Swiftmend on your current target, healing for ${$422094m1}. The Treant will cast Nourish on that target or a nearby ally periodically, healing for ${$422090m1}. Lasts $d.
grove_guardians = {
id = 102693,
cast = 0.0,
cooldown = function () return 20 - 3 * talent.early_spring.rank end,
recharge = 20,
charges = 3,
icd = 0.5,
gcd = "off",
spend = 0.012,
spendType = 'mana',
talent = "grove_guardians",
startsCombat = false,
handler = function()
summonPet( "treants", 15 )
addStack( "grove_guardians" ) -- Just for tracking.
if talent.harmony_of_the_grove.enabled then addStack( "harmony_of_the_grove" ) end
end,
},
-- Shapeshift into the Tree of Life, increasing healing done by 15%, increasing armor by 120%, and granting protection from Polymorph effects. Functionality of Rejuvenation, Wild Growth, Regrowth, and Entangling Roots is enhanced. Lasts 30 sec. You may shapeshift in and out of this form for its duration.
incarnation = {
id = 33891,
cast = 0,
cooldown = function() return buff.tree_of_life_form.up and 0 or 180 end,
gcd = "spell",
talent = "incarnation",
startsCombat = false,
texture = 236157,
toggle = "cooldowns",
handler = function ()
if buff.incarnation.down then
applyBuff( "incarnation" )
if talent.cenarius_guidance.enabled then for i = 10, 30, 10 do
state:QueueAuraEvent( "tree_of_life_treant_spawn", TreantSpawnPeriodic, queryTime + i , "AURA_TICK" )
end
end
end
shift( "incarnation_tree_of_life" )
end,
copy = "incarnation_tree_of_life"
},
-- Infuse a friendly healer with energy, allowing them to cast spells without spending mana for 10 sec.
innervate = {
id = 29166,
cast = 0,
cooldown = 180,
gcd = "off",
talent = "innervate",
startsCombat = false,
texture = 136048,
toggle = "interrupts",
handler = function ()
applyBuff( "innervate" )
end,
},
-- Refreshes the duration of your active Lifebloom and Rejuvenation effects on the target and causes them to complete 200% faster.
invigorate = {
id = 392160,
cast = 0,
cooldown = 20,
gcd = "spell",
spend = 0.02,
spendType = "mana",
talent = "invigorate",
startsCombat = false,
texture = 136073,
handler = function ()
if buff.lifebloom_2.up then buff.lifebloom_2.expires = query_time + buff.lifebloom_2.duration end
if buff.lifebloom.up then buff.lifebloom.expires = query_time + buff.lifebloom.duration end
if buff.rejuvenation_germination.up then buff.rejuvenation_germination.expires = query_time + buff.rejuvenation_germination.duration end
if buff.rejuvenation.up then buff.rejuvenation.expires = query_time + buff.rejuvenation.duration end
end,
},
-- The target's skin becomes as tough as Ironwood, reducing damage taken by 20% for 12 sec.
ironbark = {
id = 102342,
cast = 0,
cooldown = function() return 90 - ( talent.improved_ironbark.enabled and 20 or 0 ) end,
gcd = "off",
talent = "ironbark",
startsCombat = false,
texture = 572025,
toggle = "defensives",
handler = function ()
applyBuff( "ironbark" )
end,
},
-- Heals the target for 7,866 over 15 sec. When Lifebloom expires or is dispelled, the target is instantly healed for 4,004. May be active on one target at a time. Lifebloom counts for 2 stacks of Mastery: Harmony.
lifebloom = {
id = function() return talent.undergrowth.enabled and 188550 or 33763 end,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 0.08,
spendType = "mana",
talent = "lifebloom",
startsCombat = false,
texture = 134206,
handler = function ()
active_dot.lifebloom = min( active_dot.lifebloom + 1, 1 + ( 1 * talent.undergrowth.rank ) )
end,
copy = { 188550, 33763 }
},
-- Cures harmful effects on the friendly target, removing all Magic, Curse, and Poison effects.
natures_cure = {
id = 88423,
cast = 0,
charges = 1,
cooldown = 8,
recharge = 8,
gcd = "spell",
spend = 0.06,
spendType = "mana",
startsCombat = false,
texture = 236288,
buff = function()
return buff.dispellable_magic.up and "dispellable_magic" or
buff.dispellable_curse.up and "dispellable_curse" or
buff.dispellable_poison.up and "dispellable_poison" or "dispellable_magic"
end,
handler = function ()
removeBuff( "dispellable_magic" )
removeBuff( "dispellable_curse" )
removeBuff( "dispellable_poison" )
end,
},
-- Your next Regrowth, Rebirth, or Entangling Roots is instant, free, castable in all forms, and heals for an additional 135%.
natures_swiftness = {
id = 132158,
cast = 0,
charges = function() if talent.twinleaf.enabled then return 2 end end,
cooldown = function() return 60 - 12 * talent.passing_seasons.rank end,
recharge = function() if talent.twinleaf.enabled then return 60 end end,
gcd = "off",
talent = "natures_swiftness",
startsCombat = false,
texture = 136076,
toggle = "cooldowns",
handler = function ()
applyBuff( "natures_swiftness" )
end,
},
-- Heals a friendly target for 6,471. Receives triple bonus from Mastery: Harmony.
nourish = {
id = 50464,
cast = function() return 2 * haste * ( talent.wild_synthesis.enabled and ( 1 - 0.34 * buff.wild_synthesis.stack ) or 1 ) end,
cooldown = 0,
gcd = "spell",
spend = 0.18,
spendType = "mana",
talent = "nourish",
startsCombat = false,
texture = 236162,
handler = function ()
removeBuff( "wild_synthesis" )
end,
},
-- Apply Lifebloom, Rejuvenation, Wild Growth, and Regrowth's heal over time effect to an ally.
overgrowth = {
id = 203651,
cast = 0,
cooldown = 60,
gcd = "spell",
spend = 0.12,
spendType = "mana",
talent = "overgrowth",
startsCombat = false,
texture = 1408836,
toggle = "cooldowns",
handler = function ()
applyBuff( "lifebloom" )
applyBuff( "rejuvenation" )
applyBuff( "wild_growth" )
applyBuff( "regrowth" )
end,
},
-- Heals a friendly target for 4,267 and another 1,284 over 12 sec. Tree of Life: Instant cast.
regrowth = {
id = 8936,
cast = function() return ( buff.tree_of_life_form or buff.blooming_infusion_regrowth.up ) and 0 or 1.5 * ( talent.wildwood_roots.enabled and ( 1 - 0.05 * buff.abundance.stack ) or 1 ) * haste end,
cooldown = 0,
gcd = "spell",
spend = function() return buff.clearcasting.up and 0 or 0.10 * ( talent.abundance.enabled and ( 1 - 0.08 * buff.abundance.stack ) or 1 ) end,
spendType = "mana",
startsCombat = false,
texture = 136085,
handler = function ()
removeBuff( "natures_swiftness" )
removeBuff( "clearcasting" )
applyBuff( "regrowth" )
if buff.power_of_the_archdruid.up then
active_dot.rejuvenation = min( active_allies, active_dot.rejuvenation + 2 )
removeBuff( "power_of_the_archdruid" )
end
if talent.soul_of_the_forest.enabled then removeBuff( "soul_of_the_forest" ) end
if talent.forestwalk.enabled then applyBuff( "forestwalk" ) end
if talent.wild_synthesis.enabled then addStack( "wild_synthesis" ) end
if talent.blooming_infusion.enabled then removeBuff( "blooming_infusion_regrowth" ) end
end,
},
-- Heals the target for 4,624 over 15 sec. Tree of Life: Healing increased by 50% and Mana cost reduced by 30%.
rejuvenation = {
id = 774,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function() return ( buff.tree_of_life_form.up and 0.7 or 1 ) * 0.021 end,
spendType = "mana",
talent = "rejuvenation",
startsCombat = false,
texture = 136081,
handler = function ()
-- Main Rejuv buff
if talent.germination.enabled then
if buff.rejuvenation.down or buff.rejuvenation.remains < buff.rejuvenation_germination.remains then
applyBuff( "rejuvenation" )
elseif buff.germination.remains < buff.rejuvenation.remains then applyBuff( "rejuvenation_germination" )
end
else applyBuff( "rejuvenation" ) end
if talent.soul_of_the_forest.enabled then removeBuff( "soul_of_the_forest" ) end
if buff.power_of_the_archdruid.up then
active_dot.rejuvenation = min( active_allies, active_dot.rejuvenation + 2 )
removeBuff( "power_of_the_archdruid" )
end
end,
},
-- Instantly heals you for 30% of maximum health. Usable in all shapeshift forms.
renewal = {
id = 108238,
cast = 0,
cooldown = 90,
gcd = "off",
talent = "renewal",
startsCombat = false,
texture = 136059,
toggle = "defensives",
handler = function ()
gain( 0.3 * health.max, "health" )
end,
},
skull_bash = {
id = 106839,
cast = 0,
cooldown = 15,
gcd = "off",
school = "physical",
talent = "skull_bash",
startsCombat = true,
form = function ()
if talent.fluid_form.enabled then return end
return buff.bear_form.up and "bear_form" or "cat_form" end,
toggle = "interrupts",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
if talent.fluid_form.enabled and buff.bear_form.down and buff.cat_form.down then shift( "cat_form" ) end
interrupt()
end,
},
starfire = {
id = 197628,
cast = function ()
if buff.blooming_infusion.up then return 0 end
return haste * 2.25
end,
cooldown = 0,
gcd = "spell",
spend = 0.06,
spendType = "mana",
startsCombat = true,
texture = 135753,
talent = "starfire",
handler = function ()
if buff.moonkin_form.down and buff.treant_form.down and buff.tree_of_life_form.down then
if talent.fluid_form.enabled and not buff.moonkin_form.up then unshift() end
end
if talent.blooming_infusion.enabled then removeBuff( "blooming_infusion" ) end
if talent.master_shapeshifter.enabled then gain( 43750, "mana" ) end
end,
finish = function ()
if talent.fluid_form.enabled and buff.moonkin_form.down then shift( "moonkin_form" ) end
end,
},
starsurge = {
id = 197626,
cast = 0,
cooldown = function() return 10 - ( 4 * talent.starlight_conduit.rank ) end,
gcd = "spell",
spend = function () return ( talent.starlight_conduit.enabled and 0.003 or 0.006 ) end,
spendType = "mana",
startsCombat = true,
texture = 135730,
talent = "starsurge",
handler = function ()
gain( 0.3 * health.max, "health" )
if talent.master_shapeshifter.enabled then gain( 43750, "mana" ) end
if talent.call_of_the_elder_druid.enabled and debuff.oath_of_the_elder_druid.down then
applyBuff( "heart_of_the_wild", 15 )
applyDebuff( "player", "oath_of_the_elder_druid" )
end
end,
},
-- Consumes a Regrowth, Wild Growth, or Rejuvenation effect to instantly heal an ally for 10,011. Swiftmend heals the target for 3,672 over 9 sec.
swiftmend = {
id = 18562,
cast = 0,
charges = function() if talent.prosperity.enabled then return 2 end end,
cooldown = 15,
recharge = function() if talent.prosperity.enabled then return 15 end end,
gcd = "spell",
spend = 0.10,
spendType = "mana",
startsCombat = false,
texture = 134914,
buff = function()
return buff.regrowth.up and "regrowth" or
buff.wild_growth.up and "wild_growth" or
buff.renewing_bloom.up and "renewing_bloom" or
"rejuvenation"
end,
handler = function ()
if talent.verdant_infusion.enabled then
if buff.regrowth.up then buff.regrowth.expires = buff.regrowth.expires + 8 end
if buff.wild_growth.up then buff.wild_growth.expires = buff.wild_growth.expires + 8 end
if buff.renewing_bloom.up then buff.renewing_bloom.expires = buff.renewing_bloom.expires + 8 end
if buff.rejuvenation.up then buff.rejuvenation.expires = buff.rejuvenation.expires + 8 end
else
if buff.regrowth.up then removeBuff( "regrowth" )
elseif buff.wild_growth.up then removeBuff( "wild_growth" )
elseif buff.renewing_bloom.up then removeBuff( "renewing_bloom" )
else removeBuff( "rejuvenation" ) end
end
if talent.reforestation.enabled then
if buff.reforestation.stack == 3 then
removeBuff( "reforestation" )
applyBuff( "incarnation", ( 10 + 3 * talent.potent_enchantments.rank ) )
shift( "tree_of_life_form" )
else addStack( "reforestation" )
end
end
if talent.soul_of_the_forest.enabled then applyBuff( "soul_of_the_forest" ) end
end,
},
--[[ Swipe nearby enemies, inflicting Physical damage. Damage varies by shapeshift form.
swipe = {
id = function() return buff.cat_form.up and 106785 or
buff.bear_form.up and 213771
or 213764 end,
known = 213764,
cast = 0,
cooldown = 0,
gcd = "totem",
startsCombat = false,
texture = 134296,
handler = function ()
if buff.cat_form.up then gain( 1, "combo_points" ) end
end,
copy = { 106785, 213771, 213764 },
}, ]]
-- Form a bond with an ally. Your self-healing also heals your bonded ally for 10% of the amount healed. Your healing to your bonded ally also heals you for 8% of the amount healed.
symbiotic_relationship = {
id = 474750,
cast = 2.5,
cooldown = 0,
gcd = "spell",
spend = 0.02,
spendType = "mana",
talent = "symbiotic_relationship",
startsCombat = false,
texture = 1408837,
handler = function ()
applyBuff( "symbiotic_relationship" )
end,
},
-- Heals all allies within 40 yards for 8,560 over 6.6 sec. Each heal heals the target for another 199 over 8 sec, stacking. Healing increased by 100% when not in a raid.
tranquility = {
id = 740,
cast = 5,
channeled = true,
cooldown = 180,
gcd = "spell",
spend = 0.18,
spendType = "mana",
talent = "tranquility",
startsCombat = false,
texture = 136107,
toggle = "defensives",
start = function()
TranquilityTickHandler()
local tickTime = query_time
-- Schedule the next 4 ticks of Tranquility.
for i = 1, 4 do
tickTime = tickTime + spec.auras.tranquility.tick_time
if tickTime <= query_time + spec.auras.tranquility.duration then
state:QueueAuraEvent( "tranquility_tick", TranquilityTickHandler, tickTime, "AURA_TICK" )
end
end
end,
},
-- Heals up to 5 injured allies within 30 yards of the target for 3,426 over 7 sec. Healing starts high and declines over the duration. Tree of Life: Affects 2 additional targets.
wild_growth = {
id = 48438,
cast = 1.5,
cooldown = 10,
gcd = "spell",
spend = 0.15,
spendType = "mana",
talent = "wild_growth",
startsCombat = false,
texture = 236153,
handler = function ()
if talent.soul_of_the_forest.enabled then removeBuff( "soul_of_the_forest" ) end
active_dot.wild_growth = active_dot.wild_growth + 5 + ( talent.improved_wild_growth.enabled and 1 or 0 ) + ( buff.tree_of_life_form.up and 2 or 0 )
end,
},
wrath = {
id = 5176,
cast = function ()
if buff.blooming_infusion.up or buff.tree_of_life_form.up then return 0 end
return haste * 1.5
end,
cooldown = 0,
gcd = "spell",
spend = 0.002,
spendType = "mana",
startsCombat = true,
texture = 535045,
velocity = 20,
energize_amount = function() return action.wrath.spend * -1 end,
handler = function ()
if buff.moonkin_form.down and buff.treant_form.down and buff.tree_of_life_form.down then
if talent.fluid_form.enabled and not buff.moonkin_form.up then unshift() end
end
if talent.blooming_infusion.enabled then removeBuff( "blooming_infusion" ) end
removeBuff( "gathering_starstuff" )
removeBuff( "dawning_sun" )
if talent.master_shapeshifter.enabled then gain( 43750, "mana" ) end
end,
finish = function ()
if talent.fluid_form.enabled and buff.moonkin_form.down then shift( "moonkin_form" ) end
end,
copy = { "solar_wrath", 5176 }
},
} )
spec:RegisterRanges( "rake", "shred", "skull_bash", "growl", "moonfire" )
spec:RegisterOptions( {
enabled = true,
aoe = 3,
cycle = false,
nameplates = false,
rangeFilter = false,
healing_mode = false,
damage = true,
damageDots = true,
damageExpiration = 6,
package = "Restoration Druid",
} )
spec:RegisterSetting( "experimental_msg", nil, {
type = "description",
name = strformat( "Restoration Druid supports healing maintenance by recommending key abilities. It will suggest maintaining %s, keeping at least one %s active, maintaining %s, using %s after a %s, and alerting you when %s can activate %s.",
Hekili:GetSpellLinkWithTexture( spec.abilities.lifebloom.id ),
Hekili:GetSpellLinkWithTexture( spec.abilities.rejuvenation.id ),
Hekili:GetSpellLinkWithTexture( spec.abilities.efflorescence.id ),
Hekili:GetSpellLinkWithTexture( spec.abilities.wild_growth.id ),
Hekili:GetSpellLinkWithTexture( spec.abilities.swiftmend.id ),
Hekili:GetSpellLinkWithTexture( spec.abilities.swiftmend.id ),
Hekili:GetSpellLinkWithTexture( spec.abilities.incarnation.id ) ),
width = "full",
fontSize = "medium"
} )
spec:RegisterSetting( "healing_mode", false, {
name = "Healing Helper Mode",
desc = "If checked, healing abilities may be recommended using the default priority package.",
type = "toggle",
width = "full",
} )
spec:RegisterPack( "Restoration Druid", 20250425, [[Hekili:vRvEVnoUv8plblGGDYmoso2oz2ABGTxO7IUtlQB)RIkjAjQywRddjQ4jab6ZEFK6IKIuXj7matb2zJTi57(4hFYUoU)t3DHik29ZZTNV0EX8LZCCMB74UJ(8jS7UtOGJOhHpKIsG)))axqZYruswAL)FmVKeY2YZXzOqgLkYkZdGT5UBFjjM(ZPU71qENLopa79eoW9Zo2lD3DGegIR3lUiWDhBVF0EXhNV8hR8)ZKVu5tr5pIPEKOFh85Zy0Xk)dyumj9rG)5zrKyGR)WpapLspv8J3E7Je6HY9ZcYsUTGKugZf5GCueL99GB3hNT)w6b8zu(zyRK0B)Pa2w(75KSCc95)kPGwCBitd9Y7v6zSdx9lmo9VobIswLpt9Q8zePYFhj5paI8VIYdGV9qLpttQ8)yLFqW(7dU)tv)cCyyFPOtfhYOv(5isyL)(YOim83ckIwaFfhLLdefK(9ik77pssHNJsH9Ckh)XtzukO7v(e4PHzP4zv)cIl)fZG1Rp3nBUnbLF0llYduuVZK4q97Q45K9Kmkja00AdvXbYPpqI2eMDo1IDKNWEO4ycUyRJEAaoHZXSJqrX4u6SC0r8mCkAFm2axdqupqntmCihMPQ5Cmz8yzCS3EuXbXNUhNxGZpYmfcpnfrlbFM3tKhjCz6kM9DgxeNvEYQ(RfhqG6LGJdHNjE8aqt9Q)Qxmeg8bwO)MMWTpuqZjb0nom6wG5UHIznl6LKfITeygZ(jsAyF5urhYBx6klWEekoP4TFuiQb(0B)C5LPdThG7tYwOXf(YlC626OhyMh1)lT1S0NYoI5wTItei)KR9t4KFGnf4ZlVeKLfZS(AwohNGG0PTRS)4D2x3W6aGT5KYcVhHmEuAGGsCvZwgsPMTmvkqTmnIKJ)qWZbXGeZRBvuBIYXrqy5b2zSQxygLKaBkZlKG3U0QHrKeWZ8eo0RHw6mjjzzxgFeyGZCjbfotrjCm2rAYXXP4eijF9dFD0O7TuO79QcaNWSmPtyiPRH2ZAxzRttiKoFSiPodvNpiuWGfZXcCH4jg1hgE3q32mGMVwuY6d5Hs2xwCqKfn0tB67KUqnnHPTbBRxy3hiPBFTHsGKKvuyfrE8a1R7WRuLenjpJqvRjk(HnRMAn5k1StRlst28yq4Se0xS(Uj9B6aRZy1leu4PF)OddcDHgWAs4MmriL7Lxa)z(JpV9t2wDEhhBqRynzZ8oLrsHdUuQiqZgVz(IxEzs7xe3)1lwlS)wcFZcLnTvyttNYursaRrSL422o)gLm7ZKtypqfVE(av(eyVzyT4yi)a4I8sXFb6UOUp6HCagaJiVJsslTKfOEITDHkJgPW3KxJntTUca78KhlzXPlMtBbQxrjMis3hSATZGjVnRomRU15AN2oiNYjjOyVOY8N7Qb0SucQGIZ9aIFc4ajc(s3wm4R2Uykh16)(VGpsIj)haGBwijIWqSIkyWu7tuI5Ws5av5GNRTkaHtd96xMbUnLb)TO80PSCkoC2yv4gwPQjWFLTvBQvumdQoF9bWoRP4yTmNyUNzNfhm4cU0MGJUeVWY6BiCT9ShunK1BDJZu9rfMS7RngrcsSaDAvmTYYasi01DYfetmXqRzw5dJfpv1O2dTKvP4TFS7hwIFe0lBC6tn6a0ynigAyxJljIB5BjI7sROfHZZcizqRJ9a0ETXNsvvVttjN13XmTkf(Be6nGuZlsqo116I1N4IJ7(wvYD(7PGOu6PnGJXCrV(oVJeIdBAScFkXDTRnmUB7CPEFRxoIvurLKG7TDWbV04OId5yoM0(YJJlrkbE9NCP8jNfIJibe6g73ustZ0o(BPv(qwoBkoPh7jqt7aMxh)FlFc8gSNlyx5HSclT2PJCi2)IJFwh1Ijr49XzzCzsShz3cRDu6E2VY86RV39awQFtiuzAiyBGBmqpiaBRrGEg8nf44O3PanGT8jV8Am(xHWfk8Vk))uuuCMoEJzlaHoa40G(7cj90MPua0JMJsl44u8bcNXEagRJQqwqenb6PRQr54A58gHNXkU7n8XIE2PB7GUKZN9fBqyWZ76cXLA5LG)gCCZDCb)NIpJEUGnfUya4rnVGaewwoGXOvy1PjccxBxvwZ92J4U7jCEbCM2byAp3D3zuEkBSpU7(5KA0lv(la2XjELpBgjfaEg3D8pXNWkocvgtHp(z(exR3Q7U(PA5URrvD)9UuGzI7QFkxk76o2U6FYUa4Mo4CcYD3v1ZuS7cUv(wv(Tpu6MW9SrASzmYVWi51o4lopug(fSv(mIy6DhJuhWwTHYREcZTJ1foYYVQQ3aahmwS6Rkl6MnhJ03)vL01ZUJr3hmsxDtrZ)LxAiSqDzTEfLP8j5uGZYy9NElSw0FxZzgjCSnsJjncQ2H9W1Jx)g5v(BR8xzZh5(DWFUM10z8BNxt6R62OX7Ox5pvqNgoIbU65OOEDz61i3f1xbaa8iGHqN4AZYMfhD0GaDfbnXCSmPzUbPP9gdJkokYbqm9mXCvOMQ9n4JQ8xx5)GGjPfcpNkQfB(TB4UNVOgz4EdkI56n6VxsTzriftxKRS(YvfgVwjwGNp(s5A70(kHTnn0yCe7Hw)YZai(1Frc0LgNIAlyULXPR3JgM1bordNAXJPKpRdRtnJGKPAd3y7AEFlfrazIjeAWgXYt10C8suJwuCxQAOva5WPUir0umVe8mfXubZNOKAaANUwPDXK9aDK4IwKGMTkTW(Q8Vr65cORuxso2BABUuVztlqWE7TgWGv(BGQ(6AR3LO1lpkk8LHGu0cmaQipPL1PutcRIts(vT1xaPhrq3JuFNecj)qZwD5RsoPlzK(8q5f2Qnch5fk0L9YEzfCFI0nyRj4Qxb7L5(gxIayjw6OV6oebSIlD1RF1qWp8LUqZcqTM32rlb)EhHImifbGxMbZprNnA6)VOWVkKmtL(GuFfRa8Fsqlycr98q46WNS52ePOdhBbtL4et41IwQfivhbGcIZx01fu8XYu6A(1lxRqjl5JSW4b3QCWPDzVmlC9STBskep8wE7nGMggogN8Z5EaDOPulb3o1kP7CinylDxAQDJ9Jo7DaeS2nyAiK8TSqVsOExRraLQg8mQ4mT9kFAEBa6Le1REj1eyetYKHXFp0Y8oFVwOymk3IvRVRSMHSkU8iJzvJtqiwAlpu1qS0GlnoOaNCZ8VPVOkxn3KxT9IqvJv2DMBtV2GrV4OURQPlwBWT1g4LBCXdFhwkL1adsz7pXpifN9oK046Ap6MwW8JftpUVFTX8VbxGvg(LY7)6v1JHjWJF)1jxCC9KbQN4De7lYps30HwirsSuSU9VfcDVkibPRLAgLGksRnDx9vhmmHQmAWwyAgaV(a)gjrB5fKOPFKuVVwvoM6vj)svgGhxPh7DgBvSMVyVl3a8IotWMoBGY76RUGqhsL3tEOPgHFR7lBAMtV32HdktA3M(E14T4KbKoA5GMT((A1n388rvtY22o)b5adWlUu6c(18LtCZxlv1qPCFUTsevWRZOQAr6ll)zU56UdBFoQkYERNCkAU61W6e6E9M8SkBJzYmw8MkrPTEdL37Q(NbTUrfiHK5R)puCbKfk)4WhFwcDt1QjmS(NdEDsKGVq7pL8l62(6F3b8jIm(9x1CEhdwEW2JkPhYYzZr7i6a5iH)u3)h]] )