-- DruidBalance.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 PTR = ns.PTR local spec = Hekili:NewSpecialization( 102 ) ---- 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) local GetSpellBookItemName = function( index, bookType ) local spellBank = ( bookType == BOOKTYPE_SPELL ) and Enum.SpellBookSpellBank.Player or Enum.SpellBookSpellBank.Pet; return C_SpellBook.GetSpellBookItemName( index, spellBank ); end spec:RegisterResource( Enum.PowerType.Rage ) spec:RegisterResource( Enum.PowerType.LunarPower, { fury_of_elune = { aura = "fury_of_elune_ap", last = function () local app = state.buff.fury_of_elune_ap.applied local t = state.query_time return app + floor( ( t - app ) * 2 ) * 0.5 end, interval = 0.5, value = 2.5 }, celestial_infusion = { aura = "celestial_infusion", last = function () local app = state.buff.celestial_infusion.applied local t = state.query_time return app + floor( ( t - app ) * 2 ) * 0.5 end, interval = 0.5, value = 2.5 }, natures_balance = { talent = "natures_balance", last = function () local app = state.combat local t = state.query_time return app + floor( ( t - app ) / 2 ) * 2 end, interval = 3, value = 2, } } ) spec:RegisterResource( Enum.PowerType.Mana ) spec:RegisterResource( Enum.PowerType.ComboPoints ) spec:RegisterResource( Enum.PowerType.Energy ) -- 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. Feral: Gain $s2 Combo Point every $s3 sec while in Cat Form and Physical damage increased by $s4%. Guardian: Bear Form gives an additional $s5% Stamina, multiple uses of Ironfur may overlap, and Frenzied Regeneration has $s6 charges. Restoration: Healing increased by $s7%, and mana costs reduced by $s8% 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_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% light_of_the_sun = { 104083, 202918, 1 }, -- Reduces the remaining cooldown on Solar Beam by $s1 sec when it interrupts the primary target 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. While in this form, single-target attacks against you have a $s3% chance to make your next Starfire instant. 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 damage also heals a nearby friendly target for $s2% of the damage 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 remove_corruption = { 82241, 2782, 1 }, -- Nullifies corrupting effects on the friendly target, removing all Curse and Poison effects 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 over $s12 sec $s13 points: $s14 over $s15 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 = { 82201, 194153, 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. Generates $s7 Astral Power starlight_conduit = { 100223, 451211, 1 }, -- Wrath, Starsurge, and Starfire damage increased by $s1% starsurge = { 82202, 78674, 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 to the primary target and all enemies within $s6 yards. Generates $s7 Astral Power 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 -- Balance aetherial_kindling = { 88209, 327541, 1 }, -- Casting Starfall extends the duration of active Moonfires and Sunfires by $s1 sec, up to $s2 sec astral_communion = { 88235, 450598, 1 }, -- Increases maximum Astral Power by $s1. Entering Eclipse reduces the Astral Power cost of your next Starsurge or Starfall by $s2 astral_smolder = { 88204, 394058, 1 }, -- Your Starfire and Wrath damage has a $s1% chance to cause the target to languish for an additional $s2% of your spell's damage over $s3 sec astronomical_impact = { 88232, 468960, 1 }, -- The critical strike damage of your Astral spells is increased by $s1% balance_of_all_things = { 88214, 394048, 2 }, -- Entering Eclipse increases your critical strike chance with Arcane or Nature spells by $s1%, decreasing by $s2% every $s3 sec celestial_alignment = { 88215, 194223, 1 }, -- Celestial bodies align, maintaining both Eclipses and granting $s1% haste for $s2 sec convoke_the_spirits = { 88206, 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 Starsurge, Starfall, Moonfire, Wrath, Regrowth, Rejuvenation, Rake, and Thrash on appropriate nearby targets, favoring your current shapeshift form cosmic_rapidity = { 88227, 400059, 2 }, -- Your Moonfire, Sunfire, and Stellar Flare deal damage $s1% more frequently crashing_star = { 103847, 468978, 1 }, -- Shooting Stars has a $s2% chance to instead call down a Crashing Star, dealing $s$s3 Astral damage to the target and generating $s4 Astral Power denizen_of_the_dream = { 88234, 394065, 1 }, -- Your Moonfire and Sunfire have a chance to summon a Faerie Dragon to assist you in battle for $s1 sec eclipse = { 88223, 79577, 1 }, -- Casting $s1 Starfires empowers Wrath for $s2 sec. Casting $s3 Wraths empowers Starfire for $s4 sec. Eclipse (Solar) Nature spells deal $s7% additional damage and Wrath damage is increased by $s8%. Eclipse (Lunar) Arcane spells deal $s11% additional damage and the damage Starfire deals to nearby enemies is increased by $s12% elunes_guidance = { 88228, 393991, 1 }, -- Incarnation: Chosen of Elune Reduces the Astral Power cost of Starsurge by $s3, and the Astral Power cost of Starfall by $s4. 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 force_of_nature = { 88210, 205636, 1 }, -- Summons a stand of $s1 Treants for $s2 sec which immediately taunt and attack enemies in the targeted area. Generates $s3 Astral Power fury_of_elune = { 88224, 202770, 1 }, -- Calls down a beam of pure celestial energy that follows the enemy, dealing up to $s$s2 Astral damage over $s3 sec within its area. Damage reduced on secondary targets. Generates $s4 Astral Power over its duration hail_of_stars = { 103846, 469004, 1 }, -- Casting a free Starsurge or Starfall grants Solstice for $s1 sec harmony_of_the_heavens = { 88218, 450558, 1 }, -- Starsurge or Starfall increase your current Eclipse's Arcane or Nature damage bonus by an additional $s1%, up to $s2% incarnation_chosen_of_elune = { 88206, 102560, 1 }, -- An improved Moonkin Form that grants both Eclipses, any learned Celestial Alignment bonuses, and $s1% critical strike chance. Lasts $s2 sec. You may shapeshift in and out of this improved Moonkin Form for its duration natures_balance = { 88226, 202430, 1 }, -- While in combat you generate $s1 Astral Power every $s2 sec. While out of combat your Astral Power rebalances to $s3 instead of depleting to empty natures_grace = { 88208, 450347, 1 }, -- When Eclipse ends or when you enter combat, enter a Dreamstate, reducing the cast time of your next $s1 Starfires or Wraths by $s2% new_moon = { 88224, 274281, 1 }, -- Deals $s$s2 Astral damage to the target and empowers New Moon to become Half Moon. Generates $s3 Astral Power orbit_breaker = { 88199, 383197, 1 }, -- Every $s1th Shooting Star calls down a Full Moon at $s2% effectiveness upon its target orbital_strike = { 88221, 390378, 1 }, -- Incarnation: Chosen of Elune blasts all enemies in a targeted area for $s$s2 Astral damage and applies Stellar Flare to them. Reduces the cooldown of Incarnation: Chosen of Elune by $s3 sec power_of_goldrinn = { 88200, 394046, 1 }, -- Starsurge has a chance to summon the Spirit of Goldrinn, which immediately deals $s$s2 Astral damage to the target radiant_moonlight = { 88213, 394121, 1 }, -- New Moon, Half Moon, and Full Moon deal $s1% increased damage. Full Moon becomes Full Moon once more before resetting to New Moon. Fury of Elune deals $s2% increased damage and its cooldown is reduced by $s3 sec rattle_the_stars = { 88236, 393954, 1 }, -- Starsurge and Starfall deal $s1% increased damage and their cost is reduced by $s2% shooting_stars = { 88225, 202342, 1 }, -- Moonfire and Sunfire damage over time has a chance to call down a falling star, dealing $s$s2 Astral damage and generating $s3 Astral Power solar_beam = { 88231, 78675, 1 }, -- Summons a beam of solar light over an enemy target's location, interrupting the target and silencing all enemies within the beam. Lasts $s1 sec solstice = { 88203, 343647, 1 }, -- During the first $s1 sec of every Eclipse, Shooting Stars fall $s2% more often soul_of_the_forest = { 88212, 114107, 1 }, -- Solar Eclipse increases Wrath's Astral Power generation by $s1% and Lunar Eclipse increases Starfire's damage and Astral Power generation by $s2% for each target hit beyond the first, up to $s3% starlord = { 88207, 202345, 2 }, -- Starsurge and Starfall grant you $s1% Haste for $s2 sec. Stacks up to $s3 times. Gaining a stack does not refresh the duration starweaver = { 88236, 393940, 1 }, -- Starsurge has a $s1% chance to make Starfall free. Starfall has a $s2% chance to make Starsurge free stellar_amplification = { 88229, 450212, 1 }, -- Starsurge increases the damage the target takes from your periodic effects and Shooting Stars by $s1% for $s2 sec. Reapplying this effect extends its duration, up to $s3 sec stellar_flare = { 91048, 202347, 1 }, -- Burns the target for $s$s2 Astral damage, and then an additional $s3 damage over $s4 sec. If dispelled, causes $s5 damage to the dispeller and blasts them upwards. Generates $s6 Astral Power sundered_firmament = { 88199, 394094, 1 }, -- Every other Eclipse creates a Fury of Elune at $s1% effectiveness that follows your current target for $s2 sec sunseeker_mushroom = { 88202, 468936, 1 }, -- Sunfire damage has a chance to grow a magical mushroom at a target's location. After $s3 sec, the mushroom detonates, dealing $s$s4 Nature damage and then an additional $s$s5 Nature damage over $s6 sec. Affected targets are slowed by $s7%. Generates up to $s8 Astral Power based on targets hit touch_the_cosmos = { 88222, 450356, 1 }, -- Casting Wrath in an Eclipse has a $s1% chance to make your next Starsurge or Starfall free. Casting Starfire in an Eclipse has a $s2% chance to make your next Starsurge or Starfall free twin_moons = { 88201, 279620, 1 }, -- Moonfire deals $s1% increased damage and also hits another nearby enemy within $s2 yds of the target umbral_embrace = { 88216, 393760, 1 }, -- Wrath and Starfire have a $s1% chance to cause your next Wrath or Starfire cast during an Eclipse to become Astral and deal $s2% additional damage umbral_inspiration = { 88217, 450418, 1 }, -- Consuming Umbral Embrace increases the damage of your Moonfire, Sunfire, Stellar Flare, Shooting Stars, and Starfall by $s1% for $s2 sec umbral_intensity = { 88219, 383195, 1 }, -- Solar Eclipse increases the damage of Wrath by an additional $s1%. Lunar Eclipse increases Starfire's damage by $s2% and the damage it deals to nearby enemies by an additional $s3% waning_twilight = { 88220, 393956, 1 }, -- When you have $s1 periodic effects from your spells on a target, your damage and healing on them are increased by $s2% warrior_of_elune = { 88210, 202425, 1 }, -- Your next $s1 Starfires are instant cast and generate $s2% increased Astral Power whirling_stars = { 88221, 468743, 1 }, -- Incarnation: Chosen of Elune's cooldown is reduced to $s1 seconds and it has two charges, but its duration is reduced by $s2% wild_mushroom = { 88202, 88747, 1 }, -- Grow a magical mushroom at the target enemy's location. After $s3 sec, the mushroom detonates, dealing $s$s4 Nature damage and then an additional $s$s5 Nature damage over $s6 sec. Affected targets are slowed by $s7%. Generates up to $s8 Astral Power based on targets hit wild_surges = { 91048, 406890, 1 }, -- Your Wrath and Starfire chance to critically strike is increased by $s1% and they generate $s2 additional Astral Power -- Elunes Chosen arcane_affinity = { 94586, 429540, 1 }, -- All Arcane damage from your spells and abilities is increased by $s1% astral_insight = { 94585, 429536, 1 }, -- Incarnation: Chosen of Elune increases Arcane damage from spells and abilities by $s1% while active. Increases the duration and number of spells cast by Convoke the Spirits by $s2% atmospheric_exposure = { 94607, 429532, 1 }, -- Enemies damaged by Full Moon or Fury of Elune take $s1% increased damage from you for $s2 sec boundless_moonlight = { 94608, 424058, 1 }, -- Fury of Elune Fury of Elune now ends with a flash of energy, blasting nearby enemies for $s$s5 Astral damage. Full Moon Full Moon calls down $s8 Minor Moons that deal $s$s9 Astral damage and generate $s10 Astral Power elunes_grace = { 94597, 443046, 1 }, -- Using Wild Charge while in Bear Form or Moonkin Form incurs a $s1 sec shorter cooldown glistening_fur = { 94594, 429533, 1 }, -- Bear Form and Moonkin Form reduce Arcane damage taken by $s1% and all other magic damage taken by $s2% lunar_amplification = { 94596, 429529, 1 }, -- Each non-Arcane damaging ability you use increases the damage of your next Arcane damaging ability by $s1%, stacking up to $s2 times lunar_calling = { 94590, 429523, 1 }, -- Starfire deals $s1% increased damage to its primary target, but no longer triggers Solar Eclipse lunar_insight = { 94588, 429530, 1 }, -- Moonfire deals $s1% additional damage lunation = { 94586, 429539, 1 }, -- Your Arcane abilities reduce the cooldown of Fury of Elune by $s1 sec and the cooldown of New Moon, Half Moon, and Full Moon by $s2 sec moon_guardian = { 94598, 429520, 1 }, -- Moonfire and Starfire generate $s1 additional Astral Power moondust = { 94597, 429538, 1 }, -- Enemies affected by Moonfire are slowed by $s1% stellar_command = { 94590, 429668, 1 }, -- Increases the damage of Fury of Elune by $s1% and the damage of Full Moon by $s2% the_eternal_moon = { 94587, 424113, 1 }, -- Further increases the power of Boundless Moonlight. Fury of Elune The flash of energy now generates $s3 Astral Power and its damage is increased by $s4%. Full Moon New Moon and Half Moon now also call down $s7 Minor Moon the_light_of_elune = { 94585, 428655, 1 }, -- Moonfire damage has a chance to call down a Fury of Elune to follow your target for $s2 sec. Fury of Elune Calls down a beam of pure celestial energy, dealing $s$s5 Astral damage over $s6 sec within its area. Generates $s7 Astral Power over its duration -- 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 or Starfalls you cast makes your next Regrowth or Entangling roots instant bounteous_bloom = { 94591, 429215, 1 }, -- Your Force of Nature treants generate $s1 Astral Power every $s2 sec cenarius_might = { 94604, 455797, 1 }, -- Entering Eclipse 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 Force of Nature, Incarnation: Chosen of Elune, and Convoke the Spirits dream_surge = { 94600, 433831, 1 }, -- Force of Nature grants $s2 charges of Dream Burst, causing your next Wrath or Starfire to explode on the target, dealing $s$s3 Nature damage to nearby enemies. Damage reduced above $s4 targets durability_of_nature = { 94605, 429227, 1 }, -- Your Force of Nature treants have $s1% increased health early_spring = { 94591, 428937, 1 }, -- Force of Nature cooldown reduced by $s1 sec expansiveness = { 94602, 429399, 1 }, -- Your maximum mana is increased by $s1% and your maximum Astral Power is increased by $s2 groves_inspiration = { 94595, 429402, 1 }, -- Wrath and Starfire damage increased by $s1%. Regrowth and Wild Growth healing increased by $s2% harmony_of_the_grove = { 94606, 428731, 1 }, -- Each of your Force of Nature treants increases damage your spells deal by $s1% while active potent_enchantments = { 94595, 429420, 1 }, -- Orbital Strike applies Stellar Flare for $s1 additional sec and deals $s2% increased damage. Whirling Stars reduces the cooldown of Incarnation: Chosen of Elune by an additional $s3 sec power_of_nature = { 94605, 428859, 1 }, -- Your Force of Nature treants no longer taunt and deal $s1% increased melee damage power_of_the_dream = { 94592, 434220, 1 }, -- Force of Nature grants an additional stack of Dream Burst 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 Force of Nature treants cast Moonfire on nearby targets about once every $s1 sec } ) -- PvP Talents spec:RegisterPvpTalents( { celestial_guardian = 180, -- (233754) crescent_burn = 182, -- (200567) deep_roots = 834, -- (233755) dying_stars = 822, -- (410544) faerie_swarm = 836, -- (209749) Swarms the target with Faeries, disarming the enemy, preventing the use of any weapons or shield and reducing movement speed by $s1% for $s2 sec high_winds = 5383, -- (200931) Increases the range of Cyclone, Typhoon, and Entangling Roots by $s1 yds malornes_swiftness = 5515, -- (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 master_shapeshifter = 5604, -- (411266) moon_and_stars = 184, -- (233750) moonkin_aura = 185, -- (209740) owlkin_adept = 5407, -- (354541) protector_of_the_grove = 3728, -- (209730) star_burst = 3058, -- (356517) thorns = 3731, -- (1217017) Casting Barkskin 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 = 5646, -- (377801) For $s1 sec after leaving Cat Form or Travel Form, you retain up to $s2% movement speed } ) spec:RegisterPower( "lively_spirit", 279642, { id = 279648, duration = 20, max_stack = 1, } ) local mod_circle_hot = setfenv( function( x ) return x end, state ) local mod_circle_dot = setfenv( function( x ) return x end, state ) -- Auras spec:RegisterAuras( { astral_communion = { id = 450599, duration = 15, max_stack = 1 }, astral_smolder = { id = 394061, duration = 6, max_stack = 1 }, -- Talent: Critical strike chance with Nature spells increased $w1%. -- https://wowhead.com/beta/spell=394049 balance_of_all_things_nature = { id = 394049, duration = 10, max_stack = 10, copy = 339943 }, -- Talent: Critical strike chance with Arcane spells increased $w1%. -- https://wowhead.com/beta/spell=394050 balance_of_all_things_arcane = { id = 394050, duration = 10, max_stack = 10, copy = 339946 }, -- All damage taken reduced by $w1%. -- https://wowhead.com/beta/spell=22812 barkskin = { id = 22812, duration = 8, type = "Magic", max_stack = 1 }, -- Armor increased by $w4%. Stamina increased by $1178s2%. Immune to Polymorph effects. -- https://wowhead.com/beta/spell=5487 bear_form = { id = 5487, duration = 3600, type = "Magic", max_stack = 1 }, -- Generate $343216s1 combo $lpoint:points; every $t1 sec. Combo point generating abilities generate $s2 additional combo $lpoint:points;. Finishing moves restore up to $405189u combo points generated over the cap. All attack and ability damage is increased by $s3%. berserk = { id = 106951, duration = 15.0, max_stack = 1, }, -- Your next Wrath, Starfire, or Entangling Roots is instant and deals $w2% increased damage. blooming_infusion = { id = 429474, duration = 12.0, max_stack = 1, }, blooming_infusion_regrowth = { id = 429438, duration = 12.0, max_stack = 1, }, -- Autoattack damage increased by $w4%. Immune to Polymorph effects. Movement speed increased by $113636s1% and falling damage reduced. -- https://wowhead.com/beta/spell=768 cat_form = { id = 768, duration = 3600, type = "Magic", max_stack = 1 -- Affected by: -- druid[137009] #3: { 'type': APPLY_AURA, 'subtype': MOD_GLOBAL_COOLDOWN_BY_HASTE_REGEN, 'sp_bonus': 0.25, 'points': 100.0, 'value': 11, 'schools': ['physical', 'holy', 'nature'], 'target': TARGET_UNIT_CASTER, } -- starfall[191034] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, } -- starfall[344869] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, } }, -- Talent: Both Eclipses active. Haste increased by $w2%. -- https://wowhead.com/beta/spell=194223 celestial_alignment = { id = 194223, duration = function () return 15 * ( talent.whirling_stars.enabled and 0.8 or 1 ) + ( conduit.precise_alignment.mod * 0.001 ) end, type = "Magic", max_stack = 1, copy = 383410 -- Affected by: -- orbital_strike[390378] #0: { 'type': APPLY_AURA, 'subtype': OVERRIDE_ACTIONBAR_SPELLS, 'spell': 383410, 'value': 194223, 'schools': ['physical', 'holy', 'fire', 'nature', 'shadow'], 'value1': 2, 'target': TARGET_UNIT_CASTER, } -- orbital_strike[390378] #2: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -60000.0, 'target': TARGET_UNIT_CASTER, 'modifies': COOLDOWN, } }, ca_inc = {}, -- stub for celestial vs. incarnation -- Heals $w1 damage every $t1 seconds. -- https://wowhead.com/beta/spell=102352 cenarion_ward = { id = 102352, duration = 8, tick_time = 2, type = "Magic", max_stack = 1 }, -- Haste increased by $w1%. cenarius_might = { id = 455801, duration = 6.0, max_stack = 1, }, -- Talent / Covenant (Night Fae): Every 0.25 sec, casting Wild Growth, Swiftmend, Moonfire, Wrath, Regrowth, Rejuvenation, Rake or Thrash on appropriate nearby targets. -- https://wowhead.com/beta/spell=391528 convoke_the_spirits = { id = 391528, duration = function() return talent.astral_insight.enabled and 5 or 4 end, tick_time = 0.25, max_stack = 99, copy = 323764 }, -- Heals $w1 damage every $t1 seconds. -- https://wowhead.com/beta/spell=200389 cultivation = { id = 200389, duration = 6, max_stack = 1 }, -- Talent: Disoriented and invulnerable. -- https://wowhead.com/beta/spell=33786 cyclone = { id = 33786, duration = 5, mechanic = "banish", type = "Magic", max_stack = 1 -- Affected by: -- cat_form[3025] #3: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -500.0, 'target': TARGET_UNIT_CASTER, 'modifies': GLOBAL_COOLDOWN, } -- heart_of_the_wild[319454] #12: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': -30.0, 'target': TARGET_UNIT_CASTER, 'modifies': CAST_TIME, } }, -- Increased movement speed by $s1% while in Cat Form. -- https://wowhead.com/beta/spell=1850 dream_burst = { id = 433832, duration = 30, type = "Magic", max_stack = function() return talent.power_of_the_dream.enabled and 4 or 3 end, }, dash = { id = 1850, duration = 10, type = "Magic", max_stack = 1 }, -- Arcane spells deal $w1% additional damage$?<$w5>0>[, area effect damage increased $w5%,][] and Starfire's critical strike chance is increased by $w2%. -- https://wowhead.com/beta/spell=48518 eclipse_lunar = { id = 48518, duration = 16, max_stack = 1, }, -- Nature spells deal $w1% additional damage$?<$w5>0>[, Astral Power generation increased $w5%,][] and Wrath's damage is increased by $w2%. -- https://wowhead.com/beta/spell=48517 eclipse_solar = { id = 48517, duration = 16, max_stack = 1, }, -- Rooted.$?<$w2>0>[ Suffering $w2 Nature damage every $t2 sec.][] -- https://wowhead.com/beta/spell=339 entangling_roots = { id = 339, duration = 30, tick_time = 2, mechanic = "root", type = "Magic", max_stack = 1 }, faerie_swarm = { id = 209749, duration = 5, max_stack = 1 }, force_of_nature = { -- TODO: Is a totem? Summon? id = 205644, duration = 15, max_stack = 1, }, forestwalk = { id = 400129, duration = 6.0, max_stack = 1 }, -- Bleeding for $w1 damage every $t sec. -- https://wowhead.com/beta/spell=391140 frenzied_assault = { id = 391140, duration = 8, tick_time = 2, mechanic = "bleed", max_stack = 1 }, -- Talent: Healing $w1% health every $t1 sec. -- https://wowhead.com/beta/spell=22842 frenzied_regeneration = { id = 22842, duration = 3, tick_time = 1, max_stack = 1 }, -- Movement speed reduced by $s2%. Suffering $w1 Nature damage every $t1 sec. fungal_growth = { id = 81281, duration = 10, tick_time = 2, type = "Magic", max_stack = 1 }, -- Talent: Generating ${$m3/10/$t3*$d} Astral Power over $d. -- https://wowhead.com/beta/spell=202770 fury_of_elune_ap = { id = 202770, duration = 8, tick_time = 0.5, max_stack = 1, generate = function ( t ) local applied = action.fury_of_elune.lastCast if applied and now - applied < 8 then t.count = 1 t.expires = applied + 8 t.applied = applied t.caster = "player" return end t.count = 0 t.expires = 0 t.applied = 0 t.caster = "nobody" end, copy = "fury_of_elune" -- Affected by: -- mastery_astral_invocation[393014] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'sp_bonus': 0.6, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- mastery_astral_invocation[393014] #1: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'sp_bonus': 0.6, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } -- mastery_astral_invocation[393014] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'sp_bonus': 0.6, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- mastery_astral_invocation[393014] #3: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'sp_bonus': 0.6, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } -- moonfire[164812] #2: { 'type': APPLY_AURA, 'subtype': MOD_SPELL_DAMAGE_FROM_CASTER, 'target': TARGET_UNIT_TARGET_ENEMY, } -- moonfire[164812] #3: { 'type': APPLY_AURA, 'subtype': MOD_SPELL_DAMAGE_FROM_CASTER, 'target': TARGET_UNIT_TARGET_ENEMY, } -- sunfire[164815] #2: { 'type': APPLY_AURA, 'subtype': MOD_SPELL_DAMAGE_FROM_CASTER, 'radius': 8.0, 'target': TARGET_DEST_TARGET_ENEMY, 'target2': TARGET_UNIT_DEST_AREA_ENEMY, } -- sunfire[164815] #3: { 'type': APPLY_AURA, 'subtype': MOD_SPELL_DAMAGE_FROM_CASTER, 'radius': 8.0, 'target': TARGET_DEST_TARGET_ENEMY, 'target2': TARGET_UNIT_DEST_AREA_ENEMY, } -- radiant_moonlight[394121] #0: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -15000.0, 'target': TARGET_UNIT_CASTER, 'modifies': COOLDOWN, } -- radiant_moonlight[394121] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 50.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- balance_of_all_things[394049] #0: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'target': TARGET_UNIT_CASTER, 'modifies': CRIT_CHANCE, } -- eclipse_solar[48517] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 15.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- eclipse_solar[48517] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, } -- eclipse_solar[48517] #3: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, } }, -- Taunted. -- https://wowhead.com/beta/spell=6795 growl = { id = 6795, duration = 3, mechanic = "taunt", max_stack = 1 }, harmony_of_the_grove = { id = 428735, duration = 10, max_stack = 1 }, -- Talent: Abilities not associated with your specialization are substantially empowered. -- https://wowhead.com/beta/spell=319454 heart_of_the_wild = { id = 319454, duration = 45, tick_time = 2, max_stack = 1, copy = { 108291, 108292, 108293, 108294 } }, -- Talent: Asleep. -- https://wowhead.com/beta/spell=2637 hibernate = { id = 2637, duration = 40, mechanic = "sleep", type = "Magic", max_stack = 1 }, -- Talent: Incapacitated. -- https://wowhead.com/beta/spell=99 incapacitating_roar = { id = 99, duration = 3, mechanic = "incapacitate", max_stack = 1 -- Affected by: -- druid[137009] #3: { 'type': APPLY_AURA, 'subtype': MOD_GLOBAL_COOLDOWN_BY_HASTE_REGEN, 'sp_bonus': 0.25, 'points': 100.0, 'value': 11, 'schools': ['physical', 'holy', 'nature'], 'target': TARGET_UNIT_CASTER, } -- astral_influence[197524] #2: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': 3.0, 'target': TARGET_UNIT_CASTER, 'modifies': RADIUS, } -- starfall[191034] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, } -- starfall[344869] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, } }, -- Talent: Both Eclipses active. Critical strike chance increased by $w2%$?s194223[ and haste increased by $w1%][]. -- https://wowhead.com/beta/spell=102560 incarnation = { id = 102560, duration = function () return 20 + ( conduit.precise_alignment.mod * 0.001 ) end, max_stack = 1, copy = "incarnation_chosen_of_elune", -- Affected by: -- druid[137009] #3: { 'type': APPLY_AURA, 'subtype': MOD_GLOBAL_COOLDOWN_BY_HASTE_REGEN, 'sp_bonus': 0.25, 'points': 100.0, 'value': 11, 'schools': ['physical', 'holy', 'nature'], 'target': TARGET_UNIT_CASTER, } -- elunes_guidance[393991] #4: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER_BY_LABEL, 'points': -80.0, 'target': TARGET_UNIT_CASTER, 'modifies': EFFECT_3_VALUE, } -- elunes_guidance[393991] #5: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER_BY_LABEL, 'points': -100.0, 'target': TARGET_UNIT_CASTER, 'modifies': EFFECT_4_VALUE, } -- orbital_strike[390378] #1: { 'type': APPLY_AURA, 'subtype': OVERRIDE_ACTIONBAR_SPELLS, 'spell': 390414, 'value': 102560, 'schools': ['shadow'], 'value1': 2, 'target': TARGET_UNIT_CASTER, } -- orbital_strike[390378] #2: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -60000.0, 'target': TARGET_UNIT_CASTER, 'modifies': COOLDOWN, } }, -- Movement speed slowed by $w1%.$?e1[ Healing taken reduced by $w2%.][] -- https://wowhead.com/beta/spell=58180 infected_wounds = { id = 58180, duration = 12, max_stack = 1 }, -- Talent: Mana costs reduced $w1%. -- https://wowhead.com/beta/spell=29166 innervate = { id = 29166, duration = 10, type = "Magic", max_stack = 1 -- Affected by: -- cat_form[768] #1: { 'type': APPLY_AURA, 'subtype': MOD_IGNORE_SHAPESHIFT, 'target': TARGET_UNIT_CASTER, } -- bear_form[5487] #1: { 'type': APPLY_AURA, 'subtype': MOD_IGNORE_SHAPESHIFT, 'target': TARGET_UNIT_CASTER, } }, -- Talent: Armor increased by ${$w1*$AGI/100}. -- https://wowhead.com/beta/spell=192081 ironfur = { id = 192081, duration = 7, type = "Magic", max_stack = 1 }, -- The damage of your next Arcane ability is increased by $w1%. lunar_amplification = { id = 431250, duration = 45.0, max_stack = 1, }, -- Versatility increased by $w1%. -- https://wowhead.com/beta/spell=1126 mark_of_the_wild = { id = 1126, duration = 3600, type = "Magic", max_stack = 1, shared = "player" }, -- Talent: Rooted. -- https://wowhead.com/beta/spell=102359 mass_entanglement = { id = 102359, duration = 10, tick_time = 2, mechanic = "root", type = "Magic", max_stack = 1 }, -- Talent: Absorbs $w1 damage. -- https://wowhead.com/beta/spell=385787 matted_fur = { id = 385787, duration = 8, max_stack = 1 }, -- Talent: Stunned. -- https://wowhead.com/beta/spell=5211 mighty_bash = { id = 5211, duration = 4, mechanic = "stun", max_stack = 1 }, -- PvP Talent: Entering an Eclipse summons a beam of light at your location granting you 50% reduction in silence and interrupts for 6 sec. -- https://www.wowhead.com/spell=234084 moon_and_stars = { id = 234084, duration = 6, max_stack = 1 }, -- Suffering $w2 Arcane damage every $t2 seconds.$?$w8<0[; Movement slowed by $w8%.][] moonfire = { id = 164812, duration = function () return mod_circle_dot( level > 13 and 22 or 18 ) end, tick_time = function () return mod_circle_dot( 2 ) * ( 1 - 0.125 * talent.cosmic_rapidity.rank ) * haste end, type = "Magic", max_stack = 1, copy = { 155625, "moonfire_dmg" } }, -- PvP Talent: Starsurge grants 4% spell critical strike chance to 8 allies within 40 yards for 18 sec, stacking up to 3 times. -- https://www.wowhead.com/spell=209746 moonkin_aura = { id = 209746, duration = 18, max_stack = 3 }, -- Spell damage increased by $s9%.; Immune to Polymorph effects.$?$w3>0[; Armor increased by $w3%.][]$?$w12<0[; Arcane damage taken reduced by $w13% and all other magic damage taken reduced by $w12%.][] moonkin_form = { id = 24858, duration = 3600, type = "Magic", max_stack = 1, copy = 197625 }, -- Talent: $?s137012[Single-target healing also damages a nearby enemy target for $w3% of the healing done][Single-target damage also heals a nearby friendly target for $w3% of the damage done]. -- https://wowhead.com/beta/spell=124974 natures_vigil = { id = 124974, duration = 15, tick_time = 0.5, max_stack = 1 }, orbit_breaker = { id = 329970, duration = 3600, max_stack = 20 }, -- Your next Starfire is instant cast$?s354541[ or your next Cyclone or Entangling Roots cast time is reduced by $s2%.][.] -- https://wowhead.com/beta/spell=157228 owlkin_frenzy = { id = 157228, duration = 10, type = "Magic", max_stack = function () return pvptalent.owlkin_adept.enabled and 2 or 1 end }, parting_skies = { id = 395110, duration = 60, max_stack = 1, }, -- All damage taken reduced by $w1%. protective_growth = { id = 433749, duration = 3600, max_stack = 1, }, -- Stealthed. -- https://wowhead.com/beta/spell=5215 prowl_base = { id = 5215, duration = 3600, multiplier = function() return talent.pouncing_strikes.enabled and 1.6 or 1 end, }, prowl_incarnation = { id = 102547, duration = 3600, multiplier = function() return talent.pouncing_strikes.enabled and 1.6 or 1 end, }, prowl = { alias = { "prowl_base", "prowl_incarnation" }, aliasMode = "first", aliasType = "buff", duration = 3600 }, -- Cost of Starsurge and Starfall reduced by $w1%, and their damage increased by $w2%. -- https://wowhead.com/beta/spell=393955 rattled_stars = { id = 393955, duration = 6, max_stack = 2, copy = "rattle_the_stars" }, -- Heals $w2 every $t2 sec. -- https://wowhead.com/beta/spell=8936 regrowth = { id = 8936, duration = function () return mod_circle_hot( 12 ) end, tick_time = function () return mod_circle_hot( 2 ) end, type = "Magic", max_stack = 1, dot = "buff", friendly = true }, -- Healing $w1 every $t1 sec. rejuvenation = { id = 774, duration = 12.0, pandemic = true, max_stack = 1, }, -- Healing $w1 every $t1 sec. -- https://wowhead.com/beta/spell=155777 rejuvenation_germination = { id = 155777, duration = 12, type = "Magic", max_stack = 1 }, -- Healing $s1 every $t sec. -- https://wowhead.com/beta/spell=364686 renewing_bloom = { id = 364686, duration = 8, max_stack = 1 }, -- Bleeding for $w1 damage every $t1 sec. rip = { id = 1079, duration = 4.0, tick_time = 2.0, pandemic = true, max_stack = 1, }, rising_light_falling_night_day = { id = 417714, duration = 3600, max_stack = 1 }, rising_light_falling_night_night = { id = 417715, duration = 3600, max_stack = 1 }, -- Talent: Silenced. -- https://wowhead.com/beta/spell=81261 solar_beam = { id = 81261, duration = 3600, max_stack = 1, }, -- Talent: Interrupted. -- https://wowhead.com/beta/spell=78675 solar_beam_silence = { -- Silence. id = 78675, duration = 8, max_stack = 1 }, solstice = { id = 343648, duration = 6, max_stack = 1, }, -- Heals $w1 damage every $t1 seconds. -- https://wowhead.com/beta/spell=207386 spring_blossoms = { id = 207386, duration = 6, max_stack = 1 }, stag_form = { id = 210053, duration = 3600, max_stack = 1, generate = function () local form = GetShapeshiftForm() local stag = form and form > 0 and select( 4, GetShapeshiftFormInfo( form ) ) local sf = buff.stag_form if stag == 210053 then sf.count = 1 sf.applied = now sf.expires = now + 3600 sf.caster = "player" return end sf.count = 0 sf.applied = 0 sf.expires = 0 sf.caster = "nobody" end, copy = "mount_form" }, -- Movement speed increased by $s1%. stampeding_roar = { id = 106898, duration = 8.0, max_stack = 1, }, -- Talent: Calling down falling stars on nearby enemies. -- https://wowhead.com/beta/spell=191034 starfall = { id = 191034, duration = 8, tick_time = 1.0, type = "Magic", max_stack = 20, copy = 393040 }, starlord = { id = 279709, duration = 20, max_stack = 3, }, starweavers_warp = { -- free Starfall. id = 393942, duration = 30, max_stack = 1, }, starweavers_weft = { -- free Starsurge. id = 393944, duration = 30, max_stack = 1, }, -- Damage over time from $@auracaster increased by $w1%. stellar_amplification = { id = 450214, duration = 5.0, max_stack = 1, }, -- Talent: Suffering $w2 Astral damage every $t2 sec. -- https://wowhead.com/beta/spell=202347 stellar_flare = { id = 202347, duration = function () return mod_circle_dot( 24 ) end, tick_time = function () return mod_circle_dot( 2 ) * ( 1 - 0.125 * talent.cosmic_rapidity.rank ) * haste end, type = "Magic", max_stack = 1 }, -- Talent: Suffering $w2 Nature damage every $t2 seconds. -- https://wowhead.com/beta/spell=164815 sunfire = { id = 164815, duration = function () return mod_circle_dot( 18 ) end, tick_time = function () return mod_circle_dot( 2 ) * ( 1 - 0.125 * talent.cosmic_rapidity.rank ) * haste end, type = "Magic", max_stack = 1 }, -- Bleeding for $w1 damage every $t1 seconds. -- https://wowhead.com/beta/spell=391356 tear = { id = 391356, duration = 8, tick_time = 2, mechanic = "bleed", max_stack = 1 }, -- Melee attackers take Nature damage when hit and their movement speed is slowed by $232559s1% for $232559d. -- https://wowhead.com/beta/spell=305497 thorns = { id = 305497, duration = 12, max_stack = 1 }, -- Talent: Increased movement speed by $s1% while in Cat Form, reducing gradually over time. -- https://wowhead.com/beta/spell=252216 tiger_dash = { id = 252216, duration = 5, type = "Magic", max_stack = 1 }, touch_the_cosmos = { id = 450360, duration = 15, max_stack = 1, copy = { "touch_the_cosmos_starfall", "touch_the_cosmos_starsurge" } }, -- Immune to Polymorph effects. Movement speed increased. -- https://wowhead.com/beta/spell=783 travel_form = { id = 783, duration = 3600, type = "Magic", max_stack = 1 }, treant_form = { id = 114282, duration = 3600, max_stack = 1, }, -- Talent: Dazed. -- https://wowhead.com/beta/spell=61391 typhoon = { id = 61391, duration = 6, type = "Magic", max_stack = 1 }, -- Talent: Your next Wrath of Starfire deals Astral damage and deals $w1% additional damage. -- https://wowhead.com/beta/spell=393763 umbral_embrace = { id = 393763, duration = 15, max_stack = 1 }, -- Moonfire, Sunfire, Stellar Flare, Shooting Stars, and Starfall damage increased by $w1% umbral_inspiration = { id = 450419, duration = 6.0, max_stack = 1, }, ursine_vigor = { id = 340541, duration = 4, max_stack = 1 }, -- Movement speed slowed by $s1% and winds impeding movement. -- https://wowhead.com/beta/spell=102793 ursols_vortex = { id = 102793, duration = 10, type = "Magic", max_stack = 1 }, -- Talent: Starfire is instant cast and generates $s2% increased Astral Power. -- https://wowhead.com/beta/spell=202425 warrior_of_elune = { id = 202425, duration = 25, type = "Magic", max_stack = 3 }, -- Talent: Flying to an ally's position. -- https://wowhead.com/beta/spell=102401 wild_charge = { id = 102401, duration = 0.5, max_stack = 1 }, -- Talent: Heals $w1 damage every $t1 sec. -- https://wowhead.com/beta/spell=48438 wild_growth = { id = 48438, duration = 7, type = "Magic", max_stack = 1 }, -- Legendaries celestial_infusion = { id = 367907, duration = 8, max_stack = 1 }, oath_of_the_elder_druid = { id = 338643, duration = 60, max_stack = 1 }, oneths_perception = { id = 339800, duration = 30, max_stack = 1, }, oneths_clear_vision = { id = 339797, duration = 30, max_stack = 1, }, primordial_arcanic_pulsar = { id = 393961, duration = 3600, max_stack = 100, copy = 338825 }, timeworn_dreambinder = { id = 340049, duration = 6, max_stack = 2, }, } ) spec:RegisterGear({ -- The War Within tww3 = { items = { 237685, 237680, 237683, 237681, 237682 }, auras = { -- Elunes Chosen gathering_moonlight = { id = 1236989, duration = 20, max_stack = 15 }, moonlight_suffusion = { id = 1236990, duration = 12, max_stack = 15 }, -- 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 } }, tww1 = { items = { 212059, 212057, 212056, 212055, 212054 } }, -- Dragonflight tier31 = { items = { 207252, 207253, 207254, 207255, 207257 }, auras = { dreamstate = { id = 424248, duration = 3600, max_stack = 2, copy = 450346 } } }, tier30 = { items = { 202518, 202516, 202515, 202514, 202513 } }, tier29 = { items = { 200351, 200353, 200354, 200355, 200356, 217193, 217195, 217191, 217192, 217194 }, auras = { gathering_starstuff = { id = 394412, duration = 15, max_stack = 3 }, touch_the_cosmos = { id = 394414, duration = 15, max_stack = 1 } } }, -- Legacy tier21 = { items = { 152127, 152129, 152125, 152124, 152126, 152128 }, auras = { solar_solstice = { id = 252767, duration = 6, max_stack = 1 } } }, tier20 = { items = { 147136, 147138, 147134, 147133, 147135, 147137 } }, tier19 = { items = { 138330, 138336, 138366, 138324, 138327, 138333 } }, class = { items = { 139726, 139728, 139723, 139730, 139725, 139729, 139727, 139724 } }, impeccable_fel_essence = { items = { 137039 } }, oneths_intuition = { items = { 137092 }, auras = { oneths_intuition = { id = 209406, duration = 3600, max_stacks = 1 }, oneths_overconfidence = { id = 209407, duration = 3600, max_stacks = 1 } } }, radiant_moonlight = { items = { 151800 } }, the_emerald_dreamcatcher = { items = { 137062 }, auras = { the_emerald_dreamcatcher = { id = 224706, duration = 5, max_stack = 2 } } } } ) -- Adaptive Swarm Stuff do local applications = { SPELL_AURA_APPLIED = true, SPELL_AURA_REFRESH = true, SPELL_AURA_APPLIED_DOSE = true } local casts = { SPELL_CAST_SUCCESS = true } local removals = { SPELL_AURA_REMOVED = true, SPELL_AURA_BROKEN = true, SPELL_AURA_BROKEN_SPELL = true, SPELL_AURA_REMOVED_DOSE = true, SPELL_DISPEL = true } local deaths = { UNIT_DIED = true, UNIT_DESTROYED = true, UNIT_DISSIPATES = true, PARTY_KILL = true, SPELL_INSTAKILL = true, } local spellIDs = { [325733] = true, [325889] = true, [325748] = true, [325891] = true, [325727] = true } local flights = {} local pending = {} local swarms = {} -- Flow: Cast -> In Flight -> Application -> Ticks -> Removal -> In Flight -> Application -> Ticks -> Removal -> ... -- If the swarm target dies, it will jump again. local insert, remove = table.insert, table.remove function Hekili:EmbedAdaptiveSwarm( s ) s:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName ) if not state.covenant.necrolord and not state.talent.adaptive_swarm.enabled then return end if sourceGUID == state.GUID and spellIDs[ spellID ] then -- On cast, we need to show we have a cast-in-flight. if casts[ subtype ] then local dot if bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 then dot = "adaptive_swarm_damage" else dot = "adaptive_swarm_heal" end insert( flights, { destGUID, 3, GetTime() + 5, dot } ) -- On application, we need to store the GUID of the unit so we can get the stacks and expiration time. elseif applications[ subtype ] and #flights > 0 then local n, flight for i, v in ipairs( flights ) do if v[1] == destGUID then n = i flight = v break end if not flight and v[1] == "unknown" then n = i flight = v end end if flight then local swarm = swarms[ destGUID ] local now = GetTime() if swarm and swarm.expiration > now then swarm.stacks = swarm.stacks + flight[2] swarm.dot = bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 and "adaptive_swarm_damage" or "adaptive_swarm_heal" swarm.expiration = now + class.auras[ swarm.dot ].duration else swarms[ destGUID ] = {} swarms[ destGUID ].stacks = flight[2] swarms[ destGUID ].dot = bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 and "adaptive_swarm_damage" or "adaptive_swarm_heal" swarms[ destGUID ].expiration = now + class.auras[ swarms[ destGUID ].dot ].duration end remove( flights, n ) else swarms[ destGUID ] = {} swarms[ destGUID ].stacks = 3 -- We'll assume it's fresh. swarms[ destGUID ].dot = bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 and "adaptive_swarm_damage" or "adaptive_swarm_heal" swarms[ destGUID ].expiration = GetTime() + class.auras[ swarms[ destGUID ].dot ].duration end elseif removals[ subtype ] then -- If we have a swarm for this, remove it. local swarm = swarms[ destGUID ] if swarm then swarms[ destGUID ] = nil if swarm.stacks > 1 then local dot if bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 then dot = "adaptive_swarm_heal" else dot = "adaptive_swarm_damage" end insert( flights, { "unknown", swarm.stacks - 1, GetTime() + 5, dot } ) end end end elseif swarms[ destGUID ] and deaths[ subtype ] then -- If we have a swarm for this, remove it. local swarm = swarms[ destGUID ] if swarm then swarms[ destGUID ] = nil if swarm.stacks > 1 then if bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 then dot = "adaptive_swarm_heal" else dot = "adaptive_swarm_damage" end insert( flights, { "unknown", swarm.stacks - 1, GetTime() + 5, dot } ) end end end end ) function s.GetActiveSwarms() return swarms end function s.GetPendingSwarms() return pending end function s.GetInFlightSwarms() return flights end local flySwarm, landSwarm landSwarm = setfenv( function( aura ) if aura.key == "adaptive_swarm_heal_in_flight" then applyBuff( "adaptive_swarm_heal", 12, min( 5, buff.adaptive_swarm_heal.stack + aura.count ) ) buff.adaptive_swarm_heal.expires = query_time + 12 state:QueueAuraEvent( "adaptive_swarm", flySwarm, buff.adaptive_swarm_heal.expires, "AURA_EXPIRATION", buff.adaptive_swarm_heal ) else applyDebuff( "target", "adaptive_swarm_damage", 12, min( 5, debuff.adaptive_swarm_damage.stack + aura.count ) ) debuff.adaptive_swarm_damage.expires = query_time + 12 state:QueueAuraEvent( "adaptive_swarm", flySwarm, debuff.adaptive_swarm_damage.expires, "AURA_EXPIRATION", debuff.adaptive_swarm_damage ) end end, state ) flySwarm = setfenv( function( aura ) if aura.key == "adaptive_swarm_heal" then applyBuff( "adaptive_swarm_heal_in_flight", 5, aura.count - 1 ) state:QueueAuraEvent( "adaptive_swarm", landSwarm, query_time + 5, "AURA_EXPIRATION", buff.adaptive_swarm_heal_in_flight ) else applyBuff( "adaptive_swarm_damage_in_flight", 5, aura.count - 1 ) state:QueueAuraEvent( "adaptive_swarm", landSwarm, query_time + 5, "AURA_EXPIRATION", buff.adaptive_swarm_damage_in_flight ) end end, state ) s.SwarmOnReset = setfenv( function() for k, v in pairs( swarms ) do if v.expiration + 0.1 <= now then swarms[ k ] = nil end end for i = #flights, 1, -1 do if flights[i][3] + 0.1 <= now then remove( flights, i ) end end local target = UnitGUID( "target" ) local tSwarm = swarms[ target ] if not UnitIsFriend( "target", "player" ) and tSwarm and tSwarm.expiration > now then applyDebuff( "target", "adaptive_swarm_damage", tSwarm.expiration - now, tSwarm.stacks ) debuff.adaptive_swarm_damage.expires = tSwarm.expiration if tSwarm.stacks > 1 then state:QueueAuraEvent( "adaptive_swarm", flySwarm, tSwarm.expiration, "AURA_EXPIRATION", debuff.adaptive_swarm_damage ) end end if buff.adaptive_swarm_heal.up and buff.adaptive_swarm_heal.stack > 1 then state:QueueAuraEvent( "adaptive_swarm", flySwarm, buff.adaptive_swarm_heal.expires, "AURA_EXPIRATION", buff.adaptive_swarm_heal ) else for k, v in pairs( swarms ) do if k ~= target and v.dot == "adaptive_swarm_heal" then applyBuff( "adaptive_swarm_heal", v.expiration - now, v.stacks ) buff.adaptive_swarm_heal.expires = v.expiration if v.stacks > 1 then state:QueueAuraEvent( "adaptive_swarm", flySwarm, buff.adaptive_swarm_heal.expires, "AURA_EXPIRATION", buff.adaptive_swarm_heal ) end end end end local flight for i, v in ipairs( flights ) do if not flight or v[3] > now and v[3] > flight then flight = v end end if flight then local dot = flight[4] .. "_in_flight" applyBuff( dot, flight[3] - now, flight[2] ) state:QueueAuraEvent( dot, landSwarm, flight[3], "AURA_EXPIRATION", buff[ dot ] ) end Hekili:Debug( "Swarm Info:\n Damage - %.2f remains, %d stacks.\n Dmg In Flight - %.2f remains, %d stacks.\n Heal - %.2f remains, %d stacks.\n Heal In Flight - %.2f remains, %d stacks.\n Count Dmg: %d, Count Heal: %d.", dot.adaptive_swarm_damage.remains, dot.adaptive_swarm_damage.stack, buff.adaptive_swarm_damage_in_flight.remains, buff.adaptive_swarm_damage_in_flight.stack, buff.adaptive_swarm_heal.remains, buff.adaptive_swarm_heal.stack, buff.adaptive_swarm_heal_in_flight.remains, buff.adaptive_swarm_heal_in_flight.stack, active_dot.adaptive_swarm_damage, active_dot.adaptive_swarm_heal ) end, state ) function Hekili:DumpSwarmInfo() local line = "Flights:" for k, v in pairs( flights ) do line = line .. " " .. k .. ":" .. table.concat( v, ":" ) end print( line ) line = "Pending:" for k, v in pairs( pending ) do line = line .. " " .. k .. ":" .. v end print( line ) line = "Swarms:" for k, v in pairs( swarms ) do line = line .. " " .. k .. ":" .. v.stacks .. ":" .. v.expiration end print( line ) end -- Druid - Necrolord - 325727 - adaptive_swarm (Adaptive Swarm) spec:RegisterAbility( "adaptive_swarm", { id = function() return talent.adaptive_swarm.enabled and 391888 or 325727 end, cast = 0, cooldown = 25, gcd = "spell", spend = 0.05, spendType = "mana", startsCombat = true, -- For Feral, we want to put Adaptive Swarm on the highest health enemy. indicator = function () if state.spec.feral and active_enemies > 1 and target.time_to_die < longest_ttd then return "cycle" end end, handler = function () applyDebuff( "target", "adaptive_swarm_dot", nil, 3 ) if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end end, copy = { "adaptive_swarm_damage", "adaptive_swarm_heal", 325727, 325733, 325748, 391888 }, auras = { -- Suffering $w1 Shadow damage every $t1 sec and damage over time from $@auracaster increased by $w2%. -- https://wowhead.com/beta/spell=325733 adaptive_swarm_dot = { id = 325733, duration = 12, tick_time = 2, type = "Magic", max_stack = 5, copy = { 391889, "adaptive_swarm_damage" } }, -- Restoring $w1 health every $t1 sec and healing over time from $@auracaster increased by $w2%. -- https://wowhead.com/beta/spell=325748 adaptive_swarm_hot = { id = 325748, duration = 12, max_stack = 5, dot = "buff", copy = { 391891, "adaptive_swarm_heal" } }, adaptive_swarm_damage_in_flight = { duration = 5, max_stack = 5 }, adaptive_swarm_heal_in_flight = { duration = 5, max_stack = 5, }, adaptive_swarm = { alias = { "adaptive_swarm_damage", "adaptive_swarm_heal" }, aliasMode = "first", -- use duration info from the first buff that's up, as they should all be equal. aliasType = "any", }, adaptive_swarm_in_flight = { alias = { "adaptive_swarm_damage", "adaptive_swarm_heal" }, aliasMode = "shortest", -- use duration info from the first buff that's up, as they should all be equal. aliasType = "any", }, } } ) end end Hekili:EmbedAdaptiveSwarm( spec ) 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( "cat_form" ) removeBuff( "bear_form" ) removeBuff( "travel_form" ) removeBuff( "moonkin_form" ) removeBuff( "travel_form" ) removeBuff( "aquatic_form" ) removeBuff( "stag_form" ) removeBuff( "celestial_guardian" ) if legendary.oath_of_the_elder_druid.enabled and debuff.oath_of_the_elder_druid_icd.down and talent.restoration_affinity.enabled then applyBuff( "heart_of_the_wild" ) applyDebuff( "player", "oath_of_the_elder_druid_icd" ) end end ) local affinities = { bear_form = "guardian_affinity", cat_form = "feral_affinity", moonkin_form = "balance_affinity", } -- 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( "cat_form" ) removeBuff( "bear_form" ) removeBuff( "travel_form" ) removeBuff( "moonkin_form" ) removeBuff( "travel_form" ) removeBuff( "aquatic_form" ) removeBuff( "stag_form" ) applyBuff( form ) if affinities[ form ] and legendary.oath_of_the_elder_druid.enabled and debuff.oath_of_the_elder_druid_icd.down then applyBuff( "heart_of_the_wild" ) applyDebuff( "player", "oath_of_the_elder_druid_icd" ) end if form == "bear_form" and pvptalent.celestial_guardian.enabled then applyBuff( "celestial_guardian" ) end end ) spec:RegisterStateExpr( "energize_amount", function () local ability = class.abilities[ this_action ] local amount = ability and ability.energize_amount if not amount then return 0 end return -amount end ) spec:RegisterHook( "runHandler", function( ability ) local a = class.abilities[ ability ] if not a or a.startsCombat then break_stealth() end end ) --[[ This is intended to cause an AP reset on entering an encounter, but it's not working. spec:RegisterHook( "start_combat", function( action ) if boss and astral_power.current > 50 then spend( astral_power.current - 50, "astral_power" ) end end ) ]] spec:RegisterHook( "pregain", function( amt, resource, overcap, clean ) if buff.memory_of_lucid_dreams.up then if amt > 0 and resource == "astral_power" then return amt * 2, resource, overcap, true end end end ) spec:RegisterHook( "prespend", function( amt, resource, overcap, clean ) if buff.memory_of_lucid_dreams.up then if amt < 0 and resource == "astral_power" then return amt * 2, resource, overcap, true end end end ) local check_for_ap_overcap = setfenv( function( ability ) local a = ability or this_action if not a then return true end a = action[ a ] if not a then return true end local cost = 0 if a.spendType == "astral_power" then cost = a.cost end return astral_power.current - cost + ( talent.shooting_stars.enabled and 4 or 0 ) + ( talent.natures_balance.enabled and ceil( execute_time / 2 ) or 0 ) < astral_power.max end, state ) spec:RegisterStateExpr( "ap_check", function() return check_for_ap_overcap() end ) -- Simplify lookups for AP abilities consistent with SimC. local ap_checks = { "force_of_nature", "full_moon", "half_moon", "incarnation", "moonfire", "new_moon", "starfall", "starfire", "starsurge", "sunfire", "wrath" } for i, lookup in ipairs( ap_checks ) do spec:RegisterStateExpr( lookup, function () return action[ lookup ] end ) end spec:RegisterStateExpr( "active_moon", function () return "new_moon" end ) local ExitEclipse = setfenv( function() eclipse.state = "IN_NONE" eclipse.reset_stacks() if talent.dreamstate.enabled then applyBuff( "dreamstate", nil, 2 ) end if Hekili.ActiveDebug then Hekili:Debug( "Expire Eclipse: %s - Starfire(%d), Wrath(%d), Solar(%.2f), Lunar(%.2f)", eclipse.state, eclipse.starfire_counter, eclipse.wrath_counter, buff.eclipse_solar.remains, buff.eclipse_lunar.remains ) end end, state ) spec:RegisterStateTable( "eclipse", setmetatable( { -- IN_SOLAR, IN_LUNAR, IN_BOTH, IN_NONE state = "IN_NONE", wrath_counter = 2, starfire_counter = state.talent.lunar_calling.enabled and 0 or 2, -- With the talent, the starfire counter API call is hard-set to return 0 and cannot be changed reset = setfenv( function() -- Refresh/sync current gamestate during reset_precast eclipse.starfire_counter = GetSpellCastCount( 197628 ) or 0 eclipse.wrath_counter = GetSpellCastCount( 5176 ) or 0 if buff.eclipse_solar.up and buff.eclipse_lunar.up then eclipse.state = "IN_BOTH" state:QueueAuraExpiration( "ca_inc", ExitEclipse, buff.ca_inc.expires ) elseif buff.eclipse_solar.up then eclipse.state = "IN_SOLAR" state:QueueAuraExpiration( "eclipse_solar", ExitEclipse, buff.eclipse_solar.expires ) elseif buff.eclipse_lunar.up then eclipse.state = "IN_LUNAR" state:QueueAuraExpiration( "eclipse_lunar", ExitEclipse, buff.eclipse_lunar.expires ) else eclipse.state = "IN_NONE" end end, state ), reset_stacks = setfenv( function() -- Fresh out of any eclipse eclipse.wrath_counter = 2 eclipse.starfire_counter = talent.lunar_calling.enabled and 0 or 2 end, state ), trigger_eclipse = setfenv( function( eclipseType, duration ) -- Both are forcibly set to 0 in-game when you enter any eclipse (or both) eclipse.wrath_counter = 0 eclipse.starfire_counter = 0 -- Clear out any old aura queues and overwrite them down below. This might matter as eclipses do not currently extend, they overwrite with a fresh copy state:RemoveAuraExpiration( "eclipse_lunar" ) state:RemoveAuraExpiration( "eclipse_solar" ) state:RemoveAuraExpiration( "ca_inc" ) local partingSkies = 1 -- These interactions, it matters which type of eclipse if eclipseType == "both" then eclipse.state = "IN_BOTH" applyBuff( "eclipse_solar", duration ) applyBuff( "eclipse_lunar", duration ) state:QueueAuraExpiration( "ca_inc", ExitEclipse, buff.ca_inc.expires ) if talent.balance_of_all_things.enabled then applyBuff( "balance_of_all_things_nature" ) applyBuff( "balance_of_all_things_arcane" ) end partingSkies = 2 -- overwrite to 2 if its a double eclipse elseif eclipseType == "lunar" then eclipse.state = "IN_LUNAR" applyBuff( "eclipse_lunar", duration ) state:QueueAuraExpiration( "eclipse_lunar", ExitEclipse, buff.eclipse_lunar.expires ) if talent.balance_of_all_things.enabled then applyBuff( "balance_of_all_things_arcane" ) end else eclipse.state = "IN_SOLAR" applyBuff( "eclipse_solar", duration ) state:QueueAuraExpiration( "eclipse_solar", ExitEclipse, buff.eclipse_solar.expires ) if talent.balance_of_all_things.enabled then applyBuff( "balance_of_all_things_nature" ) end end -- There interactions happen regardless of eclipse type if talent.astral_communion.enabled then applyBuff( "astral_communion" ) end if talent.solstice.enabled then applyBuff( "solstice" ) end if talent.cenarius_might.enabled then applyBuff( "cenarius_might" ) end if talent.parting_skies.enabled then if partingSkies == 2 then -- Trigger spell. If buff is up, refresh it applyDebuff( "target", "fury_of_elune", 8 ) applyBuff( "fury_of_elune_ap", 8 ) if buff.parting_skies.up then buff.parting_skies.remains = spec.auras.parting_skies.duration end else if buff.parting_skies.up then removeBuff( "parting_skies" ) applyDebuff( "target", "fury_of_elune", 8 ) applyBuff( "fury_of_elune_ap", 8 ) else applyBuff( "parting_skies" ) end end end -- Legacy if set_bonus.tier29_4pc > 0 then applyBuff( "touch_the_cosmos" ) end end, state ), advance = setfenv( function( spell ) if spell == "wrath" then eclipse.wrath_counter = eclipse.wrath_counter - 1 if eclipse.wrath_counter == 0 then eclipse.trigger_eclipse( "lunar", 15 ) end elseif spell == "starfire" then eclipse.starfire_counter = eclipse.starfire_counter - 1 if eclipse.starfire_counter == 0 then eclipse.trigger_eclipse( "solar", 15 ) end end end, state ), }, { __index = function( t, k ) -- any_next if k == "any_next" then return eclipse.state == "IN_NONE" -- in_any elseif k == "in_any" or k == "in_eclipse" then return eclipse.state ~= "IN_NONE" elseif k == "in_none" then return eclipse.state == "IN_NONE" -- in_solar elseif k == "in_solar" then return eclipse.state == "IN_SOLAR" -- in_lunar elseif k == "in_lunar" then return eclipse.state == "IN_LUNAR" -- in_both elseif k == "in_both" then return eclipse.state == "IN_BOTH" -- solar_in elseif k == "solar_in" then return eclipse.starfire_counter -- solar_in_2 elseif k == "solar_in_2" then return eclipse.starfire_counter == 2 -- solar_in_1 elseif k == "solar_in_1" then return eclipse.starfire_counter == 1 -- lunar_in elseif k == "lunar_in" then return eclipse.wrath_counter -- lunar_in_2 elseif k == "lunar_in_2" then return eclipse.wrath_counter == 2 -- lunar_in_1 elseif k == "lunar_in_1" then return eclipse.wrath_counter == 1 elseif k == "remains" then return eclipse.state == "IN_NONE" and 0 or max( buff.eclipse_solar.remains, buff.eclipse_lunar.remains ) end end } ) ) spec:RegisterStateTable( "druid", setmetatable( {},{ __index = function( t, k ) if k == "catweave_bear" then return false elseif k == "owlweave_bear" then return false elseif k == "primal_wrath" then return debuff.rip elseif k == "lunar_inspiration" then return debuff.moonfire_cat elseif k == "no_cds" then return not toggle.cooldowns elseif k == "delay_berserking" then return settings.delay_berserking elseif rawget( debuff, k ) ~= nil then return debuff[ k ] end return false end } ) ) local LycarasHandler = setfenv( function () if buff.travel_form.up then state:RunHandler( "stampeding_roar" ) elseif buff.moonkin_form.up then state:RunHandler( "starfall" ) elseif buff.bear_form.up then state:RunHandler( "barkskin" ) elseif buff.cat_form.up then state:RunHandler( "primal_wrath" ) else state:RunHandler( "wild_growth" ) end end, state ) local SinfulHysteriaHandler = setfenv( function () applyBuff( "ravenous_frenzy_sinful_hysteria" ) end, state ) spec:RegisterPet( "treants", 103822, "force_of_nature", 10, 103822 ) spec:RegisterTotem( "treants", 103822 ) local TreantMoonfires = setfenv( function() for i = 1, 3 do -- # of treants spec.abilities.moonfire.handler() end end, state ) spec:RegisterHook( "reset_precast", function () if IsActiveSpell( class.abilities.new_moon.id ) then active_moon = "new_moon" elseif IsActiveSpell( class.abilities.half_moon.id ) then active_moon = "half_moon" elseif IsActiveSpell( class.abilities.full_moon.id ) then active_moon = "full_moon" else active_moon = nil end -- UGLY if talent.incarnation.enabled then rawset( cooldown, "ca_inc", cooldown.incarnation ) rawset( buff, "ca_inc", buff.incarnation ) else rawset( cooldown, "ca_inc", cooldown.celestial_alignment ) rawset( buff, "ca_inc", buff.celestial_alignment ) end --[[ Needs more work if pet.treants.up then local tick, expires = action.force_of_nature.lastCast, pet.treants.expires local tick2 = tick + 6 tick = tick + 2 if tick > query_time and tick < expires then state:QueueAuraEvent( "treant_moonfires", TreantMoonfires, tick, "AURA_TICK" ) end end end --]] if talent.fungal_growth.enabled and query_time - action.wild_mushroom.lastCast < 1 then if debuff.fungal_growth.up then debuff.fungal_growth.expires = action.wild_mushroom.lastCast + 7 else applyDebuff( "target", "wild_growth", 7 ) end end if buff.warrior_of_elune.up then setCooldown( "warrior_of_elune", 3600 ) end eclipse.reset() -- sync all eclipse components with gamestate --[[ if buff.lycaras_fleeting_glimpse.up then state:QueueAuraExpiration( "lycaras_fleeting_glimpse", LycarasHandler, buff.lycaras_fleeting_glimpse.expires ) end ]] if legendary.sinful_hysteria.enabled and buff.ravenous_frenzy.up then state:QueueAuraExpiration( "ravenous_frenzy", SinfulHysteriaHandler, buff.ravenous_frenzy.expires ) end end ) spec:RegisterHook( "step", function() if Hekili.ActiveDebug then Hekili:Debug( "Eclipse State: %s, Wrath: %d, Starfire: %d; Lunar: %.2f, Solar: %.2f\n", eclipse.state or "NOT SET", eclipse.wrath_counter, eclipse.starfire_counter, buff.eclipse_lunar.remains, buff.eclipse_solar.remains ) end end ) spec:RegisterHook( "spend", function( amt, resource ) if legendary.primordial_arcanic_pulsar.enabled and resource == "astral_power" and amt > 0 then local v1 = ( buff.primordial_arcanic_pulsar.v1 or 0 ) + amt if v1 >= 300 then applyBuff( talent.incarnation.enabled and "incarnation" or "celestial_alignment", 9 ) v1 = v1 - 300 end if v1 > 0 then applyBuff( "primordial_arcanic_pulsar", nil, max( 1, floor( amt / 30 ) ) ) buff.primordial_arcanic_pulsar.v1 = v1 else removeBuff( "primordial_arcanic_pulsar" ) end end end ) -- Abilities spec:RegisterAbilities( { barkskin = { id = 22812, cast = 0, cooldown = function () return 60 * ( 1 - 0.15 * talent.survival_of_the_fittest.rank ) * ( 1 + ( conduit.tough_as_bark.mod * 0.01 ) ) end, gcd = "off", school = "nature", startsCombat = false, toggle = "defensives", defensive = true, handler = function () applyBuff( "barkskin" ) if legendary.the_natural_orders_will.enabled and buff.bear_form.up then applyBuff( "ironfur" ) applyBuff( "frenzied_regeneration" ) end if talent.matted_fur.enabled then applyBuff( "matted_fur" ) end end }, -- Shapeshift into Bear Form, increasing armor by $m4% and Stamina by $1178s2%, granting protection from Polymorph effects, and increasing threat generation. The act of shapeshifting frees you from movement impairing effects. bear_form = { id = 5487, cast = 0, cooldown = 0, gcd = "spell", school = "physical", spend = -25, spendType = "rage", startsCombat = false, essential = true, noform = "bear_form", handler = function () shift( "bear_form" ) if talent.ursine_vigor.enabled or conduit.ursine_vigor.enabled then applyBuff( "ursine_vigor" ) end end, }, -- Go Berserk for $d. While Berserk:; Generate $343216s1 combo $lpoint:points; every $t1 sec. Combo point generating abilities generate $s2 additional combo $lpoint:points;. Finishing moves restore up to $405189u combo points generated over the cap.; All attack and ability damage is increased by $s3%. berserk = { id = 106951, cast = 0.0, cooldown = 180.0, gcd = "off", startsCombat = false, handler = function() applyBuff( "berserk" ) end }, -- Shapeshift into Cat Form, increasing auto-attack damage by $s4%, movement speed by $113636s1%, granting protection from Polymorph effects, and reducing falling damage. The act of shapeshifting frees you from movement impairing effects. cat_form = { id = 768, cast = 0, cooldown = 0, gcd = "spell", school = "physical", startsCombat = false, noform = "cat_form", handler = function () shift( "cat_form" ) if pvptalent.master_shapeshifter.enabled and talent.feral_affinity.enabled then applyBuff( "master_shapeshifter_feral" ) end end, }, -- Talent: Celestial bodies align, maintaining both Eclipses and granting $s1% haste for $d. -- TODO: Revisit if Orbital Strike needs its own button. celestial_alignment = { id = function() return talent.orbital_strike.enabled and 383410 or 194223 end, cast = 0, charges = function () if talent.whirling_stars.enabled then return 2 end end, cooldown = function () return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * ( talent.whirling_stars.enabled and ( talent.potent_enchantmeents.enabled and 90 or 100 ) or 180 ) - 60 * talent.orbital_strike.rank end, recharge = function () if talent.whirling_stars.enabled then return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * 100 - 60 * talent.orbital_strike.rank end end, gcd = "off", school = "astral", talent = "celestial_alignment", notalent = "incarnation", startsCombat = false, toggle = "cooldowns", handler = function () applyBuff( "celestial_alignment" ) if set_bonus.tww2 >= 2 then summonTotem( "wild_mushroom" ) end stat.haste = stat.haste + 0.1 eclipse.trigger_eclipse( "both", spec.auras.celestial_alignment.duration ) if pvptalent.moon_and_stars.enabled then applyBuff( "moon_and_stars" ) end end, copy = { 194223, 383410, "ca_inc" } }, -- Talent / Covenant (Night_Fae): Call upon the Night Fae for an eruption of energy, channeling a rapid flurry of $s2 Druid spells and abilities over $d. You will cast $?a24858|a197625[Starsurge, Starfall,]?a768[Ferocious Bite, Shred, Tiger's Fury,]?a5487[Mangle, Ironfur,][Wild Growth, Swiftmend,] Moonfire, Wrath, Regrowth, Rejuvenation, Rake, and Thrash on appropriate nearby targets, favoring your current shapeshift form. convoke_the_spirits = { id = function() return talent.convoke_the_spirits.enabled and 391528 or 323764 end, cast = function() return 4 * ( legendary.celestial_spirits.enabled and 0.75 or 1 ) * ( talent.ashamanes_guidance.enabled and 0.75 or 1 ) end, channeled = true, cooldown = function() return 120 * ( legendary.celestial_spirits.enabled and 0.5 or 1 ) * ( talent.ashamanes_guidance.enabled and 0.5 or 1 ) end, gcd = "spell", school = "nature", talent = function() if covenant.night_fae then return end return "convoke_the_spirits" end, startsCombat = true, toggle = "cooldowns", disabled = function () return not talent.convoke_the_spirits.enabled and covenant.night_fae and not IsSpellKnownOrOverridesKnown( 323764 ), "you have not finished your night_fae covenant intro" end, finish = function () -- Can we safely assume anything is going to happen? if state.spec.feral then applyBuff( "tigers_fury" ) if target.maxR < 8 then gain( 5, "combo_points" ) end elseif state.spec.guardian then elseif state.spec.balance then end end, copy = { 391528, 323764 } }, -- Talent: Tosses the enemy target into the air, disorienting them but making them invulnerable for up to $d. Only one target can be affected by your Cyclone at a time. cyclone = { id = 33786, cast = function() return 1.7 * ( buff.heart_of_the_wild.up and 0.7 or 1 ) * haste end, cooldown = 0, gcd = "spell", school = "nature", spend = 0.1, spendType = "mana", talent = "cyclone", startsCombat = true, handler = function () applyDebuff( "target", "cyclone" ) end, }, -- Shift into Cat Form and increase your movement speed by $s1% while in Cat Form for $d. dash = { id = 1850, cast = 0, cooldown = 120, gcd = "spell", school = "physical", startsCombat = false, toggle = "defensives", handler = function () if buff.cat_form.down then shift( "cat_form" ) end applyBuff( "dash" ) end, }, -- Roots the target in place for $d. Damage may cancel the effect.$?s33891[ |C0033AA11Tree of Life: Instant cast.|R][] entangling_roots = { id = 339, cast = function () return pvptalent.owlkin_adept.enabled and buff.owlkin_frenzy.up and 0.85 or 1.7 * haste end, cooldown = 0, gcd = "spell", spend = 0.06, spendType = "mana", startsCombat = true, texture = 136100, handler = function () applyDebuff( "target", "entangling_roots" ) removeBuff( "natures_swiftness" ) end, }, faerie_swarm = { id = 209749, cast = 0.0, cooldown = 30.0, gcd = "spell", startsCombat = true, pvptalent = "faerie_swarm", handler = function() applyDebuff( "target", "faerie_swarm" ) end, }, -- Talent: Summons a stand of $s1 Treants for $248280d which immediately taunt and attack enemies in the targeted area. |cFFFFFFFFGenerates ${$m5/10} Astral Power.|r force_of_nature = { id = 205636, cast = 0, cooldown = function() return talent.early_spring.enabled and 45 or 60 end, gcd = "spell", school = "nature", spend = -20, spendType = "astral_power", talent = "force_of_nature", startsCombat = true, toggle = "cooldowns", ap_check = function() return check_for_ap_overcap( "force_of_nature" ) end, handler = function () summonPet( "treants", 10 ) if talent.harmony_of_the_grove.enabled then applyBuff( "harmony_of_the_grove" ) end if talent.dream_surge.enabled then applyBuff( "dream_burst") end -- queue aura ticks +2, +8 3 moonfires, actually triggers the handler state:QueueAuraEvent( "treant_moonfires", TreantMoonfires, query_time + 2, "AURA_TICK" ) state:QueueAuraEvent( "treant_moonfires", TreantMoonfires, query_time + 8, "AURA_TICK" ) end, }, full_moon = { id = 274283, known = 274281, flash = 274281, cast = 3, charges = 3, cooldown = 20, recharge = 20, gcd = "spell", spend = -48, spendType = "astral_power", texture = 1392542, startsCombat = true, talent = "new_moon", bind = "half_moon", ap_check = function() return check_for_ap_overcap( "full_moon" ) end, energize_amount = function() return action.full_moon.spend * -1 end, usable = function () return active_moon == "full_moon" end, handler = function () spendCharges( "new_moon", 1 ) spendCharges( "half_moon", 1 ) if talent.radiant_moonlight.disabled or ( action.half_moon.lastCast < action.full_moon.lastCast ) then active_moon = "new_moon" end end, }, -- [428655] Moonfire damage has a chance to call down a Fury of Elune to follow your target for ${$s2/1000} sec.; $@spellicon202770 $@spellname202770; Calls down a beam of pure celestial energy, dealing $ Astral damage over ${$s2/1000} sec within its area.; Generates $?a137010[${$202770m4/$202770t4*$s2/10000} Rage][${$202770m3/$202770t3*$s2/10000} Astral Power] over its duration. fury_of_elune = { id = 202770, cast = 0, cooldown = function() return talent.radiant_moonlight.enabled and 45 or 60 end, gcd = "spell", -- toggle = "cooldowns", startsCombat = true, texture = 132123, handler = function () if not buff.moonkin_form.up then unshift() end applyDebuff( "target", "fury_of_elune_ap" ) end, }, -- Taunts the target to attack you. growl = { id = 6795, cast = 0, cooldown = 8, gcd = "off", school = "physical", startsCombat = true, handler = function () applyBuff( "growl" ) end, }, half_moon = { id = 274282, known = 274281, flash = 274281, cast = 2, charges = 3, cooldown = 20, recharge = 20, gcd = "spell", spend = -20, spendType = "astral_power", texture = 1392543, startsCombat = true, talent = "new_moon", bind = { "new_moon", "full_moon" }, ap_check = function() return check_for_ap_overcap( "half_moon" ) end, usable = function () return active_moon == "half_moon" end, handler = function () spendCharges( "new_moon", 1 ) spendCharges( "full_moon", 1 ) active_moon = "full_moon" end, }, -- Talent: Abilities not associated with your specialization are substantially empowered for $d.$?!s137013[ |cFFFFFFFFBalance:|r Magical damage increased by $s1%.][]$?!s137011[ |cFFFFFFFFFeral:|r Physical damage increased by $s4%.][]$?!s137010[ |cFFFFFFFFGuardian:|r Bear Form gives an additional $s7% Stamina, multiple uses of Ironfur may overlap, and Frenzied Regeneration has ${$s9+1} charges.][]$?!s137012[ |cFFFFFFFFRestoration:|r Healing increased by $s10%, and mana costs reduced by $s12%.][] heart_of_the_wild = { id = 319454, cast = 0, cooldown = function () return 300 * ( 1 - ( conduit.born_of_the_wilds.mod * 0.01 ) ) end, gcd = "spell", toggle = "cooldowns", talent = "heart_of_the_wild", startsCombat = false, texture = 135879, handler = function () applyBuff( "heart_of_the_wild" ) if talent.feral_affinity.enabled then shift( "cat_form" ) elseif talent.guardian_affinity.enabled then shift( "bear_form" ) elseif talent.restoration_affinity.enabled then unshift() end end, }, -- Talent: Forces the enemy target to sleep for up to $d. Any damage will awaken the target. Only one target can be forced to hibernate at a time. Only works on Beasts and Dragonkin. hibernate = { id = 2637, cast = function() return 1.5 * ( buff.heart_of_the_wild.up and 0.7 or 1 ) * haste end, cooldown = 0, gcd = "spell", school = "nature", spend = 0.06, spendType = "mana", talent = "hibernate", startsCombat = false, handler = function () applyDebuff( "target", "hibernate" ) end, }, -- Talent: Shift into Bear Form and invoke the spirit of Ursol to let loose a deafening roar, incapacitating all enemies within $A1 yards for $d. Damage will cancel the effect. incapacitating_roar = { id = 99, cast = 0, cooldown = 30, gcd = "spell", school = "physical", talent = "incapacitating_roar", startsCombat = true, handler = function () applyDebuff( "target", "incapacitating_roar" ) end, }, -- An improved Moonkin Form that grants both Eclipses, any learned Celestial Alignment bonuses, $?a429536[$s6% increased Arcane damage, ][]and $s2% critical strike chance.; Lasts $d. You may shapeshift in and out of this improved Moonkin Form for its duration. incarnation = { id = function() return talent.orbital_strike.enabled and 390414 or 102560 end, cast = 0, cooldown = function () return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * ( talent.whirling_stars.enabled and ( talent.potent_enchantmeents.enabled and 90 or 100 ) or 180 ) - 60 * talent.orbital_strike.rank end, gcd = "off", spend = -40, spendType = "astral_power", toggle = "cooldowns", startsCombat = false, texture = 571586, talent = "incarnation", handler = function () shift( "moonkin_form" ) if set_bonus.tww2 >= 2 then summonTotem( "wild_mushroom" ) end applyBuff( "incarnation" ) stat.crit = stat.crit + 0.10 stat.haste = stat.haste + 0.10 eclipse.trigger_eclipse( "both", spec.auras.incarnation.duration ) if pvptalent.moon_and_stars.enabled then applyBuff( "moon_and_stars" ) end end, copy = { "incarnation_chosen_of_elune", "Incarnation", 102560, 390414 }, }, -- Talent: Infuse a friendly healer with energy, allowing them to cast spells without spending mana for $d.$?s326228[ If cast on somebody else, you gain the effect at $326228s1% effectiveness.][] innervate = { id = 29166, cast = 0, cooldown = 180, gcd = "off", school = "nature", talent = "innervate", startsCombat = false, texture = 136048, toggle = "cooldowns", usable = function () return group end, handler = function () active_dot.innervate = 1 end, }, -- Talent: Increases armor by ${$s1*$AGI/100} for $d.$?a231070[ Multiple uses of this ability may overlap.][] ironfur = { id = 192081, cast = 0, cooldown = 0.5, gcd = "off", school = "nature", spend = 40, spendType = "rage", talent = "ironfur", startsCombat = false, handler = function () applyBuff( "ironfur" ) end, }, -- Talent: Finishing move that causes Physical damage and stuns the target. Damage and duration increased per combo point: 1 point : ${$s2*1} damage, 1 sec 2 points: ${$s2*2} damage, 2 sec 3 points: ${$s2*3} damage, 3 sec 4 points: ${$s2*4} damage, 4 sec 5 points: ${$s2*5} damage, 5 sec maim = { id = 22570, cast = 0, cooldown = 30, gcd = "totem", school = "physical", spend = 30, spendType = "energy", talent = "maim", startsCombat = true, usable = function () return combo_points.current > 0, "requires combo points" end, handler = function () applyDebuff( "target", "maim" ) spend( combo_points.current, "combo_points" ) end, }, -- Mangle the target for $s2 Physical damage.$?a231064[ Deals $s3% additional damage against bleeding targets.][] |cFFFFFFFFGenerates ${$m4/10} Rage.|r mangle = { id = 33917, cast = 0, cooldown = 6, gcd = "spell", school = "physical", spend = -10, spendType = "rage", startsCombat = true, texture = 132135, form = function() if talent.fluid_form.enabled then return end return "bear_form" end, handler = function () end, }, -- Infuse a friendly target with the power of the wild, increasing their Versatility by $s1% for 60 minutes. If target is in your party or raid, all party and raid members will be affected. mark_of_the_wild = { id = 1126, cast = 0, cooldown = 0, gcd = "spell", school = "nature", essential = true, spend = 0.01, spendType = "mana", startsCombat = false, nobuff = "mark_of_the_wild", handler = function () applyBuff( "mark_of_the_wild" ) end, }, -- Talent: Roots the target and all enemies within $A1 yards in place for $d. Damage may interrupt the effect. Usable in all shapeshift forms. mass_entanglement = { id = 102359, cast = 0, cooldown = function () return 30 * ( 1 - ( conduit.born_of_the_wilds.mod * 0.01 ) ) end, gcd = "spell", school = "nature", talent = "mass_entanglement", startsCombat = true, handler = function () applyDebuff( "target", "mass_entanglement" ) active_dot.mass_entanglement = max( active_dot.mass_entanglement, active_enemies ) end, }, -- Talent: Invokes the spirit of Ursoc to stun the target for $d. Usable in all shapeshift forms. mighty_bash = { id = 5211, cast = 0, cooldown = function () return 60 * ( 1 - ( conduit.born_of_the_wilds.mod * 0.01 ) ) end, gcd = "spell", school = "physical", talent = "mighty_bash", startsCombat = true, handler = function () applyDebuff( "target", "mighty_bash" ) end, }, -- A quick beam of lunar light burns the enemy for $164812s1 Arcane damage and then an additional $164812o2 Arcane damage over $164812d$?s238049[, and causes enemies to deal $238049s1% less damage to you.][.]$?a372567[ Hits a second target within $279620s1 yds of the first.][]$?s197911[ |cFFFFFFFFGenerates ${$m3/10} Astral Power.|r][] moonfire = { id = 8921, cast = 0, cooldown = 0, gcd = "spell", school = "arcane", spend = function () return talent.moon_guardian.enabled and -8 or -6 end, spendType = "astral_power", readyTime = function () if state.spec.balance and talent.treants_of_the_moon.enabled then return pet.treants.remains end end, startsCombat = true, cycle = "moonfire", ap_check = function() return check_for_ap_overcap( "moonfire" ) end, energize_amount = function() return action.moonfire.spend * -1 end, handler = function () if not buff.moonkin_form.up and not buff.bear_form.up then unshift() end applyDebuff( "target", "moonfire" ) if talent.twin_moons.enabled and active_enemies > 1 then active_dot.moonfire = min( active_enemies, active_dot.moonfire + 1 ) end end, }, -- Talent: Shapeshift into $?s114301[Astral Form][Moonkin Form], increasing the damage of your spells by $s9% and your armor by $m3%, and granting protection from Polymorph effects.$?a231042[ While in this form, single-target attacks against you have a $h% chance to make your next Starfire instant.][] The act of shapeshifting frees you from movement impairing effects. moonkin_form = { id = function() return state.spec.restoration and 197625 or 24858 end, cast = 0, cooldown = 0, gcd = "spell", school = "physical", startsCombat = false, noform = "moonkin_form", essential = true, handler = function () shift( "moonkin_form" ) end, copy = { 24858, 197625 } }, -- Talent: For $d, $?s137012[all single-target healing also damages a nearby enemy target for $s3% of the healing done][all single-target damage also heals a nearby friendly target for $s3% of the damage done]. natures_vigil = { id = 124974, cast = 0, cooldown = 90, gcd = "off", school = "nature", talent = "natures_vigil", startsCombat = false, toggle = "defensives", usable = function() local hp = health.percent or 100 local vd = settings.vigil_damage or 50 return hp <= vd, strformat( "health %d%% must be under %d%%", hp, vd ) end, handler = function () applyBuff( "natures_vigil" ) end, }, -- Talent: Deals $m1 Astral damage to the target and empowers New Moon to become Half Moon. |cFFFFFFFFGenerates ${$m3/10} Astral Power.|r new_moon = { id = 274281, cast = 1, charges = 3, cooldown = 20, recharge = 20, gcd = "totem", school = "astral", spend = -10, spendType = "astral_power", talent = "new_moon", startsCombat = true, bind = { "half_moon", "full_moon" }, ap_check = function() return check_for_ap_overcap( "new_moon" ) end, usable = function () return active_moon == "new_moon" end, handler = function () spendCharges( "half_moon", 1 ) spendCharges( "full_moon", 1 ) active_moon = "half_moon" end, }, -- Shift into Cat Form and enter stealth. prowl = { id = 5215, cast = 0, cooldown = 6, gcd = "off", school = "physical", startsCombat = false, usable = function () if time > 0 and ( not boss or not buff.shadowmeld.up ) then return false, "cannot stealth in combat" elseif buff.prowl.up then return false, "player is already prowling" end return true end, handler = function () shift( "cat_form" ) applyBuff( "prowl" ) end, copy = 102547 }, rebirth ={ id = 20484, cast = function() return buff.natures_swiftness.up and 0 or 2 * haste end, cooldown = 0, gcd = "spell", -- readyTime = there is a brez available .. API for this? handler = function () removeBuff( "natures_swiftness" ) end }, -- Heals a friendly target for $s1 and another ${$o2*$} over $d.$?s231032[ Initial heal has a $231032s1% increased chance for a critical effect if the target is already affected by Regrowth.][]$?s24858|s197625[ Usable while in Moonkin Form.][]$?s33891[ |C0033AA11Tree of Life: Instant cast.|R][] regrowth = { id = 8936, cast = function() return buff.blooming_infusion_regrowth.up and 0 or 1.5 * haste end, cooldown = 0, gcd = "spell", school = "nature", spend = function() return 0.10 * ( 1 - 0.08 * buff.abundance.stack ) end, spendType = "mana", startsCombat = false, handler = function () if buff.moonkin_form.down then unshift() end applyBuff( "regrowth" ) if talent.forestwalk.enabled then applyBuff( "forestwalk" ) end end, }, -- Talent: Heals the target for $o1 over $d.$?s155675[ You can apply Rejuvenation twice to the same target.][]$?s33891[ |C0033AA11Tree of Life: Healing increased by $5420s5% and Mana cost reduced by $5420s4%.|R][] rejuvenation = { id = 774, cast = 0, cooldown = 0, gcd = "spell", school = "nature", spend = 0.05, spendType = "mana", talent = "rejuvenation", startsCombat = false, handler = function () if buff.moonkin_form.down then unshift() end applyBuff( "rejuvenation" ) end, }, -- Talent: Nullifies corrupting effects on the friendly target, removing all Curse and Poison effects. remove_corruption = { id = 2782, cast = 0, cooldown = 8, gcd = "spell", school = "arcane", spend = 0.10, spendType = "mana", talent = "remove_corruption", startsCombat = false, usable = function() return debuff.dispellable_curse.up or debuff.dispellable_poison.up, "requires curse/poison" end, handler = function () removeDebuff( "target", "dispellable_curse" ) removeDebuff( "target", "dispellable_poison" ) end, }, -- Talent: Instantly heals you for $s1% of maximum health. Usable in all shapeshift forms. renewal = { id = 108238, cast = 0, cooldown = 90, gcd = "off", school = "nature", talent = "renewal", startsCombat = false, toggle = "defensives", handler = function () gain( health.max * 0.2, "health" ) end, }, -- Talent: You charge and bash the target's skull, interrupting spellcasting and preventing any spell in that school from being cast for $93985d. skull_bash = { id = 106839, cast = 0, cooldown = 15, gcd = "off", school = "physical", talent = "skull_bash", startsCombat = true, toggle = "interrupts", debuff = "casting", readyTime = state.timeToInterrupt, handler = function () interrupt() end, }, -- Talent: Summons a beam of solar light over an enemy target's location, interrupting the target and silencing all enemies within the beam. Lasts $d. solar_beam = { id = 78675, cast = 0, cooldown = 60, gcd = "off", school = "nature", spend = 0.168, spendType = "mana", talent = "solar_beam", startsCombat = true, toggle = "interrupts", debuff = "casting", readyTime = state.timeToInterrupt, handler = function () interrupt() -- trigger 97547, 97547, 97547 applyBuff( "solar_beam" ) end, }, -- Talent: Soothes the target, dispelling all enrage effects. soothe = { id = 2908, cast = 0, cooldown = 10, gcd = "spell", school = "nature", spend = 0.056, spendType = "mana", talent = "soothe", startsCombat = true, usable = function () return buff.dispellable_enrage.up end, handler = function () if buff.moonkin_form.down then unshift() end removeBuff( "dispellable_enrage" ) end, }, stag_form = { id = 210053, cast = 0, cooldown = 0, gcd = "spell", startsCombat = false, texture = 1394966, noform = "travel_form", handler = function () shift( "stag_form" ) end, }, -- Talent: Let loose a wild roar, increasing the movement speed of all friendly players within $A1 yards by $s1% for $d. stampeding_roar = { id = 106898, cast = 0, cooldown = function () return 120 - ( talent.improved_stampeding_roar.enabled and 60 or 0 ) end, gcd = "spell", school = "physical", talent = "stampeding_roar", startsCombat = false, toggle = "interrupts", handler = function () applyBuff( "stampeding_roar" ) if buff.bear_form.down and buff.cat_form.down then shift( "bear_form" ) end end, copy = { 77761, 77764 } }, -- Talent: Calls down waves of falling stars upon enemies within $50286A1 yds, dealing $ Astral damage over $191034d. Multiple uses of this ability may overlap.$?s327541[ Extends the duration of active Moonfires and Sunfires by $327541s1 sec.][] starfall = { id = 191034, cast = 0, cooldown = function () return talent.stellar_drift.enabled and 12 or 0 end, gcd = "spell", school = "astral", spend = function () if buff.oneths_perception.up or buff.starweavers_warp.up or buff.touch_the_cosmos.up then return 0 end return ( 50 - ( buff.incarnation.up and talent.elunes_guidance.enabled and 10 or 0 ) - ( buff.touch_the_cosmos.up and 5 or 0 ) - ( buff.astral_communion.up and 15 or 0 ) ) * ( 1 - 0.05 * buff.rattled_stars.stack ) * ( 1 - 0.1 * buff.timeworn_dreambinder.stack ) end, spendType = "astral_power", startsCombat = true, texture = 236168, ap_check = function() return check_for_ap_overcap( "starfall" ) end, handler = function () if talent.hail_of_stars.enabled and ( buff.oneths_perception.up or buff.starweavers_warp.up or buff.touch_the_cosmos.up ) then applyBuff( "solstice", 3 ) end if buff.starweavers_warp.up then removeBuff( "starweavers_warp" ) else removeBuff( "touch_the_cosmos" ) end if talent.rattle_the_stars.enabled then addStack( "rattled_stars" ) end if talent.starlord.enabled then if buff.starlord.stack < 3 then stat.haste = stat.haste + 0.04 end addStack( "starlord", buff.starlord.remains > 0 and buff.starlord.remains or nil, 1 ) end if set_bonus.tier29_2pc > 0 then addStack( "gathering_starstuff" ) end applyBuff( "starfall" ) if level > 53 then if debuff.moonfire.up then debuff.moonfire.expires = debuff.moonfire.expires + 4 end if debuff.sunfire.up then debuff.sunfire.expires = debuff.sunfire.expires + 4 end end removeBuff( "oneths_perception" ) if legendary.timeworn_dreambinder.enabled then addStack( "timeworn_dreambinder", nil, 1 ) end end, }, -- Call down a burst of energy, causing $s1 Arcane damage to the target, and $?a429523[${($m1*$m3/100)/(1+$429523s1/100)}][${$m1*$m3/100}] Arcane damage to all other enemies within $A1 yards. Deals reduced damage beyond $s5 targets.; Generates ${$m2/10} Astral Power. starfire = { id = function () return state.spec.balance and 194153 or 197628 end, known = function () return state.spec.balance and IsPlayerSpell( 194153 ) or IsPlayerSpell( 197628 ) end, cast = function () if buff.blooming_infusion.up or buff.warrior_of_elune.up or buff.owlkin_frenzy.up then return 0 end return haste * 2.25 * ( buff.dreamstate.up and 0.6 or 1 ) end, cooldown = 0, gcd = "spell", spend = function () return ( -8 + ( talent.wild_surges.enabled and -2 or 0 ) + ( talent.moon_guardian.enabled and -2 or 0 ) + ( set_bonus.tww1 >= 4 and -2 or 0 ) ) * ( talent.soul_of_the_forest.enabled and buff.eclipse_lunar.up and 1.2 or 1 ) * ( buff.warrior_of_elune.up and 1.3 or 1 ) end, spendType = "astral_power", startsCombat = true, texture = 135753, ap_check = function() return check_for_ap_overcap( "starfire" ) end, talent = "starfire", energize_amount = function() return action.starfire.spend * -1 end, handler = function () if talent.fluid_form.enabled and not buff.moonkin_form.up then unshift() end removeBuff( "gathering_starstuff" ) if talent.natures_grace.enabled and buff.dreamstate.up then removeStack( "dreamstate" ) end if talent.dream_surge.enabled and buff.dream_burst.up then removeStack( "dream_burst" ) end if talent.lunar_calling.disabled then eclipse.advance( "starfire" ) end if buff.blooming_infusion.up then removeBuff( "blooming_infusion" ) elseif buff.warrior_of_elune.up then removeStack( "warrior_of_elune" ) if buff.warrior_of_elune.down then setCooldown( "warrior_of_elune", 45 ) end elseif buff.owlkin_frenzy.up then removeStack( "owlkin_frenzy" ) end if azerite.dawning_sun.enabled then applyBuff( "dawning_sun" ) end end, finish = function () if talent.fluid_form.enabled and buff.moonkin_form.down then shift( "moonkin_form" ) end end, copy = { 194153, 197628 } }, starsurge = { id = 78674, cast = 0, cooldown = function() return state.spec.balance and 0 or ( talent.starlight_conduit.enabled and 6 or 10 ) end, gcd = "spell", spend = function () if not state.spec.balance then return ( talent.starlight_conduit.enabled and 0.003 or 0.006 ) end if buff.oneths_clear_vision.up or buff.starweavers_weft.up or buff.touch_the_cosmos.up then return 0 end return ( 40 - ( buff.incarnation.up and talent.elunes_guidance.enabled and 8 or 0 ) - ( buff.touch_the_cosmos.up and 5 or 0 ) - ( buff.astral_communion.up and 15 or 0 ) ) * ( 1 - 0.05 * buff.rattled_stars.stack ) * ( 1 - 0.1 * buff.timeworn_dreambinder.stack ) end, spendType = function () if not state.spec.balance then return "mana" end return "astral_power" end, startsCombat = true, texture = 135730, talent = "starsurge", ap_check = function() return check_for_ap_overcap( "starsurge" ) end, handler = function () if buff.bear_form.up or buff.cat_form.up then unshift() end if not state.spec.balance then return end if talent.hall_of_stars.enabled and ( buff.oneths_clear_vision.up or buff.starweavers_weft.up or buff.touch_the_cosmos.up ) then applyBuff( "solstice", 3 ) end if buff.starweavers_weft.up then removeBuff( "starweavers_weft" ) else removeBuff( "touch_the_cosmos" ) end if talent.rattle_the_stars.enabled then addStack( "rattled_stars" ) end if talent.starlord.enabled then if buff.starlord.stack < 3 then stat.haste = stat.haste + 0.04 end addStack( "starlord", buff.starlord.remains > 0 and buff.starlord.remains or nil, 1 ) end if talent.stellar_amplification.enabled then if debuff.stellar_amplification.up and buff.stellar_amplification.duration < 20 then buff.stellar_amplification.duration = buff.stellar_amplification.duration + 5 buff.stellar_amplification.expires = buff.stellar_amplification.expires + 5 else applyDebuff( "target", "stellar_amplification" ) end end if set_bonus.tier29_2pc > 0 then addStack( "gathering_starstuff" ) end removeBuff( "oneths_clear_vision" ) removeBuff( "sunblaze" ) if pvptalent.moonkin_aura.enabled then addStack( "moonkin_aura", nil, 1 ) end if azerite.arcanic_pulsar.enabled then addStack( "arcanic_pulsar" ) if buff.arcanic_pulsar.stack == 9 then removeBuff( "arcanic_pulsar" ) applyBuff( "ca_inc", 6 ) eclipse.trigger_both( 6 ) end end if legendary.timeworn_dreambinder.enabled then addStack( "timeworn_dreambinder", nil, 1 ) end end, copy = { 78674, 197626 }, }, -- Talent: Burns the target for $s1 Astral damage, and then an additional $o2 damage over $d. |cFFFFFFFFGenerates ${$m3/10} Astral Power.|r stellar_flare = { id = 202347, cast = 1.5, cooldown = 0, gcd = "spell", school = "astral", spend = -12, spendType = "astral_power", talent = "stellar_flare", startsCombat = true, ap_check = function() return check_for_ap_overcap( "stellar_flare" ) end, handler = function () applyDebuff( "target", "stellar_flare" ) end, }, -- Talent: A quick beam of solar light burns the enemy for $164815s1 Nature damage and then an additional $164815o2 Nature damage over $164815d$?s231050[ to the primary target and all enemies within $164815A2 yards][].$?s137013[ |cFFFFFFFFGenerates ${$m3/10} Astral Power.|r][] sunfire = { id = 93402, cast = 0, cooldown = 0, gcd = "spell", school = "nature", spend = -6, spendType = "astral_power", startsCombat = true, texture = 236216, cycle = "sunfire", ap_check = function() return astral_power.current - action.sunfire.cost + ( talent.shooting_stars.enabled and 4 or 0 ) + ( talent.natures_balance.enabled and ceil( execute_time / 1.5 ) or 0 ) < astral_power.max end, readyTime = function() return mana[ "time_to_" .. ( 0.12 * mana.max ) ] end, handler = function () if buff.bear_form.up or buff.cat_form.up then unshift() end spend( 0.12 * mana.max, "mana" ) -- I want to see AP in mouseovers. applyDebuff( "target", "sunfire" ) if talent.improved_sunfire.enabled then active_dot.sunfire = active_enemies end end, }, -- Talent: Consumes a Regrowth, Wild Growth, or Rejuvenation effect to instantly heal an ally for $s1.$?a383192[ Swiftmend heals the target for $383193o1 over $383193d.][] swiftmend = { id = 18562, cast = 0, cooldown = 15, gcd = "spell", school = "nature", spend = 0.10, spendType = "mana", talent = "swiftmend", startsCombat = false, handler = function () if buff.moonkin_form.down then unshift() end gain( health.max * 0.1, "health" ) end, }, -- Sprout thorns for $d on the friendly target. When victim to melee attacks, thorns deals $305496s1 Nature damage back to the attacker. Attackers also have their movement speed reduced by $232559s1% for $232559d. thorns = { id = 305497, cast = 0, cooldown = 45, gcd = "totem", school = "nature", spend = 0.12, spendType = "mana", pvptalent = function () if essence.conflict_and_strife.enabled then return end return "thorns" end, startsCombat = false, texture = 136104, handler = function () applyBuff( "thorns" ) end, }, -- Talent: Shift into Cat Form and increase your movement speed by $s1%, reducing gradually over $d. tiger_dash = { id = 252216, cast = 0, cooldown = 45, gcd = "spell", school = "physical", talent = "tiger_dash", startsCombat = false, handler = function () shift( "cat_form" ) applyBuff( "tiger_dash" ) end, }, -- Shapeshift into a travel form appropriate to your current location, increasing movement speed on land, in water, or in the air, and granting protection from Polymorph effects. The act of shapeshifting frees you from movement impairing effects.$?a159456[ Land speed increased when used out of combat. This effect is disabled in battlegrounds and arenas.][] travel_form = { id = 783, cast = 0, cooldown = 0, gcd = "spell", school = "physical", startsCombat = false, noform = "travel_form", handler = function () shift( "travel_form" ) end, }, treant_form = { id = 114282, cast = 0, cooldown = 0, gcd = "spell", startsCombat = false, texture = 132145, handler = function () shift( "treant_form" ) end, }, -- Talent: Blasts targets within $61391a1 yards in front of you with a violent Typhoon, knocking them back and dazing them for $61391d. Usable in all shapeshift forms. typhoon = { id = 132469, cast = 0, cooldown = function() return 30 - 5 * talent.incessant_tempest.rank end, gcd = "spell", school = "nature", talent = "typhoon", startsCombat = true, handler = function () applyDebuff( "target", "typhoon" ) if target.maxR < 15 then setDistance( target.distance + 5 ) end end, }, -- Talent: Conjures a vortex of wind for $d at the destination, reducing the movement speed of all enemies within $A1 yards by $s1%. The first time an enemy attempts to leave the vortex, winds will pull that enemy back to its center. Usable in all shapeshift forms. ursols_vortex = { id = 102793, cast = 0, cooldown = 60, gcd = "spell", school = "nature", talent = "ursols_vortex", startsCombat = false, handler = function () applyDebuff( "target", "ursols_vortex" ) end, }, -- Talent: Your next $n Starfires are instant cast and generate $s2% increased Astral Power. warrior_of_elune = { id = 202425, cast = 0, cooldown = 45, gcd = "off", school = "arcane", talent = "warrior_of_elune", startsCombat = false, handler = function () applyBuff( "warrior_of_elune", nil, 3 ) end, }, -- Talent: Bound backward away from your enemies. wild_charge = { id = function () if buff.bear_form.up then return 16979 elseif buff.cat_form.up then return 49376 elseif buff.moonkin_form.up then return 102383 end return 102401 end, known = 102401, cast = 0, cooldown = 15, gcd = "off", school = "physical", talent = "wild_charge", startsCombat = false, usable = function () return target.exists and target.maxR > 7, "target must be 8+ yards away" end, handler = function () if buff.bear_form.up then target.maxR = 5; applyDebuff( "target", "immobilized" ) elseif buff.cat_form.up then target.maxR = 5; applyDebuff( "target", "dazed" ) elseif buff.moonkin_form.up then setDistance( target.maxR + 10 ) end end, copy = { 49376, 16979, 102401, 102383 } }, -- Talent: Heals up to $s2 injured allies within $A1 yards of the target for $o1 over $d. Healing starts high and declines over the duration.$?s33891[ |C0033AA11Tree of Life: Affects $33891s3 additional $ltarget:targets;.|R][] wild_growth = { id = 48438, cast = 1.5, cooldown = 10, gcd = "spell", school = "nature", spend = 0.15, spendType = "mana", talent = "wild_growth", startsCombat = false, handler = function () unshift() applyBuff( "wild_growth" ) end, }, -- Talent: Grow a magical mushroom at the target enemy's location. After $d, the mushroom detonates, dealing $88751s1 Nature damage and generating up to $88751s2 Astral Power based on targets hit. wild_mushroom = { id = 88747, cast = 0, charges = 3, cooldown = 30, recharge = 30, gcd = "spell", school = "nature", talent = "wild_mushroom", startsCombat = false, notalent = "sunseeker_mushroom", handler = function () summonTotem( "wild_mushroom" ) if talent.fungal_growth.enabled then if debuff.fungal_growth.up then debuff.fungal_growth.expires = query_time + 7 else applyDebuff( "target", "fungal_growth", 7 ) end end end, }, -- Hurl a ball of energy at the target, dealing $s1 Nature damage.$?a197911[ |cFFFFFFFFGenerates ${$m2/10} Astral Power.|r][] wrath = { id = 190984, known = function () return state.spec.balance and IsPlayerSpell( 190984 ) or IsPlayerSpell( 5176 ) end, cast = function () if buff.blooming_infusion.up then return 0 end return haste * 1.5 * ( buff.dreamstate.up and 0.6 or 1 ) end, cooldown = 0, gcd = "spell", spend = function () if state.spec.balance then return -1 * ( 6 + ( talent.wild_surges.enabled and 2 or 0 ) + ( set_bonus.tww1 >= 4 and 2 or 0 ) ) * ( talent.soul_of_the_forest.enabled and buff.eclipse_solar.up and 1.6 or 1 ) end return 0.002 end, spendType = function() if state.spec.balance then return "astral_power" end return "mana" end, startsCombat = function() return action.wrath.in_flight end, texture = 535045, ap_check = function () return check_for_ap_overcap( "solar_wrath" ) end, velocity = 20, impact = function () if talent.dream_surge.enabled and buff.dream_burst.up then removeStack( "dream_burst" ) end end, energize_amount = function() return action.wrath.spend * -1 end, handler = function () if talent.fluid_form.enabled and not buff.moonkin_form.up then unshift() end removeBuff( "blooming_infusion" ) removeBuff( "gathering_starstuff" ) if talent.natures_grace.enabled and buff.dreamstate.up then removeStack( "dreamstate" ) end eclipse.advance( "wrath" ) removeBuff( "dawning_sun" ) if azerite.sunblaze.enabled then applyBuff( "sunblaze" ) 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( "moonfire", "entangling_roots", "growl", "shred" ) spec:RegisterOptions( { enabled = true, aoe = 3, cycle = false, nameplates = false, nameplateRange = 40, rangeFilter = false, damage = true, damageDots = true, damageExpiration = 6, potion = "tempered_potion", package = "Balance", } ) spec:RegisterSetting( "vigil_damage", 50, { name = strformat( "%s Damage Threshold", Hekili:GetSpellLinkWithTexture( spec.abilities.natures_vigil.id ) ), desc = strformat( "If set below 100%%, |W%s|w may only be recommended if your health has dropped below the specified percentage.\n\n" .. "By default, |W%s|w also requires the |cFFFFD100Defensives|r toggle to be active.", spec.abilities.natures_vigil.name, spec.abilities.natures_vigil.name ), type = "range", min = 1, max = 100, step = 1, width = "full" } ) spec:RegisterSetting( "starlord_cancel", false, { name = strformat( "%s |TInterface\\Addons\\Hekili\\Textures\\Cancel:0|t Cancel", Hekili:GetSpellLinkWithTexture( spec.auras.starlord.id ) ), desc = strformat( "If checked, canceling |TInterface\\Addons\\Hekili\\Textures\\Cancel:0|t your %s may be recommended. Canceling it allows you to start building stacks via %s and %s at its full duration.\n\n" .. "You will likely want a |cFFFFD100/cancelaura %s|r macro to manage this during combat.", spec.auras.starlord.name, Hekili:GetSpellLinkWithTexture( spec.abilities.starsurge.id ), Hekili:GetSpellLinkWithTexture( spec.abilities.starfall.id ), spec.auras.starlord.name ), icon = 462651, iconCoords = { 0.1, 0.9, 0.1, 0.9 }, type = "toggle", width = "full" } ) -- Starlord Cancel Override class.specs[0].abilities.cancel_buff.funcs.usable = setfenv( function () if not settings.starlord_cancel and args.buff_name == "starlord" then return false, "starlord cancel option disabled" end return args.buff_name ~= nil, "no buff name detected" end, state ) --[[ spec:RegisterSetting( "delay_berserking", false, { name = strformat( "Delay %s", Hekili:GetSpellLinkWithTexture( class.specs[ 0 ].auras.berserking.id ) ), desc = strformat( "If checked, the default priority will attempt to adjust the timing of %s to be consistent with simmed %s usage.", Hekili:GetSpellLinkWithTexture( class.specs[ 0 ].auras.berserking.id ), Hekili:GetSpellLinkWithTexture( class.specs[ 0 ].auras.power_infusion.id ) ), type = "toggle", width = "full", } ) ]] spec:RegisterPack( "Balance", 20250506, [[Hekili:T31EZTnos(plU2kkK2rpiLL94TK1wzMZ3vzUmpQ4SZ8hxTsIsIYIxKi1YhXXxPsF2VgaKGaGaGGYYozMX1mvCIjyJgn6Ur3)qtGXoJ)44Bx4L6p(ND75oO3GEx0XP35xny8TPpS1F8TB9M)jV7G)sO3g4p)EV1EHZX)(hwh5Ta96jrzXOF1Q00Tj)9UDVliDv2SoZJ20njyt2AV0GOW5XEltr)75DNToAw30v(37fFp00GWUVDoQj)ACquCq6dVpijnP7I4SGftMr6VoOxC8TZYcwN(UWXZKYZ9VA8TEzPRIIhF7TbB(bGJcwSWN0C)e49rnVDp4)V4VVFkQjWF(q489)i5bN32DG0h0VD)EkEGZ58pyQvACq4N8t3pDEu4Ia0alXMP99H2)XIMSm4l(jLpS33bp8d(Bx7n3F)0p7fh4nBn0GPi50(P(ZxhSnbEYg)uVu0JGF3x2g7NKG6fg6matNnrFgAXmFVyONII3SFAsA2YL4)X(PHr3Z8gUi263)Dyu47LefUFQ7(PzBrs5Ig5seBFW)Z(XaRBHOHpmaTb2lk(tEXrzHlsYj(9XEiooARFOFmMcN3UNdR8LH4N32XTTlIdUD7dB8ss9Jb6eSzBmma24hMw0khYiJJatTUnlCzqSVDrR6129kOv)NbFz)03(l3SF6n5YTYNFHavEZ(PEl(FZssr9wXyynmsxheEhZ71xb73JW(ooD61zq5VS3faHHF64q(PRJ83V3vTD)oOjOFELYM0ZH0KENN)Z8xXPx(phKtcv9Y3bmc8OFYl(tWudOhagH7N(7bRxu0IljdXpI)9i1MFhBGo(21iBsSVc)LEzRtH)6pJ9D4HnDrobw7fpb012m(w)qKU5IXF)4uWef1QYFd9fWAiedZ4GTKF3)ZnG(K)I)f2c5U7anNPVpleXhftHtda2(E4Nl9caccdHO9tblG5GwdWTeTUV4o(wGOGAuGh4hlyd0(Hyn6wuJOoRreEsq4ehex2xGlJ2cdj)0s2TWye93wNb)4I9t7cguB9xVEYkKo7(PNbSJ3AqdQtOxAgywsDFLtz2MefpliDYSyFVp5hx2Gt3pDruANnrryL6oPbZ)eshe9alWygSFfE1KuWf9(PJWp39Y9tBJhQNM3yyIjbiIFNST7NAJ)F4rUNli6)T3(H392V)93ClEOoH4TFRh4z5Z(t8s2IesN3yH08OO1lIUpSZCpqupVZYmqAbZwR8IVZFs(mZ)a5QmVDGH3C)jrlNqKGDI934feMWYuaP8xU0h6sGZMVaXydAmJnlkjbRoSm4UvPtY7gSAIipVilgVcgEYRGqDe5cggCnOnmH8YiM7IgZCW84ju9K7xfeJ8cnbMNJtkvu2TJTvWAnFo6tGiDL)KKTbGYVqtlhvsAj7W)U5l6SX7leTeY7QtgPJAG8QFt69rvf(YuyaY6maZFLd(04O1i1geDxaggBkh9245zlM5UOWjzja1kwf(AWTjHpRPvoKwPRj9z6W8FFNuNo0X1bmyTA84Tb6gaNUYpocgd(GBkWPi41A(QOe)q8ZogdH26SPqSQH8PLP6rdXtd5VHFWA8FXQIECB0AYy5v3AOCj7Atg1AjQwz2b2P2n0oslp06imVnSM(i3inNVRRPxGzAbrP6x0BXdusRZy0TILO7HRg)IL4FCTeLnTFGD6bBjkJho2wIY6dfwIkAA9wIUYSeTLowKgxrlSfbo208MLTLlOZyuavtOzpJIH6Yghdf1TGi5kuhRgutU1nie4SXbo0loelSZThrM7yduotDsa6oefp9XUbnTxh3Y5e0unizH56jPrtwe4JNeqANeE9ewxdFY3FRFCHlN7IXj5JidwKcQnBIcFG7X0q)5cJwqe)DnweRjg6b0WP4NNfTDeutGb959ycG6ymU56qfPxqe3deLq5w2CIPRASykxxGKV5CV1ifc(yZjjrs0csq5ZfJs9dZu9XQtwunQSnZI9wdsTu)WKG0h6e7f(joF3jrz01JGHRFskJwQy(23(qCWY)fUp(TC(E)0ycaulmd2jwjg0)WmeEKIKvo9ASWcpxMN1mAu4HemRajwYeV45EGjxE6UNLpVlVT5tV42YYGZI8sNG)Tjyg0rGb5KoV7J38t3wa8zcfzQj37pJfFHYucL4LHKcE57cY2O4uMC2DVkxj(qsi1U231Thden8db04xf4mbBatnu2TqQ)Z9dxaI4hMK4hNTHDKJaQiHa(gVnCXONdjdHwWOYcM3EHPjfATO3qz4gkTGhst2Sw)GTuNhpMoogiwvLzSAcZOqyMZk5rwWVIRE9RHOyGVQqfwZKksxqecScDb0SZCKB4SeWrSxyYMGuOVyveSA0CuLKJds6WRBwjIdjTWKX)ORjgy20LJmlSnkyHvxPcl(B1ObRjZrQuN(2qrZUqfsLUas)P5OdshcHrOq0iEdQ127zBGZgbJYPpnycItS4IImvqZXAD8mQC2wlsvSRNDhA7vcMx0a(qvCeHfT0Ig3Ahwt4tQZIKe2oFBu7rrE7vO(iVXOazw7NMIIFooB2dfZVkfoNqqORvnnHyuwhIaftfAueTiT6mYpoveOHvEjOoV(EdzMpGn3sk7RC6fBsMSokLzYenJlI1SWmURQzCPEyfMuCB4mUBtMXDpOzCQF66ahXedR(gtPwh3Kt0JlYGcikKPd1m4qQFnRM1H1h(Pwteh5MiYe8hftexSjIiucfMiZGmLG(cEHewRKAMIBzYmSoy9SmdbiwpsczutxCMDeGgPIz0xmsd9Zq5qM8qOhKw3e)WvOmOILMtJ8nbPI7AreHmDLyLsggOtROUmzgUigE89rHGtLabjefZ3)ijeDL4b85qi6(1qi6kIdqPmsPVdKdzMCx3gvevJRyo7se4nkEsimjgNaXWIzOnCh3vIPhx2vCq2qGpc(LGyEosPPKGXzHti)9jOsOGuif5bV5f5J7fvjEP7DH)j6)qGLopAZmVQfKXgV4pvmxEFW6fYkldABHmUHbncViXY3O5fgbZ2D4Vg5sc0k8whCxiQ2A4YR)KMHXkAEexvyK5xUIcGDg)WkvbU4Q5TyvvIbElwiNGkidBrPOXRwLiHJ(CqO3xsMSXpEEwmsE6F3DkcAwaMk8GdeKjfJq8y1rvDjCmgrsCXujspZgrsIkv1iYv2Ue0KvXl1fH(AnQwMwc)HpN(krWaUNHx7(0vea7taDxs9fLJxVhjLoe2xfTSiXnQLD(VxgU7fTrA9r5tRpQvbGBhWf7cC9bMIkyl(AUB6mVeeFJIec)yiHvurkHQ7RCeDzLqILfLmSU5ZDOoPLILmyWJmhO7sOIlFcdr5DiLs8Bw4TZqb3B)LBKUqbdG1yEUqka(cPOEZ8R5qLfvLpKGZiQpsXbESKkGJtm(mYksf8I(3lzoGOOf03gDVFCNf(ldMhKswyMsEM6dJS5Hc9H361YCgZUSdMpy61y)LX(jRqTTi6ezBpwB02uKlbiP(CbtEzMGRmA1eHvXBZz8wWDtwS5UIEGd9iDBMu)IPctaJ(es8jGy4H5R9l4hKgUKfEOc4SJQSJSltccKU4avTLZyQWA4Lz1COPvoLQEDkLEdS4CiegfMdVqnUdSR4rOYURl43uYksM5V6q5q5ULuL2LWkdpknS20MKfICTbtWxIDJjOareIc)Y86fGB7(vS5Setlx2Aki33AYgqPJT6FTzjNIDmwH5yLnBvIwv1AHGhoCTf)0Ggx5LJkczAsrxu1AwBPgzay95ZLNrc)6iWGY3TfJ5cTnKRuIhSVSqh0c4pDNiQbvgda4K2H1bZzZNSLPjjdcwnOgjIT3JPI(EggaAkeQQWVktv7mAHYu)M(ZQJDjvuvtDg1YmZSwMQFpsZ6KL62TPPcvvgyw)WhkPqpnwwHBunrMY4MzOuw8duGfgRRaiqEDvc(cXn6yzBAEnLfcthufBKXY2fvJjidekJLT5FYsEtXkmTYdWjx(nb)T9WTa(LCQFQjtrOsytnCcO4I9JgYHxm6B(JFkrmUsUYmWeExv5ur8ssnqLmerbVv)GphgGcc3HjAg2aEOrbPieNk7ebdQO4TCgA79(EFgJ8Hx8wkwS4NMgLnFf26zEeegrYKIeU4eWSzHvz)a01F(ltRqOKmqIoMckEL(qaGr1XJyPqXGtLjpykF0pMtFQQ52sDstN9)tyXlYPQjXb7yk85fnk0)ECcuIZDCOdVYB9sPTQpBRWrnkRvQ9ODc(t37ZtqLgSthei1t2KLSkokIUBYOu2wMfEhOjqbDd)bXX4eH99W9OwxFANt0UOJRApt1xJNC(uWTRov6ryTOAlauUEXKAavPdj3lzNpZHrJDUmfVVd6GEt0FopkC3(XMjZmXzF10lbd9l1d72xdm3OzxRoIHVbqdufsDsbBQSlZl8sj5GxpW7ACVHJPoxrOEcjDyQmDzvWQzc6vcdDXuARfGkJ8OBkwtndCodJR1aeQAuyTQd9Ozr1QEhjEcXLIA6QbILNpKX0K6JclaGfKJL)inq5NhKROgkARLUl4)dA3MOSWuvbiAGV3xWIQEgSoObEblQJeuoVGf1lyrDWyrPoIUb81hoNp2HY9kRdSk1zsr3mEV41rXlQcLd9jfF1bGjOkN3h2ookpoeLvKSjXz9nxuvklE0VkBlLcEuDSwMPWpSYzacxW1v(Oi1HrunHPOMwQqVqtLeYPMZHkd)iG5BaCp(leQVk)ENRySPPeeBEGwcruPIxk84RBvb2kzKIStQ26y8iWVTQIMkbFdwwZ)l(ZZs9zGjvhiRvEb7JLyPelRujvE5FDLlLO3PhYovifZW7srMgB7Ogrznq29KGfUgO8uu2t1NQeonrXeKWnWQ6EgiRzY7aBUJ(l17kHfVB7(Yq6RuERob)6WArBSqUQx8rhsEYZ019Q6XJmhYcjysYH84V(HBM8d)hFB)TCZieQ8HABq(0YXpHVG2p4DRSS87vHqyEMiFB9nfEeZtvHaQ63GxnF0LFB9j4vF6TMmUDhN)1iG8pJEm5Cz98EU4TeieDKmm(w8HkjW8rOtpu8bS5RZpmjFnk63)Dgy2dHYNeHwyZllnAJxk6xmFLx4D(jD2)JVpabDg6aQ8hGWd9JXpocKgytiWalaSJE9fVI5qz8SC3okoqglES0dJXtLDqmEQf2nGKJGXrwUx229uIxIYdDrB7tDphgHOdQYxFr3Vb5nQK9cEj7Rl0JQIltX4rd0nqtSC(I9teXFIi7l88l88l8SHeVzK1BXd6jkPbnNFnIW1sYQq3wHOsBIr87Hr8Aj7HnTzipFyeVwYEyIcd55dJ4prK9fE(VC8SmxrsAqZ5xJiSkswjczRt0Uxn72Ds97uZUD0ExdAYdZHK4u3D74sgEOjV9z9nRxgv2iv7A8zodo1GDEZULLIuIUU3UDkFMZUDQEuFGKACyAcRBziVB08wlfFwMTECmzBXMuaSXUDgWtwMmlpSp0o)G1wwCAsTD6z)kTVFbRyps2RRzC3asBBOMQMER1JqkpudDbvFG701GlgXjsu1yWhJTAfDxg98Qosnqf6f98Nh98QtonG0nwpVAVDC0ZRsxb9CjnqTEU4AP22v4sHv0ADcFXHxS88lRT(YAR)PYNtxZCmCiRTAiPBSpNxwB9f98Vo65YxB1qs3y98)YS2knZwN(krRQYUNjbUkzTHlzCL0xYUZjjH86P)51KAo1da7bA1UDODuUf)I8LBmh)bjBllDL2wTQyehrw62R7Zu11V6c7rUx1s1Jh52tTlUEfIZ)qlb6(OKaLQjdEIvZ1sF1BWS8(sB7Bq)QyJQL3PQBCd6rXdCwfYYQTYS(4WGC8PL6Mq38ZVnjKR8jpL84tl1lPRAOxR3kZeN9APFdSYQV9nOFn1kRMg3GESwRmvTYS(4W2OQNwQ)ur3V2CnJ5uryJ6m5yAJz89Hs)Nok)1NZDu6p2rP)4JREXtl1vs3kbhFIoVVToXu)LITuHtoXMj6GsjCwdD1MiSUya7xZB2Y6eTfNleNS(qFLL77a7xPtfvEkV0MP4RTPEYAlnOEl3EN527uRQk56endDhyZIFIYtfE7cnYx0LEI0L6(0OlPNSFL0LkDD9DM4s0Okvs0z7XJYMqt2JUz1R3u8yEo9Q6xA0Wkz4PJYMqtTYGkpoNt3)JsQVz6PZ(RBufoRoN1hX0J2eHLEEClPd00uZ7Shp(fQdc7GM7QJOglG02uZ7ShtQNs1d9I8FuAGvIeJ5ZATLv1pO125UsThDrBlUpB1x5sxb(GPrxxwpV9mX)OXbJk6554s9gsxJ8QFqCSruUEAEyaWykhFyuVH01Ovnoio2ikRYInPHlz44AY0UXkQId4Jl1BiDnsz9G4yJOC908WuunLJpmQ3q6AKY6bXXgrznbqnz(IMzkC(tBShAjFda1T(2BE3AkMUnzNtud6E9Irdahxl5BGyS(2BE3AQy0mOX3)JVdRlJ6NbfFb47NIoV1qkROpZx)5Odvmx0NXC0Ya0zOYF7VTF6Q00Tj)9UDVliDv2mWuzt3KGnzRXrGnp2Bzk6FpV7S1rZ6c5KFVxm6I6oiS7BX9XVIodgdsF49OEQl(gtI(TfIEX9)iQx(NBjdRf4BfgYn99TbB(bqa92TXORrq3lXhgjx0R)SblVenGiJHKo08Ao76UI3ZukAfZnmL8wuKV9BqFJ2xZU5VVbFh)CnTWuQEeZ1Q4zbQVhP2TJ9UJYeEGhpLCUOhr6XEZPFd(s5zp5w2zM)6O7XF8SfelHiNN5t(QBbVwZZf1VghoDkW4inJMZrrBV2BXI3eS86sVbSz4uI6K6m3eAdVrB(y25nLx6sibWrGrDvWOQZGsOnszuxbgfnt9b6DWeAwi)J1hV6Y)ngZlYnIeEU7)cJTvNoYhHfxAtOHHwGZOAJCNkqTYpciKC7rn0Ph(Pc3Au4raOQDCV0NKp4WKbnYkouclUhOK38IJPb0BiF0Q6cdub5yEvghnOhHoOlMmZ3BdryCdvyehC3DOH87jh0I3uCSOgaJ17HFU0d8OUGmTJ6mqBz)0FNiU(IlBFqh8OPKHUTeLbtCW99V92p8U3(9V)MBzFxE9EMtUJCvst(A0L(LEFe)cVvZVc1NsoptdotzrKn8FqBJQtBlL95AqsmHq58(tc0TISqbsVkR8gnZjch0K5DQIc1wBbqwBTdry()Guy2pTfKTK9CWaoUM6uvF9PwBDPEq80bvwQp6Yr1WVhdTLJA1HBdOCtRg1QD2rPyuRsw(ArvYZvwkQIP2Bwfxxn5AduAErrUHQBAvKRof0ak3uf5QD2rrrUkz5vKL8CLkYI4N08sQwtibvxQKAKiUuAllHnC1zWzu1En5IzFQLtBPl)EAVoUiHsLTdyKZJCdRTT1mMZvleh4scmzqrPbtfLSQxCY(rN3Z(XXZmKwrywJaDisGXmjK(B5doeSzBx7nhffmjbF6DhWgFiXasB8)cmTMKGtbfLWKkHuXrpxEpxiIYuD(go8FO5eRt5uHF5HNEEpKRNWDWXTBN8BnJr9BBL3EPxgFupDvVHm0OEWCIHYoQZJEhrg0PQpcbM7sM4fp3l0pVoX10U85rscPOzW39XB(jUulqRhbj7SHWecj8czRugkmNjPUcxFK7vsRucvEVKxxfU9uZMQHIdXYOCAYpgHlTsAzXLQd93tNSKC0)YSSKclJH9RXFGYQ0FOJIrTy48pHFac2T0nno8A3RupfOazsK83YaXgBi8vaAHDnOkpuptpcyA0hwHjlgdjHx1PkixAza7xNGtCw85DEvJBgLfAK4YW)r8lJ5r9TbjvxhDeewGNOdbik16TcWCAsb9PBZsern10Y57KRDAP8rLfSNKuoqYhdkXn3kv4wvAzEbUvRC3LtURTsknUqknRokp4YO8GRIYNZIO8vsM9E81qPwQAwjuwTckFmfqP61WMH2INqKQws94TRxeRkxAR6ZQJy1XfTVgEo0pdFPo)qOhkGx)WvOW(I5cvtelnwhj850vNVAfdlmWcItwKnz5aj4rDa7YAbF0hWUh9bm5GpgnIKyCCD)89y6xFh(SY9d)ZFE)03(RVxmpQaYIP(Fb8GfccmeBLJnn6ugh0SwMLK3nsdQNLJkprN5AETXe4mGLkXzHSxdyeUXlY)njGSCoOyIioxowJCQ99tsr7Ddm0F7VCt5g9auLDpwOCmtMETQE921s42XAi9MXQ1j6Lr5Di3wu9S2PqsEOo1tYbj)qgSuk3QOZUqKofjd9gUB4dYSI51nzl6ECijdkHuOB7nNUbKf9(KfBUB0fgacr)C4LuMQ1j4JeDrHv2rymwT(s)ZUSKikz8WiAHPcokQY8zfGck1SWs4YQB3oLwf2Y4dwdpZzf5MOnJxAIhNMqzgMRYTwxJ960KoUk1z2N8hH(CBYJgD5zC6T2T4(NdTCOO0kfnT2wUfG9M7SlzdmF7hB3wgODvgocMaCZvIc6QOSkztxguZoEs3KKsRzjz6wBEWyz4zo9mT3oOTbwBJOBh(GN9nXTozSA4WrbtRkA3dER4ooSJKnuHp)k6C5zdupBYr)ZU0McGj)EC0sZUTzIQXiLRHuOw02Pxl5SVwvUkHHWDf0XwDqmxdXcVI4fmlBnyuPTvRKV6dbo)Dz2DjJFhXRNA2QxIZtvl17CXWlPZQ8VczvB(7ZEnloyjVJLVTgx7yNNmdppLTvhNs68Y7Ci66kLl5KVgKKfAkJJLa3xALlGP8mJ1D5ljJS47Gi50n)QKsbVur7PQMmrWwDIiFYjFrmF0pWvhLcXnAow3eXFi2vWkZPf3iCI)E6vIwvR)1RL(aUBCFSrKQRX)wNO8c83GGb0lK0zDjFpd5SvwNFh8RqhyKL6Tsu3Uikpm088IjxdvLTG4w8SVn2Qp(y5PS2c8mGmWybzwYNuYD61HnG31bNphMpv3hkjsyfWMiF5c6Bvc)JPVX3gBpXbg33JAq(SVxaQdyuX4aBdE7hlhqjPkIkqU)d5lzlM(21xk2bpFqFLuP4SFU6tDy5qOy)D74spvpM(AwIdIphMl0)6s5zBbM2uKHOJGAabQ2LLRdBhb(ZSyPjn9GcLg)QnlsAd0Opmeomu19rsCA0NYxrvgMTJKczBEW1IZ0I3RN8CWlaE8cGhVa4X3KaEqSpfX7yWzYm(hkZnHoNnfPlKsUDYBrt9T8k5Fy)MSIA5Lk)HTI2Z76yp1WwRt0BIEq5hSdtCdILeS4cUYrFW43xouiS3D9JoVKByQa1rx3x0G8CbAxKPpI0MVIMWsxYktovEwy2BzchqXu4rXccyEXvDXJyVi0fsTNdgmUgA)Ogvuar(t1OYiq50b2xXD7USy5oMyiwLBLUf76cxt6D0(zw5pTi6ZknqgjTpvgISfZawfUu6Bl6E6ra0vLyKLLqQSy1XxpZJ)))d]] )