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.

2631 lines
110 KiB

-- HunterBeastMastery.lua
-- August 2025
-- Patch 11.2
if UnitClassBase( "player" ) ~= "HUNTER" then return end
local addon, ns = ...
local Hekili = _G[ addon ]
local class, state = Hekili.Class, Hekili.State
local PTR = ns.PTR
local spec = Hekili:NewSpecialization( 253, true )
---- Local function declarations for increased performance
-- Strings
local strformat = string.format
-- Tables
local insert, remove, sort, wipe = table.insert, table.remove, table.sort, table.wipe
-- Math
local abs, ceil, floor, max, sqrt = math.abs, math.ceil, math.floor, math.max, math.sqrt
-- Common WoW APIs, comment out unneeded per-spec
-- local GetSpellCastCount = C_Spell.GetSpellCastCount
-- local GetSpellInfo = C_Spell.GetSpellInfo
-- local GetSpellInfo = ns.GetUnpackedSpellInfo
-- local GetPlayerAuraBySpellID = C_UnitAuras.GetPlayerAuraBySpellID
local FindUnitBuffByID, FindUnitDebuffByID = ns.FindUnitBuffByID, ns.FindUnitDebuffByID
-- local IsSpellOverlayed = C_SpellActivationOverlay.IsSpellOverlayed
-- local IsSpellKnownOrOverridesKnown = C_SpellBook.IsSpellInSpellBook
-- local IsActiveSpell = ns.IsActiveSpell
-- Specialization-specific local functions (if any)
spec:RegisterResource( Enum.PowerType.Focus, {
barbed_shot = {
resource = "focus",
aura = "barbed_shot",
last = function ()
local app = state.buff.barbed_shot.applied
local t = state.query_time
return app + floor( ( t - app ) / 2 ) * 2
end,
interval = 2,
value = 5,
},
barbed_shot_2 = {
resource = "focus",
aura = "barbed_shot_2",
last = function ()
local app = state.buff.barbed_shot_2.applied
local t = state.query_time
return app + floor( ( t - app ) / 2 ) * 2
end,
interval = 2,
value = 5,
},
barbed_shot_3 = {
resource = "focus",
aura = "barbed_shot_3",
last = function ()
local app = state.buff.barbed_shot_3.applied
local t = state.query_time
return app + floor( ( t - app ) / 2 ) * 2
end,
interval = 2,
value = 5,
},
barbed_shot_4 = {
resource = "focus",
aura = "barbed_shot_4",
last = function ()
local app = state.buff.barbed_shot_4.applied
local t = state.query_time
return app + floor( ( t - app ) / 2 ) * 2
end,
interval = 2,
value = 5,
},
barbed_shot_5 = {
resource = "focus",
aura = "barbed_shot_5",
last = function ()
local app = state.buff.barbed_shot_5.applied
local t = state.query_time
return app + floor( ( t - app ) / 2 ) * 2
end,
interval = 2,
value = 5,
},
barbed_shot_6 = {
resource = "focus",
aura = "barbed_shot_6",
last = function ()
local app = state.buff.barbed_shot_6.applied
local t = state.query_time
return app + floor( ( t - app ) / 2 ) * 2
end,
interval = 2,
value = 5,
},
barbed_shot_7 = {
resource = "focus",
aura = "barbed_shot_7",
last = function ()
local app = state.buff.barbed_shot_7.applied
local t = state.query_time
return app + floor( ( t - app ) / 2 ) * 2
end,
interval = 2,
value = 5,
},
barbed_shot_8 = {
resource = "focus",
aura = "barbed_shot_8",
last = function ()
local app = state.buff.barbed_shot_8.applied
local t = state.query_time
return app + floor( ( t - app ) / 2 ) * 2
end,
interval = 2,
value = 5,
},
death_chakram = {
resource = "focus",
aura = "death_chakram",
last = function ()
return state.buff.death_chakram.applied + floor( ( state.query_time - state.buff.death_chakram.applied ) / class.auras.death_chakram.tick_time ) * class.auras.death_chakram.tick_time
end,
interval = function () return class.auras.death_chakram.tick_time end,
value = function () return state.conduit.necrotic_barrage.enabled and 5 or 3 end,
}
} )
-- Talents
spec:RegisterTalents({
-- Hunter
binding_shackles = { 102388, 321468, 1 }, -- Targets stunned by Binding Shot, knocked back by High Explosive Trap, knocked up by Implosive Trap, incapacitated by Scatter Shot, or stunned by Intimidation deal $s1% less damage to you for $s2 sec after the effect ends
binding_shot = { 102386, 109248, 1 }, -- Fires a magical projectile, tethering the enemy and any other enemies within $s1 yds for $s2 sec, stunning them for $s3 sec if they move more than $s4 yds from the arrow. Targets stunned by Binding Shot deal $s5% less damage to you for $s6 sec after the effect ends
blackrock_munitions = { 102392, 462036, 1 }, -- The damage of Explosive Shot is increased by $s2%$s$s3 Pet damage bonus of Harmonize increased by $s4%
born_to_be_wild = { 102416, 266921, 1 }, -- The cooldown of Aspect of the Cheetah, and Aspect of the Turtle are reduced by $s1 sec
bursting_shot = { 102421, 186387, 1 }, -- Fires an explosion of bolts at all enemies in front of you, knocking them back, snaring them by $s2% for $s3 sec, and dealing $s$s4 Physical damage
camouflage = { 102414, 199483, 1 }, -- You and your pet blend into the surroundings and gain stealth for $s1 min. While camouflaged, you will heal for $s2% of maximum health every $s3 sec
concussive_shot = { 102407, 5116, 1 }, -- Dazes the target, slowing movement speed by $s1% for $s2 sec. Cobra Shot will increase the duration of Concussive Shot on the target by $s3 sec
counter_shot = { 102292, 147362, 1 }, -- Interrupts spellcasting, preventing any spell in that school from being cast for $s1 sec
deathblow = { 102410, 343248, 1 }, -- Kill Command has a $s1% chance to grant Deathblow. Deathblow The cooldown of Black Arrow is reset. Your next Black Arrow can be used on any target, regardless of their current health
devilsaur_tranquilizer = { 102415, 459991, 1 }, -- If Tranquilizing Shot removes only an Enrage effect, its cooldown is reduced by $s1 sec
disruptive_rounds = { 102395, 343244, 1 }, -- When Tranquilizing Shot successfully dispels an effect or Counter Shot interrupts a cast, gain $s1 Focus
emergency_salve = { 102389, 459517, 1 }, -- Feign Death and Aspect of the Turtle removes poison and disease effects from you
entrapment = { 102403, 393344, 1 }, -- When Tar Trap is activated, all enemies in its area are rooted for $s1 sec. Damage taken may break this root
explosive_shot = { 102420, 212431, 1 }, -- Fires an explosive shot at your target. After $s2 sec, the shot will explode, dealing $s$s3 Fire damage to all enemies within $s4 yds. Deals reduced damage beyond $s5 targets
ghillie_suit = { 102385, 459466, 1 }, -- You take $s1% reduced damage while Camouflage is active. This effect persists for $s2 sec after you leave Camouflage
harmonize = { 102420, 1245926, 1 }, -- All pet damage dealt increased by $s1%
high_explosive_trap = { 102739, 236776, 1 }, -- Hurls a fire trap to the target location that explodes when an enemy approaches, causing $s$s2 Fire damage and knocking all enemies away. Limit $s3. Trap will exist for $s4 min. Targets knocked back by High Explosive Trap deal $s5% less damage to you for $s6 sec after being knocked back
hunters_avoidance = { 102423, 384799, 1 }, -- Damage taken from area of effect attacks reduced by $s1%
implosive_trap = { 102739, 462031, 1 }, -- Hurls a fire trap to the target location that explodes when an enemy approaches, causing $s$s2 Fire damage and knocking all enemies up. Limit $s3. Trap will exist for $s4 min. Targets knocked up by Implosive Trap deal $s5% less damage to you for $s6 sec after being knocked up
improved_traps = { 102418, 343247, 1 }, -- The cooldown of Tar Trap, High Explosive Trap, Implosive Trap, and Freezing Trap is reduced by $s1 sec
intimidation = { 102397, 19577, 1 }, -- Commands your pet to intimidate the target, stunning it for $s1 sec. Targets stunned by Intimidation deal $s2% less damage to you for $s3 sec after the effect ends
keen_eyesight = { 102409, 378004, 2 }, -- Critical strike chance increased by $s1%
kill_shot = { 102378, 53351, 1 }, -- You attempt to finish off a wounded target, dealing $s$s2 Physical damage. Only usable on enemies with less than $s3% health
kindling_flare = { 102425, 459506, 1 }, -- Flare's radius is increased by $s1%
kodo_tranquilizer = { 102415, 459983, 1 }, -- Tranquilizing Shot removes up to $s1 additional Magic effect from up to $s2 nearby targets
lone_survivor = { 102391, 388039, 1 }, -- The cooldown of Survival of the Fittest is reduced by $s1 sec, and its duration is increased by $s2 sec. The cooldown of Counter Shot is reduced by $s3 sec
misdirection = { 102419, 34477, 1 }, -- Misdirects all threat you cause to the targeted party or raid member, beginning with your next attack within $s1 sec and lasting for $s2 sec
moment_of_opportunity = { 102426, 459488, 1 }, -- When a trap triggers, you gain $s1% movement speed for $s2 sec
natural_mending = { 102401, 270581, 1 }, -- Every $s1 Focus you spend reduces the remaining cooldown on Exhilaration by $s2 sec
no_hard_feelings = { 102412, 459546, 1 }, -- When Misdirection targets your pet, it reduces the damage they take by $s1% for $s2 sec. The cooldown of Misdirection is reduced by $s3 sec
padded_armor = { 102406, 459450, 1 }, -- Survival of the Fittest gains an additional charge
pathfinding = { 102404, 378002, 1 }, -- Movement speed increased by $s1%
posthaste = { 102411, 109215, 1 }, -- Disengage also frees you from all movement impairing effects and increases your movement speed by $s1% for $s2 sec
quick_load = { 102413, 378771, 1 }, -- When you fall below $s1% health, Bursting Shot and Scatter Shot have their cooldown immediately reset. This can only occur once every $s2 sec
rejuvenating_wind = { 102381, 385539, 1 }, -- Maximum health increased by $s1%, and Exhilaration now also heals you for an additional $s2% of your maximum health over $s3 sec
roar_of_sacrifice = { 102405, 53480, 1 }, -- Instructs your pet to protect a friendly target from critical strikes, making attacks against that target unable to be critical strikes, but $s1% of all damage taken by that target is also taken by the pet. Lasts $s2 sec
scare_beast = { 102382, 1513, 1 }, -- Scares a beast, causing it to run in fear for up to $s1 sec. Damage caused may interrupt the effect. Only one beast can be feared at a time
scatter_shot = { 102421, 213691, 1 }, -- A short-range shot that deals $s2 damage, removes all harmful damage over time effects, and incapacitates the target for $s3 sec$s$s4 Any damage caused will remove the effect. Turns off your attack when used. Targets incapacitated by Scatter Shot deal $s5% less damage to you for $s6 sec after the effect ends
scouts_instincts = { 102424, 459455, 1 }, -- You cannot be slowed below $s1% of your normal movement speed while Aspect of the Cheetah is active
scrappy = { 102408, 459533, 1 }, -- Casting Kill Command reduces the cooldown of Intimidation and Binding Shot by $s1 sec
serrated_tips = { 102384, 459502, 1 }, -- You gain $s1% more critical strike from critical strike sources
specialized_arsenal = { 102390, 459542, 1 }, -- Kill Command deals $s1% increased damage
survival_of_the_fittest = { 102422, 264735, 1 }, -- Reduces all damage you and your pet take by $s1% for $s2 sec
tar_trap = { 102393, 187698, 1 }, -- Hurls a tar trap to the target location that creates a $s1 yd radius pool of tar around itself for $s2 sec when the first enemy approaches. All enemies have $s3% reduced movement speed while in the area of effect. Limit $s4. Trap will exist for $s5 min
tarcoated_bindings = { 102417, 459460, 1 }, -- Binding Shot's stun duration is increased by $s1 sec
territorial_instincts = { 102394, 459507, 1 }, -- The cooldown of Intimidation is reduced by $s1 sec
trailblazer = { 102400, 199921, 1 }, -- Your movement speed is increased by $s1% anytime you have not attacked for $s2 sec
tranquilizing_shot = { 102380, 19801, 1 }, -- Removes $s1 Enrage and $s2 Magic effect from an enemy target. Successfully dispelling an effect generates $s3 Focus
trigger_finger = { 102396, 459534, 2 }, -- You and your pet have $s1% increased attack speed. This effect is increased by $s2% if you do not have an active pet
unnatural_causes = { 102387, 459527, 1 }, -- Your damage over time effects deal $s1% increased damage. This effect is increased by $s2% on targets below $s3% health
wilderness_medicine = { 102383, 343242, 1 }, -- Natural Mending now reduces the cooldown of Exhilaration by an additional $s1 sec Mend Pet heals for an additional $s2% of your pet's health over its duration, and has a $s3% chance to dispel a magic effect each time it heals your pet
-- Beast Mastery
alpha_predator = { 102368, 269737, 1 }, -- Kill Command now has $s1 charges, and deals $s2% increased damage
animal_companion = { 102361, 267116, 1 }, -- Your Call Pet additionally summons the pet from the bonus slot in your stable. This pet will obey your Kill Command, but cannot use pet family abilities
aspect_of_the_beast = { 102351, 191384, 1 }, -- Increases the damage and healing of your pet's abilities by $s1%. Increases the effectiveness of your pet's Predator's Thirst, Endurance Training, and Pathfinding s by $s2%
barbed_scales = { 102353, 469880, 1 }, -- Casting Cobra Shot reduces the cooldown of Barbed Shot by $s1 sec
barbed_shot = { 102377, 217200, 1 }, -- Fire a shot that tears through your enemy, causing them to bleed for $s1 damage over $s2 sec and increases your critical strike chance by $s3% for $s4 sec, stacking up to $s5 times. Sends your pet into a frenzy, increasing attack speed by $s6% for $s7 sec, stacking up to $s8 times. Generates $s9 Focus over $s10 sec
barbed_wrath = { 102373, 231548, 1 }, -- Barbed Shot reduces the cooldown of Bestial Wrath by $s1 sec
beast_cleave = { 102341, 115939, 1 }, -- After you Multi-Shot, your pet's melee attacks also strike all nearby enemies for $s1% of the damage and Kill Command strikes all nearby enemies for $s2% of the damage for the next $s3 sec. Deals reduced damage beyond $s4 targets
bestial_wrath = { 102340, 19574, 1 }, -- Sends you and your pet into a rage, instantly dealing $s$s2 Physical damage to its target, and increasing all damage you both deal by $s3% for $s4 sec. Removes all crowd control effects from your pet. Bestial Wrath's remaining cooldown is reduced by $s5 sec each time you use Barbed Shot
bloodshed = { 102362, 321530, 1 }, -- Command your pets to tear into your target, causing your target to bleed for $s1 million over $s2 sec. Damage from Bloodshed has an increased chance to summon Dire Beasts
bloody_frenzy = { 102339, 407412, 1 }, -- While Call of the Wild is active, your pets have the effects of Beast Cleave, and each time Call of the Wild summons a pet, all of your pets Stomp
brutal_companion = { 102350, 386870, 1 }, -- When Barbed Shot causes Frenzy to stack up to $s1, your pet will immediately use its special attack and deal $s2% bonus damage
call_of_the_wild = { 102336, 359844, 1 }, -- You sound the call of the wild, summoning $s1 of your active pets for $s2 sec. During this time, a random pet from your stable will appear every $s3 sec to assault your target for $s4 sec. Each time Call of the Wild summons a pet, the cooldown of Barbed Shot and Kill Command are reduced by $s5%
cobra_senses = { 102344, 378244, 1 }, -- Cobra Shot Focus cost reduced by $s1. Cobra Shot damage increased by $s2%
cobra_shot = { 102354, 193455, 1 }, -- A quick shot causing $s$s2 Physical damage. Reduces the cooldown of Kill Command by $s3 sec
dire_beast = { 102376, 120679, 1 }, -- Damage from your bleed effects has a $s1% chance of attracting a powerful wild beast that attacks your target for $s2 sec
dire_cleave = { 102337, 1217524, 1 }, -- When summoned, Dire Beasts gain Beast Cleave at $s1% effectiveness for $s2 sec
dire_command = { 102365, 378743, 1 }, -- Kill Command has a $s1% chance to also summon a Dire Beast to attack your target for $s2 sec
dire_frenzy = { 102367, 385810, 2 }, -- Dire Beast lasts an additional $s1 sec and deals $s2% increased damage
go_for_the_throat = { 102357, 459550, 1 }, -- Kill Command deals increased critical strike damage equal to $s1% of your critical strike chance
hunters_prey = { 102360, 378210, 1 }, -- Black Arrow deals $s1% increased damage for each of your active pets. Stacks up to $s2 times
huntmasters_call = { 107286, 459730, 1 }, -- Summoning a Dire Beast $s2 times sounds the Horn of Valor, summoning either Hati or Fenryr to battle. Hati Increases the damage of all your pets by $s3%. Fenryr Pounces your primary target, inflicting a heavy bleed that deals $s$s4 million damage over $s5 sec and grants you $s6% Haste
kill_cleave = { 102355, 378207, 1 }, -- While Beast Cleave is active, Kill Command now also strikes nearby enemies for $s1% of damage dealt. Deals reduced damage beyond $s2 targets
kill_command = { 102346, 34026, 1 }, -- Give the command to kill, causing your pet to savagely deal $s$s2 Physical damage to the enemy
killer_cobra = { 102375, 199532, 1 }, -- While Bestial Wrath is active, Cobra Shot resets the cooldown on Kill Command
killer_instinct = { 102364, 273887, 2 }, -- Kill Command deals $s1% increased damage
laceration = { 102369, 459552, 1 }, -- When your pet attacks critically strike, they cause their target to bleed for $s1% of the damage dealt over $s2 sec
master_handler = { 102359, 424558, 1 }, -- Each time Barbed Shot deals damage, the cooldown of Kill Command is reduced by $s1 sec
multishot = { 102363, 2643, 1 }, -- Fires several missiles, hitting all nearby enemies within $s2 yds of your current target for $s$s3 Physical damage and triggering Beast Cleave. Deals reduced damage beyond $s4 targets
pack_tactics = { 102374, 321014, 1 }, -- Focus generation increased by $s1%
piercing_fangs = { 102371, 392053, 1 }, -- While Bestial Wrath is active, your pet's critical damage dealt is increased by $s1%
poisoned_barbs = { 102358, 1217535, 1 }, -- Direct damage from Barbed Shot has a $s4% chance to explode on impact, applying Serpent Sting and dealing $s$s5 Nature damage to nearby enemies. Damage reduced beyond $s6 targets. Serpent Sting Fire a shot that poisons your target, causing them to take $s$s9 Nature damage instantly and an additional $s$s10 Nature damage over $s11 sec
savagery = { 102356, 424557, 1 }, -- Kill Command damage is increased by $s1%. Barbed Shot lasts $s2 sec longer
scent_of_blood = { 102342, 193532, 2 }, -- Activating Bestial Wrath grants $s1 charge of Barbed Shot
serpentine_rhythm = { 102372, 468701, 1 }, -- Casting Cobra Shot increases its damage by $s1%. Stacks up to $s2 times. Upon reaching $s3 stacks, the bonus is removed and you gain $s4% increased pet damage for $s5 sec
snakeskin_quiver = { 102344, 468695, 1 }, -- Your auto shot has a $s1% chance to also fire a Cobra Shot at your target
solitary_companion = { 102361, 474746, 1 }, -- Your pet damage is increased by $s1% and your pet is $s2% larger
stomp = { 102347, 199530, 1 }, -- When you cast Barbed Shot, your pet stomps the ground, dealing $s$s3 Physical damage to its primary target and $s$s4 Physical damage to all other nearby enemies
thrill_of_the_hunt = { 102345, 257944, 1 }, -- Barbed Shot increases your critical strike chance by $s1% for $s2 sec, stacking up to $s3 times
thundering_hooves = { 102370, 459693, 1 }, -- Casting Explosive Shot causes all active pets to Stomp at $s1% effectiveness
training_expert = { 102338, 378209, 1 }, -- All pet damage dealt increased by $s1%
war_orders = { 102343, 393933, 1 }, -- Barbed Shot deals $s1% increased damage, and applying Barbed Shot has a $s2% chance to reset the cooldown of Kill Command
wild_call = { 102348, 185789, 1 }, -- Your auto shot critical strikes have a $s1% chance to reset the cooldown of Barbed Shot
wild_instincts = { 102339, 378442, 1 }, -- While Call of the Wild is active, each time you Kill Command, your Kill Command target takes $s1% increased damage from all of your pets, stacking up to $s2 times
wildspeaker = { 107285, 1232739, 1 }, -- Dire Beasts will now obey your Kill Command, dealing its damage at $s1% effectiveness. Bestial Wrath now sends your Dire Beasts into a rage, increasing their damage dealt by $s2% for $s3 sec. Dire Beasts summoned during a Bestial Wrath will benefit at a reduced duration
-- Dark Ranger
banshees_mark = { 94957, 467902, 1 }, -- Black Arrow's initial damage has a $s2% chance to summon a flock of crows to attack your target, dealing $s$s3 Shadow damage over $s4 sec
black_arrow = { 94987, 466932, 1 }, -- Your Kill Shot is replaced with Black Arrow. Black Arrow You attempt to finish off a wounded target, dealing $s$s5 Shadow damage and $s$s6 Shadow damage over $s7 sec. Only usable on enemies above $s8% health or below $s9% health
bleak_arrows = { 94961, 467749, 1 }, -- Your auto shot now deals Shadow damage, allowing it to bypass armor. Your auto shot has a $s1% chance to grant Deathblow. Deathblow The cooldown of Black Arrow is reset. Your next Black Arrow can be used on any target, regardless of their current health
bleak_powder = { 94974, 467911, 1 }, -- Black Arrow now explodes in a cloud of shadow and sulfur on impact, dealing $s$s2 Shadow damage to all enemies within an $s3 yd cone behind the target. Damage reduced beyond $s4 targets
dark_chains = { 94960, 430712, 1 }, -- While in combat, Disengage will chain the closest target to the ground, causing them to move $s1% slower until they move $s2 yards away
ebon_bowstring = { 94986, 467897, 1 }, -- Casting Black Arrow has a $s1% chance to grant Deathblow. Deathblow The cooldown of Black Arrow is reset. Your next Black Arrow can be used on any target, regardless of their current health
phantom_pain = { 94986, 467941, 1 }, -- When Kill Command deals damage, $s1% of the damage dealt is replicated to up to $s2 other units affected by Black Arrow's periodic damage
shadow_dagger = { 94960, 467741, 1 }, -- While in combat, Disengage releases a fan of shadow daggers, dealing $s$s2 Shadow damage per second and reducing affected target's movement speed by $s3% for $s4 sec
shadow_hounds = { 94983, 430707, 1 }, -- Each time Black Arrow deals damage, you have a small chance to manifest a Dark Hound that charges to your target and attacks nearby enemies for $s1 sec
smoke_screen = { 94959, 430709, 1 }, -- Exhilaration grants you $s1 sec of Survival of the Fittest. Survival of the Fittest activates Exhilaration at $s2% effectiveness
soul_drinker = { 94983, 469638, 1 }, -- Black Arrow damage increased by $s1%. Bleak Powder damage increased by $s2%
the_bell_tolls = { 94968, 467644, 1 }, -- Firing a Black Arrow increases all damage dealt by you and your pets by $s1% for $s2 sec. Multiple instances of this effect may overlap
umbral_reach = { 94982, 1235397, 1 }, -- Black Arrow periodic damage increased by $s1% and Bleak Powder now applies Black Arrow's periodic effect to all enemies it damages. If Bleak Powder damages $s2 or more enemies, gain Beast Cleave if talented
withering_fire = { 94993, 466990, 1 }, -- While Call of the Wild is active, you surrender to darkness, granting you Withering Fire and Deathblow every $s1 sec. Withering Fire Casting Black Arrow fires a barrage of $s4 additional Black Arrows at nearby targets at $s5% effectiveness, prioritizing enemies that aren't affected by Black Arrow's damage over time effect
-- Pack Leader
better_together = { 94962, 472357, 1 }, -- Damage dealt by your pets is increased by $s1%. Frenzy's attack speed bonus is increased by $s2%
dire_summons = { 94992, 472352, 1 }, -- Kill Command reduces the cooldown of Howl of the Pack Leader by $s1 sec. Cobra Shot reduces the cooldown of Howl of the Pack Leader by $s2 sec
envenomed_fangs = { 94972, 472524, 1 }, -- Initial damage from your Bear will consume Serpent Sting from up to $s1 nearby targets, dealing $s2% of its remaining damage instantly
fury_of_the_wyvern = { 94984, 472550, 1 }, -- Your pet's attacks increase your Wyvern's damage bonus by $s1%, up to $s2%. Casting Kill Command extends the duration of your Wyvern by $s3 sec, up to $s4 additional sec
hogstrider = { 94988, 472639, 1 }, -- Each time your Boar deals damage, the damage of your next Cobra Shot is increased by $s1% and Cobra Shot strikes $s2 additional target. Stacks up to $s3 times
horsehair_tether = { 94979, 472729, 1 }, -- When an enemy is stunned by Binding Shot, it is dragged to Binding Shot's center
howl_of_the_pack_leader = { 94991, 471876, 1 }, -- While in combat, every $s2 sec your next Kill Command summons the aid of a Beast. Wyvern A Wyvern descends from the skies, letting out a battle cry that increases the damage of you and your pets by $s5% for $s6 sec. Boar A Boar charges through your target $s9 times, dealing $s$s10 physical damage to the primary target and $s11 damage to up to $s12 nearby enemies. Bear A Bear leaps into the fray, rending the flesh of your enemies, dealing $s15 damage over $s16 sec to up to $s17 nearby enemies
lead_from_the_front = { 94966, 472741, 1 }, -- Casting Bestial Wrath grants Howl of the Pack Leader and increases the damage dealt by your Beasts by $s1% and your pets by $s2% for $s3 sec
no_mercy = { 94969, 472660, 1 }, -- Damage from your Kill Shot sends your pets into a rage, causing all active pets within $s1 yds and your Bear to pounce to the target and Smack, Claw, or Bite it. Your pets will not leap if their target is already in melee range
pack_mentality = { 94985, 472358, 1 }, -- Howl of the Pack Leader increases the damage of your Kill Command by $s1%. Summoning a Beast reduces the cooldown of Barbed Shot by $s2 sec
shell_cover = { 94967, 472707, 1 }, -- When dropping below $s1% health, summon the aid of a Turtle, reducing the damage you take by $s2% for $s3 sec. Damage reduction increased as health is reduced, increasing to up to $s4% damage reduction at $s5% health. This effect can only occur once every $s6 min
slicked_shoes = { 94979, 472719, 1 }, -- When Disengage removes a movement impairing effect, its cooldown is reduced by $s1 sec
ursine_fury = { 94972, 472476, 1 }, -- Your Bear's periodic damage has a $s1% chance to reduce the cooldown of Kill Command by $s2 sec
} )
-- PvP Talents
spec:RegisterPvpTalents( {
chimaeral_sting = 3604, -- (356719) Stings the target, dealing $s$s2 Nature damage and initiating a series of venoms. Each lasts $s3 sec and applies the next effect after the previous one ends. Scorpid Venom: $s6% reduced movement speed. Spider Venom: Silenced. Viper Venom: $s11% reduced damage and healing
diamond_ice = 5534, -- (203340)
dire_beast_basilisk = 825, -- (1218223) Call of the Wild additionally summons a slow moving basilisk near your target for $s1 sec that attacks the target for heavy damage
dire_beast_hawk = 824, -- (208652) Summons a hawk to circle the target area, attacking all targets within $s1 yards over the next $s2 sec
explosive_powder = 5689, -- (1218150)
hunting_pack = 3730, -- (203235)
interlope = 1214, -- (248518) Misdirection now causes the next $s1 hostile spells cast on your target within $s2 sec to be redirected to your pet, but its cooldown is increased by $s3 sec. Your pet must be within $s4 yards of the target for spells to be redirected
kindred_beasts = 5444, -- (356962)
survival_tactics = 3599, -- (202746)
the_beast_within = 693, -- (356976)
wild_kingdom = 5441, -- (356707) Call in help from one of your dismissed Cunning pets for $s1 sec. Your current pet is dismissed to rest and heal $s2% of maximum health
} )
-- Auras
spec:RegisterAuras( {
-- Talent: Under attack by a flock of crows.
-- https://wowhead.com/beta/spell=131894
a_murder_of_crows = {
id = 131894,
duration = 15,
tick_time = 1,
max_stack = 1
},
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=263446
acid_spit = {
id = 263446,
duration = 6,
mechanic = "snare",
type = "Ranged",
max_stack = 1
},
-- Dodge chance increased by $s1%.
-- https://wowhead.com/beta/spell=160011
agile_reflexes = {
id = 160011,
duration = 20,
max_stack = 1
},
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=50433
ankle_crack = {
id = 50433,
duration = 6,
mechanic = "snare",
max_stack = 1
},
-- Movement speed increased by $w1%.
-- https://wowhead.com/beta/spell=186257
aspect_of_the_cheetah_sprint = {
id = 186257,
duration = 3,
max_stack = 1
},
-- Movement speed increased by $w1%.
-- https://wowhead.com/beta/spell=186258
aspect_of_the_cheetah = {
id = 186258,
duration = function () return conduit.cheetahs_vigor.enabled and 12 or 9 end,
max_stack = 1
},
-- The range of $?s259387[Mongoose Bite][Raptor Strike] is increased to $265189r yds.
-- https://wowhead.com/beta/spell=186289
aspect_of_the_eagle = {
id = 186289,
duration = 15,
max_stack = 1
},
-- Deflecting all attacks. Damage taken reduced by $w4%.
-- https://wowhead.com/beta/spell=186265
aspect_of_the_turtle = {
id = 186265,
duration = 8,
max_stack = 1
},
-- Talent: Suffering $w1 damage every $t1 sec.
-- https://wowhead.com/beta/spell=217200
barbed_shot = {
id = 246152,
duration = function() return 12 + ( talent.savagery.enabled and 2 or 0 ) end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
barbed_shot_2 = {
id = 246851,
duration = function () return spec.auras.barbed_shot.duration end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
barbed_shot_3 = {
id = 246852,
duration = function () return spec.auras.barbed_shot.duration end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
barbed_shot_4 = {
id = 246853,
duration = function () return spec.auras.barbed_shot.duration end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
barbed_shot_5 = {
id = 246854,
duration = function () return spec.auras.barbed_shot.duration end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
barbed_shot_6 = {
id = 284255,
duration = function () return spec.auras.barbed_shot.duration end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
barbed_shot_7 = {
id = 284257,
duration = function () return spec.auras.barbed_shot.duration end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
barbed_shot_8 = {
id = 284258,
duration = function () return spec.auras.barbed_shot.duration end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
barbed_shot_dot = {
id = 217200,
duration = function () return spec.auras.barbed_shot.duration end,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
beast_cleave = {
id = 268877,
duration = 6,
max_stack = 1
},
-- Talent: Damage dealt increased by $w1%.
-- https://wowhead.com/beta/spell=19574
bestial_wrath = {
id = 19574,
duration = 15,
type = "Ranged",
max_stack = 1
},
binding_shackles = {
id = 321469,
duration = 8,
max_stack = 1
},
binding_shot = {
id = 117405,
duration = 10,
max_stack = 1
},
-- Stunned.
binding_shot_stun = {
id = 117526,
duration = function() return 3.0 + ( 1 * talent.tarcoated_bindings.rank ) end,
max_stack = 1,
},
black_arrow = {
id = 468572,
duration = 14,
tick_time = 2,
max_stack = 1
},
-- Talent: Bleeding for $w1 Physical damage every $t1 sec. Taking $s2% increased damage from the Hunter's pet.
-- https://wowhead.com/beta/spell=321538
bloodshed = {
id = 321538,
duration = 12,
tick_time = 1,
max_stack = 1,
generate = function ( t )
local name, count, duration, expires, caster, _
for i = 1, 40 do
name, _, count, _, duration, expires, caster = UnitDebuff( "target", 321538 )
if not name then break end
if name and UnitIsUnit( caster, "pet" ) then break end
end
if name then
t.name = name
t.count = count
t.expires = expires
t.applied = expires - duration
t.caster = "player"
return
end
t.count = 0
t.expires = 0
t.applied = 0
t.caster = "nobody"
end,
},
-- Damage reduced by $s1%.
-- https://wowhead.com/beta/spell=263869
bristle = {
id = 263869,
duration = 12,
max_stack = 1
},
-- Burrowed into the ground, dealing damage to enemies above.
-- https://wowhead.com/beta/spell=93433
burrow_attack = {
id = 93433,
duration = 8,
tick_time = 1,
type = "Magic",
max_stack = 1
},
-- Disoriented.
bursting_shot = {
id = 224729,
duration = 4.0,
max_stack = 1
},
-- Summoning 1 of your active pets every 4 sec. Each pet summoned lasts for 6 sec.
-- https://wowhead.com/beta/spell=359844
call_of_the_wild = {
id = 359844,
duration = 20,
max_stack = 1
},
call_of_the_wild_summon = {
id = 361582,
duration = 6,
max_stack = 1
},
-- Talent: Stealthed.
-- https://wowhead.com/beta/spell=199483
camouflage = {
id = 199483,
duration = 60,
max_stack = 1
},
-- Dodge chance increased by $s1%.
-- https://wowhead.com/beta/spell=263892
catlike_reflexes = {
id = 263892,
duration = 20,
max_stack = 1
},
-- Talent: Movement slowed by $s1%.
-- https://wowhead.com/beta/spell=5116
concussive_shot = {
id = 5116,
duration = 6,
mechanic = "snare",
type = "Ranged",
max_stack = 1
},
deathblow = {
id = 378770,
duration = 12,
max_stack = 1
},
-- Talent: Taking $w2% increased Physical damage from $@auracaster.
-- https://wowhead.com/beta/spell=325037
death_chakram_vulnerability = {
id = 375893,
duration = 10,
mechanic = "bleed",
type = "Ranged",
max_stack = 1,
copy = { 325037, 361756, "death_chakram_debuff" }
},
death_chakram = {
duration = 3.5,
tick_time = 0.5,
max_stack = 1,
generate = function( t, auraType )
local cast = action.death_chakram.lastCast or 0
if cast + class.auras.death_chakram.duration >= query_time then
t.name = class.abilities.death_chakram.name
t.count = 1
t.applied = cast
t.expires = cast + 3.5
t.caster = "player"
return
end
t.count = 0
t.applied = 0
t.expires = 0
t.caster = "nobody"
end,
},
-- Talent: Haste increased by $s1%.
-- https://wowhead.com/beta/spell=281036
dire_beast = {
id = 281036,
duration = function() return 8 + 2 * talent.dire_frenzy.rank end,
max_stack = 1
},
dire_beast_basilisk = {
id = 209967,
duration = 30,
max_stack = 1
},
dire_beast_hawk = {
id = 208684,
duration = 3600,
max_stack = 1
},
-- Dodge chance increased by $s1%.
-- https://wowhead.com/beta/spell=263887
dragons_guile = {
id = 263887,
duration = 20,
max_stack = 1
},
-- Movement slowed by $s1%.
-- https://wowhead.com/beta/spell=50285
dust_cloud = {
id = 50285,
duration = 6,
mechanic = "snare",
type = "Magic",
max_stack = 1
},
-- Talent: Exploding for $212680s1 Fire damage after $t1 sec.
-- https://wowhead.com/beta/spell=212431
explosive_shot = {
id = 212431,
duration = 3,
tick_time = 3,
type = "Ranged",
max_stack = 1
},
-- Directly controlling pet.
-- https://wowhead.com/beta/spell=321297
eyes_of_the_beast = {
id = 321297,
duration = 60,
type = "Magic",
max_stack = 1
},
-- Feigning death.
-- https://wowhead.com/beta/spell=5384
feign_death = {
id = 5384,
duration = 360,
max_stack = 1
},
-- Covenant: Bleeding for $s1 Shadow damage every $t1 sec.
-- https://wowhead.com/beta/spell=324149
flayed_shot = {
id = 324149,
duration = 18,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
-- Maximum health increased by $s1%.
-- https://wowhead.com/beta/spell=388035
fortitude_of_the_bear = {
id = 388035,
duration = 10,
max_stack = 1,
copy = 392956
},
freezing_trap = {
id = 3355,
duration = 60,
type = "Magic",
max_stack = 1
},
-- Attack speed increased by $s1%.
-- https://wowhead.com/beta/spell=272790
frenzy = {
id = 272790,
duration = function () return azerite.feeding_frenzy.enabled and 9 or spec.auras.barbed_shot.duration end,
max_stack = 3,
generate = function ()
local fr = buff.frenzy
local name, _, count, _, duration, expires, caster = FindUnitBuffByID( "pet", 272790 )
if name then
fr.name = name
fr.count = count
fr.expires = expires
fr.applied = expires - duration
fr.caster = caster
return
end
fr.count = 0
fr.expires = 0
fr.applied = 0
fr.caster = "nobody"
end,
},
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=54644
frost_breath = {
id = 54644,
duration = 6,
mechanic = "snare",
type = "Magic",
max_stack = 1
},
-- Causing Froststorm damage to all targets within $95725A1 yards.
-- https://wowhead.com/beta/spell=92380
froststorm_breath = {
id = 92380,
duration = 8,
tick_time = 2,
max_stack = 1
},
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=263840
furious_bite = {
id = 263840,
duration = 6,
mechanic = "snare",
max_stack = 1
},
growl = {
id = 2649,
duration = 3,
max_stack = 1
},
-- https://www.wowhead.com/spell=472640
-- Hogstrider Your next Cobra Shot strikes X additional targets and its damage is increased by 100%.
hogstrider = {
id = 472640,
duration = 20,
max_stack = 4
},
howl_of_the_pack_leader_cooldown = {
id = 471877,
duration = 30,
max_stack = 1
},
howl_of_the_pack_leader_bear = {
id = 472325,
duration = 30,
max_stack = 1
},
howl_of_the_pack_leader_boar = {
id = 472324,
duration = 30,
max_stack = 1
},
howl_of_the_pack_leader_wyvern = {
id = 471878,
duration = 30,
max_stack = 1
},
-- Huntmaster's Call Dire Beast will summon Hati or Fenryr at $s1 stacks
-- https://www.wowhead.com/spell=459731
huntmasters_call = {
id = 459731,
duration = 3600,
max_stack = 5
},
intimidation = {
id = 24394,
duration = 5,
max_stack = 1
},
-- Talent: Bleeding for $w2 damage every $t2 sec.
-- https://wowhead.com/beta/spell=259277
kill_command = {
id = 259277,
duration = 8,
max_stack = 1
},
-- https://www.wowhead.com/spell=472743
-- Lead From the Front The damage of your Pack Leader Beasts is increased by 25%.
lead_from_the_front = {
id = 472743,
duration = 12,
max_stack = 1
},
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=263423
lock_jaw = {
id = 263423,
duration = 6,
mechanic = "snare",
max_stack = 1
},
masters_call = {
id = 54216,
duration = 4,
type = "Magic",
max_stack = 1
},
-- Heals $w1% of the pet's health every $t1 sec.$?s343242[ Each time Mend Pet heals your pet, you have a $343242s2% chance to dispel a harmful magic effect from your pet.][]
-- https://wowhead.com/beta/spell=136
mend_pet = {
id = 136,
duration = 10,
type = "Magic",
max_stack = 1,
generate = function( t )
local name, _, count, _, duration, expires, caster = FindUnitBuffByID( "pet", 136 )
if name then
t.name = name
t.count = count
t.expires = expires
t.applied = expires - duration
t.caster = caster
return
end
t.count = 0
t.expires = 0
t.applied = 0
t.caster = "nobody"
end
},
-- Talent: Threat redirected from Hunter.
-- https://wowhead.com/beta/spell=35079
misdirection = {
id = 35079,
duration = 8,
max_stack = 1
},
-- Damage taken reduced by $w1%
no_hard_feelings = {
id = 459547,
duration = 5.0,
max_stack = 1
},
-- Damage reduced by $s1%.
-- https://wowhead.com/beta/spell=263867
obsidian_skin = {
id = 263867,
duration = 12,
max_stack = 1
},
parsels_tongue = {
id = 248085,
duration = 8,
max_stack = 4
},
-- Pinned in place.
-- https://wowhead.com/beta/spell=50245
pin = {
id = 50245,
duration = 6,
mechanic = "root",
max_stack = 1
},
-- "When you're the best of friends..."
-- https://wowhead.com/beta/spell=90347
play = {
id = 90347,
duration = 15,
type = "Magic",
max_stack = 1
},
-- Talent: Increased movement speed by $s1%.
-- https://wowhead.com/beta/spell=118922
posthaste = {
id = 118922,
duration = 4,
max_stack = 1
},
predators_thirst = {
id = 264663,
duration = 3600,
max_stack = 1
},
-- Stealthed. Movement speed slowed by $s2%.
-- https://wowhead.com/beta/spell=24450
prowl = {
id = 24450,
duration = 3600,
max_stack = 1
},
-- Recently benefitted from Quick Load.
quick_load = {
id = 385646,
duration = 25.0,
max_stack = 1,
copy = "quick_load_icd"
},
rejuvenating_wind = {
id = 339400,
duration = 8,
max_stack = 1
},
-- Zzzzzz...
-- https://wowhead.com/beta/spell=94019
rest = {
id = 94019,
duration = 12,
type = "Magic",
max_stack = 1
},
-- Talent: Feared.
-- https://wowhead.com/beta/spell=1513
scare_beast = {
id = 1513,
duration = 20,
mechanic = "flee",
type = "Magic",
max_stack = 1
},
-- Talent: Disoriented.
-- https://wowhead.com/beta/spell=213691
scatter_shot = {
id = 213691,
duration = 4,
type = "Ranged",
max_stack = 1
},
serpentine_rhythm = {
id = 468703,
duration = 30,
max_stack = 3
},
serpentine_blessing = {
id = 468704,
duration = 8,
max_stack = 1
},
-- Dodge chance increased by $s1%.
-- https://wowhead.com/beta/spell=263904
serpents_swiftness = {
id = 263904,
duration = 20,
max_stack = 1
},
-- Damage taken reduced by $s1%.
-- https://wowhead.com/beta/spell=263938
silverback = {
id = 263938,
duration = 15,
max_stack = 1
},
solitary_companion = {
id = 474751,
duration = 3600,
max_stack = 1
},
-- Heals $w2 every $t2 sec for $d.
-- https://wowhead.com/beta/spell=90361
spirit_mend = {
id = 90361,
duration = 10,
type = "Magic",
max_stack = 1
},
-- Stealthed. Movement speed slowed by $s2%.
-- https://wowhead.com/beta/spell=90328
spirit_walk = {
id = 90328,
duration = 3600,
max_stack = 1
},
-- Talent: Slowed by $s2%. $s3% increased chance suffer a critical strike from $@auracaster.
-- https://wowhead.com/beta/spell=201594
stampede = {
id = 201594,
duration = 5,
type = "Ranged",
max_stack = 1
},
-- Talent: Bleeding for $w1 damage every $t1 seconds.
-- https://wowhead.com/beta/spell=162487
steel_trap = {
id = 162487,
duration = 20,
tick_time = 2,
mechanic = "bleed",
type = "Ranged",
max_stack = 1
},
-- Summon Fenryr Haste increased by $s1%. $s2 seconds remaining
-- https://www.wowhead.com/spell=459735
summon_fenryr = {
id = 459735,
duration = 16,
max_stack = 1,
},
-- All damage taken reduced by $s1%.
survival_of_the_fittest = {
id = 264735,
duration = function() return 6.0 + 2 * talent.lone_survivor.rank end,
max_stack = 1
},
-- Reduces damage taken by $202746s1%, up to a maximum of $w1.
survival_tactics = {
id = 202748,
duration = 2.0,
max_stack = 1
},
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=263852
talon_rend = {
id = 263852,
duration = 6,
mechanic = "snare",
max_stack = 1
},
tar_trap = {
id = 135299,
duration = 30,
max_stack = 1
},
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=160065
tendon_rip = {
id = 160065,
duration = 6,
mechanic = "snare",
max_stack = 1
},
-- The Bell Tolls All damage dealt by you and your pets is increased by $s1%. $s2 seconds remaining
-- https://www.wowhead.com/spell=1232992
the_bell_tolls = {
id = 1232992,
duration = 12,
max_stack = 10
},
-- Damage taken reduced by $s1%.
-- https://wowhead.com/beta/spell=263926
thick_fur = {
id = 263926,
duration = 15,
max_stack = 1
},
-- Damage taken reduced by $s1%.
-- https://wowhead.com/beta/spell=160058
thick_hide = {
id = 160058,
duration = 15,
max_stack = 1
},
-- Talent: Critical strike chance increased by $s1%.
-- https://wowhead.com/beta/spell=257946
thrill_of_the_hunt = {
id = 257946,
duration = function () return spec.auras.barbed_shot.duration end,
max_stack = 3,
copy = 312365
},
trailblazer = {
id = 231390,
duration = 3600,
max_stack = 1
},
-- Talent: Silenced.
-- https://wowhead.com/beta/spell=355596
wailing_arrow = {
id = 355596,
duration = 5,
mechanic = "silence",
type = "Magic",
max_stack = 1,
copy = 392061
},
-- Movement slowed by $s1%.
-- https://wowhead.com/beta/spell=35346
warp_time = {
id = 35346,
duration = 6,
type = "Magic",
max_stack = 1
},
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=160067
web_spray = {
id = 160067,
duration = 6,
mechanic = "snare",
max_stack = 1
},
-- Talent: The cooldown of $?s217200[Barbed Shot][Dire Beast] is reset.
-- https://wowhead.com/beta/spell=185791
wild_call = {
id = 185791,
duration = 4,
max_stack = 1
},
-- Damage taken from $@auracaster's Pets increased by $s1%.
wild_instincts = {
id = 424567,
duration = 8,
max_stack = 10
},
-- Suffering $w1 Fire damage every $t1 sec.
-- https://wowhead.com/beta/spell=269747
-- Movement speed reduced by $s1%.
-- https://wowhead.com/beta/spell=195645
wing_clip = {
id = 195645,
duration = 15,
max_stack = 1
},
-- Dodge chance increased by $s1%.
-- https://wowhead.com/beta/spell=264360
winged_agility = {
id = 264360,
duration = 20,
max_stack = 1
},
-- Withering Fire Casting Black Arrow fires a barrage of $s1 additional Black Arrows at nearby targets. $s2 second remaining
withering_fire = {
id = 466991,
duration = function() return spec.auras.call_of_the_wild.duration end,
max_stack = 1
},
-- Wyvern's Cry You and your pet's damage is increased by $s1%. $s2 seconds remaining
-- https://www.wowhead.com/spell=471881
wyverns_cry = {
id = 471881,
duration = 15,
max_stack = 20
},
-- PvP Talents
high_explosive_trap = {
id = 236777,
duration = 0.1,
max_stack = 1
},
interlope = {
id = 248518,
duration = 45,
max_stack = 1
},
roar_of_sacrifice = {
id = 53480,
duration = 12,
max_stack = 1
},
the_beast_within = {
id = 212704,
duration = 15,
max_stack = 1
},
-- Azerite Powers
dance_of_death = {
id = 274443,
duration = 8,
max_stack = 1
},
primal_instincts = {
id = 279810,
duration = 20,
max_stack = 1
},
-- Conduits
resilience_of_the_hunter = {
id = 339461,
duration = 8,
max_stack = 1
},
tactical_retreat = {
id = 339654,
duration = 3,
max_stack = 1
},
-- Legendaries
flamewakers_cobra_sting = {
id = 336826,
duration = 15,
max_stack = 1
},
nessingwarys_trapping_apparatus = {
id = 336744,
duration = 5,
max_stack = 1,
copy = { "nesingwarys_trapping_apparatus", "nesingwarys_apparatus", "nessingwarys_apparatus" }
},
soulforge_embers = {
id = 336746,
duration = 12,
max_stack = 1
}
} )
-- Pets
spec:RegisterPets({
-- Howl of the Pack Leader
wyvern = {
id = 234170,
spell = "kill_command",
duration = 15
},
-- boar isn't a real pet
bear = {
id = 234018,
spell = "kill_command",
duration = 15
}
} )
spec:RegisterGear({
-- The War Within
tww3 = {
items = { 237644, 237645, 237646, 237647, 237649 },
auras = {
-- Pack Leader
-- Mastery
grizzled_fur = {
id = 1236564,
duration = 8,
max_stack = 1
},
-- Haste
hasted_hooves = {
id = 1236565,
duration = 8,
max_stack = 1
},
-- Crit
sharpened_fangs = {
id = 1236566,
duration = 8,
max_stack = 1
},
-- Dark Ranger
blighted_quiver = {
id = 1236975,
duration = 3600,
max_stack = 15
},
}
},
tww2 = {
items = { 229271, 229269, 229274, 229272, 229270 },
auras = {
-- Possible TODO: pet attacks reduce bestial wrath cd?
potent_mutagen = {
id = 1218003,
duration = 8,
max_stack = 1
}
}
},
tww1 = {
items = { 212018, 212019, 212020, 212021, 212023 }
},
-- Dragonflight
tier31 = {
items = { 207216, 207217, 207218, 207219, 207221, 217183, 217185, 217181, 217182, 217184 },
},
tier29 = {
items = { 200390, 200392, 200387, 200389, 200391 },
auras = {
lethal_command = {
id = 394298,
duration = 15,
max_stack = 1
}
}
},
} )
-- Legacy
--- Shadowlands
local ExpireNesingwarysTrappingApparatus = setfenv( function()
focus.regen = focus.regen * 0.5
forecastResources( "focus" )
end, state )
spec:RegisterStateExpr( "barbed_shot_grace_period", function ()
return ( settings.barbed_shot_grace_period or 0 ) * gcd.max
end )
spec:RegisterHook( "spend", function( amt, resource )
if amt < 0 and resource == "focus" and buff.nessingwarys_trapping_apparatus.up then
amt = amt * 2
end
return amt, resource
end )
local CallOfTheWildCDR = setfenv( function()
gainChargeTime( "kill_command", spec.abilities.kill_command.recharge/4)
gainChargeTime( "barbed_shot", spec.abilities.barbed_shot.recharge/4)
if talent.withering_fire.enabled then applyBuff( "deathblow" ) end
end, state )
local pack_leader_buff_cycle = {
"wyvern",
"boar",
"bear",
}
-- This variable represents the true index in the above table of the next buff that will be applied to you, whether by the natural cycle or by bestial wrath
-- The index should always initially start at "1" (Wyvern), and is also reset to 1 upon:
-- Aura Interrupt: Leave World (19), Enter World (22), Change Specialization (38), Raid Encounter Start or M+ Start (40), Raid Encounter End or M+ Start (41), Disconnect (42), Enter Instance (43), Leave Arena or Battleground (45), Change Talent (46), Encounter End (56)
local PackLeaderBuffNextIndex = 1
spec:RegisterStateExpr( "pack_leader_buff_next_index", function()
return PackLeaderBuffNextIndex
end )
local lastBoarSummoned = 0
spec:RegisterStateExpr( "last_boar_summoned", function()
return lastBoarSummoned
end )
local trapUnits = { "target", "focus" }
local trappableClassifications = {
rare = true,
elite = true,
normal = true,
trivial = true,
minus = true
}
for i = 1, 5 do
trapUnits[ #trapUnits + 1 ] = "boss" .. i
end
for i = 1, 40 do
trapUnits[ #trapUnits + 1 ] = "nameplate" .. i
end
spec:RegisterHook( "COMBAT_LOG_EVENT_UNFILTERED", function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
if sourceGUID == GUID then
if subtype == "SPELL_AURA_APPLIED" or subtype == "SPELL_AURA_REFRESH" then
-- Detect REAL cycle events and update the index accordingly
for index, animal in ipairs( pack_leader_buff_cycle ) do
local buffName = "howl_of_the_pack_leader_" .. animal
local aura = spec.auras[ buffName ]
if aura and spellID == aura.id then
PackLeaderBuffNextIndex = ( index % #pack_leader_buff_cycle ) + 1
break
end
end
elseif subtype == "SPELL_AURA_REMOVED" and spellID == 472324 then
local now = GetTime()
-- use lastcast to make sure it wasn't a natural buff disappearing
if now - action.kill_command.lastCast <= 1 then lastBoarSummoned = now end
end
end
--[[
if subtype == "SPELL_CAST_SUCCESS" and sourceGUID == GUID and spellID == 187698 and legendary.soulforge_embers.enabled then
-- Capture all boss/elite targets present at this time as valid trapped targets.
table.wipe(tar_trap_targets)
for _, unit in ipairs(trapUnits) do
if UnitExists(unit) and UnitCanAttack("player", unit) and not trappableClassifications[UnitClassification(unit)] then
tar_trap_targets[UnitGUID(unit)] = true
end
end
end--]]
end, false )
spec:RegisterStateTable( "tar_trap", setmetatable( {}, {
__index = function( t, k )
return state.debuff.tar_trap[ k ]
end
} ) )
-- To support TWW Season 3 tier set
local tww3_tier_pack_leader_buffs = {
bear = "grizzled_fur",
boar = "hasted_hooves",
wyvern = "sharpened_fangs",
}
-- To support SimC Expressions
spec:RegisterStateTable( "howl_summon", setmetatable( {
refresh_cycle = setfenv( function()
-- reset_precast function
pack_leader_buff_next_index = nil
end, state ),
raid_boss_reset = setfenv( function()
pack_leader_buff_next_index = 1
end, state ),
trigger_summon = setfenv( function( isBestialWrath )
local summonCount = 0
if isBestialWrath then
-- Scenario 1: Bestial Wrath prepares the next summon without summoning anything that is currently ready or modifying the CD buff
applyBuff( "howl_of_the_pack_leader_" .. pack_leader_buff_cycle[ pack_leader_buff_next_index ] )
pack_leader_buff_next_index = ( pack_leader_buff_next_index % #pack_leader_buff_cycle) + 1 -- Advance to the next buff index virtually, will be reset / synced in reset_precast
applyBuff( "lead_from_the_front" )
else
-- Scenario 2: Kill Command summons + other effects
for _, animal in ipairs( pack_leader_buff_cycle ) do
local buffName = "howl_of_the_pack_leader_" .. animal
if buff[ buffName ].up then
removeBuff( buffName )
summonCount = summonCount + 1
if set_bonus.tww3 >= 2 then
applyBuff( tww3_tier_pack_leader_buffs[ animal ] )
end
end
end
if talent.pack_mentality.enabled then reduceCooldown( "barbed_shot", 10 * summonCount ) end
if buff.howl_of_the_pack_leader_cooldown.down then applyBuff( "howl_of_the_pack_leader_cooldown" )
elseif talent.dire_summons.enabled then buff.howl_of_the_pack_leader_cooldown.expires = buff.howl_of_the_pack_leader_cooldown.expires - 1
end
end
end, state ),
}, {
__index = function( t, k )
if k == "ready" then
return buff.howl_of_the_pack_leader_bear.up or buff.howl_of_the_pack_leader_boar.up or buff.howl_of_the_pack_leader_wyvern.up or false
elseif k == "ready_bear" then
return buff.howl_of_the_pack_leader_bear.up
elseif k == "ready_boar" then
return buff.howl_of_the_pack_leader_boar.up
elseif k == "ready_wyvern" then
return buff.howl_of_the_pack_leader_wyvern.up
elseif k == "next" then
return pack_leader_buff_cycle[ pack_leader_buff_next_index ]
elseif k == "next_bear" then
return pack_leader_buff_next_index == 3
elseif k == "next_boar" then
return pack_leader_buff_next_index == 2
elseif k == "next_wyvern" then
return pack_leader_buff_next_index == 1
end
end
} ) )
-- To support SimC Expressions
spec:RegisterStateTable( "boar_charge", setmetatable( {
boar_duration = 6,
boar_interval = 3,
refresh_tracker = setfenv( function()
-- reset_precast function
last_boar_summoned = nil
end, state ),
}, {
__index = function( t, k )
local elapsed = query_time - last_boar_summoned
if k == "remains" then
return max( 0, boar_charge.boar_duration - elapsed )
elseif k == "next_charge" then
if elapsed < 0 or elapsed > boar_charge.boar_duration then
return 3600
else
return ( boar_charge.boar_interval * ( floor( elapsed / boar_charge.boar_interval ) + 1 ) ) - elapsed
end
elseif k == "charges_remaining" then
if elapsed < 0 or elapsed >= boar_charge.boar_duration then
return 0
else
return max( 0, 2 - ( floor( elapsed / boar_charge.boar_interval ) ) )
end
end
end
} ) )
spec:RegisterHook( "reset_precast", function()
if talent.howl_of_the_pack_leader.enabled then
howl_summon.refresh_cycle()
boar_charge.refresh_tracker()
end
if debuff.tar_trap.up then
debuff.tar_trap.expires = debuff.tar_trap.applied + 30
end
if legendary.nessingwarys_trapping_apparatus.enabled then
if buff.nesingwarys_apparatus.up then
state:QueueAuraExpiration( "nesingwarys_apparatus", ExpireNesingwarysTrappingApparatus, buff.nesingwarys_apparatus.expires )
end
end
if buff.call_of_the_wild.up then
local tick, expires = buff.call_of_the_wild.applied, buff.call_of_the_wild.expires
for i = 1, 5 do
tick = tick + 4
if tick > query_time and tick < expires then
state:QueueAuraEvent( "call_of_the_wild_cdr", CallOfTheWildCDR, tick, "AURA_TICK" )
end
end
end
if covenant.kyrian and now - action.resonating_arrow.lastCast < 6 then applyBuff( "resonating_arrow", 10 - ( now - action.resonating_arrow.lastCast ) ) end
if barbed_shot_grace_period > 0 and cooldown.barbed_shot.remains > 0 then reduceCooldown( "barbed_shot", barbed_shot_grace_period ) end
end )
spec:RegisterHook( "runHandler_startCombat", function()
if talent.howl_of_the_pack_leader.enabled then
if buff.howl_of_the_pack_leader_cooldown.down then applyBuff( "howl_of_the_pack_leader_cooldown" ) end
if raid and boss then howl_summon.raid_boss_reset() end
end
end )
-- Abilities
spec:RegisterAbilities( {
-- Increases your movement speed by $s1% for $d, and then by $186258s1% for another $186258d$?a445701[, and then by $445701s1% for another $445701s2 sec][].$?a459455[; You cannot be slowed below $s2% of your normal movement speed.][]
aspect_of_the_cheetah = {
id = 186257,
cast = 0,
cooldown = function () return 180 * ( pvptalent.hunting_pack.enabled and 0.5 or 1 ) * ( legendary.call_of_the_wild.enabled and 0.75 or 1 ) - ( 30 * talent.born_to_be_wild.rank ) + ( conduit.cheetahs_vigor.mod * 0.001 ) end,
gcd = "off",
school = "physical",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
applyBuff( "aspect_of_the_cheetah" )
applyBuff( "aspect_of_the_cheetah_sprint" )
end,
},
-- Deflects all attacks and reduces all damage you take by $s4% for $d, but you cannot attack.$?s83495[ Additionally, you have a $83495s1% chance to reflect spells back at the attacker.][]
aspect_of_the_turtle = {
id = 186265,
cast = 8,
channeled = true,
cooldown = function () return 180 * ( pvptalent.hunting_pack.enabled and 0.5 or 1 ) * ( legendary.call_of_the_wild.enabled and 0.75 or 1 ) - ( 30 * talent.born_to_be_wild.rank ) + ( conduit.cheetahs_vigor.mod * 0.001 ) end,
gcd = "off",
school = "physical",
startsCombat = false,
toggle = "cooldowns",
start = function ()
applyBuff( "aspect_of_the_turtle" )
end,
},
-- Talent: Fire a shot that tears through your enemy, causing them to bleed for ${$s1*$s2} damage over $d$?s257944[ and increases your critical strike chance by $257946s1% for $257946d, stacking up to $257946u $Ltime:times;][]. Sends your pet into a frenzy, increasing attack speed by $272790s1% for $272790d, stacking up to $272790u times. |cFFFFFFFFGenerates ${$246152s1*$246152d/$246152t1} Focus over $246152d.|r
barbed_shot = {
id = 217200,
cast = 0,
charges = 2,
cooldown = 18,
recharge = 18,
hasteCD = true,
gcd = "spell",
school = "physical",
talent = "barbed_shot",
startsCombat = true,
velocity = 50,
cycle = "barbed_shot_dot",
handler = function ()
if buff.barbed_shot.down then applyBuff( "barbed_shot" )
else
for i = 2, 8 do
if buff[ "barbed_shot_" .. i ].down then applyBuff( "barbed_shot_" .. i ); break end
end
end
applyDebuff( "target", "barbed_shot_dot" )
addStack( "frenzy", nil, 1 )
if talent.barbed_wrath.enabled then reduceCooldown( "bestial_wrath", 12 ) end
if talent.thrill_of_the_hunt.enabled then addStack( "thrill_of_the_hunt", nil, 1 ) end
--- Legacy / PvP Stuff
if set_bonus.tier29_4pc > 0 then applyBuff( "lethal_command" ) end
if legendary.qapla_eredun_war_order.enabled then
setCooldown( "kill_command", 0 )
end
if legendary.latent_poison_injectors.enabled then
removeDebuff( "target", "latent_poison" )
end
end,
},
-- Talent: Sends you and your pet into a rage, instantly dealing $<damage> Physical damage to its target, and increasing all damage you both deal by $s1% for $d. Removes all crowd control effects from your pet. $?s231548[ Bestial Wrath's remaining cooldown is reduced by $s3 sec each time you use Barbed Shot][]$?s193532[ and activating Bestial Wrath grants $s2 $Lcharge:charges; of Barbed Shot.][]$?s231548&!s193532[.][]
bestial_wrath = {
id = 19574,
cast = 0,
cooldown = 90,
gcd = "spell",
school = "physical",
talent = "bestial_wrath",
startsCombat = false,
toggle = "cooldowns",
nobuff = function () return settings.avoid_bw_overlap and "bestial_wrath" or nil, "avoid_bw_overlap is checked and bestial_wrath is up" end,
handler = function ()
-- Base Functionality / Talents
applyBuff( "bestial_wrath" )
if talent.scent_of_blood.enabled then gainCharges( "barbed_shot", talent.scent_of_blood.rank ) end
-- Hero Talents
if talent.lead_from_the_front.enabled then howl_summon.trigger_summon( true ) end
if set_bonus.tww2 >= 2 then
spec.abilities.barbed_shot.handler()
if set_bonus.tww2 >= 4 then
applyBuff( "potent_mutagen" )
end
end
-- Legacy / PvP Stuff
if set_bonus.tier31_2pc > 0 then
applyBuff( "dire_beast", 15 )
summonPet( "dire_beast", 15 )
end
if pvptalent.the_beast_within.enabled then applyBuff( "the_beast_within" ) end
end,
},
-- Talent: Fires a magical projectile, tethering the enemy and any other enemies within $s2 yards for $d, stunning them for $117526d if they move more than $s2 yards from the arrow.$?s321468[ Targets stunned by Binding Shot deal $321469s1% less damage to you for $321469d after the effect ends.][]
binding_shot = {
id = 109248,
cast = 0,
cooldown = 45,
gcd = "spell",
school = "nature",
talent = "binding_shot",
startsCombat = false,
handler = function ()
applyDebuff( "target", "binding_shot" )
end,
},
-- Command your pet to tear into your target, causing your target to bleed for $<damage> over $321538d and take $321538s2% increased damage from your pet by for $321538d.
bloodshed = {
id = 321530,
cast = 0,
cooldown = 60,
gcd = "spell",
school = "physical",
talent = "bloodshed",
startsCombat = true,
usable = function() return pet.alive, "requires a living pet" end,
handler = function ()
applyDebuff( "target", "bloodshed" )
end,
},
-- Fires an explosion of bolts at all enemies in front of you, knocking them back, snaring them by $s4% for $d, and dealing $s1 Physical damage.$?s378771[; When you fall below $378771s1% heath, Bursting Shot's cooldown is immediately reset. This can only occur once every $385646d.][]
bursting_shot = {
id = 186387,
cast = 0.0,
cooldown = 30.0,
gcd = "spell",
spend = 10,
spendType = 'focus',
talent = "bursting_shot",
startsCombat = true,
},
-- Talent: You sound the call of the wild, summoning $s1 of your active pets for $d. During this time, a random pet from your stable will appear every $t2 sec to assault your target for $361582d.$?s378442[ While Call of the Wild is active, Barbed Shot has a $378442h% chance to gain a charge any time Focus is spent.][]$?s378739[ While Call of the Wild is active, Barbed Shot affects all of your summoned pets.][]
call_of_the_wild = {
id = 359844,
cast = 0,
cooldown = function() if set_bonus.tww3_dark_ranger >=2 then return 60 else return 120 end end,
gcd = "spell",
school = "nature",
talent = "call_of_the_wild",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
applyBuff( "call_of_the_wild" )
gainCharges( "kill_command", 1 )
gainCharges( "barbed_shot", 1 )
-- Queue the pet summons for CDR calculation
for i = 4, 20, 4 do
state:QueueAuraEvent( "call_of_the_wild_cdr", CallOfTheWildCDR, query_time + i, "AURA_TICK" )
end
if talent.bloody_frenzy.enabled then applyBuff( "beast_cleave", 20 ) end
if talent.withering_fire.enabled then
applyBuff( "withering_fire" )
applyBuff( "deathblow" )
if set_bonus.tww2 >= 4 then
removeBuff( "blighted_quiver" )
end
end
end,
},
-- Talent: You and your pet blend into the surroundings and gain stealth for $d. While camouflaged, you will heal for $s4% of maximum health every $T4 sec.
camouflage = {
id = 199483,
cast = 0,
cooldown = 60,
gcd = "off",
school = "physical",
talent = "camouflage",
startsCombat = false,
handler = function ()
applyBuff( "camouflage" )
end,
},
-- Talent: A quick shot causing ${$s2*$<mult>} Physical damage. Reduces the cooldown of Kill Command by $?s378244[${$s3+($378244s1/-1000)}][$s3] sec.
cobra_shot = {
id = 193455,
cast = 0,
cooldown = 0,
gcd = "spell",
school = "physical",
spend = function () return talent.cobra_senses.enabled and 30 or 35 end,
spendType = "focus",
talent = "cobra_shot",
startsCombat = true,
handler = function ()
if talent.serpentine_rhythm.enabled then
if buff.serpentine_rhythm.stacks == 3 then
removeBuff( "serpentine_rhythm" )
applyBuff( "serpentine_blessing" )
else addStack( "serpentine_rhythm" )
end
end
-- CDR
if talent.dire_summons.enabled and buff.howl_of_the_pack_leader_cooldown.up then buff.howl_of_the_pack_leader_cooldown.expires = buff.howl_of_the_pack_leader_cooldown.expires - 1 end
if talent.barbed_scales.enabled then
reduceCooldown( "barbed_shot", 2 )
end
reduceCooldown( "kill_command", 1 )
if talent.killer_cobra.enabled and buff.bestial_wrath.up then gainCharges( "kill_command", 1 ) end
-- Legacy / PvP Stuff
if debuff.concussive_shot.up then debuff.concussive_shot.expires = debuff.concussive_shot.expires + 3 end
if set_bonus.tier30_4pc > 0 then reduceCooldown( "bestial_wrath", 1 ) end
end,
},
-- Talent: Dazes the target, slowing movement speed by $s1% for $d. $?s193455[Cobra Shot][Steady Shot] will increase the duration of Concussive Shot on the target by ${$56641m3/10}.1 sec.
concussive_shot = {
id = 5116,
cast = 0,
cooldown = 5,
gcd = "spell",
school = "physical",
talent = "concussive_shot",
startsCombat = true,
handler = function ()
applyDebuff( "target", "concussive_shot" )
end,
},
-- Talent: Interrupts spellcasting, preventing any spell in that school from being cast for $d.
counter_shot = {
id = 147362,
cast = 0,
cooldown = function() return 24 - 2 * talent.lone_survivor.rank end,
gcd = "off",
school = "physical",
talent = "counter_shot",
startsCombat = true,
toggle = "interrupts",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
if conduit.reversal_of_fortune.enabled then
gain( conduit.reversal_of_fortune.mod, "focus" )
end
interrupt()
end,
},
-- Summons a powerful wild beast that attacks the target and roars, increasing your Haste by $281036s1% for $d.; Generates $281036s2 Focus.
dire_beast = {
id = 120679,
cast = 0,
cooldown = 20,
gcd = "spell",
school = "nature",
spend = -20,
spendType = "focus",
talent = "dire_beast",
startsCombat = true,
handler = function ()
applyBuff( "dire_beast" )
summonPet( "dire_beast", 8 )
end,
},
dire_beast_basilisk = {
id = 205691,
cast = 0,
cooldown = 120,
gcd = "spell",
spend = 60,
spendType = "focus",
toggle = "cooldowns",
pvptalent = "dire_beast_basilisk",
startsCombat = true,
texture = 1412204,
handler = function ()
applyDebuff( "target", "dire_beast_basilisk" )
end,
},
dire_beast_hawk = {
id = 208652,
cast = 0,
cooldown = 30,
gcd = "spell",
spend = 30,
spendType = "focus",
pvptalent = "dire_beast_hawk",
startsCombat = true,
texture = 612363,
handler = function ()
applyDebuff( "target", "dire_beast_hawk" )
end,
},
-- Leap backwards$?s109215[, clearing movement impairing effects, and increasing your movement speed by $118922s1% for $118922d][]$?s109298[, and activating a web trap which encases all targets within $115928A1 yards in sticky webs, preventing movement for $136634d][].
disengage = {
id = 781,
cast = 0,
cooldown = 20,
gcd = "off",
school = "physical",
icd = 0.5,
startsCombat = false,
handler = function ()
if talent.posthaste.enabled then applyBuff( "posthaste" ) end
if conduit.tactical_retreat.enabled then applyDebuff( "target", "tactical_retreat" ) end
end,
},
exhilaration = {
id = 109304,
cast = 0,
cooldown = 120,
gcd = "spell",
startsCombat = false,
texture = 461117,
toggle = "defensives",
handler = function ()
if talent.rejuvenating_wind.enabled or conduit.rejuvenating_wind.enabled then applyBuff( "rejuvenating_wind" ) end
end,
},
-- Talent: Fires an explosive shot at your target. After $t1 sec, the shot will explode, dealing $212680s1 Fire damage to all enemies within $212680A1 yards. Deals reduced damage beyond $s2 targets.
explosive_shot = {
id = 212431,
cast = 0,
cooldown = 30,
gcd = "spell",
school = "fire",
spend = 20,
spendType = "focus",
talent = "explosive_shot",
startsCombat = true,
handler = function ()
applyDebuff( "target", "explosive_shot", debuff.explosive_shot.remains + spec.auras.explosive_shot.duration )
end,
},
-- Take direct control of your pet and see through its eyes for $d.
eyes_of_the_beast = {
id = 321297,
cast = 2,
cooldown = 0,
gcd = "spell",
school = "nature",
startsCombat = false,
handler = function ()
applyBuff( "eyes_of_the_beast" )
end,
},
-- Feign death, tricking enemies into ignoring you. Lasts up to $d.
feign_death = {
id = 5384,
cast = 0,
cooldown = function () return legendary.craven_stategem.enabled and 15 or 30 end,
gcd = "off",
school = "physical",
startsCombat = false,
handler = function ()
applyBuff( "feign_death" )
if pvptalent.survival_tactics.enabled then
applyBuff( "survival_tactics" )
end
if talent.emergency_salve.enabled then
removeDebuff( "player", "dispellable_disease" )
removeDebuff( "player", "dispellable_poison" )
end
if legendary.craven_strategem.enabled then
removeDebuff( "player", "dispellable_curse" )
removeDebuff( "player", "dispellable_disease" )
removeDebuff( "player", "dispellable_magic" )
removeDebuff( "player", "dispellable_poison" )
end
end,
},
-- Exposes all hidden and invisible enemies within the targeted area for $m1 sec.
flare = {
id = 1543,
cast = 0,
cooldown = 20,
gcd = "spell",
school = "arcane",
startsCombat = false,
handler = function ()
if legendary.soulforge_embers.enabled and debuff.tar_trap.up then
applyDebuff( "target", "soulforge_embers" )
active_dot.soulforge_embers = max( 1, min( 5, active_dot.tar_trap ) )
end
end,
},
-- Increase the maximum health of you and your pet by 20% for 10 sec, and instantly heals you for that amount.
fortitude_of_the_bear = {
id = 272679,
cast = 0,
cooldown = function() return pvptalent.kindred_beasts.enabled and 60 or 120 end,
gcd = "off",
startsCombat = false,
texture = off,
handler = function ()
local hp = health.max * 0.2
health.max = health.max + hp
gain( hp, "health" )
applyBuff( "fortitude_of_the_bear" )
end,
copy = { 388035, 392956 }, -- Pet's version?
auras = {
fortitude_of_the_bear = {
id = 388035,
duration = 10,
max_stack = 1,
copy = 392956
}
}
},
-- Hurls a frost trap to the target location that incapacitates the first enemy that approaches for $3355d. Damage will break the effect. Limit 1. Trap will exist for $3355d.
freezing_trap = {
id = 187650,
cast = 0,
cooldown = function() return 30 - 5 * talent.improved_traps.rank end,
gcd = "spell",
school = "physical",
spend = function ()
if legendary.nessingwarys_trapping_apparatus.enabled then
return -45, "focus"
end
end,
startsCombat = false,
handler = function ()
end,
},
-- Talent: Hurls a fire trap to the target location that explodes when an enemy approaches, causing $236777s2 Fire damage and knocking all enemies away. Trap will exist for $236775d.$?s321468[ Targets knocked back by High Explosive Trap deal $321469s1% less damage to you for $321469d after being knocked back.][]
high_explosive_trap = {
id = 236776,
cast = 0,
cooldown = function() return 40 - 5 * talent.improved_traps.rank end,
gcd = "spell",
school = "fire",
spend = function ()
if legendary.nessingwarys_trapping_apparatus.enabled then
return -45, "focus"
end
end,
talent = "high_explosive_trap",
startsCombat = false,
handler = function ()
end,
},
howl_of_the_pack_leader = {
cast = 0,
cooldown = 30,
gcd = "off",
hidden = true,
},
-- Apply Hunter's Mark to the target, causing the target to always be seen and tracked by the Hunter.; Hunter's Mark increases all damage dealt to targets above $s3% health by $428402s1%. Only one Hunter's Mark damage increase can be applied to a target at a time.; Hunter's Mark can only be applied to one target at a time. When applying Hunter's Mark in combat, the ability goes on cooldown for ${$s5/1000} sec.
hunters_mark = {
id = 257284,
cast = 0,
cooldown = function () return time > 0 and 20 or 0 end,
gcd = "totem",
school = "nature",
startsCombat = false,
handler = function ()
applyDebuff( "target", "hunters_mark" )
end,
},
-- Hurls a fire trap to the target location that explodes when an enemy approaches, causing $236777s2 Fire damage and knocking all enemies up. Limit $s2. Trap will exist for $236775d.$?s321468[; Targets knocked up by Implosive Trap deal $321469s1% less damage to you for $321469d after being knocked up.][]
implosive_trap = {
id = 462031,
cast = 0.0,
cooldown = function() return 60.0 - 5 * talent.improved_traps.rank end,
gcd = "spell",
talent = "implosive_trap",
startsCombat = false,
handler = function()
end,
},
interlope = {
id = 248518,
cast = 0,
cooldown = 45,
gcd = "spell",
pvptalent = "interlope",
startsCombat = false,
texture = 132180,
handler = function ()
end,
},
-- Talent: Commands your pet to intimidate the target, stunning it for $24394d.$?s321468[ Targets stunned by Intimidation deal $321469s1% less damage to you for $321469d after the effect ends.][]
intimidation = {
id = 19577,
cast = 0,
cooldown = function() return 60 - 10 * talent.territorial_instincts.rank end,
gcd = "spell",
school = "nature",
talent = "intimidation",
startsCombat = true,
handler = function ()
applyDebuff( "target", "intimidation" )
end,
},
-- Talent: Give the command to kill, causing your pet to savagely deal $<damage> Physical damage to the enemy.
kill_command = {
id = 34026,
cast = 0,
charges = function() if talent.alpha_predator.enabled then return 2 end end,
cooldown = 7.5,
recharge = function() if talent.alpha_predator.enabled then return 7.5 * haste end end,
hasteCD = true,
icd = 0.5,
gcd = "spell",
school = "physical",
spend = 30,
spendType = "focus",
talent = "kill_command",
startsCombat = true,
disabled = function()
if settings.check_pet_range and settings.petbased and Hekili:PetBasedTargetDetectionIsReady( true ) and not Hekili:TargetIsNearPet( "target" ) then return true, "not in-range of pet" end
end,
handler = function ()
if talent.howl_of_the_pack_leader.enabled then howl_summon.trigger_summon( false ) end
if talent.wild_instincts.enabled and buff.call_of_the_wild.up then
applyDebuff( "target", "wild_instincts", nil, min( spec.auras.wild_instincts.max_stack, debuff.wild_instincts.stack + 1 ) )
end
--- Legacy / PvP Stuff
if legendary.flamewakers_cobra_sting.enabled then removeBuff( "flamewakers_cobra_sting" ) end
if set_bonus.tier29_4pc > 0 then removeBuff( "lethal_command" ) end
if set_bonus.tier30_4pc > 0 then reduceCooldown( "bestial_wrath", 1 ) end
end,
},
-- Talent: You attempt to finish off a wounded target, dealing $s1 Physical damage. Only usable on enemies with less than $s2% health.$?s343248[ Kill Shot deals $343248s1% increased critical damage.][]
kill_shot = {
id = function() return talent.black_arrow.enabled and 466930 or 53351 end,
cast = 0,
cooldown = 10,
gcd = "spell",
school = function() return talent.black_arrow.enabled and "shadow" or "physical" end,
spend = function () return ( buff.flayers_mark.up ) and 0 or 10 end,
spendType = "focus",
talent = "kill_shot",
startsCombat = true,
cycle = function() if talent.banshees_mark.enabled then return "a_murder_of_crows" end end,
usable = function () return buff.deathblow.up or target.health_pct < 20 or talent.black_arrow.enabled and target.health_pct > 80, "Requires deathblow, target health below 20 percent (or above 80% with Black Arrow)" end,
handler = function ()
removeBuff( "deathblow" )
if talent.black_arrow.enabled then
applyDebuff( "target", "black_arrow" )
if talent.umbral_reach.active and active_enemies > 1 then
active_dot.black_arrow = min( active_dot.black_arrow, true_active_enemies )
if talent.beast_cleave.enabled then applyBuff( "beast_cleave" ) end
end
end
--- Legacy / PvP Stuff
if covenant.venthyr then
if buff.flayers_mark.up and legendary.pouch_of_razor_fragments.enabled then
applyDebuff( "target", "pouch_of_razor_fragments" )
removeBuff( "flayers_mark" )
end
end
end,
bind = "black_arrow",
copy = { 53351, 320976 }
},
-- Your pet removes all root and movement impairing effects from itself and a friendly target, and grants immunity to all such effects for 4 sec.
masters_call = {
id = 272682,
cast = 0,
cooldown = function() return pvptalent.kindred_beasts.enabled and 22.5 or 45 end,
gcd = "spell",
startsCombat = false,
texture = off,
handler = function ()
applyBuff( "masters_call" )
end,
copy = 53271, -- Pet's version.
auras = {
masters_call = {
id = 62305,
duration = 4,
max_stack = 1
}
}
},
-- Talent: Misdirects all threat you cause to the targeted party or raid member, beginning with your next attack within $d and lasting for $35079d.
misdirection = {
id = 34477,
cast = 0,
cooldown = function() return 30 - ( 5 * talent.no_hard_feelings.rank ) end,
gcd = "off",
school = "physical",
talent = "misdirection",
nopvptalent = "interlope",
startsCombat = false,
handler = function ()
applyBuff( "misdirection" )
end,
},
-- Talent: Fires several missiles, hitting all nearby enemies within $A2 yards of your current target for $s2 Physical damage$?s115939[ and triggering Beast Cleave][]. Deals reduced damage beyond $s1 targets.$?s19434[ |cFFFFFFFFGenerates $213363s1 Focus per target hit.|r][]
multishot = {
id = 2643,
cast = 0,
cooldown = 0,
gcd = "spell",
school = "physical",
spend = 40,
spendType = "focus",
talent = "multishot",
startsCombat = true,
handler = function ()
applyBuff( "beast_cleave" )
-- Legacy / PvP Stuff
if set_bonus.tier30_4pc > 0 then reduceCooldown( "bestial_wrath", 1 ) end
end,
},
-- Talent: Interrupts spellcasting, preventing any spell in that school from being cast for $d.
muzzle = {
id = 187707,
cast = 0,
cooldown = function() return 15 - 2 * talent.lone_survivor.rank end,
gcd = "off",
school = "physical",
startsCombat = true,
toggle = "interrupts",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
if conduit.reversal_of_fortune.enabled then gain( conduit.reversal_of_fortune.mod, "focus" ) end
interrupt()
end,
},
primal_rage = {
id = 272678,
cast = 0,
cooldown = 360,
gcd = "spell",
toggle = "cooldowns",
startsCombat = true,
texture = 136224,
usable = function () return pet.alive and pet.ferocity, "requires a living ferocity pet" end,
handler = function ()
applyBuff( "primal_rage" )
stat.haste = stat.haste + 0.4
applyDebuff( "player", "exhaustion" )
end,
},
roar_of_sacrifice = {
id = 53480,
cast = 0,
cooldown = 60,
gcd = "spell",
talent = "roar_of_sacrifice",
startsCombat = false,
texture = 464604,
handler = function ()
applyBuff( "roar_of_sacrifice" )
end,
},
--[[ Talent: Scares a beast, causing it to run in fear for up to $d. Damage caused may interrupt the effect. Only one beast can be feared at a time.
scare_beast = {
id = 1513,
cast = 1.5,
cooldown = 0,
gcd = "spell",
school = "nature",
spend = 25,
spendType = "focus",
talent = "scare_beast",
startsCombat = false,
usable = function() return target.is_beast, "requires a beast target" end,
handler = function ()
applyDebuff( "tagret", "scare_beast" )
end,
}, ]]
-- Talent: A short-range shot that deals $s1 damage, removes all harmful damage over time effects, and incapacitates the target for $d. Any damage caused will remove the effect. Turns off your attack when used.$?s321468[ Targets incapacitated by Scatter Shot deal $321469s1% less damage to you for $321469d after the effect ends.][]
scatter_shot = {
id = 213691,
cast = 0,
cooldown = 30,
gcd = "spell",
school = "physical",
talent = "scatter_shot",
startsCombat = false,
handler = function ()
-- trigger scatter_shot [37506]
applyDebuff( "target", "scatter_shot" )
end,
},
spirit_mend = {
id = 90361,
cast = 0,
cooldown = 30,
gcd = "spell",
startsCombat = false,
texture = 237586,
handler = function ()
applyBuff( "spirit_mend" )
end,
},
-- A steady shot that causes $s1 Physical damage.; Usable while moving.$?s321018[; Generates $s2 Focus.][]
steady_shot = {
id = 56641,
cast = 1.7,
spend = -10,
spendType = "focus",
cooldown = 0.0,
gcd = "spell",
notalent = "barbed_shot",
startsCombat = true,
},
-- Reduces all damage you and your pet take by $s1% for $d.
survival_of_the_fittest = {
id = 264735,
cast = 0,
cooldown = function () return ( talent.lone_survivor.enabled and 150 or 180 ) * ( pvptalent.hunting_pack.enabled and 0.5 or 1 ) * ( legendary.call_of_the_wild.enabled and 0.75 or 1 ) * ( 1 - 0.075 * talent.born_to_be_wild.rank ) + ( conduit.cheetahs_vigor.mod * 0.001 ) end,
charges = function() return talent.padded_armor.enabled and ( ( talent.lone_survivor.enabled and 150 or 180 ) * ( pvptalent.hunting_pack.enabled and 0.5 or 1 ) * ( legendary.call_of_the_wild.enabled and 0.75 or 1 ) * ( 1 - 0.075 * talent.born_to_be_wild.rank ) + ( conduit.cheetahs_vigor.mod * 0.001 ) ) or nil end,
recharge = function() return talent.padded_armor.enabled and 2 or nil end,
gcd = "off",
startsCombat = false,
handler = function()
applyBuff( "survival_of_the_fittest" )
end,
},
summon_pet = {
id = 883,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 0,
spendType = "focus",
startsCombat = false,
texture = 'Interface\\ICONS\\Ability_Hunter_BeastCall',
essential = true,
nomounted = true,
usable = function () return not pet.exists, "requires no active pet" end,
handler = function ()
summonPet( "made_up_pet", 3600, "ferocity" )
end,
},
-- Hurls a tar trap to the target location that creates a $187699s1 yd radius pool of tar around itself for $13810d when the first enemy approaches. All enemies have $135299s1% reduced movement speed while in the area of effect. Limit $s2. Trap will exist for $13809d.
tar_trap = {
id = 187698,
cast = 0,
cooldown = function() return 30 - 5 * talent.improved_traps.rank end,
gcd = "spell",
school = "physical",
spend = function ()
if legendary.nessingwarys_trapping_apparatus.enabled then
return -45, "focus"
end
end,
talent = "tar_trap",
startsCombat = false,
-- Let's not recommend Tar Trap if Flare is on CD.
timeToReady = function () return max( 0, cooldown.flare.remains - gcd.max ) end,
handler = function ()
applyDebuff( "target", "tar_trap" )
end,
},
-- Talent: Removes $s1 Enrage and $s2 Magic effect from an enemy target.$?s343244[ Successfully dispelling an effect generates $343244s1 Focus.][]
tranquilizing_shot = {
id = 19801,
cast = 0,
cooldown = 10,
gcd = "totem",
school = "nature",
talent = "tranquilizing_shot",
startsCombat = true,
toggle = "interrupts",
usable = function () return buff.dispellable_enrage.up or buff.dispellable_magic.up, "requires enrage or magic effect" end,
handler = function ()
if talent.devilsaur_tranquilizer.enabled and buff.dispellable_enrage.up and buff.dispellable_magic.up then reduceCooldown( "tranquilizing_shot", 5 ) end
removeBuff( "dispellable_enrage" )
removeBuff( "dispellable_magic" )
if state.spec.survival or talent.improved_tranquilizing_shot.enabled then gain( 10, "focus" ) end
end,
},
-- Sylvanas Legendary / Talent: Fire an enchanted arrow, dealing $354831s1 Shadow damage to your target and an additional $354831s2 Shadow damage to all enemies within $354831A2 yds of your target. Targets struck by a Wailing Arrow are silenced for $355596d.
wailing_arrow = {
id = 355589,
cast = function()
if buff.lock_and_load.up then return 0 end
return ( buff.trueshot.up and 1 or 2 ) * haste
end,
cooldown = 60,
gcd = "spell",
spend = function()
if buff.lock_and_load.up then return 0 end
return 15 * ( buff.trueshot.up and 0.5 or 1 )
end, -- TODO: Does game match spell data?
spendType = "focus",
toggle = "cooldowns",
startsCombat = true,
usable = function ()
if moving and settings.prevent_hardcasts then return false, "prevent_hardcasts is checked and player is moving" end
return true
end,
handler = function ()
removeStack( "lock_and_load" )
interrupt()
applyDebuff( "target", "wailing_arrow" )
if talent.readiness.enabled then
setCooldown( "rapid_fire", 0 )
gainCharges( "aimed_shot", 2 )
end
end,
copy = { 392060, 355589 }
},
-- Maims the target, reducing movement speed by $s1% for $d.
wing_clip = {
id = 195645,
cast = 0,
cooldown = 0,
gcd = "spell",
school = "physical",
spend = 20,
spendType = "focus",
startsCombat = true,
handler = function ()
applyDebuff( "target", "wing_clip" )
end,
},
-- Utility
mend_pet = {
id = 136,
cast = 0,
cooldown = 10,
gcd = "spell",
startsCombat = false,
usable = function ()
if not pet.alive then return false, "requires a living pet" end
return true
end,
},
} )
spec:RegisterRanges( "arcane_shot", "kill_command", "wing_clip" )
spec:RegisterOptions( {
enabled = true,
aoe = 3,
cycle = false,
nameplates = false,
nameplateRange = 40,
rangeFilter = false,
damage = true,
damageExpiration = 3,
potion = "tempered_potion",
package = "Beast Mastery",
} )
spec:RegisterSetting( "barbed_shot_grace_period", 0, {
name = strformat( "%s Grace Period", Hekili:GetSpellLinkWithTexture( spec.abilities.barbed_shot.id ) ),
desc = strformat( "If set above zero, %s's cooldown will be reduced by this number of global cooldowns. This feature helps to ensure that you maintain %s stacks by recommending %s with time remaining on %s.",
Hekili:GetSpellLinkWithTexture( spec.abilities.barbed_shot.id ), Hekili:GetSpellLinkWithTexture( spec.auras.frenzy.id ), Hekili:GetSpellLinkWithTexture( spec.abilities.barbed_shot.id ), Hekili:GetSpellLinkWithTexture( spec.auras.frenzy.id ) ),
icon = 2058007,
iconCoords = { 0.1, 0.9, 0.1, 0.9 },
type = "range",
min = 0,
max = 2,
step = 0.01,
width = 1.5
} )
spec:RegisterSetting( "pet_healing", 0, {
name = strformat( "%s Below Health %%", Hekili:GetSpellLinkWithTexture( spec.abilities.mend_pet.id ) ),
desc = strformat( "If set above zero, %s may be recommended when your pet falls below this health percentage. Setting to |cFFFFd1000|r disables this feature.",
Hekili:GetSpellLinkWithTexture( spec.abilities.mend_pet.id ) ),
icon = 132179,
iconCoords = { 0.1, 0.9, 0.1, 0.9 },
type = "range",
min = 0,
max = 100,
step = 1,
width = 1.5
} )
spec:RegisterSetting( "avoid_bw_overlap", false, {
name = strformat( "Avoid %s Overlap", Hekili:GetSpellLinkWithTexture( spec.abilities.bestial_wrath.id ) ),
desc = strformat( "If checked, %s will not be recommended if the buff is already active.", Hekili:GetSpellLinkWithTexture( spec.abilities.bestial_wrath.id ) ),
type = "toggle",
width = "full"
} )
spec:RegisterSetting( "mark_any", false, {
name = strformat( "%s Any Target", Hekili:GetSpellLinkWithTexture( spec.abilities.hunters_mark.id ) ),
desc = strformat( "If checked, %s may be recommended for any target rather than only bosses.", Hekili:GetSpellLinkWithTexture( spec.abilities.hunters_mark.id ) ),
type = "toggle",
width = "full"
} )
spec:RegisterSetting( "check_pet_range", false, {
name = strformat( "Check Pet Range for %s", Hekili:GetSpellLinkWithTexture( spec.abilities.kill_command.id ) ),
desc = function ()
return strformat( "If checked, %s will only be recommended if your pet is in range of your target.\n\n" ..
"Requires |c" .. ( state.settings.petbased and "FF00FF00" or "FFFF0000" ) .. "Pet-Based Target Detection|r",
Hekili:GetSpellLinkWithTexture( spec.abilities.kill_command.id ) )
end,
type = "toggle",
width = "full"
} )
spec:RegisterSetting( "barbed_shot_opener", true, {
name = strformat( "Use %s Opener", Hekili:GetSpellLinkWithTexture( spec.abilities.barbed_shot.id ) ),
desc = strformat( "If checked, %s will be recommended as the first ability in combat. This differs from SimulationCraft behavior which uses %s first but aligns with written guides. The %s opener ensures your pets immediately move to the target at the start of the fight.",
Hekili:GetSpellLinkWithTexture( spec.abilities.barbed_shot.id ),
Hekili:GetSpellLinkWithTexture( spec.abilities.bestial_wrath.id ),
Hekili:GetSpellLinkWithTexture( spec.abilities.barbed_shot.id ) ),
type = "toggle",
width = "full"
} )
spec:RegisterPack( "Beast Mastery", 20250804, [[Hekili:T3XAVTTrYFlgfNIvJTSiLvItoBd0RhoCjiTO4uo0puurrtrzryjsvsQ46dg83(nZYxl5o7YL0sXofcTirH7UZRD25fjho1y6NNozUDS70F2CO54Hxm88bMJgn288PtIFyJ70jBSDUZ(w4h(2RH)8F4AhfNm7NG)0n8bC4hwfyphbtuW2qhyklJJ3e9(Zo7wV4LBVzGtW6ZI8wVDLDSxGVtO9Iy8F7C2nRcU5S4LU3BhEpmvp)Z(bhCk)sOxqOx8dFYlko6S5UlS3Uk(SLB9bmADdIFR1POFacNPtUzR3Q4p4p9gkw5CJXtNyVnEzq40jt8w)Jab6nFUB60DJG1F6PjZ(8s3Kz)QDi8hmAjz2eatbWFpk5Ji8oD4fNo883Nm7xcDx5T2Z3o8HKzggdmtM9d)YNs(i(FQHKzoKgDQX7aiHutYS)7gKOtM5CHZnJx4WnheB)W85jZw7ff55FlmNL2(3cZDryW6KzBcD)IxW2OCiTnfsLay47Ro0jjZSr4DJD4njZIwga7KbBC9DdX)gL95l28uZlGf)5F9x5j)AyW8uJ3siqmYeiWKo)uddGsQrgr5Jn8uZ3OymCDa8goyC2fh(UtnnFpb7EoU7OyOHgWq)h3OnUoal)VzQsVkcvJdVdeeUXXO4nB6V9uZ3Ml5)r7vRazZIKzXSTvVvWfJTx56hJ7gUo3f93b0fbJ9JbmWcKaixZVynuvIbK3QRPmDYkuLhplfh65FNl73)m7mQRV9nRCNp9FmDsWg4SMBmOvZoUmDYxSd9WrXFTAl8xPe4ahG4TcwybKU19aLpidijZ6Lm74u9hRBDMpWqyQjZ6Nm7XhZ51bWz1G5rlDvbJI5uSyy8JkaHsQ5ivyQFoYUz7IfdUXnk2ZEL19H2XlhSDtkQCccwnp4E)Adh6U22ZpY62TUrWMWLjZgdWJjYSsnOHW0k6bFhRqx75pmngmFqlW9wqlYPGedRtN4a2XCHzoDYtxoKT7A5Ukcqwb)kaUmKxxSuaUcIltzrhjhkvgTxudzBPcZiFxvP2hTQ3oxVJuPJEFhLeFXffwN3AHLbpiNBVg85whOJLb0s1Sm7gdIngS0oYcSbzHKx(bOCSoOuHxyOmqyzyffhgaUBcZ2lYbT5GcvMcDTSd8h1DuqtGzG)Ao0BuI(5BdzbvKm7m0pnB3kapNd)yH3TlJBbeEn4GBOaNkievkfUwkdaXfymUzaCkZ(0LsbtpPJaK)5JzuqngVqMKTfjSjykSjOKe1ykDNlU(kYDbzOaNUCC8KvNQqfKZ7s5IBLeWRBcWI7J9Z)F5YM8JAY5Au2kFcxsd46ILkuYrv4ekBo8mkg7ES3AiShyNBOeBgPg84C7FK6JKnzzPrLjrHkfoKsNnkXBKaYMxPuvMvmyhYC8oIPbFhRcIlCzyu4jAyQpQOC4MQVEfB7hfkGVM1tNG)kaC8boGXquvgzeV7S8Wpa)zVPM)SCqKHxZAuOPisjC81GcIgELmLjgn2zo(eT5QHLkfhj10XhjeOC8rCswPuOvo(Oaq3Dz0DhFIrFOKe1ykDNliD8jhf7chFkuNKz8y364JeW664ZyF54tr8asD8rBZHNrF6o(AiG(NIXRgWXoYXNe7g7chFTJPbxpGtL5HrXfvxj3ZZDEqUIyDX49lLxrG8jvKPyTjvpb5sNtIMKFZWg53rdlrz9CyPsXSeDf8S8AdWTbPtMY48ubvSWjLYh(CLPYBTKsZkGeldEBN7SSdddUpfDzxVyhPs64y9Ibi4FR1cVqxw(4v2cDcwV22FUQGmWAG6opBZMBRAlS8qxNL2HqelPhzHndSmdRT)ZmjbBWiRfHPaZEvQf5cjepnmqC2a(EWzfaDCG4iuhei03kOiMZfvvZUGFEob3eAtOXIk4Pfoxqh3jToLnQMhhA7)hB9w59)q5mXSLRVVbo7T01Ev8sRnybxbbiCjl8saSkrXAx)5wWiQvNpUOcTrWEqiOL4)q25CMaCGxKvHNEqdj18K18aGiySAK1AwDEtn92RyD4URvCasJwxmm7qrj1XVyk14khot)hwybCtlJBwOVoZvgQRY1Mh)DH2bP4PO(vfhGQxJ2mbIRV7Ap3mJP1p7NEFvaTs7V4wz9elEel7bTybMv2CL2De5FDb53wAhwPrBO9uqI0)7Ks)8vquBw4R4oqQ83y4ULb(AThuSdaxg8iaweVXw0Kw021RHvJwsimO1QYWkgwxUvDDJvsAuHILlXdmO5bI7q0DkZ)W2qWNuCW6aCtqmPdtnwIwbVRoC36GOm61AlTCa5l5kzlPxt05vnrNTPmuTlE9)Il0sVZ3HEBspf8pDbBbR98b4ZUnNLrtNbk4hbWLHy8tMHXEvgRt0GKzFaGkcpWBo7UuVj7g4)(0O1sM5UyHRtC6H)0AbvCTtsMTkdxxZUL0HS7HAb4Lno7PqafjibabC44HrHbx2nLwDc8J8MJt9NyhxsVjU)R8dmjZ(C5jM7DTVJXSlTbojadTuGYJ88Daq7H)EtW94m8WlVzLhqi34gFVRRFM4B(6BZxjy)ZFE2L5H4a(YJLNgtzbj629B7iLf5GcJMvWy9qWYruLqLRO48BtEi0BXVZklXNyvkeoufgHHiheGBf3V0nvCI7jlcwTcdV)2TWodk0wAJp)c4EtikHxZDnEpufr)XriwPp3c55YL5NOUJHQPIO23qj(OtXilHT07giNZo(C2YstGkHsIDus5RUPIqNeH8OOfj8uNALwh5UpOpaUwC9)FpOFgGLvvoNRwdjF4LZ6J1jl73ujnL6P8wDUVvNmYBmQZyig)5P7YGc7xaJj5ZUa2U)5Mvbryim58Y70mrnfXCTiWzBur(hSel5tY87jcpSqCksICjbIOTYjGAKF9KeX0tiEetQP2i9(ZRtTd6P852qrbqmgXFqoemSChM9yZhDFMi33utH0AX2WhuNO8leY1g8TbocGLJisd7ippK87kPy0MmtitLy(lcIDe39eBta7VzN44Q6OCsEzW9f0d(ayAbwSb7uwK3pa2kWjyHpwGS1a)a4QkbVQXSoRQji85UlxobUGTUjWhnAD)9JSoFJJmNSkpE2KlnkpI5hG00XW564yqUgtJ12JJ0ilThPJH6o3Q4XxUFnfv3Rwap6hvrjJu7X9k)MOKDKadNpgLZmzyPthQOoAWE8llTzz(t7MU(onMUDt5LRWMkTS1qj9tbeB3lTclCAjsyKluewA3pu(8g7ARdlLKhEkrCEHMrCkVkLAhWz2b2BHWbW0Nhefdhyz5EpQ7rKou)isHl8fiwpCMPpg)Jma3(3Bh6JzaoDc7zM2B9MGWymHsiVXxLxM8xLml09p26XsVpka1iT3ghS2ogVq6JoF0GKp(jwHog)E8r22hqgB4COmOA1JEvAMRVssXLGHp24p73iqfFaCeam5u2JaVrWsu8icPb1C0IQ7k43Ba(5MUnvR4jmSwuB30n2RaFpb2d08bA(Ljn3vlgAs1Df87naFGU7gDxr3cIZwTYx6e0IIBpGBdiLkeONtBP4wb(gb8Ej6oUBqhLMa3yAbUdbcCqqSla7ZcnhSXn9SiKqn(Upl7SvVJjEE55Uy2Y4U)Lp(Oc6P)JpEuBbOijWa118NDRBH5VnQhwZ3EvQ3RYv8AZHvO8kcbfC01Ke3PgJvTOthFj5Y6rE1xF(4RRWimEdeLkEaB7DSc0RCW2rBxFvn5Mi4U(kA41PTvoCrm(LIIjjO51QatvPD)(9LXHOQlnxyoKEGlPauj7XW1rsplYt05URUAOWzkSeoFXTFVJpsMc9t5aSuyssfsLpkrdmokjepdFP54NaX3qGeFJAS7Sdg7(ROXUZ(RTXUZoySBpBSRi2V3SpcCxgqneOevPDxoL9iWBeSeQNALhRMuDxb)EdWp309tk9(DRUXEf47jWEGMpqZVmP5UAXqtQURGFVb4d0D3O7k6wuL6MycArXThWTbKsfc0ZPTuCRaFJaEVeDNPIAOBkVg6hceOrWEqq8ea7ZcnlVg6stavzvGmPsStKE0VSsM6xwjcR4nudDIvuTSsgskRKihPrzLexu7kDJ(LvYGQSsIOx5GTJ2QvwjkW11YkrUTsx2GNszLiaJQYkv3hCNlReHFrHAOx)Sipr3UYkjTyXT)aSuy25YkrCQQDLvsxIVHaj(g1yxd1q)GXUDfT911y3z)12yNqn0pySBhBSBa2U4jEy2tF)gEvREu2nBi8ruOO9lHZPSzR6vR5YgNXFl7fl47hoymihK86caAlIVQn5Eb(QtZN9eO5IDI6pJnyJqcPWbm0l8gSuHzPgnl5dsnLI2HYtszPww95swjoJ5gUsErYa6tk7t1uAhR)GCkTPoRcb1RXs0c5n3wxi4snwIMixW8pvfyiMZEf8ncyc3wQs6UT0DxbFJaUJv6sbD2Lh(0VzPUg3uoORQn41aWFRy)URBD7zW3iG76wNM0DxbFJa(fVDIx2uxJBkh0v1g8YcqoVRq9QNu8XkcHpl7Jxjnk(YjuraCU(Oa5u5WpBuvzje1Y0dmQsBV0YL8LBgJsYle3uWgf3MWGfERCt7ACfFp3I2UHBZ6wSJM55KK319WwBxYSpeNUiw6EyhZf3xIxAdx2f2MEOSF7HBroR2ohBZMUS2x27bcaBQg)2)fBgBFi2DD0VFc2v28CwYpBwh1nhRjZ8X2Tm(E6754fVQeUZtvcIr1SCK(3zDVTm085uqaQr)EwNVR8sMCy(Ep8ZQwbhLbY48PYKgSl5VD9nUPAURGSWt(4hyA34fUiT3IIT6d2NnnyWPtWVWBt)zZXJW2fktIpDY39DjZ(k)njm5JisNuGHFeXaEWA9ASDbo5bFh4C2YSpyCZ9ICccrPGl2vd)HF5trPa4FcNrH5v(5he1Nsz6Obf5))6RoRSbOclew3H(54x7(5i9(sE9bpbB7IxLj85ko(jSo34vhvn04CHvzjefkWz1fKpaxfBBU4eLfXT5Ajusju16wHd8klmpoPljIRICIxrmXEkOKRuqjvQNTMYtEr03SSDB0mnf0mvCNDyMA2FDauA6MRVkDI3IRu0AqlwpSk(EEp)1f7X98JM3E6revTL2Fjx7SNFf8TmECvhl046XslZ30673l9Uti0U6VAypY2u)1MdRWz16E2P7NoZJAEsf(7BCMyxChzhX(eEVJZi)S(79LM4PmXwcEVAtBuFDWA6A1dZxBwu1Efi(AdnqCkZEuZ4CxYTL8QgiUfmBAKe5hLafdGc88)sWDW0(tqBZ3EfZwxkvWCfA55Vyl2cMqQHfgmrluSKaYBNx9oM6lYz)sruDO074SuAQ2AfF8XcRyKFssVC0qaOvVzCgVP0Crkpw2XqvZfsjoj0gXDc0yKaYl6)N7FKlW5v7MNpdeqrZ5CVJ73vh1PDAZ9oEhzWhjEUHkMwh3QjNrrZpUGif600p(yZfD4s4ygnfW5GSsR47kdeJI9TpPqQ4MFM7)trnkWqOi6bFChLL1396RwkroADyrlik(MatnA1UqhNlgHg0NC6lRj8rtIfDapMuVE73df6FpN3JczTgeBvvVOyzIl2iKsb2i1fIm6SYtP0BgsR8puel8Q9iGACBN9Cxi7KOA1gSfuskaY2pybEj(zLcovv7tkv)E0N)ezVUCMcycHwZ51LcMMAINQ4qX9YcTnELdDTji1Dl(ufr2oyPWrDvGV61JdRui9tVbz15AVCAFSpxqScEJA4iWJpk0yw7rqGxqXMI2eE(m6RHr9NKr7gmz3wd2zA1v7pQxpsPLCnSJtBf9z8iKYdmcgf1iWcsFo1bPOIjP1DLh4u3GULZe1jvstQ55m)66vqbfTwLphXzLprAIpCzkvFW(TiZQJLgl7r1Hr)oMTL1TBDJIUCC)wkeyl(KGnyjA8wKjp0bvPt1YDvKBZHrWt95CA(yN4e4p3dj5R0xm1kUeNkKZU696wKan1UCl3Kj3J1GP4)eDxHTmA5IZf(PRw4BjoSwS6Q43q8tWFK918gCWI3GN8AsXC3kRyT69y7t1nl4QDA5trSMVga63kDiQcR6x5jIfu5LaqsF0rKBA(vaqCnT7PSx)3aaQUOJi2vnw7OSQp))uqRJp()KBN83AgX7mq7F4)jGIIN9)kC3t4r)N4Eju)1CswZZH7wtO1Z9FNADoKNxLbXU(q)tCmQDpZ)As5K2r1WwOjVTWD37eLXtWwO(VsuKAyQSfsSGk2cL8(qjYnnBluCnTZIJ(2cPEBOeXUQXAhLv1wif06OTqYTt13C42BlKakkSfASJSfsAMVQTqf3C4wzlStVcuKNxLbXUAlK4yu7SfQjLZ(qFm9))d]] )