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.
380 lines
22 KiB
380 lines
22 KiB
--- ============================ HEADER ============================
|
|
--- ======= LOCALIZE =======
|
|
-- Addon
|
|
local addonName, addonTable = ...
|
|
-- HeroDBC
|
|
local DBC = HeroDBC.DBC
|
|
-- HeroLib
|
|
local HL = HeroLib
|
|
local Cache = HeroCache
|
|
local Unit = HL.Unit
|
|
local Player = Unit.Player
|
|
local Pet = Unit.Pet
|
|
local Target = Unit.Target
|
|
local Spell = HL.Spell
|
|
local MultiSpell = HL.MultiSpell
|
|
local Item = HL.Item
|
|
-- HeroRotation
|
|
local HR = HeroRotation
|
|
local AoEON = HR.AoEON
|
|
local CDsON = HR.CDsON
|
|
local Cast = HR.Cast
|
|
-- Num/Bool Helper Functions
|
|
local num = HR.Commons.Everyone.num
|
|
local bool = HR.Commons.Everyone.bool
|
|
-- Lua
|
|
|
|
--- ============================ CONTENT ============================
|
|
--- ======= APL LOCALS =======
|
|
-- Commons
|
|
local Everyone = HR.Commons.Everyone
|
|
|
|
-- GUI Settings
|
|
local Settings = {
|
|
General = HR.GUISettings.General,
|
|
Commons = HR.GUISettings.APL.Druid.Commons,
|
|
Guardian = HR.GUISettings.APL.Druid.Guardian
|
|
}
|
|
|
|
-- Spells
|
|
local S = Spell.Druid.Guardian
|
|
|
|
-- Items
|
|
local I = Item.Druid.Guardian
|
|
local OnUseExcludes = {
|
|
I.Djaruun:ID(),
|
|
I.Jotungeirr:ID(),
|
|
}
|
|
|
|
-- Trinket Item Objects
|
|
local equip = Player:GetEquipment()
|
|
local trinket1 = equip[13] and Item(equip[13]) or Item(0)
|
|
local trinket2 = equip[14] and Item(equip[14]) or Item(0)
|
|
|
|
-- Rotation Variables
|
|
local ActiveMitigationNeeded
|
|
local IsTanking
|
|
local UseMaul
|
|
local VarIFBuild = (S.ThornsofIron:IsAvailable() and S.ReinforcedFur:IsAvailable())
|
|
|
|
-- Enemies Variables
|
|
local MeleeEnemies11y, MeleeEnemies11yCount
|
|
|
|
-- Event Registrations
|
|
HL:RegisterForEvent(function()
|
|
equip = Player:GetEquipment()
|
|
trinket1 = equip[13] and Item(equip[13]) or Item(0)
|
|
trinket2 = equip[14] and Item(equip[14]) or Item(0)
|
|
end, "PLAYER_EQUIPMENT_CHANGED")
|
|
|
|
HL:RegisterForEvent(function()
|
|
IFBuild = (S.ThornsofIron:IsAvailable() and S.ReinforcedFur:IsAvailable())
|
|
end, "SPELLS_CHANGED", "LEARNED_SPELL_IN_TAB")
|
|
|
|
-- Functions
|
|
local function NoToothandClaw(enemies)
|
|
for _, CycleUnit in pairs(enemies) do
|
|
if CycleUnit:DebuffUp(S.ToothandClawDebuff) then
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
-- Cycle Functions
|
|
local function EvaluateCycleMoonfire(TargetUnit)
|
|
-- if=(((!ticking&time_to_die>12)|(refreshable&time_to_die>12))&active_enemies<7&talent.fury_of_nature.enabled)|(((!ticking&time_to_die>12)|(refreshable&time_to_die>12))&active_enemies<4&!talent.fury_of_nature.enabled)
|
|
-- Note: !ticking and refreshable are both covered by DebuffRefreshable
|
|
-- Note: Combined both halves of the line for ease
|
|
return ((TargetUnit:DebuffRefreshable(S.MoonfireDebuff) and TargetUnit:TimeToDie() > 12) and (MeleeEnemies11yCount < 7 and S.FuryofNature:IsAvailable() or MeleeEnemies11yCount < 4 and not S.FuryofNature:IsAvailable()))
|
|
end
|
|
|
|
local function EvaluateCycleThrash(TargetUnit)
|
|
-- target_if=refreshable|(dot.thrash_bear.stack<5&talent.flashing_claws.rank=2|dot.thrash_bear.stack<4&talent.flashing_claws.rank=1|dot.thrash_bear.stack<3&!talent.flashing_claws.enabled)
|
|
return (TargetUnit:DebuffRefreshable(S.ThrashDebuff) or (Target:DebuffStack(S.ThrashDebuff) < 5 and S.FlashingClaws:TalentRank() == 2 or Target:DebuffStack(S.ThrashDebuff) < 4 and S.FlashingClaws:TalentRank() == 1 or Target:DebuffStack(S.ThrashDebuff) < 3 and not S.FlashingClaws:IsAvailable()))
|
|
end
|
|
|
|
local function EvaluateCycleThrash2(TargetUnit)
|
|
-- target_if=refreshable|dot.thrash_bear.stack<3|active_enemies>=5
|
|
return (TargetUnit:DebuffRefreshable(S.ThrashDebuff) or TargetUnit:DebuffStack(S.ThrashDebuff) < 3 or MeleeEnemies11yCount >= 5)
|
|
end
|
|
|
|
local function EvaluateCyclePulverize(TargetUnit)
|
|
-- target_if=dot.thrash_bear.stack>2
|
|
return (TargetUnit:DebuffStack(S.ThrashDebuff) > 2)
|
|
end
|
|
|
|
local function Defensives()
|
|
if Player:HealthPercentage() < Settings.Guardian.FrenziedRegenHP and S.FrenziedRegeneration:IsReady() and Player:BuffDown(S.FrenziedRegenerationBuff) and not Player:HealingAbsorbed() then
|
|
if Cast(S.FrenziedRegeneration, nil, Settings.Guardian.DisplayStyle.Defensives) then return "frenzied_regeneration defensive 2"; end
|
|
end
|
|
if S.Ironfur:IsReady() and (Player:BuffDown(S.IronfurBuff) or Player:BuffStack(S.IronfurBuff) < 2 and Player:BuffRefreshable(S.Ironfur)) then
|
|
if Cast(S.Ironfur, nil, Settings.Guardian.DisplayStyle.Defensives) then return "ironfur defensive 4"; end
|
|
end
|
|
if S.Barkskin:IsCastable() and (Player:HealthPercentage() < Settings.Guardian.BarkskinHP and Player:BuffDown(S.IronfurBuff) or Player:HealthPercentage() < Settings.Guardian.BarkskinHP * 0.75) then
|
|
if Cast(S.Barkskin, nil, Settings.Guardian.DisplayStyle.Defensives) then return "barkskin defensive 6"; end
|
|
end
|
|
if S.SurvivalInstincts:IsCastable() and (Player:HealthPercentage() < Settings.Guardian.SurvivalInstinctsHP) then
|
|
if Cast(S.SurvivalInstincts, nil, Settings.Guardian.DisplayStyle.Defensives) then return "survival_instincts defensive 8"; end
|
|
end
|
|
if S.BristlingFur:IsCastable() and (Player:Rage() < Settings.Guardian.BristlingFurRage) then
|
|
if Cast(S.BristlingFur, nil, Settings.Guardian.DisplayStyle.Defensives) then return "bristling_fur defensive 10"; end
|
|
end
|
|
end
|
|
|
|
local function Precombat()
|
|
-- flask
|
|
-- food
|
|
-- augmentation
|
|
-- snapshot_stats
|
|
-- variable,name=If_build,value=1,value_else=0,if=talent.thorns_of_iron.enabled&talent.reinforced_fur.enabled
|
|
-- Note: Moved to variable declarations and PLAYER_TALENT_UPDATE registration
|
|
-- cat_form,if=(druid.catweave_bear=1&(cooldown.pause_action.remains|time>30))
|
|
-- moonkin_form,if=(!druid.catweave_bear=1)&(cooldown.pause_action.remains|time>30)
|
|
-- heart_of_the_wild,if=talent.heart_of_the_wild.enabled
|
|
-- prowl,if=druid.catweave_bear=1&(cooldown.pause_action.remains|time>30)
|
|
-- NOTE: Not handling cat-weaving or owl-weaving, so skipping above 4 lines
|
|
-- Manually added: Group buff check
|
|
if S.MarkoftheWild:IsCastable() and (Player:BuffDown(S.MarkoftheWildBuff, true) or Everyone.GroupBuffMissing(S.MarkoftheWildBuff)) then
|
|
if Cast(S.MarkoftheWild, Settings.Commons.GCDasOffGCD.MarkOfTheWild) then return "mark_of_the_wild precombat 2"; end
|
|
end
|
|
-- bear_form,if=(!buff.prowl.up)
|
|
if S.BearForm:IsCastable() then
|
|
if Cast(S.BearForm) then return "bear_form precombat 4"; end
|
|
end
|
|
-- Manually added: moonfire
|
|
if S.Moonfire:IsCastable() then
|
|
if Cast(S.Moonfire, nil, nil, not Target:IsSpellInRange(S.Moonfire)) then return "moonfire precombat 8"; end
|
|
end
|
|
-- Manually added: wild_charge
|
|
if S.WildCharge:IsCastable() and (Target:IsInRange(25) and not Target:IsInRange(8)) then
|
|
if Cast(S.WildCharge) then return "wild_charge precombat 10"; end
|
|
end
|
|
-- Manually added: thrash_bear
|
|
if S.Thrash:IsCastable() and Target:IsInRange(8) then
|
|
if Cast(S.Thrash) then return "thrash precombat 12"; end
|
|
end
|
|
-- Manually added: mangle
|
|
if S.Mangle:IsCastable() and Target:IsInMeleeRange(5) then
|
|
if Cast(S.Mangle) then return "mangle precombat 14"; end
|
|
end
|
|
end
|
|
|
|
local function CatWeave()
|
|
-- heart_of_the_wild,if=talent.heart_of_the_wild.enabled&!buff.heart_of_the_wild.up&!buff.cat_form.up
|
|
-- cat_form,if=!buff.cat_form.up
|
|
-- rake,if=buff.prowl.up
|
|
-- heart_of_the_wild,if=talent.heart_of_the_wild.enabled&!buff.heart_of_the_wild.up
|
|
-- rake,if=dot.rake.refreshable|energy<45
|
|
-- rip,if=dot.rip.refreshable&combo_points>=1
|
|
-- convoke_the_spirits
|
|
-- ferocious_bite,if=combo_points>=4&energy>50
|
|
-- shred,if=combo_points<=5
|
|
end
|
|
|
|
local function Bear()
|
|
-- bear_form,if=!buff.bear_form.up
|
|
if S.BearForm:IsCastable() then
|
|
if Cast(S.BearForm) then return "bear_form bear 2"; end
|
|
end
|
|
-- heart_of_the_wild,if=talent.heart_of_the_wild.enabled
|
|
if S.HeartoftheWild:IsCastable() then
|
|
if Cast(S.HeartoftheWild, Settings.Guardian.GCDasOffGCD.HeartOfTheWild) then return "heart_of_the_wild bear 4"; end
|
|
end
|
|
-- moonfire,cycle_targets=1,if=(((!ticking&time_to_die>12)|(refreshable&time_to_die>12))&active_enemies<7&talent.fury_of_nature.enabled)|(((!ticking&time_to_die>12)|(refreshable&time_to_die>12))&active_enemies<4&!talent.fury_of_nature.enabled)
|
|
if S.Moonfire:IsReady() then
|
|
if Everyone.CastCycle(S.Moonfire, MeleeEnemies11y, EvaluateCycleMoonfire, not Target:IsSpellInRange(S.Moonfire)) then return "moonfire bear 6"; end
|
|
end
|
|
-- thrash_bear,target_if=refreshable|(dot.thrash_bear.stack<5&talent.flashing_claws.rank=2|dot.thrash_bear.stack<4&talent.flashing_claws.rank=1|dot.thrash_bear.stack<3&!talent.flashing_claws.enabled)
|
|
if S.Thrash:IsCastable() then
|
|
if Everyone.CastCycle(S.Thrash, MeleeEnemies11y, EvaluateCycleThrash, not Target:IsInMeleeRange(8)) then return "thrash bear 8"; end
|
|
end
|
|
-- bristling_fur,if=!cooldown.pause_action.remains
|
|
-- Note: Handled in Defensives()
|
|
-- barkskin,if=!buff.bear_form.up
|
|
if S.Barkskin:IsReady() and (Player:BuffDown(S.BearForm)) then
|
|
if Cast(S.Barkskin, nil, Settings.Guardian.DisplayStyle.Defensives) then return "barkskin bear 10"; end
|
|
end
|
|
if CDsON() then
|
|
-- convoke_the_spirits
|
|
if S.ConvoketheSpirits:IsCastable() then
|
|
if Cast(S.ConvoketheSpirits, nil, Settings.Commons.DisplayStyle.Signature) then return "convoke_the_spirits bear 12"; end
|
|
end
|
|
-- berserk_bear
|
|
if S.Berserk:IsCastable() then
|
|
if Cast(S.Berserk, Settings.Guardian.OffGCDasOffGCD.Berserk) then return "berserk bear 14"; end
|
|
end
|
|
-- incarnation
|
|
if S.Incarnation:IsCastable() then
|
|
if Cast(S.Incarnation, Settings.Guardian.OffGCDasOffGCD.Incarnation) then return "incarnation bear 16"; end
|
|
end
|
|
end
|
|
-- lunar_beam
|
|
if S.LunarBeam:IsReady() and CDsON() then
|
|
if Cast(S.LunarBeam) then return "lunar_beam bear 18"; end
|
|
end
|
|
-- rage_of_the_sleeper,if=buff.incarnation_guardian_of_ursoc.down&cooldown.incarnation_guardian_of_ursoc.remains>60|buff.incarnation_guardian_of_ursoc.up|(talent.convoke_the_spirits.enabled)
|
|
if S.RageoftheSleeper:IsCastable() and (IsTanking) and (Player:BuffDown(S.IncarnationBuff) and S.Incarnation:CooldownRemains() > 60 or Player:BuffUp(S.IncarnationBuff) or S.ConvoketheSpirits:IsAvailable()) then
|
|
if Cast(S.RageoftheSleeper) then return "rage_of_the_sleeper bear 20"; end
|
|
end
|
|
-- berserking,if=(buff.berserk_bear.up|buff.incarnation_guardian_of_ursoc.up)
|
|
if S.Berserking:IsCastable() and (Player:BuffUp(S.BerserkBuff) or Player:BuffUp(S.IncarnationBuff)) then
|
|
if Cast(S.Berserking, Settings.Commons.OffGCDasOffGCD.Racials) then return "berserking bear 22"; end
|
|
end
|
|
-- maul,if=(buff.rage_of_the_sleeper.up&buff.tooth_and_claw.stack>0&active_enemies<=6&!talent.raze.enabled&variable.If_build=0)|(buff.rage_of_the_sleeper.up&buff.tooth_and_claw.stack>0&active_enemies=1&talent.raze.enabled&variable.If_build=0)
|
|
-- Note: Simplified the condition.
|
|
if S.Maul:IsReady() and UseMaul and ((Player:BuffUp(S.RageoftheSleeper) and Player:BuffStack(S.ToothandClawBuff) > 0 and not VarIFBuild) and (MeleeEnemies11yCount <= 6 and (not S.Raze:IsAvailable()) or MeleeEnemies11yCount == 1 and S.Raze:IsAvailable())) then
|
|
if Cast(S.Maul, nil, nil, not Target:IsInMeleeRange(8)) then return "maul bear 24"; end
|
|
end
|
|
-- raze,if=buff.rage_of_the_sleeper.up&buff.tooth_and_claw.stack>0&variable.If_build=0&active_enemies>1
|
|
if S.Raze:IsReady() and (Player:BuffUp(S.RageoftheSleeper) and Player:BuffStack(S.ToothandClawBuff) > 0 and (not VarIFBuild) and MeleeEnemies11yCount > 1) then
|
|
if Cast(S.Raze, nil, nil, not Target:IsInMeleeRange(5)) then return "raze bear 26"; end
|
|
end
|
|
-- maul,if=(((buff.incarnation.up|buff.berserk_bear.up)&active_enemies<=5&!talent.raze.enabled&(buff.tooth_and_claw.stack>=1))&variable.If_build=0)|(((buff.incarnation.up|buff.berserk_bear.up)&active_enemies=1&talent.raze.enabled&(buff.tooth_and_claw.stack>=1))&variable.If_build=0)
|
|
-- Note: Simplified the condition.
|
|
if S.Maul:IsReady() and UseMaul and (((Player:BuffUp(S.IncarnationBuff) or Player:BuffUp(S.BerserkBuff)) and Player:BuffStack(S.ToothandClawBuff) >= 1) and (not VarIFBuild) and (MeleeEnemies11yCount <= 5 and (not S.Raze:IsAvailable()) or MeleeEnemies11yCount == 1 and S.Raze:IsAvailable())) then
|
|
if Cast(S.Maul, nil, nil, not Target:IsInMeleeRange(8)) then return "maul bear 28"; end
|
|
end
|
|
-- raze,if=(buff.incarnation.up|buff.berserk_bear.up)&(variable.If_build=0)&active_enemies>1
|
|
if S.Raze:IsReady() and ((Player:BuffUp(S.IncarnationBuff) or Player:BuffUp(S.BerserkBuff)) and (not VarIFBuild) and MeleeEnemies11yCount > 1) then
|
|
if Cast(S.Raze, nil, nil, not Target:IsInMeleeRange(5)) then return "raze bear 30"; end
|
|
end
|
|
-- ironfur,target_if=!debuff.tooth_and_claw_debuff.up,if=!buff.ironfur.up&rage>50&!cooldown.pause_action.remains&variable.If_build=0&!buff.rage_of_the_sleeper.up|rage>90&variable.If_build=0&!buff.rage_of_the_sleeper.up
|
|
if S.Ironfur:IsReady() and (not VarIFBuild) and Settings.Guardian.UseIronfurOffensively and (Target:DebuffDown(S.ToothandClawDebuff) and (Player:BuffDown(S.IronfurBuff) and Player:Rage() > 50 and IsTanking and Player:BuffDown(S.RageoftheSleeper) or Player:Rage() > 90 and Player:BuffDown(S.RageoftheSleeper))) then
|
|
if Cast(S.Ironfur, nil, Settings.Guardian.DisplayStyle.Defensives) then return "ironfur bear 32"; end
|
|
end
|
|
-- ironfur,if=rage>90&variable.If_build=1|(buff.incarnation.up|buff.berserk_bear.up)&rage>20&variable.If_build=1
|
|
if S.Ironfur:IsReady() and Settings.Guardian.UseIronfurOffensively and (Player:Rage() > 90 and VarIFBuild or (Player:BuffUp(S.IncarnationBuff) or Player:BuffUp(S.BerserkBuff)) and Player:Rage() > 20 and VarIFBuild) then
|
|
if Cast(S.Ironfur, nil, Settings.Guardian.DisplayStyle.Defensives) then return "ironfur bear 34"; end
|
|
end
|
|
-- raze,if=(buff.tooth_and_claw.up)&active_enemies>1
|
|
if S.Raze:IsReady() and (Player:BuffUp(S.ToothandClawBuff) and MeleeEnemies11yCount > 1) then
|
|
if Cast(S.Raze, nil, nil, not Target:IsInMeleeRange(5)) then return "raze bear 36"; end
|
|
end
|
|
-- raze,if=(variable.If_build=0)&active_enemies>1
|
|
if S.Raze:IsReady() and (not VarIFBuild) and (MeleeEnemies11yCount > 1) then
|
|
if Cast(S.Raze, nil, nil, not Target:IsInMeleeRange(5)) then return "raze bear 38"; end
|
|
end
|
|
-- mangle,if=buff.gore.up&active_enemies<11|buff.vicious_cycle_mangle.stack=3
|
|
if S.Mangle:IsCastable() and (Player:BuffUp(S.GoreBuff) and MeleeEnemies11yCount < 11 or Player:BuffStack(S.ViciousCycleMaulBuff) == 3) then
|
|
if Cast(S.Mangle, nil, nil, not Target:IsInMeleeRange(8)) then return "mangle bear 40"; end
|
|
end
|
|
-- maul,if=(buff.tooth_and_claw.up&active_enemies<=5&!talent.raze.enabled)|(buff.tooth_and_claw.up&active_enemies=1&talent.raze.enabled)
|
|
-- Note: Simplified the condition
|
|
if S.Maul:IsReady() and (Player:BuffUp(S.ToothandClawBuff) and (MeleeEnemies11yCount <= 5 and (not S.Raze:IsAvailable()) or MeleeEnemies11yCount == 1 and S.Raze:IsAvailable())) then
|
|
if Cast(S.Maul, nil, nil, not Target:IsInMeleeRange(5)) then return "maul bear 42"; end
|
|
end
|
|
-- maul,if=(active_enemies<=5&!talent.raze.enabled&variable.If_build=0)|(active_enemies=1&talent.raze.enabled&variable.If_build=0)
|
|
if S.Maul:IsReady() and (not VarIFBuild) and (MeleeEnemies11yCount <= 5 and (not S.Raze:IsAvailable()) or MeleeEnemies11yCount == 1 and S.Raze:IsAvailable()) then
|
|
if Cast(S.Maul, nil, nil, not Target:IsInMeleeRange(5)) then return "maul bear 44"; end
|
|
end
|
|
-- thrash_bear,target_if=active_enemies>=5
|
|
if S.Thrash:IsCastable() and (MeleeEnemies11yCount >= 5) then
|
|
if Cast(S.Thrash, nil, nil, not Target:IsInMeleeRange(8)) then return "thrash bear 46"; end
|
|
end
|
|
-- swipe,if=buff.incarnation_guardian_of_ursoc.down&buff.berserk_bear.down&active_enemies>=11
|
|
if S.Swipe:IsCastable() and (Player:BuffDown(S.IncarnationBuff) and Player:BuffDown(S.BerserkBuff) and MeleeEnemies11yCount >= 11) then
|
|
if Cast(S.Swipe, nil, nil, not Target:IsInMeleeRange(11)) then return "swipe bear 48"; end
|
|
end
|
|
-- mangle,if=(buff.incarnation.up&active_enemies<=4)|(buff.incarnation.up&talent.soul_of_the_forest.enabled&active_enemies<=5)|((rage<90)&active_enemies<11)|((rage<85)&active_enemies<11&talent.soul_of_the_forest.enabled)
|
|
if S.Mangle:IsCastable() and ((Player:BuffUp(S.IncarnationBuff) and MeleeEnemies11yCount <= 4) or (Player:BuffUp(S.IncarnationBuff) and S.SouloftheForest:IsAvailable() and MeleeEnemies11yCount <= 5) or (Player:Rage() < 90 and MeleeEnemies11yCount < 11) or (Player:Rage() < 85 and MeleeEnemies11yCount < 11 and S.SouloftheForest:IsAvailable())) then
|
|
if Cast(S.Mangle, nil, nil, not Target:IsInMeleeRange(8)) then return "mangle bear 50"; end
|
|
end
|
|
-- thrash_bear,if=active_enemies>1
|
|
if S.Thrash:IsCastable() and (MeleeEnemies11yCount > 1) then
|
|
if Cast(S.Thrash, nil, nil, not Target:IsInMeleeRange(11)) then return "thrash bear 52"; end
|
|
end
|
|
-- pulverize,target_if=dot.thrash_bear.stack>2
|
|
if S.Pulverize:IsReady() then
|
|
if Everyone.CastCycle(S.Pulverize, MeleeEnemies11y, EvaluateCyclePulverize, not Target:IsInMeleeRange(8)) then return "pulverize bear 54"; end
|
|
end
|
|
-- thrash_bear
|
|
if S.Thrash:IsCastable() then
|
|
if Cast(S.Thrash, nil, nil, not Target:IsInMeleeRange(11)) then return "thrash bear 56"; end
|
|
end
|
|
-- moonfire,if=buff.galactic_guardian.up
|
|
if S.Moonfire:IsCastable() and (Player:BuffUp(S.GalacticGuardianBuff)) then
|
|
if Cast(S.Moonfire, nil, nil, not Target:IsSpellInRange(S.Moonfire)) then return "moonfire bear 58"; end
|
|
end
|
|
-- swipe_bear
|
|
if S.Swipe:IsCastable() then
|
|
if Cast(S.Swipe, nil, nil, not Target:IsInMeleeRange(11)) then return "swipe bear 60"; end
|
|
end
|
|
end
|
|
|
|
local function APL()
|
|
-- Enemies Update
|
|
if AoEON() then
|
|
MeleeEnemies11y = Player:GetEnemiesInMeleeRange(11)
|
|
MeleeEnemies11yCount = #MeleeEnemies11y
|
|
else
|
|
MeleeEnemies11y = {}
|
|
MeleeEnemies11yCount = 1
|
|
end
|
|
|
|
ActiveMitigationNeeded = Player:ActiveMitigationNeeded()
|
|
IsTanking = Player:IsTankingAoE(8) or Player:IsTanking(Target)
|
|
|
|
UseMaul = false
|
|
if ((Player:Rage() >= S.Maul:Cost() + 20 and not IsTanking) or Player:RageDeficit() <= 10 or not Settings.Guardian.UseRageDefensively) then
|
|
UseMaul = true
|
|
end
|
|
|
|
if Everyone.TargetIsValid() then
|
|
-- Precombat
|
|
if not Player:AffectingCombat() then
|
|
local ShouldReturn = Precombat(); if ShouldReturn then return ShouldReturn; end
|
|
end
|
|
-- Interrupt
|
|
local ShouldReturn = Everyone.Interrupt(13, S.SkullBash, Settings.Guardian.OffGCDasOffGCD.SkullBash, false); if ShouldReturn then return ShouldReturn; end
|
|
-- Manually added: run_action_list,name=defensives
|
|
if (IsTanking and Player:BuffUp(S.BearForm)) then
|
|
local ShouldReturn = Defensives(); if ShouldReturn then return ShouldReturn; end
|
|
end
|
|
-- Manually added: wild_charge if not in range
|
|
if S.WildCharge:IsCastable() and not Target:IsInRange(8) then
|
|
if Cast(S.WildCharge, Settings.Commons.GCDasOffGCD.WildCharge, nil, not Target:IsInRange(28)) then return "wild_charge main"; end
|
|
end
|
|
-- auto_attack,if=!buff.prowl.up
|
|
-- use_item,name=jotungeirr_destinys_call,if=!buff.prowl.up&!covenant.venthyr
|
|
if Settings.Commons.Enabled.Items and I.Jotungeirr:IsEquippedAndReady() then
|
|
if Cast(I.Jotungeirr, nil, Settings.Commons.DisplayStyle.Items) then return "jotungeirr_destinys_call main 2"; end
|
|
end
|
|
-- use_item,slot=trinket1
|
|
-- use_item,slot=trinket2
|
|
if Settings.Commons.Enabled.Trinkets then
|
|
local Trinket1ToUse, _, Trinket1Range = Player:GetUseableItems(OnUseExcludes, 13)
|
|
if Trinket1ToUse then
|
|
if Cast(Trinket1ToUse, nil, Settings.Commons.DisplayStyle.Trinkets, not Target:IsInRange(Trinket1Range)) then return "Generic use_items for " .. Trinket1ToUse:Name(); end
|
|
end
|
|
local Trinket2ToUse, _, Trinket2Range = Player:GetUseableItems(OnUseExcludes, 14)
|
|
if Trinket2ToUse then
|
|
if Cast(Trinket2ToUse, nil, Settings.Commons.DisplayStyle.Trinkets, not Target:IsInRange(Trinket2Range)) then return "Generic use_items for " .. Trinket2ToUse:Name(); end
|
|
end
|
|
end
|
|
-- use_item,name=djaruun_pillar_of_the_elder_flame,if=dot.moonfire.ticking
|
|
if Settings.Commons.Enabled.Items and I.Djaruun:IsEquippedAndReady() and (Target:DebuffUp(S.MoonfireDebuff)) then
|
|
if Cast(I.Djaruun, nil, Settings.Commons.DisplayStyle.Items, not Target:IsInRange(100)) then return "djaruun_pillar_of_the_elder_flame main 4"; end
|
|
end
|
|
-- potion,if=((talent.heart_of_the_wild.enabled&buff.heart_of_the_wild.up)|((buff.berserk_bear.up|buff.incarnation_guardian_of_ursoc.up)&(!druid.catweave_bear&!druid.owlweave_bear)))
|
|
if Settings.Commons.Enabled.Potions and ((S.HeartoftheWild:IsAvailable() and Player:BuffUp(S.HeartoftheWild)) or (Player:BuffUp(S.BerserkBuff) or Player:BuffUp(S.Incarnation))) then
|
|
local PotionSelected = Everyone.PotionSelected()
|
|
if PotionSelected and PotionSelected:IsReady() then
|
|
if Cast(PotionSelected, nil, Settings.Commons.DisplayStyle.Potions) then return "potion main 6"; end
|
|
end
|
|
end
|
|
-- run_action_list,name=catweave,if=(target.cooldown.pause_action.remains|time>=30)&druid.catweave_bear=1&buff.tooth_and_claw.remains>1.5&(buff.incarnation_guardian_of_ursoc.down&buff.berserk_bear.down)&(cooldown.thrash_bear.remains>0&cooldown.mangle.remains>0&dot.moonfire.remains>=2)|(buff.cat_form.up&energy>25&druid.catweave_bear=1&buff.tooth_and_claw.remains>1.5)|(buff.heart_of_the_wild.up&energy>90&druid.catweave_bear=1&buff.tooth_and_claw.remains>1.5)
|
|
-- run_action_list,name=owlweave,if=(target.cooldown.pause_action.remains|time>=30)&buff.tooth_and_claw.remains<1.5&((druid.owlweave_bear=1)&buff.incarnation_guardian_of_ursoc.down&buff.berserk_bear.down&cooldown.starsurge.up)
|
|
-- Skipping the above lists, as we're not handling catweaving or owlweaving
|
|
-- run_action_list,name=bear
|
|
local ShouldReturn = Bear(); if ShouldReturn then return ShouldReturn; end
|
|
-- Manually added: Pool if nothing to do
|
|
if HR.CastAnnotated(S.Pool, false, "WAIT") then return "Wait/Pool Resources"; end
|
|
end
|
|
end
|
|
|
|
local function OnInit()
|
|
HR.Print("Guardian Druid rotation is currently a work in progress, but has been updated for patch 10.1.5.")
|
|
end
|
|
|
|
HR.SetAPL(104, APL, OnInit)
|
|
|