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