Skip to content

Instantly share code, notes, and snippets.

@brandonjank
Last active December 9, 2016 22:50
Show Gist options
  • Save brandonjank/c3b346263486717a38028110d9a7fecc to your computer and use it in GitHub Desktop.
Save brandonjank/c3b346263486717a38028110d9a7fecc to your computer and use it in GitHub Desktop.
-- Beast Mastery Hunter DPS Rotation
-- Legion 7.1 - 12/4/2016
local function resting()
-- PET MANAGEMENT
if pet.exists then
if pet.dead and player.castable('Revive Pet') then
return player.cast('Revive Pet')
elseif pet.alive and pet.health.percent < 90 and player.castable('Mend Pet') then
return player.cast('Mend Pet')
end
else
if player.castable(883) then
return player.cast(883) -- Call Pet 1
end
end
end
local function opener()
-- OPENER
-- Just before the encounter starts, use your Potion of Prolonged Power.
if player.useable(5512) and player.health.percent < 35 then
return player.use(5512) -- Healthstone (5512)
-- Cast A Murder of Crows.
elseif target.castable('A Murder of Crows') then
return target.cast('A Murder of Crows')
-- Activate Bestial Wrath and Aspect of the Wild.
elseif player.castable('Bestial Wrath') then
return player.cast('Bestial Wrath')
elseif player.castable('Aspect of the Wild') and player.buff('Bestial Wrath') then
return player.cast('Aspect of the Wild')
-- Cast Kill Command on 1 target, or Multi-Shot on multiple targets.
elseif target.castable('Kill Command') and pet.distance('target') <= 25 and target.enemies(10) == 1 then
return target.cast('Kill Command')
elseif target.castable('Multi-Shot') and target.enemies(10) > 1 then
return target.cast('Multi-Shot')
-- Cast Dire Beast.
elseif target.castable('Dire Beast') then
return target.cast('Dire Beast')
else
-- Proceed with your normal rotation.
return true
end
end
local function combat()
-- PAUSES
if modifier.lcontrol or player.buff('Feign Death') or player.buff('Camouflage') or target.istheplayer then
return false
end
-- INTERUPTS / DISPELLS
if toggle.interrupt and target.interruptsAt(70) and target.castable('Counter Shot') then
return target.cast('Counter Shot')
end
if toggle.dispell and target.dispellable('Tranquilizing Shot') and target.castable('Tranquilizing Shot') then
return target.cast('Tranquilizing Shot')
end
-- TRAPS
if !player.buff('Trap Launcher') and !player.lastcast('Trap Launcher') then
return player.cast('Trap Launcher')
end
if modifier.lalt and player.buff('Trap Launcher') then
if player.spell('Explosive Trap').cooldown == 0 then
return target.castground('Explosive Trap')
else if player.spell('Ice Trap').cooldown == 0 then
return target.castground('Ice Trap')
end
end
if modifier.lshift and player.buff('Trap Launcher') and player.spell('Freezing Trap').cooldown == 0 then
return target.castground('Freezing Trap')
end
-- MISDIRECTION
if !toggle.pvp and !target.isPlayer and !player.buff('Misdirection') and target.threat > 30 then
if focus.exists and focus.friend and focus.alive and focus.distance < 100 then
return focus.cast('Misdirection')
elseif modifier.raid and tank.exists and tank.alive and tank.distance < 100 then
return tank.cast('Misdirection')
elseif !player.talent(7,3) and pet.exists and pet.alive and pet.distance < 100 then
return pet.cast('Misdirection')
end
end
-- DEFENSIVE
if player.castable('Exhilaration') and player.health.percent < 40 then
return player.cast('Exhilaration')
end
if player.useable(5512) and player.health.percent < 35 then
return player.use(5512) -- Healthstone (5512)
else if player.useable(76097) and player.health.percent < 15 and target.boss then
return player.use(76097) -- Master Healing Potion (76097)
else if player.useable(118916) and player.health.percent < 40 and player.minimapzone("Brawl'gar Arena") then
return player.use(118916) -- Brawler's Healing Tonic (118916)
end
if player.castable("Master's Call") and !player.talent(7,3) and (player.state.disorient or player.state.stun or player.state.root or player.state.snare) then
return player.cast("Master's Call")
end
if player.castable('Deterrence') and !player.talent(7,3) and player.health.percent < 20 then
return player.cast('Deterrence')
end
-- PRE-OFFENSE PAUSES
if target.debuff('Wyvern Sting').any or target.debuff('Scatter Shot').any or target.debuff('Freezing Trap').any or target.immune.all or target.status.disorient or target.status.incapacitate or target.status.sleep then
return false
end
--- OFFENSE
if target.enemy and target.alive then
-- COOLDOWNS
if toggle.cooldowns then
-- Bestial Wrath + Aspect of the Wild
if player.castable('Bestial Wrath') then
return player.cast('Bestial Wrath')
elseif player.castable('Aspect of the Wild') and player.buff('Bestial Wrath') then
return player.cast('Aspect of the Wild')
-- A Murder of Crows should be used on cooldown, although it can and should be delayed a bit to overlap with Bestial Wrath.
elseif target.castable('A Murder of Crows') and player.spell('Bestial Wrath').cooldown > 30 then
return target.cast('A Murder of Crows')
-- Barrage should simply be used on cooldown, though you may want to save it in anticipation of heavy multi-target situations in the fight.
elseif target.channelable('Barrage') then
return target.channel('Barrage')
-- Volley should simply be enabled before you start the fight and largely forgotten about. When dealing with multiple targets, you should try and be auto-attacking the one closest to the middle to get the most benefit out of Volley's AoE damage. Volley should be activated at all times, even on single target.
elseif !player.buff('Volley') and !player.lastcast('Volley') then
return player.cast('Volley')
-- Stampede should be used as many times as possible during the fight. Keep in mind that in Legion, Stampede can hit multiple targets close to its original target. As well as using it as many times as possible during the fight, and stacking it with as many powerful buffs as possible, you should also anticipate heavy, stacked multi-target moments in the fight and use it there.
elseif player.castable('Stampede') then
return player.cast('Stampede')
end
end
-- AOE ROTATION (>1)
if target.enemies(10) > 1 then
-- Cast Kill Command if there are exactly 2 targets.
if target.castable('Kill Command') and target.enemies(10) == 2 then
return target.cast('Kill Command')
-- Cast Multi-Shot to keep up the Beast Cleave buff on your pet.
elseif target.castable('Multi-Shot') and pet.buff('Beast Cleave').remaining < 2.0 then
return target.cast('Multi-Shot')
-- Cast Dire Beast
elseif target.castable('Dire Beast') then
return target.cast('Dire Beast')
-- Cast Dire Frenzy
elseif target.castable('Dire Frenzy') then
return target.cast('Dire Frenzy')
-- Cast Kill Command. If you have the Surge of the Stormgod trait, you should stop casting Kill Command on 4 targets, and simply spam Multi-Shot instead of it unless you have Aspect of the Wild or Bloodlust active which will allow you to keep up 100% Beast Cleave uptime, and cast Kill Command on cooldown at the same time.
elseif target.castable('Kill Command') and !player.artifact.trait('Surge of the Stormgod') or (target.enemies(10) < 4 or player.buff('Aspect of the Wild') or player.haslust) then
return target.cast('Kill Command')
-- Cast Cobra Shot when you have over 90 Focus, and Beast Cleave has more than ~1.5 seconds remaining
elseif target.castable('Cobra Shot') and player.focus > 90 and pet.buff('Beast Cleave').remaining > 1.5 then
return target.cast('Cobra Shot')
-- ELSE cast Multi-Shot.
elseif target.castable('Multi-Shot') and player.focus > 90 then
return target.cast('Multi-Shot')
end
else
-- SINGLE TARGET ROTATION
-- Cast Titan's Thunder on cooldown and when you have a Dire Beast active on the target. Try to cast it right after casting Dire Beast for maximum benefit.
if target.castable("Titan's Thunder") and player.buff('Dire Beast') then
return target.cast("Titan's Thunder")
-- Use Dire Beast
elseif target.castable('Dire Beast') then
return target.cast('Dire Beast')
-- Use Dire Frenzy
elseif target.castable('Dire Frenzy') then
return target.cast('Dire Frenzy')
-- Cast Kill Command.
elseif target.castable('Kill Command') and pet.distance('target') <= 25 then
return target.cast('Kill Command')
-- Cast Cobra Shot when you have over 90 Focus.
elseif target.castable('Cobra Shot') and player.focus > 90 then
return target.cast('Cobra Shot')
end
end
end
end
return {
combat = combat,
resting = resting,
opener = opener
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment