-- PaladinProtection.lua -- August 2025 -- Patch 11.2 if UnitClassBase( "player" ) ~= "PALADIN" then return end local addon, ns = ... local Hekili = _G[ addon ] local class, state = Hekili.Class, Hekili.State local spec = Hekili:NewSpecialization( 66 ) ---- Local function declarations for increased performance -- Strings local strformat = string.format -- Tables local insert, remove, sort, wipe = table.insert, table.remove, table.sort, table.wipe -- Math local abs, ceil, floor, max, sqrt = math.abs, math.ceil, math.floor, math.max, math.sqrt -- Common WoW APIs, comment out unneeded per-spec -- local GetSpellCastCount = C_Spell.GetSpellCastCount -- local GetSpellInfo = C_Spell.GetSpellInfo -- local GetSpellInfo = ns.GetUnpackedSpellInfo local GetPlayerAuraBySpellID = C_UnitAuras.GetPlayerAuraBySpellID -- local FindUnitBuffByID, FindUnitDebuffByID = ns.FindUnitBuffByID, ns.FindUnitDebuffByID -- local IsSpellOverlayed = C_SpellActivationOverlay.IsSpellOverlayed local IsSpellKnownOrOverridesKnown = C_SpellBook.IsSpellInSpellBook -- local IsActiveSpell = ns.IsActiveSpell -- Specialization-specific local functions (if any) local QueenGlyphed = IsSpellKnownOrOverridesKnown local spellwardingFilters = {} for zoneID, zoneData in pairs( class.spellFilters ) do for npcID, npcData in pairs( zoneData ) do if npcID ~= "name" then for spellID, spellData in pairs( npcData ) do if spellID ~= "name" and spellData.spell_reflection then spellwardingFilters[ spellID ] = true end end end end end class.spellwardingFilters = spellwardingFilters spec:RegisterResource( Enum.PowerType.HolyPower ) spec:RegisterResource( Enum.PowerType.Mana ) -- Talents spec:RegisterTalents( { -- Paladin a_just_reward = { 103858, 469411, 1 }, -- After Cleanse Toxins successfully removes an effect from an ally, they are healed for $s1 afterimage = { 93188, 385414, 1 }, -- After you spend $s1 Holy Power, your next Word of Glory echoes onto a nearby ally at $s2% effectiveness auras_of_the_resolute = { 81600, 385633, 1 }, -- Learn Concentration Aura, Devotion Aura, and Crusader Aura: Concentration Aura: Interrupt and Silence effects on party and raid members within $s3 yds are $s4% shorter. Devotion Aura: Party and raid members within $s7 yds are bolstered by their devotion, reducing damage taken by $s8%. Crusader Aura: Increases mounted speed by $s11% for all party and raid members within $s12 yds blessed_calling = { 103868, 469770, 1 }, -- Allies affected by your Blessings have $s1% increased movement speed blessing_of_freedom = { 81631, 1044, 1 }, -- Blesses a party or raid member, granting immunity to movement impairing effects for $s1 sec blessing_of_protection = { 81616, 1022, 1 }, -- Blesses a party or raid member, granting immunity to Physical damage and harmful effects for $s1 sec. Cannot be used on a target with Forbearance. Causes Forbearance for $s2 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 $s1%, but you suffer $s2% of damage prevented. Last $s3 sec, or until transferred damage would cause you to fall below $s4% health blinding_light = { 81598, 115750, 1 }, -- Emits dazzling light in all directions, blinding enemies within $s1 yds, causing them to wander disoriented for $s2 sec. Damage may cancel the effect cavalier = { 81605, 230332, 1 }, -- Divine Steed now has $s1 charges cleanse_toxins = { 81507, 213644, 1 }, -- Cleanses a friendly target, removing all Poison and Disease effects consecrated_ground = { 81543, 204054, 1 }, -- Your Consecration is $s1% larger, and enemies within it have $s2% reduced movement speed divine_purpose = { 93192, 223817, 1 }, -- Holy Power spending abilities have a $s1% chance to make your next Holy Power spending ability free and deal $s2% increased damage and healing divine_reach = { 93168, 469476, 1 }, -- The radius of your auras is increased by $s1 yds divine_resonance = { 81479, 386738, 1 }, -- After casting Divine Toll, you instantly cast Avenger's Shield every $s1 sec for $s2 sec divine_spurs = { 103857, 469409, 1 }, -- Divine Steed's cooldown is reduced by $s1%, but its duration is reduced by $s2% divine_steed = { 81632, 190784, 1 }, -- Leap atop your Charger for $s1 sec, increasing movement speed by $s2%. Usable while indoors or in combat divine_toll = { 81496, 375576, 1 }, -- Instantly cast Avenger's Shield on up to $s1 targets within $s2 yds. Generates $s3 Holy Power per target hit empyreal_ward = { 103859, 387791, 1 }, -- Lay on Hands grants the target $s1% increased armor for $s2 sec and now ignores healing reduction effects eye_for_an_eye = { 81628, 469309, 1 }, -- Melee and ranged attackers receive $s$s2 Holy damage each time they strike you during Ardent Defender and Divine Shield faiths_armor = { 81495, 406101, 1 }, -- Shield of the Righteous grants $s1% bonus armor for $s2 sec fist_of_justice = { 81602, 234299, 1 }, -- Hammer of Justice's cooldown is reduced by $s1 sec golden_path = { 103856, 377128, 1 }, -- Consecration heals you and $s1 allies within it for $s2 every $s3 sec greater_judgment = { 81603, 231663, 1 }, -- Judgment causes the target to take $s1% increased damage from your next Holy Power ability. Multiple applications may overlap hammer_of_wrath = { 81510, 24275, 1 }, -- Hurls a divine hammer that strikes an enemy for $s$s2 Holy damage. Only usable on enemies that have less than $s3% health, or during Avenging Wrath. Generates $s4 Holy Power holy_aegis = { 81609, 385515, 1 }, -- Armor and critical strike chance increased by $s1% holy_reprieve = { 103860, 469445, 1 }, -- Your Forbearance's duration is reduced by $s1 sec holy_ritual = { 103866, 199422, 1 }, -- Allies are healed for $s1 when you cast a Blessing spell on them and healed again for $s2 when the blessing ends improved_blessing_of_protection = { 81617, 384909, 1 }, -- Reduces the cooldown of Blessing of Protection and Blessing of Spellwarding by $s1 sec inspired_guard = { 103864, 469439, 1 }, -- Ardent Defender increases healing taken by $s1% for its duration judgment_of_light = { 81608, 183778, 1 }, -- Judgment causes the next $s1 successful attacks against the target to heal the attacker for $s2 lay_on_hands = { 81597, 633, 1 }, -- Heals a friendly target for an amount equal to $s1% your maximum health. Grants the target $s2% increased armor for $s3 sec. Cannot be used on a target with Forbearance. Causes Forbearance for $s4 sec lead_the_charge = { 103867, 469780, 1 }, -- Divine Steed reduces the cooldown of $s1 nearby ally's major movement ability by $s2 sec. Your movement speed is increased by $s3% lightbearer = { 103861, 469416, 1 }, -- $s1% of all healing done to you from other sources heals up to $s2 nearby allies, divided evenly among them lightforged_blessing = { 103850, 406468, 1 }, -- Shield of the Righteous heals you and up to $s1 nearby allies for $s2% of maximum health lights_countenance = { 103854, 469325, 1 }, -- The cooldowns of Repentance and Blinding Light are reduced by $s1 sec lights_revocation = { 103863, 146956, 1 }, -- Removing harmful effects with Divine Shield heals you for $s1% for each effect removed. This heal cannot exceed $s2% of your maximum health. Divine Shield may now be cast while Forbearance is active obduracy = { 81630, 385427, 1 }, -- Speed increased by $s1% and damage taken from area of effect attacks reduced by $s2% of_dusk_and_dawn = { 93356, 409441, 1 }, -- When you cast $s1 Holy Power generating abilities, you gain Blessing of Dawn. When you consume Blessing of Dawn, you gain Blessing of Dusk. Blessing of Dawn Your next Holy Power spending ability deals $s4% additional increased damage and healing. This effect stacks. Blessing of Dusk Damage taken reduced by $s7% For $s8 sec punishment = { 93165, 403530, 1 }, -- Successfully interrupting an enemy with Rebuke or Avenger's Shield casts an extra Hammer of the Righteous quickened_invocation = { 81479, 379391, 1 }, -- Divine Toll's cooldown is reduced by $s1 sec rebuke = { 81604, 96231, 1 }, -- Interrupts spellcasting and prevents any spell in that school from being cast for $s1 sec recompense = { 81607, 384914, 1 }, -- After your Blessing of Sacrifice ends, $s1% 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 $s2% of your maximum health and its bonus healing cannot exceed $s3% of your maximum health repentance = { 81598, 20066, 1 }, -- Forces an enemy target to meditate, incapacitating them for $s1 min. Damage may cancel the effect. Usable against Humanoids, Demons, Undead, Dragonkin, and Giants righteous_protection = { 103865, 469321, 1 }, -- Blessing of Sacrifice now removes and prevents all Poison and Disease effects sacred_strength = { 93192, 469337, 1 }, -- Holy Power spending abilities have $s1% increased damage and healing sacrifice_of_the_just = { 81607, 384820, 1 }, -- Reduces the cooldown of Blessing of Sacrifice by $s1 sec sanctified_plates = { 93009, 402964, 2 }, -- Armor increased by $s1%, Stamina increased by $s2% and damage taken from area of effect attacks reduced by $s3% seal_of_might = { 81621, 385450, 2 }, -- Mastery increased by $s1% and strength increased by $s2% seal_of_the_crusader = { 93683, 416770, 1 }, -- Your auto attacks heal a nearby ally for $s1 selfless_healer = { 103856, 469434, 1 }, -- Flash of Light is $s1% more effective on your allies and $s2% of the healing done also heals you stand_against_evil = { 103855, 469317, 1 }, -- Turn Evil now affects $s1 additional enemies steed_of_liberty = { 81631, 469304, 1 }, -- Divine Steed also grants Blessing of Freedom for $s1 sec. Blessing of Freedom: Blesses a party or raid member, granting immunity to movement impairing effects for $s4 sec stoicism = { 103862, 469316, 1 }, -- The duration of stun effects on you is reduced by $s1% turn_evil = { 93010, 10326, 1 }, -- The power of the Light compels an Undead, Aberration, or Demon target to flee for up to $s1 sec. Damage may break the effect. Lesser creatures have a chance to be destroyed. Only one target can be turned at a time unbound_freedom = { 93187, 305394, 1 }, -- Blessing of Freedom increases movement speed by $s1%, and you gain Blessing of Freedom when cast on a friendly target unbreakable_spirit = { 81615, 114154, 1 }, -- Reduces the cooldown of your Divine Shield, Ardent Defender, and Lay on Hands by $s1% worthy_sacrifice = { 103865, 469279, 1 }, -- You automatically cast Blessing of Sacrifice onto an ally within $s1 yds when they are below $s2% health and you are not in a loss of control effect. This effect activates $s3% of Blessing of Sacrifice's cooldown wrench_evil = { 103855, 460720, 1 }, -- Turn Evil's cast time is reduced by $s1% zealots_paragon = { 81625, 391142, 2 }, -- Hammer of Wrath and Judgment deal $s1% additional damage and extend the duration of Avenging Wrath by $s2 sec -- Protection ardent_defender = { 81481, 31850, 1 }, -- Reduces all damage you take by $s1% for $s2 sec. While Ardent Defender is active, the next attack that would otherwise kill you will instead bring you to $s3% of your maximum health avengers_shield = { 81502, 31935, 1 }, -- Hurls your shield at an enemy target, dealing $s$s3 Holy damage, interrupting and silencing the non-Player target for $s4 sec, and then jumping to $s5 additional nearby enemies. Shields you for $s6 sec, absorbing $s7% as much damage as it dealt. Deals $s$s8 additional damage to all enemies within $s9 yds of each target hit avenging_wrath = { 81483, 31884, 1 }, -- Call upon the Light to become an avatar of retribution, causing Judgment to generate $s1 additional Holy Power, allowing Hammer of Wrath to be used on any target, increasing your damage, healing, and critical strike chance by $s2% for $s3 sec barricade_of_faith = { 81501, 385726, 1 }, -- When you use Avenger's Shield, your block chance is increased by $s1% for $s2 sec bastion_of_light = { 81488, 378974, 1 }, -- Your next $s1 casts of Judgment generate $s2 additional Holy Power blessed_hammer = { 81469, 204019, 1 }, -- Throws a Blessed Hammer that spirals outward, dealing $s$s2 Holy damage to enemies and reducing the next damage they deal to you by $s3. Generates $s4 Holy Power blessing_of_spellwarding = { 90062, 204018, 1 }, -- Blesses a party or raid member, granting immunity to magical damage and harmful effects for $s1 sec. Cannot be used on a target with Forbearance. Causes Forbearance for $s2 sec. Shares a cooldown with Blessing of Protection bulwark_of_order = { 81499, 209389, 1 }, -- Avenger's Shield also shields you for $s1 sec, absorbing $s2% as much damage as it dealt, up to $s3% 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 $s1% for each target hit by Avenger's Shield, stacking up to $s2 times, and increases its radius by $s3 yds consecration_in_flame = { 81470, 379022, 1 }, -- Consecration lasts $s1 sec longer and its damage is increased by $s2% crusaders_judgment = { 81473, 204023, 1 }, -- Judgment now has $s1 charges, and Grand Crusader now also reduces the cooldown of Judgment by $s2 sec crusaders_resolve = { 81493, 380188, 1 }, -- Enemies hit by Avenger's Shield deal $s1% reduced melee damage to you for $s2 sec eye_of_tyr = { 81497, 387174, 1 }, -- Releases a blinding flash from your shield, causing $s$s2 Holy damage to all nearby enemies within $s3 yds and reducing all damage they deal to you by $s4% for $s5 sec faith_in_the_light = { 81485, 379043, 2 }, -- Casting Word of Glory grants you an additional $s1% block chance for $s2 sec ferren_marcuss_fervor = { 81482, 378762, 2 }, -- Avenger's Shield deals $s1% increased damage to its primary target final_stand = { 81504, 204077, 1 }, -- During Divine Shield, all targets within $s1 yds are taunted focused_enmity = { 81472, 378845, 1 }, -- When Avenger's Shield strikes a single enemy, it deals $s1% additional Holy damage gift_of_the_golden_valkyr = { 81484, 378279, 1 }, -- Each enemy hit by Avenger's Shield reduces the remaining cooldown on Guardian of Ancient Kings by $s1 sec. When you drop below $s2% health, you become infused with Guardian of Ancient Kings for $s3 sec. This cannot occur again for $s4 sec grand_crusader = { 81487, 85043, 1 }, -- When you avoid a melee attack or use Hammer of the Righteous, you have a $s1% chance to reset the remaining cooldown on Avenger's Shield. Reduces the cooldown of Judgment by $s2 sec guardian_of_ancient_kings = { 81490, 86659, 1 }, -- Empowers you with the spirit of ancient kings, reducing all damage you take by $s1% for $s2 sec hammer_of_the_righteous = { 81469, 53595, 1 }, -- Hammers the current target for $s$s3 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 $s4 yds for $s$s5 Holy damage. Generates $s6 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 $s1% based on the target's missing health holy_shield = { 81489, 152261, 1 }, -- Your block chance is increased by $s2%, you are able to block spells, and your successful blocks deal $s$s3 Holy damage to your attacker improved_ardent_defender = { 90062, 393114, 1 }, -- Ardent Defender reduces damage taken by an additional $s1% improved_holy_shield = { 81486, 393030, 1 }, -- Your chance to block spells is increased by $s1% inmost_light = { 92953, 405757, 1 }, -- Eye of Tyr deals $s1% increased damage and has $s2% reduced cooldown inner_light = { 81494, 386568, 1 }, -- When Shield of the Righteous expires, gain $s2% block chance and deal $s$s3 Holy damage to all attackers for $s4 sec inspiring_vanguard = { 81476, 393022, 1 }, -- Grand Crusader's chance to occur is increased to $s1% and it grants you $s2% strength for $s3 sec light_of_the_titans = { 81503, 378405, 1 }, -- Word of Glory heals for an additional $s1% over $s2 sec. Increased by $s3% if cast on yourself while you are afflicted by a harmful damage over time effect moment_of_glory = { 81505, 327193, 1 }, -- For the next $s1 sec, you generate an absorb shield for $s2% of all damage you deal, and Avenger's Shield damage is increased by $s3% and its cooldown is reduced by $s4% redoubt = { 81494, 280373, 1 }, -- Shield of the Righteous increases your Strength and Stamina by $s1% for $s2 sec, stacking up to $s3 refining_fire = { 81492, 469883, 1 }, -- Enemies struck by Avenger's Shield burn with holy fire, suffering $s$s2 Radiant damage over $s3 sec relentless_inquisitor = { 81506, 383388, 1 }, -- Spending Holy Power grants you $s1% haste per finisher for $s2 sec, stacking up to $s3 times resolute_defender = { 81471, 385422, 2 }, -- Each $s1 Holy Power you spend reduces the cooldown of Ardent Defender and Divine Shield by $s2 sec righteous_protector = { 81477, 204074, 1 }, -- Holy Power abilities reduce the remaining cooldown on Avenging Wrath and Guardian of Ancient Kings by $s1 sec sanctified_wrath = { 103877, 53376, 1 }, -- Avenging Wrath and Sentinel cause Judgment to generate $s1 additional Holy Power, and have $s2% increased duration sanctuary = { 101927, 379021, 1 }, -- Consecration's benefits persist for $s1 seconds after you leave it seal_of_charity = { 81612, 384815, 1 }, -- When you cast Word of Glory on someone other than yourself, you are also healed for $s1% of the amount healed seal_of_reprisal = { 81629, 377053, 1 }, -- Your Hammer of the Righteous deals $s1% increased damage sentinel = { 81483, 389539, 1 }, -- Call upon the Light and gain $s1 stacks of Divine Resolve, increasing your maximum health by $s2% and reducing your damage taken by $s3% per stack for $s4 sec. After $s5 sec, you will begin to lose $s6 stack per second, but each $s7 Holy Power spent will delay the loss of your next stack by $s8 sec. While active, your Judgment generates $s9 additional Holy Power, your damage and healing is increased by $s10%, and Hammer of Wrath may be cast on any target. Combines with Avenging Wrath shining_light = { 81498, 321136, 1 }, -- Every $s1 Shields of the Righteous make your next Word of Glory cost no Holy Power. Maximum $s2 stacks soaring_shield = { 101928, 378457, 1 }, -- Avenger's Shield jumps to $s1 additional targets strength_in_adversity = { 81493, 393071, 1 }, -- For each target hit by Avenger's Shield, gain $s1% parry for $s2 sec tirions_devotion = { 81503, 392928, 1 }, -- Lay on Hands' cooldown is reduced by $s1 sec per Holy Power spent tyrs_enforcer = { 81474, 378285, 2 }, -- Your Avenger's Shield is imbued with holy fire, causing it to deal $s$s2 Holy damage to all enemies within $s3 yards of each target hit uthers_counsel = { 81500, 378425, 1 }, -- Your Lay on Hands, Divine Shield, Blessing of Protection, and Blessing of Spellwarding have $s1% reduced cooldown -- Lightsmith authoritative_rebuke = { 95232, 469886, 1 }, -- Successfully interrupting an enemy spellcast reduces your Rebuke's cooldown by $s1 sec. Effect increased by $s2% while wielding a Holy Armament blessed_assurance = { 95235, 433015, 1 }, -- Casting a Holy Power ability increases the damage and healing of your next Hammer of the Righteous by $s1% blessing_of_the_forge = { 95230, 433011, 1 }, -- Avenging Wrath summons an additional Sacred Weapon, and during Avenging Wrath your Sacred Weapon casts spells on your target and echoes the effects of your Holy Power abilities divine_guidance = { 95235, 433106, 1 }, -- For each Holy Power ability cast, your next Consecration deals $s1 damage or healing immediately, split across all enemies and allies divine_inspiration = { 95231, 432964, 1 }, -- Your spells and abilities have a chance to manifest a Holy Armament for a nearby ally forewarning = { 95231, 432804, 1 }, -- The cooldown of Holy Armaments is reduced by $s1% hammer_and_anvil = { 95238, 433718, 1 }, -- Judgment critical strikes cause a shockwave around the target, dealing $s1 damage at the target's location holy_armaments = { 95234, 432459, 1 }, -- Will the Light to coalesce and become manifest as a Holy Armament, wielded by your friendly target. Holy Bulwark: While wielding a Holy Bulwark, gain an absorb shield for $s3% of your max health and an additional $s4% every $s5 sec. Lasts $s6 sec. Becomes Sacred Weapon after use laying_down_arms = { 95236, 432866, 1 }, -- When an Armament fades from you, the cooldown of Lay on Hands is reduced by $s1 sec and you gain Shining Light rite_of_adjuration = { 95233, 433583, 1 }, -- Imbue your weapon with the power of the Light, increasing your Stamina by $s1% and causing your Holy Power abilities to sometimes unleash a burst of healing around a target. Lasts $s2 |$s3hour:hrs; rite_of_sanctification = { 95233, 433568, 1 }, -- Imbue your weapon with the power of the Light, increasing your armor by $s1% and your primary stat by $s2%. Lasts $s3 |$s4hour:hrs; shared_resolve = { 95237, 432821, 1 }, -- The effect of your active Aura is increased by $s1% on targets with your Armaments solidarity = { 95228, 432802, 1 }, -- If you bestow an Armament upon an ally, you also gain its benefits. If you bestow an Armament upon yourself, a nearby ally also gains its benefits tempered_in_battle = { 95232, 469701, 1 }, -- When you or an ally wielding a Holy Bulwark are healed above maximum health, transfer $s1% of the overhealing to your ally. When you or an ally wielding a Sacred Weapon drop below $s2% health, redistribute your health immediately and every $s3 sec for $s4 sec. May only occur once per cast valiance = { 95229, 432919, 1 }, -- Consuming Shining Light reduces the cooldown of Holy Armaments by $s1 sec -- Templar bonds_of_fellowship = { 95181, 432992, 1 }, -- You receive $s1% less damage from Blessing of Sacrifice and each time its target takes damage, you gain $s2% movement speed up to a maximum of $s3% endless_wrath = { 95185, 432615, 1 }, -- Calling down an Empyrean Hammer has a $s1% chance to reset the cooldown of Hammer of Wrath and make it usable on any target, regardless of their health for_whom_the_bell_tolls = { 95183, 432929, 1 }, -- Divine Toll grants up to $s1% increased damage to your next $s2 Judgment when striking only $s3 enemy. This amount is reduced by $s4% for each additional target struck hammerfall = { 95184, 432463, 1 }, -- Shield of the Righteous and Word of Glory calls down an Empyrean Hammer on a nearby enemy. While Shake the Heavens is active, this effect calls down an additional Empyrean Hammer higher_calling = { 95178, 431687, 1 }, -- Crusader Strike, Hammer of Wrath and Judgment extend the duration of Shake the Heavens by $s1 sec lights_deliverance = { 95182, 425518, 1 }, -- You gain a stack of Light's Deliverance when you call down an Empyrean Hammer. While Eye of Tyr and Hammer of Light are unavailable, you consume $s1 stacks of Light's Deliverance, empowering yourself to cast Hammer of Light an additional time for free lights_guidance = { 95180, 427445, 1 }, -- Eye of Tyr is replaced with Hammer of Light for $s4 sec after it is cast. Hammer of Light: Hammer down your enemy with the power of the Light, dealing $s$s7 Holy damage and $s$s8 Holy damage up to $s9 nearby enemies. Additionally, calls down Empyrean Hammers from the sky to strike $s10 nearby enemies for $s$s11 Holy damage each. Costs $s12 Holy Power sacrosanct_crusade = { 95179, 431730, 1 }, -- Eye of Tyr surrounds you with a Holy barrier for $s1% of your maximum health. Hammer of Light heals you for $s2% of your maximum health, increased by $s3% for each additional target hit. Any overhealing done with this effect gets converted into a Holy barrier instead sanctification = { 95185, 432977, 1 }, -- Casting Judgment increases the damage of Empyrean Hammer by $s1% for $s2 sec. Multiple applications may overlap shake_the_heavens = { 95187, 431533, 1 }, -- After casting Hammer of Light, you call down an Empyrean Hammer on a nearby target every $s1 sec, for $s2 sec undisputed_ruling = { 95186, 432626, 1 }, -- Hammer of Light grants Shield of the Righteous, erupts a Consecration beneath its target, and increases your Haste by $s1% for $s2 sec. Additionally, Eye of Tyr grants $s3 Holy Power unrelenting_charger = { 95181, 432990, 1 }, -- Divine Steed lasts $s1 sec longer and increases your movement speed by an additional $s2% for the first $s3 sec wrathful_descent = { 95177, 431551, 1 }, -- When Empyrean Hammer critically strikes, $s1% of its damage is dealt to nearby enemies. Enemies hit by this effect deal $s2% reduced damage to you for $s3 sec zealous_vindication = { 95183, 431463, 1 }, -- Hammer of Light instantly calls down $s1 Empyrean Hammers on your target when it is cast } ) -- PvP Talents spec:RegisterPvpTalents( { bear_the_burden = 5664, -- (468454) 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 $s1 sec hallowed_ground = 90, -- (216868) inquisition = 844, -- (207028) luminescence = 3474, -- (556606) Lightbearer's healing transfer is increased by up to $s1% based on your current health. Lower health heals allies for more sacred_duty = 92, -- (216853) searing_glare = 5582, -- (410126) Call upon the light to blind enemy players in a $s1 yd cone, causing enemies to miss their spells and attacks for $s2 sec shield_of_virtue = 861, -- (215652) When activated, your next Avenger's Shield will interrupt and silence all enemies within $s1 yds of the target shining_revelation = 5677, -- (936051) The light reveals all enemies in stealth or invisible to you while under the effects of Divine Shield. This effect lingers for $s1 sec after Divine Shield fades spellbreaker = 5667, -- (469895) Eye for an Eye can now also trigger at $s1% effectiveness from direct Magic damage steed_of_glory = 91, -- (199542) warrior_of_light = 860, -- (210341) } ) -- Auras spec:RegisterAuras( { -- The Guardian of Ancient Kings is protecting you, reducing all damage taken by $s2%. ancient_guardian = { id = 86657, duration = 40.0, max_stack = 1, }, -- 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 = 16, }, -- Talent: Block chance increased by $s1%. -- https://wowhead.com/beta/spell=385724 barricade_of_faith = { id = 385724, duration = 10, max_stack = 1 }, -- Your next $U casts of Judgment generate $s1 additional Holy Power. bastion_of_light = { id = 378974, duration = 30, max_stack = 5 }, -- Damage and healing of your next $?s204019[Blessed Hammer]?s53595[Hammer of the Righteous][Crusader Strike] increased by $w1%. blessed_assurance = { id = 433019, duration = 20.0, 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 12 + ( talent.consecration_in_flame.enabled and 2 or 0 ) + ( talent.sanctuary.enabled and 4 or 0 ) end, tick_time = 1, type = "Magic", max_stack = 1, generate = function( c, type ) local cons = GetPlayerAuraBySpellID( 188370 ) if type == "buff" and cons then local expires = 0 local duration = class.auras.consecration.duration if cons.expirationTime == 0 then expires = action.consecration.lastCast + duration if talent.undisputed_ruling.enabled then expires = max( expires, action.hammer_of_light.lastCast + duration ) end else expires = cons.expirationTime end c.expires = expires c.applied = expires - duration c.duration = duration c.count = 1 c.caster = "player" return 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 }, -- Melee attack damage to the Paladin reduced by $w1% 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, dot = "buff", shared = "player", friendly = true }, divine_guidance = { id = 460822, duration = 30, max_stack = 50 }, 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 ) ) + ( level > 39 and 2 or 0 ) + ( 2 * talent.unrelenting_charger.rank ) end, max_stack = 1, }, -- $?j1g[Increases ground speed by $j1g%. ][]$?j1f[Increases flight speed by $j1f%. ][]$?j1s[Increases swim speed by $j1s%. ][] earthen_ordinants_ramolith = { id = 453785, duration = 3600, max_stack = 1, }, -- Damage done to $@auracaster is reduced by $w3%. empyrean_hammer = { id = 431625, duration = 8.0, 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 = 6, 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 }, -- Your Judgment deals ${$w2*$w4}% increased damage. for_whom_the_bell_tolls = { id = 433618, duration = 20.0, max_stack = 1, }, forbearance = { id = 25771, duration = function() return talent.holy_reprieve.enabled and 20 or 30 end, max_stack = 1, }, focused_assault = { id = 206891, duration = 6, max_stack = 5 }, -- Gift of the Golden Val'kyr has ended and will not activate. gift_of_the_golden_valkyr = { id = 393879, duration = 45.0, max_stack = 1, }, -- Talent: Damage taken reduced by $86657s2%. -- https://wowhead.com/beta/spell=86659 guardian_of_ancient_kings = { id = function() return QueenGlyphed( 212641 ) and 212641 or 86659 end, 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 }, hammer_of_light_free = { duration = 3600, max_stack = 1 }, hammer_of_light_ready = { id = 427453, duration = 12, max_stack = function() return 1 + ( set_bonus.tww3 >= 4 and 1 or 0 ) end }, -- 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 }, ]] -- Wielding a Holy Bulwark.$?$w3<0[; Duration of Fear effects reduced by $s3%.][] holy_bulwark = { id = 432496, duration = 20.0, pandemic = true, max_stack = 1, }, holy_bulwark_ready = { duration = 3600, 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 }, -- $?$W1==$U[Ready to deliver Light's justice.][Building up Light's Deliverance. At $u stacks, your next Hammer of Light cast will activate another Hammer of Light for free.] lights_deliverance = { id = 433674, duration = 3600, max_stack = 60, }, -- 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 }, refining_fire = { id = 469882, duration = 5, max_stack = 1 }, -- 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, }, -- Stamina increased by $w1%. rite_of_adjuration = { id = 433584, duration = 3600.0, max_stack = 1, }, -- Primary stat increased by $w1%. Armor increased by $w2%. rite_of_sanctification = { id = 433550, duration = 3600.0, max_stack = 1, }, sacred_weapon = { id = 432502, duration = 20, max_stack = 1 }, sacred_weapon_ready = { duration = 3600, max_stack = 1 }, -- Empyrean Hammer damage increased by $w1% sanctification = { id = 433671, duration = 10.0, max_stack = 1, }, -- Misses spells and melee attacks. searing_glare = { id = 410201, duration = 4.0, max_stack = 1, }, sense_undead = { id = 5502, duration = 3600, max_stack = 1 }, -- Damage taken reduced by $s12%. Maximum health increased by $s11%.; $?s53376[; Judgment generates $53376s3~ additional Holy Power.][]; $?s384376[; Damage and healing increased by $s1~%. Hammer of Wrath may be cast on any target.][] sentinel = { id = 389539, duration = function() return 16 * ( 1 + 0.25 * talent.sanctified_wrath.rank ) end, max_stack = 15, copy = "divine_resolve" }, -- Casting Empyrean Hammer on a nearby target every $t sec. shake_the_heavens = { id = 431536, duration = 8.0, max_stack = 1, }, -- 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 = 2, 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 }, -- Haste increased by $w1% undisputed_ruling = { id = 432629, duration = 6.0, max_stack = 1, }, -- Movement speed reduced by $s2%.; $?$w3!=0[Suffering $s3 Radiant damage every $t3 sec.][] wake_of_ashes = { id = 205273, duration = 6.0, tick_time = 1.0, 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({ -- The War Within tww3 = { items = { 237619, 237617, 237622, 237620, 237618 }, auras = { -- Templar hammer_of_light = { id = 427441, duration = 20, max_stack = 2 }, -- Lightsmith masterwork = { id = 1238903, duration = 30, max_stack = 5 }, } }, tww2 = { items = { 229244, 229242, 229243, 229245, 229247 }, auras = { luck_of_the_draw = { id = 1218114, duration = 10, max_stack = 1 } } }, -- Dragonflight tier31 = { items = { 207189, 207190, 207191, 207192, 207194 }, auras = { sanctification = { id = 424616, duration = 20, max_stack = 5 }, sanctification_empower = { id = 424622, duration = 30, max_stack = 1 } } }, tier30 = { items = { 202455, 202453, 202452, 202451, 202450 }, auras = { heartfire = { id = 408399, duration = 5, max_stack = 1 } } }, tier29 = { items = { 200417, 200419, 200414, 200416, 200418, 217198, 217200, 217196, 217197, 217199 }, auras = { ally_of_the_light = { id = 394714, duration = 8, max_stack = 1 }, deflecting_light = { id = 394727, duration = 10, max_stack = 1 } } }, -- Legacy tier21 = { items = { 152151, 152153, 152149, 152148, 152150, 152152 } }, tier20 = { items = { 147160, 147162, 147158, 147157, 147159, 147161 }, auras = { sacred_judgment = { id = 246973, duration = 8, max_stack = 1 } } }, tier19 = { items = { 138350, 138353, 138356, 138359, 138362, 138369 } }, class = { items = { 139690, 139691, 139692, 139693, 139694, 139695, 139696, 139697 } }, breastplate_of_the_golden_valkyr = { items = { 137017 } }, heathcliffs_immortality = { items = { 137047 } }, justice_gaze = { items = { 137065 } }, saruans_resolve = { items = { 144275 } }, tyelca_ferren_marcuss_stature = { items = { 137070 } }, tyrs_hand_of_faith = { items = { 137059 } }, uthers_guard = { items = { 137105 } }, soul_of_the_highlord = { items = { 151644 } }, pillars_of_inmost_light = { items = { 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 ) local holy_power_generators_used = 0 spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName, _, amount, overEnergize, powerType ) if sourceGUID ~= state.GUID then return end if subtype == "SPELL_ENERGIZE" and powerType == Enum.PowerType.HolyPower and ( amount + overEnergize ) > 0 then local ability = class.abilities[ spellName ] if ability and ability.key ~= "arcane_torrent" and ability.key ~= "divine_toll" then holy_power_generators_used = ( holy_power_generators_used + 1 ) % 3 return end elseif spellID == class.auras.blessing_of_dawn.id and ( subtype == "SPELL_AURA_APPLIED" or subtype == "SPELL_AURA_REFRESH" or subtype == "SPELL_AURA_APPLIED_DOSE" ) then holy_power_generators_used = max( 0, holy_power_generators_used - 3 ) return end end ) spec:RegisterStateExpr( "hpg_used", function() return holy_power_generators_used end ) spec:RegisterStateExpr( "hpg_to_2dawn", function() return max( -1, 6 - hpg_used - ( buff.blessing_of_dawn.stack * 3 ) ) end ) rawset( state, "holy_bulwark", "holy_bulwark" ) rawset( state, "sacred_weapon", "sacred_weapon" ) local ld_stacks = 0 local free_hol_triggered = 0 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 - lastAbility.lastCast < 1 then applyBuff( "righteous_protector_icd" ) buff.righteous_protector_icd.expires = lastAbility.lastCast + 1 end end if talent.holy_armaments.enabled then if IsSpellKnownOrOverridesKnown( 432472 ) then applyBuff( "sacred_weapon_ready" ) else applyBuff( "holy_bulwark_ready" ) end end if IsSpellKnownOrOverridesKnown( 427453 ) then if talent.lights_deliverance.enabled then -- We need to track when it ticks over from 59/60 stacks. local stacks = buff.lights_deliverance.stack if stacks < ld_stacks then free_hol_triggered = now end ld_stacks = stacks if free_hol_triggered + 12 < now then free_hol_triggered = 0 end -- Reset. if free_hol_triggered > 0 and action.hammer_of_light.lastCast > action.eye_of_tyr.lastCast then local hol_remains = free_hol_triggered + 12 - query_time hol_remains = hol_remains > 0 and hol_remains or ( 2 * gcd.max ) applyBuff( "hammer_of_light_free", max( 2 * gcd.max, hol_remains ) ) if Hekili.ActiveDebug then Hekili:Debug( "Hammer of Light active; applied hammer_of_light_free: %.2f : %.2f : %.2f : %d", buff.hammer_of_light_free.remains, free_hol_triggered, query_time, ld_stacks ) end else if Hekili.ActiveDebug then Hekili:Debug( "Hammer of Light active; hammer_of_light_free ruled out: %.2f : %.2f : %d", free_hol_triggered, query_time, ld_stacks ) end end end if not buff.hammer_of_light_free.up then local hol_remains = action.eye_of_tyr.lastCast + 12 - query_time hol_remains = hol_remains > 0 and hol_remains or ( 2 * gcd.max ) applyBuff( "hammer_of_light_ready", hol_remains ) if Hekili.ActiveDebug then Hekili:Debug( "Hammer of Light not active; applied hammer_of_light_ready: %.2f", buff.hammer_of_light_ready.remains ) end end if buff.hammer_of_light_ready.down and buff.hammer_of_light_free.down then if Hekili.ActiveDebug then Hekili:Debug( "Hammer of Light appears active [ %.2f ] but I don't know why; applying hammer_of_light_ready." ) end applyBuff( "hammer_of_light_ready", 2 * gcd.max ) end end hpg_used = nil hpg_to_2dawn = nil end ) spec:RegisterStateExpr( "next_armament", function() if buff.sacred_weapon_ready.up then return "sacred_weapon" end return "holy_bulwark" end ) spec:RegisterStateExpr( "judgment_holy_power", function() return 1 + ( buff.bastion_of_light.up and 2 or 0 ) + ( ( buff.avenging_wrath.up or buff.sentinel.up ) and talent.sanctified_wrath.enabled and 1 or 0 ) end ) spec:RegisterHook( "spend", function( amt, resource ) if amt > 0 and resource == "holy_power" then if talent.righteous_protector.enabled then reduceCooldown( "avenging_wrath", 1.5 ) reduceCooldown( "guardian_of_ancient_kings", 1.5 ) applyBuff( "righteous_protector_icd" ) 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 talent.divine_guidance.enabled then addStack( "divine_guidance", nil, 1 ) 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" then if buff.blessing_of_dusk.up then applyBuff( "fading_light" ) end if this_action ~= "arcane_torrent" and this_action ~= "divine_toll" then if hpg_used == 2 then hpg_used = 0 addStack( "blessing_of_dawn" ) else hpg_used = hpg_used + 1 end end 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.refining_fire.enabled then applyDebuff( "target", "refining_fire" ) 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 = function() return talent.sentinel.enabled and 389539 or 31884 end, 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 = { 31884, "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, 5 ) 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 = 5, recharge = 5, 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.3 * 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 if talent.righteous_protection.enabled then removeBuff( "dispellable_poison" ) removeBuff( "dispellable_disease" ) end 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", toggle = "defensives", usable = function() if not settings.bosp_filter then return true end local zone = state.instance_id local npcid = target.npcid or -1 local t = debuff.casting -- Only use on a spell targeted at the player. if not t.up then return false, "target is not casting" end if not state.target.is_dummy and not class.spellFilters[ t.v1 ] then return false, "spell[" .. t.v1 .. "] in zone[" .. zone .. "] by npc[" .. npcid .. "] is not on filter" end if not UnitIsUnit( "player", t.caster .. "target" ) then return false, "player is not target of cast" end return true end, 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 () if buff.divine_guidance.up then removeBuff( "divine_guidance" ) end 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_the_resolute", 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.fires_of_justice.enabled and 0.85 or 1 ) * haste end, recharge = function () return talent.improved_crusader_strike.enabled and ( 6 * ( talent.fires_of_justice.enabled and 0.85 or 1 ) * haste ) or nil end, gcd = "spell", school = "physical", spend = 0.016, 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 = function() if not talent.lights_revocation.enabled then return "forbearance" end end, 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, }, -- Releases a blinding flash from your shield, causing $s2 Holy damage to all nearby enemies within $A1 yds and reducing all damage they deal to you by $s1% for $d. eye_of_tyr = { id = 387174, cast = 0, cooldown = function() return 60 * ( 1 - 0.33 * talent.inmost_light.rank ) end, gcd = "spell", school = "holy", talent = "eye_of_tyr", startsCombat = true, nobuff = function() return buff.hammer_of_light_free.up and "hammer_of_light_free" or "hammer_of_light_ready" end, toggle = function() if not talent.lights_guidance.enabled then return "defensives" end end, handler = function () applyDebuff( "target", "eye_of_tyr" ) active_dot.eye_of_tyr = active_enemies if talent.lights_guidance.enabled then applyBuff( "hammer_of_light_ready", nil, 1 + set_bonus.tww3 >=4 and 1 or 0 ) end if talent.undisputed_ruling.enabled then gain( 3, "holy_power" ) end end, bind = "hammer_of_light" }, -- Quickly heal a friendly target for $?$c1&$?a134735[${$s1*1}][$s1]. 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 QueenGlyphed( 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, nopvptalent = "guardian_of_the_forgotten_queen", 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 = 300, 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 = function() return 45 - ( 15 * talent.fist_of_justice.rank ) end, gcd = "spell", school = "holy", spend = 0.035, spendType = "mana", startsCombat = false, handler = function () applyDebuff( "target", "hammer_of_justice" ) end, }, -- Hammer down your enemy with the power of the Light, dealing $429826s1 Holy damage and ${$429826s1/2} Holy damage up to 4 nearby enemies. ; Additionally, calls down Empyrean Hammers from the sky to strike $427445s2 nearby enemies for $431398s1 Holy damage each.; hammer_of_light = { id = 427453, known = 387174, flash = 387174, cast = 0.0, cooldown = 0.0, gcd = "spell", spend = function() if buff.divine_purpose.up or buff.hammer_of_light_free.up then return 0 end return 3 end, spendType = "holy_power", startsCombat = true, buff = function() return buff.hammer_of_light_free.up and "hammer_of_light_free" or "hammer_of_light_ready" end, handler = function () removeBuff( "divine_purpose" ) if talent.undisputed_ruling.enabled then spec.abilities.consecration.handler() applyBuff( "shield_of_the_righteous", buff.shield_of_the_righteous.remains + 4.5 ) end if buff.hammer_of_light_free.up then removeBuff( "hammer_of_light_free" ) else removeStack( "hammer_of_light_ready" ) if buff.lights_deliverance.stack_pct == 100 then removeBuff( "lights_deliverance" ) applyBuff( "hammer_of_light_free" ) end end end, bind = { "wake_of_ashes", "eye_of_tyr" } }, -- 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 = 5, recharge = 5, 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 = 7.5, -- recharge = 7.5, 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 ) ) 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 * talent.zealots_paragon.rank ) end if buff.sentinel.up then buff.sentinel.expires = buff.sentinel.expires + ( 0.5 * talent.zealots_paragon.rank ) 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, }, ]] -- [432496] While wielding a Holy Bulwark, gain an absorb shield for ${$s2/10}.1% of your max health and an additional ${$s4/10}.1% every $t2 sec. Lasts $d. holy_armaments = { id = function() return buff.holy_bulwark_ready.up and 432459 or 432472 end, known = 432459, cast = 0.0, cooldown = function() return 60 * ( 1 - 0.2 * talent.forewarning.rank ) end, charges = 2, recharge = function() return 60 * ( 1 - 0.2 * talent.forewarning.rank ) end, gcd = "spell", startsCombat = false, buff = function() if buff.holy_bulwark_ready.up then return "holy_bulwark_ready" end return "sacred_weapon_ready" end, texture = function() return buff.holy_bulwark_ready.up and 5927636 or 5927637 end, handler = function () if buff.holy_bulwark_ready.up then applyBuff( "holy_bulwark" ) removeBuff( "holy_bulwark_ready" ) applyBuff( "sacred_weapon_ready" ) else applyBuff( "sacred_weapon" ) removeBuff( "sacred_weapon_ready" ) applyBuff( "holy_bulwark_ready" ) end removeStack( "masterwork" ) end, copy = { "holy_bulwark", 432459, "sacred_weapon", 432472 } }, -- 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 () if talent.crusaders_judgment.enabled then return 2 end end, cooldown = function() return 11 - ( 0.5 * talent.seal_of_alacrity.rank ) end, recharge = function () return talent.crusaders_judgment.enabled and ( 11 - ( 0.5 * talent.seal_of_alacrity.rank ) ) 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( judgment_holy_power, "holy_power" ) removeStack( "bastion_of_light" ) if talent.judgment_of_light.enabled then applyDebuff( "target", "judgment_of_light", nil, 5 ) end end, copy = 220637 }, -- 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 = function() if talent.empyreal_ward.enabled then return 471195 end return 633 end, cast = 0, cooldown = function () return 600 * ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * ( talent.uthers_counsel.enabled and 0.85 or 1 ) end, gcd = "off", school = "holy", talent = "lay_on_hands", startsCombat = false, toggle = "defensives", nodebuff = "forbearance", handler = function () gain( health.max, "health" ) if talent.tirions_devotion.enabled then gain( 0.05 * mana.max, "mana" ) end -- applyDebuff( "", "forbearance" ) if talent.empyreal_ward.enabled then applyBuff( "empyrael_ward" ) end end, copy = { 633, 471195 } }, -- 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 if talent.authoritative_rebuke.enabled and debuff.casting.up then reduceCooldown( "rebuke", ( buff.sacred_weapon.up or buff.holy_bulwark.up ) and 2 or 1 ) 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.divine_purpose.up then return 0 end return 3 end, spendType = "holy_power", startsCombat = true, usable = function() return equipped.shield, "requires a shield" end, handler = function () removeBuff( "bulwark_of_righteous_fury" ) removeBuff( "divine_purpose" ) removeDebuff( "target", "judgment" ) if talent.faiths_armor.enabled then applyBuff( "faiths_armor" ) end if talent.redoubt.enabled then addStack( "redoubt", nil, 3 ) end if talent.shining_light.enabled then addStack( "shining_light", nil, 1 ) if buff.shining_light.stack == 3 then addStack( "shining_light_full" ) removeBuff( "shining_light" ) end end if set_bonus.tww2 >= 4 and buff.luck_of_the_draw.up then gain( 1, "holy_power" ) buff.luck_of_the_draw.expires = buff.luck_of_the_draw.expires + 0.5 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 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 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, }, } ) local wog_str = Hekili:GetSpellLinkWithTexture( spec.abilities.word_of_glory.id ) spec:RegisterSetting( "wog_health", 40, { name = format( "%s Health Threshold", wog_str ), desc = format( "If set above zero, %s may be recommended when your health falls below this percentage.", wog_str ), type = "range", min = 0, max = 100, step = 1, width = "full", } ) spec:RegisterStateExpr( "wog_health", function () return settings.wog_health or 0 end ) local loh_str = Hekili:GetSpellLinkWithTexture( spec.abilities.lay_on_hands.id ) spec:RegisterSetting( "loh_health", 30, { name = format( "%s Health Threshold", loh_str ), desc = format( "If set above zero, %s may be recommended when your health falls below this percentage.", loh_str ), type = "range", min = 0, max = 100, step = 1, width = "full", } ) spec:RegisterStateExpr( "loh_health", function () return settings.loh_health or 0 end ) local ad_str = Hekili:GetSpellLinkWithTexture( spec.abilities.ardent_defender.id ) spec:RegisterSetting( "ad_damage", 40, { name = format( "%s Damage Threshold", ad_str ), desc = format( "If set above zero, %s may be recommended when you take this percentage of your maximum health in damage over 5 seconds.\n\n" .. "It is better to learn to use your defensive abilities proactively before taking damage, but this setting may help you learn (and prevent death).\n\n" .. "By default, your |cFFFFD100Defensives|r toggle must also be enabled.", ad_str ), type = "range", min = 0, max = 100, step = 1, width = "full", } ) spec:RegisterStateExpr( "ad_damage", function () return ( settings.ad_damage or 0 ) * health.max * 0.01 end ) local goak_str = Hekili:GetSpellLinkWithTexture( spec.abilities.guardian_of_ancient_kings.id ) spec:RegisterSetting( "goak_damage", 40, { name = format( "%s Damage Threshold", goak_str ), desc = format( "If set above zero, %s may be recommended when you take this percentage of your maximum health in damage over 5 seconds.\n\n" .. "It is better to learn to use your defensive abilities proactively before taking damage, but this setting may help you learn (and prevent death).\n\n" .. "By default, your |cFFFFD100Defensives|r toggle must also be enabled.", goak_str ), 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 ) local ds_str = Hekili:GetSpellLinkWithTexture( spec.abilities.divine_shield.id ) spec:RegisterSetting( "ds_damage", 60, { name = format( "%s Damage Threshold", ds_str ), desc = format( "If set above zero, %s may be recommended when you take this percentage of your maximum health in damage over 5 seconds.\n\n" .. "It is better to learn to use your defensive abilities proactively before taking damage, but this setting may help you learn (and prevent death).\n\n" .. "If you are actively tanking for a group and use %s, you will lose threat on all enemies and need to taunt to regain it.\n\n" .. "By default, your |cFFFFD100Defensives|r toggle must also be enabled.", ds_str, spec.abilities.divine_shield.name ), 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 ) local bosp_str = Hekili:GetSpellLinkWithTexture( spec.abilities.blessing_of_spellwarding.id ) spec:RegisterSetting( "bosp_filter", false, { name = format( "%s: Cast Filter", bosp_str ), desc = format( "If checked, %s may be recommended |cffff0000ONLY|r when your target is casting specific spells on you.\n\n" .. "The spell filter is updated behind the scenes for each season and raid tier.", bosp_str ), type = "toggle", width = "full", } ) local sent_str = Hekili:GetSpellLinkWithTexture( 389539 ) spec:RegisterSetting( "sentinel_def", false, { name = strformat( "%s: Use Defensively", sent_str ), desc = format( "If enabled, %s is placed on the |cFFFFD100Defensives|r toggle by default (rather than |cFFFFD100Cooldowns|r) and is recommended based on your %s Damage Threshold Setting.", sent_str, goak_str ), 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 = "tempered_potion", package = "Protection Paladin", } ) spec:RegisterPack( "Protection Paladin", 20250425, [[Hekili:nZvBVnUns4FlbfWRn6ghl5KSzxeBG2E4W1f9wS4sl2pCOwM2I2MnYs(eLs2ae4F73mK6fsjsjzhVPlqrtS1OHZB8HZmC2mZz2Vp7oFscD2NCh5E1OlDVAOJJ71UZUl5PD0z3TJS8EYA4xcjBH))NJJsOltyrH7N)zsaXNfI08uqeXhzfpknEjq3MKKD8pCXfRzjBsxmCz02l4STPbe8vxgtwLGFE5fZUBrkli5xdNTWOC48(z3rst2efp7U7yB)fGZmFFQKCkF5S7qYpF0LN7E1h2p)FY(6(5)C0DFE)8vaBPX7)4(pMtXiKcKjW))PWLLpYf(p4r)umW4K9Z)h0v0qF4DNNUdfj)mkV8CNrN74829ZHF6k(PZ5UUz)ez(FiOhw74OTzlv(Ro69Np6gGK)dLNefd0SLLWwtKwssMfnGXt0EdK54pVm7N3uObsrRK4BKsMRBlIX7o3DmqYVVbE(xiGo(fWdHorCT5IOb6ksAqc8RFseDifUz3ftxKEp4APHKfbu)z)8SeWzHuu(nfeVKee4j)GhYzj)9KbrLQoYIXhdlwgff4h9yih5WLhdhsIzH3ttem4QJHb8esOpj2hya8GDXuiiFbPUDZN(qKGdK0yIjZxoHbS1Bs4E)vQ)6TqGyfshRskjEjjK6brsX1P8svkxgfYPWgo5N0ORQwhTdukAs57(ajMHpf)TGu4hoa)IzW2kgPWaomXz4gc3l3JSFEV9ZR8mWuLmKe(KN)oU4593p)mfQCnq1ZpRXMC2p0pnoBxZ0jASWafdKSP(sLtRqh1di84a2GhpicDRF66d2g5A0g52GnYK2x3gzYsQzJmAbM2Mr0GjY5GmrjQBgZJ9vSyLgd(okSDkHeVg22nSs0U0D6winXeMVh9b4jdj((8H0VI4tYhx9zmPI(URm)40D23JvDpibET1SW1EpcgOnM2cAu1wKUA1q93vBz3fLJ2vfRQKhG)2eBIPBjSqqZVfoNjtdbstyBPcT2zKWjoOCX2gHQMx0kV1brXpzARUnNcFdJg4JVAYgQxmASOrPCPZzScMg7bMa)jiW0UK2mmsTOiA0QgJl6OYvDbHlasbXt4hXL(Dh0sxWAWWDtjJxXGd3cIIYWYloAWq4C(RKag5cbH7LdYxtayHH0yVykNfWOHlPIWISDtwyrdhRMjzovIBYbHgwBd6(5Gn0jhpPjVXkuk80S9xoQaFO9fX1mWEHtoMs8FQy7TnjzGkIutRieVJ)cxXM0qUez04Ey2n3xd7MJzW(xn7MRmMViBMgI5lZmP0kUCdcDW1GVxLcqkq(qIh5jrQq7Y6L(d3s(k8spTmGMd6GRNHq(k7J2q2Uf2iLVDXBvmLQHnMT2cI5Bi3tfqyBOOXIRJIQBnRtCnak6tInQjpfRZOHxzogaKMsRwfjV5dsG4Gn7wdaREU(emrbWSDv5r0Ka8unGv(P879apMhs1WmwjIb6vqwgUY6uMpbrEYxWcjRuTA9KPAcLJI5gEdohJhrbdLhiyA59cq2rVmzY(5w9vnifhu5TtwFAuCPnrZtAGspgeww47MOiZ5rivJ9eBj1oF3Y5MMoBSTxruwBmBx2bTPWU01qLHPObnAfOYyLB(XKh7)7F5lqq)LFEaFhbQZJhLaLZraDyB6YnYFBxe4yGvE)8hHY8IsbaGhXdrrwcQn8PnuSy0C6uTWTP9AGJO8LRlOWP8Cm6jk4jVDrpI1u)J7NNJJ4P(9tLr6L4MFBDVIuMmK)WH5EalkN5tLEgd(O3IM2OaPfa)DHQAZhLebwt4NKIpbAp(cg4m6rdbDMlDTadfDvqzDoyFjuxJ3IOWu(qyvEKe)OOZaECkHdjD56D5ULhQpTIlTtVJmoO3X5vrx6nwbno7GuYVTbGNk8L3Fahw31K9H0UfcOeDpnaStID3LA3Q04NkG5NKtVQF8wrbdMoP3zutoOwwZSy1mhJD6kCpyGDhvB9ACezzrJHAUfVGqYTxCB5bHuFpcNdfylZ2)qKGBZnKwZ0ZuAf1cjCAjxQxtXmFTKIRq6APm6tG052vPBzCkN4dMroKn89uH4zppib3Yk9TidMSnbiQLLUUHm1EImH0VM4rI3sKDbb4dNSmg0)hPKDrHkGrYSvvFyrMQ9n(u1esVUztIoGBZfKxTFdID95AGma8A1EQugPAQPkoVtLw1gluHo7W65O00vSquQXY5RNzPP9Zhc4zdgUmbitrX0YjHpWckLbJf8yhgSEmHWgNH2j9v51DnrVyJA(c3ounNjPZogsZfovAoQ)8U4tCBS4OtfcX4I0sSQkDcQ1T9(59AlT1rCDBSmQtLq6EicPbGxx7Dr8SUx)OPik79i8me0ReQwxeRGH7AhaQFH8Xc3gXtK5XPLdIXEwJ9kkR6(oANZY1Qi)rDZIpnG9anUlvw7wf6RROpnH1mEKkwELarD48XoMpIOs1w6VJwR6RgcvH2wYYaSWIZku6MuzjR5zxwBtrHhnVl8ngvQFOQuhxHxPOTIxk0ThJIfE)Ig4pw7s9QgKxr1TVD)LeXmULU8B0I2KkzFBzL6iusSQYfFIS5gTGcRx3zI29o34fvLqcVx0IKEfyzg3ooS4U80QTDOpKiYswsURTasml5MDPXqn)Y4nfFEd14z76awO04nbacSb1h(CLUu8F)x07zbS)eN(GLrquyOF(usWY7Pq24smNXXUoKf(IGuaFHkIJeSIpC)8FjLNGJvWUyweyXyyoiGpz)8uonNRYosefR02jOkBGWvusskKCMwrP0eSHu8HlI478KYHWXAp8GscGKV2TmreE8y0Ap5x9Y8fkhDzeBOP9N2tdiB)gKAkjWt0LDn4b1ynwi4DWf2NSLSM6DLSwCFE2xKd6xCJeIbwb2dlNxfDLyDkglqe3wgS9MHuEVWoRrwMDqg8P)i5Lwwv11Ebu1TJ20bDBDe5(VN0oR8f1u7aGcHKdiPEC4nGLmORo3V3ma5YpQV2bO7GIr8)EsTQSOO2zpDUk4lbrBYWxk5xa5jVOqi1MqF(SSXGaohLJpmBc2g9EaNGehkIEUtmWvST7IIbMUcHgFtXid9gi9q6)lfQA1hBJpEDzKuaKvm7zyLEWH9a07h)nqNHtd)aachfcRM4XVj)sd1hBJ3iBG8BSmvhWJ7781bDKPQtDIfgxHKoX86d(snMBKKoXCdt7Ibr3enFtzFRm2Wy8yWQC0Y9XY(oW4gd)Q9ynP96xFM(cd7SX8tYgg7s(X58(gZ(wz8XUzPJY9XY(oW4JcsD)hnG2N9w8ddS3TDxL42IAYpLtGMT80X4cwoUD3JzwAGanz90XyHZ5xf(fKtxRp61OzhNK3iOie6S7(HFaQKOJZX(IGOfxOEJIx8tcg)zzvsp9Bi7VyNCI5ZVBqmpf8T3)rCP(JDsXxo72YsOWz3gu()nu2l8jNXGFdYTy)8Zbb)g)XV7sXSPJVTup4dlsQ4hNCbMqJO0qitQeguhKCMpBLEI)FLpFOF0eDAt0SzsQoDNgjsVyEZ0OwqVzkYN2P3Itv3KmFF5ip9wXC5oX5TSvtmVVUNDS7E9pZ(Pgp)CdaqtN0aQ6GNF(mZhX9surxvv01SkwxluuX66FPkAqlM2G6RQHvMp8pwOJyiN4FubQFt1zUxQZk)RLOvAZxjE7KMdk3oL5ZhNI4xO186b8OROX5DE6exWezEkNF(56DlE67UQ(xdf5yuy0VLkZ0iRtcLtlxSLX3QYSfJVEFtVFw3nV1bK6(4eao1z0GbM5PYD(v3SzPRytNm2mZQoJW2vWNFUiQ1IWpz8iDWs1fIf(q09up6xHIgXw7GlImur04jpw4Qu(ryHlMfzBVyM0n9g1qXY9halSyZeWdYc371ABn71VEt0Mm65Nn38mWZcMPV)6ZOfdKT(Mkc)m0oslSrRlG47w24GBlBk5HzjZ(EJTGCGf5qRBisVSTEo2lpaOExBMw0NXEN13sNAYKUM6sJUIv0HMSVUO7m20fRSwn61GWR0hT)of)82NHsB9Mc2K1)7efOYA2IvVOjF)DkYQ9IRYUWYw3PcwMFwo8UfNxRndeYSfZgXcXj11hP9BNKno7g5BLr6RalVPXy)w3In)wgF9BDGCgSqI2bA1hy9BDgchfRnO636Au0lFxXP7Qt(9KRW06AEi0h0RLlf9qxtNmRYcJtz(0rh1c2WrK9pR9P(uXu3YeFobKVZm66lM9w8OZx558(qTjnRb9K79nmd496RC43pAyEFNo5kOuHtUjFGmHKVNhp7tSlOdZ1C7odHVOvhwVdXrCWQzNuKtD8sRBrpWJo6wnmJLPH3YawdL60R0(F7yJctLjcPmGPPjPUxxNI6EDtFMyw2SmCpfNjUWWSN1Tv82XzoUgQTsrqwOnqsV(RFLjw6uiaU2faSW1yQFkS64yCfa5w9HYsz7yG8ljhi1w3vORghF6jxzoWrBaZqwOnAAt0M2zauqMzuLbKgq0m895PaDTn7xVo0CalOBvM3zJ0O0ZJUUFUPPC(GbOSO0TmiZhLxsD4b7LfpnXCQN2K4UAISNBCV2Mj5df5Q)lDN74bwZ2VZWx)niegWWEXsH7blfM89hrvavrOoRYWa3LAvAyWF7zOnUtUeQHQtMf44uiVKwhxZx8EYoeRDiBo6suJrAQ1nTSqcdncRx)2MqxSRZngpuIVBEUCTM7ALqVoeICK(WdWEywq1UDnrJrkZI08bU6x2wjj5xtcqskN6XsOBZU)eZ)jSOqAn8x)Ig5k)TI)4eKFVmIJQ6B)pNbtC6z82hWt91B1XKlhH120aRC1URp97noVRl1wMb49CzNPdoeL1TnL190PSoA363jszf)7lD5SpD91I5HB2))d]] )