-- PaladinProtection.lua -- October 2023 if UnitClassBase( "player" ) ~= "PALADIN" then return end local addon, ns = ... local Hekili = _G[ addon ] local class, state = Hekili.Class, Hekili.State local FindUnitBuffByID = ns.FindUnitBuffByID local spec = Hekili:NewSpecialization( 66 ) local strformat = string.format spec:RegisterResource( Enum.PowerType.HolyPower ) spec:RegisterResource( Enum.PowerType.Mana ) -- Talents spec:RegisterTalents( { -- Paladin avenging_wrath = { 81606, 31884 , 1 }, -- Call upon the Light to become an avatar of retribution, allowing Hammer of Wrath to be used on any target, increasing your damage, healing and critical strike chance by 20% for 20 sec. blessing_of_protection = { 81616, 1022 , 1 }, -- Blesses a party or raid member, granting immunity to Physical damage and harmful effects for 10 sec. Cannot be used on a target with Forbearance. Causes Forbearance for 30 sec. Shares a cooldown with Blessing of Spellwarding. blessing_of_sacrifice = { 81614, 6940 , 1 }, -- Blesses a party or raid member, reducing their damage taken by 30%, but you suffer 100% of damage prevented. Last 12 sec, or until transferred damage would cause you to fall below 20% health. blinding_light = { 81598, 115750, 1 }, -- Emits dazzling light in all directions, blinding enemies within 10 yds, causing them to wander disoriented for 6 sec. cavalier = { 81605, 230332, 1 }, -- Divine Steed now has 2 charges. crusaders_reprieve = { 81543, 403042, 1 }, -- Increases the range of your Rebuke by 3 yds. Using Blessed Hammer heals you for 2% of your maximum health. divine_steed = { 81632, 190784, 1 }, -- Leap atop your Charger for 8.5 sec, increasing movement speed by 100%. Usable while indoors or in combat. divine_toll = { 81496, 375576, 1 }, -- Instantly cast Avenger's Shield on up to 5 targets within 30 yds. Generates 1 Holy Power per target hit. fading_light = { 81623, 405768, 1 }, -- Blessing of Dawn: Blessing of Dawn increases the damage and healing of your next Holy Power spending ability by an additional 10%. Blessing of Dusk: Blessing of Dusk causes your Holy Power generating abilities to also grant an absorb shield for 20% of damage or healing dealt. faiths_armor = { 81495, 406101, 1 }, -- fist_of_justice = { 81602, 234299, 2 }, -- Each Holy Power spent reduces the remaining cooldown on Hammer of Justice by 1 sec. golden_path = { 81610, 377128, 1 }, -- Consecration heals you and 5 allies within it for 111 every 0.9 sec. holy_aegis = { 81609, 385515, 2 }, -- Armor and critical strike chance increased by 2%. improved_blessing_of_protection = { 81617, 384909, 1 }, -- Reduces the cooldown of Blessing of Protection and Blessing of Spellwarding by 60 sec. incandescence = { 81628, 385464, 1 }, -- Each Holy Power you spend has a 5% chance to cause your Consecration to flare up, dealing 907 Holy damage to up to 5 enemies standing within it. judgment_of_light = { 81608, 183778, 1 }, -- Judgment causes the next 5 successful attacks against the target to heal the attacker for 445. justification = { 81509, 377043, 1 }, -- Judgment's damage is increased by 10%. obduracy = { 81630, 385427, 1 }, -- Speed increased by 2% and damage taken from area of effect attacks reduced by 2%. punishment = { 93165, 403530, 1 }, -- Successfully interrupting an enemy with Rebuke or Avenger's Shield casts an extra Blessed Hammer. rebuke = { 81604, 96231 , 1 }, -- Interrupts spellcasting and prevents any spell in that school from being cast for 3 sec. recompense = { 81607, 384914, 1 }, -- After your Blessing of Sacrifice ends, 50% of the total damage it diverted is added to your next Judgment as bonus damage, or your next Word of Glory as bonus healing. This effect's bonus damage cannot exceed 30% of your maximum health and its bonus healing cannot exceed 100% of your maximum health. repentance = { 81598, 20066 , 1 }, -- Forces an enemy target to meditate, incapacitating them for 1 min. Usable against Humanoids, Demons, Undead, Dragonkin, and Giants. sacrifice_of_the_just = { 81607, 384820, 1 }, -- Reduces the cooldown of Blessing of Sacrifice by 60 sec. sanctified_plates = { 93009, 402964, 2 }, -- Armor increased by 5%, Stamina increased by 5% and damage taken from area of effect attacks reduced by 5%. seal_of_alacrity = { 81619, 385425, 2 }, -- Haste increased by 2% and Judgment cooldown reduced by 0.5 sec. seal_of_mercy = { 81611, 384897, 1 }, -- Golden Path strikes the lowest health ally within it an additional time for 100% of its effect. seal_of_might = { 81621, 385450, 2 }, -- Mastery increased by 2% and strength increased by 2%. seal_of_order = { 81623, 385129, 1 }, -- Blessing of Dawn: Blessing of Dawn increases the damage and healing of your next Holy Power spending ability by an additional 10%. Blessing of Dusk: Blessing of Dusk increases your armor by 10% and your Holy Power generating abilities cooldown 10% faster. seasoned_warhorse = { 81631, 376996, 1 }, -- Increases the duration of Divine Steed by 2 sec. strength_of_conviction = { 81480, 379008, 2 }, -- While in your Consecration, your Shield of the Righteous and Word of Glory have 10% increased damage and healing. touch_of_light = { 81628, 385349, 1 }, -- Your spells and abilities have a chance to cause your target to erupt in a blinding light dealing 756 Holy damage or healing an ally for 1,000 health. turn_evil = { 93010, 10326 , 1 }, -- The power of the Light compels an Undead, Aberration, or Demon target to flee for up to 40 sec. Damage may break the effect. Lesser creatures have a chance to be destroyed. Only one target can be turned at a time. unbreakable_spirit = { 81615, 114154, 1 }, -- Reduces the cooldown of your Divine Shield, Ardent Defender, and Lay on Hands by 30%. -- Protection afterimage = { 93188, 385414, 1 }, -- After you spend 20 Holy Power, your next Word of Glory echoes onto a nearby ally at 30% effectiveness. ardent_defender = { 81481, 31850 , 1 }, -- Reduces all damage you take by 20% for 8 sec. While Ardent Defender is active, the next attack that would otherwise kill you will instead bring you to 20% of your maximum health. auras_of_swift_vengeance = { 81601, 385639, 1 }, -- Learn Retribution Aura and Crusader Aura: Retribution Aura: When any party or raid member within 40 yds takes more than 30% of their health in damage in a single hit, each member gains 5% increased damage and healing, decaying over 30 sec. This cannot occur within 30 sec of the aura being applied. Crusader Aura: Increases mounted speed by 20% for all party and raid members within 40 yds. auras_of_the_resolute = { 81599, 385633, 1 }, -- Learn Concentration Aura and Devotion Aura: Concentration Aura: Interrupt and Silence effects on party and raid members within 40 yds are 30% shorter. Devotion Aura: Party and raid members within 40 yds are bolstered by their devotion, reducing damage taken by 3%. avengers_shield = { 81502, 31935 , 1 }, -- Hurls your shield at an enemy target, dealing 1,738 Holy damage, interrupting and silencing the non-Player target for 3 sec, and then jumping to 4 additional nearby enemies. Shields you for 8 sec, absorbing 30% as much damage as it dealt. Deals 185 additional damage to all enemies within 5 yds of each target hit. avenging_wrath_might = { 81483, 31884 , 1 }, -- Call upon the Light to become an avatar of retribution, allowing Hammer of Wrath to be used on any target, increasing your damage, healing and critical strike chance by 20% for 20 sec. barricade_of_faith = { 81501, 385726, 1 }, -- When you use Avenger's Shield, your block chance is increased by 10% for 10 sec. bastion_of_light = { 81488, 378974, 1 }, -- Your next 3 casts of Shield of the Righteous or Word of Glory cost no Holy Power. blessed_hammer = { 81469, 204019, 1 }, -- Throws a Blessed Hammer that spirals outward, dealing 375 Holy damage to enemies and reducing the next damage they deal to you by 667. Generates 1 Holy Power. blessing_of_freedom = { 81600, 1044 , 1 }, -- Blesses a party or raid member, granting immunity to movement impairing effects for 8 sec. blessing_of_spellwarding = { 90062, 204018, 1 }, -- Blesses a party or raid member, granting immunity to magical damage and harmful effects for 10 sec. Cannot be used on a target with Forbearance. Causes Forbearance for 30 sec. Shares a cooldown with Blessing of Protection. bulwark_of_order = { 81499, 209389, 2 }, -- Avenger's Shield also shields you for 8 sec, absorbing 30% as much damage as it dealt, up to 30% of your maximum health. bulwark_of_righteous_fury = { 81491, 386653, 1 }, -- Avenger's Shield increases the damage of your next Shield of the Righteous by 20% for each target hit by Avenger's Shield, stacking up to 5 times, and increases its radius by 6 yds. cleanse_toxins = { 81507, 213644, 1 }, -- Cleanses a friendly target, removing all Poison and Disease effects. consecrated_ground = { 81492, 204054, 1 }, -- Your Consecration is 15% larger, and enemies within it have 50% reduced movement speed. consecration_in_flame = { 81470, 379022, 1 }, -- Consecration lasts 2 sec longer and its damage is increased by 20%. crusaders_judgment = { 81473, 204023, 1 }, -- Judgment now has 2 charges, and Grand Crusader now also reduces the cooldown of Judgment by 3 sec. crusaders_resolve = { 81493, 380188, 1 }, -- Enemies hit by Avenger's Shield deal 2% reduced damage to you for 10 sec. Multiple applications may overlap, up to a maximum of 3. divine_purpose = { 93192, 223817, 1 }, -- Holy Power abilities have a 15% chance to make your next Holy Power ability free and deal 15% increased damage and healing. divine_resonance = { 81479, 386738, 1 }, -- eye_of_tyr = { 81497, 387174, 1 }, -- Releases a blinding flash from your shield, causing 5,944 Holy damage to all nearby enemies within 8 yds and reducing all damage they deal to you by 25% for 9 sec. faith_in_the_light = { 81485, 379043, 2 }, -- Casting Word of Glory grants you an additional 5% block chance for 5 sec. ferren_marcuss_fervor = { 81482, 378762, 2 }, -- Avenger's Shield deals 10% increased damage to its primary target. final_stand = { 81504, 204077, 1 }, -- During Divine Shield, all targets within 15 yds are taunted. focused_enmity = { 81472, 378845, 1 }, -- When Avenger's Shield strikes a single enemy, it deals 100% additional Holy damage. gift_of_the_golden_valkyr = { 81484, 378279, 2 }, -- Each enemy hit by Avenger's Shield reduces the remaining cooldown on Guardian of Ancient Kings by 0.5 sec. When you drop below 30% health, you become infused with Guardian of Ancient Kings for 4 sec. This cannot occur again for 45 sec. grand_crusader = { 81487, 85043 , 1 }, -- When you avoid a melee attack or use Blessed Hammer, you have a 15% chance to reset the remaining cooldown on Avenger's Shield . Reduces the cooldown of Judgment by 3 sec. greater_judgment = { 81603, 231663, 1 }, -- Judgment causes the target to take 40% increased damage from your next Holy Power ability. guardian_of_ancient_kings = { 81490, 86659 , 1 }, -- Empowers you with the spirit of ancient kings, reducing all damage you take by 50% for 8 sec. hammer_of_the_righteous = { 81469, 53595 , 1 }, -- Hammers the current target for 2,249 Physical damage. While you are standing in your Consecration, Hammer of the Righteous also causes a wave of light that hits all other targets within 8 yds for 355 Holy damage. Generates 1 Holy Power. hammer_of_wrath = { 81510, 24275 , 1 }, -- Hurls a divine hammer that strikes an enemy for 5,630 Holy damage. Only usable on enemies that have less than 20% health, or during Avenging Wrath. Generates 1 Holy Power. hand_of_the_protector = { 81475, 315924, 1 }, -- When you cast Word of Glory on someone other than yourself, its healing is increased by up to 100% based on the target's missing health. holy_shield = { 81489, 152261, 1 }, -- Your block chance is increased by 20%, you are able to block spells, and your successful blocks deal 258 Holy damage to your attacker. improved_ardent_defender = { 90062, 393114, 1 }, -- Ardent Defender reduces damage taken by an additional 10%. improved_holy_shield = { 81486, 393030, 1 }, -- Your chance to block spells is increased by 10%. inmost_light = { 92953, 405757, 1 }, -- Eye of Tyr deals 300% increased damage and has 25% reduced cooldown. inner_light = { 81494, 386568, 1 }, -- When Shield of the Righteous expires, gain 10% block chance and deal 524 Holy damage to all attackers for 4 sec. inspiring_vanguard = { 81476, 393022, 1 }, -- lay_on_hands = { 81597, 633 , 1 }, -- Heals a friendly target for an amount equal to 100% your maximum health. Cannot be used on a target with Forbearance. Causes Forbearance for 30 sec. light_of_the_titans = { 81503, 378405, 2 }, -- Word of Glory heals for an additional 3,278 over 15 sec. Increased by 50% if cast on yourself while you are afflicted by a harmful damage over time effect. lightforged_blessing = { 93168, 406468, 1 }, -- Shield of the Righteous heals you and up to 4 nearby allies for 1% of maximum health. moment_of_glory = { 81505, 327193, 1 }, -- For the next 15 sec, you generate an absorb shield for 25% of all damage you deal, and Avenger's Shield damage is increased by 20% and its cooldown is reduced by 75%. of_dusk_and_dawn = { 93356, 409441, 1 }, -- When you cast 3 Holy Power generating abilities, you gain Blessing of Dawn. When you consume Blessing of Dawn, you gain Blessing of Dusk. Blessing of Dawn Blessing of Dusk Damage taken reduced by 5% For 10 sec. quickened_invocation = { 81479, 379391, 1 }, -- Divine Toll's cooldown is reduced by 15 sec. redoubt = { 81494, 280373, 1 }, -- Shield of the Righteous increases your Strength and Stamina by 2% for 10 sec, stacking up to 3. relentless_inquisitor = { 81506, 383388, 1 }, -- Spending Holy Power grants you 1% haste per finisher for 12 sec, stacking up to 3 times. resolute_defender = { 81471, 385422, 2 }, -- Each 3 Holy Power you spend reduces the cooldown of Ardent Defender and Divine Shield by 1.0 sec. righteous_protector = { 81477, 204074, 1 }, -- Holy Power abilities reduce the remaining cooldown on Avenging Wrath and Guardian of Ancient Kings by 2.0 sec. sanctified_wrath = { 81620, 31884 , 1 }, -- Call upon the Light to become an avatar of retribution, allowing Hammer of Wrath to be used on any target, increasing your damage, healing and critical strike chance by 20% for 20 sec. sanctuary = { 81486, 379021, 1 }, -- While in your Consecration, your damage taken is reduced by an additional 5%. seal_of_charity = { 81612, 384815, 1 }, -- When you cast Word of Glory on someone other than yourself, you are also healed for 50% of the amount healed. seal_of_reprisal = { 81629, 377053, 1 }, -- Your Blessed Hammer deals 20% increased damage. seal_of_the_crusader = { 93684, 385728, 2 }, -- Your auto attacks deal 252 additional Holy damage. sentinel = { 81483, 389539, 1 }, -- Call upon the Light and gain 15 stacks of Divine Resolve, increasing your maximum health by 1% and reducing your damage taken by 2% per stack for 20 sec. After 5 sec, you will begin to lose 1 stack per second, but each 3 Holy Power spent will delay the loss of your next stack by 1 sec. While active, your damage and healing is increased by 20%, and Hammer of Wrath may be cast on any target. Combines with Avenging Wrath. shining_light = { 81498, 321136, 1 }, -- Every 3 Shields of the Righteous make your next Word of Glory cost no Holy Power. soaring_shield = { 81472, 378457, 1 }, -- Avenger's Shield jumps to 2 additional targets. strength_in_adversity = { 81493, 393071, 1 }, -- For each target hit by Avenger's Shield, gain 2% parry for 15 sec. tirions_devotion = { 81492, 392928, 1 }, -- Lay on Hands' cooldown is reduced by 1.0 sec per Holy Power spent. tyrs_enforcer = { 81474, 378285, 2 }, -- Your Avenger's Shield is imbued with holy fire, causing it to deal 185 Holy damage to all enemies within 5 yards of each target hit. unbound_freedom = { 93187, 305394, 1 }, -- Blessing of Freedom increases movement speed by 30%, and you gain Blessing of Freedom when cast on a friendly target. uthers_counsel = { 81500, 378425, 2 }, -- Your Lay on Hands, Divine Shield, Blessing of Protection, and Blessing of Spellwarding have 20% reduced cooldown. zealots_paragon = { 81625, 391142, 1 }, -- Hammer of Wrath and Judgment deal 10% additional damage and extend the duration of Avenging Wrath by 0.5 sec. } ) -- PvP Talents spec:RegisterPvpTalents( { aura_of_reckoning = 5554, -- (247675) When you or allies within your Aura are critically struck, gain Reckoning. Gain 1 additional stack if you are the victim. At 100 stacks of Reckoning, your next weapon swing deals 200% increased damage, will critically strike, and activates Avenging Wrath for 6 sec. guarded_by_the_light = 97 , -- (216855) guardian_of_the_forgotten_queen = 94 , -- (228049) Empowers the friendly target with the spirit of the forgotten queen, causing the target to be immune to all damage for 10 sec. hallowed_ground = 90 , -- (216868) inquisition = 844 , -- (207028) You focus the assault on this target, increasing their damage taken by 3% for 6 sec. Each unique player that attacks the target increases the damage taken by an additional 3%, stacking up to 5 times. Your melee attacks refresh the duration of Focused Assault. judgments_of_the_pure = 93 , -- (355858) luminescence = 3474, -- (199428) sacred_duty = 92 , -- (216853) searing_glare = 5582, -- (410126) Call upon the light to blind your enemies in a 25 yd cone, causing enemies to miss their spells and attacks for 4 sec. shield_of_virtue = 861 , -- (215652) When activated, your next Avenger's Shield will interrupt and silence all enemies within 8 yds of the target. steed_of_glory = 91 , -- (199542) warrior_of_light = 860 , -- (210341) } ) -- Auras spec:RegisterAuras( { -- Talent: Damage taken reduced by $w1%. The next attack that would otherwise kill you will instead bring you to $w2% of your maximum health. -- https://wowhead.com/beta/spell=31850 ardent_defender = { id = 31850, duration = 8, type = "Magic", max_stack = 1 }, -- Talent: Silenced. -- https://wowhead.com/beta/spell=31935 avengers_shield = { id = 31935, duration = 3, type = "Magic", max_stack = 1 }, -- Talent: $?$w2>0&w4>0[Damage, healing and critical strike chance increased by $w2%.]?w4==0[Damage and healing increased by $w2%.]?w2==0[Critical strike chance increased by $w4%.][] -- https://wowhead.com/beta/spell=31884 avenging_wrath = { id = 31884, duration = 20, max_stack = 1 }, -- Alias for Avenging Wrath vs. Sentinel aw_sentinel = { alias = { "avenging_wrath", "sentinel" }, aliasMode = "first", -- use duration info from the first buff that's up, as they should all be equal. aliasType = "buff", duration = 20, }, -- Talent: Block chance increased by $s1%. -- https://wowhead.com/beta/spell=385724 barricade_of_faith = { id = 385724, duration = 10, max_stack = 1 }, -- Talent: Your next cast of Shield of the Righteous or Word of Glory cost no Holy Power. -- https://wowhead.com/beta/spell=378974 bastion_of_light = { id = 378974, duration = 30, max_stack = 1 }, -- Talent: Damage against $@auracaster reduced by $w2. -- https://wowhead.com/beta/spell=204301 blessed_hammer = { id = 204301, duration = 10, max_stack = 1 }, -- Your next Holy Power spending ability deals 20% additional increased damage and healing. -- https://wowhead.com/beta/spell=385127 blessing_of_dawn = { id = 385127, duration = 20, max_stack = 2 }, blessing_of_dusk = { id = 385126, duration = 10, max_stack = 1 }, -- Talent: Immune to movement impairing effects. $?s199325[Movement speed increased by $199325m1%][] -- https://wowhead.com/beta/spell=1044 blessing_of_freedom = { id = 1044, duration = 8, type = "Magic", max_stack = 1 }, -- Talent: Immune to Physical damage and harmful effects. -- https://wowhead.com/beta/spell=1022 blessing_of_protection = { id = 1022, duration = 10, mechanic = "invulneraility", type = "Magic", max_stack = 1 }, -- Talent: $?$w1>0[$w1% of damage taken is redirected to $@auracaster.][Taking ${$s1*$e1}% of damage taken by target ally.] -- https://wowhead.com/beta/spell=6940 blessing_of_sacrifice = { id = 6940, duration = 12, type = "Magic", max_stack = 1 }, -- Talent: Immune to magical damage and harmful effects. -- https://wowhead.com/beta/spell=204018 blessing_of_spellwarding = { id = 204018, duration = 10, mechanic = "invulneraility", type = "Magic", max_stack = 1 }, blinding_light = { id = 105421, duration = 6, type = "Magic", max_stack = 1 }, bulwark_of_order = { id = 209388, duration = 8, max_stack = 1 }, bulwark_of_righteous_fury = { id = 386652, duration = 15, max_stack = 5, copy = 337848 }, -- Interrupt and Silence effects reduced by $w1%. $?s339124[Fear effects are reduced by $w4%.][] -- https://wowhead.com/beta/spell=317920 concentration_aura = { id = 317920, duration = 3600, max_stack = 1 }, -- Damage every $t1 sec. -- https://wowhead.com/beta/spell=26573 consecration = { id = 26573, duration = function() return talent.consecration_in_flame.enabled and 14 or 12 end, tick_time = 1, type = "Magic", max_stack = 1, generate = function( c, type ) if type == "buff" and FindUnitBuffByID( "player", 188370 ) then local dropped, expires for i = 1, 5 do local up, name, start, duration = GetTotemInfo( i ) if up and name == class.abilities.consecration.name then dropped = start expires = dropped + duration break end end if dropped and expires > query_time then c.expires = expires c.applied = dropped c.count = 1 c.caster = "player" return end end c.count = 0 c.expires = 0 c.applied = 0 c.caster = "unknown" end }, consecration_dot = { id = 204242, duration = 12, max_stack = 1, }, -- Mounted speed increased by $w1%.$?$w5>0[ Incoming fear duration reduced by $w5%.][] -- https://wowhead.com/beta/spell=32223 crusader_aura = { id = 32223, duration = 3600, max_stack = 1 }, crusaders_resolve = { id = 383843, duration = 10, max_stack = 3 }, -- Damage taken reduced by $w1%. -- https://wowhead.com/beta/spell=465 devotion_aura = { id = 465, duration = 3600, max_stack = 1 }, divine_purpose = { id = 223819, duration = 12, max_stack = 1, }, divine_resonance = { id = 384029, duration = 15, tick_time = 5, max_stack = 1 }, divine_shield = { id = 642, duration = 8, mechanic = "invulneraility", type = "Magic", max_stack = 1 }, divine_steed = { id = 221886, duration = function () return 4 * ( 1 + ( conduit.lights_barding.mod * 0.01 ) ) + ( 2 * talent.seasoned_warhorse.rank ) end, max_stack = 1, }, -- Sentenced to suffer $w1 Holy damage. -- https://wowhead.com/beta/spell=343527 execution_sentence = { id = 343527, duration = 8, type = "Magic", max_stack = 1 }, -- Counterattacking all melee attacks. -- https://wowhead.com/beta/spell=205191 eye_for_an_eye = { id = 205191, duration = 10, max_stack = 1 }, -- Talent: Dealing $s1% less damage to the Paladin. -- https://wowhead.com/beta/spell=387174 eye_of_tyr = { id = 387174, duration = 9, type = "Magic", max_stack = 1 }, fading_light = { id = 405790, duration = 10, max_stack = 1, }, faith_barricade = { id = 385724, duration = 10, max_stack = 1 }, faith_in_the_light = { id = 379041, duration = 5, max_stack = 1 }, final_reckoning = { id = 343721, duration = 8, max_stack = 1 }, final_stand = { id = 204079, duration = 8, max_stack = 1, }, first_avenger = { id = 327225, duration = 8, max_stack = 1 }, forbearance = { id = 25771, duration = 30, max_stack = 1, }, focused_assault = { id = 206891, duration = 6, max_stack = 5 }, -- Talent: Damage taken reduced by $86657s2%. -- https://wowhead.com/beta/spell=86659 guardian_of_ancient_kings = { id = 86659, duration = 8, max_stack = 1 }, guardian_of_the_forgotten_queen_228048 = { -- TODO: Disambiguate -- TODO: Check Aura (https://wowhead.com/beta/spell=228048) id = 228048, duration = 10, max_stack = 1 }, guardian_of_the_forgotten_queen_228049 = { -- TODO: Disambiguate -- TODO: Check Aura (https://wowhead.com/beta/spell=228049) id = 228049, duration = 10, max_stack = 1 }, -- Stunned. -- https://wowhead.com/beta/spell=853 hammer_of_justice = { id = 853, duration = 6, mechanic = "stun", type = "Magic", max_stack = 1 }, hand_of_hindrance = { id = 183218, duration = 10, max_stack = 1 }, -- Taunted. -- https://wowhead.com/beta/spell=62124 hand_of_reckoning = { id = 62124, duration = 3, mechanic = "taunt", max_stack = 1 }, --[[ Talent: Your Holy Power generation is tripled. -- https://wowhead.com/beta/spell=105809 holy_avenger = { id = 105809, duration = 20, max_stack = 1 }, ]] inner_light = { id = 386556, duration = 4, max_stack = 1 }, -- Talent: Strength increased by $w1. -- https://wowhead.com/beta/spell=393019 inspiring_vanguard = { id = 393019, duration = 8, max_stack = 1, copy = 279397 }, -- Taking $w1% increased damage from $@auracaster's next Holy Power ability. -- https://wowhead.com/beta/spell=197277 judgment = { id = 197277, duration = 15, max_stack = 1 }, -- Talent: Attackers are healed for $183811s1. -- https://wowhead.com/beta/spell=196941 judgment_of_light = { id = 196941, duration = 30, max_stack = 25 }, -- Talent: Healing for $w1 every $t1 sec. -- https://wowhead.com/beta/spell=378412 light_of_the_titans = { id = 378412, duration = 15, type = "Magic", max_stack = 1 }, -- Talent: Avenger's Shield damage increased by $s2% and cooldown reduced by $s1%. Generating an absorb shield for $s2% of all damage dealt. -- https://wowhead.com/beta/spell=327193 moment_of_glory = { id = 327193, duration = 15, max_stack = 1 }, -- Movement speed reduced by $s2%. -- https://wowhead.com/beta/spell=383469 radiant_decree = { id = 383469, duration = 5, type = "Magic", max_stack = 1 }, -- Talent: Strength and Stamina increased by $w1%. -- https://wowhead.com/beta/spell=280375 redoubt = { id = 280375, duration = 10, max_stack = 3 }, -- Talent: Haste increased by $w1%. -- https://wowhead.com/beta/spell=383389 relentless_inquisitor = { id = 383389, duration = 12, max_stack = 3 }, -- Talent: Incapacitated. -- https://wowhead.com/beta/spell=20066 repentance = { id = 20066, duration = 60, mechanic = "incapacitate", type = "Magic", max_stack = 1 }, -- When any party or raid member within $a1 yards dies, you gain Avenging Wrath for $w1 sec. When any party or raid member within $a1 yards takes more than $s3% of their health in damage, you gain Seraphim for $s4 sec. This cannot occur more than once every 30 sec. -- https://wowhead.com/beta/spell=183435 retribution_aura = { id = 183435, duration = 3600, max_stack = 1 }, -- Used to model 1s ICD of Righteous Protector after Holy Power spender. righteous_protector_icd = { duration = 1, max_stack = 1, }, -- Talent: $@spellaura385728 -- https://wowhead.com/beta/spell=385723 seal_of_the_crusader = { id = 385723, duration = 5, max_stack = 1 }, sense_undead = { id = 5502, duration = 3600, max_stack = 1 }, -- Talent: Damage taken reduced by $s12%. Maximum health increased by $s11%. $?s53376[ Judgment generates $53376s3~ additional Holy Power.][] $?s384376[ Damage and healing increased by $384376s1~%. Hammer of Wrath may be cast on any target.][] -- https://wowhead.com/beta/spell=389539 sentinel = { id = 389539, duration = 20, max_stack = 15, copy = "divine_resolve" }, -- Armor increased by $?c1[${$W1*$INT/100}][${$W1*$STR/100}]. -- https://wowhead.com/beta/spell=132403 shield_of_the_righteous = { id = 132403, duration = 4.5, max_stack = 1 }, -- Absorbs $w1 damage and deals damage when the barrier fades or is fully consumed. -- https://wowhead.com/beta/spell=184662 shield_of_vengeance = { id = 184662, duration = 15, mechanic = "shield", type = "Magic", max_stack = 1 }, shield_of_virtue = { id = 215652, duration = 3600, max_stack = 1 }, shining_light = { id = 182104, duration = 15, max_stack = 3, }, shining_light_free = { id = 327510, duration = 15, max_stack = 1, copy = "shining_light_full" }, strength_in_adversity = { id = 393038, duration = 15, max_stack = 1, }, -- Talent: Disoriented. -- https://wowhead.com/beta/spell=10326 turn_evil = { id = 10326, duration = 40, mechanic = "turn", type = "Magic", max_stack = 1 }, -- Generic Aura to cover any Aura. paladin_aura = { alias = { "concentration_aura", "crusader_aura", "devotion_aura", "retribution_aura" }, aliasMode = "first", aliasType = "buff", duration = 3600, }, -- Azerite Powers empyreal_ward = { id = 287731, duration = 60, max_stack = 1, }, -- Conduits royal_decree = { id = 340147, duration = 15, max_stack = 1 }, shielding_words = { id = 338788, duration = 10, max_stack = 1 }, vengeful_shock = { id = 340007, duration = 5, max_stack = 1 }, } ) spec:RegisterGear( "tier31", 207189, 207190, 207191, 207192, 207194 ) spec:RegisterAuras( { sanctification = { -- TODO: Explore reset of stacks when empowered Consecration expires. id = 424616, duration = 20, max_stack = 5 }, sanctification_empower = { id = 424622, duration = 30, max_stack = 1 }, }) -- Tier 30 spec:RegisterGear( "tier30", 202455, 202453, 202452, 202451, 202450 ) spec:RegisterAura( "heartfire", { id = 408399, duration = 5, max_stack = 1 } ) -- Gear Sets spec:RegisterGear( "tier29", 200417, 200419, 200414, 200416, 200418, 217198, 217200, 217196, 217197, 217199 ) spec:RegisterAuras( { ally_of_the_light = { id = 394714, duration = 8, max_stack = 1 }, deflecting_light = { id = 394727, duration = 10, max_stack = 1 } } ) spec:RegisterGear( "tier19", 138350, 138353, 138356, 138359, 138362, 138369 ) spec:RegisterGear( "tier20", 147160, 147162, 147158, 147157, 147159, 147161 ) spec:RegisterAura( "sacred_judgment", { id = 246973, duration = 8, max_stack = 1, } ) spec:RegisterGear( "tier21", 152151, 152153, 152149, 152148, 152150, 152152 ) spec:RegisterGear( "class", 139690, 139691, 139692, 139693, 139694, 139695, 139696, 139697 ) spec:RegisterGear( "breastplate_of_the_golden_valkyr", 137017 ) spec:RegisterGear( "heathcliffs_immortality", 137047 ) spec:RegisterGear( "justice_gaze", 137065 ) spec:RegisterGear( "saruans_resolve", 144275 ) spec:RegisterGear( "tyelca_ferren_marcuss_stature", 137070 ) spec:RegisterGear( "tyrs_hand_of_faith", 137059 ) spec:RegisterGear( "uthers_guard", 137105 ) spec:RegisterGear( "soul_of_the_highlord", 151644 ) spec:RegisterGear( "pillars_of_inmost_light", 151812 ) spec:RegisterStateExpr( "last_consecration", function () return action.consecration.lastCast end ) spec:RegisterStateExpr( "last_blessed_hammer", function () return action.blessed_hammer.lastCast end ) spec:RegisterStateExpr( "last_shield", function () return action.shield_of_the_righteous.lastCast end ) spec:RegisterStateExpr( "consecration", function () return buff.consecration end ) spec:RegisterHook( "reset_precast", function () last_consecration = nil last_blessed_hammer = nil last_shield = nil if buff.divine_resonance.up then state:QueueAuraEvent( "divine_toll", class.abilities.avengers_shield.handler, buff.divine_resonance.expires, "AURA_PERIODIC" ) if buff.divine_resonance.remains > 5 then state:QueueAuraEvent( "divine_toll", class.abilities.avengers_shield.handler, buff.divine_resonance.expires - 5, "AURA_PERIODIC" ) end if buff.divine_resonance.remains > 10 then state:QueueAuraEvent( "divine_toll", class.abilities.avengers_shield.handler, buff.divine_resonance.expires - 10, "AURA_PERIODIC" ) end end if talent.righteous_protector.enabled then local lastAbility = prev.last and class.abilities[ prev.last ] if lastAbility and lastAbility.spendType == "holy_power" and now - ability.lastCast < 1 then applyBuff( "righteous_protector_icd" ) buff.righteous_protector_icd.expires = ability.lastCast + 1 end end end ) spec:RegisterHook( "spend", function( amt, resource ) if amt > 0 and resource == "holy_power" then if talent.righteous_protector.enabled then reduceCooldown( "avenging_wrath", 2 ) reduceCooldown( "guardian_of_ancient_kings", 2 ) applyBuff( "righteous_protector_icd" ) end if talent.fist_of_justice.enabled then reduceCooldown( "hammer_of_justice", talent.fist_of_justice.rank * amt ) end if buff.blessing_of_dawn.up then removeBuff( "blessing_of_dawn" ) applyBuff( "blessing_of_dusk" ) end if talent.relentless_inquisitor.enabled or legendary.relentless_inquisitor.enabled then addStack( "relentless_inquisitor" ) end if talent.resolute_defender.enabled and amt > 2 then reduceCooldown( "ardent_defender", talent.resolute_defender.rank ) reduceCooldown( "divine_shield", talent.resolute_defender.rank ) end if talent.tirions_devotion.enabled then reduceCooldown( "lay_on_hands", amt ) end if legendary.uthers_devotion.enabled then reduceCooldown( "blessing_of_freedom", 1 ) reduceCooldown( "blessing_of_protection", 1 ) reduceCooldown( "blessing_of_sacrifice", 1 ) reduceCooldown( "blessing_of_spellwarding", 1 ) end end end ) -- TODO: Need to count HoPo generators and stack Blessing of Dawn on third cast. spec:RegisterHook( "gain", function( amt, resource, overcap ) if amt > 0 and resource == "holy_power" and buff.blessing_of_dusk.up then applyBuff( "fading_light" ) end end ) -- Abilities spec:RegisterAbilities( { -- Talent: Reduces all damage you take by 20% for 8 sec. While Ardent Defender is active, the next attack that would otherwise kill you will instead bring you to 20% of your maximum health. ardent_defender = { id = 31850, cast = 0, cooldown = function () return ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * 120 end, gcd = "off", school = "physical", talent = "ardent_defender", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "ardent_defender" ) end, }, -- Talent: Hurls your shield at an enemy target, dealing 1,240 Holy damage, interrupting and silencing the non-Player target for 3 sec, and then jumping to 2 additional nearby enemies. Shields you for 8 sec, absorbing 25% as much damage as it dealt. Deals 167 additional damage to all enemies within 5 yards of each target hit. avengers_shield = { id = 31935, cast = 0, cooldown = function() return 15 * ( buff.moment_of_glory.up and 0.25 or 1 ) end, gcd = "spell", talent = "avengers_shield", startsCombat = true, handler = function () applyDebuff( "target", "avengers_shield" ) interrupt() removeStack( "moment_of_glory", nil, 1 ) removeBuff( "shield_of_virtue" ) if talent.barricade_of_faith.enabled then applyBuff( "barricade_of_faith" ) end if talent.bulwark_of_order.enabled then applyBuff( "bulwark_of_order" ) end if talent.crusaders_resolve.enabled then applyDebuff( "target", "crusaders_resolve" ) end if talent.first_avenger.enabled then applyBuff( "first_avenger" ) end if talent.gift_of_the_golden_valkyr.enabled then reduceCooldown( "guardian_of_ancient_kings", 0.5 * talent.gift_of_the_golden_valkyr.rank * min( active_enemies, 3 + ( talent.soaring_shield.enabled and 2 or 0 ) ) ) end if talent.strength_in_adversity.enabled then addStack( "strength_in_adversity", nil, min( active_enemies, 3 + ( talent.soaring_shield.enabled and 2 or 0 ) ) ) end if set_bonus.tier29_2pc > 0 then applyBuff( "ally_of_the_light" ) end if set_bonus.tier30_2pc > 0 then applyDebuff( "target", "heartfire" ) if active_enemies > 1 then active_dot.heartfire = min( active_enemies, active_dot.heartfire + 2 ) end end if conduit.vengeful_shock.enabled then applyDebuff( "target", "vengeful_shock" ) end if legendary.bulwark_of_righteous_fury.enabled then addStack( "bulwark_of_righteous_fury", nil, min( 5, active_enemies ) ) end end, }, -- Talent: Call upon the Light to become an avatar of retribution, causing Judgment to generate 1 additional Holy Power, allowing Hammer of Wrath to be used on any target, increasing your damage, healing and critical strike chance by 20% for 25 sec. avenging_wrath = { id = 31884, flash = { 31884, 389539 }, cast = 0, cooldown = function () return ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * 120 end, gcd = "off", school = "holy", startsCombat = false, toggle = function() return ( talent.sentinel.enabled and defensive_sentinel and "defensives" ) or "cooldowns" end, handler = function () -- Talents: -- Avenging Wrath - 20% damage/healing, use Hammer of Wrath on any target. -- Sanctified Wrath - +5 seconds, Judgment generates +1 HP. -- Avenging Wrath: Might - +20% critical strike. -- Sentinel - Gain 15 stacks of Divine Resolve, decaying every 1 second after 5 seconds. if talent.sentinel.enabled then applyBuff( "sentinel", nil, 15 ) else applyBuff( "avenging_wrath" ) end end, copy = { "sentinel", 389539 } }, -- Talent: Your next 3 casts of Shield of the Righteous or Word of Glory cost no holy power. bastion_of_light = { id = 378974, cast = 0, cooldown = 120, gcd = "off", school = "holy", talent = "bastion_of_light", startsCombat = false, toggle = "cooldowns", handler = function () applyBuff( "bastion_of_light", nil, 3 ) end, }, -- Talent: Throws a Blessed Hammer that spirals outward, dealing 260 Holy damage to enemies and reducing the next damage they deal to you by 626. Generates 1 Holy Power. blessed_hammer = { id = 204019, cast = 0, charges = 3, cooldown = function() return 6 * ( buff.blessing_of_dusk.up and talent.seal_of_order.enabled and 0.9 or 1 ) end, recharge = function() return 6 * ( buff.blessing_of_dusk.up and talent.seal_of_order.enabled and 0.9 or 1 ) end, gcd = "spell", school = "holy", talent = "blessed_hammer", startsCombat = true, handler = function () applyDebuff( "target", "blessed_hammer" ) last_blessed_hammer = query_time gain( 1, "holy_power" ) if set_bonus.tier29_4pc > 0 then applyBuff( "deflecting_light" ) if buff.ally_of_the_light.up then buff.ally_of_the_light.expires = buff.ally_of_the_light.expires + 1 end end end, }, -- Talent: Blesses a party or raid member, granting immunity to movement impairing effects for 8 sec. blessing_of_freedom = { id = 1044, cast = 0, charges = 1, cooldown = 25, recharge = 25, gcd = "spell", school = "holy", spend = 0.07, spendType = "mana", talent = "blessing_of_freedom", startsCombat = false, handler = function () applyBuff( "blessing_of_freedom" ) end, }, -- Talent: Blesses a party or raid member, granting immunity to Physical damage and harmful effects for 10 sec. Cannot be used on a target with Forbearance. Causes Forbearance for 30 sec. Shares a cooldown with Blessing of Spellwarding. blessing_of_protection = { id = 1022, cast = 0, charges = 1, cooldown = function() return ( talent.improved_blessing_of_protection.enabled and 240 or 300 ) * ( 1 - 0.15 * talent.uthers_counsel.rank ) end, recharge = function() return ( talent.improved_blessing_of_protection.enabled and 240 or 300 ) * ( 1 - 0.15 * talent.uthers_counsel.rank ) end, gcd = "spell", school = "holy", spend = 0.15, spendType = "mana", talent = "blessing_of_protection", startsCombat = false, notalent = "blessing_of_spellwarding", nodebuff = "forbearance", toggle = "defensives", handler = function () applyBuff( "blessing_of_protection" ) applyDebuff( "player", "forbearance" ) end, }, -- Talent: Blesses a party or raid member, reducing their damage taken by 30%, but you suffer 100% of damage prevented. Last 12 sec, or until transferred damage would cause you to fall below 20% health. blessing_of_sacrifice = { id = 6940, cast = 0, charges = 1, cooldown = function() return talent.sacrifice_of_the_just.enabled and 60 or 120 end, recharge = 120, gcd = "off", school = "holy", spend = 0.07, spendType = "mana", talent = "blessing_of_sacrifice", startsCombat = false, usable = function() return group, "requires an ally" end, handler = function () active_dot.blessing_of_sacrifice = 1 end, }, -- Talent: Blesses a party or raid member, granting immunity to magical damage and harmful effects for 10 sec. Cannot be used on a target with Forbearance. Causes Forbearance for 30 sec. Shares a cooldown with Blessing of Protection. blessing_of_spellwarding = { id = 204018, cast = 0, charges = 1, cooldown = function() return ( talent.improved_blessing_of_protection.enabled and 240 or 300 ) * ( 1 - 0.15 * talent.uthers_counsel.rank ) end, recharge = function() return ( talent.improved_blessing_of_protection.enabled and 240 or 300 ) * ( 1 - 0.15 * talent.uthers_counsel.rank ) end, gcd = "spell", school = "holy", spend = 0.15, spendType = "mana", talent = "blessing_of_spellwarding", startsCombat = false, nodebuff = "forbearance", handler = function () applyBuff( "blessing_of_spellwarding" ) applyDebuff( "player", "forbearance" ) end, }, -- Talent: Cleanses a friendly target, removing all Poison and Disease effects. cleanse_toxins = { id = 213644, cast = 0, cooldown = 8, gcd = "spell", school = "holy", spend = 0.10, spendType = "mana", talent = "cleanse_toxins", startsCombat = false, toggle = "interrupts", usable = function () return buff.dispellable_poison.up or buff.dispellable_disease.up, "requires poison or disease" end, handler = function () removeBuff( "dispellable_poison" ) removeBuff( "dispellable_disease" ) end, }, -- Interrupt and Silence effects on party and raid members within 40 yards are 30% shorter. concentration_aura = { id = 317920, cast = 0, cooldown = 0, gcd = "spell", school = "holy", talent = "auras_of_the_resolute", startsCombat = false, nobuff = "paladin_aura", handler = function () applyBuff( "concentration_aura" ) end, }, -- Consecrates the land beneath you, causing 1,952 Holy damage over 12 sec to enemies who enter the area. Limit 1. consecration = { id = 26573, cast = 0, cooldown = 9, gcd = "spell", school = "holy", startsCombat = true, handler = function () applyBuff( "consecration" ) applyDebuff( "target", "consecration_dot" ) last_consecration = query_time end, }, -- Increases mounted speed by 20% for all party and raid members within 40 yards. crusader_aura = { id = 32223, cast = 0, cooldown = 0, gcd = "spell", school = "holy", talent = "auras_of_swift_vengeance", startsCombat = false, nobuff = "paladin_aura", handler = function () applyBuff( "crusader_aura" ) end, }, -- Strike the target for $ Physical damage.$?a196926[ Reduces the cooldown of Holy Shock by ${$196926m1/-1000}.1 sec.][] |cFFFFFFFFGenerates $s2 Holy Power. crusader_strike = { id = 35395, cast = 0, charges = function() return talent.improved_crusader_strike.enabled and 2 or nil end, cooldown = function () return 6 * ( talent.seal_of_order.enabled and buff.blessing_of_dusk.up and 0.9 or 1 ) * ( talent.fires_of_justice.enabled and 0.85 or 1 ) * haste end, recharge = function () return talent.improved_crusader_strike.enabled and ( 6 * ( talent.seal_of_order.enabled and buff.blessing_of_dusk.up and 0.9 or 1 ) * ( talent.fires_of_justice.enabled and 0.85 or 1 ) * haste ) or nil end, gcd = "spell", school = "physical", spend = 0.11, spendType = "mana", notalent = function() return talent.blessed_hammer.enabled and "blessed_hammer" or "hammer_of_the_righteous" end, startsCombat = true, handler = function () gain( 1, "holy_power" ) if talent.crusaders_might.enabled then reduceCooldown( "holy_shock", 1 ) end if set_bonus.tier29_4pc > 0 then applyBuff( "deflecting_light" ) if buff.ally_of_the_light.up then buff.ally_of_the_light.expires = buff.ally_of_the_light.expires + 1 end end end, }, -- Party and raid members within 40 yards are bolstered by their devotion, reducing damage taken by 3%. devotion_aura = { id = 465, cast = 0, cooldown = 0, gcd = "spell", school = "holy", talent = "auras_of_the_resolute", startsCombat = false, nobuff = "paladin_aura", handler = function () applyBuff( "devotion_aura" ) end, }, -- Grants immunity to all damage and harmful effects for 8 sec. Cannot be used if you have Forbearance. Causes Forbearance for 30 sec. divine_shield = { id = 642, cast = 0, cooldown = function () return 300 * ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * ( 1 - 0.15 * talent.uthers_counsel.rank ) end, gcd = "spell", school = "holy", startsCombat = false, toggle = "defensives", nodebuff = "forbearance", handler = function () applyBuff( "divine_shield" ) applyDebuff( "player", "forbearance" ) if talent.final_stand.enabled then applyDebuff( "target", "final_stand" ) active_dot.final_stand = min( active_dot.final_stand, active_enemies ) end end, }, -- Talent: Releases a blinding flash from your shield, causing 1,342 Holy damage to all nearby enemies within 8 yds and reducing all damage they deal to you by 25% for 9 sec. eye_of_tyr = { id = 387174, cast = 0, cooldown = function() return talent.inmost_light.enabled and 45 or 60 end, gcd = "spell", school = "holy", talent = "eye_of_tyr", startsCombat = true, toggle = "defensives", handler = function () applyDebuff( "target", "eye_of_tyr" ) active_dot.eye_of_tyr = active_enemies end, }, -- Expends a large amount of mana to quickly heal a friendly target for 6,713. flash_of_light = { id = 19750, cast = 1.5, cooldown = 0, gcd = "spell", school = "holy", spend = 0.10, spendType = "mana", startsCombat = false, handler = function () gain( 1.67 * 1.68 * ( 1 + stat.versatility_atk_mod ) * stat.spell_power, "health" ) end, }, -- Talent: Empowers you with the spirit of ancient kings, reducing all damage you take by 50% for 8 sec. guardian_of_ancient_kings = { id = function () return IsSpellKnownOrOverridesKnown( 212641 ) and 212641 or 86659 end, cast = 0, cooldown = function () return 300 - ( conduit.royal_decree.mod * 0.001 ) end, gcd = "off", school = "holy", talent = "guardian_of_ancient_kings", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "guardian_of_ancient_kings" ) if conduit.royal_decree.enabled then applyBuff( "royal_decree" ) end end, copy = { 86659, 212641 } }, -- Empowers the friendly target with the spirit of the forgotten queen, causing the target to be immune to all damage for 10 sec. guardian_of_the_forgotten_queen = { id = 228049, cast = 0, cooldown = 180, gcd = "spell", school = "holy", pvptalent = "guardian_of_the_forgotten_queen", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "guardian_of_the_forgotten_queen" ) end, }, -- Stuns the target for 6 sec. hammer_of_justice = { id = 853, cast = 0, cooldown = 60, gcd = "spell", school = "holy", spend = 0.035, spendType = "mana", startsCombat = false, handler = function () applyDebuff( "target", "hammer_of_justice" ) end, }, -- Talent: Hammers the current target for 1,302 Physical damage. While you are standing in your Consecration, Hammer of the Righteous also causes a wave of light that hits all other targets within 8 yds for 226 Holy damage. Generates 1 Holy Power. hammer_of_the_righteous = { id = 53595, cast = 0, charges = 2, cooldown = function() return 6 * ( buff.blessing_of_dusk.up and talent.seal_of_order.enabled and 0.9 or 1 ) end, recharge = function() return 6 * ( buff.blessing_of_dusk.up and talent.seal_of_order.enabled and 0.9 or 1 ) end, gcd = "spell", school = "physical", talent = "hammer_of_the_righteous", startsCombat = true, notalent = "blessed_hammer", handler = function () gain( 1, "holy_power" ) if set_bonus.tier29_4pc > 0 then applyBuff( "deflecting_light" ) if buff.ally_of_the_light.up then buff.ally_of_the_light.expires = buff.ally_of_the_light.expires + 1 end end end, }, -- Talent: Hurls a divine hammer that strikes an enemy for 2,840 Holy damage. Only usable on enemies that have less than 20% health, or during Avenging Wrath. Generates 1 Holy Power. hammer_of_wrath = { id = 24275, cast = 0, charges = 1, cooldown = function() return 7.5 * ( buff.blessing_of_dusk.up and talent.seal_of_order.enabled and 0.9 or 1 ) end, recharge = function() return 7.5 * ( buff.blessing_of_dusk.up and talent.seal_of_order.enabled and 0.9 or 1 ) end, gcd = "spell", school = "holy", talent = "hammer_of_wrath", startsCombat = false, usable = function () return target.health_pct < 20 or ( level > 57 and ( buff.avenging_wrath.up or buff.sentinel.up ) and talent.avenging_wrath.enabled ) or buff.hammer_of_wrath_hallow.up or buff.negative_energy_token_proc.up, "requires low health, avenging_wrath, or ashen_hallow" end, handler = function () gain( 1, "holy_power" ) if talent.zealots_paragon.enabled then if buff.avenging_wrath.up then buff.avenging_wrath.expires = buff.avenging_wrath.expires + 0.5 end if buff.sentinel.up then buff.sentinel.expires = buff.sentinel.expires + 0.5 end end if legendary.the_mad_paragon.enabled then if buff.avenging_wrath.up then buff.avenging_wrath.expires = buff.avenging_wrath.expires + 1 end if buff.crusade.up then buff.crusade.expires = buff.crusade.expires + 1 end end end, }, hand_of_hindrance = { id = 183218, cast = 0, cooldown = 30, gcd = "spell", spend = 0.1, spendType = "mana", talent = "hand_of_hindrance", startsCombat = true, texture = 1360760, handler = function () applyDebuff( "target", "hand_of_hindrance" ) end, }, -- Commands the attention of an enemy target, forcing them to attack you. hand_of_reckoning = { id = 62124, cast = 0, charges = 1, cooldown = 8, recharge = 8, gcd = "off", school = "holy", spend = 0.03, spendType = "mana", startsCombat = true, handler = function () applyDebuff( "target", "hand_of_reckoning" ) end, }, --[[ Talent: Your Holy Power generation is tripled for 20 sec. holy_avenger = { id = 105809, cast = 0, cooldown = 180, gcd = "off", school = "physical", talent = "holy_avenger", startsCombat = false, toggle = "cooldowns", handler = function () applyBuff( "holy_avenger" ) end, }, ]] -- Judges the target, dealing 2,824 Holy damage, and causing them to take 20% increased damage from your next Holy Power ability. Generates 1 Holy Power. judgment = { id = 275779, cast = 0, charges = function () return talent.crusaders_judgment.enabled and 2 or nil end, cooldown = function() return ( 6 - ( 0.5 * talent.seal_of_alacrity.rank ) ) * ( buff.blessing_of_dusk.up and talent.seal_of_order.enabled and 0.9 or 1 ) end, recharge = function () return talent.crusaders_judgment.enabled and ( 6 - ( 0.5 * talent.seal_of_alacrity.rank ) * ( buff.blessing_of_dusk.up and talent.seal_of_order.enabled and 0.9 or 1 ) ) or nil end, gcd = "spell", school = "holy", spend = 0.03, spendType = "mana", startsCombat = true, aura = "judgment", handler = function () if talent.greater_judgment.enabled then applyDebuff( "target", "judgment" ) end removeBuff( "recompense" ) gain( ( 1 ) + ( ( buff.avenging_wrath.up or buff.sentinel.up ) and talent.sanctified_wrath.enabled and 1 or 0 ), "holy_power" ) if talent.judgment_of_light.enabled then applyDebuff( "target", "judgment_of_light", nil, 5 ) end end, }, -- Talent: Heals a friendly target for an amount equal to 100% your maximum health. Cannot be used on a target with Forbearance. Causes Forbearance for 30 sec. lay_on_hands = { id = 633, cast = 0, cooldown = function () return 600 * ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * ( 1 - 0.15 * talent.uthers_counsel.rank ) end, gcd = "off", school = "holy", talent = "lay_on_hands", startsCombat = false, toggle = "defensives", nodebuff = "forbearance", handler = function () gain( health.max, "health" ) applyDebuff( "player", "forbearance" ) if azerite.empyreal_ward.enabled then applyBuff( "empyrael_ward" ) end end, }, -- Talent: For the next 15 sec, you generate an absorb shield for 20% of all damage you deal, and Avenger's Shield damage is increased by 20% and its cooldown is reduced by 75%. moment_of_glory = { id = 327193, cast = 0, cooldown = 90, gcd = "off", school = "holy", talent = "moment_of_glory", startsCombat = false, toggle = "cooldowns", handler = function () setCooldown( "avengers_shield", 0 ) applyBuff( "moment_of_glory" ) end, }, -- Talent: Interrupts spellcasting and prevents any spell in that school from being cast for 4 sec. rebuke = { id = 96231, cast = 0, cooldown = 15, gcd = "off", school = "physical", talent = "rebuke", startsCombat = true, toggle = "interrupts", debuff = "casting", readyTime = state.timeToInterrupt, handler = function () interrupt() if talent.punishment.enabled then class.abilities.judgment.handler() end end, }, -- When any party or raid member within 40 yards dies, you gain Avenging Wrath for 12 sec. When any party or raid member within 40 yards takes more than 50% of their health in damage, you gain Seraphim for 4 sec. This cannot occur more than once every 30 sec. retribution_aura = { id = 183435, cast = 0, cooldown = 0, gcd = "spell", school = "physical", talent = "auras_of_swift_vengeance", startsCombat = false, nobuff = "paladin_aura", handler = function () applyBuff( "retribution_aura" ) end, }, -- Slams enemies in front of you with your shield, causing $s1 Holy damage, and increasing your Armor by $?c1[${$132403s1*$INT/100}][${$132403s1*$STR/100}] for $132403d.$?a386568[ $@spelldesc386568][]$?a280373[ $@spelldesc280373][] shield_of_the_righteous = { id = 53600, cast = 0, cooldown = 1, gcd = "off", school = "holy", spend = function () if buff.bastion_of_light.up or buff.divine_purpose.up then return 0 end return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end, spendType = "holy_power", startsCombat = true, usable = function() return equipped.shield, "requires a shield" end, handler = function () removeStack( "bastion_of_light" ) removeBuff( "bulwark_of_righteous_fury" ) removeBuff( "divine_purpose" ) removeBuff( "the_magistrates_judgment" ) removeDebuff( "target", "judgment" ) if talent.faiths_armor.enabled then applyBuff( "faiths_armor" ) end if talent.redoubt.enabled then addStack( "redoubt", nil, 3 ) end if buff.shining_light_full.up then removeBuff( "shining_light_full" ) elseif talent.shining_light.enabled then addStack( "shining_light", nil, 1 ) if buff.shining_light.stack == 3 then applyBuff( "shining_light_full" ) removeBuff( "shining_light" ) end end applyBuff( "shield_of_the_righteous", buff.shield_of_the_righteous.remains + 4.5 ) last_shield = query_time end, }, shield_of_virtue = { id = 215652, cast = 0, cooldown = 45, gcd = "off", pvptalent = "shield_of_virtue", startsCombat = false, texture = 237452, handler = function () applyBuff( "shield_of_virtue" ) end, }, -- Calls down the Light to heal a friendly target for 7,531 and an additional 313 over 15 sec. Protection: Healing increased by up to 250% based on the target's missing health. word_of_glory = { id = 85673, cast = 0, cooldown = 0, gcd = "spell", school = "holy", spend = function () if buff.divine_purpose.up or buff.shining_light_full.up or buff.royal_decree.up or buff.bastion_of_light.up then return 0 end return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end, spendType = "holy_power", startsCombat = false, handler = function () spend( 0.1 * mana.max, "mana" ) if buff.royal_decree.up then removeBuff( "royal_decree" ) elseif buff.divine_purpose.up then removeBuff( "divine_purpose" ) elseif buff.bastion_of_light.up then removeStack( "bastion_of_light" ) else removeBuff( "shining_light_full" ) end removeBuff( "the_magistrates_judgment" ) gain( 2.9 * stat.spell_power * ( 1 + stat.versatility_atk_mod ), "health" ) removeBuff( "recompense" ) if buff.vanquishers_hammer.up then applyBuff( "shield_of_the_righteous" ) removeStack( "vanquishers_hammer" ) end if talent.faith_in_the_light.enabled then applyBuff( "faith_in_the_light" ) end if talent.light_of_the_titans.enabled then applyBuff( "light_of_the_titans" ) end if conduit.shielding_words.enabled then applyBuff( "shielding_words" ) end end, }, } ) spec:RegisterSetting( "wog_health", 40, { name = "|T133192:0|t Word of Glory Health Threshold", desc = "When set above zero, the addon may recommend |T133192:0|t Word of Glory when your health falls below this percentage.", type = "range", min = 0, max = 100, step = 1, width = "full", } ) spec:RegisterStateExpr( "wog_health", function () return settings.wog_health or 0 end ) spec:RegisterSetting( "goak_damage", 40, { name = "|T135919:0|t Guardian of Ancient Kings Damage Threshold", desc = function() return "When set above zero, the addon may recommend |T135919:0|t " .. ( GetSpellInfo( class.abilities.guardian_of_ancient_kings.id ) or "Guardian of Ancient Kings" ) .. " when you take this percentage of your maximum health in damage in the past 5 seconds.\n\n" .. "By default, your Defensives toggle must also be enabled." end, type = "range", min = 0, max = 100, step = 1, width = "full", } ) spec:RegisterStateExpr( "goak_damage", function () return ( settings.goak_damage or 0 ) * health.max * 0.01 end ) spec:RegisterSetting( "ds_damage", 60, { name = "|T524354:0|t Divine Shield Damage Threshold", desc = function() return "When set above zero, the addon may recommend |T524354:0|t " .. ( GetSpellInfo( class.abilities.divine_shield.id ) or "Divine Shield" ) .. " when you take this percentage of your maximum health in damage in the past 5 seconds.\n\n" .. "By default, your Defensives toggle must also be enabled." end, type = "range", min = 0, max = 100, step = 1, width = "full", } ) spec:RegisterStateExpr( "ds_damage", function () return ( settings.ds_damage or 0 ) * health.max * 0.01 end ) spec:RegisterSetting( "sentinel_def", false, { name = strformat( "%s: Use Defensively", Hekili:GetSpellLinkWithTexture( 389539 ) ), desc = function() return strformat( "When enabled, %s is placed on the Defensives toggle by default (rather than Cooldowns) and is recommended based on your Guardian of Ancient Kings " .. "Damage Threshold setting.", Hekili:GetSpellLinkWithTexture( 389539 ) ) end, type = "toggle", width = "full", } ) spec:RegisterStateExpr( "defensive_sentinel", function() if settings.sentinel_def ~= nil then return settings.sentinel_def end return false end ) spec:RegisterRanges( "shield_of_the_righteous", "rebuke", "avengers_shield" ) spec:RegisterOptions( { enabled = true, aoe = 3, cycle = false, nameplates = true, nameplateRange = 10, rangeFilter = false, damage = true, damageExpiration = 8, potion = "phantom_fire", package = "Protection Paladin", } ) spec:RegisterPack( "Protection Paladin", 20240508, [[Hekili:TVXFVTTTYplbdWXglv1sooTDVydS2U9wlg2kw6EV)ZY0s02CrwsprPKyGa9z)DhP(fLiLTtt3Bd49pnjIhpE)M3D86c7fFEXn(Ku6IFXzSZLJNo(1w2otEJTZIBs3htxCtmX7wYg4xcj7G)9tjrPuVuwuy(Yprci(SqeM9breFex8OSepaUTPPX8V7LVCdlDB2klVODVKZ2LfqWT6LqwNI)T3lxCZQmwq6hcxSspHyV4gsw62OKf3CdB37amZ89PsWPCVf3GG)IXtFX4x)D5lrqYxMfJyYk)J5FuUQ9lCMcR(7CkacnmLfsdYxsc9Zx(93rd3Wc3KV8FNqs3MVCxucaflmLM4TLeUHswfSxfx2aUYx(57PKBZxMMWcVLMYvaXESaKV3ZJY5SvbagtJ2Sb)56OefIGNV0NUMgYz3bRI0afaifo68LrRRw4DVV8aM8cB4aMKVCq(shhjt3MNfWmEQGi(ej1d4l7Xwo1lp(kPijF5pSNIheWp7HZL4)hz8ukiywr44pqf9hc3fXtZx(ZSnBtvXXLcC8Xm)n7awcidoySKV8EgkkFBwW9KKBLO)3WntJYa(9hZs2)pQKC5ldI2W86YcGsTa))UyLcc4CE9bEr(Y3ZUdKKa5hfeCrB2rqonWOZlCELeJctHO0FRIwjCPvnUxX50a3FkljoItHVGkVjFB(YFkkyp89O7rLftL9k8rqqzWFggbSykjaixHaT4ZrzPCMpAQLc)1hAQFhJYwbz(UTuVBlSz(v4uEFg)2cd33tUhO2vzRxdBFfDTWSLhtd9fwZzCXpKSibOaWG5DFs5mSFtdHRFXPaMjJTELcCf27)AumhKaVnamPrW)jYUDi3dYTaWqM(aJx7fi34vnoaGkxNeTtyUweh4DyCG8Ldf(G0euXcU30a)k7ibj5edghFMHNLZBUOKNqHoi1KcZv7JjivnYAXnbiDiIRrxtYcsHF9xeX5OHGRm1FXBLHosyXirS4MF4bQxMqcqVJMaQ1u2o0HDl8pKA9i5oclaXaCgep5wtORYULUifIAHNq5N9cOKqo1nn6bwiV5jdqoPfTuTjsqGR8pCrEqYjUY4UErrb(r3didWWLpfmSJLY2ie7ikM(uqrzOoebx9uqapfmDjj(acGfItOW9cRiA1qG6bIaZi4feRxBflVRXLKLqSqbr9j6tVlsCC4ADufbOFj39pkcyOtxuckjXJeIkTKKUqEPI(nc0UWTyY)QjCPkc6E5lqwCRWhDG0n2IlS9DJw7cMEUjLbueSRaQH5l3cXDCJXWowG5nZJb(pZYxooF5JpwGgFrql3yzmlRS48LJQjDdhsLCtlPULscs3Af7bN21qeZOnUYp9LrwvRbeviikCfkl31j0oK99rjcIEtquYEDErnLRyOwR1SqsGRWIZQaob12uSZcbdq8G9j7G4nUtb385W9X8Ipia6mbhkOtW0fqTR4(AFGxvyInzWYmsisMKqpgcjEsCvWkKds9G6sXc742SUYg05(R3KYaVTjIC7FL4oJ4vxuQAoTkLjxEvQuhNY9VAcasrcOU3J5(Pl06FR1VTouK)E1XgNXEAJ44K9UqmEiTyFUmoB1TrAIYgfdr6OP1B)ocCaWQ4VfKb)WwrUkrLvQT1wc3T8YwPjL6AqaLuls4Ex)yEz0VZAaLJgOqrud0uIEl)m5viGIBMck0aXijA6EuLWk4r1lQD57d9C5brP6cVFyzKJwzKtpYiDCFxzKojPImsRey(HeIAer2NMiYuQzfaRyZa8uPaZQdYe3(zxY7sVV7Rcvv73eXLcO1Il(sO7iq(IGTpS7lhxXrh(OC0BkwjKsOe)9vIhT0ZOMcW(ooW5g)fEdXsp5KwaJZPj6C(Zt0zR3c9phrNt1TCLYRmOSbqoTJ3jVYQKNpC2YCicEkdYdt4zyb7eRICwz2wQRUJ8GRacd53Qj0XHsMuT(kzT2ff2HLxlQSQrbZeppi9oXfBPr6lL(CznYxGSGOndIcNX2NqIL1cYengGGvzsHfJtIGQgh(2SnBWe)e9Zrs2xGeawqhBtiu0SeXJSGkQJcpVjUVFlnu2aeqebCGIyd(BuMb7E4)su0yi9byp)tSI07ffedQy4SHIhFxdPjC4CGfVh7rcbByIqwSkke5w512JA5QmSY6uMyBLy2nUu6uNGlAewB62fsxMNVvLZImf9rcpG6u4fHADQSPf2mRKThbv1IK01MvGsjhnCR0z1PM)Vw71RpG9k6p1tqBISRc8YmN1yuQPXdy)4(rwc2URpLWIafX(slbrFiqks2pGDmo2JfRwQl4kvxH(0kLrtCEJRyBiRwVI)6lLFUJucQEEFP)KgbD3LRd8b5(b6wQSzgfYgtrLRlhUM25XuO09usYgSBMgCTf2gtQRzDLSfFiC1wBRZs2xQeXmBM0Xadi2jWzV3lGwEIyqTEAmrdkU9UAWd6n2CP7K1MIYYbTvrtSrDHoZJ62Ak7r4wGdrQpUYWad8G(YHu05ddEHTZ23uWIQS7l5QTIEOHspz2)Q9CODIY9P982IceUuG7inzwNbk0eQCjxzxTW7hr7eWlsVc41gVAr1aPL7vzqJkt1DrijwvZoi7n7Ach7BmESsVJecZ3LEhgaK47ZTKTBuEETxJjZw0ESU6OtJccWd0ESsVFAhSqrryBF8knBtxw2JfmUnZn04mmKE9viLwXMJTEK33xLYIo)bfrx78bS7RfeIlPyINmOigvZ2VOvxH5SnTii5rgfAMicsjbs3tfaTxuGPTsgvRKnS2vQ2ARTm4o2kFg198kLEbMKXjqLTGmnHDlTnSMDNQVr)Kfwxn(zuyz2ZtA9OR3Clm3yoNXMlVx9gGPn7sGsRxr0yof3dgK3OHl67v1iDnPr)LN6WAzQd13qu(YmqHUqwNykU0aXljHxDK68MI0kWekO)NmwCm1xjJczuBzIAsN(tlbdDPVBkKERELRCxYtle8RMQF5M6O2DOpTDB5vBqMQ)L5arN14DvRkxZiw7TzJAk6RgrY2ETO3(2PRq2MjUzpTQAvP(U42lLS57UZ517Sckv(QdSvjCQUHAB96DmObqLkh9R26cXAGgPClsRmc0LHZPNnQAOTw3XBo4RX(kuesU67ndh3JQatRAY46gqDmyXKQsIRgxG1Q2R(txYSHgyc86AScrQORcIIKpghez8oWiaxroag2oq4zi1(qrV4V5ZyzQmicBsAXRYEEz)xphCVXqxji)XJqZxswA0o5JklNHc8DH)zXtPJVLmuqmCyILlXILAN6oxMm95gAKhS8q7hgDKiTzJgnG4wGCuiVBVo7GCTGCuixtdo1q66G5Rk6piI105wnsLNmD)ur)rG4En)6SSc168Nps)cn7mH8NfhgZu(tt59vg9heXpvNLJKUFQO)iq8xqi1jhwkl6mEFI4sa(kH4kuE5HLS6rPgauO1NpelMlknxIwc2jEl6RBtyQ5Burp6tdPnB(CHT8p(bbZHi5kXStXWEFfumyyIK68G8KVcN9NO1m8PgLaXTQggOVD2lvMONlyRNjFF52Jau(h1T52fXOfi16n1dtZAhrE7BYxEYtkwfMNjNuSQ)gXVYqIPSsRzO6c8jlNvzQCyqRhbPddBHn7rG1YhGQqy8vVm4A1sfRJQo16vqZdulmB8GH6Qm(Xh7uv8i9iULHdI4ElpE(mNhF8m9ff)4JDliE(RM29ZqzhM5YQAd0dtPJisPNPzGy0Ujz5QvovTkbs7wAv3gU3HMQY4ABGjhIkK52JF8XQOGTHBocx1Q6RecGz0GHQa1Tq1bva0Ui16vmuG6idwcnQISRvGHsrNpBIEK1U6ndI(hFSv41bgLDxpBciApZi86LM4Ua)2VPmUSkvYcVl6wQl9bOksCU5qku61lAQMllCDg)unCQkXu7Uk1YVgJNuU96ixZmiOfo8Y5GAqzdkno2Kdg2DYeNbcp9VA5iD0bWhk94ep)65u666zH80oRIVRT7QMOdLHVskhmnQJdkfrDhtS5vJ34GZk8J7myyfuxFdfMkJvnqyfFUAyWmXlgrDt9RgIVX8T9)sYVzS3UHE7t6)xegO1z(3dPEZHaSLFO90MHrktvPvACvXH09GzAxP(XYQs55)pjlKId)GtYIwfspX1hoC4zhEkxAK4WbMWLzJhnOoO8CNrfgAAMMfJ3jmy4z6mmQJGRXu66EnLgDW0NpTbqrRuwtAYhD(XLSSUHrPGRnoikx3yiu0R)RsWw5zWNzF8PAnrEX)bM9eiJSgk)RNul1F2NRJtMp1zs14bmhO9f51DiTYS9KjKIXgrult3Xf56zfJkYXAI17iIm3PW4P7OHOf)TsdF4PuRL9y9gFTNALNBz6rDf0zTgNddHyoIBLGYa0zQON3RF3)g5oQB2dgOrGo7sOGTJZ9SzLqnoE15W4asE1N5tRqvDUloco(StLLVA8xil3PWbZ58R3AvPnvImEQdOn94S16pstZKMk7eeGLYHywPfr1tY8fI)dciJGOVBZdm)IcG1U53Yakd2CBXNpRNE9pcljw7dV8fWHon5qh9CyxMObh2L9R5qnmX8E4(MmO9HzWQbj)cXiNxYfcD2qZdP(m7bDBUJ4A)ioFGYW2F9SlhdevFiZrrzR2tCGD0CqJq20mghDk8QZH4vNNtE1wrT)1NxfVA)I)l]] )