-- EvokerDevastation.lua -- November 2022 if UnitClassBase( "player" ) ~= "EVOKER" then return end local addon, ns = ... local Hekili = _G[ addon ] local class, state = Hekili.Class, Hekili.State local strformat = string.format local spec = Hekili:NewSpecialization( 1467 ) spec:RegisterResource( Enum.PowerType.Essence ) spec:RegisterResource( Enum.PowerType.Mana, { disintegrate = { channel = "disintegrate", talent = "energy_loop", last = function () local app = state.buff.casting.applied local t = state.query_time return app + floor( ( t - app ) / class.auras.disintegrate.tick_time ) * class.auras.disintegrate.tick_time end, interval = function () return class.auras.disintegrate.tick_time end, value = function () return 0.024 * mana.max end, -- TODO: Check if should be modmax. } } ) -- Talents spec:RegisterTalents( { -- Evoker aerial_mastery = { 68659, 365933, 1 }, -- Hover gains 1 additional charge. ancient_flame = { 68671, 369990, 1 }, -- Casting Emerald Blossom or Verdant Embrace reduces the cast time of your next Living Flame by 40%. attuned_to_the_dream = { 68672, 376930, 2 }, -- Your healing done and healing received are increased by 2%. blast_furnace = { 68667, 375510, 2 }, -- Fire Breath's damage over time lasts 0 sec longer. bountiful_bloom = { 68572, 370886, 1 }, -- Emerald Blossom heals 2 additional allies. cauterizing_flame = { 68673, 374251, 1 }, -- Cauterize an ally's wounds, removing all Bleed, Poison, Curse, and Disease effects. Heals for 8,939 upon removing any effect. clobbering_sweep = { 68570, 375443, 1 }, -- Tail Swipe's cooldown is reduced by 45 sec. draconic_legacy = { 68685, 376166, 2 }, -- Your Stamina is increased by 3%. enkindled = { 68677, 375554, 2 }, -- Living Flame deals 3% more damage and healing. extended_flight = { 68679, 375517, 2 }, -- Hover lasts 4 sec longer. exuberance = { 68573, 375542, 1 }, -- While above 75% health, your movement speed is increased by 10%. fire_within = { 68654, 375577, 1 }, -- Renewing Blaze's cooldown is reduced by 30 sec. foci_of_life = { 68654, 375574, 1 }, -- Renewing Blaze restores you more quickly, causing damage you take to be healed back over 4 sec. forger_of_mountains = { 68569, 375528, 1 }, -- Landslide's cooldown is reduced by 30 sec, and it can withstand 200% more damage before breaking. heavy_wingbeats = { 68570, 368838, 1 }, -- Wing Buffet's cooldown is reduced by 45 sec. inherent_resistance = { 68670, 375544, 2 }, -- Magic damage taken reduced by 2%. innate_magic = { 68683, 375520, 2 }, -- Essence regenerates 5% faster. instinctive_arcana = { 68666, 376164, 2 }, -- Your Magic damage done is increased by 2%. leaping_flames = { 68662, 369939, 1 }, -- Fire Breath causes your next Living Flame to strike 1 additional target per empower level. lush_growth = { 68652, 375561, 2 }, -- Green spells restore 5% more health. natural_convergence = { 68682, 369913, 1 }, -- Disintegrate channels 20% faster. obsidian_bulwark = { 68674, 375406, 1 }, -- Obsidian Scales has an additional charge. obsidian_scales = { 68675, 363916, 1 }, -- Reinforce your scales, reducing damage taken by 30%. Lasts 12 sec. oppressing_roar = { 68668, 372048, 1 }, -- Let out a bone-shaking roar at enemies in a cone in front of you, increasing the duration of crowd controls that affect them by 50% in the next 10 sec. overawe = { 68660, 374346, 1 }, -- Oppressing Roar removes 1 Enrage effect from each enemy, and its cooldown is reduced by 20 sec for each Enrage dispelled. panacea = { 68680, 387761, 1 }, -- Emerald Blossom instantly heals you for 7,342 when cast. permeating_chill = { 68676, 370897, 1 }, -- Your damaging Blue spells reduce the target's movement speed by 50% for 3 sec. protracted_talons = { 68661, 369909, 1 }, -- Azure Strike damages 1 additional enemy. quell = { 68665, 351338, 1 }, -- Interrupt an enemy's spellcasting and prevent any spell from that school of magic from being cast for 4 sec. recall = { 68684, 371806, 1 }, -- You may reactivate Deep Breath within 3 sec after landing to travel back in time to your takeoff location. regenerative_magic = { 68651, 387787, 1 }, -- Source of Magic forms a bond with your ally, causing 15% of their healing to also heal you while you are below 50% health. renewing_blaze = { 68653, 374348, 1 }, -- The flames of life surround you for 8 sec. While this effect is active, 100% of damage you take is healed back over 8 sec. rescue = { 68658, 370665, 1 }, -- Swoop to an ally and fly with them to the target location. scarlet_adaptation = { 68687, 372469, 1 }, -- Store 20% of your effective healing, up to 3,883. Your next damaging Living Flame consumes all stored healing to increase its damage dealt. sleep_walk = { 68571, 360806, 1 }, -- Disorient an enemy for 20 sec, causing them to sleep walk towards you. Damage has a chance to awaken them. source_of_magic = { 68669, 369459, 1 }, -- Redirect your excess magic to a friendly healer for 30 min. When you cast an empowered spell, you restore 0.25% of their maximum mana per empower level. Limit 1. tailwind = { 68678, 375556, 1 }, -- Hover increases your movement speed by 70% for the first 4 sec. terror_of_the_skies = { 68649, 371032, 1 }, -- Deep Breath stuns enemies for 3 sec. time_spiral = { 68650, 374968, 1 }, -- Bend time, allowing you and your allies within 40 yds to cast their major movement ability once in the next 10 sec, even if it is on cooldown. tip_the_scales = { 68686, 370553, 1 }, -- Compress time to make your next empowered spell cast instantly at its maximum empower level. twin_guardian = { 68656, 370888, 1 }, -- Rescue protects you and your ally from harm, absorbing damage equal to 30% of your maximum health for 5 sec. unravel = { 68663, 368432, 1 }, -- Sunder an enemy's protective magic, dealing 13,946 Spellfrost damage to absorb shields. verdant_embrace = { 68688, 360995, 1 }, -- Fly to an ally and heal them for 12,275, or heal yourself for the same amount. walloping_blow = { 68657, 387341, 1 }, -- Wing Buffet and Tail Swipe knock enemies further and daze them, reducing movement speed by 70% for 4 sec. zephyr = { 68655, 374227, 1 }, -- Conjure an updraft to lift you and your 4 nearest allies within 20 yds into the air, reducing damage taken from area-of-effect attacks by 20% and increasing movement speed by 30% for 8 sec. -- Devastation animosity = { 68640, 375797, 1 }, -- Casting an empower spell extends the duration of Dragonrage by 6 sec. arcane_intensity = { 68622, 375618, 2 }, -- Disintegrate deals 8% more damage. arcane_vigor = { 68619, 386342, 1 }, -- Shattering Star generates 1 Essence. azure_essence_burst = { 68643, 375721, 1 }, -- Azure Strike has a 15% chance to cause an Essence Burst, making your next Disintegrate or Pyre cost no Essence. burnout = { 68633, 375801, 2 }, -- Fire Breath damage has 6% chance to cause your next Living Flame to be instant cast, stacking 2 times. catalyze = { 68636, 386283, 1 }, -- While channeling Disintegrate your Fire Breath on the target deals damage 100% more often. causality = { 68617, 375777, 1 }, -- Essence abilities reduce the remaining cooldown of Eternity Surge by 1 sec. charged_blast = { 68627, 370455, 1 }, -- Your Blue damage increases the damage of your next Pyre by 5%, stacking 20 times. dense_energy = { 68646, 370962, 1 }, -- Pyre's Essence cost is reduced by 1. dragonrage = { 68641, 375087, 1 }, -- Erupt with draconic fury and exhale Pyres at 3 enemies within 25 yds. For 14 sec, Essence Burst's chance to occur is increased to 100%, and you gain the maximum benefit of Mastery: Giantkiller regardless of targets' health. engulfing_blaze = { 68648, 370837, 1 }, -- Living Flame deals 40% increased damage and healing, but its cast time is increased by 0.5 sec. essence_attunement = { 68625, 375722, 1 }, -- Essence Burst stacks 2 times. eternity_surge = { 68623, 359073, 1 }, -- Focus your energies to release a salvo of pure magic, dealing 10,432 Spellfrost damage to an enemy. Damages additional enemies within 12 yds of the target when empowered. I: Damages 2 enemies. II: Damages 4 enemies. III: Damages 6 enemies. eternitys_span = { 68621, 375757, 1 }, -- Eternity Surge and Shattering Star hit twice as many targets. everburning_flame = { 68615, 370819, 1 }, -- Red spells extend the duration of your Fire Breath's damage over time by 1 sec. expunge = { 68689, 365585, 1 }, -- Expunge toxins affecting an ally, removing all Poison effects. eye_of_infinity = { 68617, 369375, 1 }, -- Eternity Surge critical strikes generate 2 Essence. feed_the_flames = { 68615, 369846, 1 }, -- Consuming Essence Burst reduces the remaining cooldown of Fire Breath by 2 sec. firestorm = { 68635, 368847, 1 }, -- An explosion bombards the target area with white-hot embers, dealing 6,466 Fire damage to enemies over 12 sec. focusing_iris = { 68619, 386336, 1 }, -- Shattering Star's damage taken effect lasts 2 sec longer. font_of_magic = { 68632, 375783, 1 }, -- Your empower spells' maximum level is increased by 1. heat_wave = { 68637, 375725, 2 }, -- Fire Breath deals 20% more damage. hoarded_power = { 68575, 375796, 1 }, -- Essence Burst has a 20% chance to not be consumed. honed_aggression = { 68626, 371038, 2 }, -- Azure Strike and Living Flame deal 5% more damage. imminent_destruction = { 68631, 370781, 2 }, -- Empower spells reach maximum level in 20% less time. imposing_presence = { 68642, 371016, 1 }, -- Quell's cooldown is reduced by 20 sec. inner_radiance = { 68642, 386405, 1 }, -- Your Living Flame and Emerald Blossom are 30% more effective on yourself. iridescence = { 68616, 370867, 1 }, -- Casting an empower spell increases the damage of your next 2 spells of the same color by 20% within 10 sec. landslide = { 68681, 358385, 1 }, -- Conjure a path of shifting stone towards the target location, rooting enemies for 30 sec. Damage may cancel the effect. lay_waste = { 68624, 371034, 2 }, -- Deep Breath's damage is increased by 15%. onyx_legacy = { 68630, 386348, 1 }, -- Deep Breath's cooldown is reduced by 1 min. power_nexus = { 68574, 369908, 1 }, -- Increases your maximum Essence to 6. power_swell = { 68620, 370839, 2 }, -- Casting an empower spell increases your Essence regeneration rate by 100% for 2 sec. pyre = { 68644, 357211, 1 }, -- Lob a ball of flame, dealing 2,928 Fire damage to the target and nearby enemies. ruby_embers = { 68648, 365937, 1 }, -- Living Flame deals 594 damage over 12 sec to enemies, or restores 1,361 health to allies over 12 sec. Stacks 3 times. ruby_essence_burst = { 68645, 376872, 1 }, -- Your Living Flame has a 20% chance to cause an Essence Burst, making your next Disintegrate or Pyre cost no Essence. scintillation = { 68629, 370821, 2 }, -- Disintegrate has a 15% chance each time it deals damage to launch a level 1 Eternity Surge at 30% power. shattering_star = { 68618, 370452, 1 }, -- Exhale bolts of concentrated power from your mouth at 2 enemies for 4,463 Spellfrost damage that cracks the targets' defenses, increasing the damage they take from you by 20% for 6 sec. snapfire = { 68634, 370783, 1 }, -- Living Flame has a 12% chance to reset the cooldown of Firestorm, and make your next one instant cast and deal 40% increased damage. spellweavers_dominance = { 68628, 370845, 1 }, -- Your damaging critical strikes deal 230% damage instead of the usual 200%. titanic_wrath = { 68639, 386272, 2 }, -- Essence Burst increases the damage of affected spells by 8.0%. tyranny = { 68638, 376888, 1 }, -- During Deep Breath and Dragonrage you gain the maximum benefit of Mastery: Giantkiller regardless of targets' health. volatility = { 68647, 369089, 2 }, -- Pyre has a 15% chance to flare up and explode again on a nearby target. } ) -- PvP Talents spec:RegisterPvpTalents( { chrono_loop = 5456, -- (383005) Trap the enemy in a time loop for 5 sec. Afterwards, they are returned to their previous location and health. crippling_force = 5471, -- (384660) Disintegrate amplifies Permeating Chill to reduce movement speed by an additional 5% each time it deals damage, up to 80%. nullifying_shroud = 5467, -- (378464) Wreathe yourself in arcane energy, preventing the next 3 full loss of control effects against you. Lasts 30 sec. obsidian_mettle = 5460, -- (378444) While Obsidian Scales is active you gain immunity to interrupt, silence, and pushback effects. precognition = 5509, -- (377360) If an interrupt is used on you while you are not casting, gain 15% haste and become immune to control and interrupt effects for 4 sec. scouring_flame = 5462, -- (378438) Fire Breath burns away 1 beneficial Magic effect per empower level from all targets. swoop_up = 5466, -- (370388) Grab an enemy and fly with them to the target location. time_stop = 5464, -- (378441) Freeze an ally's timestream for 4 sec. While frozen in time they are invulnerable, cannot act, and auras do not progress. You may reactivate Time Stop to end this effect early. unburdened_flight = 5469, -- (378437) Hover makes you immune to movement speed reduction effects. } ) -- Auras spec:RegisterAuras( { -- Talent: The cast time of your next Living Flame is reduced by $w1%. -- https://wowhead.com/beta/spell=375583 ancient_flame = { id = 375583, duration = 3600, max_stack = 1 }, -- Talent: Next Living Flame's cast time is reduced by $w1%. -- https://wowhead.com/beta/spell=375802 burnout = { id = 375802, duration = 15, type = "Magic", max_stack = 1 }, -- Talent: Your next Pyre deals $s1% more damage. -- https://wowhead.com/beta/spell=370454 charged_blast = { id = 370454, duration = 30, max_stack = 20 }, chrono_loop = { id = 383005, duration = 5, max_stack = 1 }, cycle_of_life = { id = 371877, duration = 15, max_stack = 1, }, --[[ Suffering $w1 Volcanic damage every $t1 sec. -- https://wowhead.com/beta/spell=353759 deep_breath = { id = 353759, duration = 1, tick_time = 0.5, type = "Magic", max_stack = 1 }, -- TODO: Effect of impact on target. ]] -- Spewing molten cinders. Immune to crowd control. -- https://wowhead.com/beta/spell=357210 deep_breath = { id = 357210, duration = 6, type = "Magic", max_stack = 1 }, -- Suffering $w1 Spellfrost damage every $t1 sec. -- https://wowhead.com/beta/spell=356995 disintegrate = { id = 356995, duration = function () return 3 * ( talent.natural_convergence.enabled and 0.8 or 1 ) end, tick_time = function () return talent.natural_convergence.enabled and 0.8 or 1 end, type = "Magic", max_stack = 1 }, -- Talent: Essence Burst has a $s2% chance to occur.$?s376888[ Your spells gain the maximum benefit of Mastery: Giantkiller regardless of targets' health.][] -- https://wowhead.com/beta/spell=375087 dragonrage = { id = 375087, duration = 14, max_stack = 1 }, -- Releasing healing breath. Immune to crowd control. -- https://wowhead.com/beta/spell=359816 dream_flight = { id = 359816, duration = 6, type = "Magic", max_stack = 1 }, -- Healing for $w1 every $t1 sec. -- https://wowhead.com/beta/spell=363502 dream_flight_hot = { id = 363502, duration = 15, type = "Magic", max_stack = 1, dot = "buff" }, -- When $@auracaster casts a non-Echo healing spell, $w2% of the healing will be replicated. -- https://wowhead.com/beta/spell=364343 echo = { id = 364343, duration = 15, max_stack = 1 }, -- Healing and restoring mana. -- https://wowhead.com/beta/spell=370960 emerald_communion = { id = 370960, duration = 5, max_stack = 1 }, -- Your next Disintegrate or Pyre costs no Essence. -- https://wowhead.com/beta/spell=359618 essence_burst = { id = 359618, duration = 15, max_stack = function() return talent.essence_attunement.enabled and 2 or 1 end, }, --[[ Your next Essence ability is free. TODO: ??? -- https://wowhead.com/beta/spell=369299 essence_burst = { id = 369299, duration = 15, max_stack = function() return talent.essence_attunement.enabled and 2 or 1 end, }, ]] eternity_surge_x3 = { -- TODO: This is the channel with 3 ranks. id = 359073, duration = 2.5, max_stack = 1 }, eternity_surge_x4 = { -- TODO: This is the channel with 4 ranks. id = 382411, duration = 3.25, max_stack = 1 }, eternity_surge = { alias = { "eternity_surge_x4", "eternity_surge_x3" }, aliasMode = "first", aliasType = "buff", duration = 3.25, }, fire_breath = { id = 357209, duration = function () return 4 * empowerment_level + talent.blast_furnace.rank * 2 end, -- TODO: damage = function () return 0.322 * stat.spell_power * action.fire_breath.spell_targets * ( talent.heat_wave.enabled and 1.2 or 1 ) * ( debuff.shattering_star.up and 1.2 or 1 ) end, max_stack = 1, }, -- Burning for $w2 Fire damage every $t2 sec.$?$W3=1[ Silenced.][] -- https://wowhead.com/beta/spell=357209 fire_breath_dot = { id = 357209, duration = 12, type = "Magic", max_stack = 1, copy = "fire_breath_damage" }, firestorm = { -- TODO: Check for totem? id = 369372, duration = 12, max_stack = 1 }, -- Increases the damage of Fire Breath by $s1%. -- https://wowhead.com/beta/spell=377087 full_belly = { id = 377087, duration = 600, type = "Magic", max_stack = 1 }, -- Movement speed increased by $w2%. Evoker spells may be cast while moving. Does not affect empowered spells.$?e9[ Immune to movement speed reduction effects.][] -- https://wowhead.com/beta/spell=358267 hover = { id = 358267, duration = function () return talent.extended_flight.enabled and 10 or 6 end, tick_time = 1, max_stack = 1 }, -- Your next Blue spell deals $s1% more damage. -- https://wowhead.com/beta/spell=386399 iridescence_blue = { id = 386399, duration = 10, max_stack = 2, }, -- Your next Red spell deals $s1% more damage. -- https://wowhead.com/beta/spell=386353 iridescence_red = { id = 386353, duration = 10, max_stack = 2 }, -- Talent: Rooted. -- https://wowhead.com/beta/spell=355689 landslide = { id = 355689, duration = 30, mechanic = "root", type = "Magic", max_stack = 1 }, leaping_flames = { id = 370901, duration = 30, max_stack = function() return max_empower end, }, -- Sharing $s1% of healing to an ally. -- https://wowhead.com/beta/spell=373267 lifebind = { id = 373267, duration = 5, max_stack = 1 }, -- Burning for $w2 Fire damage every $t2 sec. -- https://wowhead.com/beta/spell=361500 living_flame = { id = 361500, duration = 12, type = "Magic", max_stack = 3, copy = { "living_flame_dot", "living_flame_damage" } }, -- Healing for $w2 every $t2 sec. -- https://wowhead.com/beta/spell=361509 living_flame_hot = { id = 361509, duration = 12, type = "Magic", max_stack = 3, dot = "buff", copy = "living_flame_heal" }, -- -- https://wowhead.com/beta/spell=362980 mastery_giantkiller = { id = 362980, duration = 3600, max_stack = 1 }, -- Talent: Armor increased by $w1%. Magic damage taken reduced by $w2%.$?$w3=1[ Immune to interrupt and silence effects.][] -- https://wowhead.com/beta/spell=363916 obsidian_scales = { id = 363916, duration = 12, max_stack = 1 }, -- Talent: The duration of incoming crowd control effects are increased by $s2%. -- https://wowhead.com/beta/spell=372048 oppressing_roar = { id = 372048, duration = 10, max_stack = 1 }, -- Talent: Movement speed reduced by $w1%. -- https://wowhead.com/beta/spell=370898 permeating_chill = { id = 370898, duration = 3, mechanic = "snare", max_stack = 1 }, -- Talent: $w1% of damage taken is being healed over time. -- https://wowhead.com/beta/spell=374348 renewing_blaze = { id = 374348, duration = function() return talent.foci_of_life.enabled and 4 or 8 end, max_stack = 1 }, -- Talent: Restoring $w1 health every $t1 sec. -- https://wowhead.com/beta/spell=374349 renewing_blaze_heal = { id = 374349, duration = function() return talent.foci_of_life.enabled and 4 or 8 end, max_stack = 1 }, recall = { id = 371807, duration = 10, max_stack = function () return talent.essence_attunement.enabled and 2 or 1 end, }, -- Talent: About to be picked up! -- https://wowhead.com/beta/spell=370665 rescue = { id = 370665, duration = 1, max_stack = 1 }, -- Healing for $w1 every $t1 sec. -- https://wowhead.com/beta/spell=366155 reversion = { id = 366155, duration = 12, max_stack = 1 }, -- Talent: Taking $w3% increased damage from $@auracaster. -- https://wowhead.com/beta/spell=370452 shattering_star = { id = 370452, duration = function () return talent.focusing_iris.enabled and 6 or 4 end, type = "Magic", max_stack = 1, copy = "shattering_star_debuff" }, -- Talent: Asleep. -- https://wowhead.com/beta/spell=360806 sleep_walk = { id = 360806, duration = 20, mechanic = "sleep", type = "Magic", max_stack = 1 }, -- Talent: Your next Firestorm is instant cast and deals $s2% increased damage. -- https://wowhead.com/beta/spell=370818 snapfire = { id = 370818, duration = 10, max_stack = 1 }, -- Talent: $@auracaster is restoring mana to you when they cast an empowered spell. -- https://wowhead.com/beta/spell=369459 source_of_magic = { id = 369459, duration = 1800, max_stack = 1 }, -- Talent: -- https://wowhead.com/beta/spell=370845 spellweavers_dominance = { id = 370845, duration = 3600, max_stack = 1 }, -- Movement speed reduced by $s2%. -- https://wowhead.com/beta/spell=368970 tail_swipe = { id = 368970, duration = 4, type = "Magic", max_stack = 1 }, -- Talent: Stunned. -- https://wowhead.com/beta/spell=372245 terror_of_the_skies = { id = 372245, duration = 3, mechanic = "stun", max_stack = 1 }, -- Talent: May use Death's Advance once, without incurring its cooldown. -- https://wowhead.com/beta/spell=375226 time_spiral = { id = 375226, duration = 10, max_stack = 1 }, -- Talent: Your next empowered spell casts instantly at its maximum empower level. -- https://wowhead.com/beta/spell=370553 tip_the_scales = { id = 370553, duration = 3600, type = "Magic", max_stack = 1 }, -- Talent: Absorbing $w1 damage. -- https://wowhead.com/beta/spell=370889 twin_guardian = { id = 370889, duration = 5, max_stack = 1 }, -- Movement speed reduced by $s2%. -- https://wowhead.com/beta/spell=357214 wing_buffet = { id = 357214, duration = 4, type = "Magic", max_stack = 1 }, -- Talent: Damage taken from area-of-effect attacks reduced by $w1%. Movement speed increased by $w2%. -- https://wowhead.com/beta/spell=374227 zephyr = { id = 374227, duration = 8, max_stack = 1 } } ) local lastEssenceTick = 0 do local previous = 0 spec:RegisterUnitEvent( "UNIT_POWER_UPDATE", "player", nil, function( event, unit, power ) if power == "ESSENCE" then local value, cap = UnitPower( "player", Enum.PowerType.Essence ), UnitPowerMax( "player", Enum.PowerType.Essence ) if value == cap then lastEssenceTick = 0 elseif lastEssenceTick == 0 and value < cap or lastEssenceTick ~= 0 and value > previous then lastEssenceTick = GetTime() end previous = value end end ) end spec:RegisterStateExpr( "empowerment_level", function() return buff.tip_the_scales.down and args.empower_to or max_empower end ) -- This deserves a better fix; when args.empower_to = "maximum" this will cause that value to become max_empower (i.e., 3 or 4). spec:RegisterStateExpr( "maximum", function() return max_empower end ) spec:RegisterHook( "runHandler", function( action ) local ability = class.abilities[ action ] local color = ability.color if color then if color == "red" and buff.iridescence_red.up then removeStack( "iridescence_red" ) elseif color == "blue" and buff.iridescence_blue.up then removeStack( "iridescence_blue" ) end end if talent.power_swell.enabled and ability.empowered then applyBuff( "power_swell" ) -- TODO: Modify Essence regen rate. end empowerment.active = false end ) spec:RegisterGear( "tier29", 200381, 200383, 200378, 200380, 200382 ) spec:RegisterAura( "limitless_potential", { id = 394402, duration = 6, max_stack = 1 } ) spec:RegisterHook( "reset_precast", function() max_empower = talent.font_of_magic.enabled and 4 or 3 if essence.current < essence.max and lastEssenceTick > 0 then local partial = min( 0.95, ( query_time - lastEssenceTick ) * essence.regen ) gain( partial, "essence" ) if Hekili.ActiveDebug then Hekili:Debug( "Essence increased to %.2f from passive regen.", partial ) end end end ) spec:RegisterStateTable( "evoker", setmetatable( {},{ __index = function( t, k ) local val = state.settings[ k ] if val ~= nil then return val end return false end } ) ) local empowered_cast_time do local stages = { 1, 1.75, 2.5, 3.25 } empowered_cast_time = setfenv( function() if buff.tip_the_scales.up then return 0 end return ( 1 - 0.1 * talent.imminent_destruction.rank ) * stages[ args.empower_to or max_empower ] * haste end, state ) end -- Abilities spec:RegisterAbilities( { -- Project intense energy onto 3 enemies, dealing 1,161 Spellfrost damage to them. azure_strike = { id = 362969, cast = 0, cooldown = 0, gcd = "spell", school = "spellfrost", color = "blue", spend = 0.009, spendType = "mana", startsCombat = true, minRange = 0, maxRange = 25, -- Modifiers: -- x Spark of Savagery (Conduit) -- P Honed Aggression (Talent) -- x Protracted Talons (Talent) -- P Shattering Star (Talent) -- x Tyranny (Talent) damage = function () return stat.spell_power * 0.755 * ( debuff.shattering_star.up and 1.2 or 1 ) end, -- PvP multiplier = 1. critical = function() return stat.crit + conduit.spark_of_savagery.mod end, critical_damage = function () return talent.tyranny.enabled and 2.2 or 2 end, spell_targets = function() return talent.protracted_talons.enabled and 3 or 2 end, handler = function () if talent.azure_essence_burst.enabled and buff.dragonrage.up then addStack( "essence_burst", nil, 1 ) end -- TODO: Does this give 2 stacks if hitting 2 targets w/ Essence Attunement? if talent.charged_blast.enabled then addStack( "charged_blast", nil, min( active_enemies, spell_targets.azure_strike ) ) end end, }, -- Weave the threads of time, reducing the cooldown of a major movement ability for all party and raid members by 15% for 1 |4hour:hrs;. blessing_of_the_bronze = { id = 364342, cast = 0, cooldown = 15, gcd = "spell", school = "arcane", color = "bronze", spend = 0.04, spendType = "mana", startsCombat = false, nobuff = "blessing_of_the_bronze", handler = function () applyBuff( "blessing_of_the_bronze" ) applyBuff( "blessing_of_the_bronze_evoker") end, }, -- Talent: Cauterize an ally's wounds, removing all Bleed, Poison, Curse, and Disease effects. Heals for 4,480 upon removing any effect. cauterizing_flame = { id = 374251, cast = 0, cooldown = 60, gcd = "spell", school = "fire", color = "red", spend = 0.013, spendType = "mana", talent = "cauterizing_flame", startsCombat = true, healing = function () return 3.50 * stat.spell_power end, usable = function() return buff.dispellable_poison.up or buff.dispellable_curse.up or buff.dispellable_disease.up, "requires dispellable effect" end, handler = function () removeBuff( "dispellable_poison" ) removeBuff( "dispellable_curse" ) removeBuff( "dispellable_disease" ) health.current = min( health.max, health.current + action.cauterizing_flame.healing ) if talent.everburning_flame.enabled and debuff.fire_breath.up then debuff.fire_breath.expires = debuff.fire_breath.expires + 1 end end, }, -- Take in a deep breath and fly to the targeted location, spewing molten cinders dealing 6,375 Volcanic damage to enemies in your path. Removes all root effects. You are immune to movement impairing and loss of control effects while flying. deep_breath = { id = function () return buff.recall.up and 371807 or 357210 end, cast = 0, cooldown = function () return talent.onyx_legacy.enabled and 60 or 120 end, gcd = "spell", school = "firestorm", color = "black", startsCombat = true, texture = 4622450, toggle = "cooldowns", min_range = 20, max_range = 50, damage = function () return 2.30 * stat.spell_power end, usable = function() return settings.use_deep_breath, "settings.use_deep_breath is disabled" end, handler = function () if buff.recall.up then removeBuff( "recall" ) else setCooldown( "global_cooldown", 6 ) -- TODO: Check. applyBuff( "recall", 9 ) buff.recall.applied = query_time + 6 end if talent.terror_of_the_skies.enabled then applyDebuff( "target", "terror_of_the_skies" ) end end, copy = { "recall", 371807, 357210 }, }, -- Tear into an enemy with a blast of blue magic, inflicting 4,930 Spellfrost damage over 2.1 sec, and slowing their movement speed by 50% for 3 sec. disintegrate = { id = 356995, cast = function() return 3 * ( talent.natural_convergence.enabled and 0.8 or 1 ) end, channeled = true, cooldown = 0, gcd = "spell", school = "spellfrost", color = "blue", spend = function () return buff.essence_burst.up and 0 or 3 end, spendType = "essence", startsCombat = true, damage = function () return 2.28 * stat.spell_power * ( 1 + 0.08 * talent.arcane_intensity.rank ) * ( talent.energy_loop.enabled and 1.2 or 1 ) * ( debuff.shattering_star.up and 1.2 or 1 ) end, critical = function () return stat.crit + conduit.spark_of_savagery.mod end, critical_damage = function () return talent.tyranny.enabled and 2.2 or 2 end, min_range = 0, max_range = 25, -- o Antique Oathstone (Anima Power) -- o Arcane Intensity -- x Disintegrate Rank 2 (built in) -- x Energy Loop (Preservation) -- x Essence Burst -- - Hover -- x Shattering Star start = function () applyDebuff( "target", "disintegrate" ) if buff.essence_burst.up then if talent.feed_the_flames.enabled then reduceCooldown( "fire_breath", 2 ) end removeStack( "essence_burst", 1 ) end if talent.causality.enabled then reduceCooldown( "eternity_surge", 1 ) end end, tick = function () if talent.charged_blast.enabled then addStack( "charged_blast" ) end end }, -- Talent: Erupt with draconic fury and exhale Pyres at 3 enemies within 25 yds. For 14 sec, Essence Burst's chance to occur is increased to 100%, and you gain the maximum benefit of Mastery: Giantkiller regardless of targets' health. dragonrage = { id = 375087, cast = 0, cooldown = 120, gcd = "spell", school = "physical", color = "red", talent = "dragonrage", startsCombat = true, toggle = "cooldowns", spell_targets = function () return min( 3, active_enemies ) end, damage = function () return action.living_pyre.damage * action.dragonrage.spell_targets end, handler = function () applyBuff( "dragonrage" ) if talent.everburning_flame.enabled and debuff.fire_breath.up then debuff.fire_breath.expires = debuff.fire_breath.expires + 1 end end, }, -- Grow a bulb from the Emerald Dream at an ally's location. After 2 sec, heal up to 3 injured allies within 10 yds for 2,208. emerald_blossom = { id = 355913, cast = 0, cooldown = 30, gcd = "spell", school = "nature", color = "green", spend = 3, spendType = "essence", startsCombat = false, healing = function () return 2.5 * stat.spell_power end, -- TODO: Make a fake aura so we know if an Emerald Blossom is pending for a target already? -- TODO: Factor in Fluttering Seedlings? ( 0.9 * stat.spell_power * targets impacted ) -- o Cycle of Life (?); every 3 Emerald Blossoms leaves a tiny sprout which gathers 10% of healing over 15 seconds, then heals allies w/in 25 yards. -- - Count shows on action button. handler = function () if talent.ancient_flame.enabled then applyBuff( "ancient_flame" ) end if talent.cycle_of_life.enabled then if cycle_of_life_count == 2 then cycle_of_life_count = 0 applyBuff( "cycle_of_life" ) else cycle_of_life_count = cycle_of_life_count + 1 end end if talent.causality.enabled then reduceCooldown( "essence_burst", 1 ) end end, }, -- Talent: Focus your energies to release a salvo of pure magic, dealing 4,754 Spellfrost damage to an enemy. Damages additional enemies within 12 yds of the target when empowered. I: Damages 1 enemy. II: Damages 2 enemies. III: Damages 3 enemies. eternity_surge = { id = function() return talent.font_of_magic.enabled and 382411 or 359073 end, known = 359073, cast = empowered_cast_time, -- channeled = true, empowered = true, cooldown = 30, gcd = "off", school = "spellfrost", color = "blue", talent = "eternity_surge", startsCombat = true, spell_targets = function () return min( active_enemies, ( talent.eternitys_span.enabled and 2 or 1 ) * empowerment_level ) end, damage = function () return spell_targets.eternity_surge * 3.4 * stat.spell_power end, handler = function () if talent.animosity.enabled and buff.dragonrage.up then buff.dragonrage.expires = buff.dragonrage.expires + 6 end -- TODO: Determine if we need to model projectiles instead. if talent.charged_blast.enabled then addStack( "charged_blast", nil, spell_targets.eternity_surge ) end if talent.iridescence.enabled then addStack( "iridescence_blue", nil, 2 ) end if buff.tip_the_scales.up then removeBuff( "tip_the_scales" ) setCooldown( "tip_the_scales", action.tip_the_scales.cooldown ) end if set_bonus.tier29_2pc > 0 then applyBuff( "limitless_potential" ) end end, copy = { 382411, 359073 } }, -- Talent: Expunge toxins affecting an ally, removing all Poison effects. expunge = { id = 365585, cast = 0, cooldown = 8, gcd = "spell", school = "nature", color = "green", spend = 0.013, spendType = "mana", talent = "expunge", startsCombat = false, toggle = "interrupts", buff = "dispellable_poison", handler = function () removeBuff( "dispellable_poison" ) end, }, -- Inhale, stoking your inner flame. Release to exhale, burning enemies in a cone in front of you for 8,395 Fire damage, reduced beyond 5 targets. Empowering causes more of the damage to be dealt immediately instead of over time. I: Deals 2,219 damage instantly and 6,176 over 20 sec. II: Deals 4,072 damage instantly and 4,323 over 14 sec. III: Deals 5,925 damage instantly and 2,470 over 8 sec. IV: Deals 7,778 damage instantly and 618 over 2 sec. fire_breath = { id = function() return talent.font_of_magic.enabled and 382266 or 357208 end, known = 357208, cast = empowered_cast_time, -- channeled = true, empowered = true, cooldown = 30, gcd = "off", school = "fire", color = "red", spend = 0.026, spendType = "mana", startsCombat = true, spell_targets = function () return active_enemies end, damage = function () return 1.334 * stat.spell_power * ( 1 + 0.1 * talent.blast_furnace.rank ) * ( debuff.shattering_star.up and 1.2 or 1 ) end, critical = function () return stat.crit + conduit.spark_of_savagery.mod end, critical_damage = function () return talent.tyranny.enabled and 2.2 or 2 end, handler = function() if talent.animosity.enabled and buff.dragonrage.up then buff.dragonrage.expires = buff.dragonrage.expires + 6 end if talent.iridescence.enabled then applyBuff( "iridescence_red", nil, 2 ) end if talent.leaping_flames.enabled then applyBuff( "leaping_flames", nil, empowerment_level ) end applyDebuff( "target", "fire_breath" ) if buff.tip_the_scales.up then removeBuff( "tip_the_scales" ) setCooldown( "tip_the_scales", action.tip_the_scales.cooldown ) end if set_bonus.tier29_2pc > 0 then applyBuff( "limitless_potential" ) end end, copy = { 382266, 357208 } }, -- Talent: An explosion bombards the target area with white-hot embers, dealing 2,701 Fire damage to enemies over 12 sec. firestorm = { id = 368847, cast = function() return buff.snapfire.up and 0 or 2 end, cooldown = 20, gcd = "spell", school = "fire", color = "red", talent = "firestorm", startsCombat = true, min_range = 0, max_range = 25, spell_targets = function () return active_enemies end, damage = function () return action.firestorm.spell_targets * 0.276 * stat.spell_power * 7 end, handler = function () if talent.everburning_flame.enabled and debuff.fire_breath.up then debuff.fire_breath.expires = debuff.fire_breath.expires + 1 end removeBuff( "snapfire" ) end, }, -- Increases haste by 30% for all party and raid members for 40 sec. Allies receiving this effect will become Exhausted and unable to benefit from Fury of the Aspects or similar effects again for 10 min. fury_of_the_aspects = { id = 390386, cast = 0, cooldown = 300, gcd = "off", school = "arcane", spend = 0.04, spendType = "mana", startsCombat = false, toggle = "cooldowns", handler = function () applyBuff( "fury_of_the_aspects" ) applyDebuff( "player", "exhaustion" ) end, }, -- Launch yourself and gain 30% increased movement speed for 10 sec. Allows Evoker spells to be cast while moving. Does not affect empowered spells. hover = { id = 358267, cast = 0, charges = function() return talent.aerial_mastery.enabled and 2 or nil end, cooldown = 35, recharge = function() return talent.aerial_mastery.enabled and 35 or nil end, gcd = "off", school = "physical", startsCombat = false, handler = function () applyBuff( "hover" ) end, }, -- Talent: Conjure a path of shifting stone towards the target location, rooting enemies for 30 sec. Damage may cancel the effect. landslide = { id = 358385, cast = function() return ( talent.engulfing_blaze.enabled and 2.5 or 2 ) * ( buff.burnout.up and 0 or 1 ) end, cooldown = 90, gcd = "spell", school = "firestorm", color = "black", spend = 0.028, spendType = "mana", talent = "landslide", startsCombat = true, toggle = "cooldowns", handler = function () end, }, -- Send a flickering flame towards your target, dealing 2,625 Fire damage to an enemy or healing an ally for 3,089. living_flame = { id = 361469, cast = function() return 2 * ( buff.ancient_flame.up and 0.6 or 1 ) * haste end, cooldown = 0, gcd = "spell", school = "fire", color = "red", spend = 0.02, spendType = "mana", startsCombat = true, damage = function () return 1.61 * stat.spell_power * ( talent.engulfing_blaze.enabled and 1.4 or 1 ) end, healing = function () return 2.75 * stat.spell_power * ( talent.engulfing_blaze.enabled and 1.4 or 1 ) * ( 1 + 0.03 * talent.enkindled.rank ) * ( talent.inner_radiance.enabled and 1.3 or 1 ) end, spell_targets = function () return buff.leaping_flames.up and min( active_enemies, 1 + buff.leaping_flames.stack ) end, -- x Ancient Flame -- x Burnout -- x Engulfing Blaze -- x Enkindled -- - Hover -- x Inner Radiance handler = function () if buff.burnout.up then removeStack( "burnout" ) else removeBuff( "ancient_flame" ) end -- Burnout is not consumed. if talent.ruby_essence_burst.enabled and buff.dragonrage.up then addStack( "essence_burst", nil, buff.leaping_flames.up and ( true_active_enemies > 1 or group or health.percent < 100 ) and 2 or 1 ) end if talent.everburning_flame.enabled and debuff.fire_breath.up then debuff.fire_breath.expires = debuff.fire_breath.expires + 1 end removeBuff( "leaping_flames" ) removeBuff( "scarlet_adaptation" ) end, }, -- Talent: Reinforce your scales, reducing damage taken by 30%. Lasts 12 sec. obsidian_scales = { id = 363916, cast = 0, cooldown = function () return talent.obsidian_bulwark.enabled and 90 or 150 end, gcd = "off", school = "firestorm", color = "black", talent = "obsidian_scales", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "obsidian_scales" ) end, }, -- Talent: Let out a bone-shaking roar at enemies in a cone in front of you, increasing the duration of crowd controls that affect them by 50% in the next 10 sec. oppressing_roar = { id = 372048, cast = 0, cooldown = 120, gcd = "spell", school = "physical", color = "black", talent = "oppressing_roar", startsCombat = true, toggle = "interrupts", handler = function () applyDebuff( "target", "oppressing_roar" ) if talent.overawe.enabled and debuff.dispellable_enrage.up then removeDebuff( "target", "dispellable_enrage" ) reduceCooldown( "oppressing_roar", 20 ) end end, }, -- Talent: Lob a ball of flame, dealing 1,468 Fire damage to the target and nearby enemies. pyre = { id = 357211, cast = 0, cooldown = 0, gcd = "spell", school = "fire", color = "red", spend = function() if buff.essence_burst.up then return 0 end return 3 - talent.dense_energy.rank end, spendType = "essence", talent = "pyre", startsCombat = true, -- TODO: Need to proc Charged Blast on Blue spells. handler = function () if buff.essence_burst.up then if talent.feed_the_flames.enabled then reduceCooldown( "fire_breath", 2 ) end removeStack( "essence_burst", 1 ) end if talent.causality.enabled then reduceCooldown( "eternity_surge", 1 ) end if talent.everburning_flame.enabled and debuff.fire_breath.up then debuff.fire_breath.expires = debuff.fire_breath.expires + 1 end removeBuff( "charged_blast" ) end, }, -- Talent: Interrupt an enemy's spellcasting and preventing any spell from that school of magic from being cast for 4 sec. quell = { id = 351338, cast = 0, cooldown = function () return talent.imposing_presence.enabled and 20 or 40 end, gcd = "off", school = "physical", talent = "quell", startsCombat = true, toggle = "interrupts", debuff = "casting", readyTime = state.timeToInterrupt, handler = function () interrupt() end, }, -- Talent: The flames of life surround you for 8 sec. While this effect is active, 100% of damage you take is healed back over 8 sec. renewing_blaze = { id = 374348, cast = 0, cooldown = function () return talent.fire_within.enabled and 60 or 90 end, gcd = "off", school = "fire", color = "red", talent = "renewing_blaze", startsCombat = false, toggle = "defensives", -- TODO: o Pyrexia would increase all heals by 20%. handler = function () if talent.everburning_flame.enabled and debuff.fire_breath.up then debuff.fire_breath.expires = debuff.fire_breath.expires + 1 end applyBuff( "renewing_blaze" ) applyBuff( "renewing_blaze_heal" ) end, }, -- Talent: Swoop to an ally and fly with them to the target location. rescue = { id = 370665, cast = 0, cooldown = 60, gcd = "spell", school = "physical", talent = "rescue", startsCombat = false, toggle = "interrupts", usable = function() return not solo, "requires an ally" end, handler = function () if talent.twin_guardian.enabled then applyBuff( "twin_guardian" ) end end, }, action_return = { id = 361227, cast = 10, cooldown = 0, school = "arcane", gcd = "spell", color = "bronze", spend = 0.01, spendType = "mana", startsCombat = true, texture = 4622472, handler = function () end, copy = "return" }, -- Talent: Exhale a bolt of concentrated power from your mouth for 2,237 Spellfrost damage that cracks the target's defenses, increasing the damage they take from you by 20% for 4 sec. shattering_star = { id = 370452, cast = 0, cooldown = 15, gcd = "spell", school = "spellfrost", color = "blue", talent = "shattering_star", startsCombat = true, spell_targets = function () return min( active_enemies, talent.eternitys_span.enabled and 2 or 1 ) end, damage = function () return 1.6 * stat.spell_power end, critical = function () return stat.crit + conduit.spark_of_savagery.mod end, critical_damage = function () return talent.tyranny.enabled and 2.2 or 2 end, handler = function () applyDebuff( "target", "shattering_star" ) if talent.arcane_vigor.enabled then gain( 1, "essence" ) end if talent.charged_blast.enabled then addStack( "charged_blast" ) end end, }, -- Talent: Disorient an enemy for 20 sec, causing them to sleep walk towards you. Damage has a chance to awaken them. sleep_walk = { id = 360806, cast = 1.5, cooldown = 15, gcd = "spell", school = "nature", color = "green", spend = 0.024, spendType = "mana", talent = "sleep_walk", startsCombat = true, toggle = "interrupts", handler = function () applyDebuff( "target", "sleep_walk" ) end, }, -- Talent: Redirect your excess magic to a friendly healer for 30 min. When you cast an empowered spell, you restore 0.25% of their maximum mana per empower level. Limit 1. source_of_magic = { id = 369459, cast = 0, cooldown = 0, gcd = "spell", school = "spellfrost", color = "blue", talent = "source_of_magic", startsCombat = false, handler = function () active_dot.source_of_magic = 1 end, }, swoop_up = { id = 370388, cast = 0, cooldown = 90, gcd = "spell", pvptalent = "swoop_up", startsCombat = false, texture = 4622446, toggle = "cooldowns", handler = function () end, }, tail_swipe = { id = 368970, cast = 0, cooldown = function() return talent.clobbering_sweep.enabled and 45 or 90 end, gcd = "spell", startsCombat = true, toggle = "interrupts", handler = function() if talent.walloping_blow.enabled then applyDebuff( "target", "walloping_blow" ) end end, }, -- Talent: Bend time, allowing you and your allies to cast their major movement ability once in the next 10 sec, even if it is on cooldown. time_spiral = { id = 374968, cast = 0, cooldown = 120, gcd = "spell", school = "arcane", color = "bronze", talent = "time_spiral", startsCombat = false, toggle = "interrupts", handler = function () applyBuff( "time_spiral" ) active_dot.time_spiral = group_members setCooldown( "hover", 0 ) end, }, time_stop = { id = 378441, cast = 0, cooldown = 120, gcd = "spell", pvptalent = "time_stop", startsCombat = false, texture = 4631367, toggle = "cooldowns", handler = function () end, }, -- Talent: Compress time to make your next empowered spell cast instantly at its maximum empower level. tip_the_scales = { id = 370553, cast = 0, cooldown = 120, gcd = "off", school = "arcane", color = "bronze", talent = "tip_the_scales", startsCombat = false, toggle = "cooldowns", nobuff = "tip_the_scales", handler = function () applyBuff( "tip_the_scales" ) end, }, -- Talent: Sunder an enemy's protective magic, dealing 6,991 Spellfrost damage to absorb shields. unravel = { id = 368432, cast = 0, cooldown = 9, gcd = "spell", school = "spellfrost", color = "blue", spend = 0.01, spendType = "mana", talent = "unravel", startsCombat = true, debuff = "all_absorbs", usable = function() return settings.use_unravel, "use_unravel setting is OFF" end, handler = function () removeDebuff( "all_absorbs" ) if talent.charged_blast.enabled then addStack( "charged_blast" ) end end, }, -- Talent: Fly to an ally and heal them for 4,557. verdant_embrace = { id = 360995, cast = 0, cooldown = 24, gcd = "spell", school = "nature", color = "green", spend = 0.03, spendType = "mana", talent = "verdant_embrace", startsCombat = false, handler = function () if talent.ancient_flame.enabled then applyBuff( "ancient_flame" ) end end, }, wing_buffet = { id = 357214, cast = 0, cooldown = function() return talent.heavy_wingbeats.enabled and 45 or 90 end, gcd = "spell", startsCombat = true, handler = function() if talent.walloping_blow.enabled then applyDebuff( "target", "walloping_blow" ) end end, }, -- Talent: Conjure an updraft to lift you and your 4 nearest allies within 20 yds into the air, reducing damage taken from area-of-effect attacks by 20% and increasing movement speed by 30% for 8 sec. zephyr = { id = 374227, cast = 0, cooldown = 120, gcd = "spell", school = "physical", talent = "zephyr", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "zephyr" ) active_dot.zephyr = min( 5, group_members ) end, }, } ) spec:RegisterSetting( "dragonrage_pad", 0.5, { name = strformat( "%s: %s Padding", Hekili:GetSpellLinkWithTexture( spec.abilities.dragonrage.id ), Hekili:GetSpellLinkWithTexture( spec.talents.animosity[2] ) ), type = "range", desc = strformat( "If set above zero, extra time is allotted to help ensure that %s and %s are used before %s expires, reducing the risk that you'll fail to extend " .. "it.\n\nIf %s is not talented, this setting is ignored.", Hekili:GetSpellLinkWithTexture( spec.abilities.fire_breath.id ), Hekili:GetSpellLinkWithTexture( spec.abilities.eternity_surge.id ), Hekili:GetSpellLinkWithTexture( spec.abilities.dragonrage.id ), Hekili:GetSpellLinkWithTexture( spec.talents.animosity[2] ) ), min = 0, max = 1.5, step = 0.05, width = "full", } ) spec:RegisterStateExpr( "dr_padding", function() return talent.animosity.enabled and settings.dragonrage_pad or 0 end ) spec:RegisterSetting( "use_deep_breath", true, { name = strformat( "Use %s", Hekili:GetSpellLinkWithTexture( spec.abilities.deep_breath.id ) ), type = "toggle", desc = strformat( "If checked, %s may be recommended, which will force your character to select a destination and move. By default, %s requires your Cooldowns " .. "toggle to be active.\n\n" .. "If unchecked, |W%s|w will never be recommended, which may result in lost DPS if left unused for an extended period of time.", Hekili:GetSpellLinkWithTexture( spec.abilities.deep_breath.id ), spec.abilities.deep_breath.name, spec.abilities.deep_breath.name ), width = "full", } ) spec:RegisterSetting( "use_unravel", false, { name = strformat( "Use %s", Hekili:GetSpellLinkWithTexture( spec.abilities.unravel.id ) ), type = "toggle", desc = strformat( "If checked, %s may be recommended if your target has an absorb shield applied. By default, %s also requires your Interrupts toggle to be active.", Hekili:GetSpellLinkWithTexture( spec.abilities.unravel.id ), spec.abilities.unravel.name ), width = "full", } ) spec:RegisterSetting( "use_early_chain", false, { name = strformat( "%s: Chain Channel", Hekili:GetSpellLinkWithTexture( spec.abilities.disintegrate.id ) ), type = "toggle", desc = strformat( "If checked, %s may be recommended while already channeling |W%s|w, extending the channel.", Hekili:GetSpellLinkWithTexture( spec.abilities.disintegrate.id ), spec.abilities.disintegrate.name ), width = "full" } ) spec:RegisterSetting( "use_clipping", false, { name = strformat( "%s: Clip Channel", Hekili:GetSpellLinkWithTexture( spec.abilities.disintegrate.id ) ), type = "toggle", desc = strformat( "If checked, other abilities may be recommended during %s, breaking its channel.", Hekili:GetSpellLinkWithTexture( spec.abilities.disintegrate.id ) ), width = "full", } ) spec:RegisterOptions( { enabled = true, aoe = 3, gcdSync = false, nameplates = false, nameplateRange = 35, damage = true, damageDots = true, damageOnScreen = true, damageExpiration = 8, potion = "spectral_intellect", package = "Devastation", } ) spec:RegisterPack( "Devastation", 20230308, [[Hekili:T3ZAVTnss(BX4quK8dzrkBNSdS8HzsYC7eSyYGXzV9BwIsIYMNPi5Yh2Xdm0V9RQ(bzZMD3S1l7eGfyMyjXMvxD9URQyZBCU5R3C9CVC)B(D3bUdhmCW777mW5cN3DZ15pL4FZ1jEZU37w4drElH)9J(p4LL7LhehHx7PWyV5imYIlsNbx)U88KSF60tVni)UIP9NfV80SGLfHK7ywQ3IC87ZoDAy80tNN6DBC0IWGBVl)u)OBdI8pDwOxw24LXZlc9Zo1lje))X(peFVFA)zjj3C90IGW8Fl6MPQX8laKjXF2n)UZzxaRI7cMp3Noy)Sz3Cno4tg4EIZz)0QjRM8ZWvNVAYhjyc8p(WpffSmoli)Pvt(dV5ZdIUD1KUZthNq)sVvtY8ZZHp1F1Nx9zk8G)79e49NXfWLaOuKGi3QjlsJxUAY1L0GpG0Gvts9xeera9F8uko8mYC7bxAEWIf(P(rWhZ9sV1h(7S4IO8m4YraUcK)z3dFjEXQjF4oCeWp(lazlV)nxhgKLNHmeF8F)Dc)1pYBAO)8B(LBU2BgLZ5N7NgblXXzfPiZ1Fzs8J(PJZJX756zPbWac8iKYWWXu8iRFcbxVC0QjoRMCeIFHaE2NdTSXzjEr9zZ3Qjp)8QjtlwSO)8sYB)u)LEbra6FjSsljQeO50)DNVAYHWkKmP3bRiy26yagxrXK63cLtNgKqxQFIHCataxRhJ0AaSPEr3VAcWObYRxssyWmePHLumNSN1)MCq4Ysky7KmxYI0LGU7wcNB)nHUPGAxxqWfx)d3zR)HeCDOTR)dkh1I4O8XXlgV072Gz2sKg1GknSV7gqMuqBRtLgIuPZSKkjEJNb3yokSUWRimVuBLFR)7cycfbkxyKpGcaBFWxEiY8Rk(I8YSiHrdJZYi0HfOD4XIYzdpVA6sIj)vXIngmkdMeRg6dEWecxf)uybkCehhop(XifuzjT1)x2Tcm)7qJH(ieadPa(84D(rRMe5)n0gPG96a4Atb17hJtVNWRbtW4TdxAP33adVG93P(5p6J3o5NfV7zZzMvFc8GbZhLbLbMjcUnkoLaWp8X)eUcyvEgIrz5blrmQpzHoM6xerRXvWfjtNRGmbiKnKP6InvcKNWTFC7S59jWYigCXMJblcs9hpn13l)UAtVDt87wBjeN(dBXo(Fsmy7uYIyJf4GEOnCGPaCZV(Lp(fWpm4SnpaSPtg1DXfHZrra0M3auDph)0q0jCgmqyHfeHUcqdvZtGVUigUVp9l)ko2GW5zIR2uNX4eogNpCP(EnA(Z8G1b9lJrNYuxZmGKdYv3dwhra830QWQYqkAsAiCjacZYj(Q5tyArK25ZlMGRodwR56YnzQYYPM1ss9HG)M610Wgm5zzGEfAshuhbPS4O)YxLLU1scIrt7N70heFgdo5hJw8O24EzVOO8cBiJDixjtLj61yT5AcjErUOQ1MB1AtJVHGfIcB81xFjIdXlu3AK1kphfPK4Nxn5ny8Wn9NunaqfzaDnyECVPTzIcOEsgI(O)SG5(O)OGz3vccAKJjEbGPJhHn)iUNcWzcOoSaTgbMVxgevGrEq864u99sJckLEYEkAMwjKX(HzWNh0)8kdQ6CbX4gQGut(kDwnW5C1W5CFX4CkNPsoNrYJk)JwQi60piRFwsCqygAhlYpeIxjTqoCMpXdway3vC4vtiGJg2cyLmXJgNbj4e(QHUbpYpXUVJX9g(qazdR4DsJLPCnxoCQoCqok1fJJpR)Qj)DpkoeeLdw6jrYaBYoybXhz3zfP4oodFc9mE(36rLMVn4bFYnDhezioUK0aiKiCVu4LfafFLbt0xruq5Si6jE2DErKnU6LvB0vZqq0mi8JmK0HUJN7Z(kmf)mgniX3pBrvnhex3blej3O(io24u(NIIHFefT5QQCAE9y6Qu(w6fv4fUzr2iiOQtKrLMx1ukhHXAmLeP00IPpngcEomzC2DeQMKRlymGTmicaukCmq39sJaz2XbZyqVb9W)BZclM7Rk8L1a7CTa7CxBSZve7AeXZAAbKlokAd8au91Gdm92iXvwBwqB1i6P1gaEVJRUypsq0DjAX0m0KQ0lUWivGquvJEK)7QgyLsxLNwBawJvYbvPhRCeWQ6M1DkLSijSWroNxS4sVZdqz)5JJtNsI8moDjyXRsmq3aqqkhnALWapffW2LYW7GNEIk4wEjcK0V9CH8DOhyHG9FqlyrOhz3h50q7nKOpH9Lv3Z0p)LpbgjNrzqy87G3fVWSyQ9uic9(IiN59fIjBHTXqIyCR7J9sEEG4BNure)MtCbvzrxQMUOmfskrCea9QOrWwfjBejd2ZMVYi0BpjkvCpHlwlvvgYbcrlZzazvXZm2d(PtlsJk52nLfmUdZftnLwkbIHsUSzuu3(sF3ns5rwreO7xm4IBAMat5G82VyWz30m5GYXmSdWauGInpyHiQbPgua5aiErKMpVbskNluRKJ9BjhjASnyk55DzxgSX5hnd98KMLJwHgtQScjnxkga7I9QN)n(IW7VkawaMRK7Blvlh0e9kseSy77NW5LLUZA6mPE6sCQLzyWvwEonEjaRtLhRERBg5QxkyK)qIn2oASVkElxisVS27WfwsLLnW1WX8dXyz3cHzPs(LlFmJw8SXtj1oJXFjLgzq1uIQ2KPs2sMTtLblfnMdzBvsY5OdH4I8Ac5H(EjLojY4x6aLIWIIzsrs87oYwPSuQGsVAZQCJvQEBsB7SDUfm4HkWi92y2wm6mlWiqbUbk5Q3gY2Gs0sX1ogPGT5QnmZGmCt83MIfKxzqTs2K04nrEuIUu4EuOI0KFI9zQPLtiztRSQGkTEpYSTFa1VdMpw6HCBnS)SiVe0WxtBlvQQ6v5ChkA0UMTTAwSZfkyGIq9Rfw)xtFILzrsJdqt3al3KPpqYBjRWNy6qwIFeVdSLoWAErQncM(eXsKDljLv5XXKu4KcJ4)Ral5cPo6yAM8IE6rVN6xUvlv54Ovx2C3YkU7Xm8SQKL6gizTvFyQ0qoI7HHU1229inQUVpxsCahv)MBFRrL3zpwtu8EYhnwewSe0cUJurBvS5PYT2qLBGTiNfgNl(DB4hh0i)bvjNuklnLuHsmxzYoQsV3OsTvfjGGLbhc1H6ntr(aOziRr2SKY9aAktIMkDdkYMbzpKd4KHY5wQsNetqUdSjK5EcKuDbD3kXsUqeFvi3W8mzssamjDTzc1QEolJZhZZakMcwq9DosBsjTadAYaREb(BY1VOVQ9eljI5U(IuoMePC2irkxndYXgrkx1IunsYwBIuktB33HIuUerQAggCnL1aBmM0wYr1KEZAes18ggm6TZjHMSUiPX9BGNX4iSkjXyp(H8vItWsLqEbxizrdXyE7Mr0lJZjvrbVTYv(QjFHvXIi)a61BhAtJrf0AWXuYwuPIAKi3rBgFBLr58YYOklust54CsZi0watx)1vt(zwAq)h00GgK)2SY0GYdQ5(7W6oe6)nsQcjwnhtAC1w3Apb3N7tJzPE8TJz)msARyx6NkJPjT1TIVUBc3T(w3ngMcSNIbkZ6Sjph1Z7AD(Y)KO1aHCccn(OZjShSOTaMxKqtar7(NhJJEBoIvy4RrzK4CjQCK7kicwQKWuXM8bu5(xe4KwerBb3F9R)ktXcLc(010(WLC)ixkNwBveuicrAQSG)I6bDDISvtsvkLPfBTOwVXRAlYtJbaFLfsaSit5fLWh2KirEKMObXD8yop7k8OOAdI6Y0OrZh80mwbgpE3Bxhk6swQvjHKMmD9ja6vyrSfjtvojt1u7(xEOkePk6)6VCkQkGI8y4IabB(tupvzjGgjrZXlI5t7)5dFe1cj13N2wD0UQJ2sdeD0iaqHXr3sktFaPd6RuwPkyyTzNz2sw1s9ravvSNCf0UoAnlBsVS0W3rA1rpKbH6wY6tdN1e4pPnTxmgZ1FsvvTH6uu1k7FxruTLUPZU1vBkLtxRC2iD660yCXUgnJQYqCNC91K2edBNzUG(h)ZJzbc(yqMVGBNp8rlIKyRYUvn75(p5JzriicFouQ4RQQ2IY8xjffvcXhnrBpKOT7qZWKlX0qwLhuCPUa2dQFAg3)Eq5UxPeqlCPAseBhwFhL5ZZC1DEDrydLkrxQBfkPunw6F3lDo30nBppf5vgRrrBVY4YiryLrAHGh9EkJ5Ia(dlbPK9YmlZcjCRIvwmlG8uWY4m6Yew7cVmwmdvPIKKVh)GF6mVKeIdlGyrEu3AkLQQ6mk5yx2g)UJqwUVurwUvwfp15rUE3igbMk9XENdySHbaE(rH82lAJcFWlWqKPQLKNmcMslWJ)dWcmGfNuQBp1FbP55rzc8PXaPavWYcTJU1xWd5rvQGmXTc2DvRvwOJnfwaZlZoubK1GsQQnz9mjerjZK6nCkLz4TiNS9F0i6qu5BU3ssmI5bZUhO7Fru)dV5ecJ4c8bsCwC0Cjorre2O90m0RiYm1s1LpcfP(paYg50jHmgCkcqSptOmjxJIpPPfj5JXEQRj)TdI8zxnYTtx2dXj2Tx4cgN5NFwZgheUGKF(IKEaz1ln8PXeSGmVcGw4sWe0Xag1MGjtmBxwdlwJjTpRHvTwBQwD5mxfB92JRxerH(tGU7fHztQ1fUqS(w1naxHcKe1a7WYqtSPT9wQL6XU0Sjj)mwskS54fGXzpGktFSpPfVzECUOu3yQ6MSR51aMhYEUImU1792Z9kDErA2dGwqK)YaFM9nxv5w5xHvoNnsnZNfVKUpVq0B)J(bKaay0xmrLGfJuIbOYiEXGdM6pZJvkWmwVvdirbfkWfwue(FVAYVn)((LgxUgMjsgudJJVNNTLGmPuVz85VvtZtHnz6zwZW(osi414z4vpn89wVC33KWkRV)a)yaR1ag9zagmacQwz4qPhMbUqWdWwXjT)zgRqFbWTLY17ERF2Brv1)DbTIDuvxVI8yw5(OpFfz9x95)b54iWb06(qCemnKl)wLpa2VLUJm1xKtXHb115B9kHS7EdYdFPHCnjmjaRu6RcUR(ScMu5Za56XRAqrz1HHwVuIyA5tmtjwMwROQngKzw26pb8w2FdanRzomH5vdz3c8TaRrfuw79zcZRpSD)KSfRaIrlt4oFa7saVf4l6qYe6YU(oeS6q2gMly3MRn6lAg0UEc2cCxNoJYHSBb(wG1M0v0oSD)KSfRa16nkgWUeWBb(QuZP513HGvhYEMw18gDEJcvDvJzVc(9gGFLW74eF6iYOPs6T66cKoDnb)38MQFQkSB(vhnqihqkU(BEJjypAqp(sCdrUTc3Ad1kPSNRv)ODwM6XutIyxd(9gGFLW72LKDBiSOa(7mjzfW2KKSDi3wHBTHALu2l0A8r9J9UclqAhynzJ3Pv2WYjYWaRnrV30ks(5wx9YrXOSFk0(yVREUmn8At6FZebS11LUrz)uy)6Q1HxBsDgSJTASVHVnqglgzFVONgppjZe01noBxb2opObNXBa8TEJmM3P0Uyg0fvPwyVPXpTVHVnq2o(Q(Xz7kW25zZKFwJmtTHYpRXmyR8tJGloqBOO68S)8Z695B2PVov2Eh21P)5hPrLaUQIjep5n617QUMdywhtwEgDADgDyZiN()cs3o9fNUD6EGUvjsQj78Ln9tPiU0VRlZ5o6sD(6dqscZxehgg)iTxsH1n22n(0Zdze6LDqQhRd9XMzfRutoFCKYnUiUiQ2ONphh8CVCVPEz()0Qpt7CW0GCnzQ3lgZxYAKJEnKHQiOLOdcHwVE1KOXbbIeG1EqHid)gHAU1yStJ8nqVZQheEjq28jKVbiBSXVTgKUAk9LuBAibxnT6rdGRr)I3vAYqv65fUcCkLkz61RzP(0Ld86pbNn8T14Y1xOTh6lREPkaSIHShbERG1(GvSkOOTFAmgtKEWVzbnUNbVEaV12B0LlzhZc2nUSLaTvzpLdzpc8wbR97IZkb7TFAmkyRh8Tl5zXU131GVnh1BHGTU82Vz2)2Raxpy3AQGUC(Uzkl7vGRhSBbvqziazRzVJOl886p9EsyLMNTVwLK2IfRriw(0gjbWgpfsTYL3Amude3ymSrwY3s41iz4Bj80SlbPNwijOQ5zjQfy3m9iKSVuR)JF(zYVPOpOhnsXvkBc6NFUvuJSawVPCRMXsYGUTqVt2qIU9KTxaEdoOkQz3dmpjc1FstNZF1fp)mJQFLq3YFIZMkDuMyPVFWxZORoVdlMUB8oSn994VrWieCVREEAWPfFpqeViiS8juoRFztrE0OtNQ8vbXQpRAS8SDDm(SmpI5DMNiWJjhVnJQVJG6jZfuqBEvw3jP8Apu17pkVoPlBuEfAIMSFr4QCrOQIgvtxZwSs51uUiKBviLxHUi(VwnzF)(oyDOu0mCECCYiYH4nJI5CC15b9Ob9p)4YhvPrT38h7XgtrDZFSoRx3TE92Ofb2JTVG6weGie9FEri8d2lcH1rkLFAj1WkS6(SyDaTRAqRRfowhqxEMGPcTLBWbr78M6jH1bbC1Gak7WcrB07keGlJjBFXv0(IJG1L9uH4mv)snjBsQ4yQ8vAzn5mvktnPWvAYvfTHPYZPMfHf2li3FjLfP5TrG6BTSiBhhSyepUn(VP(weFAmX76GM3w5ncdN8Yiu8hyV8bf)j6liqeyk3uvCwwNANAuxo8CIRHFKEL)jUERRtjDW(W0Ku53K)CLznOaTtyvjdr1h)jN4Ei)jrFlHVIJLMtkbnW2EfFF8PFPjEEVWdwQ)WdfFu)eUx5dlPAwhRnlsVX7Od0l2)y6BhpWiji238Ww(QrdBfkWFndKlhI6IafVTJQUkn9SMgu0EOYr0(BQX2XItHJ6ZNGefastYrxYKJ60IW8LLcZQTFmGqw(r5KItICv)qisTzZoDL)n(AV05IOeV2HFLjUblReMUl1SNEL58skbYDoq58vK0tIgOwbCXurpsv4LqSesMWUY58NF(a5CC(8ZQp13ScjOSKDmsuNosKEFDpW1Kif4P)1Xz(ZmQ9keKr5Qu1XSHorxMk9rkfHpKCxkoGU0bUtmHQxnA9MKwjhQve2RuK2x4QrQRw3LEDHXT8SmtIsk5frJpNnnFU6Y9o1R5U8OjtAzjhf9AWZ7AAbDIo6qpUdrkCfoYPQJyIhcuVSigHMVpo7WKwH12ZZMf)ctCt4eetuGznpoWSrYOID1rhD8stu)oSF)YAvvGMFTxLJ2R1xQRlFjmSZbkwQKcWOU(lDARSlxoAlfD7rtv5p0hnxYXKlieCmzbb7YO(HN1On6SZ6yXZ9lvm69WX(LUulORID7Nk1zUuDY0)QtelD2P0E6ADLJbBkSTe2(BXXkyaBxD92L2iB3M2Wg5CGnz2ThhfB5DeWySyte0zX0UiujVOkOEdjQ5kNbD4Xx8GuZwlJkcy6XvNZp0D23YuOk7bVZs47UHW)clH)Wne(Nzj8Ta)BFZCMeg0j8TbcdNBChD1rglCiU3cdtsTVvdrQyvsjqMEbjBPTTMnqm5B85Wl6y0q0fhARLOl0T(r5rHTPv9ydqzakElOD1iNb2dfRK(TkOWgVq)0eOKoCZKW7iBTdSna7CdK0H7Yj6mt8o3D3mnAOPjQbTtzmxc5sA9Js581pkftwpAtSKJNS9fPFRMnv4zHL8JYbmz1szX0w8E31DWrUhYinnp3c7DK5tbXlB7(p0P)qTzI9YQZWWJWZ8rXcAOZdciAkoSNFgxQvNmOxoY1UvpX3CxNZ((y17232fVezYUfljqNUV)fyTEGQ(RtpjyKanapblTJiirTSJgCgtj(tmxSG2e6JL)UNIEkDUmM8wJljjmygR4TWMo4wnRMiFSUx1Dw3q1sv8)ohXd5ox8aD0kzKnudXAK2vhs7wX33a0EhiA3cIpuhIp8OH6q8xx50wwqCr1xZ36PvilVWXh1OzoA2Os62lm53m)kqLN2sdV(t1YFo6Id72TTGO577)q3Eh11QmeaJShOZ((EkRt7ixAHAF5EFvAMNGVP44v53rhJ4G6TweNmi2gwLKg2cvrVoX7WQrokBekw)F1RJQgRI24BInEMYMr6Qr1O2IJVkux2yVC0fd60vBbmDhOA)W9aIrtkKXfBp7zaUTYaC0WaA(CzzcNCvCrhtma3gmanTIMwgGI2A7fIb4YYK93VVUkTxaHU3jTnEOQMiSKtOIRsUTEBatqVoQ9lgx1lMgnPTkzBT0GDZIP6nPPxro4W7MRVoy5hiNo538))d]] )