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.
2142 lines
95 KiB
2142 lines
95 KiB
-- DemonHunterHavoc.lua
|
|
-- July 2024
|
|
|
|
if UnitClassBase( "player" ) ~= "DEMONHUNTER" then return end
|
|
|
|
local addon, ns = ...
|
|
local Hekili = _G[ addon ]
|
|
local class, state = Hekili.Class, Hekili.State
|
|
|
|
local strformat, wipe = string.format, table.wipe
|
|
local GetSpellInfo = ns.GetUnpackedSpellInfo
|
|
|
|
local spec = Hekili:NewSpecialization( 577 )
|
|
|
|
spec:RegisterResource( Enum.PowerType.Fury, {
|
|
-- Immolation Aura now grants 20 up front, 60 over 12 seconds (5 fps).
|
|
immolation_aura = {
|
|
talent = "burning_hatred",
|
|
aura = "immolation_aura",
|
|
|
|
last = function ()
|
|
local app = state.buff.immolation_aura.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( t - app )
|
|
end,
|
|
|
|
interval = 1,
|
|
value = 5
|
|
},
|
|
|
|
tactical_retreat = {
|
|
talent = "tactical_retreat",
|
|
aura = "tactical_retreat",
|
|
|
|
last = function ()
|
|
local app = state.buff.tactical_retreat.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( t - app )
|
|
end,
|
|
|
|
interval = function() return class.auras.tactical_retreat.tick_time end,
|
|
value = 8
|
|
},
|
|
|
|
eye_beam = {
|
|
talent = "blind_fury",
|
|
aura = "eye_beam",
|
|
|
|
last = function ()
|
|
local app = state.buff.eye_beam.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( ( t - app ) / state.haste ) * state.haste
|
|
end,
|
|
|
|
interval = function () return state.haste end,
|
|
value = 20,
|
|
},
|
|
} )
|
|
|
|
-- Talents
|
|
spec:RegisterTalents( {
|
|
-- Demon Hunter
|
|
aldrachi_design = { 90999, 391409, 1 }, -- Increases your chance to parry by 3%.
|
|
aura_of_pain = { 90933, 207347, 1 }, -- Increases the critical strike chance of Immolation Aura by 6%.
|
|
blazing_path = { 91008, 320416, 1 }, -- Fel Rush gains an additional charge.
|
|
bouncing_glaives = { 90931, 320386, 1 }, -- Throw Glaive ricochets to 1 additional target.
|
|
champion_of_the_glaive = { 90994, 429211, 1 }, -- Throw Glaive has 2 charges and 10 yard increased range.
|
|
chaos_fragments = { 95154, 320412, 1 }, -- Each enemy stunned by Chaos Nova has a 30% chance to generate a Lesser Soul Fragment.
|
|
chaos_nova = { 90993, 179057, 1 }, -- Unleash an eruption of fel energy, dealing 2,956 Chaos damage and stunning all nearby enemies for 2 sec. Each enemy stunned by Chaos Nova has a 30% chance to generate a Lesser Soul Fragment.
|
|
charred_warblades = { 90948, 213010, 1 }, -- You heal for 3% of all Fire damage you deal.
|
|
collective_anguish = { 95152, 390152, 1 }, -- Eye Beam summons an allied Vengeance Demon Hunter who casts Fel Devastation, dealing 18,271 Fire damage over 2 sec. Dealing damage heals you for up to 1,641 health.
|
|
consume_magic = { 91006, 278326, 1 }, -- Consume 1 beneficial Magic effect removing it from the target.
|
|
darkness = { 91002, 196718, 1 }, -- Summons darkness around you in an 8 yd radius, granting friendly targets a 15% chance to avoid all damage from an attack. Lasts 8 sec. Chance to avoid damage increased by 100% when not in a raid.
|
|
demon_muzzle = { 90928, 388111, 1 }, -- Enemies deal 8% reduced magic damage to you for 8 sec after being afflicted by one of your Sigils.
|
|
demonic = { 91003, 213410, 1 }, -- Eye Beam causes you to enter demon form for 5 sec after it finishes dealing damage.
|
|
disrupting_fury = { 90937, 183782, 1 }, -- Disrupt generates 30 Fury on a successful interrupt.
|
|
erratic_felheart = { 90996, 391397, 2 }, -- The cooldown of Fel Rush is reduced by 10%.
|
|
felblade = { 95150, 232893, 1 }, -- Charge to your target and deal 11,329 Chaos damage. Demon Blades has a chance to reset the cooldown of Felblade. Generates 40 Fury.
|
|
felfire_haste = { 90939, 389846, 1 }, -- Fel Rush increases your movement speed by 10% for 8 sec.
|
|
flames_of_fury = { 90949, 389694, 2 }, -- Sigil of Flame deals 35% increased damage and generates 1 additional Fury per target hit.
|
|
illidari_knowledge = { 90935, 389696, 1 }, -- Reduces magic damage taken by 5%.
|
|
imprison = { 91007, 217832, 1 }, -- Imprisons a demon, beast, or humanoid, incapacitating them for 1 min. Damage will cancel the effect. Limit 1.
|
|
improved_disrupt = { 90938, 320361, 1 }, -- Increases the range of Disrupt to 10 yds.
|
|
improved_sigil_of_misery = { 90945, 320418, 1 }, -- Reduces the cooldown of Sigil of Misery by 30 sec.
|
|
infernal_armor = { 91004, 320331, 2 }, -- Immolation Aura increases your armor by 20% and causes melee attackers to suffer 478 Chaos damage.
|
|
internal_struggle = { 90934, 393822, 1 }, -- Increases your mastery by 3.6%.
|
|
live_by_the_glaive = { 95151, 428607, 1 }, -- When you parry an attack or have one of your attacks parried, restore 2% of max health and 10 Fury. This effect may only occur once every 5 sec.
|
|
long_night = { 91001, 389781, 1 }, -- Increases the duration of Darkness by 3 sec.
|
|
lost_in_darkness = { 90947, 389849, 1 }, -- Spectral Sight lasts an additional 6 sec if disrupted by attacking or taking damage.
|
|
master_of_the_glaive = { 90994, 389763, 1 }, -- Throw Glaive has 2 charges and snares all enemies hit by 50% for 6 sec.
|
|
pitch_black = { 91001, 389783, 1 }, -- Reduces the cooldown of Darkness by 120 sec.
|
|
precise_sigils = { 95155, 389799, 1 }, -- All Sigils are now placed at your target's location.
|
|
pursuit = { 90940, 320654, 1 }, -- Mastery increases your movement speed.
|
|
quickened_sigils = { 95149, 209281, 1 }, -- All Sigils activate 1 second faster.
|
|
rush_of_chaos = { 95148, 320421, 2 }, -- Reduces the cooldown of Metamorphosis by 30 sec.
|
|
shattered_restoration = { 90950, 389824, 1 }, -- The healing of Shattered Souls is increased by 10%.
|
|
sigil_of_misery = { 90946, 207684, 1 }, -- Place a Sigil of Misery at the target location that activates after 2 sec. Causes all enemies affected by the sigil to cower in fear, disorienting them for 15 sec.
|
|
sigil_of_spite = { 90997, 390163, 1 }, -- Place a demonic sigil at the target location that activates after 2 sec. Detonates to deal 44,825 Chaos damage and shatter up to 3 Lesser Soul Fragments from enemies affected by the sigil. Deals reduced damage beyond 5 targets.
|
|
soul_rending = { 90936, 204909, 2 }, -- Leech increased by 6%. Gain an additional 6% leech while Metamorphosis is active.
|
|
soul_sigils = { 90929, 395446, 1 }, -- Afflicting an enemy with a Sigil generates 1 Lesser Soul Fragment.
|
|
swallowed_anger = { 91005, 320313, 1 }, -- Consume Magic generates 20 Fury when a beneficial Magic effect is successfully removed from the target.
|
|
the_hunt = { 90927, 370965, 1 }, -- Charge to your target, striking them for 51,808 Chaos damage, rooting them in place for 1.5 sec and inflicting 45,412 Chaos damage over 6 sec to up to 5 enemies in your path. The pursuit invigorates your soul, healing you for 10% of the damage you deal to your Hunt target for 20 sec.
|
|
unrestrained_fury = { 90941, 320770, 1 }, -- Increases maximum Fury by 20.
|
|
vengeful_bonds = { 90930, 320635, 1 }, -- Vengeful Retreat reduces the movement speed of all nearby enemies by 70% for 3 sec.
|
|
vengeful_retreat = { 90942, 198793, 1 }, -- Remove all snares and vault away. Nearby enemies take 1,229 Physical damage.
|
|
will_of_the_illidari = { 91000, 389695, 1 }, -- Increases maximum health by 5%.
|
|
|
|
-- Havoc
|
|
a_fire_inside = { 95143, 427775, 1 }, -- Immolation Aura has 1 additional charge and 25% chance to refund a charge when used. You can have multiple Immolation Auras active at a time.
|
|
accelerated_blade = { 91011, 391275, 1 }, -- Throw Glaive deals 60% increased damage, reduced by 30% for each previous enemy hit.
|
|
any_means_necessary = { 90919, 388114, 1 }, -- Mastery: Demonic Presence now also causes your Arcane, Fire, Frost, Nature, and Shadow damage to be dealt as Chaos instead, and increases that damage by 28.9%.
|
|
blind_fury = { 91026, 203550, 2 }, -- Eye Beam generates 40 Fury every second, and its damage and duration are increased by 10%.
|
|
burning_hatred = { 90923, 320374, 1 }, -- Immolation Aura generates an additional 40 Fury over 10 sec.
|
|
burning_wound = { 90917, 391189, 1 }, -- Demon Blades and Throw Glaive leave open wounds on your enemies, dealing 8,140 Chaos damage over 15 sec and increasing damage taken from your Immolation Aura by 40%. May be applied to up to 3 targets.
|
|
chaos_theory = { 91035, 389687, 1 }, -- Blade Dance causes your next Chaos Strike within 8 sec to have a 14-30% increased critical strike chance and will always refund Fury.
|
|
chaotic_disposition = { 95147, 428492, 2 }, -- Your Chaos damage has a 7.77% chance to be increased by 17%, occurring up to 3 total times.
|
|
chaotic_transformation = { 90922, 388112, 1 }, -- When you activate Metamorphosis, the cooldowns of Blade Dance and Eye Beam are immediately reset.
|
|
critical_chaos = { 91028, 320413, 1 }, -- The chance that Chaos Strike will refund 20 Fury is increased by 30% of your critical strike chance.
|
|
cycle_of_hatred = { 91032, 258887, 2 }, -- Blade Dance, Chaos Strike, and Glaive Tempest reduce the cooldown of Eye Beam by 0.5 sec.
|
|
dancing_with_fate = { 91015, 389978, 2 }, -- The final slash of Blade Dance deals an additional 25% damage.
|
|
dash_of_chaos = { 93014, 427794, 1 }, -- For 2 sec after using Fel Rush, activating it again will dash back towards your initial location.
|
|
deflecting_dance = { 93015, 427776, 1 }, -- You deflect incoming attacks while Blade Dancing, absorbing damage up to 15% of your maximum health.
|
|
demon_blades = { 91019, 203555, 1 }, -- Your auto attacks deal an additional 1,719 Chaos damage and generate 7-12 Fury.
|
|
demon_hide = { 91017, 428241, 1 }, -- Magical damage increased by 3%, and Physical damage taken reduced by 5%.
|
|
desperate_instincts = { 93016, 205411, 1 }, -- Blur now reduces damage taken by an additional 10%. Additionally, you automatically trigger Blur with 50% reduced cooldown and duration when you fall below 35% health. This effect can only occur when Blur is not on cooldown.
|
|
essence_break = { 91033, 258860, 1 }, -- Slash all enemies in front of you for 30,395 Chaos damage, and increase the damage your Chaos Strike and Blade Dance deal to them by 80% for 4 sec. Deals reduced damage beyond 8 targets.
|
|
eye_beam = { 91018, 198013, 1 }, -- Blasts all enemies in front of you, dealing guaranteed critical strikes for up to 70,852 Chaos damage over 1.9 sec. Deals reduced damage beyond 5 targets. When Eye Beam finishes fully channeling, your Haste is increased by an additional 10% for 10 sec.
|
|
fel_barrage = { 95144, 258925, 1 }, -- Unleash a torrent of Fel energy, rapidly consuming Fury to inflict 3,755 Chaos damage to all enemies within 12 yds, lasting 8 sec or until Fury is depleted. Deals reduced damage beyond 5 targets.
|
|
first_blood = { 90925, 206416, 1 }, -- Blade Dance deals 24,200 Chaos damage to the first target struck.
|
|
furious_gaze = { 91025, 343311, 1 }, -- When Eye Beam finishes fully channeling, your Haste is increased by an additional 10% for 10 sec.
|
|
furious_throws = { 93013, 393029, 1 }, -- Throw Glaive now costs 25 Fury and throws a second glaive at the target.
|
|
glaive_tempest = { 91035, 342817, 1 }, -- Launch two demonic glaives in a whirlwind of energy, causing 32,341 Chaos damage over 3 sec to all nearby enemies. Deals reduced damage beyond 8 targets.
|
|
growing_inferno = { 90916, 390158, 1 }, -- Immolation Aura's damage increases by 10% each time it deals damage.
|
|
improved_chaos_strike = { 91030, 343206, 1 }, -- Chaos Strike damage increased by 10%.
|
|
improved_fel_rush = { 93014, 343017, 1 }, -- Fel Rush damage increased by 20%.
|
|
inertia = { 91021, 427640, 1 }, -- When empowered by Unbound Chaos, Fel Rush increases your damage done by 18% for 5 sec.
|
|
initiative = { 91027, 388108, 1 }, -- Damaging an enemy before they damage you increases your critical strike chance by 10% for 5 sec. Vengeful Retreat refreshes your potential to trigger this effect on any enemies you are in combat with.
|
|
inner_demon = { 91024, 389693, 1 }, -- Entering demon form causes your next Chaos Strike to unleash your inner demon, causing it to crash into your target and deal 22,918 Chaos damage to all nearby enemies. Deals reduced damage beyond 5 targets.
|
|
insatiable_hunger = { 91019, 258876, 1 }, -- Demon's Bite deals 50% more damage and generates 5 to 10 additional Fury.
|
|
isolated_prey = { 91036, 388113, 1 }, -- Chaos Nova, Eye Beam, and Immolation Aura gain bonuses when striking 1 target. Chaos Nova: Stun duration increased by 2 sec. Eye Beam: Deals 30% increased damage. Immolation Aura: Always critically strikes.
|
|
know_your_enemy = { 91034, 388118, 2 }, -- Gain critical strike damage equal to 40% of your critical strike chance.
|
|
looks_can_kill = { 90921, 320415, 1 }, -- Eye Beam deals guaranteed critical strikes.
|
|
momentum = { 91021, 206476, 1 }, -- Fel Rush, The Hunt, and Vengeful Retreat increase your damage done by 6% for 6 sec, up to a maximum of 30 sec.
|
|
mortal_dance = { 93015, 328725, 1 }, -- Blade Dance now reduces targets' healing received by 50% for 6 sec.
|
|
netherwalk = { 93016, 196555, 1 }, -- Slip into the nether, increasing movement speed by 100% and becoming immune to damage, but unable to attack. Lasts 6 sec.
|
|
ragefire = { 90918, 388107, 1 }, -- Each time Immolation Aura deals damage, 30% of the damage dealt by up to 3 critical strikes is gathered as Ragefire. When Immolation Aura expires you explode, dealing all stored Ragefire damage to nearby enemies.
|
|
relentless_onslaught = { 91012, 389977, 1 }, -- Chaos Strike has a 10% chance to trigger a second Chaos Strike.
|
|
restless_hunter = { 91024, 390142, 1 }, -- Leaving demon form grants a charge of Fel Rush and increases the damage of your next Blade Dance by 50%.
|
|
scars_of_suffering = { 90914, 428232, 1 }, -- Increases Versatility by 4% and reduces threat generated by 8%.
|
|
serrated_glaive = { 91013, 390154, 1 }, -- Enemies hit by Chaos Strike or Throw Glaive take 15% increased damage from Chaos Strike and Throw Glaive for 15 sec.
|
|
shattered_destiny = { 91031, 388116, 1 }, -- The duration of your active demon form is extended by 0.1 sec per 12 Fury spent.
|
|
soulscar = { 91012, 388106, 1 }, -- Throw Glaive causes targets to take an additional 100% of damage dealt as Chaos over 6 sec.
|
|
tactical_retreat = { 91022, 389688, 1 }, -- Vengeful Retreat has a 5 sec reduced cooldown and generates 80 Fury over 10 sec.
|
|
trail_of_ruin = { 90915, 258881, 1 }, -- The final slash of Blade Dance inflicts an additional 7,742 Chaos damage over 4 sec.
|
|
unbound_chaos = { 91020, 347461, 1 }, -- Activating Immolation Aura increases the damage of your next Fel Rush by 250%. Lasts 12 sec.
|
|
|
|
-- Aldrachi Reaver
|
|
aldrachi_tactics = { 94914, 442683, 1 }, -- The second enhanced ability in a pattern shatters an additional Soul Fragment.
|
|
army_unto_oneself = { 94896, 442714, 1 }, -- Felblade surrounds you with a Blade Ward, reducing damage taken by 10% for 5 sec.
|
|
art_of_the_glaive = { 94915, 442290, 1, "aldrachi_reaver" }, -- Consuming 6 Soul Fragments or casting The Hunt converts your next Throw Glaive into Reaver's Glaive. Reaver's Glaive:
|
|
evasive_action = { 94911, 444926, 1 }, -- Vengeful Retreat can be cast a second time within 3 sec.
|
|
fury_of_the_aldrachi = { 94898, 442718, 1 }, -- When enhanced by Reaver's Glaive, Blade Dance casts 3 additional glaive slashes to nearby targets. If cast after Chaos Strike, cast 6 slashes instead.
|
|
incisive_blade = { 94895, 442492, 1 }, -- Chaos Strike deals 15% increased damage.
|
|
incorruptible_spirit = { 94896, 442736, 1 }, -- Consuming a Soul Fragment also heals you for an additional 15% over time.
|
|
keen_engagement = { 94910, 442497, 1 }, -- Reaver's Glaive generates 20 Fury.
|
|
preemptive_strike = { 94910, 444997, 1 }, -- Throw Glaive deals 3,124 damage to enemies near its initial target.
|
|
reavers_mark = { 94903, 442679, 1 }, -- When enhanced by Reaver's Glaive, Chaos Strike applies Reaver's Mark, which causes the target to take 12% increased damage for 20 sec. If cast after Blade Dance, Reaver's Mark is increased to 24%.
|
|
thrill_of_the_fight = { 94919, 442686, 1 }, -- After consuming both enhancements, gain Thrill of the Fight, increasing your attack speed by 15% for 20 sec and your damage and healing by 20% for 10 sec.
|
|
unhindered_assault = { 94911, 444931, 1 }, -- Vengeful Retreat resets the cooldown of Felblade.
|
|
warblades_hunger = { 94906, 442502, 1 }, -- Consuming a Soul Fragment causes your next Chaos Strike to deal 1,734 additional damage. Felblade consumes up to 5 nearby Soul Fragments.
|
|
wounded_quarry = { 94897, 442806, 1 }, -- While Reaver's Mark is on your target, melee attacks strike with an additional glaive slash for 867 Physical damage and have a chance to shatter a soul.
|
|
|
|
-- Fel-Scarred
|
|
burning_blades = { 94905, 452408, 1 }, -- Your blades burn with Fel energy, causing your Chaos Strike, Throw Glaive, and auto-attacks to deal an additional 10% damage as Fire over 6 sec.
|
|
demonic_intensity = { 94901, 452415, 1 }, -- Activating Metamorphosis greatly empowers Eye Beam, Immolation Aura, and Sigil of Flame. Demonsurge damage is increased by 10% for each time it previously triggered while your demon form is active.
|
|
demonsurge = { 94917, 452402, 1, "felscarred" }, -- Metamorphosis now also causes Demon Blades to generate 5 additional Fury. While demon form is active, the first cast of each empowered ability induces a Demonsurge, causing you to explode with Fel energy, dealing 12,158 Fire damage to nearby enemies.
|
|
enduring_torment = { 94916, 452410, 1 }, -- The effects of your demon form persist outside of it in a weakened state, increasing Chaos Strike and Blade Dance damage by 5%, and Haste by 3%.
|
|
flamebound = { 94902, 452413, 1 }, -- Immolation Aura has 2 yd increased radius and 30% increased critical strike damage bonus.
|
|
focused_hatred = { 94918, 452405, 1 }, -- Demonsurge deals 35% increased damage when it strikes a single target.
|
|
improved_soul_rending = { 94899, 452407, 1 }, -- Leech granted by Soul Rending increased by 2% and an additional 2% while Metamorphosis is active.
|
|
monster_rising = { 94909, 452414, 1 }, -- Agility increased by 5% while not in demon form.
|
|
pursuit_of_angriness = { 94913, 452404, 1 }, -- Movement speed increased by 1% per 10 Fury.
|
|
set_fire_to_the_pain = { 94899, 452406, 1 }, -- 5% of all non-Fire damage taken is instead taken as Fire damage over 6 sec. Fire damage taken reduced by 10%.
|
|
student_of_suffering = { 94902, 452412, 1 }, -- Sigil of Flame applies Student of Suffering to you, increasing Mastery by 14.4% and granting 5 Fury every 2 sec, for 8 sec.
|
|
untethered_fury = { 94904, 452411, 1 }, -- Maximum Fury increased by 50.
|
|
violent_transformation = { 94912, 452409, 1 }, -- When you activate Metamorphosis, the cooldowns of your Sigil of Flame and Immolation Aura are immediately reset.
|
|
wave_of_debilitation = { 94913, 452403, 1 }, -- Chaos Nova slows enemies by 60% and reduces attack and cast speed 15% for 5 sec after its stun fades.
|
|
} )
|
|
|
|
|
|
-- PvP Talents
|
|
spec:RegisterPvpTalents( {
|
|
blood_moon = 5433, -- (355995)
|
|
chaotic_imprint = 809 , -- (356510)
|
|
cleansed_by_flame = 805 , -- (205625)
|
|
cover_of_darkness = 1206, -- (357419)
|
|
detainment = 812 , -- (205596)
|
|
glimpse = 813 , -- (354489)
|
|
rain_from_above = 811 , -- (206803) You fly into the air out of harm's way. While floating, you gain access to Fel Lance allowing you to deal damage to enemies below.
|
|
reverse_magic = 806 , -- (205604) Removes all harmful magical effects from yourself and all nearby allies within 10 yards, and sends them back to their original caster if possible.
|
|
sigil_mastery = 5523, -- (211489)
|
|
unending_hatred = 1218, -- (213480)
|
|
} )
|
|
|
|
|
|
-- Auras
|
|
spec:RegisterAuras( {
|
|
-- $w1 Soul Fragments consumed. At $?a212612[$442290s1~][$442290s2~], Reaver's Glaive is available to cast.
|
|
art_of_the_glaive = {
|
|
id = 444661,
|
|
duration = 30.0,
|
|
max_stack = 1,
|
|
},
|
|
-- Dodge chance increased by $s2%.
|
|
-- https://wowhead.com/beta/spell=188499
|
|
blade_dance = {
|
|
id = 188499,
|
|
duration = 1,
|
|
max_stack = 1
|
|
},
|
|
-- Damage taken reduced by $s1%.
|
|
blade_ward = {
|
|
id = 442715,
|
|
duration = 5.0,
|
|
max_stack = 1,
|
|
},
|
|
blazing_slaughter = {
|
|
id = 355892,
|
|
duration = 12,
|
|
max_stack = 20,
|
|
},
|
|
-- Versatility increased by $w1%.
|
|
-- https://wowhead.com/beta/spell=355894
|
|
blind_faith = {
|
|
id = 355894,
|
|
duration = 20,
|
|
max_stack = 1
|
|
},
|
|
-- Dodge increased by $s2%. Damage taken reduced by $s3%.
|
|
-- https://wowhead.com/beta/spell=212800
|
|
blur = {
|
|
id = 212800,
|
|
duration = 10,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Taking $w1 Chaos damage every $t1 seconds. Damage taken from $@auracaster's Immolation Aura increased by $s2%.
|
|
-- https://wowhead.com/beta/spell=391191
|
|
burning_wound_391191 = {
|
|
id = 391191,
|
|
duration = 15,
|
|
tick_time = 3,
|
|
max_stack = 1,
|
|
},
|
|
burning_wound_346278 = {
|
|
id = 346278,
|
|
duration = 15,
|
|
tick_time = 3,
|
|
max_stack = 1,
|
|
},
|
|
burning_wound = {
|
|
alias = { "burning_wound_391191", "burning_wound_346278" },
|
|
aliasMode = "first",
|
|
aliasType = "buff",
|
|
},
|
|
-- Talent: Stunned.
|
|
-- https://wowhead.com/beta/spell=179057
|
|
chaos_nova = {
|
|
id = 179057,
|
|
duration = function () return talent.isolated_prey.enabled and active_enemies == 1 and 4 or 2 end,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
chaos_theory = {
|
|
id = 390195,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
chaotic_blades = {
|
|
id = 337567,
|
|
duration = 8,
|
|
max_stack = 1
|
|
},
|
|
darkness = {
|
|
id = 196718,
|
|
duration = function () return pvptalent.cover_of_darkness.enabled and 10 or 8 end,
|
|
max_stack = 1,
|
|
},
|
|
death_sweep = {
|
|
id = 210152,
|
|
duration = 1,
|
|
max_stack = 1,
|
|
},
|
|
demon_soul = {
|
|
id = 347765,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
demonsurge = {
|
|
id = 452416,
|
|
duration = 12,
|
|
max_stack = 10
|
|
},
|
|
demonsurge_demonic = {
|
|
id = 452435,
|
|
duration = 3600,
|
|
max_stack = 1
|
|
},
|
|
demonsurge_hardcast = {
|
|
id = 452489,
|
|
duration = 3600,
|
|
max_stack = 1
|
|
},
|
|
demonsurge_soul_sunder = {
|
|
|
|
},
|
|
demonsurge_spirit_burst = {
|
|
|
|
},
|
|
demonsurge_sigil_of_doom = {
|
|
|
|
},
|
|
demonsurge_consuming_fire = {
|
|
|
|
},
|
|
demonsurge_fel_desolation = {
|
|
|
|
},
|
|
demonsurge_abyssal_gaze = {
|
|
|
|
},
|
|
demonsurge_annihilation = {
|
|
|
|
},
|
|
demonsurge_death_sweep = {
|
|
|
|
},
|
|
elysian_decree = { -- TODO: This aura determines sigil pop time.
|
|
id = 390163,
|
|
duration = function () return talent.quickened_sigils.enabled and 1 or 2 end,
|
|
max_stack = 1
|
|
},
|
|
essence_break = {
|
|
id = 320338,
|
|
duration = 4,
|
|
max_stack = 1,
|
|
copy = "dark_slash" -- Just in case.
|
|
},
|
|
-- Vengeful Retreat may be cast again.
|
|
evasive_action = {
|
|
id = 444929,
|
|
duration = 3.0,
|
|
max_stack = 1,
|
|
},
|
|
-- https://wowhead.com/beta/spell=198013
|
|
eye_beam = {
|
|
id = 198013,
|
|
duration = function () return 2 * ( 1 + 0.1 * talent.blind_fury.rank ) * haste end,
|
|
generate = function( t )
|
|
if buff.casting.up and buff.casting.v1 == 198013 then
|
|
t.applied = buff.casting.applied
|
|
t.duration = buff.casting.duration
|
|
t.expires = buff.casting.expires
|
|
t.stack = 1
|
|
t.caster = "player"
|
|
forecastResources( "fury" )
|
|
return
|
|
end
|
|
|
|
t.applied = 0
|
|
t.duration = class.auras.eye_beam.duration
|
|
t.expires = 0
|
|
t.stack = 0
|
|
t.caster = "nobody"
|
|
end,
|
|
tick_time = 0.2,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Unleashing Fel.
|
|
-- https://wowhead.com/beta/spell=258925
|
|
fel_barrage = {
|
|
id = 258925,
|
|
duration = 8,
|
|
tick_time = 0.25,
|
|
max_stack = 1
|
|
},
|
|
-- Legendary.
|
|
fel_bombardment = {
|
|
id = 337849,
|
|
duration = 40,
|
|
max_stack = 5,
|
|
},
|
|
-- Legendary
|
|
fel_devastation = {
|
|
id = 333105,
|
|
duration = 2,
|
|
max_stack = 1,
|
|
},
|
|
furious_gaze = {
|
|
id = 343312,
|
|
duration = 12,
|
|
max_stack = 1,
|
|
},
|
|
-- Talent: Stunned.
|
|
-- https://wowhead.com/beta/spell=211881
|
|
fel_eruption = {
|
|
id = 211881,
|
|
duration = 4,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Movement speed increased by $w1%.
|
|
-- https://wowhead.com/beta/spell=389847
|
|
felfire_haste = {
|
|
id = 389847,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
copy = 338804
|
|
},
|
|
-- Branded, dealing $204021s1% less damage to $@auracaster$?s389220[ and taking $w2% more Fire damage from them][].
|
|
-- https://wowhead.com/beta/spell=207744
|
|
fiery_brand = {
|
|
id = 207744,
|
|
duration = 10,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Battling a demon from the Theater of Pain...
|
|
-- https://wowhead.com/beta/spell=391430
|
|
fodder_to_the_flame = {
|
|
id = 391430,
|
|
duration = 25,
|
|
max_stack = 1,
|
|
copy = { 329554, 330910 }
|
|
},
|
|
-- The demon is linked to you.
|
|
fodder_to_the_flame_chase = {
|
|
id = 328605,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
-- This is essentially the countdown before the demon despawns (you can Imprison it for a long time).
|
|
fodder_to_the_flame_cooldown = {
|
|
id = 342357,
|
|
duration = 120,
|
|
max_stack = 1,
|
|
},
|
|
-- Falling speed reduced.
|
|
-- https://wowhead.com/beta/spell=131347
|
|
glide = {
|
|
id = 131347,
|
|
duration = 3600,
|
|
max_stack = 1
|
|
},
|
|
-- Burning nearby enemies for $258922s1 $@spelldesc395020 damage every $t1 sec.$?a207548[ Movement speed increased by $w4%.][]$?a320331[ Armor increased by $w5%. Attackers suffer $@spelldesc395020 damage.][]
|
|
-- https://wowhead.com/beta/spell=258920
|
|
immolation_aura_1 = {
|
|
id = 258920,
|
|
duration = function() return talent.felfire_heart.enabled and 8 or 6 end,
|
|
tick_time = 1,
|
|
max_stack = 1
|
|
},
|
|
immolation_aura_2 = {
|
|
id = 427912,
|
|
duration = function() return talent.felfire_heart.enabled and 8 or 6 end,
|
|
tick_time = 1,
|
|
max_stack = 1
|
|
},
|
|
immolation_aura_3 = {
|
|
id = 427913,
|
|
duration = function() return talent.felfire_heart.enabled and 8 or 6 end,
|
|
tick_time = 1,
|
|
max_stack = 1
|
|
},
|
|
immolation_aura_4 = {
|
|
id = 427914,
|
|
duration = function() return talent.felfire_heart.enabled and 8 or 6 end,
|
|
tick_time = 1,
|
|
max_stack = 1
|
|
},
|
|
immolation_aura_5 = {
|
|
id = 427915,
|
|
duration = function() return talent.felfire_heart.enabled and 8 or 6 end,
|
|
tick_time = 1,
|
|
max_stack = 1
|
|
},
|
|
immolation_aura = {
|
|
alias = { "immolation_aura_1", "immolation_aura_2", "immolation_aura_3", "immolation_aura_4", "immolation_aura_5" },
|
|
aliasMode = "longest",
|
|
aliasType = "buff",
|
|
max_stack = 5,
|
|
},
|
|
-- Talent: Incapacitated.
|
|
-- https://wowhead.com/beta/spell=217832
|
|
imprison = {
|
|
id = 217832,
|
|
duration = 60,
|
|
mechanic = "sap",
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Damage done increased by $w1%.
|
|
inertia = {
|
|
id = 427641,
|
|
duration = 5,
|
|
max_stack = 1,
|
|
},
|
|
initiative = {
|
|
id = 391215,
|
|
duration = 5,
|
|
max_stack = 1,
|
|
},
|
|
initiative_tracker = {
|
|
duration = 3600,
|
|
max_stack = 1
|
|
},
|
|
inner_demon = {
|
|
id = 337313,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
copy = 390145
|
|
},
|
|
-- Talent: Movement speed reduced by $s1%.
|
|
-- https://wowhead.com/beta/spell=213405
|
|
master_of_the_glaive = {
|
|
id = 213405,
|
|
duration = 6,
|
|
mechanic = "snare",
|
|
max_stack = 1
|
|
},
|
|
-- Chaos Strike and Blade Dance upgraded to $@spellname201427 and $@spellname210152. Haste increased by $w4%.$?s235893[ Versatility increased by $w5%.][]$?s204909[ Leech increased by $w3%.][]
|
|
-- https://wowhead.com/beta/spell=162264
|
|
metamorphosis = {
|
|
id = 162264,
|
|
duration = function () return 24 + ( pvptalent.demonic_origins.enabled and -15 or 0 ) end,
|
|
max_stack = 1,
|
|
meta = {
|
|
extended_by_demonic = function ()
|
|
return false -- disabled in 8.0: talent.demonic.enabled and ( buff.metamorphosis.up and buff.metamorphosis.duration % 15 > 0 and buff.metamorphosis.duration > ( action.eye_beam.cast + 8 ) )
|
|
end,
|
|
},
|
|
},
|
|
momentum = {
|
|
id = 208628,
|
|
duration = 6,
|
|
max_stack = 1,
|
|
},
|
|
-- Agility increased by $w1%.
|
|
monster_rising = {
|
|
id = 452550,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
-- Stunned.
|
|
-- https://wowhead.com/beta/spell=200166
|
|
metamorphosis_stun = {
|
|
id = 200166,
|
|
duration = 3,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Dazed.
|
|
-- https://wowhead.com/beta/spell=247121
|
|
metamorphosis_daze = {
|
|
id = 247121,
|
|
duration = 3,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
misery_in_defeat = {
|
|
id = 391369,
|
|
duration = 5,
|
|
max_stack = 1,
|
|
},
|
|
-- Talent: Healing effects received reduced by $w1%.
|
|
-- https://wowhead.com/beta/spell=356608
|
|
mortal_dance = {
|
|
id = 356608,
|
|
duration = 6,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Immune to damage and unable to attack. Movement speed increased by $s3%.
|
|
-- https://wowhead.com/beta/spell=196555
|
|
netherwalk = {
|
|
id = 196555,
|
|
duration = 6,
|
|
max_stack = 1
|
|
},
|
|
-- $w3
|
|
pursuit_of_angriness = {
|
|
id = 452404,
|
|
duration = 0.0,
|
|
tick_time = 1.0,
|
|
max_stack = 1,
|
|
},
|
|
ragefire = {
|
|
id = 390192,
|
|
duration = 30,
|
|
max_stack = 1,
|
|
},
|
|
rain_from_above_immune = {
|
|
id = 206803,
|
|
duration = 1,
|
|
tick_time = 1,
|
|
max_stack = 1,
|
|
copy = "rain_from_above_launch"
|
|
},
|
|
rain_from_above = { -- Gliding/floating.
|
|
id = 206804,
|
|
duration = 10,
|
|
max_stack = 1
|
|
},
|
|
reavers_glaive = {
|
|
id = 444686,
|
|
duration = 15,
|
|
max_stack = 2
|
|
},
|
|
restless_hunter = {
|
|
id = 390212,
|
|
duration = 12,
|
|
max_stack = 1
|
|
},
|
|
-- Damage taken from Chaos Strike and Throw Glaive increased by $w1%.
|
|
serrated_glaive = {
|
|
id = 390155,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
-- Taking $w1 Fire damage every $t1 sec.
|
|
set_fire_to_the_pain = {
|
|
id = 453286,
|
|
duration = 6.0,
|
|
tick_time = 1.0,
|
|
},
|
|
-- Movement slowed by $s1%.
|
|
-- https://wowhead.com/beta/spell=204843
|
|
sigil_of_chains = {
|
|
id = 204843,
|
|
duration = function() return 6 + talent.extended_sigils.rank + ( talent.precise_sigils.enabled and 2 or 0 ) end,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Suffering $w2 $@spelldesc395020 damage every $t2 sec.
|
|
-- https://wowhead.com/beta/spell=204598
|
|
sigil_of_flame_dot = {
|
|
id = 204598,
|
|
duration = function() return ( talent.felfire_heart.enabled and 8 or 6 ) + talent.extended_sigils.rank + ( talent.precise_sigils.enabled and 2 or 0 ) end,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Sigil of Flame is active.
|
|
-- https://wowhead.com/beta/spell=389810
|
|
sigil_of_flame = {
|
|
id = 389810,
|
|
duration = function () return talent.quickened_sigils.enabled and 1 or 2 end,
|
|
max_stack = 1,
|
|
copy = 204596
|
|
},
|
|
-- Talent: Disoriented.
|
|
-- https://wowhead.com/beta/spell=207685
|
|
sigil_of_misery_debuff = {
|
|
id = 207685,
|
|
duration = function() return 15 + talent.extended_sigils.rank + ( talent.precise_sigils.enabled and 2 or 0 ) end,
|
|
mechanic = "flee",
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
sigil_of_misery = { -- TODO: Model placement pop.
|
|
id = 207684,
|
|
duration = function () return talent.quickened_sigils.enabled and 1 or 2 end,
|
|
max_stack = 1
|
|
},
|
|
-- Silenced.
|
|
-- https://wowhead.com/beta/spell=204490
|
|
sigil_of_silence_debuff = {
|
|
id = 204490,
|
|
duration = function() return 6 + talent.extended_sigils.rank + ( talent.precise_sigils.enabled and 2 or 0 ) end,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
sigil_of_silence = { -- TODO: Model placement pop.
|
|
id = 202137,
|
|
duration = function () return talent.quickened_sigils.enabled and 1 or 2 end,
|
|
max_stack = 1
|
|
},
|
|
-- Consume to heal for $210042s1% of your maximum health.
|
|
-- https://wowhead.com/beta/spell=203795
|
|
soul_fragment = {
|
|
id = 203795,
|
|
duration = 20,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Suffering $w1 Chaos damage every $t1 sec.
|
|
-- https://wowhead.com/beta/spell=390181
|
|
soulscar = {
|
|
id = 390181,
|
|
duration = 6,
|
|
tick_time = 2,
|
|
max_stack = 1
|
|
},
|
|
-- Can see invisible and stealthed enemies. Can see enemies and treasures through physical barriers.
|
|
-- https://wowhead.com/beta/spell=188501
|
|
spectral_sight = {
|
|
id = 188501,
|
|
duration = 10,
|
|
max_stack = 1
|
|
},
|
|
-- Mastery increased by ${$w1*$mas}.1%. ; Generating $453236s1 Fury every $t2 sec.
|
|
student_of_suffering = {
|
|
id = 453239,
|
|
duration = 8.0,
|
|
max_stack = 1,
|
|
},
|
|
tactical_retreat = {
|
|
id = 389890,
|
|
duration = 8,
|
|
tick_time = 1,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Suffering $w1 $@spelldesc395042 damage every $t1 sec.
|
|
-- https://wowhead.com/beta/spell=345335
|
|
the_hunt_dot = {
|
|
id = 370969,
|
|
duration = function() return set_bonus.tier31_4pc > 0 and 12 or 6 end,
|
|
tick_time = 2,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
copy = 345335
|
|
},
|
|
-- Talent: Marked by the Demon Hunter, converting $?c1[$345422s1%][$345422s2%] of the damage done to healing.
|
|
-- https://wowhead.com/beta/spell=370966
|
|
the_hunt = {
|
|
id = 370966,
|
|
duration = 30,
|
|
max_stack = 1,
|
|
copy = 323802
|
|
},
|
|
the_hunt_root = {
|
|
id = 370970,
|
|
duration = 1.5,
|
|
max_stack = 1,
|
|
copy = 323996
|
|
},
|
|
-- Attack Speed increased by $w1%
|
|
thrill_of_the_fight = {
|
|
id = 442695,
|
|
duration = 20.0,
|
|
max_stack = 1,
|
|
},
|
|
-- Taunted.
|
|
-- https://wowhead.com/beta/spell=185245
|
|
torment = {
|
|
id = 185245,
|
|
duration = 3,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Suffering $w1 Chaos damage every $t1 sec.
|
|
-- https://wowhead.com/beta/spell=258883
|
|
trail_of_ruin = {
|
|
id = 258883,
|
|
duration = 4,
|
|
tick_time = 1,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
unbound_chaos = {
|
|
id = 347462,
|
|
duration = 20,
|
|
max_stack = 1
|
|
},
|
|
vengeful_retreat_movement = {
|
|
duration = 1,
|
|
max_stack = 1,
|
|
generate = function( t )
|
|
if action.vengeful_retreat.lastCast > query_time - 1 then
|
|
t.applied = action.vengeful_retreat.lastCast
|
|
t.duration = 1
|
|
t.expires = action.vengeful_retreat.lastCast + 1
|
|
t.stack = 1
|
|
t.caster = "player"
|
|
return
|
|
end
|
|
|
|
t.applied = 0
|
|
t.duration = 1
|
|
t.expires = 0
|
|
t.stack = 0
|
|
t.caster = "nobody"
|
|
end,
|
|
},
|
|
-- Talent: Movement speed reduced by $s1%.
|
|
-- https://wowhead.com/beta/spell=198813
|
|
vengeful_retreat = {
|
|
id = 198813,
|
|
duration = 3,
|
|
max_stack = 1,
|
|
copy = "vengeful_retreat_snare"
|
|
},
|
|
-- Your next $?a212612[Chaos Strike]?s263642[Fracture][Shear] will deal $442507s1 additional Physical damage.
|
|
warblades_hunger = {
|
|
id = 442503,
|
|
duration = 30.0,
|
|
max_stack = 1,
|
|
},
|
|
|
|
-- Conduit
|
|
exposed_wound = {
|
|
id = 339229,
|
|
duration = 10,
|
|
max_stack = 1,
|
|
},
|
|
|
|
-- PvP Talents
|
|
chaotic_imprint_shadow = {
|
|
id = 356656,
|
|
duration = 20,
|
|
max_stack = 1,
|
|
},
|
|
chaotic_imprint_nature = {
|
|
id = 356660,
|
|
duration = 20,
|
|
max_stack = 1,
|
|
},
|
|
chaotic_imprint_arcane = {
|
|
id = 356658,
|
|
duration = 20,
|
|
max_stack = 1,
|
|
},
|
|
chaotic_imprint_fire = {
|
|
id = 356661,
|
|
duration = 20,
|
|
max_stack = 1,
|
|
},
|
|
chaotic_imprint_frost = {
|
|
id = 356659,
|
|
duration = 20,
|
|
max_stack = 1,
|
|
},
|
|
-- Conduit
|
|
demonic_parole = {
|
|
id = 339051,
|
|
duration = 12,
|
|
max_stack = 1
|
|
},
|
|
glimpse = {
|
|
id = 354610,
|
|
duration = 8,
|
|
max_stack = 1,
|
|
},
|
|
} )
|
|
|
|
|
|
local sigils = setmetatable( {}, {
|
|
__index = function( t, k )
|
|
t[ k ] = 0
|
|
return t[ k ]
|
|
end
|
|
} )
|
|
|
|
spec:RegisterStateFunction( "create_sigil", function( sigil )
|
|
sigils[ sigil ] = query_time + activation_time
|
|
|
|
local effect = sigil == "elysian_dcreee" and "elysian_decree" or ( "sigil_of_" .. sigil )
|
|
applyDebuff( "target", effect )
|
|
debuff[ effect ].applied = debuff[ effect ].applied + 1
|
|
debuff[ effect ].expires = debuff[ effect ].expires + 1
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "soul_fragments", function ()
|
|
return buff.soul_fragments.stack
|
|
end )
|
|
|
|
spec:RegisterStateTable( "fragments", {
|
|
real = 0,
|
|
realTime = 0,
|
|
} )
|
|
|
|
spec:RegisterStateFunction( "queue_fragments", function( num, extraTime )
|
|
fragments.real = fragments.real + num
|
|
fragments.realTime = GetTime() + 1.25 + ( extraTime or 0 )
|
|
end )
|
|
|
|
spec:RegisterStateFunction( "purge_fragments", function()
|
|
fragments.real = 0
|
|
fragments.realTime = 0
|
|
end )
|
|
|
|
local last_darkness = 0
|
|
local last_metamorphosis = 0
|
|
local last_eye_beam = 0
|
|
|
|
spec:RegisterStateExpr( "darkness_applied", function ()
|
|
return max( class.abilities.darkness.lastCast, last_darkness )
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "metamorphosis_applied", function ()
|
|
return max( class.abilities.darkness.lastCast, last_metamorphosis )
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "eye_beam_applied", function ()
|
|
return max( class.abilities.eye_beam.lastCast, last_eye_beam )
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "extended_by_demonic", function ()
|
|
return buff.metamorphosis.up and buff.metamorphosis.extended_by_demonic
|
|
end )
|
|
|
|
local activation_time = function ()
|
|
return talent.quickened_sigils.enabled and 1 or 2
|
|
end
|
|
|
|
spec:RegisterStateExpr( "activation_time", activation_time )
|
|
|
|
local sigil_placed = function ()
|
|
return sigils.flame > query_time
|
|
end
|
|
|
|
spec:RegisterStateExpr( "sigil_placed", sigil_placed )
|
|
|
|
spec:RegisterStateExpr( "meta_cd_multiplier", function ()
|
|
return 1
|
|
end )
|
|
|
|
|
|
local furySpent = 0
|
|
|
|
local FURY = Enum.PowerType.Fury
|
|
local lastFury = -1
|
|
|
|
spec:RegisterUnitEvent( "UNIT_POWER_FREQUENT", "player", nil, function( event, unit, powerType )
|
|
if powerType == "FURY" and state.set_bonus.tier30_2pc > 0 then
|
|
local current = UnitPower( "player", FURY )
|
|
|
|
if current < lastFury - 3 then
|
|
furySpent = ( furySpent + lastFury - current )
|
|
end
|
|
|
|
lastFury = current
|
|
end
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "fury_spent", function ()
|
|
if set_bonus.tier30_2pc == 0 then return 0 end
|
|
return furySpent
|
|
end )
|
|
|
|
local queued_frag_modifier = 0
|
|
local initiative_actual, initiative_virtual = {}, {}
|
|
|
|
local death_events = {
|
|
UNIT_DIED = true,
|
|
UNIT_DESTROYED = true,
|
|
UNIT_DISSIPATES = true,
|
|
PARTY_KILL = true,
|
|
SPELL_INSTAKILL = true,
|
|
}
|
|
|
|
spec:RegisterHook( "COMBAT_LOG_EVENT_UNFILTERED", function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
|
|
if sourceGUID == GUID then
|
|
if subtype == "SPELL_CAST_SUCCESS" then
|
|
-- Fracture: Generate 2 frags.
|
|
if spellID == 263642 then
|
|
queue_fragments( 2 )
|
|
end
|
|
|
|
-- Shear: Generate 1 frag.
|
|
if spellID == 203782 then
|
|
queue_fragments( 1 )
|
|
end
|
|
|
|
if spellID == 198793 and talent.initiative.enabled then
|
|
wipe( initiative_actual )
|
|
end
|
|
|
|
elseif spellID == 203981 and fragments.real > 0 and ( subtype == "SPELL_AURA_APPLIED" or subtype == "SPELL_AURA_APPLIED_DOSE" ) then
|
|
fragments.real = fragments.real - 1
|
|
|
|
elseif state.set_bonus.tier30_2pc > 0 and subtype == "SPELL_AURA_APPLIED" and spellID == 408737 then
|
|
furySpent = max( 0, furySpent - 175 )
|
|
|
|
elseif state.talent.initiative.enabled and subtype == "SPELL_DAMAGE" then
|
|
initiative_actual[ destGUID ] = true
|
|
end
|
|
elseif destGUID == GUID and ( subtype == "SPELL_DAMAGE" or subtype == "SPELL_PERIODIC_DAMAGE" ) then
|
|
initiative_actual[ sourceGUID ] = true
|
|
|
|
elseif death_events[ subtype ] then
|
|
initiative_actual[ destGUID ] = nil
|
|
end
|
|
end, false )
|
|
|
|
spec:RegisterEvent( "PLAYER_REGEN_ENABLED", function()
|
|
wipe( initiative_actual )
|
|
end )
|
|
|
|
spec:RegisterHook( "UNIT_ELIMINATED", function( id )
|
|
initiative_actual[ id ] = nil
|
|
end )
|
|
|
|
-- Gear Sets
|
|
spec:RegisterGear( "tier29", 200345, 200347, 200342, 200344, 200346 )
|
|
spec:RegisterAura( "seething_chaos", {
|
|
id = 394934,
|
|
duration = 6,
|
|
max_stack = 1
|
|
} )
|
|
|
|
-- Tier 30
|
|
spec:RegisterGear( "tier30", 202527, 202525, 202524, 202523, 202522 )
|
|
-- 2 pieces (Havoc) : Every 175 Fury you spend, gain Seething Fury, increasing your Agility by 8% for 6 sec.
|
|
-- TODO: Track Fury spent toward Seething Fury. New expressions: seething_fury_threshold, seething_fury_spent, seething_fury_deficit.
|
|
spec:RegisterAura( "seething_fury", {
|
|
id = 408737,
|
|
duration = 6,
|
|
max_stack = 1
|
|
} )
|
|
-- 4 pieces (Havoc) : Each time you gain Seething Fury, gain 15 Fury and the damage of your next Eye Beam is increased by 15%, stacking 5 times.
|
|
spec:RegisterAura( "seething_potential", {
|
|
id = 408754,
|
|
duration = 60,
|
|
max_stack = 5
|
|
} )
|
|
|
|
spec:RegisterGear( "tier31", 207261, 207262, 207263, 207264, 207266, 217228, 217230, 217226, 217227, 217229 )
|
|
-- (2) Blade Dance automatically triggers Throw Glaive on your primary target for $s3% damage and each slash has a $s2% chance to Throw Glaive an enemy for $s1% damage.
|
|
-- (4) Throw Glaive reduces the remaining cooldown of The Hunt by ${$s1/1000}.1 sec, and The Hunt's damage over time effect lasts ${$s2/1000} sec longer.
|
|
|
|
|
|
local sigil_types = {
|
|
chains = "sigil_of_chains" ,
|
|
flame = "sigil_of_flame" ,
|
|
misery = "sigil_of_misery" ,
|
|
silence = "sigil_of_silence",
|
|
spite = "sigil_of_spite",
|
|
elysian_decree = "elysian_decree"
|
|
}
|
|
|
|
spec:RegisterHook( "reset_precast", function ()
|
|
last_metamorphosis = nil
|
|
last_infernal_strike = nil
|
|
|
|
wipe( initiative_virtual )
|
|
active_dot.initiative_tracker = 0
|
|
|
|
for k, v in pairs( initiative_actual ) do
|
|
initiative_virtual[ k ] = v
|
|
|
|
if k == target.unit then
|
|
applyDebuff( "target", "initiative_tracker" )
|
|
else
|
|
active_dot.initiative_tracker = active_dot.initiative_tracker + 1
|
|
end
|
|
end
|
|
|
|
-- Unbound Chaos effect remains even after the buff falls off, so we'll reapply the buff whenever Immo Aura has been used more recently than Fel Rush.
|
|
if talent.unbound_chaos.enabled and buff.unbound_chaos.remains < gcd.max and action.immolation_aura.lastCast > action.fel_rush.lastCast then
|
|
applyBuff( "unbound_chaos", nil, gcd.max )
|
|
end
|
|
|
|
for s, a in ipairs( sigil_types ) do
|
|
local activation = ( action[ a ].lastCast or 0 ) + ( talent.quickened_sigils.enabled and 2 or 1 )
|
|
if activation > now then sigils[ s ] = activation
|
|
else sigils[ s ] = 0 end
|
|
end
|
|
|
|
last_darkness = 0
|
|
last_metamorphosis = 0
|
|
last_eye_beam = 0
|
|
|
|
local rps = 0
|
|
|
|
if equipped.convergence_of_fates then
|
|
rps = rps + ( 3 / ( 60 / 4.35 ) )
|
|
end
|
|
|
|
if equipped.delusions_of_grandeur then
|
|
-- From SimC model, 1/13/2018.
|
|
local fps = 10.2 + ( talent.demonic.enabled and 1.2 or 0 )
|
|
|
|
-- SimC uses base haste, we'll use current since we recalc each time.
|
|
fps = fps / haste
|
|
|
|
-- Chaos Strike accounts for most Fury expenditure.
|
|
fps = fps + ( ( fps * 0.9 ) * 0.5 * ( 40 / 100 ) )
|
|
|
|
rps = rps + ( fps / 30 ) * ( 1 )
|
|
end
|
|
|
|
meta_cd_multiplier = 1 / ( 1 + rps )
|
|
|
|
if IsActiveSpell( 442294 ) then applyBuff( "reavers_glaive" ) end
|
|
|
|
fury_spent = nil
|
|
end )
|
|
|
|
|
|
spec:RegisterHook( "runHandler", function( action )
|
|
local ability = class.abilities[ action ]
|
|
|
|
if ability.startsCombat and not debuff.initiative_tracker.up then
|
|
applyBuff( "initiative" )
|
|
applyDebuff( "target", "initiative_tracker" )
|
|
end
|
|
end )
|
|
|
|
|
|
spec:RegisterHook( "advance_end", function( time )
|
|
if query_time - time < sigils.flame and query_time >= sigils.flame then
|
|
-- SoF should've applied.
|
|
applyDebuff( "target", "sigil_of_flame", debuff.sigil_of_flame.duration - ( query_time - sigils.flame ) )
|
|
active_dot.sigil_of_flame = active_enemies
|
|
sigils.flame = 0
|
|
end
|
|
end )
|
|
|
|
|
|
spec:RegisterHook( "spend", function( amt, resource )
|
|
if set_bonus.tier30_2pc == 0 or amt < 0 or resource ~= "fury" then return end
|
|
|
|
fury_spent = fury_spent + amt
|
|
if fury_spent > 175 then
|
|
fury_spent = fury_spent - 175
|
|
applyBuff( "seething_fury" )
|
|
if set_bonus.tier30_4pc > 0 then
|
|
gain( 15, "fury" )
|
|
applyBuff( "seething_potential" )
|
|
end
|
|
end
|
|
end )
|
|
|
|
|
|
|
|
|
|
spec:RegisterGear( "tier19", 138375, 138376, 138377, 138378, 138379, 138380 )
|
|
spec:RegisterGear( "tier20", 147130, 147132, 147128, 147127, 147129, 147131 )
|
|
spec:RegisterGear( "tier21", 152121, 152123, 152119, 152118, 152120, 152122 )
|
|
spec:RegisterAura( "havoc_t21_4pc", {
|
|
id = 252165,
|
|
duration = 8
|
|
} )
|
|
|
|
spec:RegisterGear( "class", 139715, 139716, 139717, 139718, 139719, 139720, 139721, 139722 )
|
|
|
|
spec:RegisterGear( "convergence_of_fates", 140806 )
|
|
|
|
spec:RegisterGear( "achor_the_eternal_hunger", 137014 )
|
|
spec:RegisterGear( "anger_of_the_halfgiants", 137038 )
|
|
spec:RegisterGear( "cinidaria_the_symbiote", 133976 )
|
|
spec:RegisterGear( "delusions_of_grandeur", 144279 )
|
|
spec:RegisterGear( "kiljaedens_burning_wish", 144259 )
|
|
spec:RegisterGear( "loramus_thalipedes_sacrifice", 137022 )
|
|
spec:RegisterGear( "moarg_bionic_stabilizers", 137090 )
|
|
spec:RegisterGear( "prydaz_xavarics_magnum_opus", 132444 )
|
|
spec:RegisterGear( "raddons_cascading_eyes", 137061 )
|
|
spec:RegisterGear( "sephuzs_secret", 132452 )
|
|
spec:RegisterGear( "the_sentinels_eternal_refuge", 146669 )
|
|
|
|
spec:RegisterGear( "soul_of_the_slayer", 151639 )
|
|
spec:RegisterGear( "chaos_theory", 151798 )
|
|
spec:RegisterGear( "oblivions_embrace", 151799 )
|
|
|
|
|
|
do
|
|
local wasWarned = false
|
|
|
|
spec:RegisterEvent( "PLAYER_REGEN_DISABLED", function ()
|
|
if state.talent.demon_blades.enabled and not state.settings.demon_blades_acknowledged and not wasWarned then
|
|
Hekili:Notify( "|cFFFF0000WARNING!|r Demon Blades cannot be forecasted.\nSee /hekili > Havoc for more information." )
|
|
wasWarned = true
|
|
end
|
|
end )
|
|
end
|
|
|
|
-- SimC documentation reflects that there are still the following expressions, which appear unused:
|
|
-- greater_soul_fragments, lesser_soul_fragments, blade_dance_worth_using, death_sweep_worth_using
|
|
-- They are not implemented becuase that documentation is from mid-2016.
|
|
|
|
|
|
-- Abilities
|
|
spec:RegisterAbilities( {
|
|
annihilation = {
|
|
id = 201427,
|
|
known = 162794,
|
|
flash = { 201427, 162794 },
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = function () return 40 - buff.thirsting_blades.stack end,
|
|
spendType = "fury",
|
|
|
|
startsCombat = true,
|
|
texture = 1303275,
|
|
|
|
bind = "chaos_strike",
|
|
buff = "metamorphosis",
|
|
|
|
handler = function ()
|
|
removeBuff( "thirsting_blades" )
|
|
removeBuff( "inner_demon" )
|
|
if buff.rending_strike.up then applyDebuff( "target", "rending_strike" ) end
|
|
if azerite.thirsting_blades.enabled then applyBuff( "thirsting_blades", nil, 0 ) end
|
|
|
|
if buff.chaotic_blades.up then gain( 20, "fury" ) end -- legendary
|
|
end,
|
|
},
|
|
|
|
-- Strike $?a206416[your primary target for $<firstbloodDmg> Chaos damage and ][]all nearby enemies for $<baseDmg> Physical damage$?s320398[, and increase your chance to dodge by $193311s1% for $193311d.][. Deals reduced damage beyond $199552s1 targets.]
|
|
blade_dance = {
|
|
id = 188499,
|
|
flash = { 188499, 210152 },
|
|
cast = 0,
|
|
cooldown = function() return ( level > 21 and 10 or 15 ) * haste end,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
spend = 35,
|
|
spendType = "fury",
|
|
|
|
startsCombat = true,
|
|
|
|
bind = "death_sweep",
|
|
nobuff = "metamorphosis",
|
|
|
|
handler = function ()
|
|
applyBuff( "blade_dance" )
|
|
removeBuff( "restless_hunter" )
|
|
removeBuff( "glaive_flurry" )
|
|
setCooldown( "death_sweep", action.blade_dance.cooldown )
|
|
if talent.chaos_theory.enabled then applyBuff( "chaos_theory" ) end
|
|
if talent.cycle_of_hatred.enabled and cooldown.eye_beam.remains > 0 then reduceCooldown( "eye_beam", 0.5 * talent.cycle_of_hatred.rank ) end
|
|
if set_bonus.tier31_2pc > 0 then spec.abilities.throw_glaive.handler() end
|
|
if pvptalent.mortal_dance.enabled or talent.mortal_dance.enabled then applyDebuff( "target", "mortal_dance" ) end
|
|
end,
|
|
|
|
copy = "blade_dance1"
|
|
},
|
|
|
|
-- Increases your chance to dodge by $212800s2% and reduces all damage taken by $212800s3% for $212800d.
|
|
blur = {
|
|
id = 198589,
|
|
cast = 0,
|
|
cooldown = function () return 60 + ( conduit.fel_defender.mod * 0.001 ) end,
|
|
gcd = "off",
|
|
school = "physical",
|
|
|
|
startsCombat = false,
|
|
|
|
toggle = "defensives",
|
|
|
|
handler = function ()
|
|
applyBuff( "blur" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Unleash an eruption of fel energy, dealing $s2 Chaos damage and stunning all nearby enemies for $d.$?s320412[ Each enemy stunned by Chaos Nova has a $s3% chance to generate a Lesser Soul Fragment.][]
|
|
chaos_nova = {
|
|
id = 179057,
|
|
cast = 0,
|
|
cooldown = 45,
|
|
gcd = "spell",
|
|
school = "chromatic",
|
|
|
|
spend = 25,
|
|
spendType = "fury",
|
|
|
|
talent = "chaos_nova",
|
|
startsCombat = true,
|
|
|
|
toggle = "cooldowns",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "chaos_nova" )
|
|
end,
|
|
},
|
|
|
|
-- Slice your target for ${$222031s1+$199547s1} Chaos damage. Chaos Strike has a ${$min($197125h,100)}% chance to refund $193840s1 Fury.
|
|
chaos_strike = {
|
|
id = 162794,
|
|
flash = { 162794, 201427 },
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "chaos",
|
|
|
|
spend = function () return 40 - buff.thirsting_blades.stack end,
|
|
spendType = "fury",
|
|
|
|
startsCombat = true,
|
|
|
|
bind = "annihilation",
|
|
nobuff = "metamorphosis",
|
|
|
|
cycle = function () return ( talent.burning_wound.enabled or legendary.burning_wound.enabled ) and "burning_wound" or nil end,
|
|
|
|
handler = function ()
|
|
removeBuff( "thirsting_blades" )
|
|
removeBuff( "inner_demon" )
|
|
if buff.rending_strike.up then
|
|
applyDebuff( "target", "reavers_mark" )
|
|
removeBuff( "rending_strike" )
|
|
end
|
|
if azerite.thirsting_blades.enabled then applyBuff( "thirsting_blades", nil, 0 ) end
|
|
if talent.burning_wound.enabled then applyDebuff( "target", "burning_wound" ) end
|
|
if buff.chaos_theory.up then
|
|
gain( 20, "fury" )
|
|
removeBuff( "chaos_theory" )
|
|
end
|
|
removeBuff( "chaotic_blades" )
|
|
if talent.cycle_of_hatred.enabled and cooldown.eye_beam.remains > 0 then reduceCooldown( "eye_beam", 0.5 * talent.cycle_of_hatred.rank ) end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Consume $m1 beneficial Magic effect removing it from the target$?s320313[ and granting you $s2 Fury][].
|
|
consume_magic = {
|
|
id = 278326,
|
|
cast = 0,
|
|
cooldown = 10,
|
|
gcd = "spell",
|
|
school = "chromatic",
|
|
|
|
startsCombat = false,
|
|
talent = "consume_magic",
|
|
|
|
toggle = "interrupts",
|
|
|
|
usable = function () return buff.dispellable_magic.up end,
|
|
handler = function ()
|
|
removeBuff( "dispellable_magic" )
|
|
if talent.swallowed_anger.enabled then gain( 20, "fury" ) end
|
|
end,
|
|
},
|
|
|
|
-- Summons darkness around you in a$?a357419[ 12 yd][n 8 yd] radius, granting friendly targets a $209426s2% chance to avoid all damage from an attack. Lasts $d.; Chance to avoid damage increased by $s3% when not in a raid.
|
|
darkness = {
|
|
id = 196718,
|
|
cast = 0,
|
|
cooldown = 300,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
talent = "darkness",
|
|
startsCombat = false,
|
|
|
|
toggle = "defensives",
|
|
|
|
handler = function ()
|
|
last_darkness = query_time
|
|
applyBuff( "darkness" )
|
|
end,
|
|
},
|
|
|
|
|
|
death_sweep = {
|
|
id = 210152,
|
|
known = 188499,
|
|
flash = { 210152, 188499 },
|
|
cast = 0,
|
|
cooldown = function() return 9 * haste end,
|
|
gcd = "spell",
|
|
|
|
spend = 35,
|
|
spendType = "fury",
|
|
|
|
startsCombat = true,
|
|
texture = 1309099,
|
|
|
|
bind = "blade_dance",
|
|
buff = "metamorphosis",
|
|
|
|
handler = function ()
|
|
applyBuff( "death_sweep" )
|
|
removeBuff( "restless_hunter" )
|
|
setCooldown( "blade_dance", action.death_sweep.cooldown )
|
|
if buff.rending_strike.up then
|
|
applyDebuff( "target", "reavers_mark" )
|
|
removeBuff( "rending_strike" )
|
|
end
|
|
|
|
if talent.cycle_of_hatred.enabled and cooldown.eye_beam.remains > 0 then reduceCooldown( "eye_beam", 0.5 * talent.cycle_of_hatred.rank ) end
|
|
if set_bonus.tier31_2pc > 0 then spec.abilities.throw_glaive.handler() end
|
|
if pvptalent.mortal_dance.enabled or talent.mortal_dance.enabled then
|
|
applyDebuff( "target", "mortal_dance" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- Quickly attack for $s2 Physical damage. |cFFFFFFFFGenerates $?a258876[${$m3+$258876s3} to ${$M3+$258876s4}][$m3 to $M3] Fury.|r
|
|
demons_bite = {
|
|
id = 162243,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
spend = function () return talent.insatiable_hunger.enabled and -25 or -20 end,
|
|
spendType = "fury",
|
|
|
|
startsCombat = true,
|
|
|
|
notalent = "demon_blades",
|
|
cycle = function () return ( talent.burning_wound.enabled or legendary.burning_wound.enabled ) and "burning_wound" or nil end,
|
|
|
|
handler = function ()
|
|
if talent.burning_wound.enabled then applyDebuff( "target", "burning_wound" ) end
|
|
end,
|
|
},
|
|
|
|
-- Interrupts the enemy's spellcasting and locks them from that school of magic for $d.|cFFFFFFFF$?s183782[ Generates $218903s1 Fury on a successful interrupt.][]|r
|
|
disrupt = {
|
|
id = 183752,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
gcd = "off",
|
|
school = "chromatic",
|
|
|
|
startsCombat = true,
|
|
|
|
toggle = "interrupts",
|
|
|
|
debuff = "casting",
|
|
readyTime = state.timeToInterrupt,
|
|
|
|
handler = function ()
|
|
interrupt()
|
|
if talent.disrupting_fury.enabled then gain( 30, "fury" ) end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Slash all enemies in front of you for $s1 Chaos damage, and increase the damage your Chaos Strike and Blade Dance deal to them by $320338s1% for $320338d. Deals reduced damage beyond $s2 targets.
|
|
essence_break = {
|
|
id = 258860,
|
|
cast = 0,
|
|
cooldown = 40,
|
|
gcd = "spell",
|
|
school = "chromatic",
|
|
|
|
talent = "essence_break",
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "essence_break" )
|
|
active_dot.essence_break = max( 1, active_enemies )
|
|
end,
|
|
|
|
copy = "dark_slash"
|
|
},
|
|
|
|
-- Blasts all enemies in front of you,$?s320415[ dealing guaranteed critical strikes][] for up to $<dmg> Chaos damage over $d. Deals reduced damage beyond $s5 targets.$?s343311[; When Eye Beam finishes fully channeling, your Haste is increased by an additional $343312s1% for $343312d.][]
|
|
eye_beam = {
|
|
id = 198013,
|
|
cast = function () return ( talent.blind_fury.enabled and 3 or 2 ) * haste end,
|
|
channeled = true,
|
|
cooldown = 40,
|
|
gcd = "spell",
|
|
school = "chromatic",
|
|
|
|
spend = 30,
|
|
spendType = "fury",
|
|
|
|
talent = "eye_beam",
|
|
startsCombat = true,
|
|
|
|
start = function ()
|
|
last_eye_beam = query_time
|
|
|
|
applyBuff( "eye_beam" )
|
|
removeBuff( "seething_potential" )
|
|
|
|
if talent.demonic.enabled then
|
|
if buff.metamorphosis.up then
|
|
buff.metamorphosis.duration = buff.metamorphosis.remains + 8
|
|
buff.metamorphosis.expires = buff.metamorphosis.expires + 8
|
|
else
|
|
applyBuff( "metamorphosis", action.eye_beam.cast + 8 )
|
|
buff.metamorphosis.duration = action.eye_beam.cast + 8
|
|
stat.haste = stat.haste + 25
|
|
|
|
if talent.inner_demon.enabled then
|
|
applyBuff( "inner_demon" )
|
|
end
|
|
end
|
|
end
|
|
|
|
if pvptalent.isolated_prey.enabled and active_enemies == 1 then
|
|
applyDebuff( "target", "isolated_prey" )
|
|
end
|
|
|
|
-- This is likely repeated per tick but it's not worth the CPU overhead to model each tick.
|
|
if legendary.agony_gaze.enabled and debuff.sinful_brand.up then
|
|
debuff.sinful_brand.expires = debuff.sinful_brand.expires + 0.75
|
|
end
|
|
end,
|
|
|
|
finish = function ()
|
|
if talent.furious_gaze.enabled then applyBuff( "furious_gaze" ) end
|
|
end,
|
|
|
|
copy = { "abyssal_gaze", 452497 }
|
|
},
|
|
|
|
-- Talent: Unleash a torrent of Fel energy over $d, inflicting ${(($d/$t1)+1)*$258926s1} Chaos damage to all enemies within $258926A1 yds. Deals reduced damage beyond $258926s2 targets.
|
|
fel_barrage = {
|
|
id = 258925,
|
|
cast = 3,
|
|
channeled = true,
|
|
cooldown = 90,
|
|
gcd = "spell",
|
|
school = "chromatic",
|
|
|
|
spend = 10,
|
|
spendType = "fury",
|
|
|
|
talent = "fel_barrage",
|
|
startsCombat = false,
|
|
|
|
toggle = "cooldowns",
|
|
|
|
handler = function ()
|
|
applyBuff( "fel_barrage" )
|
|
end,
|
|
},
|
|
|
|
-- Impales the target for $s1 Chaos damage and stuns them for $d.
|
|
fel_eruption = {
|
|
id = 211881,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
school = "chromatic",
|
|
|
|
spend = 10,
|
|
spendType = "fury",
|
|
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "fel_eruption" )
|
|
end,
|
|
},
|
|
|
|
|
|
fel_lance = {
|
|
id = 206966,
|
|
cast = 1,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
pvptalent = "rain_from_above",
|
|
buff = "rain_from_above",
|
|
|
|
startsCombat = true,
|
|
},
|
|
|
|
-- Rush forward, incinerating anything in your path for $192611s1 Chaos damage.
|
|
fel_rush = {
|
|
id = 195072,
|
|
cast = 0,
|
|
charges = function() return talent.blazing_path.enabled and 2 or nil end,
|
|
cooldown = function () return ( legendary.erratic_fel_core.enabled and 7 or 10 ) * ( 1 - 0.1 * talent.erratic_felheart.rank ) end,
|
|
recharge = function () return talent.blazing_path.enabled and ( ( legendary.erratic_fel_core.enabled and 7 or 10 ) * ( 1 - 0.1 * talent.erratic_felheart.rank ) ) or nil end,
|
|
gcd = "off",
|
|
icd = 0.5,
|
|
school = "physical",
|
|
|
|
startsCombat = true,
|
|
nodebuff = "rooted",
|
|
|
|
readyTime = function ()
|
|
if prev[1].fel_rush then return 3600 end
|
|
if ( settings.fel_rush_charges or 1 ) == 0 then return end
|
|
return ( ( 1 + ( settings.fel_rush_charges or 1 ) ) - cooldown.fel_rush.charges_fractional ) * cooldown.fel_rush.recharge
|
|
end,
|
|
|
|
handler = function ()
|
|
setDistance( 5 )
|
|
setCooldown( "global_cooldown", 0.25 )
|
|
if buff.unbound_chaos.up then
|
|
removeBuff( "unbound_chaos" )
|
|
if talent.inertia.enabled then applyBuff( "inertia" ) end
|
|
end
|
|
if cooldown.vengeful_retreat.remains < 1 then setCooldown( "vengeful_retreat", 1 ) end
|
|
if talent.momentum.enabled then applyBuff( "momentum" ) end
|
|
if active_enemies == 1 and talent.isolated_prey.enabled then gain( 25, "fury" ) end
|
|
if conduit.felfire_haste.enabled then applyBuff( "felfire_haste" ) end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Charge to your target and deal $213243sw2 $@spelldesc395020 damage. $?s203513[Shear has a chance to reset the cooldown of Felblade. |cFFFFFFFFGenerates $213243s3 Fury.|r]?a203555[Demon Blades has a chance to reset the cooldown of Felblade. |cFFFFFFFFGenerates $213243s3 Fury.|r][Demon's Bite has a chance to reset the cooldown of Felblade. |cFFFFFFFFGenerates $213243s3 Fury.|r]
|
|
felblade = {
|
|
id = 232893,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
hasteCD = true,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
spend = -40,
|
|
spendType = "fury",
|
|
|
|
talent = "felblade",
|
|
startsCombat = true,
|
|
nodebuff = "rooted",
|
|
|
|
handler = function ()
|
|
setDistance( 5 )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Launch two demonic glaives in a whirlwind of energy, causing ${14*$342857s1} Chaos damage over $d to all nearby enemies. Deals reduced damage beyond $s2 targets.
|
|
glaive_tempest = {
|
|
id = 342817,
|
|
cast = 0,
|
|
cooldown = 25,
|
|
gcd = "spell",
|
|
school = "magic",
|
|
|
|
spend = 30,
|
|
spendType = "fury",
|
|
|
|
talent = "glaive_tempest",
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
if talent.cycle_of_hatred.enabled and cooldown.eye_beam.remains > 0 then reduceCooldown( "eye_beam", 0.5 * talent.cycle_of_hatred.rank ) end
|
|
end,
|
|
},
|
|
|
|
-- Engulf yourself in flames, $?a320364 [instantly causing $258921s1 $@spelldesc395020 damage to enemies within $258921A1 yards and ][]radiating ${$258922s1*$d} $@spelldesc395020 damage over $d.$?s320374[ |cFFFFFFFFGenerates $<havocTalentFury> Fury over $d.|r][]$?(s212612 & !s320374)[ |cFFFFFFFFGenerates $<havocFury> Fury.|r][]$?s212613[ |cFFFFFFFFGenerates $<vengeFury> Fury over $d.|r][]
|
|
immolation_aura = {
|
|
id = 258920,
|
|
cast = 0,
|
|
cooldown = function() return 30 * haste end,
|
|
charges = function()
|
|
if talent.a_fire_inside.enabled then return 2 end
|
|
end,
|
|
recharge = function()
|
|
if talent.a_fire_inside.enabled then return 30 * haste end
|
|
end,
|
|
gcd = "spell",
|
|
school = "fire",
|
|
|
|
spend = -20,
|
|
spendType = "fury",
|
|
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
applyBuff( "immolation_aura" )
|
|
if talent.unbound_chaos.enabled then applyBuff( "unbound_chaos" ) end
|
|
if talent.ragefire.enabled then applyBuff( "ragefire" ) end
|
|
end,
|
|
|
|
copy = { 427917, "consuming_fire", 452487, 456640 },
|
|
},
|
|
|
|
-- Talent: Imprisons a demon, beast, or humanoid, incapacitating them for $d. Damage will cancel the effect. Limit 1.
|
|
imprison = {
|
|
id = 217832,
|
|
cast = 0,
|
|
gcd = "spell",
|
|
school = "shadow",
|
|
|
|
talent = "imprison",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "imprison" )
|
|
end,
|
|
},
|
|
|
|
-- Leap into the air and land with explosive force, dealing $200166s2 Chaos damage to enemies within 8 yds, and stunning them for $200166d. Players are Dazed for $247121d instead. Upon landing, you are transformed into a hellish demon for $162264d, $?s320645[immediately resetting the cooldown of your Eye Beam and Blade Dance abilities, ][]greatly empowering your Chaos Strike and Blade Dance abilities and gaining $162264s4% Haste$?(s235893&s204909)[, $162264s5% Versatility, and $162264s3% Leech]?(s235893&!s204909[ and $162264s5% Versatility]?(s204909&!s235893)[ and $162264s3% Leech][].
|
|
metamorphosis = {
|
|
id = 191427,
|
|
cast = 0,
|
|
cooldown = function () return ( 180 - ( talent.rush_of_chaos.enabled and 30 or 0 ) ) * ( essence.vision_of_perfection.enabled and 0.87 or 1 ) - ( pvptalent.demonic_origins.enabled and 120 or 0 ) end,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
startsCombat = false,
|
|
|
|
toggle = "cooldowns",
|
|
|
|
handler = function ()
|
|
applyBuff( "metamorphosis" )
|
|
last_metamorphosis = query_time
|
|
|
|
setDistance( 5 )
|
|
|
|
if IsSpellKnownOrOverridesKnown( 317009 ) then
|
|
applyDebuff( "target", "sinful_brand" )
|
|
active_dot.sinful_brand = active_enemies
|
|
end
|
|
|
|
if level > 19 then stat.haste = stat.haste + 25 end
|
|
|
|
if azerite.chaotic_transformation.enabled or talent.chaotic_transformation.enabled then
|
|
setCooldown( "eye_beam", 0 )
|
|
setCooldown( "blade_dance", 0 )
|
|
setCooldown( "death_sweep", 0 )
|
|
end
|
|
end,
|
|
|
|
meta = {
|
|
adjusted_remains = function ()
|
|
--[[ if level < 116 and ( equipped.delusions_of_grandeur or equipped.convergeance_of_fates ) then
|
|
return cooldown.metamorphosis.remains * meta_cd_multiplier
|
|
end ]]
|
|
|
|
return cooldown.metamorphosis.remains
|
|
end
|
|
}
|
|
},
|
|
|
|
-- Talent: Slip into the nether, increasing movement speed by $s3% and becoming immune to damage, but unable to attack. Lasts $d.
|
|
netherwalk = {
|
|
id = 196555,
|
|
cast = 0,
|
|
cooldown = 180,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
talent = "netherwalk",
|
|
startsCombat = false,
|
|
|
|
toggle = "interrupts",
|
|
|
|
handler = function ()
|
|
applyBuff( "netherwalk" )
|
|
setCooldown( "global_cooldown", buff.netherwalk.remains )
|
|
end,
|
|
},
|
|
|
|
|
|
rain_from_above = {
|
|
id = 206803,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
|
|
pvptalent = "rain_from_above",
|
|
|
|
startsCombat = false,
|
|
texture = 1380371,
|
|
|
|
handler = function ()
|
|
applyBuff( "rain_from_above" )
|
|
end,
|
|
},
|
|
|
|
|
|
reverse_magic = {
|
|
id = 205604,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
|
|
-- toggle = "cooldowns",
|
|
pvptalent = "reverse_magic",
|
|
|
|
startsCombat = false,
|
|
texture = 1380372,
|
|
|
|
debuff = "reversible_magic",
|
|
|
|
handler = function ()
|
|
if debuff.reversible_magic.up then removeDebuff( "player", "reversible_magic" ) end
|
|
end,
|
|
},
|
|
|
|
|
|
-- Talent: Place a Sigil of Flame at your location that activates after $d. Deals $204598s1 Fire damage, and an additional $204598o3 Fire damage over $204598d, to all enemies affected by the sigil. |CFFffffffGenerates $389787s1 Fury.|R
|
|
sigil_of_flame = {
|
|
id = function ()
|
|
if talent.precise_sigils.enabled then return 389810 end
|
|
if talent.concentrated_sigils.enabled then return 204513 end -- TODO: Remove?
|
|
return 204596
|
|
end,
|
|
known = 204596,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
spend = -30,
|
|
spendType = "fury",
|
|
|
|
startsCombat = false,
|
|
|
|
sigil_placed = function() return sigil_placed end,
|
|
|
|
handler = function ()
|
|
create_sigil( "flame" )
|
|
end,
|
|
|
|
copy = { 204596, 204513, 389810, "sigil_of_doom", 452490 }
|
|
},
|
|
|
|
-- Talent: Place a Sigil of Misery at your location that activates after $d. Causes all enemies affected by the sigil to cower in fear. Targets are disoriented for $207685d.
|
|
sigil_of_misery = {
|
|
id = function ()
|
|
if talent.precise_sigils.enabled then return 389813 end
|
|
if talent.concentrated_sigils.enabled then return 202140 end
|
|
return 207684
|
|
end,
|
|
known = 207684,
|
|
cast = 0,
|
|
cooldown = function () return 120 * ( pvptalent.sigil_mastery.enabled and 0.75 or 1 ) end,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
talent = "sigil_of_misery",
|
|
startsCombat = false,
|
|
|
|
toggle = function()
|
|
if talent.misery_in_defeat.enabled then return "cooldowns" end
|
|
return "interrupts"
|
|
end,
|
|
|
|
handler = function ()
|
|
create_sigil( "misery" )
|
|
end,
|
|
|
|
copy = { 389813, 207684, 202140 }
|
|
},
|
|
|
|
-- Place a demonic sigil at the target location that activates after $d.; Detonates to deal $389860s1 Chaos damage and shatter up to $s3 Lesser Soul Fragments from
|
|
sigil_of_spite = {
|
|
id = 390163,
|
|
cast = 0.0,
|
|
cooldown = function() return 60 * ( pvptalent.sigil_mastery.enabled and 0.75 or 1 ) end,
|
|
gcd = "spell",
|
|
|
|
talent = "sigil_of_spite",
|
|
startsCombat = false,
|
|
|
|
sigil_placed = function() return sigil_placed end,
|
|
|
|
handler = function ()
|
|
create_sigil( "spite" )
|
|
end,
|
|
},
|
|
|
|
-- Allows you to see enemies and treasures through physical barriers, as well as enemies that are stealthed and invisible. Lasts $d. Attacking or taking damage disrupts the sight.
|
|
spectral_sight = {
|
|
id = 188501,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
applyBuff( "spectral_sight" )
|
|
end,
|
|
},
|
|
|
|
-- Talent / Covenant (Night Fae): Charge to your target, striking them for $370966s1 $@spelldesc395042 damage, rooting them in place for $370970d and inflicting $370969o1 $@spelldesc395042 damage over $370969d to up to $370967s2 enemies in your path. The pursuit invigorates your soul, healing you for $?c1[$370968s1%][$370968s2%] of the damage you deal to your Hunt target for $370966d.
|
|
the_hunt = {
|
|
id = function() return talent.the_hunt.enabled and 370965 or 323639 end,
|
|
cast = 1,
|
|
cooldown = function() return talent.the_hunt.enabled and 90 or 180 end,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
startsCombat = true,
|
|
toggle = "cooldowns",
|
|
nodebuff = "rooted",
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "the_hunt" )
|
|
applyDebuff( "target", "the_hunt_dot" )
|
|
setDistance( 5 )
|
|
|
|
if talent.momentum.enabled then applyBuff( "momentum" ) end
|
|
|
|
if legendary.blazing_slaughter.enabled then
|
|
applyBuff( "immolation_aura" )
|
|
applyBuff( "blazing_slaughter" )
|
|
end
|
|
end,
|
|
|
|
copy = { 370965, 323639 }
|
|
},
|
|
|
|
-- Throw a demonic glaive at the target, dealing $337819s1 Physical damage. The glaive can ricochet to $?$s320386[${$337819x1-1} additional enemies][an additional enemy] within 10 yards.
|
|
throw_glaive = {
|
|
id = 185123,
|
|
known = 185123,
|
|
cast = 0,
|
|
charges = function () return talent.champion_of_the_glaive.enabled and 2 or nil end,
|
|
cooldown = 9,
|
|
recharge = function () return talent.champion_of_the_glaive.enabled and 9 or nil end,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
spend = function() return talent.furious_throws.enabled and 25 or 0 end,
|
|
spendType = "fury",
|
|
|
|
startsCombat = true,
|
|
|
|
readyTime = function ()
|
|
if ( settings.throw_glaive_charges or 1 ) == 0 then return end
|
|
return ( ( 1 + ( settings.throw_glaive_charges or 1 ) ) - cooldown.throw_glaive.charges_fractional ) * cooldown.throw_glaive.recharge
|
|
end,
|
|
|
|
handler = function ()
|
|
if buff.reavers_glaive.up then
|
|
-- ?
|
|
removeBuff( "reavers_glaive" )
|
|
end
|
|
if talent.burning_wound.enabled then applyDebuff( "target", "burning_wound" ) end
|
|
if talent.champion_of_the_glaive.enabled then applyDebuff( "target", "master_of_the_glaive" ) end
|
|
if talent.serrated_glaive.enabled then applyDebuff( "target", "serrated_glaive" ) end
|
|
if talent.soulscar.enabled then applyDebuff( "target", "soulscar" ) end
|
|
if set_bonus.tier31_4pc > 0 then reduceCooldown( "the_hunt", 2 ) end
|
|
end,
|
|
},
|
|
|
|
-- Taunts the target to attack you.
|
|
torment = {
|
|
id = 185245,
|
|
cast = 0,
|
|
cooldown = 8,
|
|
gcd = "off",
|
|
school = "shadow",
|
|
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
applyBuff( "torment" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Remove all snares and vault away. Nearby enemies take $198813s2 Physical damage$?s320635[ and have their movement speed reduced by $198813s1% for $198813d][].$?a203551[ |cFFFFFFFFGenerates ${($203650s1/5)*$203650d} Fury over $203650d if you damage an enemy.|r][]
|
|
vengeful_retreat = {
|
|
id = 198793,
|
|
cast = 0,
|
|
cooldown = function () return talent.tactical_retreat.enabled and 20 or 25 end,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
nodebuff = "rooted",
|
|
|
|
readyTime = function ()
|
|
if settings.retreat_and_return == "fel_rush" or settings.retreat_and_return == "either" and not talent.felblade.enabled then
|
|
return max( 0, cooldown.fel_rush.remains - 1 )
|
|
end
|
|
if settings.retreat_and_return == "felblade" and talent.felblade.enabled then
|
|
return max( 0, cooldown.felblade.remains - 0.4 )
|
|
end
|
|
if settings.retreat_and_return == "either" then
|
|
return max( 0, min( cooldown.felblade.remains, cooldown.fel_rush.remains ) - 1 )
|
|
end
|
|
end,
|
|
|
|
handler = function ()
|
|
applyBuff( "vengeful_retreat_movement" )
|
|
if cooldown.fel_rush.remains < 1 then setCooldown( "fel_rush", 1 ) end
|
|
applyDebuff( "target", "vengeful_retreat" )
|
|
applyDebuff( "target", "vengeful_retreat_snare" )
|
|
-- Assume that we retreated away.
|
|
setDistance( 15 )
|
|
|
|
if talent.evasive_action.enabled then
|
|
if buff.evasive_action.down then applyBuff( "evasive_action" )
|
|
else
|
|
removeBuff( "evasive_action" )
|
|
setCooldown( "vengeful_retreat", 0 )
|
|
end
|
|
end
|
|
if talent.tactical_retreat.enabled then applyBuff( "tactical_retreat" ) end
|
|
if talent.momentum.enabled then applyBuff( "momentum" ) end
|
|
if pvptalent.glimpse.enabled then applyBuff( "glimpse" ) end
|
|
end,
|
|
}
|
|
} )
|
|
|
|
|
|
spec:RegisterRanges( "disrupt", "felblade", "fel_eruption", "torment", "throw_glaive", "the_hunt" )
|
|
|
|
spec:RegisterOptions( {
|
|
enabled = true,
|
|
|
|
aoe = 3,
|
|
cycle = false,
|
|
|
|
nameplates = true,
|
|
nameplateRange = 10,
|
|
rangeFilter = false,
|
|
|
|
damage = true,
|
|
damageExpiration = 8,
|
|
|
|
potion = "phantom_fire",
|
|
|
|
package = "Havoc",
|
|
} )
|
|
|
|
|
|
spec:RegisterSetting( "demon_blades_text", nil, {
|
|
name = function()
|
|
return strformat( "|cFFFF0000WARNING!|r If using the %s talent, Fury gains from your auto-attacks will be forecast conservatively and updated when you "
|
|
.. "actually gain resources. This prediction can result in Fury spenders appearing abruptly since it was not guaranteed that you'd have enough Fury on "
|
|
.. "your next melee swing.", Hekili:GetSpellLinkWithTexture( 203555 ) )
|
|
end,
|
|
type = "description",
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterSetting( "demon_blades_acknowledged", false, {
|
|
name = function()
|
|
return strformat( "I understand that Fury generation from %s is unpredictable.", Hekili:GetSpellLinkWithTexture( 203555 ) )
|
|
end,
|
|
desc = function()
|
|
return strformat( "If checked, %s will not trigger a warning when entering combat.", Hekili:GetSpellLinkWithTexture( 203555 ) )
|
|
end,
|
|
type = "toggle",
|
|
width = "full",
|
|
arg = function() return false end,
|
|
} )
|
|
|
|
|
|
-- Fel Rush
|
|
spec:RegisterSetting( "fel_rush_head", nil, {
|
|
name = Hekili:GetSpellLinkWithTexture( 195072, 20 ),
|
|
type = "header"
|
|
} )
|
|
|
|
spec:RegisterSetting( "fel_rush_warning", nil, {
|
|
name = strformat( "The %s, %s, and/or %s talents require the use of %s. If you do not want |W%s|w to be recommended to trigger these talents, you may want to "
|
|
.. "consider a different talent build.\n\n"
|
|
.. "You can reserve |W%s|w charges to ensure recommendations will always leave you with charge(s) available to use, but failing to use |W%s|w may ultimately "
|
|
.. "cost you DPS.", Hekili:GetSpellLinkWithTexture( 388113 ), Hekili:GetSpellLinkWithTexture( 206476 ), Hekili:GetSpellLinkWithTexture( 347461 ),
|
|
Hekili:GetSpellLinkWithTexture( 195072 ), spec.abilities.fel_rush.name, spec.abilities.fel_rush.name, spec.abilities.fel_rush.name ),
|
|
type = "description",
|
|
width = "full",
|
|
} )
|
|
|
|
spec:RegisterSetting( "fel_rush_charges", 0, {
|
|
name = strformat( "Reserve %s Charges", Hekili:GetSpellLinkWithTexture( 195072 ) ),
|
|
desc = strformat( "If set above zero, %s will not be recommended if it would leave you with fewer (fractional) charges.", Hekili:GetSpellLinkWithTexture( 195072 ) ),
|
|
type = "range",
|
|
min = 0,
|
|
max = 2,
|
|
step = 0.1,
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterSetting( "fel_rush_filler", true, {
|
|
name = strformat( "%s: Filler and Movement", Hekili:GetSpellLinkWithTexture( 195072 ) ),
|
|
desc = strformat( "When enabled, %s may be recommended as a filler ability or for movement.\n\n"
|
|
.. "These recommendations may occur with %s talented, when your other abilities are on cooldown, and/or because you are out of range of your target.",
|
|
Hekili:GetSpellLinkWithTexture( 195072 ), Hekili:GetSpellLinkWithTexture( 203555 ) ),
|
|
type = "toggle",
|
|
width = "full"
|
|
} )
|
|
|
|
-- Throw Glaive
|
|
spec:RegisterSetting( "throw_glaive_head", nil, {
|
|
name = Hekili:GetSpellLinkWithTexture( 185123, 20 ),
|
|
type = "header"
|
|
} )
|
|
|
|
spec:RegisterSetting( "throw_glaive_charges_text", nil, {
|
|
name = strformat( "You can reserve charges of %s to ensure that it is always available for %s or |W|T1385910:0::::64:64:4:60:4:60|t |cff71d5ff%s (affix)|r|w procs. "
|
|
.. "If set to your maximum charges (2 with %s, 1 otherwise), |W%s|w will never be recommended. Failing to use |W%s|w when appropriate may impact your DPS.",
|
|
Hekili:GetSpellLinkWithTexture( 185123 ), Hekili:GetSpellLinkWithTexture( 391429 ), GetSpellInfo( 396363 ) or "Thundering", Hekili:GetSpellLinkWithTexture( 389763 ),
|
|
spec.abilities.throw_glaive.name, spec.abilities.throw_glaive.name ),
|
|
type = "description",
|
|
width = "full",
|
|
} )
|
|
|
|
spec:RegisterSetting( "throw_glaive_charges", 0, {
|
|
name = strformat( "Reserve %s Charges", Hekili:GetSpellLinkWithTexture( 185123 ) ),
|
|
desc = strformat( "If set above zero, %s will not be recommended if it would leave you with fewer (fractional) charges.", Hekili:GetSpellLinkWithTexture( 185123 ) ),
|
|
type = "range",
|
|
min = 0,
|
|
max = 2,
|
|
step = 0.1,
|
|
width = "full"
|
|
} )
|
|
|
|
--[[ Retired 20240712:
|
|
spec:RegisterSetting( "footloose", true, {
|
|
name = strformat( "%s before %s", Hekili:GetSpellLinkWithTexture( 185123 ) , Hekili:GetSpellLinkWithTexture( 188499 ) ),
|
|
desc = strformat( "When enabled, %s may be recommended without having %s on cooldown.\n\n"
|
|
.. "This setting deviates from the default SimulationCraft profile, but performs equally on average with higher top-end damage.",
|
|
Hekili:GetSpellLinkWithTexture( 185123 ) , Hekili:GetSpellLinkWithTexture( 188499 ) ),
|
|
type = "toggle",
|
|
width = "full"
|
|
} ) ]]
|
|
|
|
-- Vengeful Retreat
|
|
spec:RegisterSetting( "retreat_head", nil, {
|
|
name = Hekili:GetSpellLinkWithTexture( 198793, 20 ),
|
|
type = "header"
|
|
} )
|
|
|
|
spec:RegisterSetting( "retreat_warning", nil, {
|
|
name = strformat( "The %s, %s, and/or %s talents require the use of %s. If you do not want |W%s|w to be recommended to trigger the benefit of these talents, you "
|
|
.. "may want to consider a different talent build.", Hekili:GetSpellLinkWithTexture( 388108 ),Hekili:GetSpellLinkWithTexture( 206476 ),
|
|
Hekili:GetSpellLinkWithTexture( 389688 ), Hekili:GetSpellLinkWithTexture( 198793 ), spec.abilities.vengeful_retreat.name ),
|
|
type = "description",
|
|
width = "full",
|
|
} )
|
|
|
|
spec:RegisterSetting( "retreat_and_return", "off", {
|
|
name = strformat( "%s: %s and %s", Hekili:GetSpellLinkWithTexture( 198793 ), Hekili:GetSpellLinkWithTexture( 195072 ), Hekili:GetSpellLinkWithTexture( 232893 ) ),
|
|
desc = function()
|
|
return strformat( "When enabled, %s will |cFFFF0000NOT|r be recommended unless either %s or %s are available to quickly return to your current target. This "
|
|
.. "requirement applies to all |W%s|w and |W%s|w recommendations, regardless of talents.\n\n"
|
|
.. "If |W%s|w is not talented, its cooldown will be ignored.\n\n"
|
|
.. "This option does not guarantee that |W%s|w or |W%s|w will be the first recommendation after |W%s|w but will ensure that either/both are available immediately.",
|
|
Hekili:GetSpellLinkWithTexture( 198793 ), Hekili:GetSpellLinkWithTexture( 195072 ), Hekili:GetSpellLinkWithTexture( 232893 ),
|
|
spec.abilities.fel_rush.name, spec.abilities.vengeful_retreat.name, spec.abilities.felblade.name,
|
|
spec.abilities.fel_rush.name, spec.abilities.felblade.name, spec.abilities.vengeful_retreat.name )
|
|
end,
|
|
type = "select",
|
|
values = {
|
|
off = "Disabled (default)",
|
|
fel_rush = "Require " .. Hekili:GetSpellLinkWithTexture( 195072 ),
|
|
felblade = "Require " .. Hekili:GetSpellLinkWithTexture( 232893 ),
|
|
either = "Either " .. Hekili:GetSpellLinkWithTexture( 195072 ) .. " or " .. Hekili:GetSpellLinkWithTexture( 232893 )
|
|
},
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterSetting( "retreat_filler", false, {
|
|
name = strformat( "%s: Filler and Movement", Hekili:GetSpellLinkWithTexture( 198793 ) ),
|
|
desc = function()
|
|
return strformat( "When enabled, %s may be recommended as a filler ability or for movement.\n\n"
|
|
.. "These recommendations may occur with %s talented, when your other abilities being on cooldown, and/or because you are out of range of your target.",
|
|
Hekili:GetSpellLinkWithTexture( 198793 ), Hekili:GetSpellLinkWithTexture( 203555 ) )
|
|
end,
|
|
type = "toggle",
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterPack( "Havoc", 20240826, [[Hekili:T3Z2UTnsw(TymyvKSIvtsj54mWwn2nVSDWI(fplM3efTeTnhljQHKkPZab9TV1fYI1LZPkskPK0dwSa70rS4Po15(TIEU)8)28hxfvep)3d8cM4DxWTJ8(yWDtMo)XIVTlE(J7Iw(w0lK)JTrBi)))VJ(s6s6V(T1PrROVDE6(SLKN8yYM9RJkss3(PSONlM)4t7twx8BBN)e8omH8Q7Ixo)3N(Hpm)XxtwTkMV24CYgqx7nE3DtWT)1Jl(F3rbWXfP7I3gNDCX60xswE8Zh)SyvtiRIGaF64IDzjPzjfF74I983sAz(bKL9PxJx(gbMBFkD)2v0)DuA(XffrRJ3wCCXZPKn432Sj94I)Z9zr1V(hUjym51)BVsqK)Eezr)9KIxt2sOfzPpNSMqbIwsp95J2LfVmDZtrfdF4x(suws0tRJFpL89WMO)rAwyrwY23IlE)xIwVp(HY)1i)rlttxVk9RBhTISXuq9G)DEhouTGa4fC8ZU33sqeM)TTldZxNwT3(Vp5zje41O8W8IOIrrB)w4QD596Fv9MR)WAedaZN9GfSEWPGYbYOSjwjHYMNhR0YzwooncJZEjCv(7xf)C0(1fp49(0DpKfNhxa)UrzlJ2ghwKMLrL7axtEYljRdtFo851KnaEnjervUAxyebBPuNN2)8ZJ0(9r0Zdvy(V8xoUOeoK3olUik7fczoAFrAyurbrB)9Rtii2YvePJYhsG5MKTRIza(P9zBt2(s4xPQpJYI3eLSnNXuyAqQpVx5pUkEdbrEADer7UhD7)sC4QuTfFFFIbH1Rd57A(SFD8GtbFVI)VgLKh(uA(5bfFacfRrpdbIKTlPYb5cTDgjKWXxrbzorK7TygRPh7bVSoIUTpVEFw23gTFxpHKidVcxfTDzm93FzPG0)aXer1(oIVL9iciFjKUgFYXkQ41W8VghVtNyUlz5BH73f(Cw0lBiKG3VppMiT9m9nFWh)C9C86WNIYiVvS6HRKsk98E9fNaPFTc1VNIIBI(JR)qV(LuCIb(njX5ZEGWfsYIxvrPhMfLSkm(lu4hTAvorhD)2Idh0)5KT1af6PZ(O3ajKAdrEAtA2UxtZtYRqRdh0qMGbhoW4pYNH97g07kn0(b)ExPVNX)rsErUIyYQK8S97kK)jkKZ2N)Qq)Dp3)u4sQ7jklh4x1jJbYqKTKsrmbu1K8QaRHCxFzjQv5peaqtK3SOTBtEnHBV5IVzzXrFjolpKdiX2Pc3ALkuTTIxZswZSVw8k59sE51cIg2gzb0jdnqUbg4RMc4kQyaIIRXkdGxz5(t2lxykfMxbRVtEGMHHb9ujS3pU3vC66ivI6O1r5fHe7bRUFAVsd)X55XeCl8jYsFJrgjAfedR944tfjZ37hfV6ctSMf0GZ7YiYwZ)NHRjk(ClMv8y3RKhIlLovBKk(BeIEC0gg6Jy6IAnQizt89(t71hWS3epfvirKf57skySfuMCf7VItUjk7TkA(ShcUP0O))CpXBcb3xfYGDUIqW(TMNuzViK9xq8L9EOFq2VtgSaH(OZXQCUtH2Ze)jqwrzhssyJgoVKi2aoVMrcc7vQZPqkDFaUwsptgjiigoTuawLZwQOz(GkGmDGdIYRXzPKKoIz028LKJr8QE2DbsKQXrB6d7Jqi5MUt5umQdTr8tiZkjGiDfi)v74ZG7DEkDY6nfMm(jXbCk2JMzXCy78NBGVcrqs4SzfjrsIF6KRHbZWdhqnI04TKJ)EcYetKaI0IXtkM4KTjK9KIs9WztZiegPqpV3B04dhu)bFlYnpiTuqjiQbUs5h98xuuvMDlXCTk1YzuDZ89KOOaoBRdJAa3w6mnxzD0kwnQQKIbuWYabzIyeIAVhXyHtCM(kVN6HDzbxeaaqQwADlnRYm4Ow5)qZiieLFIfBKt55gaisuAzzMxZeAggCp6UyrxZIM2nQXLktLkPhBsPjwTFJfLcWG3bSVvcXOqQXms8j5jRWDNr04PQ8sN(69bm(aZxWiiCTmYAP9yT3g3rS2719ebbotUWznPyHfzf8S0zSjUpWcxE6pvhmt1ZwFu1cDbx1YQMVlZcxwIwVsli0kGWOErRN5pYZZbXekjGP2pM91DTRfCIc)RIcs3Rk2Is0g1ClkhPizjj6UOT5pNMTHHPOzjiKgho(6siK)AurrmLKsiTfjB)MRxM4vCGbFrJTCDailySxv2cl)2Y104qcj7o59i0HTVDT)yuYamvOwMtjwmdlRdNy50I9KE2HoNmyv8fOauu32sX5vfYLWbME4AJwLKtJNyLexXynYb4aUHQmRHJpf1ih8WBhaehB7I0tKWqVM4vNK(dzhnp2MiFfz6UbnipEj(jv(dp6GtO2BAXoW2sKWXkDQtRvcXEXYKcsc9YVEz9ukI3SJi9c4(9e44Qeg1EsaStJ7vX)Zl2VI8)YkZa5ifNro9LcdP7z)mrK5LYQ8ufEtwrvLB4Njs0Z15VgTEfXs9RjH8IrugWm0(iucTLpY46qZHGXaBSuWSaDWtno1hoyHNw8Aw6xLkCMgD2xKbX(SK095HS1NBdNBGumhJMDNlFGxPhQuJ846kMsJKIHlALq0drwcVumDOmpbtpCO5L5xTo)089YdFkPi2gJfluy143XdWYYXfNJFh5ydg9JFzILgK1wKq4pu0xgpv7YANezO6deNdE0MNwcyrdIj7GIDA6g0)s5FFGn6XdbE1c3kNIdhqmvvYNLL55uDWYhtucqDOwBgvcyMLpFq96WIBfWV8yVbv5RqS1eY0P0uMZi(8wtoEHVs8HfND4aCj(hmONUzlKWRr94u6(IRyVNkClb)YmJ4LoA6pCPf7jK0hRniIFpa53hRqtXDV(VXYJ9reiHIZJ7NV1IQdqZzuHUn4ckSUlL(tiz8oEkytjObEJgAK04hiVpjB)s6Be(YFqiieR4H03MxPYDPFLqHt2(8(8ePglBULaiiXIi4PIwaCId5nVNourvtsKVzDX7BPBfLHlPlr5JqsgakdBzEJUXFQ98x0gYj2UgrZMfGqeWYqk(FUpz3osAAFnHeCDgrP4nY7re3x(k4yrjc)XRuiPfuZGFGutGj7Q5uZGZk10V1utAApuddOjyWnZC(YTRV)WRYJlcFkD7(8rfjXzJ9dd2TCW1tONtOw)Y6HoQnNb9uEJYPjqY6ispmb51mtuGeQ20)AWtrDCtynW2(Puy3Sg94TUxsNih4z6URPOo20Az8YgrpG5d3r9bVG1Gs2PkZXdDqDnoiYzgJY4eZ13TEaGG7Cc4bajRwvrPG2xM7kp91Lk32WjvJfGdeLCad05EYv0hcYTHjqGDuUCP4kdyrsJ4x1wmKqibqlWeviOjusO2cThsvq2sPgu0SgcA3BI3WPExdA6dI0kthbEUDTwzrbWxwQib1pxkY1H6dG5l0xnIKuB4(DQtGPCLmySmDNSsSu1YPOVWMHj0KJdjOJkw4)F0py0TxZhp3qIl1I4bx7hmKlbOvn3C6IU(w(dlOB6YOA7k73DTu9hTtvwUkKyLordzQkT14amW0aDvSxvwPdj7f9OAaMdfer0bO7QS8i(wdQtJbtjzyuiI9UaMCBVHwDBbWJClgkywaCyAIo3adEA1)VvKJNvNjewbv998adB9Ja9SPEgMXdBDILsLcGo2hEdggg4zM)nU4IzTy1QKDBa2Z6fkx91qB8HDry6BDJyGCewhUz80zEaJAJiXwPz0v2qROY4spVY83m)7AHKjkI59DfX0eX)jHCzwX2ttWYUOp2lkhEb7Cq23ZBAxizDHB0hjobQ9DeZ3W9(3W)Ejea9c2oq4KCRpMy2cVu0((Xw3Nsikg0koAx(VmGvGbSSMUGHVB3Z(jg50SKHSkz4SQixp2kvY10AudMbgOOryeSg1u5hW9e3l6A4eOqnezyxp4zO5Zu)e5kukQKxvbIuYGqw5f7av5y7moAOwM8zn0dyevzRqP5tgHNBFYeQoPc3VRstzbFATy)nxQf72ewxd5rvxJhPFYuKvBfHlP)hBOvfNoTtq8oGDUbtupWPTsQCO3OPOtzOMDifohBbM9UE4yl9W0I8)uB2QnfH7Ew8MMGE6B55KCPEj6F5OezndEMrY0Kw3AHfjg3GBbgPStW9QVNPXoNZTsqlut07GF1qKKUND)kGNmJZP3KwsDTD)rUxA0fRcehsbfz6lqe6DndbsUY78mYGJzoK0DJwy2bnhCa1PCW2nCbNCDwf(TnCWniakNY6yMu)rnUhnLL6i40)uCgqYbWDrXnA7Grd6GBLqLNHQMeiKMdeH7y8iQF3scu9tP12E5BXzWvZT9b0FROD4k(WXs4q9wtywkA4AL1O8toCa6(1z5(a2SZV9J1vGNlWdbW2vLDlmMiShJFBezZe1epP(iPGiYKe9oNbSNzg3ryOo2XytTHOcvvsrQD3atbTNQfmJU)vGxWseBmWqbndf2WnilTAMrITREk)vHQ4(9tbizqv90466lgzw9jMhaGlB0Gqxlgzati5ffkesGiouEr7dgeZXyoA4uq2NcGAZ9keFHid25Qo5q1X5b44A2RByKeUz9sDzuDE9TCL3CC5GTIKvjKctG7wkDa7NrJxGmt5sVanHN6E314uOAj(RhqpSrbirK67oK6OKnWiPB59Giju)DYbQF6g1oPj((WTfa7lQ7YCay85QRRZFKQVqES4lu2K5p(1i2x9N85pY(GFLSzxAw1xhS3XHY7oUiJohqKt9Xf5KauoUG(vjAtub9hiw(iHCLp64N)FiK9JlOF7W(u6wYwXE87S26FcOlsDTOrXBzJLbzX99)JbU2P6yX0GUuiCTdILZ3Hg4k)vmyDlmSuCuQbrvNOiW9dF3OVFeJ(YCqBqC5UTrGLpcAxfVRg0eHb3sWDwXnLiM0aPYZqb8DNtSebyNmwg4DPaCWLcWi6PggN1aUXZr3Gjx6ny6pOnqX7NgWvD2Jbye7AAbDPB4r7kuIz)fru8KXAmaRfAHgO1EkkW9VymZJFgWRC5xEX31k3Yi6IsTEvd7KB8mMjjKdU(eMQbz9hJcEe1CkkrTsOZTk)52cUtJeGON1vCer7QBEmqDs25aKoV(Dr8Oj)1J5DaXCv(O2c2tIpJ5KSth8ae9Mogm0LZplIBWUDOra2jhqmMRUUHLia70XYZPMngW6OvNaeT6t2TlgGVajRGTvNbNWLBaIzLtNiHa4loMFX3GtWrdoi7G6YyS8fa(wiOtdG(Kl0YTX4t9GUTy9N32n4CFoqSUO2LFTnq9HOG(SYwrkqrhD0dgRT4lq(7Av02go4XVcKcuSCjfWRrneNZm4DcyGlBObGHxtJW7Uc(AZfOee9pn(a0dGLOAlcfRDcCWL0iG3vw5fg8obCxzLneV7k4RnACjzMya)SigIJ5DJKCHbVta3vrWgI3Df8yEcu9Q0cFbAIYP7I57uozh2sa85(sKvDk9)LZmCfNieN4NqosGu8kEt7i3i5wFcXIIaXtoWFe42XWxScZlqcxi70zPIQO8WoeL4LI7Hu0LtqodbIxkm9KKZqG5fqodzNolYzO8WoiNDP4EgLn7e9VDHbFdaS8NEeayQ94gITnaO0rbLUKMcuZpsmgagCjxqGlaRrzkpXO10W6Zn4BaGTYanECdX2gaumPcmGA(XUXMEbIuX5f4cWIud0tUFCSGZEoD960VMS9fA4xzrKWx)ACg53P)XZHhkBbDz8jq64c6NH)JlEAFr162MYISB)wLvVAfDXRIkIEkkp(VscfCXnKFMoKLGbfshAQ31QacrhtOoyKhPhgDSXnNZIHH1l2UbmSIPxEVF0Gw1p3wWDgkOi2OG0AoYXp)Bm5mkqUvvkMkkn)rIe2RPzS)8F(P5pY(D6Fvq5Jih5)63z)jgL)EZFu8PrA(JLB18)R5fZ)9a6IQ)LhxMrwvwse9VUMq3lHAiQFZgOqBClH2XfhoqoXhxC1XfnkySJlgCCrpTxXmswoC5yk(Nvj(QewVW(0kDCXmcFLTZ01xVVAdCxnPrzqkP0LjO0f05ATgAv3maktMnhPZF8wpkuNkZG53afnU7TO7B584FCXdSZMojfm9y(5hz86L4mkJnp)zvSJ6BALGQwFe0Qba9a8b0dGXGeVFN5XWLWKc)34(BiJBYt1kfXUR9Cug6bp)Z1io407QHOqd6SmUwnHVu88JO4jSL3UXdRpA6xygfXy2vTHIv(EOOfWoODL84yI5fWJT2jEhxmKepd5)5Agbf6Z9qnsvDHCyiLIbtf(NMALFG8kvSoQUUXYRtresBHtubO0isRUo3Q8(468y2GRfl1VszhxCpJbl07rwI3OPmWy72NzXZXJsxkoQFl6XaxZhX1z95q)oRXqXB5Ncls9GYVSNu(sGZOIffMEOQZ9CPntq4QV1hm0g6wkuP31mxi16E4MU6eX5QgqFajdiO3hLfXf6NArTGB)Op4UvBbJEd6y0xQLcGGjqoeQmbT7wNI1xH7AkE67YnrM(nTRPS0mL7UhBZWJLRpllezh(30GZStPuxsMCcl8kGLPQ5tOVvFRUSLSuXfIbvPUUYTLdnijBJq9NGb0PwdGjapKygC1VKFAQuOJ8s9MkXzyBiESMLcC6)XqXqfaDtvKZxkDddzB8u7BChSc2G4LGftesb6xDWkX)bgIsXqxJqfFgwilQ5fawgvfANrccb4ETXpHW37qGOGHh2DTOk1VxyQ8h47gM8zs92sYouTi6D3M(CkVaGkSVlfmub3PNvVfnXYG2Paoo8a8aXphNy5TAmUZrBgvTl8kPhG0ldL0aWVmKyXdlYT1NLB7yCpNnpYPMzk1wGANQgcw(e0tydtIyCttIyCZsIOG(m2f2yEvrIKiZPKTNKYKuW6LFdbP)xR3hd7frvJa0NgixR8zugMGMsmq7Xj8A)zbNTuSQsrwBi9JrljWi2Iz6CT(SvvQpZ(nA4V4zZpjJgXy8HQ3YiP2haYQDOzsTSp2m457AUDwYm(JEqU9qSRBnxFH31Nv)wqwc(RapYKtSF1JH)t4eZBsnFuc4mPBfH7K8S970ZkWrKpGzVa8e0igHtyXrypWXBHRN0xvUFLiI9gvcn9GYWdR4haYPxdnhHhOIbQMySA)X9hqrEcGmvo0J0alNyaduRKLXrn2H8wboD1RxEvlNXQ95kmRLIhByGLVh6mscTACLQlNxosn7ZrRJYlc59DJMrKRa5ygqsZ5oqv(KlYEFseawsZ1rKCFhKA(bXgMvxkUUs70dcvy2iICi4)d2FUY59tQ0qCLyjR6mwl8IzKsgXqbuKD2jH(D)IFaMwrGTuH3bne1lBgwrvXD7q83qjzv3yirXukJCaR112stYhVUnq)vTNHvMFk7Ly7Q)PNxHGO5u1hV6eWsF9QZcq7oCH5nvlFDBryPiOagF1mAJ2xw)LIRzfWXsa8MaCyL9lxfse4HYGDQRwB5JhUcAAAUcBJzaW1zUEr9DudUsJ9vr7msUgILUab16R3QF1nopOYNHdYfECwDsu1udc8NvOAtTVKzoD9z)e6iynW4xrp79v7qUwf9DKx7qguMzp84bWXd7UZnq9RVNlrPzc6Vs2ISMpnMFGmFGVtDHh0EnuTIkpzL6ew)tJndBVvVSGgmHgNn2mUgRctZzXp0QXTaVKJqOrDIdpGly3tQNAOBiVSYPLCTbZXe1jrDSeiMT7Mhs862bwYiIdEsWLlPVzZ2pkayfRapYkCTFxnSZOFKofFM4sJzMK)reDbHBIzc3entRHB25ER7VdlxoSzDJEoPYwUS0ToB9C2UR2gubblnUZzd6SfXL5hKyile9SfSneiqY13OEw29NBPXynb4oo6xUAUHquCCyXJ1Z(y4CoMil7YNt)PKEHhSxRn5DMOIGPjy3uLt7ToxGC9g(oZF4yNXNnBEieJ88SZ)SekRLAxmTbKKEYnRcmUw0O(DiZHh3QZw7QlMTS7ZDOMU5qwT3UUjDXQjaTmsYbOcvaYuxlQ7eI8Zyp5sGO3Tzcj4ngq8hFeBkfT0E2Mq4R1bHBIVPtVHmfRgtwDVQEUXcDAVtvFK(5uhOB)V3tbDvwiwrjDzkUi85ZCvdf3UfHkbyXO9P7PvjKEnnc3YcdjHxqKsOdVmB4UJI2W1Skb3WjrWEC1irYQn)rwM(aOAWlx4s9MxzzgaqRmxp(e(v9xTKJ8kgRe3Ty68gJh39LZzRmBr9VRpmuQvrfl6ktL9jlFuDKK0n)ZDbfmvPAG9X)rKyVLXGSxDE7G4II8zdcoDSE1eSFcHMgjXianULxcdRsMoA6lafMEoAUKjE8taIb(Y8p4RPu92i)xvg2wHh2tlmhuF(4gO8Sq7W91BXmDVlvwQ9AqJRbIwCSJ6cbRJzVpfNPoKemLVqaxXnAimCOhnHzGV6543vHjoSEJK5Uz9kSNHLtsQDP47kjQOj64Ruvrd2kUI1eCVl)z78dx2QjogT5UOciMoFF5mmv)tt7C2mSj(qOnVttXg01xU62HZ1tURmwxB3J8Qvkp3sBI(hPzHLVflGRwJC(kjaP(rdq(lYKSvd1lrU6QuogGhyA8n2pOkZMv5sdZ)22LH5RtbV8NUpNbGNtOtG55eIA4MDnZfHW9Xupmc6Xmlg9GknwIRYRh9YhnVbNAs5QwtVvELAgLvxPRHUwlbfvJyME6kkBrbGwM1WXbs(w2Rr9OBcOH0DaRpIzomr12MQ4mLD5GIgJy20vPoA5fBRbnyapA1Lgxdy04l7wtTXdKTVOGTQ3HxGRMHR(QmUbmNMuDmtW2PPxu45oWRM31KXltlQ6jsCEKY59au7CqoM6dInWFXNRBiE18ZRutD5uImMND8W6fPfe4zWBViD8Uhwt8Rtft7CPNNjsV6nJRberAtLz0jJnO6my1fVbAOMHZBzI(yqt5pa11ebZ)iuJOvQTAZ)GuB18rNhBp7elzfTH1xFzBXL36(obLukVuOoJP3QkVRBCy7UC6DG0Ay1wvetUwJwMXTZ3EG7DR55g5ukbOih3ATrkNXcgQ4gYSMHwMBmaN5bNGPcNt2L(hEhznh4ctDYXCON2TLXv6K52chhwBzxp1A0W2SrOx8TI2oJrkwcq8k5It6AyJo16x6(EVBtVVDhfhjpaxfcZQS4iGZF1oN)7GDGomff4w4rs1ao9bxxP8)evjRgjKPBsX1nB)F3o)k8(BvJMa)sLwHD2Ruq)V3DTUjPtYUghICtCoTh0DgPLrkKy5c0lZhTCXwkRBVJM)QMRcyNcSDfIgOdHMmUkwYNzSNYX2YxRHQrZb7gKt3iSllLysMT3LiNCpoYyPjMcV8szTiNRm)mPpv1sbLB(1D4Nn1bNPsYXlB3BnXZcS8SXgSWEUSc()RaEkkGqfvt(KZEi41GufHobnubIyBIBSZFh8drl1sTITq6NIMwqvvLCoDbLFh3aQnSiIeEJi8jbat7cH0)w7(AyyAPHfrfwu136zBGd1j7nA5g(8EcfWRMYMK2IAZFQ(sj7u)iqBMROFRE3TlE1OVMuqeXi6UVrcQHO7T81sXtGMijJvbEgIwEqfAxJ)fOX)c(Zb)dStANe)l47f)Z8JtTv(hELuCgC(LlXV(mg5q2jh6Rzj7OqBxGmvc7BdvjNW2NYUA)NzQ3YFdhjwlmbIKxPDz5STQ)eCIxGjN0)ZZ90U5eiqFkgxU7c1luwNgvbZIjbAcqjaq16Ka9cY9M(f6TKpQinlCpy)yDJJeb0FHXgcgDltyu(VYpvcO(8bVMhGc83tp(C7wTiG)U)WbKYaxqRkvi5ia5d3nMR0XIafQYYvHewFcONz9UQR0et8s95OscybScBBVxZNEy4VDcYLr3XLpgeZaDSmhV3wognb99aUlgwB1y)ZZL9bMKhi9Ug38uRvIZrbEbjUq8CRTbWrnDXPUAtWTLEUjQgUVNNJOh(iYvfq)7wLRaiMylpk1AwjFTDB1W3v2yt9(udWOHlsMLwPbuYC3WgO1loS)Olo2RffR3sd04uKBK(e1imkY(zA2pZQUbe9bovkPkXz21GsYRd)rsZpS2ARSXZf(UtH1RzCWs7WCEC8(j44aOzJB305j6NbgKU9f7tksR1wmMouNnuRzFK6T0KmbDyI33X4)Tg8VhAq1b(nSe(8)V5)Fd]] )
|