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
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]] )
|