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.

2184 lines
88 KiB

-- RogueOutlaw.lua
-- October 2022
-- Contributed to JoeMama.
if UnitClassBase( "player" ) ~= "ROGUE" then return end
local addon, ns = ...
local Hekili = _G[ addon ]
local class = Hekili.Class
local state = Hekili.State
local PTR = ns.PTR
local spec = Hekili:NewSpecialization( 260 )
spec:RegisterResource( Enum.PowerType.ComboPoints )
spec:RegisterResource( Enum.PowerType.Energy, {
blade_rush = {
aura = "blade_rush",
last = function ()
local app = state.buff.blade_rush.applied
local t = state.query_time
return app + floor( t - app )
end,
interval = function() return class.auras.blade_rush.tick_time end,
value = 5,
},
--[[ vendetta_regen = { -- TODO: Vendetta regen?
--aura = "vendetta_regen",
--last = function ()
--local app = state.buff.vendetta_regen.applied
--local t = state.query_time
--return app + floor( t - app )
--end,
--interval = 1,
--value = 20,
--}, ]]
},
nil, -- No replacement model.
{ -- Meta function replacements.
base_time_to_max = function( t )
if buff.adrenaline_rush.up then
if t.current > t.max - 50 then return 0 end
return state:TimeToResource( t, t.max - 50 )
end
end,
base_deficit = function( t )
if buff.adrenaline_rush.up then
return max( 0, ( t.max - 50 ) - t.current )
end
end,
}
)
-- Talents
spec:RegisterTalents( {
ace_up_your_sleeve = { 90670, 381828, 1 }, -- Between the Eyes has a 4% chance per combo point spent to grant 4 combo points.
acrobatic_strikes = { 90752, 196924, 1 }, -- Increases the range of your melee attacks by 3 yds.
adrenaline_rush = { 90659, 13750 , 1 }, -- Increases your Energy regeneration rate by 60%, your maximum Energy by 50, and your attack speed by 20% for 20 sec.
alacrity = { 90751, 193539, 2 }, -- Your finishing moves have a 5% chance per combo point to grant 1% Haste for 15 sec, stacking up to 5 times.
ambidexterity = { 90660, 381822, 1 }, -- Main Gauche has an additional 5% chance to strike while Blade Flurry is active.
atrophic_poison = { 90763, 381637, 1 }, -- Coats your weapons with a Non-Lethal Poison that lasts for 1 |4hour:hrs;. Each strike has a 30% chance of poisoning the enemy, reducing their damage by 3.0% for 10 sec.
audacity = { 90641, 381845, 1 }, -- Half-cost uses of Pistol Shot have a 35% chance to cause your next Ambush to be usable without Stealth. Chance to trigger this effect matches the chance for your Sinister Strike to strike an additional time.
blackjack = { 90696, 379005, 1 }, -- Enemies have 30% reduced damage and healing for 6 sec after Blind or Sap's effect on them ends.
blade_flurry = { 90674, 13877 , 1 }, -- Strikes up to 8 nearby targets for 529 Physical damage, and causes your single target attacks to also strike up to 7 additional nearby enemies for 50% of normal damage for 13 sec.
blade_rush = { 90644, 271877, 1 }, -- Charge to your target with your blades out, dealing 1,587 Physical damage to the target and 794 to all other nearby enemies. While Blade Flurry is active, damage to non-primary targets is increased by 100%. Generates 25 Energy over 5 sec.
blind = { 90684, 2094 , 1 }, -- Blinds the target, causing it to wander disoriented for 1 min. Damage will interrupt the effect. Limit 1.
blinding_powder = { 90643, 256165, 1 }, -- Reduces the cooldown of Blind by 30 sec and increases its range by 5 yds.
cheat_death = { 90747, 31230 , 1 }, -- Fatal attacks instead reduce you to 7% of your maximum health. For 3 sec afterward, you take 85% reduced damage. Cannot trigger more often than once per 6 min.
cloak_of_shadows = { 90697, 31224 , 1 }, -- Provides a moment of magic immunity, instantly removing all harmful spell effects. The cloak lingers, causing you to resist harmful spells for 5 sec.
cold_blood = { 90748, 382245, 1 }, -- Increases the critical strike chance of your next damaging ability by 100%.
combat_potency = { 90646, 61329 , 1 }, -- Increases your Energy regeneration rate by 25%.
combat_stamina = { 90648, 381877, 1 }, -- Stamina increased by 10%.
count_the_odds = { 90655, 381982, 2 }, -- Ambush and Dispatch have a 10% chance to grant you a Roll the Bones combat enhancement buff you do not already have for 5 sec. Duration and chance doubled while Stealthed.
dancing_steel = { 90669, 272026, 1 }, -- Blade Flurry strikes 3 additional enemies and its duration is increased by 3 sec.
deadened_nerves = { 90743, 231719, 1 }, -- Physical damage taken reduced by 3%.
deadly_precision = { 90760, 381542, 2 }, -- Increases the critical strike chance of your attacks that generate combo points by 5%.
deeper_stratagem = { 90750, 193531, 1 }, -- Gain 1 additional max combo point. Your finishing moves that consume more than 5 combo points have increased effects, and your finishing moves deal 5% increased damage.
deft_maneuvers = { 90672, 381878, 1 }, -- Increases the range of your melee attacks by 2 yards while Blade Flurry is active.
devious_stratagem = { 90679, 394321, 1 }, -- Gain 1 additional max combo point. Your finishing moves that consume more than 5 combo points have increased effects, and your finishing moves deal 5% increased damage.
dirty_tricks = { 90645, 108216, 1 }, -- Cheap Shot, Gouge, and Sap no longer cost Energy.
dreadblades = { 90664, 343142, 1 }, -- Strike at an enemy, dealing 1,257 Physical damage and empowering your weapons for 10 sec, causing your Sinister Strike, Ambush, and Pistol Shot to fill your combo points, but your finishing moves consume 5% of your current health.
echoing_reprimand = { 90639, 385616, 1 }, -- Deal 1,746 Arcane damage to an enemy, extracting their anima to Animacharge a combo point for 45 sec. Damaging finishing moves that consume the same number of combo points as your Animacharge function as if they consumed 7 combo points. Awards 2 combo points.
elusiveness = { 90747, 79008 , 1 }, -- Evasion also reduces damage taken by 10%, and Feint also reduces non-area-of-effect damage taken by 20%.
evasion = { 90764, 5277 , 1 }, -- Increases your dodge chance by 100% for 10 sec.
fan_the_hammer = { 90666, 381846, 2 }, -- When Sinister Strike strikes an additional time, gain 1 additional stack of Opportunity. Max 6 stacks. Half-cost uses of Pistol Shot consume 1 additional stack of Opportunity to fire 1 additional shot.
fatal_flourish = { 90662, 35551 , 1 }, -- Your off-hand attacks have a 65% chance to generate 10 Energy.
feint = { 90742, 1966 , 1 }, -- Performs an evasive maneuver, reducing damage taken from area-of-effect attacks by 40% for 6 sec.
find_weakness = { 90690, 91023 , 2 }, -- Your Stealth abilities reveal a flaw in your target's defenses, causing all your attacks to bypass 15% of that enemy's armor for 10 sec.
fleet_footed = { 90762, 378813, 1 }, -- Movement speed increased by 15%.
float_like_a_butterfly = { 90650, 354897, 1 }, -- Restless Blades now also reduces the remaining cooldown of Evasion and Feint by 0.5 sec per combo point spent.
ghostly_strike = { 90677, 196937, 1 }, -- Strikes an enemy, dealing 1,058 Physical damage and causing the target to take 10% increased damage from your abilities for 10 sec. Awards 1 combo point.
gouge = { 90741, 1776 , 1 }, -- Gouges the eyes of an enemy target, incapacitating for 4 sec. Damage will interrupt the effect. Must be in front of your target. Awards 1 combo point.
grappling_hook = { 90682, 195457, 1 }, -- Launch a grappling hook and pull yourself to the target location.
greenskins_wickers = { 90665, 386823, 1 }, -- Between the Eyes has a 20% chance per Combo Point to increase the damage of your next Pistol Shot by 200%.
heavy_hitter = { 90642, 381885, 1 }, -- Attacks that generate combo points deal 10% increased damage.
hidden_opportunity = { 90675, 383281, 1 }, -- Effects that grant a chance for Sinister Strike to strike an additional time also apply to Ambush.
hit_and_run = { 90673, 196922, 1 }, -- Movement speed increased by 15%.
improved_adrenaline_rush = { 90654, 395422, 1 }, -- Generate full combo points when you gain Adrenaline Rush, and again when it ends.
improved_ambush = { 90692, 381620, 1 }, -- Ambush generates 1 additional combo point.
improved_between_the_eyes = { 90671, 235484, 1 }, -- Critical strikes with Between the Eyes deal four times normal damage.
improved_main_gauche = { 90668, 382746, 2 }, -- Main Gauche has an additional 5% chance to strike.
improved_sprint = { 90746, 231691, 1 }, -- Reduces the cooldown of Sprint by 60 sec.
improved_wound_poison = { 90637, 319066, 1 }, -- Wound Poison can now stack 2 additional times.
iron_stomach = { 90744, 193546, 1 }, -- Increases the healing you receive from Crimson Vial, healing potions, and healthstones by 25%.
keep_it_rolling = { 90652, 381989, 1 }, -- Increase the remaining duration of your active Roll the Bones combat enhancements by 30 sec.
killing_spree = { 90664, 51690 , 1 }, -- Teleport to an enemy within 10 yards, attacking with both weapons for a total of 5,082 Physical damage over 2 sec. While Blade Flurry is active, also hits up to 4 nearby enemies for 100% damage.
leeching_poison = { 90758, 280716, 1 }, -- Adds a Leeching effect to your Lethal poisons, granting you 10% Leech.
lethality = { 90749, 382238, 2 }, -- Critical strike chance increased by 1%. Critical strike damage bonus of your attacks that generate combo points increased by 10%.
loaded_dice = { 90656, 256170, 1 }, -- Activating Adrenaline Rush causes your next Roll the Bones to grant at least two matches.
marked_for_death = { 90750, 137619, 1 }, -- Marks the target, instantly generating 5 combo points. Cooldown reset if the target dies within 1 min.
master_poisoner = { 90636, 378436, 1 }, -- Increases the non-damaging effects of your weapon poisons by 20%.
nightstalker = { 90693, 14062 , 2 }, -- While Stealth is active, your abilities deal 4% more damage.
nimble_fingers = { 90745, 378427, 1 }, -- Energy cost of Feint and Crimson Vial reduced by 10.
numbing_poison = { 90763, 5761 , 1 }, -- Coats your weapons with a Non-Lethal Poison that lasts for 1 |4hour:hrs;. Each strike has a 30% chance of poisoning the enemy, clouding their mind and slowing their attack and casting speed by 15% for 10 sec.
opportunity = { 90683, 279876, 1 }, -- Sinister Strike has a 35% chance to hit an additional time, making your next Pistol Shot half cost and double damage.
precise_cuts = { 90667, 381985, 1 }, -- Blade Flurry damage is increased by an additional 3% per missing target below its maximum.
prey_on_the_weak = { 90755, 131511, 1 }, -- Enemies disabled by your Cheap Shot or Kidney Shot take 10% increased damage from all sources for 6 sec.
quick_draw = { 90663, 196938, 1 }, -- Half-cost uses of Pistol Shot granted by Sinister Strike now generate 1 additional combo point, and deal 20% additional damage.
recuperator = { 90640, 378996, 1 }, -- Slice and Dice heals you for up to 1% of your maximum health per 2 sec.
resounding_clarity = { 90638, 381622, 1 }, -- Echoing Reprimand Animacharges 3 additional combo points.
restless_blades = { 90658, 79096 , 1 }, -- Finishing moves reduce the remaining cooldown of many Rogue skills by 1 sec per combo point spent. Affected skills: Adrenaline Rush, Between the Eyes, Blade Flurry, Blade Rush, Dreadblades, Ghostly Strike, Grappling Hook, Keep it Rolling, Killing Spree, Marked for Death, Roll the Bones, Sepsis, Sprint, and Vanish.
retractable_hook = { 90681, 256188, 1 }, -- Reduces the cooldown of Grappling Hook by 15 sec, and increases its retraction speed.
reverberation = { 90638, 394332, 1 }, -- Echoing Reprimand's damage is increased by 75%.
riposte = { 90661, 344363, 1 }, -- Dodging an attack will trigger Mastery: Main Gauche. This effect may only occur once every 1 sec.
roll_the_bones = { 90657, 315508, 1 }, -- Roll the dice of fate, providing a random combat enhancement for 30 sec.
rushed_setup = { 90754, 378803, 1 }, -- The Energy costs of Kidney Shot, Cheap Shot, Sap, and Distract are reduced by 20%.
ruthlessness = { 90680, 14161 , 1 }, -- Your finishing moves have a 20% chance per combo point spent to grant a combo point.
sap = { 90685, 6770 , 1 }, -- Incapacitates a target not in combat for 1 min. Only works on Humanoids, Beasts, Demons, and Dragonkin. Damage will revive the target. Limit 1.
seal_fate = { 90757, 14190 , 2 }, -- When you critically strike with a melee attack that generates combo points, you have a 50% chance to gain an additional combo point per critical strike.
sepsis = { 90677, 385408, 1 }, -- Infect the target's blood, dealing 5,370 Nature damage over 10 sec. If the target survives its full duration, they suffer an additional 1,970 damage and you gain 1 use of any Stealth ability for 5 sec. Cooldown reduced by 30 sec if Sepsis does not last its full duration. Awards 1 combo point.
shadow_dance = { 90689, 185313, 1 }, -- Allows use of all Stealth abilities and grants all the combat benefits of Stealth for 6 sec. Effect not broken from taking damage or attacking.
shadowrunner = { 90687, 378807, 1 }, -- While Stealth or Shadow Dance is active, you move 20% faster.
shadowstep = { 90695, 36554 , 1 }, -- Step through the shadows to appear behind your target and gain 70% increased movement speed for 2 sec.
shiv = { 90740, 5938 , 1 }, -- Attack with your off-hand, dealing 397 Physical damage, dispelling all enrage effects and applying a concentrated form of your Crippling Poison, reducing movement speed by 70% for 5 sec. Awards 1 combo point.
sleight_of_hand = { 90651, 381839, 1 }, -- Roll the Bones has a 10% increased chance of granting additional matches.
soothing_darkness = { 90691, 393970, 1 }, -- You are healed for 30% of your maximum health over 6 sec after gaining Vanish or Shadow Dance.
subterfuge = { 90688, 108208, 1 }, -- Your abilities requiring Stealth can still be used for 3 sec after Stealth breaks.
summarily_dispatched = { 90653, 381990, 2 }, -- When your Dispatch consumes 5 or more combo points, Dispatch deals 5% increased damage and costs 5 less Energy for 8 sec. Max 5 stacks. Adding a stack does not refresh the duration.
swift_slasher = { 90649, 381988, 1 }, -- Slice and Dice grants an additional 2% attack speed per combo point spent.
take_em_by_surprise = { 90676, 382742, 2 }, -- Haste increased by 10% while Stealthed and for 10 sec after leaving Stealth.
thiefs_versatility = { 90753, 381619, 2 }, -- Versatility increased by 2%.
thistle_tea = { 90756, 381623, 1 }, -- Restore 100 Energy. Mastery increased by 11.6% for 6 sec.
tight_spender = { 90694, 381621, 1 }, -- Energy cost of finishing moves reduced by 10%.
tricks_of_the_trade = { 90686, 57934 , 1 }, -- Redirects all threat you cause to the targeted party or raid member, beginning with your next damaging attack within the next 30 sec and lasting 6 sec.
triple_threat = { 90678, 381894, 2 }, -- Sinister Strike has a 10% chance to strike with both weapons after it strikes an additional time.
vigor = { 90759, 14983 , 1 }, -- Increases your maximum Energy by 50 and your Energy regeneration by 10%.
virulent_poisons = { 90761, 381543, 1 }, -- Increases the damage of your weapon poisons by 10%.
weaponmaster = { 90647, 200733, 1 }, -- Sinister Strike has a 5% increased chance to strike an additional time.
} )
-- PvP Talents
spec:RegisterPvpTalents( {
boarding_party = 853 , -- 209752
control_is_king = 138 , -- 354406
dagger_in_the_dark = 5549, -- 198675
death_from_above = 3619, -- 269513
dismantle = 145 , -- 207777
drink_up_me_hearties = 139 , -- 354425
enduring_brawler = 5412, -- 354843
maneuverability = 129 , -- 197000
smoke_bomb = 3483, -- 212182
take_your_cut = 135 , -- 198265
thick_as_thieves = 1208, -- 221622
turn_the_tables = 3421, -- 198020
veil_of_midnight = 5516, -- 198952
} )
local rtb_buff_list = {
"broadside", "buried_treasure", "grand_melee", "ruthless_precision", "skull_and_crossbones", "true_bearing", "rtb_buff_1", "rtb_buff_2"
}
-- Auras
spec:RegisterAuras( {
-- Talent: Energy regeneration increased by $w1%. Maximum Energy increased by $w4. Attack speed increased by $w2%. $?$w5>0[Damage increased by $w5%.][]
-- https://wowhead.com/beta/spell=13750
adrenaline_rush = {
id = 13750,
duration = 20,
max_stack = 1
},
-- Talent: Each strike has a chance of poisoning the enemy, reducing their damage by ${$392388s1*-1}.1% for $392388d.
-- https://wowhead.com/beta/spell=381637
atrophic_poison = {
id = 381637,
duration = 3600,
max_stack = 1
},
-- Talent: Damage reduced by ${$W1*-1}.1%.
-- https://wowhead.com/beta/spell=392388
atrophic_poison_dot = {
id = 392388,
duration = 10,
type = "Magic",
max_stack = 1,
},
alacrity = {
id = 193538,
duration = 15,
max_stack = 5,
},
audacity = {
id = 386270,
duration = 10,
max_stack = 1,
},
between_the_eyes = {
id = 315341,
duration = function() return 3 * effective_combo_points end,
max_stack = 1,
},
-- Talent: Attacks striking nearby enemies.
-- https://wowhead.com/beta/spell=13877
blade_flurry = {
id = 13877,
duration = function () return talent.dancing_steel.enabled and 13 or 10 end,
max_stack = 1,
},
-- Talent: Generates $s1 Energy every sec.
-- https://wowhead.com/beta/spell=271896
blade_rush = {
id = 271896,
duration = 5,
tick_time = 1,
max_stack = 1
},
-- Talent: Disoriented.
-- https://wowhead.com/beta/spell=2094
blind = {
id = 2094,
duration = 60,
mechanic = "disorient",
type = "Ranged",
max_stack = 1
},
-- Stunned.
-- https://wowhead.com/beta/spell=1833
cheap_shot = {
id = 1833,
duration = 4,
mechanic = "stun",
max_stack = 1
},
-- Talent: Resisting all harmful spells.
-- https://wowhead.com/beta/spell=31224
cloak_of_shadows = {
id = 31224,
duration = 5,
max_stack = 1
},
-- Talent: Critical strike chance of your next damaging ability increased by $s1%.
-- https://wowhead.com/beta/spell=382245
cold_blood = {
id = 382245,
duration = 3600,
max_stack = 1
},
-- Bleeding for $w1 damage every $t1 sec.
-- https://wowhead.com/beta/spell=121411
crimson_tempest = {
id = 121411,
duration = 2,
tick_time = 2,
max_stack = 1
},
-- Healing for $?a354425|a193546[${$W1}.2][$w1]% of maximum health every $t1 sec.
-- https://wowhead.com/beta/spell=185311
crimson_vial = {
id = 185311,
duration = 4,
type = "Magic",
max_stack = 1
},
-- Each strike has a chance of poisoning the enemy, slowing movement speed by $3409s1% for $3409d.
-- https://wowhead.com/beta/spell=3408
crippling_poison = {
id = 3408,
duration = 3600,
max_stack = 1
},
-- Movement slowed by $s1%.
-- https://wowhead.com/beta/spell=3409
crippling_poison_dot = {
id = 3409,
duration = 12,
mechanic = "snare",
type = "Magic",
max_stack = 1
},
-- Movement speed slowed by $s1%.
-- https://wowhead.com/beta/spell=115196
crippling_poison_snare = {
id = 115196,
duration = 5,
mechanic = "snare",
max_stack = 1
},
-- Each strike has a chance of causing the target to suffer Nature damage every $2818t1 sec for $2818d. Subsequent poison applications deal instant Nature damage.
-- https://wowhead.com/beta/spell=2823
deadly_poison = {
id = 2823,
duration = 3600,
max_stack = 1
},
-- Suffering $w1 Nature damage every $t1 seconds.
-- https://wowhead.com/beta/spell=394324
deadly_poison_dot = {
id = 2818,
duration = 12,
tick_time = 2,
max_stack = 1,
copy = 394324
},
-- Bleeding for $w damage every $t sec. Duplicating $@auracaster's Garrote, Rupture, and Lethal poisons applied.
-- https://wowhead.com/beta/spell=360194
deathmark = {
id = 360194,
duration = 16,
tick_time = 2,
mechanic = "bleed",
max_stack = 1
},
-- Talent: Sinister Strike, $?s196937[Ghostly Strike, ][]Ambush, and Pistol Shot will refill all of your combo points when used.
-- https://wowhead.com/beta/spell=343142
dreadblades = {
id = 343142,
duration = 10,
max_stack = 1
},
echoing_reprimand_2 = {
id = 323558,
duration = 45,
max_stack = 6,
},
echoing_reprimand_3 = {
id = 323559,
duration = 45,
max_stack = 6,
},
echoing_reprimand_4 = {
id = 323560,
duration = 45,
max_stack = 6,
copy = 354835,
},
echoing_reprimand_5 = {
id = 354838,
duration = 45,
max_stack = 6,
},
echoing_reprimand = {
alias = { "echoing_reprimand_2", "echoing_reprimand_3", "echoing_reprimand_4", "echoing_reprimand_5" },
aliasMode = "first",
aliasType = "buff",
meta = {
stack = function ()
if combo_points.current > 1 and combo_points.current < 6 and buff[ "echoing_reprimand_" .. combo_points.current ].up then return combo_points.current end
if buff.echoing_reprimand_2.up then return 2 end
if buff.echoing_reprimand_3.up then return 3 end
if buff.echoing_reprimand_4.up then return 4 end
if buff.echoing_reprimand_5.up then return 5 end
return 0
end
}
},
-- Talent: Dodge chance increased by ${$w1/2}%.$?a344363[ Dodging an attack while Evasion is active will trigger Mastery: Main Gauche.][]
-- https://wowhead.com/beta/spell=5277
evasion = {
id = 5277,
duration = 10,
max_stack = 1
},
-- Talent: Damage taken from area-of-effect attacks reduced by $s1%$?$w2!=0[ and all other damage taken reduced by $w2%. ][.]
-- https://wowhead.com/beta/spell=1966
feint = {
id = 1966,
duration = 6,
max_stack = 1
},
flagellation = {
id = 384631,
duration = 12,
max_stack = 30,
copy = { "flagellation_buff", 323654 }
},
find_weakness = {
id = 316220,
duration = 10,
max_stack = 1,
},
-- Suffering $w1 damage every $t1 seconds.
-- https://wowhead.com/beta/spell=360830
garrote = {
id = 360830,
duration = 18,
tick_time = 2,
mechanic = "bleed",
max_stack = 1
},
-- Talent: Taking $s3% increased damage from the Rogue's abilities.
-- https://wowhead.com/beta/spell=196937
ghostly_strike = {
id = 196937,
duration = 10,
max_stack = 1
},
-- Talent: Incapacitated.
-- https://wowhead.com/beta/spell=1776
gouge = {
id = 1776,
duration = 4,
mechanic = "incapacitate",
max_stack = 1
},
-- Each strike has a chance of poisoning the enemy, inflicting $315585s1 Nature damage.
-- https://wowhead.com/beta/spell=315584
instant_poison = {
id = 315584,
duration = 3600,
max_stack = 1
},
-- Suffering $w1 damage every $t1 sec.
-- https://wowhead.com/beta/spell=154953
internal_bleeding = {
id = 154953,
duration = 6,
tick_time = 1,
mechanic = "bleed",
max_stack = 1
},
-- Stunned.
-- https://wowhead.com/beta/spell=408
kidney_shot = {
id = 408,
duration = function() return ( 1 + effective_combo_points ) end,
mechanic = "stun",
max_stack = 1
},
-- Increase the remaining duration of your active Roll the Bones combat enhancements by 30 sec.
keep_it_rolling = {
id = 381989,
},
-- Talent: Attacking an enemy every $t1 sec.
-- https://wowhead.com/beta/spell=51690
killing_spree = {
id = 51690,
duration = 2,
tick_time = 0.4,
max_stack = 1
},
-- Suffering $w4 Nature damage every $t4 sec.
-- https://wowhead.com/beta/spell=385627
kingsbane = {
id = 385627,
duration = 14,
max_stack = 1
},
-- Talent: Leech increased by $s1%.
-- https://wowhead.com/beta/spell=108211
leeching_poison = {
id = 108211,
duration = 3600,
max_stack = 1
},
-- Talent: Your next $?s5171[Slice and Dice will be $w1% more effective][Roll the Bones will grant at least two matches].
-- https://wowhead.com/beta/spell=256171
loaded_dice = {
id = 256171,
duration = 45,
max_stack = 1,
copy = 240837
},
-- Talent: Marked for Death will reset upon death.
-- https://wowhead.com/beta/spell=137619
marked_for_death = {
id = 137619,
duration = 60,
max_stack = 1
},
-- Suffering $w1 Nature damage every $t1 sec.
-- https://wowhead.com/beta/spell=286581
nothing_personal = {
id = 286581,
duration = 20,
tick_time = 2,
type = "Magic",
max_stack = 1
},
-- Coats your weapons with a Non-Lethal Poison that lasts for 1 |4hour:hrs;. Each strike has a 30% chance of poisoning the enemy, clouding their mind and slowing their attack and casting speed by 15% for 10 sec.
numbing_poison = {
id = 5761,
duration = 3600,
max_stack = 1,
},
-- Talent: Attack and casting speed slowed by $s1%.
-- https://wowhead.com/beta/spell=5760
numbing_poison_dot = {
id = 5760,
duration = 10,
max_stack = 1
},
-- Talent: Your next Pistol Shot costs $s1% less Energy and deals $s3% increased damage.
-- https://wowhead.com/beta/spell=195627
opportunity = {
id = 195627,
duration = 12,
max_stack = 6
},
-- Movement speed reduced by $s3%.
-- https://wowhead.com/beta/spell=185763
pistol_shot = {
id = 185763,
duration = 6,
max_stack = 1
},
prey_on_the_weak = {
id = 255909,
duration = 6,
max_stack = 1,
},
-- Incapacitated.
-- https://wowhead.com/beta/spell=107079
quaking_palm = {
id = 107079,
duration = 4,
max_stack = 1
},
restless_blades = {
id = 79096,
},
riposte = {
id = 199754,
duration = 10,
max_stack = 1,
},
-- Bleeding for $w1 damage every $t1 sec.
-- https://wowhead.com/beta/spell=360826
rupture = {
id = 360826,
duration = 4,
tick_time = 2,
mechanic = "bleed",
max_stack = 1
},
-- Talent: Incapacitated.$?$w2!=0[ Damage taken increased by $w2%.][]
-- https://wowhead.com/beta/spell=6770
sap = {
id = 6770,
duration = 60,
mechanic = "sap",
max_stack = 1
},
-- Talent: Suffering $w1 Nature damage every $t1 sec, and $394026s1 when the poison ends.
-- https://wowhead.com/beta/spell=385408
sepsis = {
id = 385408,
duration = 10,
tick_time = 1,
max_stack = 1,
copy = 328305,
exsanguinated = false,
meta = {
vendetta_exsg = function( t ) return t.up and tracked_bleeds.sepsis.vendetta[ target.unit ] or false end,
exsanguinated_rate = function( t ) return t.up and tracked_bleeds.sepsis.rate[ target.unit ] or 1 end,
last_tick = function( t ) return t.up and ( tracked_bleeds.sepsis.last_tick[ target.unit ] or t.applied ) or 0 end,
tick_time = function( t ) return t.up and ( haste * 2 / t.exsanguinated_rate ) or ( haste * 2 ) end,
},
},
sepsis_buff = {
id = 347037,
duration = 5,
max_stack = 1
},
-- Bleeding for $w1 every $t1 sec.
-- https://wowhead.com/beta/spell=394036
serrated_bone_spike = {
id = 394036,
duration = 3600,
tick_time = 3,
max_stack = 1,
copy = 324073
},
-- Talent: Access to Stealth abilities.$?$w3!=0[ Movement speed increased by $w3%.][]$?$w4!=0[ Damage increased by $w4%.][]
-- https://wowhead.com/beta/spell=185422
shadow_dance = {
id = 185422,
duration = 6,
max_stack = 1
},
-- Talent: Movement speed increased by $s2%.
-- https://wowhead.com/beta/spell=36554
shadowstep = {
id = 36554,
duration = 2,
max_stack = 1
},
shadow_blades = {
id = 121471,
duration = 20,
max_stack = 1,
},
-- Talent: $w1% increased Nature damage taken from $@auracaster.$?${$W2<0}[ Healing received reduced by $w2%.][]
-- https://wowhead.com/beta/spell=319504
shiv = {
id = 319504,
duration = 8,
max_stack = 1
},
sharpened_sabers = {
id = 252285,
duration = 15,
max_stack = 2,
},
-- Concealing allies within $115834A1 yards in shadows.
-- https://wowhead.com/beta/spell=114018
shroud_of_concealment = {
id = 114018,
duration = 15,
tick_time = 0.5,
max_stack = 1
},
-- Concealed in shadows.
-- https://wowhead.com/beta/spell=115834
shroud_of_concealment_buff = {
id = 115834,
duration = 2,
max_stack = 1
},
-- Attack speed increased by $w1%.
-- https://wowhead.com/beta/spell=315496
slice_and_dice = {
id = 315496,
duration = function () return 6 * ( 1 + effective_combo_points ) end,
max_stack = 1,
},
smoke_bomb = {
id = 212182,
duration = 5,
max_stack = 1,
},
soothing_darkness = {
id = 393971,
duration = 6,
max_stack = 1,
},
-- Movement speed increased by $w1%.$?s245751[ Allows you to run over water.][]
-- https://wowhead.com/beta/spell=2983
sprint = {
id = 2983,
duration = 8,
max_stack = 1,
},
-- Stealthed.$?$w3!=0[ Movement speed increased by $w3%.][]$?$w4!=0[ Damage increased by $w4%.][]
-- https://wowhead.com/beta/spell=1784
stealth = {
id = 1784,
duration = 3600,
copy = 115191
},
subterfuge = {
id = 115192,
duration = 3,
max_stack = 1,
},
summarily_dispatched = {
id = 386868,
duration = 8,
max_stack = 5,
},
-- Your next combo point generator will critically strike.
-- https://wowhead.com/beta/spell=227151
symbols_of_death = {
id = 227151,
duration = 10,
max_stack = 1
},
-- Talent: Haste increased by $w1%.
-- https://wowhead.com/beta/spell=385907
take_em_by_surprise = {
id = 385907,
duration = 3600,
max_stack = 1
},
-- Talent: Mastery increased by ${$w2*$mas}.1%.
-- https://wowhead.com/beta/spell=381623
thistle_tea = {
id = 381623,
duration = 6,
type = "Magic",
max_stack = 1
},
-- $s1% increased damage taken from poisons from the casting Rogue.
-- https://wowhead.com/beta/spell=245389
toxic_blade = {
id = 245389,
duration = 9,
max_stack = 1
},
-- Talent: Threat redirected from Rogue.
-- https://wowhead.com/beta/spell=57934
tricks_of_the_trade = {
id = 57934,
duration = 30,
max_stack = 1
},
-- Improved stealth.$?$w3!=0[ Movement speed increased by $w3%.][]$?$w4!=0[ Damage increased by $w4%.][]
-- https://wowhead.com/beta/spell=11327
vanish = {
id = 11327,
duration = 3,
max_stack = 1
},
-- Each strike has a chance of inflicting additional Nature damage to the victim and reducing all healing received for $8680d.
-- https://wowhead.com/beta/spell=8679
wound_poison = {
id = 8679,
duration = 3600,
max_stack = 1
},
-- Healing effects reduced by $w2%.
-- https://wowhead.com/beta/spell=8680
wound_poison_debuff = {
id = 8680,
duration = 12,
max_stack = 3,
copy = 394327
},
-- Real RtB buffs.
broadside = {
id = 193356,
duration = 30,
},
buried_treasure = {
id = 199600,
duration = 30,
},
grand_melee = {
id = 193358,
duration = 30,
},
ruthless_precision = {
id = 193357,
duration = 30,
},
skull_and_crossbones = {
id = 199603,
duration = 30,
},
true_bearing = {
id = 193359,
duration = 30,
},
-- Fake buffs for forecasting.
rtb_buff_1 = {
duration = 30,
},
rtb_buff_2 = {
duration = 30,
},
-- Roll the dice of fate, providing a random combat enhancement for 30 sec.
roll_the_bones = {
alias = rtb_buff_list,
aliasMode = "longest", -- use duration info from the buff with the longest remaining time.
aliasType = "buff",
duration = 30,
},
lethal_poison = {
alias = { "instant_poison", "wound_poison" },
aliasMode = "first",
aliasType = "buff",
duration = 3600
},
nonlethal_poison = {
alias = { "crippling_poison", "numbing_poison", "atrophic_poison" },
aliasMode = "first",
aliasType = "buff",
duration = 3600
},
-- Legendaries (Shadowlands)
concealed_blunderbuss = {
id = 340587,
duration = 8,
max_stack = 1
},
deathly_shadows = {
id = 341202,
duration = 15,
max_stack = 1,
},
greenskins_wickers = {
id = 340573,
duration = 15,
max_stack = 1,
copy = 394131
},
master_assassins_mark = {
id = 340094,
duration = 4,
max_stack = 1,
copy = "master_assassin_any"
},
-- Azerite
snake_eyes = {
id = 275863,
duration = 30,
max_stack = 1,
},
} )
spec:RegisterStateExpr( "rtb_buffs", function ()
return buff.roll_the_bones.count
end )
spec:RegisterStateExpr( "cp_max_spend", function ()
return combo_points.max
end )
local stealth = {
rogue = { "stealth", "vanish", "shadow_dance", "subterfuge" },
mantle = { "stealth", "vanish" },
sepsis = { "sepsis_buff" },
all = { "stealth", "vanish", "shadow_dance", "subterfuge", "shadowmeld", "sepsis_buff" }
}
spec:RegisterStateTable( "stealthed", setmetatable( {}, {
__index = function( t, k )
if k == "rogue" then
return buff.stealth.up or buff.vanish.up or buff.shadow_dance.up or buff.subterfuge.up
elseif k == "rogue_remains" then
return max( buff.stealth.remains, buff.vanish.remains, buff.shadow_dance.remains, buff.subterfuge.remains )
elseif k == "mantle" then
return buff.stealth.up or buff.vanish.up
elseif k == "mantle_remains" then
return max( buff.stealth.remains, buff.vanish.remains )
elseif k == "sepsis" then
return buff.sepsis_buff.up
elseif k == "sepsis_remains" then
return buff.sepsis_buff.remains
elseif k == "all" then
return buff.stealth.up or buff.vanish.up or buff.shadow_dance.up or buff.subterfuge.up or buff.shadowmeld.up or buff.sepsis_buff.up
elseif k == "remains" or k == "all_remains" then
return max( buff.stealth.remains, buff.vanish.remains, buff.shadow_dance.remains, buff.subterfuge.remains, buff.shadowmeld.remains, buff.sepsis_buff.remains )
end
return false
end
} ) )
spec:RegisterUnitEvent( "UNIT_POWER_UPDATE", "player", nil, function( event, unit, resource )
if resource == "COMBO_POINTS" then
Hekili:ForceUpdate( event, true )
end
end )
-- Legendary from Legion, shows up in APL still.
spec:RegisterGear( "mantle_of_the_master_assassin", 144236 )
spec:RegisterAura( "master_assassins_initiative", {
id = 235027,
duration = 3600
} )
spec:RegisterStateExpr( "mantle_duration", function ()
return legendary.mark_of_the_master_assassin.enabled and 4 or 0
end )
spec:RegisterStateExpr( "master_assassin_remains", function ()
if not legendary.mark_of_the_master_assassin.enabled then
return 0
end
if stealthed.mantle then
return cooldown.global_cooldown.remains + 4
elseif buff.master_assassins_mark.up then
return buff.master_assassins_mark.remains
end
return 0
end )
spec:RegisterStateExpr( "cp_gain", function ()
return ( this_action and class.abilities[ this_action ].cp_gain or 0 )
end )
spec:RegisterStateExpr( "effective_combo_points", function ()
local c = combo_points.current or 0
if not action.echoing_reprimand.known then return c end
if c < 2 or c > 5 then return c end
if buff[ "echoing_reprimand_" .. c ].up then return 7 end
return c
end )
-- We need to break stealth when we start combat from an ability.
spec:RegisterHook( "runHandler", function( ability )
local a = class.abilities[ ability ]
if stealthed.all and ( not a or a.startsCombat ) then
if buff.stealth.up then
setCooldown( "stealth", 2 )
if buff.take_em_by_surprise.up then buff.take_em_by_surprise.expires = query_time + 10 end
end
if legendary.mark_of_the_master_assassin.enabled and stealthed.mantle then
applyBuff( "master_assassins_mark" )
end
removeBuff( "stealth" )
removeBuff( "shadowmeld" )
removeBuff( "vanish" )
end
if not a or a.startsCombat then
removeBuff( "cold_blood" )
end
end )
local restless_blades_list = {
"adrenaline_rush",
"between_the_eyes",
"blade_flurry",
"blade_rush",
"dreadblades",
"ghostly_strike",
"grappling_hook",
"keep_it_rolling",
"killing_spree",
"marked_for_death",
"roll_the_bones",
"sepsis",
"sprint",
"vanish"
}
spec:RegisterHook( "spend", function( amt, resource )
if amt > 0 and resource == "combo_points" then
if amt >= 5 and talent.ruthlessness.enabled then gain( 1, "combo_points" ) end
local cdr = amt * ( ( buff.true_bearing.up and 2 or 1 ) + ( talent.float_like_a_butterfly.enabled and 0.5 or 0 ) )
for _, action in ipairs( restless_blades_list ) do
reduceCooldown( action, cdr )
end
if legendary.obedience.enabled and buff.flagellation_buff.up then
reduceCooldown( "flagellation", amt )
end
end
end )
local ExpireSepsis = setfenv( function ()
applyBuff( "sepsis_buff" )
if legendary.toxic_onslaught.enabled then
applyBuff( "shadow_blades" )
applyDebuff( "target", "vendetta", 10 )
end
end, state )
local ExpireAdrenalineRush = setfenv( function ()
gain( combo_points.max, "combo_points" )
end, state )
spec:RegisterHook( "reset_precast", function()
if buff.killing_spree.up then setCooldown( "global_cooldown", max( gcd.remains, buff.killing_spree.remains ) ) end
if debuff.sepsis.up then
state:QueueAuraExpiration( "sepsis", ExpireSepsis, debuff.sepsis.expires )
end
if buff.adrenaline_rush.up and talent.improved_adrenaline_rush.enabled then
state:QueueAuraExpiration( "adrenaline_rush", ExpireAdrenalineRush, buff.adrenaline_rush.expires )
end
end )
spec:RegisterCycle( function ()
if this_action == "marked_for_death" then
if cycle_enemies == 1 or active_dot.marked_for_death >= cycle_enemies then return end -- As far as we can tell, MfD is on everything we care about, so we don't cycle.
if debuff.marked_for_death.up then return "cycle" end -- If current target already has MfD, cycle.
if target.time_to_die > 3 + Hekili:GetLowestTTD() and active_dot.marked_for_death == 0 then return "cycle" end -- If our target isn't lowest TTD, and we don't have to worry that the lowest TTD target is already MfD'd, cycle.
end
end )
-- Abilities
spec:RegisterAbilities( {
-- Talent: Increases your Energy regeneration rate by $s1%, your maximum Energy by $s4, and your attack speed by $s2% for $d.
adrenaline_rush = {
id = 13750,
cast = 0,
cooldown = 180,
gcd = "off",
talent = "adrenaline_rush",
startsCombat = false,
texture = 136206,
toggle = "cooldowns",
cp_gain = function ()
return talent.improved_adrenaline_rush.enabled and combo_points.max or 0
end,
handler = function ()
applyBuff( "adrenaline_rush" )
if talent.improved_adrenaline_rush.enabled then
gain( action.adrenaline_rush.cp_gain, "combo_points" )
state:QueueAuraExpiration( "adrenaline_rush", ExpireAdrenalineRush, buff.adrenaline_rush.remains )
end
energy.regen = energy.regen * 1.6
energy.max = energy.max + 50
forecastResources( "energy" )
if talent.loaded_dice.enabled then
applyBuff( "loaded_dice" )
elseif azerite.brigands_blitz.enabled then
applyBuff( "brigands_blitz" )
end
end,
},
-- Ambush the target, causing $s1 Physical damage.$?s383281[ Has a $193315s3% chance to hit an additional time, making your next Pistol Shot half cost and double damage.][] |cFFFFFFFFAwards $s2 combo $lpoint:points;$?s383281[ each time it strikes][].|r
ambush = {
id = 8676,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function() return talent.tight_spender.enabled and 45 or 50 end,
spendType = "energy",
startsCombat = true,
usable = function () return stealthed.all or buff.audacity.up or buff.sepsis_buff.up, "requires stealth or sepsis_buff" end,
cp_gain = function ()
return debuff.dreadblades.up and combo_points.max or ( 2 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + talent.improved_ambush.rank + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) )
end,
handler = function ()
gain( action.ambush.cp_gain, "combo_points" )
if buff.sepsis_buff.up then removeBuff( "sepsis_buff" ) end
if buff.audacity.up then removeBuff( "audacity" ) end
end,
},
-- Talent: Coats your weapons with a Non-Lethal Poison that lasts for $d. Each strike has a $h% chance of poisoning the enemy, reducing their damage by ${$392388s1*-1}.1% for $392388d.
atrophic_poison = {
id = 381637,
cast = 1.5,
cooldown = 0,
gcd = "off",
talent = "atrophic_poison",
startsCombat = false,
handler = function ()
applyBuff( "atrophic_poison" )
end,
},
-- Finishing move that deals damage with your pistol, increasing your critical strike chance against the target by $s2%.$?a235484[ Critical strikes with this ability deal four times normal damage.][] 1 point : ${$<damage>*1} damage, 3 sec 2 points: ${$<damage>*2} damage, 6 sec 3 points: ${$<damage>*3} damage, 9 sec 4 points: ${$<damage>*4} damage, 12 sec 5 points: ${$<damage>*5} damage, 15 sec$?s193531|((s394320|s394321)&!s193531)[ 6 points: ${$<damage>*6} damage, 18 sec][]$?s193531&(s394320|s394321)[ 7 points: ${$<damage>*7} damage, 21 sec][]
between_the_eyes = {
id = 315341,
cast = 0,
cooldown = 45,
gcd = "totem",
school = "physical",
spend = function() return talent.tight_spender.enabled and 22.5 or 25 end,
spendType = "energy",
startsCombat = false,
texture = 135610,
usable = function() return combo_points.current > 0, "requires combo points" end,
handler = function ()
if talent.alacrity.enabled and effective_combo_points > 4 then
addStack( "alacrity", 15, 1 )
end
applyDebuff( "target", "between_the_eyes", 3 * effective_combo_points )
if azerite.deadshot.enabled then
applyBuff( "deadshot" )
end
if legendary.greenskins_wickers.enabled or talent.greenskins_wickers.enabled and effective_combo_points >= 5 then
applyBuff( "greenskins_wickers" )
end
removeBuff( "echoing_reprimand_" .. combo_points.current )
spend( combo_points.current, "combo_points" )
end,
},
-- Talent: Strikes up to $?a272026[$331850i][${$331850i-3}] nearby targets for $331850s1 Physical damage, and causes your single target attacks to also strike up to $?a272026[${$s3+$272026s3}][$s3] additional nearby enemies for $s2% of normal damage for $d.
blade_flurry = {
id = 13877,
cast = 0,
cooldown = 30,
gcd = "totem",
school = "physical",
spend = 15,
spendType = "energy",
talent = "blade_flurry",
startsCombat = false,
readyTime = function() return buff.blade_flurry.remains - gcd.execute end,
handler = function ()
applyBuff( "blade_flurry" )
end,
},
-- Talent: Charge to your target with your blades out, dealing ${$271881sw1*$271881s2/100} Physical damage to the target and $271881sw1 to all other nearby enemies. While Blade Flurry is active, damage to non-primary targets is increased by $s1%. |cFFFFFFFFGenerates ${$271896s1*$271896d/$271896t1} Energy over $271896d.
blade_rush = {
id = 271877,
cast = 0,
cooldown = 45,
gcd = "totem",
school = "physical",
talent = "blade_rush",
startsCombat = true,
handler = function ()
applyBuff( "blade_rush" )
setDistance( 5 )
end,
},
-- Talent: Blinds the target, causing it to wander disoriented for $d. Damage will interrupt the effect. Limit 1.
blind = {
id = 2094,
cast = 0,
cooldown = function () return talent.blinding_powder.enabled and 90 or 120 end,
gcd = "spell",
talent = "blind",
startsCombat = true,
toggle = "interrupts",
handler = function ()
applyDebuff( "target", "blind" )
end,
},
-- Stuns the target for $d. |cFFFFFFFFAwards $s2 combo $lpoint:points;.|r
cheap_shot = {
id = 1833,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function ()
if talent.dirty_tricks.enabled then return 0 end
return ( talent.tight_spender.enabled and 36 or 40 ) * ( 1 + conduit.rushed_setup.mod * 0.01 ) end,
spendType = "energy",
startsCombat = true,
cycle = function ()
if talent.prey_on_the_weak.enabled then return "prey_on_the_weak" end
end,
usable = function ()
if target.is_boss then return false, "cheap_shot assumed unusable in boss fights" end
return stealthed.all or buff.subterfuge.up, "not stealthed"
end,
nodebuff = "cheap_shot",
cp_gain = function () return 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) end,
handler = function ()
applyDebuff( "target", "cheap_shot", 4 )
if buff.sepsis_buff.up then removeBuff( "sepsis_buff" ) end
if talent.prey_on_the_weak.enabled then
applyDebuff( "target", "prey_on_the_weak" )
end
if pvptalent.control_is_king.enabled then
applyBuff( "slice_and_dice" )
end
gain( action.cheap_shot.cp_gain, "combo_points" )
end,
},
-- Talent: Provides a moment of magic immunity, instantly removing all harmful spell effects. The cloak lingers, causing you to resist harmful spells for $d.
cloak_of_shadows = {
id = 31224,
cast = 0,
cooldown = 120,
gcd = "off",
talent = "cloak_of_shadows",
startsCombat = false,
toggle = "interrupts",
buff = "dispellable_magic",
handler = function ()
removeBuff( "dispellable_magic" )
applyBuff( "cloak_of_shadows" )
end,
},
-- Talent: Increases the critical strike chance of your next damaging ability by $s1%.
cold_blood = {
id = 382245,
cast = 0,
cooldown = 45,
gcd = "off",
school = "physical",
talent = "cold_blood",
startsCombat = false,
handler = function ()
applyBuff( "cold_blood" )
end,
},
-- Drink an alchemical concoction that heals you for $?a354425&a193546[${$O1}.1][$o1]% of your maximum health over $d.
crimson_vial = {
id = 185311,
cast = 0,
cooldown = 30,
gcd = "totem",
school = "nature",
spend = function () return 20 - ( 10 * talent.nimble_fingers.rank ) + conduit.nimble_fingers.mod end,
spendType = "energy",
startsCombat = false,
texture = 1373904,
handler = function ()
applyBuff( "crimson_vial" )
end,
},
crippling_poison = {
id = 3408,
cast = 1.5,
cooldown = 0,
gcd = "spell",
startsCombat = false,
essential = true,
texture = 132274,
readyTime = function () return buff.nonlethal_poison.remains - 120 end,
handler = function ()
applyBuff( "crippling_poison" )
end,
},
deadly_poison = {
id = 2823,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = false,
essential = true,
texture = 132290,
readyTime = function () return buff.lethal_poison.remains - 120 end,
handler = function ()
applyBuff( "deadly_poison" )
end,
},
death_from_above = {
id = 269513,
cast = 0,
cooldown = 30,
gcd = "off",
icd = 2,
spend = function() return talent.tight_spender.enabled and 22.5 or 25 end,
spendType = "energy",
pvptalent = "death_from_above",
startsCombat = false,
usable = function() return combo_points.current > 0, "requires combo points" end,
handler = function ()
spend( combo_points.current, "combo_points" )
end,
},
dismantle = {
id = 207777,
cast = 0,
cooldown = 45,
gcd = "spell",
spend = 25,
spendType = "energy",
pvptalent = "dismantle",
startsCombat = false,
handler = function ()
applyDebuff( "target", "dismantle" )
end,
},
-- Finishing move that dispatches the enemy, dealing damage per combo point: 1 point : ${$m1*1} damage 2 points: ${$m1*2} damage 3 points: ${$m1*3} damage 4 points: ${$m1*4} damage 5 points: ${$m1*5} damage$?s193531|((s394320|s394321)&!s193531)[ 6 points: ${$m1*6} damage][]$?s193531&(s394320|s394321)[ 7 points: ${$m1*7} damage][]
dispatch = {
id = 2098,
cast = 0,
cooldown = 0,
gcd = "totem",
school = "physical",
spend = function() return ( talent.tight_spender.enabled and 31.5 or 35 ) - 5 * ( buff.summarily_dispatched.up and buff.summarily_dispatched.stack or 0 ) end,
spendType = "energy",
startsCombat = true,
usable = function() return combo_points.current > 0, "requires combo points" end,
handler = function ()
if talent.alacrity.enabled and combo_points.current > 4 then
addStack( "alacrity", 15, 1 )
end
if talent.summarily_dispatched.enabled and combo_points.current > 5 then
addStack( "summarily_dispatched", ( buff.summarily_dispatched.up and buff.summarily_dispatched.remains or nil ), 1 )
end
removeBuff( "storm_of_steel" )
removeBuff( "echoing_reprimand_" .. combo_points.current )
spend( combo_points.current, "combo_points" )
end,
},
-- Throws a distraction, attracting the attention of all nearby monsters for $s1 seconds. Usable while stealthed.
distract = {
id = 1725,
cast = 0,
cooldown = 30,
gcd = "totem",
school = "physical",
spend = function () return 30 * ( talent.rushed_setup.enabled and 0.8 or 1 ) * ( 1 + conduit.rushed_setup.mod * 0.01 ) end,
spendType = "energy",
startsCombat = false,
texture = 132289,
handler = function ()
end,
},
-- Talent: Strike at an enemy, dealing $s1 Physical damage and empowering your weapons for $d, causing your Sinister Strike,$?s196937[ Ghostly Strike,][]$?s328305[ Sepsis,][]$?s323547[ Echoing Reprimand,][]$?s328547[ Serrated Bone Spike,][] Ambush, and Pistol Shot to fill your combo points, but your finishing moves consume $343145s1% of your current health.
dreadblades = {
id = 343142,
cast = 0,
cooldown = 90,
gcd = "spell",
spend = 50,
spendType = "energy",
talent = "dreadblades",
startsCombat = true,
toggle = "cooldowns",
cp_gain = function () return combo_points.max end,
handler = function ()
applyDebuff( "player", "dreadblades" )
gain( action.dreadblades.cp_gain, "combo_points" )
end,
},
-- Talent: Deal $s1 Arcane damage to an enemy, extracting their anima to Animacharge a combo point for $323558d. Damaging finishing moves that consume the same number of combo points as your Animacharge function as if they consumed $s2 combo points. |cFFFFFFFFAwards $s3 combo $lpoint:points;.|r
echoing_reprimand = {
id = function() return talent.echoing_reprimand.enabled and 385616 or 323547 end,
cast = 0,
cooldown = 45,
gcd = "totem",
school = "arcane",
spend = 10,
spendType = "energy",
startsCombat = true,
toggle = "cooldowns",
cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 2 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end,
handler = function ()
-- Can't predict the Animacharge, unless you have the talent/legendary.
if legendary.resounding_clarity.enabled or talent.resounding_clarity.enabled then
applyBuff( "echoing_reprimand_2", nil, 2 )
applyBuff( "echoing_reprimand_3", nil, 3 )
applyBuff( "echoing_reprimand_4", nil, 4 )
applyBuff( "echoing_reprimand_5", nil, 5 )
end
gain( action.echoing_reprimand.cp_gain, "combo_points" )
end,
copy = { 385616, 323547 },
},
-- Talent: Increases your dodge chance by ${$s1/2}% for $d.$?a344363[ Dodging an attack while Evasion is active will trigger Mastery: Main Gauche.][]
evasion = {
id = 5277,
cast = 0,
cooldown = 120,
gcd = "off",
school = "physical",
talent = "evasion",
startsCombat = false,
toggle = "defensives",
handler = function ()
applyBuff( "evasion" )
end,
},
-- Talent: Performs an evasive maneuver, reducing damage taken from area-of-effect attacks by $s1% $?s79008[and all other damage taken by $s2% ][]for $d.
feint = {
id = 1966,
cast = 0,
cooldown = 15,
gcd = "totem",
school = "physical",
talent = "feint",
spend = function () return talent.nimble_fingers.enabled and 25 or 35 + conduit.nimble_fingers.mod end,
spendType = "energy",
startsCombat = false,
texture = 132294,
handler = function ()
applyBuff( "feint" )
end,
},
-- Talent: Strikes an enemy, dealing $s1 Physical damage and causing the target to take $s3% increased damage from your abilities for $d. |cFFFFFFFFAwards $s2 combo $lpoint:points;.|r
ghostly_strike = {
id = 196937,
cast = 0,
cooldown = 35,
gcd = "totem",
school = "physical",
spend = 30,
spendType = "energy",
talent = "ghostly_strike",
startsCombat = true,
cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end,
handler = function ()
applyDebuff( "target", "ghostly_strike" )
gain( action.ghostly_strike.cp_gain, "combo_points" )
end,
},
-- Talent: Gouges the eyes of an enemy target, incapacitating for $d. Damage will interrupt the effect. Must be in front of your target. |cFFFFFFFFAwards $s2 combo $lpoint:points;.|r
gouge = {
id = 1776,
cast = 0,
cooldown = 20,
gcd = "totem",
school = "physical",
spend = function () return talent.dirty_tricks.enabled and 0 or 25 end,
spendType = "energy",
talent = "gouge",
startsCombat = true,
cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end,
handler = function ()
applyDebuff( "target", "gouge" )
gain( action.gouge.cp_gain, "combo_points" )
end,
},
-- Talent: Launch a grappling hook and pull yourself to the target location.
grappling_hook = {
id = 195457,
cast = 0,
cooldown = function () return ( 1 - conduit.quick_decisions.mod * 0.01 ) * ( talent.retractable_hook.enabled and 45 or 60 ) end,
gcd = "off",
school = "physical",
talent = "grappling_hook",
startsCombat = false,
texture = 1373906,
handler = function ()
end,
},
-- Talent: Increase the remaining duration of your active Roll the Bones combat enhancements by $s1 sec.
keep_it_rolling = {
id = 381989,
cast = 0,
cooldown = 420,
gcd = "off",
school = "physical",
talent = "keep_it_rolling",
startsCombat = false,
toggle = "cooldowns",
buff = "roll_the_bones",
handler = function ()
for _, v in pairs( rtb_buff_list ) do
if buff[ v ].up then buff[ v ].expires = buff[ v ].expires + 30 end
end
end,
},
kick = {
id = 1766,
cast = 0,
cooldown = 15,
gcd = "off",
school = "physical",
startsCombat = true,
toggle = "interrupts",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
interrupt()
end
},
kidney_shot = {
id = 408,
cast = 0,
cooldown = 20,
gcd = "spell",
spend = function () return ( talent.rushed_setup.enabled and 20 or 25 ) * ( 1 - 0.1 * talent.tight_spender.rank ) * ( 1 + conduit.rushed_setup.mod * 0.01 ) end,
spendType = "energy",
startsCombat = true,
texture = 132298,
usable = function ()
if target.is_boss then return false, "kidney_shot assumed unusable in boss fights" end
return combo_points.current > 0, "requires combo points"
end,
handler = function ()
if talent.alacrity.enabled and combo_points.current > 4 then
addStack( "alacrity", nil, 1 )
end
applyDebuff( "target", "kidney_shot", 1 + combo_points.current )
if pvptalent.control_is_king.enabled then
gain( 10 * combo_points.current, "energy" )
end
spend( combo_points.current, "combo_points" )
end,
},
-- Talent: Teleport to an enemy within 10 yards, attacking with both weapons for a total of $<dmg> Physical damage over $d. While Blade Flurry is active, also hits up to $s5 nearby enemies for $s2% damage.
killing_spree = {
id = 51690,
cast = 0,
cooldown = 120,
gcd = "totem",
school = "physical",
talent = "killing_spree",
startsCombat = true,
toggle = "cooldowns",
handler = function ()
applyBuff( "killing_spree" )
setCooldown( "global_cooldown", 2 )
end,
},
marked_for_death = {
id = 137619,
cast = 0,
cooldown = 60,
gcd = "off",
school = "physical",
talent = "marked_for_death",
startsCombat = false,
texture = 236364,
toggle = "cooldowns",
usable = function ()
return combo_points.current <= settings.mfd_points, "combo_point (" .. combo_points.current .. ") > user preference (" .. settings.mfd_points .. ")"
end,
cp_gain = function () return 5 end,
handler = function ()
gain( action.marked_for_death.cp_gain, "combo_points" )
end,
},
-- Coats your weapons with a Non-Lethal Poison that lasts for 1 hour. Each strike has a 30% chance of poisoning the enemy, clouding their mind and slowing their attack and casting speed by 15% for 10 sec.
numbing_poison = {
id = 5761,
cast = 1,
cooldown = 0,
gcd = "spell",
startsCombat = false,
readyTime = function () return buff.nonlethal_poison.remains - 120 end,
handler = function ()
applyBuff( "numbing_poison" )
end,
},
-- Draw a concealed pistol and fire a quick shot at an enemy, dealing ${$s1*$<CAP>/$AP} Physical damage and reducing movement speed by $s3% for $d. |cFFFFFFFFAwards $s2 combo $lpoint:points;.|r
pistol_shot = {
id = 185763,
cast = 0,
cooldown = 0,
gcd = "totem",
school = "physical",
spend = function () return 40 - ( buff.opportunity.up and 20 or 0 ) end,
spendType = "energy",
startsCombat = true,
cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + ( talent.quick_draw.enabled and buff.opportunity.up and 1 or 0 ) + ( buff.concealed_blunderbuss.up and 2 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end,
handler = function ()
gain( action.pistol_shot.cp_gain, "combo_points" )
removeStack( "opportunity" )
removeBuff( "deadshot" )
removeBuff( "concealed_blunderbuss" ) -- Generating 2 extra combo points is purely a guess.
removeBuff( "greenskins_wickers" )
removeBuff( "tornado_trigger" )
end,
},
-- Talent: Roll the dice of fate, providing a random combat enhancement for $d.
roll_the_bones = {
id = 315508,
cast = 0,
cooldown = 45,
gcd = "totem",
school = "physical",
spend = 25,
spendType = "energy",
talent = "roll_the_bones",
startsCombat = false,
handler = function ()
for _, name in pairs( rtb_buff_list ) do
removeBuff( name )
end
if azerite.snake_eyes.enabled then
applyBuff( "snake_eyes", nil, 5 )
end
applyBuff( "rtb_buff_1" )
if buff.loaded_dice.up then
applyBuff( "rtb_buff_2" )
removeBuff( "loaded_dice" )
end
if pvptalent.take_your_cut.enabled then
applyBuff( "take_your_cut" )
end
end,
},
sap = {
id = 6770,
cast = 0,
cooldown = 0,
gcd = "totem",
school = "physical",
spend = function () return ( talent.dirty_tricks.enabled and 0 or 35 ) * ( 1 + conduit.rushed_setup.mod * 0.01 ) end,
spendType = "energy",
talent = "sap",
startsCombat = false,
handler = function ()
applyDebuff( "target", "sap" )
end,
},
-- Talent: Infect the target's blood, dealing $o1 Nature damage over $d. If the target survives its full duration, they suffer an additional $328306s1 damage and you gain $s6 use of any Stealth ability for $347037d. Cooldown reduced by $s3 sec if Sepsis does not last its full duration. |cFFFFFFFFAwards $s7 combo $lpoint:points;.|r
sepsis = {
id = function() return talent.sepsis.enabled and 385408 or 328305 end,
cast = 0,
cooldown = 90,
gcd = "totem",
school = "nature",
spend = 25,
spendType = "energy",
startsCombat = true,
toggle = "cooldowns",
cp_gain = function() return debuff.dreadblades.up and combo_points.max or ( 1 + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) ) end,
handler = function ()
applyBuff( "sepsis_buff" )
applyDebuff( "target", "sepsis" )
debuff.sepsis.exsanguinated_rate = 1
gain( action.sepsis.cp_gain, "combo_points" )
end,
copy = { 385408, 328305 }
},
-- Talent: Allows use of all Stealth abilities and grants all the combat benefits of Stealth for $d$?a245687[, and increases damage by $s2%][]. Effect not broken from taking damage or attacking.$?s137035[ If you already know $@spellname185313, instead gain $394930s1 additional $Lcharge:charges; of $@spellname185313.][]
shadow_dance = {
id = 185313,
cast = 0,
charges = 1,
cooldown = 60,
recharge = 60,
gcd = "off",
talent = "shadow_dance",
startsCombat = false,
toggle = "cooldowns",
nobuff = "shadow_dance",
usable = function () return not stealthed.all, "not used in stealth" end,
handler = function ()
applyBuff( "shadow_dance" )
if talent.shot_in_the_dark.enabled then applyBuff( "shot_in_the_dark" ) end
if talent.master_of_shadows.enabled then applyBuff( "master_of_shadows" ) end
if azerite.the_first_dance.enabled then
gain( 2, "combo_points" )
applyBuff( "the_first_dance" )
end
end,
},
shadowstep = {
id = 36554,
cast = 0,
charges = 1,
cooldown = 30,
recharge = 30,
gcd = "off",
talent = "shadowstep",
startsCombat = false,
texture = 132303,
handler = function ()
applyBuff( "shadowstep" )
setDistance( 5 )
end,
},
shiv = {
id = 5938,
cast = 0,
cooldown = 25,
gcd = "totem",
school = "physical",
spend = function () return legendary.tiny_toxic_blade.enabled and 0 or 20 end,
spendType = "energy",
talent = "shiv",
startsCombat = true,
cp_gain = function () return 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) end,
handler = function ()
gain( action.shiv.cp_gain, "combo_point" )
removeDebuff( "target", "dispellable_enrage" )
end,
},
shroud_of_concealment = {
id = 114018,
cast = 0,
cooldown = 360,
gcd = "totem",
school = "physical",
startsCombat = false,
toggle = "interrupts",
handler = function ()
applyBuff( "shroud_of_concealment" )
end,
},
sinister_strike = {
id = 193315,
known = 1752,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 45,
spendType = "energy",
startsCombat = false,
texture = 136189,
cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) ) end,
-- 20220604 Outlaw priority spreads bleeds from the trinket.
cycle = function ()
if buff.acquired_axe_driver.up and debuff.vicious_wound.up then return "vicious_wound" end
end,
handler = function ()
removeStack( "snake_eyes" )
gain( action.sinister_strike.cp_gain, "combo_points" )
end,
copy = 1752
},
-- Finishing move that consumes combo points to increase attack speed by $s1%. Lasts longer per combo point. 1 point : 12 seconds 2 points: 18 seconds 3 points: 24 seconds 4 points: 30 seconds 5 points: 36 seconds$?s193531|((s394320|s394321)&!s193531)[ 6 points: 42 seconds][]$?s193531&(s394320|s394321)[ 7 points: 48 seconds][]
slice_and_dice = {
id = 315496,
cast = 0,
cooldown = 0,
gcd = "totem",
school = "physical",
spend = function() return talent.tight_spender.enabled and 22.5 or 25 end,
spendType = "energy",
startsCombat = false,
texture = 132306,
usable = function() return combo_points.current > 0, "requires combo points" end,
handler = function ()
if talent.alacrity.enabled and combo_points.current > 4 then
addStack( "alacrity", 15, 1 )
end
applyBuff( "slice_and_dice" )
spend( combo_points.current, "combo_points" )
end,
},
smoke_bomb = {
id = 212182,
cast = 0,
cooldown = 180,
gcd = "spell",
pvptalent = "smoke_bomb",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
applyBuff( "smoke_bomb" )
end,
},
sprint = {
id = 2983,
cast = 0,
cooldown = function () return talent.improved_sprint.enabled and 60 or 120 end,
gcd = "off",
startsCombat = false,
texture = 132307,
toggle = "interrupts",
handler = function ()
applyBuff( "sprint" )
end,
},
-- Conceals you in the shadows until cancelled, allowing you to stalk enemies without being seen. $?s14062[Movement speed while stealthed is increased by $s3% and damage dealt is increased by $s4%.]?s108209[ Abilities cost $112942s1% less while stealthed. ][]$?s31223[ Attacks from Stealth and for $31223s1 sec after deal $31665s1% more damage.][]
stealth = {
id = 1784,
cast = 0,
cooldown = 2,
gcd = "off",
school = "physical",
startsCombat = false,
texture = 132320,
usable = function ()
if time > 0 then return false, "cannot stealth in combat"
elseif buff.stealth.up then return false, "already in stealth"
elseif buff.vanish.up then return false, "already vanished" end
return true
end,
handler = function ()
applyBuff( "stealth" )
if talent.take_em_by_surprise.enabled then applyBuff( "take_em_by_surprise" ) end
if conduit.cloaked_in_shadows.enabled then applyBuff( "cloaked_in_shadows" ) end
if conduit.fade_to_nothing.enabled then applyBuff( "fade_to_nothing" ) end
end,
},
thistle_tea = {
id = 381623,
cast = 0,
charges = 3,
cooldown = 60,
recharge = 60,
icd = 1,
gcd = "off",
school = "physical",
spend = -100,
spendType = "energy",
talent = "thistle_tea",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
applyBuff( "thistle_tea" )
end,
},
tricks_of_the_trade = {
id = 57934,
cast = 0,
cooldown = 30,
gcd = "off",
talent = "tricks_of_the_trade",
startsCombat = false,
usable = function() return group, "requires an ally" end,
handler = function ()
applyBuff( "tricks_of_the_trade" )
end,
},
-- Allows you to vanish from sight, entering stealth while in combat. For the first $11327d after vanishing, damage and harmful effects received will not break stealth. Also breaks movement impairing effects.
vanish = {
id = 1856,
cast = 0,
charges = 1,
cooldown = 120,
recharge = 120,
gcd = "off",
startsCombat = false,
texture = 132331,
disabled = function ()
return not settings.solo_vanish and not ( boss and group ), "can only vanish in a boss encounter or with a group"
end,
toggle = "cooldowns",
handler = function ()
applyBuff( "vanish" )
applyBuff( "stealth" )
if conduit.cloaked_in_shadows.enabled then applyBuff( "cloaked_in_shadows" ) end
if conduit.fade_to_nothing.enabled then applyBuff( "fade_to_nothing" ) end
if legendary.invigorating_shadowdust.enabled then
for name, cd in pairs( cooldown ) do
if cd.remains > 0 then reduceCooldown( name, 20 ) end
end
end
end,
},
wound_poison = {
id = 8679,
cast = 1.5,
cooldown = 0,
gcd = "spell",
startsCombat = false,
essential = true,
texture = 134197,
readyTime = function () return buff.lethal_poison.remains - 120 end,
handler = function ()
applyBuff( "wound_poison" )
end,
},
--[[ apply_poison = {
name = _G.MINIMAP_TRACKING_VENDOR_POISON,
cast = 1.5,
cooldown = 0,
gcd = "spell",
startsCombat = false,
essential = true,
texture = function ()
if buff.lethal_poison.down or level < 33 then
return state.spec.assassination and level > 12 and class.abilities.deadly_poison.texture or class.abilities.instant_poison.texture
end
if level > 32 and buff.nonlethal_poison.down then return class.abilities.crippling_poison.texture end
end,
bind = function ()
if buff.lethal_poison.down or level < 33 then
return state.spec.assassination and level > 12 and "deadly_poison" or "instant_poison"
end
if level > 32 and "nonlethal_poison" then return "crippling_poison" end
end,
usable = function ()
return buff.lethal_poison.down or level > 32 and buff.nonlethal_poison.down, "requires missing poison"
end,
handler = function ()
if buff.lethal_poison.down then
applyBuff( state.spec.assassination and level > 12 and "deadly_poison" or "instant_poison" )
elseif level > 32 then applyBuff( "crippling_poison" ) end
end,
copy = "apply_poison_actual"
}, ]]
} )
-- Override this for rechecking.
spec:RegisterAbility( "shadowmeld", {
id = 58984,
cast = 0,
cooldown = 120,
gcd = "off",
usable = function () return boss and group end,
handler = function ()
applyBuff( "shadowmeld" )
end,
} )
spec:RegisterOptions( {
enabled = true,
aoe = 3,
nameplates = true,
nameplateRange = 8,
damage = true,
damageExpiration = 6,
potion = "phantom_fire",
package = "Outlaw",
} )
spec:RegisterSetting( "mfd_points", 3, {
name = "|T236340:0|t Marked for Death Combo Points",
desc = "The addon will only recommend |T236364:0|t Marked for Death when you have the specified number of combo points or fewer.",
type = "range",
min = 0,
max = 5,
step = 1,
width = "full"
} )
spec:RegisterSetting( "dirty_gouge", false, {
name = "Use |T132155:0|t Gouge with Dirty Tricks",
desc = "If checked, the addon will recommend |T132155:0|t Gouge when Dirty Tricks is talented and you do not have " ..
"enough energy to Sinister Strike. |cFFFFD100This may be problematic for positioning|r, as you'd need to be in front of your " ..
"target.\n\nThis setting is unchecked by default.",
type = "toggle",
width = "full",
} )
spec:RegisterSetting( "solo_vanish", true, {
name = "Allow |T132331:0|t Vanish when Solo",
desc = "If unchecked, the addon will not recommend |T132331:0|t Vanish when you are alone (to avoid resetting combat).",
type = "toggle",
width = "full"
} )
spec:RegisterSetting( "allow_shadowmeld", nil, {
name = "Allow |T132089:0|t Shadowmeld",
desc = "If checked, |T132089:0|t Shadowmeld can be recommended for Night Elves when its conditions are met. Your stealth-based abilities can be used in Shadowmeld, even if your action bar does not change. " ..
"Shadowmeld can only be recommended in boss fights or when you are in a group (to avoid resetting combat).",
type = "toggle",
width = "full",
get = function () return not Hekili.DB.profile.specs[ 260 ].abilities.shadowmeld.disabled end,
set = function ( _, val )
Hekili.DB.profile.specs[ 260 ].abilities.shadowmeld.disabled = not val
end,
} )
spec:RegisterPack( "Outlaw", 20221104.1, [[Hekili:T31EZTTrs(plQsv0KwY08HPZMTevvX2j75Cx2KBLVB)pbbcmucRab4IhswxXIF2VU7zWG5jaLSu0D1D1URJxIb90tp9JFDpnMCX0l(YfNhhwXU4VoBYSztNo5DJNmDYIfZU48Q73YU48THr3eEf8xYc3a)5VvxLgEh(Z3NMhgJVEzEDre8ORRQ2w(NF7BVkP666vJJY382YKn1PHvj5zrfHRRW))rV9IZxvNKw95Slwzo3xCEyD115fxC(5jB(iqYK4ygFCSYOlo)IZttkRkjMMToSoTc(R)vArWYcxLYIV4d8XwKSfN2lo)VXkRyHPvxV)YK17VCBEzzcmW9xomlF)L3wNMXkcPFGLX2KWkHXLT)sG7xfwncyOioDeu5IkGB7A((CwfROOEB1(lZj6KNgNFh83QGPlmnn)U9xcIHnjzxHZemy(maZ7DjixwDDy1fNdeeEus4fNFemE(CZIhdeOLLUjj6gKFMBWp5Bb2Lv1oWBdbkbpf)BP1W)OOAvWQ61RHj909xoB)Lda5X(lHPc)1XRkGT2YKy246TkpROoJToV4kgS3MfbSeloyvADwmRyvDz5yblqVbm8kyazvJxhMfa8EW1HB2WkAh0UDTty5n1PPbHzXbrfWg0Q8mwjn3JCo9jz3MCvEbOyLDvq51HGaoUUSYnTRkQzbRyGii7QgAoIpefXWYgXaxauxKalUQcwyzDHumqp7QcKp3Wsz4VBPTvKNMU)Yp8L9xE8(l)l)kOfuGB4zxHQyIjdyM07HNaILcAdhup(qJm)K9x(Lp0OmCUCXDcNsNN9XMN9HwrpTfhWTqXfvbXgOUX7EW6gOMFEW2Cq3SCmyLLeLa6YNXfqh7tdbmEkU6E(4wmrzxduvIRtQavM6Sksripo2NUIVbHBw08Ill65CvKc2MWe00bN2PW0oYy)4NYW9pqIb)VRyW6yDnU98JBaPgic)4Vd)mNcWMk8hfSSxbJIl)it0pISeUjbu43aMsUjgEx49QY9qIMb46nHMCq6V4Bs6ZxwrBd2e(1GYTmKdFJZnG3qsB6b5B3MxuvNLuDp9OxtpsiF)N1GlJG4IW70LT9yQoszhWTPVWUchfB9AgS6ULf09AXyN6NtYsWTKqqydJr1tnUlHQ851Ot1BzfRbVO0MdOfuxYDwNJVbotGHsDwkRe(91OfZhQ(j41VojcjEkSPbpOeOvkSWwbuFXX4mOUtUMyf9DY37yNSG5DV0lPuCS3eAy8kw1Dmgx0ZUNuRdJVNBw5rycETxyia)rXAlSQITbd)GbCQlzcjakx5l1tq97RclI5cP81c7ag4f6UqiwdUE)(hIM7HSAjLN1PauIuoIaYZRMNv7NkTVH170ofiK)PouPMDmpUozhNcRsW58h)eF1)ZkZR0qCkkf(tpePa9AGQn6HkectbUpxLggZcwNwxuCVsO2IWK4a2TOjxi6NdzSZGhorXot9vv8ZrYHJLwS3KqUPalQciCudNQlg(7u0caiwvYw0CsWCNGcJeGMnRbqaH2sxZIUbn6r1Nywe4IbnFy8yvL5BqdYpzydvEp4uiUnWui(s)mX7Q6hQRPa8Dqz8pyiJBvz8a7bWbeW)7biAqoMqXmOGsB6edc38(rHiwdpeikUKEztmLTCvJ4AST2(HWH83IMdtCKhedIyNJPx3e2xllYdgpEvyjlqlc(0fKYJ45GxaMcxhwefMXcQYlGOGv0uqOhmE(260sM6eJdCH6attU66QYG)rD8vBqkzm23Ro2vHxfKVgqAbbMk1hj8IGwnhiUeMV89YRQWGqGpJ7zXy0aGX)AsMXK5teVjS4g8TZlabuiOWOi98zDUqHFckz4(oWXGAMdi4kkXGvYQKS4XBbqC1PGhEm5aGj0Jalh2T5OJiyCL5PepinQB491GF7RP8PKa8mtsrxiyIcrUHgdB0HG)dwqbaDrLRfUxs2STac4ghym0wMYHezUR4LstdnaCAIDfF9ZDs4zUcmjx6PjrmkfI4emBuvcVgIuFn3nThYwjnm7lFsEqfwbWOIiROJYBySTIGlFSaT2IzOxCia82t4jE(3(DU)v6hqCje4K)c42oR8gyDRaBHid3ln)DcxrqFipYjSX6Bu4WgxLSbTCH1oJuwN3GaNZhUGy0kTFhxfCOAkwxjzSG7atty96eXyxdBud4ErAtwJeJ9lYu7WMyTCf6zGC8d1vxJY0aCBpPeT6iKQk(rmemUCAyaIrxtttsUg98fi)fmuFRYNssrILq5DjRbfraoY1Mzg3xEaJ8Q53P3OJEg2MvcCbaAH0cYZJT8mfNuUnSk6Alx8ya3(S5(OaPm3MtfDbVilZoww9gnxVQyXKPWQOtQHXcZLxQvO8GU1i2GaMlccllH)Bsw7EpmztAveJri9evHCQPYbPxXfJ8ABSmKynAtQxtGB4nTVTENKBqBUJ6jvESVcOCCFvT54Em)4XtvkKf49mibmC4jD7QUfTb)uXQ7VkznRlVO1Ob4X75ubqCdZzmjK5K8p6(iicTqZcvEDeLvJ3AT4qKheIhyxZq5X0r3dOGxMVabQj9EXyTCHAlQKvll8gWr4MGvW7wxSTiPuTiGDlnD5D0st2SmjAZUJxw1rhTycIdZ4U5mXy8)lXFQL43g2KSIjSlhzy(jUeOPOLiIMCyaBs(Vyc0oQ1PHk4aRiKZrqcMnjNZXnHWEqhLAa5E8cBUtyJ3s6i2O2kY4eEfHUKqpOAf0Krm)1b1s3fn5rPelIzBMItNvh4xjsU)YFSuq0t4j1V)Y)ZqEru4P2hIof5aG5OyBQKAmdXLqfLd3pjGXnf4sa4TP4BA0Gt2FD9NKvqPPSX9xCSoSngjH0(GiKTPYixLOO)Ya1rrc(w2D7DRTBnlxvfXrHnC8Q0S3pwhjjSR0JdlMokYsJ7jZ8o1opQdmjvxaQf24J8NmSRc0ONiOmnCH3TFNNG)(l)jrg(8e)YYRu8ijoOb6hDwTSwzWqLQc8nw8aLKXCIsYdGyb17TKMJmPJRTn6SbukmvdOlQy)NzUDOxKJoQ1LZLKph6CwKphALBE8nzuWaz5xDxP6r2AF(SfLP2kDaznsHdiLvTsAcT1FZbky7YxrY6iWdW0XlCGpTJYB1As5cn8P6cZ2deuS6AL9f5xvZSK(6NGO1zzn1(i7(myZesh0wiEYDu9skZs2Ye4dGSmAmDsZVJHvY)lF5tJ3F5)rjRbir89uKO1IOA8tyfpKdj3KxOCMsHz3JpECBPm9z0)zYGUHbVlb13i5esl55lKX(kq15tOI6GCfeFJhxCvEzPRjU)YpoFcjWmFACDdektZ7h7(XHAMi1R1gG2jvmPFdQo0PL1k(bf59Hd9xBXWJo5Cz4n83z2h90pQEiCCGu)RjItugRbPufUbEffbrbfgnfQXZ1oPNari6MZqzANWZjddunA6BM9fEqjcFgVCKIis3LtN8Dui8d)e5MUb2gQk)fiL(HZW)8oNy9hjSOiRpZLrZmn2jAdlOc6ij8UU7sJVJcFQEGJoRkJ7dpHOP65MqNSoVJiWtvzu)Xk50yw7z4BMpIYHO3LU2enZgn5dPlyMiYblZh2BaALehvLDcz6rDAQ3g)NhrE(ehImhib48QetMjwCl3Z1LKv2NvsG3OpAixYz5fBctXyixLeXnpahQcWUOvlDqO0lVj8FGk3F8tLJDdF)qkwqhEt9bmR7C)nYtYWlCtQnAyvu3Z8ctrDqc6igs3aJCw2Gz(t34Hj(6oE0Jwckx1SORZXPVGTTizd4ruleW7TftLSTLjAsiLhvalgSdzaSkGHzYnadGLkTaMfupNmTKh5VBbxN5g5ee)W(B2kLs67BiJ6tWjeecYChlCBEg3DL2gwN5uBusVnm(rApZFD2foM0pn7jt087GTZqfI7LfQGQLlY5zPoxbqIVCuSl6RKcVM0euyFLzK4F)PPisVkppofvTb1MOkFZ38jDYMTt)2C6FIZS2HTqZtW6AmFYwUbhM250VIvaQQOpoZHPDe9Rtky8d1XyuFV6OWIYwwveMgerDRH(qnJjXX0Cxr42seFglLfvvKxwbw1ras1kq1kjuPNp6DK4K4Vts4QhiImUBJyjkwxs)g2dpWdCoJYb3nBXWkGmTQUapLj5jW4Fm4PX439xpifaVVGypUnUiYSEsn49EpUIVxkPtYIlJaWKyN8uwb(LuKT2pdzD)oG46Lr)ZAIdd)kRdBhSRjeDwtye6SzDG8nBAVwfXzxdczkthen9veODcQeGrsCaKRx8nSIORtyRDLjSMrINxs1xBCo4SSOMLgCvyrbOWbjitadigQZctWRWoiAjv31yqHcWwoaStswZcExhYTwTqVVVIxuVdbzrFfragr2nSQPgyO(eVX65btip2LI0tQlrAayLaljekuzAoitvOt7IVl03uqi(7mUA64RdldqZ5XqYWbXBlDlrWs4W70g)NZ2bpPZEqtQX6CMLeu0ajnnFtFNM95nnPJdG5(7Pm5bOxjooAPJxk(QUd3QM(eZbVivAiamDxRiFNpkVmb9jVDC8PMkBFa5simKCv11g7vxd(9X8La5(nQnEXsQJHAwy6dJ0zoaqOa4Z7PwilkGCgB33vLxNClsnt7jDKznLILTEnKjYT4zRb4jb)zrqOlW8m3OrpoKsMBbofzJf9PeyD(O2ff43b4l5Py6ru9OPS3rrnYCRUFpV)QrKpH8ZTbM(Cy1EVv0aZUoVjd7o66NUEEhVUM6ewRtzOdTMpXSGi9ZVd7LLAr92130crKE7s(N6v)wANeYEkNkyUjElhh53ph2uUY)fAvCc5XVSgZm53AfpkDKp4Wm6MsELEWIiDhRPeOuNQ9UJ51yLkN0NAZIKx(h6epqWRQEx6uy2ig6yVs9re3XtmW6zuro5pxk8vFUgIfne(gYv)qmF8lgpLNL6lpVfCXlhADaFybvXcsRb(zlKRk4or8P7v1CwCD6oP7Jd7h3ULQh4hoFFZN6MSvZvR4DBRrI(uACOCc(xzRHeNPkUiFprH8lZbuPyTixxXRNpJE1nHiAz(GDGAZrE4b4V3GFtjuO1aPfSzCJUg)Jy6D1frwh5J)Ykx3EEhjvnwIu9B1(EyegKNN9P2UQ4eXhF2Djin4nV66I8n07VLe5IKEvxxoGhT4ak9bA8jtH(nskJGvj5jwfoKwtgptsoxwe8ZRa)CT0Sl82fAd6UCMt7F)VZJcYvauYXQMZt0p5hPgoggmMTA09YATJFkt0(fRPE7M7MSVcSiAwrdJ(0DAlZUOqN)7430f6Wf)SC1ucF8UKg6Vm4w1ahcdDWffY9glU5p133wOsjR65RxlSoomcxeQZyJwI8HgN6KP3tF9TEjcmhwonOk7e2SvcYatdqblgB99IskrNlOn83iIZpQqBFNKBVpIzidB35ItYH(rrIinh0cTs0QoJf7RNTa49eypSbnv)wSVlSiduXaFaFbNKKnOEIixWxj((RFf2IZ8fAZxhuyDv(g0CIm1Zat9X7)L)Te8yBN)NrRHmyUOh)QE(IIFf3rxFdRzdhg(WPFDK3zZP9qZC0PXsFuU3AzBVs6PO3MZ47mMr3v6TzA6UoW9rBNvi2qoDyuEHBk3AiBqvBl8dKIFt7P7)fh63YpuKVnnCVDWtdp2Bl(0NUN3M)XAg81DqhOm2xFwziT7RDS6rUhrQApajUj3EqN(VT94b0Qa9jN614(B2lG)z04SKTNjpTmR5m8(xmPP)z(5sA6FgFQKMF)Z(m8NEX2V(HxSzE60)GCqjMUzp7(09pfpzo1N6bnKzBxziS81EJwK)LZXXu)AIpxEoSMs7gSWqo6O1lmj6Sj)HVoMzAj9ucR0I4pD4kNBbzvC0o2hNKK((pXjlQBbas8U2NBKf1DoKUW7WpXNx9GG8ykyB3)TlzSToI)pMtl1C3BG(NeVd4qNH)37kX0dUGaAFIVge35N)RLY4FqsipHhEsKqov8PdO8HP37xwyE6D2scFNVNPCW0ZYbCGEVYmMC)N9N5SAcu8PiTw3aeF6OSNyGpbuE6Zrw(DtA1swAqyxvZuv3(ZKAnsS330KI7VKUNcHhJ34e5RtsLDRr5yzLfoE5B9DnMS)xCnAtWyNyDBwSC6KtswV0UrHoB2c30S9dTbFrVix3TZlIt30v0neUFObYBhRJ5i30dGD30w)BI3bPNrsi(PyC6CpCV2NfRFI0E5o8l4)572F5329nPKBwkLFFh2lZvF73PKssdlp8MJexahP3iPC()f5gmuL7AAjItWgGAz7DvWj0N4Xs5T24PZgm8iRJma(TwV(oRx8GJC6Yy3UJ66aLgPrypaTBOHXDMWOr72jz7LZgWzARlzYbIJ9x9cMK2uEMVgd9l8nBExXwGRZX5SLZo2EZGFCrNTCXeq85o)b52H(pVBhrn334JNbo6grIMx47nq)IoZw5YHO7SLQFawVXs69MHooGUxpuiUAlw(UDovOhjeH(Agf45UVo905lsm)0D7c(aKy5Bxs3XIORQE(oUh4ELC6clLKd9Ma8bWN8D2PiBscCxFJed88KMart9ScaZkAj8YEl(5xyy12AcPH)(BgCB7cFYeH2QRl(WZMESqd35fEOk3vOF37XzsryocHJEeV2x08w3J)MrXL9sDU(asC)F2e9oru6qQdt)64dPUJJKh8dU4yTJK3Mc0f2N6VBC)8P(iTRJpbIMME0SfPeXRl5nq6jAheo3iWUTrpB60b(Bx0D70ATKtNo1yUaotVRoXzPZUc90LZTPb2bNeUnVzfA)ow9Ejh3u)P6TBxhFUDwtdpqljV)M6mtBk32xKs)t6buAqD4OxefMKoFM3xtUloEHn3O0Vf(yNHDmN(qU1xCUV1LH0b8ltxt2RC0PyzGFPRvJtEM9wHSPjfIphnm5PZg9eYAorv(UbCe1gFVP2ZQAhnEYArtpU0HNeftTx6Mw0Hlk7wrJC4Canu4HrmhURpmIJIR)WB)WdBnbRb9ailxSB3H2tIVXUFepDj2lIijSvixk6bXbDMS4apDE4zt96I)fU3b71o2TRx3(yCHurfLYRbNQqQYokWMtNaNUCQDQLYKESBAi5JmBjqXMMsZaoQD)4jVn8CO8Q3gEUmg5mOZEhSx6jaS9aUUmBjja0vdlpHvwfdpKiIq8zElbPsJJTkahqhp3MblNmWY1oY3nv1X6sXubsvBvHgzo)g3MKKURJ3tejuvLIRKzu7MJ7YoN)qN3ZLJoBMjNPM9NthXAjNmyO30jg4cH9ely0ZTKnQxHI0mEqN8(G(l8L6qmADLbgllrfYCETh21AMVpyEFfQOtywSQgx0MVILuH)z3))LLhs8TplxIJ(L3hSqI7OWXf4OwaJtbFu(V4bAxLV8x3H2Ie1IQ44g4txA1PYPi4NVw3ruGgSCSDxsnVQEqcvdp4x2CBWH13t2s)Ww59xLgl9u5R4G9g4p82Huba(uzEIyOViouaR7)bi8yphmMoYvWOquQ8NJBSq7yCQNN4WhZbkoY04FOtChaf6OgJJAElBb4UD(qNpZs5ubBIJi0M(EgEe)TDCj1isI2vPHh1UJAQ5cGK75(dKV1(cEP5zkXSoKAXvt4saZVlqp23hHdgAdV5ux5fasNs9B)l31qq)ywM2kYEgUk)6vC4yjNKD28jVX3v73Gh1ISBDXoV8(iOK(1wTlfWJ(cUR7qbEV63e(XpmWAklw9l3pAz6X39zZAZl8)jCZ5zLJJQOrlaLvKM2GqELN2Ayd9xSEp5S5kL)HA58p74Plg1Lt7Zgo7noX5rLW13o1elF2T3yC9izg6noGZIok(rxgfnHuoD58jglXZM16V5z9UP7qqz7lBfVUkmdf7pDef8K23fDTr4uePQb3SU15A6KcNUG6idU(xR(9l(awS9FXXD27vxFQxxC9uBs7RkUZMzRK3EZP5QYbdD3QfYcJP)ZJ8VsDxLoz90oCu(kxvAidRFFUHTZXKMeH1Uf3ajnV8SlNlIj5cpNEDpeVXRFVftWVW0KLzZ4(yZKoZN4DkTD50CJRz9e5LSMfs5M7vnRCb0Uk1mFk4HiaVbM4Xi77IrR732)TxMugzCRPzlJ6H)SUCXSkSOEmaJl(SD7Caw69wL6677Ml64AfZznxDOuP2)KUMcVxNyEpXfNxQyDpjEVOVAZxS7RBmxBFFhck5WUZV8XDLNq3rwlBUkWq2PRJ73)NRHjdUCMxfmJjD2HoP2FIgoNuLghI9s(VT3Ax(CFZlnxC462r9GN7hexZ68D72nSRVvaz4c7hns4T2tBdCuxKvwHkhpIiQ76PBkio2QnDBmLD)VH2ovBtEGsZ72Ior7tYqVmk6jy5IB070IJE0IwhKU52FtOwEUzZvlc)VSzCAaF9xMlXRDCZHItxlLr4fa6e6wH4I)7d]] )