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