--- ============================ 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 Target = Unit.Target
local Boss = Unit.Boss
local Pet = Unit.Pet
local Spell = HL.Spell
local Item = HL.Item
-- HeroRotation
local HR = HeroRotation
local Cast = HR.Cast
local CDsON = HR.CDsON
local AoEON = HR.AoEON
-- Num/Bool Helper Functions
local num = HR.Commons . Everyone.num
local bool = HR.Commons . Everyone.bool
-- lua
local tableinsert = table.insert
local GetTime = GetTime
--- ============================ CONTENT ===========================
--- ======= APL LOCALS =======
-- luacheck: max_line_length 9999
-- Define S/I for spell and item arrays
local S = Spell.DeathKnight . Unholy
local I = Item.DeathKnight . Unholy
-- Create table to exclude above trinkets from On Use function
local OnUseExcludes = {
I.AlgetharPuzzleBox : ID ( ) ,
I.IrideusFragment : ID ( ) ,
I.VialofAnimatedBlood : 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 Var
local ShouldReturn -- Used to get the return string
local no_heal
-- GUI Settings
local Everyone = HR.Commons . Everyone
local Settings = {
General = HR.GUISettings . General ,
Commons = HR.GUISettings . APL.DeathKnight . Commons ,
Commons2 = HR.GUISettings . APL.DeathKnight . Commons2 ,
Unholy = HR.GUISettings . APL.DeathKnight . Unholy
}
-- Variables
local VarGargSetup
local VarApocTiming
local VarFesterTracker
local VarPopWounds
local VarPoolingRunicPower
local VarSTPlanning
local VarAddsRemain
local VarCommanderBuffUp
local VarCommanderBuffRemains
local VarApocGhoulActive , VarApocGhoulRemains
local VarArmyGhoulActive , VarArmyGhoulRemains
local VarGargActive , VarGargRemains
local WoundSpender = ( S.ClawingShadows : IsAvailable ( ) ) and S.ClawingShadows or S.ScourgeStrike
local AnyDnD = ( S.Defile : IsAvailable ( ) ) and S.Defile or S.DeathAndDecay
local FesterStacks
local BossFightRemains = 11111
local FightRemains = 11111
local ghoul = HL.GhoulTable
-- Enemies Variables
local EnemiesMelee , EnemiesMeleeCount
local Enemies10ySplash , Enemies10ySplashCount
local EnemiesWithoutVP
-- Stun Interrupts List
local StunInterrupts = {
{ S.Asphyxiate , " Cast Asphyxiate (Interrupt) " , function ( ) return true ; end } ,
}
-- 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 ( )
BossFightRemains = 11111
FightRemains = 11111
end , " PLAYER_REGEN_ENABLED " )
HL : RegisterForEvent ( function ( )
WoundSpender = ( S.ClawingShadows : IsAvailable ( ) ) and S.ClawingShadows or S.ScourgeStrike
AnyDnD = ( S.Defile : IsAvailable ( ) ) and S.Defile or S.DeathAndDecay
end , " SPELLS_CHANGED " , " LEARNED_SPELL_IN_TAB " )
-- Helper Functions
local function DeathStrikeHeal ( )
return ( Settings.General . SoloMode and ( Player : HealthPercentage ( ) < Settings.Commons . UseDeathStrikeHP or Player : HealthPercentage ( ) < Settings.Commons . UseDarkSuccorHP and Player : BuffUp ( S.DeathStrikeBuff ) ) )
end
local function UnitsWithoutVP ( enemies )
local WithoutVPCount = 0
for _ , CycleUnit in pairs ( enemies ) do
if CycleUnit : DebuffDown ( S.VirulentPlagueDebuff ) then
WithoutVPCount = WithoutVPCount + 1
end
end
return WithoutVPCount
end
local function AddsFightRemains ( enemies )
local NonBossEnemies = { }
for k in pairs ( enemies ) do
if not Unit : IsInBossList ( enemies [ k ] [ " UnitNPCID " ] ) then
tableinsert ( NonBossEnemies , enemies [ k ] )
end
end
return HL.FightRemains ( NonBossEnemies )
end
-- CastTargetIf Filter Functions
local function EvaluateTargetIfFilterFWStack ( TargetUnit )
return ( TargetUnit : DebuffStack ( S.FesteringWoundDebuff ) )
end
local function EvaluateTargetIfFilterSoulReaper ( TargetUnit )
-- target_if=min:dot.soul_reaper.remains
return ( TargetUnit : DebuffRemains ( S.SoulReaper ) )
end
-- CastTargetIf Condition Functions
local function EvaluateTargetIfApocalypseAoECDs ( TargetUnit )
-- if=talent.bursting_sores&debuff.festering_wound.up&(!death_and_decay.ticking&cooldown.death_and_decay.remains&rune<3|death_and_decay.ticking&rune=0)|!talent.bursting_sores&debuff.festering_wound.stack>=4
return ( S.BurstingSores : IsAvailable ( ) and TargetUnit : DebuffUp ( S.FesteringWoundDebuff ) and ( Player : BuffDown ( S.DeathAndDecayBuff ) and S.DeathAndDecay : CooldownDown ( ) and Player : Rune ( ) < 3 or Player : BuffUp ( S.DeathAndDecayBuff ) and Player : Rune ( ) == 0 ) or ( not S.BurstingSores : IsAvailable ( ) ) and TargetUnit : DebuffStack ( S.FesteringWoundDebuff ) >= 4 )
end
local function EvaluateTargetIfApocalypseCDs ( TargetUnit )
-- if=variable.st_planning&debuff.festering_wound.stack>=4
-- Note: st_planning handled outside of the CastTargetIf
return ( TargetUnit : DebuffStack ( S.FesteringWoundDebuff ) >= 4 )
end
local function EvaluateTargetIfFesteringStrikeAoESetup ( TargetUnit )
-- if=cooldown.apocalypse.remains<variable.apoc_timing&debuff.festering_wound.stack<4
-- Note: Apocalypse CD check handled before CastTargetIf
return ( TargetUnit : DebuffStack ( S.FesteringWoundDebuff ) < 4 )
end
local function EvaluateTargetIfFesteringStrikeST ( TargetUnit )
-- if=!variable.pop_wounds&debuff.festering_wound.stack<4
-- Note: !variable.pop_wounds check handled before CastTargetIf
return ( TargetUnit : DebuffStack ( S.FesteringWoundDebuff ) < 4 )
end
local function EvaluateTargetIfSoulReaperCDs ( TargetUnit )
-- if=target.time_to_pct_35<5&active_enemies>=2&target.time_to_die>(dot.soul_reaper.remains+5)
return ( ( TargetUnit : TimeToX ( 35 ) < 5 or TargetUnit : HealthPercentage ( ) <= 35 ) and TargetUnit : TimeToDie ( ) > ( TargetUnit : DebuffRemains ( S.SoulReaper ) + 5 ) )
end
local function EvaluateTargetIfUnholyAssaultAoECDs ( TargetUnit )
-- if=debuff.festering_wound.stack<=2|buff.dark_transformation.up
return ( TargetUnit : DebuffStack ( S.FesteringWoundDebuff ) <= 2 or Pet : BuffUp ( S.DarkTransformation ) )
end
local function EvaluateTargetIfVileContagionAoECDs ( TargetUnit )
-- if=debuff.festering_wound.stack>=4&cooldown.any_dnd.remains<3
return ( TargetUnit : DebuffStack ( S.FesteringWoundDebuff ) >= 4 and AnyDnD : CooldownRemains ( ) < 3 )
end
local function EvaluateTargetIfWoundSpenderAoEBurst ( TargetUnit )
-- if=debuff.festering_wound.stack>=1
return ( TargetUnit : DebuffStack ( S.FesteringWoundDebuff ) >= 1 )
end
-- CastCycle Condition Functions
local function EvaluateCycleOutbreak ( TargetUnit )
-- target_if=target.time_to_die>dot.virulent_plague.remains&(dot.virulent_plague.refreshable|talent.superstrain&(dot.frost_fever_superstrain.refreshable|dot.blood_plague_superstrain.refreshable))&(!talent.unholy_blight|talent.unholy_blight&cooldown.unholy_blight.remains>15%((talent.superstrain*3)+(talent.plaguebringer*2)+(talent.ebon_fever*2)))
return ( TargetUnit : TimeToDie ( ) > TargetUnit : DebuffRemains ( S.VirulentPlagueDebuff ) and ( TargetUnit : DebuffRefreshable ( S.VirulentPlagueDebuff ) or S.Superstrain : IsAvailable ( ) and ( TargetUnit : DebuffRefreshable ( S.FrostFeverDebuff ) or TargetUnit : DebuffRefreshable ( S.BloodPlagueDebuff ) ) ) and ( ( not S.UnholyBlight : IsAvailable ( ) ) or S.UnholyBlight : IsAvailable ( ) and S.UnholyBlight : CooldownRemains ( ) > 15 / ( ( num ( S.Superstrain : IsAvailable ( ) ) * 3 ) + ( num ( S.Plaguebringer : IsAvailable ( ) ) * 2 ) + ( num ( S.EbonFever : IsAvailable ( ) ) * 2 ) ) ) )
end
-- APL Functions
local function Precombat ( )
-- flask
-- food
-- augmentation
-- snapshot_stats
-- raise_dead
if S.RaiseDead : IsCastable ( ) then
if Settings.Unholy . RaiseDeadCastLeft then
if HR.CastLeft ( S.RaiseDead ) then return " raise_dead precombat 2 left " ; end
else
if Cast ( S.RaiseDead , nil , Settings.Commons . DisplayStyle.RaiseDead ) then return " raise_dead precombat 2 displaystyle " ; end
end
end
-- army_of_the_dead,precombat_time=2
if S.ArmyoftheDead : IsReady ( ) then
if Cast ( S.ArmyoftheDead , nil , Settings.Unholy . DisplayStyle.ArmyOfTheDead ) then return " army_of_the_dead precombat 4 " ; end
end
-- variable,name=trinket_1_exclude,value=trinket.1.is.ruby_whelp_shell|trinket.1.is.whispering_incarnate_icon
-- variable,name=trinket_2_exclude,value=trinket.2.is.ruby_whelp_shell|trinket.2.is.whispering_incarnate_icon
-- variable,name=trinket_1_buffs,value=trinket.1.has_use_buff|(trinket.1.has_buff.strength|trinket.1.has_buff.mastery|trinket.1.has_buff.versatility|trinket.1.has_buff.haste|trinket.1.has_buff.crit)&!variable.trinket_1_exclude
-- variable,name=trinket_2_buffs,value=trinket.2.has_use_buff|(trinket.2.has_buff.strength|trinket.2.has_buff.mastery|trinket.2.has_buff.versatility|trinket.2.has_buff.haste|trinket.2.has_buff.crit)&!variable.trinket_2_exclude
-- variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_1_buffs&(trinket.1.cooldown.duration%%45=0)
-- variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_2_buffs&(trinket.2.cooldown.duration%%45=0)
-- variable,name=trinket_1_manual,value=trinket.1.is.algethar_puzzle_box|trinket.1.is.irideus_fragment
-- variable,name=trinket_2_manual,value=trinket.2.is.algethar_puzzle_box|trinket.2.is.irideus_fragment
-- variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!variable.trinket_1_buffs&variable.trinket_2_buffs&(trinket.2.has_cooldown&!variable.trinket_2_exclude|!trinket.1.has_cooldown)|variable.trinket_2_buffs&((trinket.2.cooldown.duration%trinket.2.proc.any_dps.duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%trinket.1.proc.any_dps.duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync))
-- TODO: Trinket sync/priority stuff. Currently unable to pull trinket CD durations because WoW's API is bad.
-- Manually added: outbreak
if S.Outbreak : IsReady ( ) then
if Cast ( S.Outbreak , nil , nil , not Target : IsSpellInRange ( S.Outbreak ) ) then return " outbreak precombat 6 " ; end
end
-- Manually added: festering_strike if in melee range
if S.FesteringStrike : IsReady ( ) then
if Cast ( S.FesteringStrike , nil , nil , not Target : IsInMeleeRange ( 5 ) ) then return " festering_strike precombat 8 " ; end
end
end
local function AoE ( )
-- epidemic,if=!variable.pooling_runic_power|fight_remains<10
if S.Epidemic : IsReady ( ) and ( ( not VarPoolingRunicPower ) or FightRemains < 10 ) then
if Cast ( S.Epidemic , Settings.Unholy . GCDasOffGCD.Epidemic , nil , not Target : IsInRange ( 30 ) ) then return " epidemic aoe 2 " ; end
end
-- wound_spender,target_if=max:debuff.festering_wound.stack,if=variable.pop_wounds
if WoundSpender : IsReady ( ) and ( VarPopWounds ) then
if Everyone.CastTargetIf ( WoundSpender , EnemiesMelee , " max " , EvaluateTargetIfFilterFWStack , nil , not Target : IsSpellInRange ( WoundSpender ) ) then return " wound_spender aoe 4 " ; end
end
-- festering_strike,target_if=max:debuff.festering_wound.stack,if=!variable.pop_wounds
if S.FesteringStrike : IsReady ( ) and ( not VarPopWounds ) then
if Everyone.CastTargetIf ( S.FesteringStrike , EnemiesMelee , " max " , EvaluateTargetIfFilterFWStack , nil , not Target : IsInMeleeRange ( 5 ) ) then return " festering_strike aoe 6 " ; end
end
-- death_coil,if=!variable.pooling_runic_power&!talent.epidemic
if S.DeathCoil : IsReady ( ) and ( ( not VarPoolingRunicPower ) and not S.Epidemic : IsAvailable ( ) ) then
if Cast ( S.DeathCoil , nil , nil , not Target : IsSpellInRange ( S.DeathCoil ) ) then return " death_coil aoe 8 " ; end
end
end
local function AoEBurst ( )
-- epidemic,if=(!talent.bursting_sores|rune<1|talent.bursting_sores&debuff.festering_wound.stack=0)&!variable.pooling_runic_power&(active_enemies>=6|runic_power.deficit<30|buff.festermight.stack=20)
if S.Epidemic : IsReady ( ) and ( ( ( not S.BurstingSores : IsAvailable ( ) ) or Player : Rune ( ) < 1 or S.BurstingSores : IsAvailable ( ) and FesterStacks == 0 ) and ( not VarPoolingRunicPower ) and ( EnemiesMeleeCount >= 6 or Player : RunicPowerDeficit ( ) < 30 or Player : BuffStack ( S.FestermightBuff ) == 20 ) ) then
if Cast ( S.Epidemic , Settings.Unholy . GCDasOffGCD.Epidemic , nil , not Target : IsInRange ( 30 ) ) then return " epidemic aoe_burst 2 " ; end
end
-- wound_spender,target_if=max:debuff.festering_wound.stack,if=debuff.festering_wound.stack>=1
if WoundSpender : IsReady ( ) then
if Everyone.CastTargetIf ( WoundSpender , EnemiesMelee , " max " , EvaluateTargetIfFilterFWStack , EvaluateTargetIfWoundSpenderAoEBurst , not Target : IsSpellInRange ( WoundSpender ) ) then return " wound_spender aoe_burst 4 " ; end
end
-- epidemic,if=!variable.pooling_runic_power|fight_remains<10
if S.Epidemic : IsReady ( ) and ( ( not VarPoolingRunicPower ) or FightRemains < 10 ) then
if Cast ( S.Epidemic , Settings.Unholy . GCDasOffGCD.Epidemic , nil , not Target : IsInRange ( 30 ) ) then return " epidemic aoe_burst 6 " ; end
end
-- death_coil,if=!variable.pooling_runic_power&!talent.epidemic
if S.DeathCoil : IsReady ( ) and ( ( not VarPoolingRunicPower ) and not S.Epidemic : IsAvailable ( ) ) then
if Cast ( S.DeathCoil , nil , nil , not Target : IsSpellInRange ( S.DeathCoil ) ) then return " death_coil aoe_burst 8 " ; end
end
-- wound_spender
if WoundSpender : IsReady ( ) then
if Cast ( WoundSpender , nil , nil , not Target : IsSpellInRange ( WoundSpender ) ) then return " wound_spender aoe_burst 10 " ; end
end
end
local function AoECDs ( )
-- vile_contagion,target_if=max:debuff.festering_wound.stack,if=debuff.festering_wound.stack>=4&cooldown.any_dnd.remains<3
if S.VileContagion : IsReady ( ) and ( AnyDnD : CooldownRemains ( ) < 3 ) then
if Everyone.CastTargetIf ( S.VileContagion , EnemiesMelee , " max " , EvaluateTargetIfFilterFWStack , EvaluateTargetIfVileContagionAoECDs , not Target : IsSpellInRange ( S.VileContagion ) ) then return " vile_contagion aoe_cooldowns 2 " ; end
end
-- summon_gargoyle
if S.SummonGargoyle : IsReady ( ) then
if Cast ( S.SummonGargoyle , Settings.Unholy . GCDasOffGCD.SummonGargoyle ) then return " summon_gargoyle aoe_cooldowns 4 " ; end
end
-- abomination_limb,if=rune<2|buff.festermight.stack>10|!talent.festermight|buff.festermight.up&buff.festermight.remains<12
if S.AbominationLimb : IsCastable ( ) and ( Player : Rune ( ) < 2 or FesterStacks > 10 or ( not S.Festermight : IsAvailable ( ) ) or Player : BuffUp ( S.FestermightBuff ) and Player : BuffRemains ( S.FestermightBuff ) < 12 ) then
if Cast ( S.AbominationLimb , nil , Settings.Commons . DisplayStyle.Signature , not Target : IsInRange ( 20 ) ) then return " abomination_limb aoe_cooldowns 6 " ; end
end
-- apocalypse,target_if=min:debuff.festering_wound.stack,if=talent.bursting_sores&debuff.festering_wound.up&(!death_and_decay.ticking&cooldown.death_and_decay.remains&rune<3|death_and_decay.ticking&rune=0)|!talent.bursting_sores&debuff.festering_wound.stack>=4
if S.Apocalypse : IsCastable ( ) then
if Everyone.CastTargetIf ( S.Apocalypse , EnemiesMelee , " min " , EvaluateTargetIfFilterFWStack , EvaluateTargetIfApocalypseAoECDs , not Target : IsInMeleeRange ( 5 ) ) then return " apocalypse aoe_cooldowns 8 " ; end
end
-- unholy_assault,target_if=min:debuff.festering_wound.stack,if=debuff.festering_wound.stack<=2|buff.dark_transformation.up
if S.UnholyAssault : IsCastable ( ) then
if Everyone.CastTargetIf ( S.UnholyAssault , EnemiesMelee , " min " , EvaluateTargetIfFilterFWStack , EvaluateTargetIfUnholyAssaultAoECDs , not Target : IsInMeleeRange ( 5 ) , Settings.Unholy . GCDasOffGCD.UnholyAssault ) then return " unholy_assault aoe_cooldowns 10 " ; end
end
-- raise_dead,if=!pet.ghoul.active
if S.RaiseDead : IsCastable ( ) then
if Settings.Unholy . RaiseDeadCastLeft then
if HR.CastLeft ( S.RaiseDead ) then return " raise_dead aoe_cooldowns 12 left " ; end
else
if Cast ( S.RaiseDead , nil , Settings.Commons . DisplayStyle.RaiseDead ) then return " raise_dead aoe_cooldowns 12 displaystyle " ; end
end
end
-- dark_transformation,if=(cooldown.any_dnd.remains<10&talent.infected_claws&((cooldown.vile_contagion.remains|raid_event.adds.exists&raid_event.adds.in>10)&death_knight.fwounded_targets<active_enemies|!talent.vile_contagion)&(raid_event.adds.remains>5|!raid_event.adds.exists)|!talent.infected_claws)
if S.DarkTransformation : IsCastable ( ) and ( AnyDnD : CooldownRemains ( ) < 10 and S.InfectedClaws : IsAvailable ( ) and ( S.FesteringWoundDebuff : AuraActiveCount ( ) < Enemies10ySplashCount or not S.VileContagion : IsAvailable ( ) ) or not S.InfectedClaws : IsAvailable ( ) ) then
if Cast ( S.DarkTransformation , Settings.Unholy . GCDasOffGCD.DarkTransformation ) then return " dark_transformation aoe_cooldowns 14 " ; end
end
-- empower_rune_weapon,if=buff.dark_transformation.up
if S.EmpowerRuneWeapon : IsCastable ( ) and ( Pet : BuffUp ( S.DarkTransformation ) ) then
if Cast ( S.EmpowerRuneWeapon , Settings.Commons2 . GCDasOffGCD.EmpowerRuneWeapon ) then return " empower_rune_weapon aoe_cooldowns 16 " ; end
end
-- sacrificial_pact,if=!buff.dark_transformation.up&cooldown.dark_transformation.remains>6|fight_remains<gcd
if S.SacrificialPact : IsReady ( ) and ( Pet : BuffDown ( S.DarkTransformation ) and S.DarkTransformation : CooldownRemains ( ) > 6 or FightRemains < Player : GCD ( ) ) then
if Cast ( S.SacrificialPact , Settings.Commons2 . GCDasOffGCD.SacrificialPact ) then return " sacrificial_pact aoe_cooldowns 18 " ; end
end
end
local function AoESetup ( )
-- any_dnd,if=(!talent.bursting_sores|death_knight.fwounded_targets=active_enemies|death_knight.fwounded_targets>=8|raid_event.adds.exists&raid_event.adds.remains<=11&raid_event.adds.remains>5)
if AnyDnD : IsReady ( ) and ( ( not S.BurstingSores : IsAvailable ( ) ) or S.FesteringWoundDebuff : AuraActiveCount ( ) == Enemies10ySplashCount or S.FesteringWoundDebuff : AuraActiveCount ( ) >= 8 ) then
if Cast ( AnyDnD , Settings.Commons2 . GCDasOffGCD.DeathAndDecay ) then return " any_dnd aoe_setup 2 " ; end
end
-- festering_strike,target_if=min:debuff.festering_wound.stack,if=death_knight.fwounded_targets<active_enemies&talent.bursting_sores
if S.FesteringStrike : IsReady ( ) and ( S.FesteringWoundDebuff : AuraActiveCount ( ) < Enemies10ySplashCount and S.BurstingSores : IsAvailable ( ) ) then
if Everyone.CastTargetIf ( S.FesteringStrike , EnemiesMelee , " min " , EvaluateTargetIfFilterFWStack , nil , not Target : IsInMeleeRange ( 5 ) ) then return " festering_strike aoe_setup 4 " ; end
end
-- epidemic,if=!variable.pooling_runic_power|fight_remains<10
if S.Epidemic : IsReady ( ) and ( ( not VarPoolingRunicPower ) or FightRemains < 10 ) then
if Cast ( S.Epidemic , Settings.Unholy . GCDasOffGCD.Epidemic , nil , not Target : IsInRange ( 30 ) ) then return " epidemic aoe_setup 6 " ; end
end
-- festering_strike,target_if=min:debuff.festering_wound.stack,if=death_knight.fwounded_targets<active_enemies
if S.FesteringStrike : IsReady ( ) and ( S.FesteringWoundDebuff : AuraActiveCount ( ) < Enemies10ySplashCount ) then
if Everyone.CastTargetIf ( S.FesteringStrike , EnemiesMelee , " min " , EvaluateTargetIfFilterFWStack , nil , not Target : IsInMeleeRange ( 5 ) ) then return " festering_strike aoe_setup 8 " ; end
end
-- festering_strike,target_if=max:debuff.festering_wound.stack,if=cooldown.apocalypse.remains<variable.apoc_timing&debuff.festering_wound.stack<4
if S.FesteringStrike : IsReady ( ) and ( S.Apocalypse : CooldownRemains ( ) < VarApocTiming ) then
if Everyone.CastTargetIf ( S.FesteringStrike , EnemiesMelee , " max " , EvaluateTargetIfFilterFWStack , EvaluateTargetIfFesteringStrikeAoESetup , not Target : IsInMeleeRange ( 5 ) ) then return " festering_strike aoe_setup 10 " ; end
end
-- death_coil,if=!variable.pooling_runic_power&!talent.epidemic
if S.DeathCoil : IsReady ( ) and ( ( not VarPoolingRunicPower ) and not S.Epidemic : IsAvailable ( ) ) then
if Cast ( S.DeathCoil , nil , nil , not Target : IsSpellInRange ( S.DeathCoil ) ) then return " death_coil aoe_setup 12 " ; end
end
end
local function Cooldowns ( )
-- summon_gargoyle,if=buff.commander_of_the_dead.up|!talent.commander_of_the_dead
if S.SummonGargoyle : IsCastable ( ) and ( VarCommanderBuffUp or not S.CommanderoftheDead : IsAvailable ( ) ) then
if Cast ( S.SummonGargoyle , Settings.Unholy . GCDasOffGCD.SummonGargoyle ) then return " summon_gargoyle cooldowns 2 " ; end
end
-- raise_dead,if=!pet.ghoul.active
if S.RaiseDead : IsCastable ( ) then
if Settings.Unholy . RaiseDeadCastLeft then
if HR.CastLeft ( S.RaiseDead ) then return " raise_dead cooldowns 4 left " ; end
else
if Cast ( S.RaiseDead , nil , Settings.Commons . DisplayStyle.RaiseDead ) then return " raise_dead cooldowns 4 displaystyle " ; end
end
end
-- dark_transformation,if=cooldown.apocalypse.remains<5
if S.DarkTransformation : IsCastable ( ) and ( S.Apocalypse : CooldownRemains ( ) < 5 ) then
if Cast ( S.DarkTransformation , Settings.Unholy . GCDasOffGCD.DarkTransformation ) then return " dark_transformation cooldowns 6 " ; end
end
-- apocalypse,target_if=max:debuff.festering_wound.stack,if=variable.st_planning&debuff.festering_wound.stack>=4
if S.Apocalypse : IsReady ( ) and ( VarSTPlanning ) then
if Everyone.CastTargetIf ( S.Apocalypse , EnemiesMelee , " max " , EvaluateTargetIfFilterFWStack , EvaluateTargetIfApocalypseCDs , not Target : IsInMeleeRange ( 5 ) , Settings.Unholy . GCDasOffGCD.Apocalypse ) then return " apocalypse cooldowns 8 " ; end
end
-- empower_rune_weapon,if=variable.st_planning&(pet.gargoyle.active&pet.gargoyle.remains<=23|!talent.summon_gargoyle&talent.army_of_the_damned&pet.army_ghoul.active&pet.apoc_ghoul.active|!talent.summon_gargoyle&!talent.army_of_the_damned&buff.dark_transformation.up|!talent.summon_gargoyle&!talent.summon_gargoyle&buff.dark_transformation.up)|fight_remains<=21
if S.EmpowerRuneWeapon : IsCastable ( ) and ( VarSTPlanning and ( VarGargActive and VarGargRemains <= 23 or ( not S.SummonGargoyle : IsAvailable ( ) ) and S.ArmyoftheDamned : IsAvailable ( ) and VarArmyGhoulActive and VarApocGhoulActive or ( not S.SummonGargoyle : IsAvailable ( ) ) and ( not S.ArmyoftheDamned : IsAvailable ( ) ) and Pet : BuffUp ( S.DarkTransformation ) or ( not S.SummonGargoyle : IsAvailable ( ) ) and Pet : BuffUp ( S.DarkTransformation ) ) or FightRemains <= 21 ) then
if Cast ( S.EmpowerRuneWeapon , Settings.Commons2 . GCDasOffGCD.EmpowerRuneWeapon ) then return " empower_rune_weapon cooldowns 10 " ; end
end
-- abomination_limb,if=rune<3&variable.st_planning
if S.AbominationLimb : IsCastable ( ) and ( Player : Rune ( ) < 3 and VarSTPlanning ) then
if Cast ( S.AbominationLimb , Settings.Commons2 . GCDasOffGCD.AbominationLimb ) then return " abomination_limb cooldowns 12 " ; end
end
-- unholy_assault,target_if=min:debuff.festering_wound.stack,if=variable.st_planning
if S.UnholyAssault : IsReady ( ) and ( VarSTPlanning ) then
if Everyone.CastTargetIf ( S.UnholyAssault , EnemiesMelee , " min " , EvaluateTargetIfFilterFWStack , nil , not Target : IsInMeleeRange ( 5 ) , Settings.Unholy . GCDasOffGCD.UnholyAssault ) then return " unholy_assault cooldowns 14 " ; end
end
-- soul_reaper,if=active_enemies=1&target.time_to_pct_35<5&target.time_to_die>5
if S.SoulReaper : IsReady ( ) and ( EnemiesMeleeCount == 1 and ( Target : TimeToX ( 35 ) < 5 or Target : HealthPercentage ( ) <= 35 ) and Target : TimeToDie ( ) > 5 ) then
if Cast ( S.SoulReaper , nil , nil , not Target : IsSpellInRange ( S.SoulReaper ) ) then return " soul_reaper cooldowns 16 " ; end
end
-- soul_reaper,target_if=min:dot.soul_reaper.remains,if=target.time_to_pct_35<5&active_enemies>=2&target.time_to_die>(dot.soul_reaper.remains+5)
if S.SoulReaper : IsReady ( ) and ( EnemiesMeleeCount >= 2 ) then
if Everyone.CastTargetIf ( S.SoulReaper , EnemiesMelee , " min " , EvaluateTargetIfFilterSoulReaper , EvaluateTargetIfSoulReaperCDs , not Target : IsSpellInRange ( S.SoulReaper ) ) then return " soul_reaper cooldowns 18 " ; end
end
end
local function GargSetup ( )
-- apocalypse,if=debuff.festering_wound.stack>=4&(buff.commander_of_the_dead.up&pet.gargoyle.remains<23|!talent.commander_of_the_dead)
if S.Apocalypse : IsReady ( ) and ( FesterStacks >= 4 and ( VarCommanderBuffUp and VarGargRemains < 23 or not S.CommanderoftheDead : IsAvailable ( ) ) ) then
if Cast ( S.Apocalypse , Settings.Unholy . GCDasOffGCD.Apocalypse , nil , not Target : IsInMeleeRange ( 5 ) ) then return " apocalypse garg_setup 2 " ; end
end
-- army_of_the_dead,if=talent.commander_of_the_dead&(cooldown.dark_transformation.remains<3|buff.commander_of_the_dead.up)|!talent.commander_of_the_dead&talent.unholy_assault&cooldown.unholy_assault.remains<10|!talent.unholy_assault&!talent.commander_of_the_dead
if S.ArmyoftheDead : IsReady ( ) and ( S.CommanderoftheDead : IsAvailable ( ) and ( S.DarkTransformation : CooldownRemains ( ) < 3 or VarCommanderBuffUp ) or ( not S.CommanderoftheDead : IsAvailable ( ) ) and S.UnholyAssault : IsAvailable ( ) and S.UnholyAssault : CooldownRemains ( ) < 10 or ( not S.UnholyAssault : IsAvailable ( ) ) and not S.CommanderoftheDead : IsAvailable ( ) ) then
if Cast ( S.ArmyoftheDead , nil , Settings.Unholy . DisplayStyle.ArmyOfTheDead ) then return " army_of_the_dead garg_setup 4 " ; end
end
-- soul_reaper,if=active_enemies=1&target.time_to_pct_35<5&target.time_to_die>5
if S.SoulReaper : IsReady ( ) and ( EnemiesMeleeCount == 1 and ( Target : TimeToX ( 35 ) < 5 or Target : HealthPercentage ( ) <= 35 ) and Target : TimeToDie ( ) > 5 ) then
if Cast ( S.SoulReaper , nil , nil , not Target : IsInMeleeRange ( 5 ) ) then return " soul_reaper garg_setup 6 " ; end
end
-- summon_gargoyle,use_off_gcd=1,if=buff.commander_of_the_dead.up|!talent.commander_of_the_dead&runic_power>=40
if S.SummonGargoyle : IsCastable ( ) and CDsON ( ) and ( VarCommanderBuffUp or ( not S.CommanderoftheDead : IsAvailable ( ) ) and Player : RunicPower ( ) >= 40 ) then
if Cast ( S.SummonGargoyle , Settings.Unholy . GCDasOffGCD.SummonGargoyle ) then return " summon_gargoyle garg_setup 8 " ; end
end
if CDsON ( ) and ( VarGargActive and VarGargRemains <= 23 ) then
-- empower_rune_weapon,if=pet.gargoyle.active&pet.gargoyle.remains<=23
if S.EmpowerRuneWeapon : IsCastable ( ) then
if Cast ( S.EmpowerRuneWeapon , Settings.Commons2 . GCDasOffGCD.EmpowerRuneWeapon ) then return " empower_rune_weapon garg_setup 10 " ; end
end
-- unholy_assault,if=pet.gargoyle.active&pet.gargoyle.remains<=23
if S.UnholyAssault : IsCastable ( ) then
if Cast ( S.UnholyAssault , Settings.Unholy . GCDasOffGCD.UnholyAssault , nil , not Target : IsInMeleeRange ( 5 ) ) then return " unholy_assault garg_setup 12 " ; end
end
end
-- potion,if=(30>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60|cooldown.summon_gargoyle.ready)&(buff.dark_transformation.up&30>=buff.dark_transformation.remains|pet.army_ghoul.active&pet.army_ghoul.remains<=30|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=30)
if Settings.Commons . Enabled.Potions then
local PotionSelected = Everyone.PotionSelected ( )
if PotionSelected then
if PotionSelected : IsReady ( ) and ( ( 30 >= VarGargRemains and VarGargActive ) or ( ( not S.SummonGargoyle : IsAvailable ( ) )
or S.SummonGargoyle : CooldownRemains ( ) > 60 or S.SummonGargoyle : CooldownUp ( ) ) and ( Pet : BuffUp ( S.DarkTransformation ) and 30 >= Pet : BuffRemains ( S.DarkTransformation ) or VarArmyGhoulActive and VarArmyGhoulRemains <= 30 or VarApocGhoulActive and VarApocGhoulRemains <= 30 ) ) then
if Cast ( PotionSelected , nil , Settings.Commons . DisplayStyle.Potions ) then return " potion garg_setup 14 " ; end
end
end
end
-- dark_transformation,if=talent.commander_of_the_dead&runic_power>40|!talent.commander_of_the_dead
if S.DarkTransformation : IsCastable ( ) and ( S.CommanderoftheDead : IsAvailable ( ) and Player : RunicPower ( ) > 40 or not S.CommanderoftheDead : IsAvailable ( ) ) then
if Cast ( S.DarkTransformation , Settings.Unholy . GCDasOffGCD.DarkTransformation ) then return " dark_transformation garg_setup 16 " ; end
end
-- any_dnd,if=!death_and_decay.ticking&debuff.festering_wound.stack>0
if AnyDnD : IsReady ( ) and ( Player : BuffDown ( S.DeathAndDecayBuff ) and FesterStacks > 0 ) then
if Cast ( AnyDnD , Settings.Commons2 . GCDasOffGCD.DeathAndDecay ) then return " any_dnd garg_setup 18 " ; end
end
-- festering_strike,if=debuff.festering_wound.stack=0|!talent.apocalypse|runic_power<40&!pet.gargoyle.active
if S.FesteringStrike : IsReady ( ) and ( FesterStacks == 0 or ( not S.Apocalypse : IsAvailable ( ) ) or Player : RunicPower ( ) < 40 and not VarGargActive ) then
if Cast ( S.FesteringStrike , nil , nil , not Target : IsInMeleeRange ( 5 ) ) then return " festering_strike garg_setup 20 " ; end
end
-- death_coil,if=rune<=1
if S.DeathCoil : IsReady ( ) and ( Player : Rune ( ) <= 1 ) then
if Cast ( S.DeathCoil , nil , nil , not Target : IsSpellInRange ( S.DeathCoil ) ) then return " death_coil garg_setup 22 " ; end
end
end
local function ST ( )
-- death_coil,if=!variable.epidemic_priority&(!variable.pooling_runic_power&(rune<3|pet.gargoyle.active|buff.sudden_doom.react|cooldown.apocalypse.remains<10&debuff.festering_wound.stack>3|!variable.pop_wounds&debuff.festering_wound.stack>=4)|fight_remains<10)
if S.DeathCoil : IsReady ( ) and ( ( not VarEpidemicPriority ) and ( ( not VarPoolingRunicPower ) and ( Player : Rune ( ) < 3 or VarGargActive or Player : BuffUp ( S.SuddenDoomBuff ) or S.Apocalypse : CooldownRemains ( ) < 10 and FesterStacks > 3 or ( not VarPopWounds ) and FesterStacks >= 4 ) or FightRemains < 10 ) ) then
if Cast ( S.DeathCoil , nil , nil , not Target : IsSpellInRange ( S.DeathCoil ) ) then return " death_coil st 2 " ; end
end
-- epidemic,if=variable.epidemic_priority&(!variable.pooling_runic_power&(rune<3|pet.gargoyle.active|buff.sudden_doom.react|cooldown.apocalypse.remains<10&debuff.festering_wound.stack>3|!variable.pop_wounds&debuff.festering_wound.stack>=4))|fight_remains<10)
if S.Epidemic : IsReady ( ) and ( VarEpidemicPriority and ( ( not VarPoolingRunicPower ) and ( Player : Rune ( ) < 3 or VarGargActive or Player : BuffUp ( S.SuddenDoomBuff ) or S.Apocalypse : CooldownRemains ( ) < 10 and FesterStacks > 3 or ( not VarPopWounds ) and FesterStacks >= 4 ) or FightRemains < 10 ) ) then
if Cast ( S.Epidemic , Settings.Unholy . GCDasOffGCD.Epidemic , nil , not Target : IsInRange ( 30 ) ) then return " epidemic st 4 " ; end
end
-- any_dnd,if=!death_and_decay.ticking&(active_enemies>=2|talent.unholy_ground&(pet.apoc_ghoul.active&pet.apoc_ghoul.remains>=13|pet.gargoyle.active&pet.gargoyle.remains>8|pet.army_ghoul.active&pet.army_ghoul.remains>8|!variable.pop_wounds&debuff.festering_wound.stack>=4))&(death_knight.fwounded_targets=active_enemies|active_enemies=1)
if AnyDnD : IsReady ( ) and ( Player : BuffDown ( S.DeathAndDecayBuff ) and ( EnemiesMeleeCount >= 2 or S.UnholyGround : IsAvailable ( ) and ( VarGargActive and VarApocGhoulRemains >= 13 or VarGargActive and VarGargRemains > 8 or VarArmyGhoulActive and VarArmyGhoulRemains > 8 or ( not VarPopWounds ) and FesterStacks >= 4 ) ) and ( S.FesteringWoundDebuff : AuraActiveCount ( ) == Enemies10ySplashCount or EnemiesMeleeCount == 1 ) ) then
if Cast ( AnyDnD , Settings.Commons2 . GCDasOffGCD.DeathAndDecay ) then return " any_dnd st 6 " ; end
end
-- wound_spender,target_if=max:debuff.festering_wound.stack,if=variable.pop_wounds|active_enemies>=2&death_and_decay.ticking
if WoundSpender : IsReady ( ) and ( VarPopWounds or EnemiesMeleeCount >= 2 and Player : BuffUp ( S.DeathAndDecayBuff ) ) then
if Cast ( WoundSpender , nil , nil , not Target : IsSpellInRange ( WoundSpender ) ) then return " wound_spender st 8 " ; end
end
-- festering_strike,target_if=min:debuff.festering_wound.stack,if=!variable.pop_wounds&debuff.festering_wound.stack<4
if S.FesteringStrike : IsReady ( ) and ( not VarPopWounds ) then
if Everyone.CastTargetIf ( S.FesteringStrike , EnemiesMelee , " min " , EvaluateTargetIfFilterFWStack , EvaluateTargetIfFesteringStrikeST , not Target : IsInMeleeRange ( 5 ) ) then return " festering_strike st 10 " ; end
end
-- death_coil
if S.DeathCoil : IsReady ( ) then
if Cast ( S.DeathCoil , nil , nil , not Target : IsSpellInRange ( S.DeathCoil ) ) then return " death_coil st 12 " ; end
end
-- wound_spender,target_if=max:debuff.festering_wound.stack,if=!variable.pop_wounds&debuff.festering_wound.stack>=4
if WoundSpender : IsReady ( ) and ( not VarPopWounds ) then
if Everyone.CastTargetIf ( WoundSpender , EnemiesMelee , " max " , EvaluateTargetIfFilterFWStack , EvaluateTargetIfFesteringStrikeST , not Target : IsSpellInRange ( WoundSpender ) ) then return " wound_spender st 14 " ; end
end
end
local function HighPrioActions ( )
-- mind_freeze,if=target.debuff.casting.react
-- Note: Kept interrupts in APL()
if Settings.Commons . UseAMSAMZOffensively then
-- antimagic_shell,if=runic_power.deficit>40&(pet.gargoyle.active|!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>cooldown.antimagic_shell.duration)
if S.AntiMagicShell : IsCastable ( ) and ( Player : RunicPowerDeficit ( ) > 40 and ( VarGargActive or ( not S.SummonGargoyle : IsAvailable ( ) ) or S.SummonGargoyle : CooldownRemains ( ) > 40 ) ) then
if Cast ( S.AntiMagicShell , Settings.Commons2 . GCDasOffGCD.AntiMagicShell ) then return " antimagic_shell ams_amz 2 " ; end
end
-- antimagic_zone,if=death_knight.amz_absorb_percent>0&runic_power.deficit>70&talent.assimilation&(pet.gargoyle.active|!talent.summon_gargoyle)
if S.AntiMagicZone : IsCastable ( ) and ( Player : RunicPowerDeficit ( ) > 70 and S.Assimilation : IsAvailable ( ) and ( VarGargActive or not S.SummonGargoyle : IsAvailable ( ) ) ) then
if Cast ( S.AntiMagicZone , Settings.Commons2 . GCDasOffGCD.AntiMagicZone ) then return " antimagic_zone ams_amz 4 " ; end
end
end
-- invoke_external_buff,name=power_infusion,if=variable.st_planning&(pet.gargoyle.active&pet.gargoyle.remains<=23|!talent.summon_gargoyle&talent.army_of_the_dead&pet.army_ghoul.active&pet.army_ghoul.remains<=23|!talent.summon_gargoyle&!talent.army_of_the_dead&buff.dark_transformation.up|!talent.summon_gargoyle&buff.dark_transformation.up|!pet.gargoyle.active&cooldown.summon_gargoyle.remains+5>cooldown.invoke_external_buff.duration|active_enemies>=3&(buff.dark_transformation.up|death_and_decay.ticking))|fight_remains<=23
-- Note: Not handling external buffs.
-- potion,if=(30>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60|cooldown.summon_gargoyle.ready)&(buff.dark_transformation.up&30>=buff.dark_transformation.remains|pet.army_ghoul.active&pet.army_ghoul.remains<=30|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=30)|fight_remains<=30
if Settings.Commons . Enabled.Potions then
local PotionSelected = Everyone.PotionSelected ( )
if PotionSelected then
if PotionSelected : IsReady ( ) and ( ( 30 >= VarGargRemains and VarGargActive ) or ( ( not S.SummonGargoyle : IsAvailable ( ) ) or S.SummonGargoyle : CooldownRemains ( ) > 60 or S.SummonGargoyle : CooldownUp ( ) ) and ( Pet : BuffUp ( S.DarkTransformation ) and 30 >= Pet : BuffRemains ( S.DarkTransformation ) or VarArmyGhoulActive and VarArmyGhoulRemains <= 30 or VarApocGhoulActive and VarApocGhoulRemains <= 30 ) or FightRemains <= 30 ) then
if Cast ( PotionSelected , nil , Settings.Commons . DisplayStyle.Potions ) then return " potion high_prio_actions 2 " ; end
end
end
end
-- army_of_the_dead,if=talent.summon_gargoyle&cooldown.summon_gargoyle.remains<2|!talent.summon_gargoyle|fight_remains<35
if S.ArmyoftheDead : IsReady ( ) and ( S.SummonGargoyle : IsAvailable ( ) and S.SummonGargoyle : CooldownRemains ( ) < 2 or ( not S.SummonGargoyle : IsAvailable ( ) ) or FightRemains < 35 ) then
if Cast ( S.ArmyoftheDead , nil , Settings.Unholy . DisplayStyle.ArmyOfTheDead ) then return " army_of_the_dead high_prio_actions 4 " ; end
end
-- death_coil,if=(active_enemies<=3|!talent.epidemic)&(pet.gargoyle.active&talent.commander_of_the_dead&buff.commander_of_the_dead.up&cooldown.apocalypse.remains<5&buff.commander_of_the_dead.remains>27|debuff.death_rot.up&debuff.death_rot.remains<gcd)
if S.DeathCoil : IsReady ( ) and ( ( EnemiesMeleeCount <= 3 or not S.Epidemic : IsAvailable ( ) ) and ( VarGargActive and S.CommanderoftheDead : IsAvailable ( ) and VarCommanderBuffUp and S.Apocalypse : CooldownRemains ( ) < 5 and VarCommanderBuffRemains > 27 or Target : DebuffUp ( S.DeathRotDebuff ) and Target : DebuffRemains ( S.DeathRotDebuff ) < Player : GCD ( ) ) ) then
if Cast ( S.DeathCoil , nil , nil , not Target : IsSpellInRange ( S.DeathCoil ) ) then return " death_coil high_prio_actions 6 " ; end
end
-- epidemic,if=active_enemies>=4&(talent.commander_of_the_dead&buff.commander_of_the_dead.up&cooldown.apocalypse.remains<5|debuff.death_rot.up&debuff.death_rot.remains<gcd)
if S.Epidemic : IsReady ( ) and ( Enemies10ySplashCount >= 4 and ( S.CommanderoftheDead : IsAvailable ( ) and VarCommanderBuffUp and S.Apocalypse : CooldownRemains ( ) < 5 or Target : DebuffUp ( S.DeathRotDebuff ) and Target : DebuffRemains ( S.DeathRotDebuff ) < Player : GCD ( ) ) ) then
if Cast ( S.Epidemic , Settings.Unholy . GCDasOffGCD.Epidemic , nil , not Target : IsInRange ( 30 ) ) then return " epidemic high_prio_actions 8 " ; end
end
-- wound_spender,if=(cooldown.apocalypse.remains>variable.apoc_timing+3|active_enemies>=3)&talent.plaguebringer&(talent.superstrain|talent.unholy_blight)&buff.plaguebringer.remains<gcd
if WoundSpender : IsReady ( ) and ( ( S.Apocalypse : CooldownRemains ( ) > VarApocTiming + 3 or EnemiesMeleeCount >= 3 ) and S.Plaguebringer : IsAvailable ( ) and ( S.Superstrain : IsAvailable ( ) or S.UnholyBlight : IsAvailable ( ) ) and Player : BuffRemains ( S.PlaguebringerBuff ) < Player : GCD ( ) ) then
if Cast ( WoundSpender , nil , nil , not Target : IsSpellInRange ( WoundSpender ) ) then return " wound_spender high_prio_actions 10 " ; end
end
-- unholy_blight,if=variable.st_planning&((!talent.apocalypse|cooldown.apocalypse.remains)&talent.morbidity|!talent.morbidity)|variable.adds_remain|fight_remains<21
if S.UnholyBlight : IsReady ( ) and ( VarSTPlanning and ( ( ( not S.Apocalypse : IsAvailable ( ) ) or S.Apocalypse : CooldownDown ( ) ) and S.Morbidity : IsAvailable ( ) or not S.Morbidity : IsAvailable ( ) ) or VarAddsRemain or FightRemains < 21 ) then
if Cast ( S.UnholyBlight , Settings.Unholy . GCDasOffGCD.UnholyBlight , nil , not Target : IsInRange ( 8 ) ) then return " unholy_blight high_prio_actions 12 " ; end
end
-- outbreak,target_if=target.time_to_die>dot.virulent_plague.remains&(dot.virulent_plague.refreshable|talent.superstrain&(dot.frost_fever_superstrain.refreshable|dot.blood_plague_superstrain.refreshable))&(!talent.unholy_blight|talent.unholy_blight&cooldown.unholy_blight.remains>15%((talent.superstrain*3)+(talent.plaguebringer*2)+(talent.ebon_fever*2)))
if S.Outbreak : IsReady ( ) then
if Everyone.CastCycle ( S.Outbreak , EnemiesMelee , EvaluateCycleOutbreak , not Target : IsSpellInRange ( S.Outbreak ) ) then return " outbreak high_prio_actions 14 " ; end
end
end
local function Racials ( )
-- arcane_torrent,if=runic_power.deficit>20&(cooldown.summon_gargoyle.remains<gcd|!talent.summon_gargoyle.enabled|pet.gargoyle.active&rune<2&debuff.festering_wound.stack<1)
if S.ArcaneTorrent : IsCastable ( ) and ( Player : RunicPowerDeficit ( ) > 20 and ( S.SummonGargoyle : CooldownRemains ( ) < Player : GCD ( ) or ( not S.SummonGargoyle : IsAvailable ( ) ) or VarGargActive and Player : Rune ( ) < 2 and FesterStacks < 1 ) ) then
if Cast ( S.ArcaneTorrent , Settings.Commons2 . OffGCDasOffGCD.Racials , nil , not Target : IsInRange ( 8 ) ) then return " arcane_torrent racials 2 " ; end
end
-- blood_fury,if=(buff.blood_fury.duration+3>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(pet.army_ghoul.active&pet.army_ghoul.remains<=buff.blood_fury.duration+3|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=buff.blood_fury.duration+3|active_enemies>=2&death_and_decay.ticking)|fight_remains<=buff.blood_fury.duration+3
if S.BloodFury : IsCastable ( ) and ( ( S.BloodFury : BaseDuration ( ) + 3 >= VarGargRemains and VarGargActive ) or ( ( not S.SummonGargoyle : IsAvailable ( ) ) or S.SummonGargoyle : CooldownRemains ( ) > 60 ) and ( VarArmyGhoulActive and VarArmyGhoulRemains <= S.BloodFury : BaseDuration ( ) + 3 or VarApocGhoulActive and VarApocGhoulRemains <= S.BloodFury : BaseDuration ( ) + 3 or EnemiesMeleeCount >= 2 and Player : BuffUp ( S.DeathAndDecayBuff ) ) or FightRemains <= S.BloodFury : BaseDuration ( ) + 3 ) then
if Cast ( S.BloodFury , Settings.Commons2 . OffGCDasOffGCD.Racials ) then return " blood_fury racials 4 " ; end
end
-- berserking,if=(buff.berserking.duration+3>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(pet.army_ghoul.active&pet.army_ghoul.remains<=buff.berserking.duration+3|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=buff.berserking.duration+3|active_enemies>=2&death_and_decay.ticking)|fight_remains<=buff.berserking.duration+3
if S.Berserking : IsCastable ( ) and ( ( S.Berserking : BaseDuration ( ) + 3 >= VarGargRemains and VarGargActive ) or ( ( not S.SummonGargoyle : IsAvailable ( ) ) or S.SummonGargoyle : CooldownRemains ( ) > 60 ) and ( VarArmyGhoulActive and VarArmyGhoulRemains <= S.Berserking : BaseDuration ( ) + 3 or VarApocGhoulActive and VarApocGhoulRemains <= S.Berserking : BaseDuration ( ) + 3 or EnemiesMeleeCount >= 2 and Player : BuffUp ( S.DeathAndDecayBuff ) ) or FightRemains <= S.Berserking : BaseDuration ( ) + 3 ) then
if Cast ( S.Berserking , Settings.Commons2 . OffGCDasOffGCD.Racials ) then return " berserking racials 6 " ; end
end
-- lights_judgment,if=buff.unholy_strength.up&(!talent.festermight|buff.festermight.remains<target.time_to_die|buff.unholy_strength.remains<target.time_to_die)
if S.LightsJudgment : IsCastable ( ) and ( Player : BuffUp ( S.UnholyStrengthBuff ) and ( ( not S.Festermight : IsAvailable ( ) ) or Player : BuffRemains ( S.FestermightBuff ) < Target : TimeToDie ( ) or Player : BuffRemains ( S.UnholyStrengthBuff ) < Target : TimeToDie ( ) ) ) then
if Cast ( S.LightsJudgment , Settings.Commons2 . OffGCDasOffGCD.Racials , nil , not Target : IsSpellInRange ( S.LightsJudgment ) ) then return " lights_judgment racials 8 " ; end
end
-- ancestral_call,if=(18>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(pet.army_ghoul.active&pet.army_ghoul.remains<=18|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=18|active_enemies>=2&death_and_decay.ticking)|fight_remains<=18
if S.AncestralCall : IsCastable ( ) and ( ( 18 >= VarGargRemains and VarGargActive ) or ( ( not S.SummonGargoyle : IsAvailable ( ) ) or S.SummonGargoyle : CooldownRemains ( ) > 60 ) and ( VarArmyGhoulActive and VarArmyGhoulRemains <= 18 or VarApocGhoulActive and VarApocGhoulRemains <= 18 or EnemiesMeleeCount >= 2 and Player : BuffUp ( S.DeathAndDecayBuff ) ) or FightRemains <= 18 ) then
if Cast ( S.AncestralCall , Settings.Commons2 . OffGCDasOffGCD.Racials ) then return " ancestral_call racials 10 " ; end
end
-- arcane_pulse,if=active_enemies>=2|(rune.deficit>=5&runic_power.deficit>=60)
if S.ArcanePulse : IsCastable ( ) and ( EnemiesMeleeCount >= 2 or ( Player : Rune ( ) <= 1 and Player : RunicPowerDeficit ( ) >= 60 ) ) then
if Cast ( S.ArcanePulse , Settings.Commons2 . OffGCDasOffGCD.Racials , nil , not Target : IsInRange ( 8 ) ) then return " arcane_pulse racials 12 " ; end
end
-- fireblood,if=(buff.fireblood.duration+3>=pet.gargoyle.remains&pet.gargoyle.active)|(!talent.summon_gargoyle|cooldown.summon_gargoyle.remains>60)&(pet.army_ghoul.active&pet.army_ghoul.remains<=buff.fireblood.duration+3|pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=buff.fireblood.duration+3|active_enemies>=2&death_and_decay.ticking)|fight_remains<=buff.fireblood.duration+3
if S.Fireblood : IsCastable ( ) and ( ( S.Fireblood : BaseDuration ( ) + 3 >= VarGargRemains and VarGargActive ) or ( ( not S.SummonGargoyle : IsAvailable ( ) ) or S.SummonGargoyle : CooldownRemains ( ) > 60 ) and ( VarArmyGhoulActive and VarArmyGhoulRemains <= S.Fireblood : BaseDuration ( ) + 3 or VarApocGhoulActive and VarApocGhoulRemains <= S.Fireblood : BaseDuration ( ) + 3 or EnemiesMeleeCount >= 2 and Player : BuffUp ( S.DeathAndDecayBuff ) ) or FightRemains <= S.Fireblood : BaseDuration ( ) + 3 ) then
if Cast ( S.Fireblood , Settings.Commons2 . OffGCDasOffGCD.Racials ) then return " fireblood racials 14 " ; end
end
-- bag_of_tricks,if=active_enemies=1&(buff.unholy_strength.up|fight_remains<5)
if S.BagofTricks : IsCastable ( ) and ( EnemiesMeleeCount == 1 and ( Player : BuffUp ( S.UnholyStrengthBuff ) or HL.FilteredFightRemains ( EnemiesMelee , " < " , 5 ) ) ) then
if Cast ( S.BagofTricks , Settings.Commons2 . OffGCDasOffGCD.Racials , nil , not Target : IsSpellInRange ( S.BagofTricks ) ) then return " bag_of_tricks racials 16 " ; end
end
end
local function Trinkets ( )
if Settings.Commons . Enabled.Trinkets then
-- use_item,use_off_gcd=1,name=algethar_puzzle_box,if=cooldown.summon_gargoyle.remains<5&rune<=4|!talent.summon_gargoyle&pet.army_ghoul.active|active_enemies>3&variable.adds_remain&(buff.dark_transformation.up|talent.bursting_sores&cooldown.any_dnd.remains<10&!death_and_decay.ticking)
if I.AlgetharPuzzleBox : IsEquippedAndReady ( ) and ( S.SummonGargoyle : CooldownRemains ( ) < 5 and Player : Rune ( ) <= 4 or ( not S.SummonGargoyle : IsAvailable ( ) ) and VarArmyGhoulActive or EnemiesMeleeCount > 3 and VarAddsRemain and ( Pet : BuffUp ( S.DarkTransformation ) or S.BurstingSores : IsAvailable ( ) and AnyDnD : CooldownRemains ( ) < 10 and Player : BuffDown ( S.DeathAndDecayBuff ) ) ) then
if Cast ( I.AlgetharPuzzleBox , nil , Settings.Commons . DisplayStyle.Trinkets ) then return " algethar_puzzle_box trinkets 2 " ; end
end
-- use_item,use_off_gcd=1,name=irideus_fragment,if=(pet.gargoyle.active&pet.gargoyle.remains<16|!talent.summon_gargoyle&pet.army_ghoul.active&pet.army_ghoul.remains<16)|active_enemies>3&variable.adds_remain&(buff.dark_transformation.up|talent.bursting_sores&death_and_decay.ticking)
if I.IrideusFragment : IsEquippedAndReady ( ) and ( ( VarGargActive and VarGargRemains < 16 or ( not S.SummonGargoyle : IsAvailable ( ) ) and VarArmyGhoulActive and VarArmyGhoulRemains < 16 ) or EnemiesMeleeCount > 3 and VarAddsRemain and ( Pet : BuffUp ( S.DarkTransformation ) or S.BurstingSores : IsAvailable ( ) and Player : BuffUp ( S.DeathAndDecayBuff ) ) ) then
if Cast ( I.IrideusFragment , nil , Settings.Commons . DisplayStyle.Trinkets ) then return " irideus_fragment trinkets 4 " ; end
end
-- use_item,use_off_gcd=1,name=vial_of_animated_blood,if=pet.apoc_ghoul.active&pet.apoc_ghoul.remains<=18|!talent.apocalypse&buff.dark_transformation.up|active_enemies>3&variable.adds_remain&(buff.dark_transformation.up|talent.bursting_sores&death_and_decay.ticking)
if I . VialofAnimatedBlood : IsEquippedAndReady ( ) and ( VarApocGhoulActive and VarApocGhoulRemains <= 18 or ( not S.Apocalypse : IsAvailable ( ) ) and Pet : BuffUp ( S.DarkTransformation ) or EnemiesMeleeCount > 3 and VarAddsRemain and ( Pet : BuffUp ( S.DarkTransformation ) or S.BurstingSores : IsAvailable ( ) and Player : BuffUp ( S.DeathAndDecayBuff ) ) ) then
if Cast ( I.VialofAnimatedBlood , nil , Settings.Commons . DisplayStyle.Trinkets ) then return " vial_of_animated_blood trinkets 6 " ; end
end
end
-- use_item,use_off_gcd=1,slot=trinket1,if=!variable.trinket_1_manual&variable.trinket_1_buffs&((!talent.summon_gargoyle&((!talent.army_of_the_dead|cooldown.army_of_the_dead.remains_expected>60|death_knight.disable_aotd)&(pet.apoc_ghoul.active|(!talent.apocalypse|active_enemies>=2)&buff.dark_transformation.up)|pet.army_ghoul.active)|talent.summon_gargoyle&pet.gargoyle.active|cooldown.summon_gargoyle.remains>80)&(pet.apoc_ghoul.active|(!talent.apocalypse|active_enemies>=2)&buff.dark_transformation.up)&(variable.trinket_2_exclude|variable.trinket_priority=1|trinket.2.cooldown.remains|!trinket.2.has_cooldown))|trinket.1.proc.any_dps.duration>=fight_remains
-- use_item,use_off_gcd=1,slot=trinket2,if=!variable.trinket_2_manual&variable.trinket_2_buffs&((!talent.summon_gargoyle&((!talent.army_of_the_dead|cooldown.army_of_the_dead.remains_expected>60|death_knight.disable_aotd)&(pet.apoc_ghoul.active|(!talent.apocalypse|active_enemies>=2)&buff.dark_transformation.up)|pet.army_ghoul.active)|talent.summon_gargoyle&pet.gargoyle.active|cooldown.summon_gargoyle.remains>80)&(pet.apoc_ghoul.active|(!talent.apocalypse|active_enemies>=2)&buff.dark_transformation.up)&(variable.trinket_1_exclude|variable.trinket_priority=2|trinket.1.cooldown.remains|!trinket.1.has_cooldown))|trinket.2.proc.any_dps.duration>=fight_remains
-- use_item,use_off_gcd=1,slot=trinket1,if=!variable.trinket_1_manual&!variable.trinket_1_buffs&(trinket.2.cooldown.remains|!trinket.2.has_cooldown|!variable.trinket_2_buffs|!talent.summon_gargoyle&!talent.army_of_the_dead|!talent.summon_gargoyle&talent.army_of_the_dead&cooldown.army_of_the_dead.remains_expected>20|!talent.summon_gargoyle&!talent.army_of_the_dead&cooldown.dark_transformation.remains>20|cooldown.summon_gargoyle.remains>20&!pet.gargoyle.active)|fight_remains<15
-- use_item,use_off_gcd=1,slot=trinket2,if=!variable.trinket_2_manual&!variable.trinket_2_buffs&(trinket.1.cooldown.remains|!trinket.1.has_cooldown|!variable.trinket_1_buffs|!talent.summon_gargoyle&!talent.army_of_the_dead|!talent.summon_gargoyle&talent.army_of_the_dead&cooldown.army_of_the_dead.remains_expected>20|!talent.summon_gargoyle&!talent.army_of_the_dead&cooldown.dark_transformation.remains>20|cooldown.summon_gargoyle.remains>20&!pet.gargoyle.active)|fight_remains<15
-- use_item,use_off_gcd=1,slot=main_hand,if=(!variable.trinket_1_buffs|trinket.1.cooldown.remains)&(!variable.trinket_2_buffs|trinket.2.cooldown.remains)
-- TODO: Add above lines and remove below lines when we can handle the trinket sync/priority variables. For now, keeping the old trinket setup below.
-- use_items,if=(cooldown.apocalypse.remains|buff.dark_transformation.up)
if ( S.Apocalypse : CooldownDown ( ) or Pet : BuffUp ( S.DarkTransformation ) ) then
local ItemToUse , ItemSlot , ItemRange = Player : GetUseableItems ( OnUseExcludes )
if ItemToUse then
local DisplayStyle = Settings.Commons . DisplayStyle.Trinkets
if ItemSlot ~= 13 and ItemSlot ~= 14 then DisplayStyle = Settings.Commons . DisplayStyle.Items end
if ( ( ItemSlot == 13 or ItemSlot == 14 ) and Settings.Commons . Enabled.Trinkets ) or ( ItemSlot ~= 13 and ItemSlot ~= 14 and Settings.Commons . Enabled.Items ) then
if Cast ( ItemToUse , nil , DisplayStyle , not Target : IsInRange ( ItemRange ) ) then return " Generic use_items for " .. ItemToUse : Name ( ) ; end
end
end
end
end
local function Variables ( )
-- variable,name=epidemic_priority,op=setif,value=1,value_else=0,condition=talent.improved_death_coil&!talent.coil_of_devastation&active_enemies>=3|talent.coil_of_devastation&active_enemies>=4|!talent.improved_death_coil&active_enemies>=2
VarEpidemicPriority = ( S.ImprovedDeathCoil : IsAvailable ( ) and ( not S.CoilofDevastation : IsAvailable ( ) ) and EnemiesMeleeCount >= 3 or S.CoilofDevastation : IsAvailable ( ) and EnemiesMeleeCount >= 4 or ( not S.ImprovedDeathCoil : IsAvailable ( ) ) and EnemiesMeleeCount >= 2 )
-- variable,name=garg_setup,op=setif,value=1,value_else=0,condition=active_enemies>=3|cooldown.summon_gargoyle.remains>1&cooldown.apocalypse.remains>1|!talent.apocalypse&cooldown.summon_gargoyle.remains>1|!talent.summon_gargoyle|time>20
VarGargSetup = ( EnemiesMeleeCount >= 3 or S.SummonGargoyle : CooldownRemains ( ) > 1 and S.Apocalypse : CooldownRemains ( ) > 1 or ( not S.Apocalypse : IsAvailable ( ) ) and S.SummonGargoyle : CooldownRemains ( ) > 1 or ( not S.SummonGargoyle : IsAvailable ( ) ) or HL.CombatTime ( ) > 20 )
-- variable,name=apoc_timing,op=setif,value=7,value_else=2,condition=cooldown.apocalypse.remains<10&debuff.festering_wound.stack<=4&cooldown.unholy_assault.remains>10
VarApocTiming = ( S.Apocalypse : CooldownRemains ( ) < 10 and FesterStacks <= 4 and S.UnholyAssault : CooldownRemains ( ) > 10 ) and 7 or 2
-- variable,name=festermight_tracker,op=setif,value=debuff.festering_wound.stack>=1,value_else=debuff.festering_wound.stack>=(3-talent.infected_claws),condition=!pet.gargoyle.active&talent.festermight&buff.festermight.up&(buff.festermight.remains%(5*gcd.max))>=1
if ( ( not VarGargActive ) and S.Festermight : IsAvailable ( ) and Player : BuffUp ( S.FestermightBuff ) and ( Player : BuffRemains ( S.FestermightBuff ) / ( 5 * Player : GCD ( ) ) ) >= 1 ) then
VarFesterTracker = FesterStacks >= 1
else
VarFesterTracker = FesterStacks >= ( 3 - num ( S.InfectedClaws : IsAvailable ( ) ) )
end
-- variable,name=pop_wounds,op=setif,value=1,value_else=0,condition=(cooldown.apocalypse.remains>variable.apoc_timing|!talent.apocalypse)&(variable.festermight_tracker|debuff.festering_wound.stack>=1&!talent.apocalypse|debuff.festering_wound.stack>=1&cooldown.unholy_assault.remains<20&talent.unholy_assault&variable.st_planning|debuff.rotten_touch.up&debuff.festering_wound.stack>=1|debuff.festering_wound.stack>4)|fight_remains<5&debuff.festering_wound.stack>=1
VarPopWounds = ( ( S.Apocalypse : CooldownRemains ( ) > VarApocTiming or not S.Apocalypse : IsAvailable ( ) ) and ( VarFesterTracker or FesterStacks >= 1 and ( not S.Apocalypse : IsAvailable ( ) ) or FesterStacks >= 1 and S.UnholyAssault : CooldownRemains ( ) < 20 and S.UnholyAssault : IsAvailable ( ) and VarSTPlanning or Target : DebuffUp ( S.RottenTouchDebuff ) and FesterStacks >= 1 or FesterStacks > 4 ) or FightRemains < 5 and FesterStacks >= 1 )
-- variable,name=pooling_runic_power,op=setif,value=1,value_else=0,condition=talent.vile_contagion&cooldown.vile_contagion.remains<3&runic_power<60&!variable.st_planning
VarPoolingRunicPower = ( S.VileContagion : IsAvailable ( ) and S.VileContagion : CooldownRemains ( ) < 3 and Player : RunicPower ( ) < 60 and not VarSTPlanning )
-- variable,name=st_planning,op=setif,value=1,value_else=0,condition=active_enemies=1&(!raid_event.adds.exists|raid_event.adds.in>15)
VarSTPlanning = ( EnemiesMeleeCount == 1 or not AoEON ( ) )
-- variable,name=adds_remain,op=setif,value=1,value_else=0,condition=active_enemies>=2&(!raid_event.adds.exists|raid_event.adds.exists&raid_event.adds.remains>6)
VarAddsRemain = ( EnemiesMeleeCount >= 2 and AoEON ( ) )
end
--- ======= ACTION LISTS =======
local function APL ( )
no_heal = not DeathStrikeHeal ( )
EnemiesMelee = Player : GetEnemiesInMeleeRange ( 8 )
Enemies10ySplash = Target : GetEnemiesInSplashRange ( 10 )
if AoEON ( ) then
EnemiesMeleeCount = # EnemiesMelee
Enemies10ySplashCount = Target : GetEnemiesInSplashRangeCount ( 10 )
else
EnemiesMeleeCount = 1
Enemies10ySplashCount = 1
end
if Everyone.TargetIsValid ( ) or Player : AffectingCombat ( ) then
-- Calculate fight_remains
BossFightRemains = HL.BossFightRemains ( nil , true )
FightRemains = BossFightRemains
if FightRemains == 11111 then
FightRemains = HL.FightRemains ( EnemiesMelee , false )
end
-- Are we in the buff window for Commander of the Dead?
VarCommanderBuffUp = S.DarkTransformation : TimeSinceLastCast ( ) <= 4
VarCommanderBuffRemains = ( VarCommanderBuffUp ) and 4 - S.DarkTransformation : TimeSinceLastCast ( ) or 0
-- Check which enemies don't have Virulent Plague
EnemiesWithoutVP = UnitsWithoutVP ( Enemies10ySplash )
-- Is Apocalypse Ghoul active?
VarApocGhoulActive = S.Apocalypse : TimeSinceLastCast ( ) <= 15
VarApocGhoulRemains = ( VarApocGhoulActive ) and 15 - S.Apocalypse : TimeSinceLastCast ( ) or 0
-- Is Army active?
VarArmyGhoulActive = S.ArmyoftheDead : TimeSinceLastCast ( ) <= 30
VarArmyGhoulRemains = ( VarArmyGhoulRemains ) and 30 - S.ArmyoftheDead : TimeSinceLastCast ( ) or 0
-- Is Gargoyle active?
VarGargActive = ghoul : gargactive ( )
VarGargRemains = ghoul : gargremains ( )
-- Check our stacks of Festering Wounds
FesterStacks = Target : DebuffStack ( S.FesteringWoundDebuff )
end
if Everyone.TargetIsValid ( ) then
-- call precombat
if not Player : AffectingCombat ( ) then
local ShouldReturn = Precombat ( ) ; if ShouldReturn then return ShouldReturn ; end
end
-- use DeathStrike on low HP or with proc in Solo Mode
if S.DeathStrike : IsReady ( ) and not no_heal then
if Cast ( S.DeathStrike ) then return " death_strike low hp or proc " ; end
end
-- auto_attack
-- Interrupts (here instead of HighPrioActions)
local ShouldReturn = Everyone.Interrupt ( 15 , S.MindFreeze , Settings.Commons2 . OffGCDasOffGCD.MindFreeze , StunInterrupts ) ; if ShouldReturn then return ShouldReturn ; end
if EnemiesMeleeCount == 0 then
-- Manually added: Outbreak if targets are missing VP and out of range
if S.Outbreak : IsReady ( ) and ( EnemiesWithoutVP > 0 ) then
if Cast ( S.Outbreak , nil , nil , not Target : IsSpellInRange ( S.Outbreak ) ) then return " outbreak out_of_range " ; end
end
-- Manually added: epidemic,if=!variable.pooling_runic_power&active_enemies=0
if S.Epidemic : IsReady ( ) and AoEON ( ) and S.VirulentPlagueDebuff : AuraActiveCount ( ) > 1 and ( not VarPoolingRunicPower ) then
if Cast ( S.Epidemic , Settings.Unholy . GCDasOffGCD.Epidemic , nil , not Target : IsInRange ( 30 ) ) then return " epidemic out_of_range " ; end
end
-- Manually added: death_coil,if=!variable.pooling_runic_power&active_enemies=0
if S.DeathCoil : IsReady ( ) and S.VirulentPlagueDebuff : AuraActiveCount ( ) < 2 and ( not VarPoolingRunicPower ) then
if Cast ( S.DeathCoil , nil , nil , not Target : IsSpellInRange ( S.DeathCoil ) ) then return " death_coil out_of_range " ; end
end
end
-- call_action_list,name=variables
Variables ( )
-- call_action_list,name=high_prio_actions
local ShouldReturn = HighPrioActions ( ) ; if ShouldReturn then return ShouldReturn ; end
-- call_action_list,name=trinkets
if Settings.Commons . Enabled.Trinkets or Settings.Commons . Enabled.Items then
local ShouldReturn = Trinkets ( ) ; if ShouldReturn then return ShouldReturn ; end
end
-- run_action_list,name=garg_setup,if=variable.garg_setup=0
if not VarGargSetup then
local ShouldReturn = GargSetup ( ) ; if ShouldReturn then return ShouldReturn ; end
if HR.CastAnnotated ( S.Pool , false , " WAIT " ) then return " Pool for GargSetup() " ; end
end
-- call_action_list,name=cooldowns,if=variable.st_planning
if ( CDsON ( ) and VarSTPlanning ) then
local ShouldReturn = Cooldowns ( ) ; if ShouldReturn then return ShouldReturn ; end
end
-- call_action_list,name=aoe_cooldowns,if=variable.adds_remain
if ( AoEON ( ) and CDsON ( ) and VarAddsRemain ) then
local ShouldReturn = AoECDs ( ) ; if ShouldReturn then return ShouldReturn ; end
end
-- call_action_list,name=racials
if ( CDsON ( ) ) then
local ShouldReturn = Racials ( ) ; if ShouldReturn then return ShouldReturn ; end
end
if ( AoEON ( ) ) then
-- call_action_list,name=aoe_setup,if=variable.adds_remain&cooldown.any_dnd.remains<10&!death_and_decay.ticking
if ( VarAddsRemain and AnyDnD : CooldownRemains ( ) < 10 and Player : BuffDown ( S.DeathAndDecayBuff ) ) then
local ShouldReturn = AoESetup ( ) ; if ShouldReturn then return ShouldReturn ; end
end
-- call_action_list,name=aoe_burst,if=active_enemies>=4&death_and_decay.ticking
if ( EnemiesMeleeCount >= 4 and Player : BuffUp ( S.DeathAndDecayBuff ) ) then
local ShouldReturn = AoEBurst ( ) ; if ShouldReturn then return ShouldReturn ; end
end
-- call_action_list,name=aoe,if=active_enemies>=4&(cooldown.any_dnd.remains>10&!death_and_decay.ticking|!variable.adds_remain)
if ( EnemiesMeleeCount >= 4 and ( AnyDnD : CooldownRemains ( ) > 10 and Player : BuffDown ( S.DeathAndDecayBuff ) or not VarAddsRemain ) ) then
local ShouldReturn = AoE ( ) ; if ShouldReturn then return ShouldReturn ; end
end
end
-- call_action_list,name=st,if=active_enemies<=3
if ( EnemiesMeleeCount <= 3 ) then
local ShouldReturn = ST ( ) ; if ShouldReturn then return ShouldReturn ; end
end
-- Add pool resources icon if nothing else to do
if Cast ( S.Pool ) then return " pool_resources " ; end
end
end
local function Init ( )
S.VirulentPlagueDebuff : RegisterAuraTracking ( )
S.FesteringWoundDebuff : RegisterAuraTracking ( )
HR.Print ( " Unholy DK rotation is currently a work in progress, but has been updated for patch 10.1.5. " )
end
HR.SetAPL ( 252 , APL , Init )