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

1204 lines
43 KiB

-- EvokerDevastation.lua
-- September 2022
if UnitClassBase( "player" ) ~= "EVOKER" then return end
local addon, ns = ...
local Hekili = _G[ addon ]
local class, state = Hekili.Class, Hekili.State
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( {
aerial_mastery = { 68659, 365933, 1 }, -- Hover gains 1 additional charge.
ancient_flame = { 68671, 369990, 1 }, -- Healing yourself with Living Flame reduces the cast time of your next Living Flame by 40%.
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.
attuned_to_the_dream = { 68672, 376930, 2 }, -- Your healing done and healing received are increased by 2%.
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.
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.
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.
cauterizing_flame = { 68673, 374251, 1 }, -- Cauterize an ally's wounds, removing all Bleed, Poison, Curse, and Disease effects. Heals for 2,404 upon removing any effect.
charged_blast = { 68627, 370455, 1 }, -- Your Blue damage increases the damage of your next Pyre by 5%, stacking 20 times.
clobbering_sweep = { 68570, 375443, 1 }, -- Tail Swipe's cooldown is reduced by 45 sec.
dense_energy = { 68646, 370962, 1 }, -- Pyre's Essence cost is reduced by 1.
draconic_legacy = { 68685, 376166, 2 }, -- Your Stamina is increased by 2%.
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%.
engulfing_blaze = { 68648, 370837, 1 }, -- Living Flame deals 40% increased damage and healing, but its cast time is increased by 0.5 sec.
enkindled = { 68677, 375554, 2 }, -- Living Flame deals 3% more damage and healing.
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 2,335 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.
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.
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%.
eye_of_infinity = { 68617, 369375, 1 }, -- Eternity Surge critical strikes grant you Essence Burst.
feed_the_flames = { 68615, 369846, 1 }, -- Consuming Essence Burst reduces the remaining cooldown of Fire Breath by 2 sec.
fire_within = { 68654, 375577, 1 }, -- Renewing Blaze's cooldown is reduced by 30 sec.
firestorm = { 68635, 368847, 1 }, -- An explosion bombards the target area with white-hot embers, dealing 1,327 Fire damage to enemies over 12 sec.
foci_of_life = { 68654, 375574, 1 }, -- While Renewing Blaze's initial effect is active, you receive 20% increased healing from all sources.
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.
forger_of_mountains = { 68569, 375528, 1 }, -- Landslide's cooldown is reduced by 30 sec, and it can withstand 200% more damage before breaking.
heat_wave = { 68637, 375725, 2 }, -- Fire Breath deals 20% more damage.
heavy_wingbeats = { 68570, 368838, 1 }, -- Wing Buffet's cooldown is reduced by 45 sec.
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.
innate_magic = { 68683, 375520, 2 }, -- Essence regenerates 5% faster.
inner_radiance = { 68642, 386405, 1 }, -- Your Living Flame and Emerald Blossom are 30% more effective on yourself.
instinctive_arcana = { 68666, 376164, 2 }, -- Your Magic damage done is increased by 2%.
iridescence = { 68616, 370867, 1 }, -- Casting an empower spell increases the damage of your next 2 spells of the same color by 15% 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 10%.
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's cooldown is reduced by 60 sec.
obsidian_scales = { 68675, 363916, 1 }, -- Reinforce your scales, increasing your armor by 200% and reducing magic damage taken by 20%. Lasts 12 sec.
onyx_legacy = { 68630, 386348, 1 }, -- Deep Breath's cooldown is reduced by 1 min.
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 987 when cast.
permeating_chill = { 68676, 370897, 1 }, -- Your damaging Blue spells reduce the target's movement speed by 50% for 3 sec.
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.
protracted_talons = { 68661, 369909, 1 }, -- Azure Strike damages 1 additional enemy.
pyre = { 68644, 357211, 1 }, -- Lob a ball of flame, dealing 556 Fire damage to the target and nearby enemies.
quell = { 68665, 351338, 1 }, -- Interrupt an enemy's spellcasting and preventing 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 10% 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 14 sec.
rescue = { 68658, 370665, 1 }, -- Swoop to an ally and fly with them to the target location.
roar_of_exhilaration = { 68664, 375507, 1 }, -- Successfully interrupting an enemy with Quell generates 1 Essence.
ruby_embers = { 68648, 365937, 1 }, -- Living Flame deals 128 damage over 12 sec to enemies, or restores 321 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.
scarlet_adaptation = { 68687, 372469, 1 }, -- Store 20% of your effective healing, up to 1,106. Your next damaging Living Flame consumes all stored healing to increase its damage dealt.
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 a bolt of concentrated power from your mouth for 1,099 Spellfrost damage that cracks the target's defenses, increasing the damage they take from you by 20% for 4 sec.
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.
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.
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.
spellweavers_dominance = { 68628, 370845, 1 }, -- Your damaging critical strikes deal 220% damage instead of the usual 200%.
tailwind = { 68678, 375556, 1 }, -- Hover increases your movement speed by 70% for the first 4 sec.
tempered_scales = { 68670, 375544, 2 }, -- Magic damage taken reduced by 2%.
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 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.
titanic_wrath = { 68639, 386272, 2 }, -- Essence Burst increases the damage of affected spells by 8.0%.
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.
tyranny = { 68638, 376888, 1 }, -- During Deep Breath and Dragonrage you gain the maximum benefit of Mastery: Giantkiller regardless of targets' health.
unravel = { 68663, 368432, 1 }, -- Sunder an enemy's protective magic, dealing 3,435 Spellfrost damage to absorb shields.
verdant_embrace = { 68688, 360995, 1 }, -- Fly to an ally and heal them for 2,445.
volatility = { 68647, 369089, 2 }, -- Pyre has a 20% chance to flare up and explode again on a nearby target.
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.
} )
-- PvP Talents
spec:RegisterPvpTalents( {
chrono_loop = 5456, -- 383005
crippling_force = 5471, -- 384660
divide_and_conquer = 5473, -- 384689
nullifying_shroud = 5467, -- 378464
obsidian_mettle = 5460, -- 378444
precognition = 5509, -- 377360
scouring_flame = 5462, -- 378438
swoop_up = 5466, -- 370388
time_stop = 5464, -- 378441
unburdened_flight = 5469, -- 378437
} )
-- Auras
spec:RegisterAuras( {
ancient_flame = {
id = 375583,
duration = 3600,
max_stack = 1
},
burnout = {
id = 375802,
duration = 4,
max_stack = 1,
},
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,
},
deep_breath = {
id = 357210,
duration = 6,
max_stack = 1
},
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,
max_stack = 1,
},
dragonrage = {
id = 375087,
duration = 14,
max_stack = 1
},
essence_burst = {
id = 359618,
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 ()
-- TODO: Empowerment Level impact on duration.
-- return empowerment_level * 4
return ( talent.font_of_magic.enabled and 16 or 12 ) + 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,
},
firestorm = { -- TODO: Check for totem?
id = 369372,
duration = 12,
max_stack = 1
},
fly_with_me = {
id = 370665,
duration = 1,
max_stack = 1
},
hover = {
id = 358267,
duration = function () return talent.extended_flight.enabled and 10 or 6 end,
tick_time = 1,
max_stack = 1,
},
landslide = {
id = 355689,
duration = 30,
max_stack = 1,
},
leaping_flames = {
id = 370901,
duration = 30,
max_stack = 4,
},
nullifying_shroud = {
id = 378464,
duration = 30,
max_stack = 3
},
obsidian_scales = {
id = 363916,
duration = 12,
max_stack = 1
},
oppressing_roar = {
id = 372048,
duration = 10,
max_stack = 1
},
permeating_chill = {
id = 370898,
duration = 3,
max_stack = 1
},
power_swell = {
id = 376850,
duration = 2,
max_stack = 1,
},
recall = {
id = 371807,
duration = 10,
max_stack = function () return talent.essence_attunement.enabled and 2 or 1 end,
},
renewing_blaze = {
id = 374348,
duration = 8,
max_stack = 1,
},
renewing_blaze_heal = {
id = 374349,
duration = 14,
max_stack = 1,
},
scarlet_adaptation = {
id = 372470,
duration = 3600,
max_stack = 1,
},
shattering_star = {
id = 370452,
duration = function () return talent.focusing_iris.enabled and 6 or 4 end,
max_stack = 1
},
sleep_walk = {
id = 360806,
duration = 20,
max_stack = 1
},
snapfire = {
id = 370818,
duration = 10,
max_stack = 1
},
source_of_magic = {
id = 369459,
duration = 1800,
max_stack = 1,
friendly = true,
},
terror_of_the_skies = {
id = 372245,
duration = 3,
max_stack = 1
},
time_stop = {
id = 378441,
duration = 4,
max_stack = 1
},
tip_the_scales = {
id = 370553,
duration = 3600,
max_stack = 1,
},
twin_guardian = {
id = 370889,
duration = 5,
max_stack = 1,
},
unravel_absorb = {
duration = 15,
max_stack = 1,
-- TODO: Check if function works.
generate = function( t, auraType )
local unit = auraType == "debuff" and "target" or "player"
local amount = UnitGetTotalAbsorbs( unit )
if amount > 0 then
t.name = action.unravel.name .. " " .. ABSORB
t.count = 1
t.expires = now + 10
t.applied = now - 5
t.caster = unit
return
end
t.count = 0
t.expires = 0
t.applied = 0
t.caster = "nobody"
end
},
youre_coming_with_me = {
id = 370388,
duration = 1,
max_stack = 1
},
zephyr = {
id = 374227,
duration = 8,
max_stack = 1,
},
} )
--[[
Notes on Empowered Spells:
1. Starting cast of Fire Breath fires UNIT_SPELLCAST_SENT, then ACTIONBAR_SLOT_CHANGED will fire for that spell's slot. UNIT_SPELLCAST_EMPOWER_START fires with UNIT_SPELLCAST_SUCCEEDED in the same frame.
2. SPELL_TEXT_UPDATE fires soon after (has the replacement spell ID).
3. UNIT_SPELLCAST_EMPOWER_STOP is fired when the "cast" is completed.
4. UNIT_SPELLCAST_SENT&SUCCEEDED for "Don't Start GCD" occurs after. https://www.wowhead.com/beta/spell=359115/dnt-activate-gcd
]]
spec:RegisterHook( "runHandler", function( 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
end )
-- Abilities
spec:RegisterAbilities( {
azure_strike = {
id = 362969,
cast = 0,
cooldown = 0,
color = "blue",
gcd = "spell",
spend = 0.01,
spendType = "mana",
startsCombat = true,
texture = 4622447,
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?
end,
},
blessing_of_the_bronze = {
id = 364342,
cast = 0,
cooldown = 15,
color = "bronze",
gcd = "spell",
spend = 0.04,
spendType = "mana",
startsCombat = false,
texture = 4622448,
nobuff = "blessing_of_the_bronze",
handler = function ()
applyBuff( "blessing_of_the_bronze" )
applyBuff( "blessing_of_the_bronze_evoker")
end,
},
cauterizing_flame = {
id = 374251,
cast = 0,
cooldown = 60,
gcd = "spell",
spend = 0.013,
spendType = "mana",
talent = "cauterizing_flame",
startsCombat = true,
texture = 4630446,
toggle = "interrupts",
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,
},
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,
color = "black",
gcd = "spell",
startsCombat = false,
texture = 4622450,
toggle = "cooldowns",
min_range = 20,
max_range = 50,
damage = function () return 2.30 * stat.spell_power 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 },
},
disintegrate = {
id = 356995,
cast = function() return 3 * ( talent.natural_convergence.enabled and 0.8 or 1 ) end,
channeled = true,
cooldown = 0,
color = "blue",
gcd = "spell",
spend = function () return buff.essence_burst.up and 0 or 3 end,
spendType = "essence",
startsCombat = true,
texture = 4622451,
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( "essence_burst", 1 ) end
end,
},
dragonrage = {
id = 375087,
cast = 0,
cooldown = 120,
color = "red",
gcd = "spell",
talent = "dragonrage",
startsCombat = false,
texture = 4622452,
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,
},
emerald_blossom = {
id = 355913,
cast = 0,
cooldown = 30,
color = "green",
gcd = "spell",
spend = 0,
spendType = "essence",
startsCombat = false,
texture = 4622457,
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.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,
},
eternity_surge = {
id = function() return talent.font_of_magic.enabled and 382411 or 359073 end,
cast = function ()
if buff.tip_the_scales.up then return 0 end
return ( talent.font_of_magic.enabled and 3.25 or 2.5 ) * ( talent.imminent_destruction.enabled and 0.8 or 1 )
end,
-- channeled = true,
empowered = true,
cooldown = 30,
color = "blue",
gcd = "spell",
talent = "eternity_surge",
startsCombat = true,
texture = 4630444,
-- TODO: Determine how to know what level of empowerment a cast will be.
-- Based on buff.casting.remains vs. buff.casting.duration ?
-- 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,
finish = function ()
if buff.dragonrage.up then buff.dragonrage.expires = buff.dragonrage.expires + 6 end
if talent.iridescence.enabled then applyBuff( "iridescence_blue", nil, 2 ) end
removeBuff( "tip_the_scales" )
end,
copy = { 382411, 359073 }
},
expunge = {
id = 365585,
cast = 0,
cooldown = 8,
gcd = "spell",
spend = 0.01,
spendType = "mana",
talent = "expunge",
startsCombat = false,
texture = 4630445,
toggle = "interrupts",
buff = "dispellable_poison",
handler = function ()
removeBuff( "dispellable_poison" )
end,
},
fire_breath = {
id = function() return talent.font_of_magic.enabled and 382266 or 357208 end,
cast = function ()
if buff.tip_the_scales.up then return 0 end
return ( talent.font_of_magic.enabled and 3.25 or 2.5 ) * ( talent.imminent_destruction.enabled and 0.8 or 1 )
end,
-- channeled = true,
empowered = true,
cooldown = 30,
color = "red",
gcd = "spell",
spend = 0.03,
spendType = "mana",
startsCombat = true,
texture = 4622458,
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,
finish = function()
if 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, 4 ) end -- TODO: Stack is based on Empowerment level.
applyDebuff( "target", "fire_breath" )
end,
copy = { 382266, 357208 }
},
firestorm = {
id = 368847,
cast = function() return buff.snapfire.up and 0 or 2 end,
cooldown = 20,
color = "red",
gcd = "spell",
talent = "firestorm",
startsCombat = false,
texture = 4622459,
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,
},
fly_with_me = {
id = 370665,
cast = 0,
cooldown = 60,
gcd = "spell",
talent = "fly_with_me",
startsCombat = false,
texture = 4622460,
handler = function ()
end,
},
fury_of_the_aspects = {
id = 390386,
cast = 0,
cooldown = 300,
gcd = "off",
spend = 0.04,
spendType = "mana",
startsCombat = false,
texture = 4622462,
toggle = "cooldowns",
handler = function ()
applyBuff( "fury_of_the_aspects" )
applyDebuff( "player", "exhaustion" )
end,
},
hover = {
id = 358267,
cast = 0,
charges = function() return talent.aerial_mastery.enabled and 2 or 1 end,
cooldown = 35,
recharge = 35,
gcd = "off",
startsCombat = false,
texture = 4622463,
handler = function ()
removeBuff( "time_spiral" )
applyBuff( "hover" )
end,
},
landslide = {
id = 358385,
cast = 0,
cooldown = function () return talent.forger_of_mountains.enabled and 60 or 90 end,
gcd = "spell",
spend = 0.03,
spendType = "mana",
talent = "landslide",
startsCombat = true,
texture = 1016245,
toggle = "interrupts",
handler = function ()
applyDebuff( "target", "landslide" )
end,
},
living_flame = {
id = 361469,
cast = function() return ( talent.engulfing_blaze.enabled and 2.5 or 2 ) * ( buff.ancient_flame.up and 0.6 or 1 ) * ( buff.burnout.up and 0 or 1 ) end,
cooldown = 0,
color = "red",
gcd = "spell",
spend = 0.02,
spendType = "mana",
startsCombat = true,
texture = 4622464,
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,
-- 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, 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,
},
obsidian_scales = {
id = 363916,
cast = 0,
cooldown = function () return talent.obsidian_bulwark.enabled and 90 or 150 end,
color = "black",
gcd = "off",
talent = "obsidian_scales",
startsCombat = false,
texture = 1394891,
toggle = "defensives",
handler = function ()
applyBuff( "obsidian_scales" )
end,
},
oppressing_roar = {
id = 372048,
cast = 0,
cooldown = 120,
color = "black",
gcd = "spell",
talent = "oppressing_roar",
startsCombat = true,
texture = 4622466,
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,
},
pyre = {
id = 357211,
cast = 0,
cooldown = 0,
color = "red",
gcd = "spell",
spend = function()
if buff.essence_burst.up then return 0 end
return 3 - talent.dense_energy.rank
end,
spendType = "essence",
talent = "pyre",
startsCombat = false,
texture = 4622468,
-- 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( "essence_burst", 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,
},
quell = {
id = 351338,
cast = 0,
cooldown = function () return talent.imposing_presence.enabled and 20 or 40 end,
gcd = "off",
talent = "quell",
startsCombat = true,
texture = 4622469,
toggle = "interrupts",
readyTime = state.timeToInterrupt,
debuff = "casting",
handler = function ()
interrupt()
if talent.roar_of_exhilaration.enabled then gain( 1, "essence" ) end
end,
},
renewing_blaze = {
id = 374348,
cast = 0,
cooldown = function () return talent.fire_within.enabled and 60 or 90 end,
color = "red",
gcd = "off",
talent = "renewing_blaze",
startsCombat = false,
texture = 4630463,
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,
},
rescue = {
id = 370665,
cast = 0,
cooldown = 60,
gcd = "spell",
talent = "rescue",
startsCombat = false,
texture = 4622460,
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,
color = "bronze",
gcd = "spell",
spend = 0.01,
spendType = "mana",
startsCombat = true,
texture = 4622472,
handler = function ()
end,
copy = "return"
},
shattering_star = {
id = 370452,
cast = 0,
cooldown = 15,
color = "blue",
gcd = "spell",
talent = "shattering_star",
startsCombat = true,
texture = 4622449,
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
end,
},
sleep_walk = {
id = 360806,
cast = 1.5,
cooldown = 15,
gcd = "spell",
spend = 0.024,
spendType = "mana",
talent = "sleep_walk",
startsCombat = true,
texture = 1396974,
toggle = "interrupts",
handler = function ()
applyDebuff( "target", "sleep_walk" )
end,
},
source_of_magic = {
id = 369459,
cast = 0,
cooldown = 0,
color = "blue",
gcd = "spell",
talent = "source_of_magic",
startsCombat = false,
texture = 4630412,
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,
},
time_spiral = {
id = 374968,
cast = 0,
cooldown = 120,
gcd = "spell",
talent = "time_spiral",
startsCombat = false,
texture = 4622479,
toggle = "cooldowns",
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,
},
tip_the_scales = {
id = 370553,
cast = 0,
cooldown = 120,
color = "bronze",
gcd = "off",
talent = "tip_the_scales",
startsCombat = false,
texture = 4622480,
toggle = "cooldowns",
handler = function ()
applyBuff( "tip_the_scales" )
end,
},
unravel = {
id = 368432,
cast = 0,
cooldown = 9,
color = "blue",
gcd = "spell",
spend = 0.01,
spendType = "mana",
talent = "unravel",
startsCombat = false,
texture = 4630499,
debuff = "unravel_absorb",
handler = function ()
removeDebuff( "unravel_absorb" )
end,
},
verdant_embrace = {
id = 360995,
cast = 0,
cooldown = 24,
color = "green",
gcd = "spell",
spend = 0.03,
spendType = "mana",
talent = "verdant_embrace",
startsCombat = false,
texture = 4622471,
handler = function ()
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,
},
zephyr = {
id = 374227,
cast = 0,
cooldown = 120,
gcd = "spell",
talent = "zephyr",
startsCombat = false,
texture = 4630449,
toggle = "defensives",
handler = function ()
applyBuff( "zephyr" )
active_dot.zephyr = min( 5, group_members )
end,
},
} )
spec:RegisterPack( "Devastation", 20220906, [[Hekili:nsvttXnoq0)nCGqShpdHeimCyZMdWbQTktoLcBjl32w1il5vFWWSh0V9TLhiwEidvoWGC3TEVx3Q7UiR4HI8AQfkUF5ILlxC5IlswS48vlZkYT7gGI8bkBdTfpiP94V)n8e1yPwUsg8TtOO1bmmkNMH(7S2bZvPPTCBNRkHP6tn8ENy8gmnTXg(MLwjuvP1AARs2i4TD2uq2YLqktqnMYEvTtaMu6Gi8xj8KAdOtyddf5voUWERSO63O8vFz1fOygawX9zNFXNrbXRRH9bdg2SeWt((iS(7839pckd6uIAKLICb3ynJLgOH6ew849JLkkBFM)VoqikYbjTsa1f)vHfLrCadQ9)FweRcrmzjNP5wqZP4jfsTARmzFjb)bs0qpLlnEY1R9KvEYPEslRoPN(8en1CdxAHwDOqGmCESgMW6aD8P4OmDuBqfY2sSUOpi0loqYVElaVIKB3vAC6r87huBbDPvvKNfU4NpAUw5AAIZt3WeSw(qPTdknmk(8hW5lXATHRHYknqTDhOZlpkDyZGquIzwlynjd70GNCJNSm6TcTfWiBX7R5kNwQCwuWEYjEYOnWyajdfLtBSjybKTbFW(ToXhUYXaMywWFku3BeHzRGcM1Kn7XDE6MT8pmFP)NdlzgRMV5n5DSVrqxfZ(mTnJDlwY0aoAxrdtgJg2sX2bzRPi)Hoo2ZoOvnCbsz4JEUbZKwpX4gguARN0O0y3mirjZ8eubYnb16jEYT29xAKHEqwd1yeytQNapb6DbS5kmDXtCjt4W5A0fUVb0xHJYKp6j)8hgiGe0BE8mpzBhN1fhnvUBIvprQcG)8GGZ4wXeU1HtbYHjs)QNO0VsZd7HWtYEmaADSPLrmVLlerz0lqAFn0XQXOjPRVc0bIncLnXF3T9HcwWqgYaB)ARX1tOt8XYz7u4mBoV)BHxLXI(RVHM1JRP839YNFyD6(1sXwIBYoJ3S(D2eD96vN(YgOzi8RaJTEWALyxZ3DC20QJ1zXHnFxqqBVDZrC8rlhMLY40D4YVDpWnlJJlUF)xKnnYFYXg3V(9g1pwLo2E8y4BfAS3Jl4XHWI)p]] )