Skip to content

Instantly share code, notes, and snippets.

@brandonjank
Created December 18, 2016 03:50
Show Gist options
  • Save brandonjank/32fd4a144d84bc213cf3715777e472e9 to your computer and use it in GitHub Desktop.
Save brandonjank/32fd4a144d84bc213cf3715777e472e9 to your computer and use it in GitHub Desktop.
-- Beast Mastery Hunter DPS Rotation
-- Legion 7.1 - 12/11/2016
--- COMBAT ROTATION
local function combat()
-- PAUSES
if -player.buff(SB.FeignDeath) or target.is(player) or player.channeling or IsMounted() or IsAoEPending() or UnitControllingVehicle("player") then
return false
end
-- PET MANAGEMENT
if pet.exists and pet.distance(player) < 45 then
-- Revive Pet
if pet.dead and castable(SB.RevivePet) then
return cast(SB.RevivePet)
end
-- Mend Pet
if pet.alive and pet.health.percent < 80 and not pet.buff(SB.MendPet).exists and castable(SB.RevivePet) then
return cast(982)
end
end
-- INTERUPTS
if target.interrupt(70) and castable(SB.CounterShot, 'target') then
cast(SB.CounterShot, 'target') -- Off-GCD
end
-- MISDIRECTION
if not target.isplayer and not -player.buff(SB.Misdirection) and player.threat(target) > 30 and castable(SB.Misdirection) then
if focus.exists and focus.friend and focus.alive and focus.distance(player) < 100 then
cast(SB.Misdirection, focus) -- Off-GCD
elseif pet.exists and pet.alive and pet.distance(player) < 100 then
cast(SB.Misdirection, pet) -- Off-GCD
end
end
-- DEFENSIVE
-- Exhilaration
if castable(SB.Exhilaration) and GetSpellCooldown(SB.Exhilaration) == 0 and (player.health.percent < 50 or (pet.alive and pet.health.percent < 10)) then
cast(SB.Exhilaration) -- Off-GCD
end
-- Aspect of the Turtle
if castable(SB.AspectOfTheTurtle) and player.health.percent < 10 then
cast(SB.AspectOfTheTurtle) -- Off-GCD
end
-- if useable(5512) and player.health.percent < 35 then
-- return use(5512) -- Healthstone (5512)
-- else if useable(76097) and player.health.percent < 15 and target.isboss then
-- return use(76097) -- Master Healing Potion (76097)
-- else if useable(118916) and player.health.percent < 40 and player.minimapzone("Brawl'gar Arena") then
-- return use(118916) -- Brawler's Healing Tonic (118916)
-- end
-- PRE-OFFENSE PAUSES
if target.debuff(SB.WyvernSting).any or -player.buff(SB.AspectOfTheTurtle) then
return false
end
--- OFFENSE
if target.enemy and target.alive then
-- Turn On Auto Shot (blame blizz)
if not IsAutoRepeatSpell(SB.AutoShot) then
cast(SB.AutoShot, target)
end
-- Make pet attack my target (blame blizz)
if not pettarget.is(target) then
PetAttack(target)
end
-- COOLDOWNS
if not target.isTrivial and not target.classification('trivial, minus') and target.distance(player) <= 40 then -- toggle.cooldowns
-- Bestial Wrath TODO: not moving, facing target
if pet.alive and castable(SB.BestialWrath) and (not player.talent(7, 1) or castable(SB.Stampede) or player.spell(SB.Stampede).cooldown > 30) then
cast(SB.BestialWrath) -- Off-GCD
end
-- Aspect of the Wild
if castable(SB.AspectOfTheWild) and -player.buff(SB.BestialWrath) then
cast(SB.AspectOfTheWild) -- Off-GCD
end
-- Berserking
if castable(SB.Berserking) and -player.buff(SB.BestialWrath) then
cast(SB.Berserking) -- Off-GCD
end
-- A Murder of Crows should be used on cooldown, although it can and should be delayed a bit to overlap with Bestial Wrath.
if castable(SB.AMurderOfCrows, target) and player.spell(SB.BestialWrath).cooldown > 30 then
return cast(SB.AMurderOfCrows, target)
end
-- Barrage should simply be used on cooldown, though you may want to save it in anticipation of heavy multi-target situations in the fight.
if castable(SB.Barrage, target) then
return cast(SB.Barrage)
end
-- Stampede
if castable(SB.Stampede) and -player.buff(SB.BestialWrath) then
cast(SB.Stampede) -- Off-GCD
end
end
-- AOE ROTATION (>1)
if target.enemies(10) > 1 then
-- Cast Kill Command if there are exactly 2 targets.
if pet.alive and castable(SB.KillCommand, target) and target.enemies(10) == 2 then
return cast(SB.KillCommand, target)
end
-- Cast Multi-Shot to keep up the Beast Cleave buff on your pet.
if castable(SB.MultiShot, target) and pet.buff(118455).remains < 2.0 then
return cast(SB.MultiShot, target)
end
-- Cast Dire Beast
if castable(SB.DireBeast, target) then
return cast(SB.DireBeast, target)
end
-- Cast Dire Frenzy
if castable(SB.DireFrenzy, target) then
return cast(SB.DireFrenzy, target)
end
-- 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.
if pet.alive and castable(SB.KillCommand, target) then -- and not player.artifacttrait('Surge of the Stormgod') or (target.enemies(10) < 4 or player.buff('Aspect of the Wild').exists or player.haslust) then
return cast(SB.KillCommand, target)
end
-- Cast Cobra Shot when you have over 90 Focus, and Beast Cleave has more than ~1.5 seconds remaining
if castable(SB.CobraShot, target) and player.power.focus.actual > 90 and pet.buff(118455).remains > 1.5 then
return cast(SB.CobraShot, target)
end
-- ELSE cast Multi-Shot.
if castable(SB.MultiShot, target) and player.power.focus.actual > 90 then
return cast(SB.MultiShot, target)
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 castable("Titan's Thunder", target) and player.buff(120694).exists then
return cast("Titan's Thunder", target)
end
-- Use Dire Beast
if castable(SB.DireBeast, target) then
return cast(SB.DireBeast, target)
end
-- Use Dire Frenzy
if player.talent(2, 2) and castable(SB.DireFrenzy, target) then
return cast(SB.DireFrenzy, target)
end
-- Cast Kill Command.
if pet.alive and castable(SB.KillCommand, target) and pet.distance(target) <= 25 then
return cast(SB.KillCommand, target)
end
-- Cast Cobra Shot when you have over 90 Focus.
if castable(SB.CobraShot, target) and player.power.focus.actual > 90 then
return cast(SB.CobraShot, target)
end
end
end
end
--- RESTING ROTATION
local function resting()
-- PAUSES
if -player.buff(SB.FeignDeath) or target.is(player) or player.channeling or IsMounted() then
return false
end
-- PET MANAGEMENT
if pet.exists then
-- Revive Pet
if pet.exists and pet.dead and castable(SB.RevivePet) and pet.distance(player) < 30 then
return cast(SB.RevivePet)
end
-- Mend Pet
if pet.exists and pet.alive and pet.health.percent < 90 and castable(SB.MendPet) then
return cast(SB.MendPet)
end
end
-- Volley
if not -player.buff(SB.Volley) and not lastcast(SB.Volley) and castable(SB.Volley) then
cast(SB.Volley) -- Off-GCD
end
end
--- OPENER ROTATION
-- local function opener()
-- -- OPENER
-- -- Just before the encounter starts, use your Potion of Prolonged Power.
-- if useable(5512) and player.health.percent < 35 then
-- return use(5512) -- Healthstone (5512)
-- -- Cast A Murder of Crows.
-- elseif castable('A Murder of Crows', 'target') then
-- return cast('A Murder of Crows', 'target')
-- -- Activate Bestial Wrath and Aspect of the Wild.
-- elseif castable('Bestial Wrath') then
-- return cast('Bestial Wrath')
-- elseif castable('Aspect of the Wild') and player.buff('Bestial Wrath').exists then
-- return cast('Aspect of the Wild')
-- -- Cast Kill Command on 1 target, or Multi-Shot on multiple targets.
-- elseif castable('Kill Command', 'target') and pet.distance(target) <= 25 and target.enemies(10) == 1 then
-- return cast('Kill Command', 'target')
-- elseif castable('Multi-Shot', 'target') and target.enemies(10) > 1 then
-- return cast('Multi-Shot', 'target')
-- -- Cast Dire Beast.
-- elseif castable('Dire Beast', 'target') then
-- return cast('Dire Beast', 'target')
-- else
-- -- Proceed with your normal rotation.
-- return true
-- 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