You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1251 lines
37 KiB

-- PaladinHoly.lua
-- Alpha October 2020
local addon, ns = ...
local Hekili = _G[ addon ]
local class = Hekili.Class
local state = Hekili.State
local PTR = ns.PTR
-- Conduits
-- [-] punish_the_guilty
-- [x] vengeful_shock
-- Covenant
-- [-] ringing_clarity
-- [-] hallowed_discernment
-- [-] righteous_might
-- [x] the_long_summer
-- Endurance
-- [-] divine_call
-- [-] golden_path
-- [x] shielding_words
-- Protection Endurance
-- [x] resolute_defender
-- [x] royal_decree
-- Finesse
-- [ ] echoing_blessings -- NYI: auras not identified
-- [x] lights_barding
-- [-] pure_concentration
-- [x] wrench_evil
if UnitClassBase( "player" ) == "PALADIN" then
local spec = Hekili:NewSpecialization( 65 )
spec:RegisterResource( Enum.PowerType.HolyPower )
spec:RegisterResource( Enum.PowerType.Mana )
-- Talents
spec:RegisterTalents( {
crusaders_might = 196926, -- 196926
bestow_faith = 223306, -- 223306
lights_hammer = 114158, -- 114158
saved_by_the_light = 157047, -- 157047
judgment_of_light = 22189, -- 183778
holy_prism = 114165, -- 114165
fist_of_justice = 22179, -- 234299
repentance = 22180, -- 20066
blinding_light = 21811, -- 115750
unbreakable_spirit = 22433, -- 114154
cavalier = 22434, -- 230332
rule_of_law = 214202, -- 214202
divine_purpose = 17597, -- 223817
holy_avenger = 17599, -- 105809
seraphim = 17601, -- 152262
sanctified_wrath = 53376, -- 53376
avenging_crusader = 216231, -- 216231
awakening = 248033, -- 248033
sanctified_wrath = 53376, -- 53376
righteous_protector = 21202, -- 204074
final_stand = 22645, -- 204077
} )
-- PvP Talents
spec:RegisterPvpTalents( {
} )
-- Auras
spec:RegisterAuras( {
avenging_wrath = {
id = 31884,
duration = function () return ( talent.sanctified_wrath.enabled and 1.25 or 1 ) * ( azerite.lights_decree.enabled and 25 or 20 ) end,
max_stack = 1,
},
blessing_of_freedom = {
id = 1044,
duration = 8,
type = "Magic",
max_stack = 1,
},
blessing_of_protection = {
id = 1022,
duration = 10,
max_stack = 1,
type = "Magic",
},
blessing_of_sacrifice = {
id = 6940,
duration = 12,
max_stack = 1,
type = "Magic",
},
blinding_light = {
id = 105421,
duration = 6,
type = "Magic",
max_stack = 1,
},
concentration_aura = {
id = 317920,
duration = 3600,
max_stack = 1,
},
consecration = {
id = 26573,
duration = 12,
max_stack = 1,
generate = function( c, type )
local dropped, expires
c.count = 0
c.expires = 0
c.applied = 0
c.caster = "unknown"
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"
end
end
},
crusader_aura = {
id = 32223,
duration = 3600,
max_stack = 1,
},
devotion_aura = {
id = 465,
duration = 3600,
max_stack = 1,
},
divine_protection = {
id = 498,
duration = 8,
max_stack = 1,
},
divine_purpose = {
id = 223819,
duration = 12,
max_stack = 1,
},
divine_shield = {
id = 642,
duration = 8,
type = "Magic",
max_stack = 1,
},
divine_steed = {
id = 221886,
duration = function () return 3 * ( 1 + ( conduit.lights_barding.mod * 0.01 ) ) end,
max_stack = 1,
},
forbearance = {
id = 25771,
duration = 30,
max_stack = 1,
},
hammer_of_justice = {
id = 853,
duration = 6,
type = "Magic",
max_stack = 1,
},
hand_of_reckoning = {
id = 62124,
duration = 3,
max_stack = 1,
},
holy_avenger = {
id = 105809,
duration = 20,
max_stack = 1,
},
judgment = {
id = 214222,
duration = 15,
max_stack = 1,
},
judgment_of_light = {
id = 196941,
duration = 30,
max_stack = 25,
},
repentance = {
id = 20066,
duration = 6,
max_stack = 1,
},
retribution_aura = {
id = 183435,
duration = 3600,
max_stack = 1,
},
seraphim = {
id = 152262,
duration = 16,
max_stack = 1,
},
shield_of_the_righteous = {
id = 132403,
duration = 4.5,
max_stack = 1,
},
turn_evil = {
id = 10326,
duration = 40,
max_stack = 1
},
} )
-- Legendaries
-- Vanguard's Momentum
-- Badge of the Mad Paragon
-- Final Verdict
-- From Dusk till Dawn
-- The Magistrate's Judgment
-- Conduits
-- Ringing Clarity
-- Vengeful Shock
-- Focused Light
-- Light's Reach
-- Templar's Vindication
-- The Long Summer
-- Truth's Wake
-- Virtuous Command
-- Righteous Might
-- Hallowed Discernment
-- Punish the Guilty
-- Gear Sets
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_shield", function () return action.shield_of_the_righteous.lastCast end )
spec:RegisterHook( "reset_precast", function ()
last_consecration = nil
last_blessed_hammer = nil
last_shield = nil
end )
spec:RegisterHook( "spend", function( amt, resource )
if amt > 0 and resource == "holy_power" then
if talent.righteous_protector.enabled then
reduceCooldown( "avenging_wrath", amt )
reduceCooldown( "guardian_of_ancient_kings", amt )
end
if talent.fist_of_justice.enabled then
reduceCooldown( "hammer_of_justice", 2 * amt )
end
if legendary.uthers_devotion.enabled then
setCooldown( "blessing_of_freedom", max( 0, cooldown.blessing_of_freedom.remains - 1 ) )
setCooldown( "blessing_of_protection", max( 0, cooldown.blessing_of_protection.remains - 1 ) )
setCooldown( "blessing_of_sacrifice", max( 0, cooldown.blessing_of_sacrifice.remains - 1 ) )
setCooldown( "blessing_of_spellwarding", max( 0, cooldown.blessing_of_spellwarding.remains - 1 ) )
end
if legendary.relentless_inquisitor.enabled then
addStack( "relentless_inquisitor", nil, amt )
end
if legendary.of_dusk_and_dawn.enabled and holy_power.current == 0 then applyBuff( "blessing_of_dusk" ) end
end
end )
spec:RegisterHook( "gain", function( amt, resource, overcap )
if legendary.of_dusk_and_dawn.enabled and amt > 0 and resource == "holy_power" and holy_power.current == 5 then
applyBuff( "blessing_of_dawn" )
end
end )
-- Abilities
spec:RegisterAbilities( {
avenging_wrath = {
id = 31884,
cast = 0,
cooldown = function () return ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * 120 end,
gcd = "off",
toggle = "cooldowns",
startsCombat = false,
texture = 135875,
handler = function ()
applyBuff( "avenging_wrath" )
end,
},
blessing_of_freedom = {
id = 1044,
cast = 0,
cooldown = 25,
gcd = "spell",
spend = 0.07,
spendType = "mana",
startsCombat = false,
texture = 135968,
handler = function ()
applyBuff( "blessing_of_freedom" )
end,
},
blessing_of_protection = {
id = 1022,
cast = 0,
cooldown = 300,
gcd = "spell",
spend = 0.15,
spendType = "mana",
toggle = "defensives",
defensives = true,
startsCombat = false,
texture = 135964,
notalent = "blessing_of_spellwarding",
nodebuff = "forbearance",
handler = function ()
applyBuff( "blessing_of_protection" )
applyDebuff( "player", "forbearance" )
end,
},
blessing_of_sacrifice = {
id = 6940,
cast = 0,
cooldown = 120,
gcd = "off",
spend = 0.07,
spendType = "mana",
defensives = true,
startsCombat = false,
texture = 135966,
handler = function ()
applyBuff( "blessing_of_sacrifice" )
end,
},
blinding_light = {
id = 115750,
cast = 0,
cooldown = 90,
gcd = "spell",
toggle = "interrupts",
spend = 0.06,
spendType = "mana",
interrupt = true,
startsCombat = true,
texture = 571553,
talent = "blinding_light",
usable = function () return target.casting end,
readyTime = function () return debuff.casting.up and ( debuff.casting.remains - 0.5 ) or 3600 end,
handler = function ()
interrupt()
applyDebuff( "target", "blinding_light" )
active_dot.blinding_light = max( active_enemies, active_dot.blinding_light )
end,
},
cleanse = {
id = 4987,
cast = 0,
charges = 1,
cooldown = 8,
recharge = 8,
gcd = "spell",
spend = 0.065,
spendType = "mana",
startsCombat = false,
texture = 135949,
usable = function ()
return buff.dispellable_poison.up or buff.dispellable_disease.up or buff.dispellable_magic.up, "requires poison or disease or magic"
end,
handler = function ()
removeBuff( "dispellable_poison" )
removeBuff( "dispellable_disease" )
removeBuff( "dispellable_magic" )
end,
},
consecration = {
id = 26573,
cast = 0,
cooldown = 20,
gcd = "spell",
startsCombat = true,
texture = 135926,
handler = function ()
applyBuff( "consecration" )
end,
},
crusader_aura = {
id = 32223,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = true,
texture = 135890,
handler = function ()
removeBuff( "concentration_aura" )
removeBuff( "devotion_aura" )
removeBuff( "retribution_aura" )
applyBuff( "crusader_aura" )
end,
},
crusader_strike = {
id = 35395,
cast = 0,
charges = 2,
cooldown = function () return 6 * haste end,
recharge = function () return 6 * haste end,
gcd = "spell",
spend = 0.09,
spendType = "mana",
startsCombat = true,
texture = 135891,
handler = function ()
gain( buff.holy_avenger.up and 3 or 1, "holy_power" )
if talent.crusaders_might.enabled then
setCooldown( "holy_shock", max( 0, cooldown.holy_shock.remains - 1.5 ) )
end
end,
},
devotion_aura = {
id = 465,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = true,
texture = 135893,
handler = function ()
removeBuff( "concentration_aura" )
removeBuff( "crusader_aura" )
removeBuff( "retribution_aura" )
applyBuff( "devotion_aura" )
end,
},
divine_protection = {
id = 498,
cast = 0,
cooldown = function () return ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * 60 end,
gcd = "off",
spend = 0.035,
spendType = "mana",
toggle = "defensives",
defensives = true,
startsCombat = false,
texture = 524353,
handler = function ()
applyBuff( "divine_protection" )
end,
},
divine_shield = {
id = 642,
cast = 0,
cooldown = function () return ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * 300 end,
gcd = "spell",
toggle = "defensives",
defensives = true,
startsCombat = false,
texture = 524354,
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,
},
divine_steed = {
id = 190784,
cast = 0,
charges = function () return talent.cavalier.enabled and 2 or nil end,
cooldown = 45,
recharge = function () return talent.cavalier.enabled and 45 or nil end,
gcd = "spell",
startsCombat = false,
texture = 1360759,
handler = function ()
applyBuff( "divine_steed" )
end,
},
flash_of_light = {
id = 19750,
cast = 1.5,
cooldown = 0,
gcd = "spell",
spend = 0.22,
spendType = "mana",
startsCombat = false,
texture = 135907,
handler = function ()
gain( 1.67 * 1.68 * ( 1 + stat.versatility_atk_mod ) * stat.spell_power, "health" )
end,
},
hammer_of_justice = {
id = 853,
cast = 0,
cooldown = 60,
gcd = "spell",
spend = 0.04,
spendType = "mana",
startsCombat = true,
texture = 135963,
handler = function ()
applyDebuff( "target", "hammer_of_justice" )
end,
},
hammer_of_wrath = {
id = 24275,
cast = 0,
cooldown = 7.5,
gcd = "spell",
startsCombat = true,
texture = 613533,
usable = function () return target.health_pct < 20 or ( level > 57 and buff.avenging_wrath.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( buff.holy_avenger.up and 3 or 1, "holy_power" )
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_reckoning = {
id = 62124,
cast = 0,
charges = 1,
cooldown = 8,
recharge = 8,
gcd = "off",
spend = 0.03,
spendType = "mana",
startsCombat = true,
texture = 135984,
handler = function ()
applyDebuff( "target", "hand_of_reckoning" )
end,
},
holy_avenger = {
id = 105809,
cast = 0,
cooldown = 180,
gcd = "spell",
toggle = "cooldowns",
startsCombat = true,
texture = 571555,
talent = "holy_avenger",
handler = function ()
applyBuff( "holy_avenger" )
end,
},
holy_shock = {
id = 20473,
cast = 0,
charges = 1,
hasteCD = true,
cooldown = 7.5,
recharge = 7.5,
gcd = "spell",
spend = 0.16,
spendType = "mana",
startsCombat = false,
texture = 135972,
handler = function ()
gain( buff.holy_avenger.up and 3 or 1, "holy_power" )
end,
},
holy_prism = {
id = 114165,
cast = 0,
cooldown = 20,
gcd = "spell",
spend = 0.13,
spendType = "mana",
startsCombat = false,
texture = 613408,
},
judgment = {
id = 275773,
cast = 0,
charges = 1,
cooldown = 6,
recharge = 6,
hasteCD = true,
gcd = "spell",
spend = 0.03,
spendType = "mana",
startsCombat = true,
texture = 135959,
handler = function ()
applyDebuff( "target", "judgment" )
gain( buff.holy_avenger.up and 3 or 1, "holy_power" )
if talent.judgment_of_light.enabled then applyDebuff( "target", "judgment_of_light", nil, 25 ) end
end,
},
lay_on_hands = {
id = 633,
cast = 0,
cooldown = function () return ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) * 600 end,
gcd = "spell",
toggle = "defensives",
defensives = true,
startsCombat = false,
texture = 135928,
nodebuff = "forbearance",
handler = function ()
gain( health.max, "health" )
applyDebuff( "player", "forbearance" )
if azerite.empyreal_ward.enabled then applyBuff( "empyrael_ward" ) end
end,
},
repentance = {
id = 20066,
cast = 1.7,
cooldown = 15,
gcd = "spell",
interrupt = true,
spend = 0.06,
spendType = "mana",
startsCombat = false,
texture = 135942,
handler = function ()
applyDebuff( "target", "repentance" )
end,
},
retribution_aura = {
id = 183435,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = false,
texture = 135889,
handler = function ()
removeBuff( "concentration_aura" )
removeBuff( "crusader_aura" )
removeBuff( "devotion_aura" )
applyBuff( "retribution_aura" )
end,
},
seraphim = {
id = 152262,
cast = 0,
cooldown = 45,
gcd = "spell",
spend = function ()
if buff.divine_purpose.up then return 0 end
return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 )
end,
spendType = "holy_power",
startsCombat = false,
texture = 1030103,
talent = "seraphim",
handler = function ()
removeBuff( "divine_purpose" )
removeBuff( "the_magistrates_judgment" )
local used = min( 2, cooldown.shield_of_the_righteous.charges )
applyBuff( "seraphim", used * 8 )
end,
},
shield_of_the_righteous = {
id = 53600,
cast = 0,
cooldown = 1,
gcd = "spell",
spend = function () return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end,
spendType = "holy_power",
startsCombat = true,
texture = 236265,
handler = function ()
applyBuff( "shield_of_the_righteous" )
end,
},
turn_evil = {
id = 10326,
cast = function () return 1.5 * ( 1 + ( conduit.wrench_evil.mod * 0.01 ) ) end,
cooldown = 15,
gcd = "spell",
spend = 0.1,
spendType = "mana",
startsCombat = true,
texture = 571559,
handler = function ()
applyDebuff( "turn_evil" )
end,
},
word_of_glory = {
id = 85673,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function ()
if buff.divine_purpose.up or buff.shining_light.stack == 5 or buff.royal_decree.up then return 0 end
return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 )
end,
spendType = "holy_power",
startsCombat = false,
texture = 133192,
handler = function ()
if buff.royal_decree.up then removeBuff( "royal_decree" )
elseif buff.divine_purpose.up then removeBuff( "divine_purpose" )
else removeBuff( "shining_light_full" ) end
removeBuff( "the_magistrates_judgment" )
gain( 2.9 * stat.spell_power * ( 1 + stat.versatility_atk_mod ), "health" )
if buff.vanquishers_hammer.up then
applyBuff( "shield_of_the_righteous" )
removeBuff( "vanquishers_hammer" )
end
if conduit.shielding_words.enabled then applyBuff( "shielding_words" ) end
end,
auras = {
-- Conduit
shielding_words = {
id = 338788,
duration = 10,
max_stack = 1
}
}
},
-- Paladin - Kyrian - 304971 - divine_toll (Divine Toll)
divine_toll = {
id = 304971,
cast = 0,
cooldown = 60,
gcd = "spell",
startsCombat = true,
texture = 3565448,
toggle = "essences",
handler = function ()
if state.spec.protection then
-- Cast Avenger's Shield x5.
-- This is lazy and may be wrong/bad.
for i = 1, active_enemies do
class.abilities.avengers_shield.handler()
end
elseif state.spec.retribution then
-- Cast Judgment x5.
for i = 1, active_enemies do
class.abilities.judgment.handler()
end
elseif state.spec.holy then
-- Cast Holy Shock x5.
for i = 1, active_enemies do
class.abilities.holy_shock.handler()
end
end
end
},
-- Paladin - Necrolord - 328204 - vanquishers_hammer (Vanquisher's Hammer)
vanquishers_hammer = {
id = 328204,
cast = 0,
cooldown = 30,
gcd = "spell",
spend = function ()
if buff.divine_purpose.up then return 0 end
return 1 - ( buff.the_magistrates_judgment.up and 1 or 0 )
end,
spendType = "holy_power",
startsCombat = true,
texture = 3578228,
toggle = "essences",
handler = function ()
removeBuff( "divine_purpose" )
removeBuff( "the_magistrates_judgment" )
applyBuff( "vanquishers_hammer" )
end,
auras = {
vanquishers_hammer = {
id = 328204,
duration = 15,
max_stack = 1
}
}
},
-- Paladin - Night Fae - 328620 - blessing_of_summer (Blessing of Summer)
blessing_of_summer = {
id = 328620,
cast = 0,
cooldown = 45,
gcd = "spell",
spend = 0.05,
spendType = "mana",
startsCombat = false,
texture = 3636845,
toggle = "essences",
buff = "blessing_of_summer_active",
handler = function ()
applyBuff( "blessing_of_summer" ) -- We'll just apply to self because we don't care.
removeBuff( "blessing_of_summer_active" )
applyBuff( "blessing_of_autumn_active" )
setCooldown( "blessing_of_autumn", 45 )
end,
auras = {
blessing_of_summer = {
id = 328620,
duration = function () return 30 * ( 1 - ( conduit.the_long_summer.mod * 0.01 ) ) end,
max_stack = 1,
},
blessing_of_summer_active = {
duration = 3600,
max_stack = 1,
generate = function( t )
if IsActiveSpell( 328620 ) then
t.name = class.auras.blessing_of_summer.name .. " Active"
t.count = 1
t.applied = now
t.expires = now + 3600
t.caster = "player"
return
end
t.count = 0
t.applied = 0
t.expires = 0
t.caster = "nobody"
end,
},
}
},
blessing_of_autumn = {
id = 328622,
cast = 0,
cooldown = 45,
gcd = "spell",
spend = 0.05,
spendType = "mana",
startsCombat = false,
texture = 3636843,
toggle = "essences",
buff = "blessing_of_autumn_active",
handler = function ()
applyBuff( "blessing_of_autumn" )
removeBuff( "blessing_of_autumn_active" )
applyBuff( "blessing_of_winter_active" )
setCooldown( "blessing_of_winter", 45 )
end,
auras = {
blessing_of_autumn = {
id = 328622,
duration = 30,
max_stack = 1,
},
blessing_of_autumn_active = {
duration = 3600,
max_stack = 1,
generate = function( t )
if IsActiveSpell( 328622 ) then
t.name = class.auras.blessing_of_autumn.name .. " Active"
t.count = 1
t.applied = now
t.expires = now + 3600
t.caster = "player"
return
end
t.count = 0
t.applied = 0
t.expires = 0
t.caster = "nobody"
end,
}
}
},
blessing_of_winter = {
id = 328281,
cast = 0,
cooldown = 45,
gcd = "spell",
spend = 0.05,
spendType = "mana",
startsCombat = false,
texture = 3636846,
toggle = "essences",
buff = "blessing_of_winter_active",
handler = function ()
applyBuff( "blessing_of_winter" )
removeBuff( "blessing_of_winter_active" )
applyBuff( "blessing_of_spring_active" )
setCooldown( "blessing_of_spring", 45 )
end,
auras = {
blessing_of_winter = {
id = 328281,
duration = 30,
max_stack = 1,
},
blessing_of_winter_debuff = {
id = 328506,
duration = 6,
max_stack = 10
},
blessing_of_winter_active = {
duration = 3600,
max_stack = 1,
generate = function( t )
if IsActiveSpell( 328281 ) then
t.name = class.auras.blessing_of_winter.name .. " Active"
t.count = 1
t.applied = now
t.expires = now + 3600
t.caster = "player"
return
end
t.count = 0
t.applied = 0
t.expires = 0
t.caster = "nobody"
end,
}
}
},
blessing_of_spring = {
id = 328282,
cast = 0,
cooldown = 45,
gcd = "spell",
spend = 0.05,
spendType = "mana",
startsCombat = false,
texture = 3636844,
toggle = "essences",
buff = "blessing_of_spring_active",
handler = function ()
applyBuff( "blessing_of_spring" )
removeBuff( "blessing_of_spring_active" )
applyBuff( "blessing_of_summer_active" )
setCooldown( "blessing_of_summer", 45 )
end,
auras = {
blessing_of_spring = {
id = 328281,
duration = 30,
max_stack = 1,
friendly = true,
},
blessing_of_spring_active = {
duration = 3600,
max_stack = 1,
generate = function( t )
if IsActiveSpell( 328282 ) then
t.name = class.auras.blessing_of_winter.name .. " Active"
t.count = 1
t.applied = now
t.expires = now + 3600
t.caster = "player"
return
end
t.count = 0
t.applied = 0
t.expires = 0
t.caster = "nobody"
end,
}
}
},
-- Paladin - Venthyr - 316958 - ashen_hallow (Ashen Hallow)
ashen_hallow = {
id = 316958,
cast = function () return 1.5 * haste end,
cooldown = 120,
gcd = "spell",
startsCombat = false,
texture = 3565722,
toggle = "essences",
auras = {
hammer_of_wrath_hallow = {
duration = 30,
max_stack = 1,
generate = function( t )
if IsUsableSpell( 24275 ) and not ( target.health_pct < 20 or ( level > 57 and ( buff.avenging_wrath.up or buff.crusade.up ) ) and not buff.final_verdict.up ) then
t.name = class.abilities.hammer_of_wrath.name .. " " .. class.abilities.ashen_hallow.name
t.count = 1
t.applied = action.ashen_hallow.lastCast
t.expires = action.ashen_hallow.lastCast + 30
t.caster = "player"
return
end
t.count = 0
t.applied = 0
t.expires = 0
t.caster = "nobody"
end,
},
}
},
} )
spec:RegisterOptions( {
enabled = true,
aoe = 2,
nameplates = true,
nameplateRange = 8,
damage = true,
damageExpiration = 8,
potion = "potion_of_unbridled_fury",
package = "Holy Paladin",
} )
spec:RegisterPack( "Holy Paladin", 20201027, [[d4ZdnaGAKkwpcLnjkAxqzBaj2hc42iA2umFG41Ic)ciPVHankse7eO2RQDRy)e(jcrnmrPXrQkDEKQgkPQYGjA4c1HasDksuDmsLJJqOwis5AKiTyOA5GEicrEQupMspxWLrnvr1Kfz6sEePQ4VaEgsLCDszDieYNfYMjPTtQYHPAwie00qOAEKOmssvvFNegnswgc6KiK4wie40kDpKk1kri15qiPFd5R75VtEXhmHzjmRUSesqmDeuPknlO8UOpMFh72m8i(94K8B9hzOxi1p34PDEh70BqE65VdinOLFtvvCGicub1OTO0WXSisqnSKAgVw0yHUAbQHL0cQVX1wtruMJ)o5fFWeMLWS6YsibF7Affc(UxsI0BQnL454VtCW(wFes9hzOxi1p34PDeeT(iKezBHWzOqsibjcfscZsywbrliA9rijsu(eXH3MnuHN)2IqMesXeE(bR75V5XXnC60EBHBXW1FJRPQI56Xt0orakGErHPf)2T1IM3QlKXniu61bt4ZFZJJB40P9ECs(TtSaLd9aGkAkaKkqmsbdF72ArZBNybkh6bav0uaivGyKcg(2c3IHR)2IqMesXGfyOhtTKyqM03jiKkJUfsDzfsqaribTqwUHNclWqpMAjX4XXnC61btxp)npoUHtN27Xj53EGspF4aa0jgccyrq382T1IM3EGspF4aa0jgccyrq382c3IHR)wjczIX1uvXGoXqqalc6gGeJRPQIfk3MHqsaHKGczMcjUMQkMRhpr7ebOa6ffMwSqQCHeeqeYeJRPQIbDIHGawe0najgxtvfluUndHKUfYSVoyI)83UTw08oWqpMAjFZJJB40P96Gv6ZF72ArZBpqXdaLBmifV5XXnC60EDWGYZFZJJB40P92c3IHR)gxtvflWqpMAjX0IfsqariTiKjHumybg6XuljgKj9DccPYescfsqaribTqwUHNclWqpMAjX4XXnC6TBRfnVD94jANiafqVOEDWe85V5XXnC60EBHBXW1FJRPQI56Xt0orakGErHPf)2T1IM3XOArZRdwFF(B3wlAEJB4qyNiaKkqqJKKHV5XXnC60EDWe1N)2T1IM34goe2jcaPc4ALg58Mhh3WPt71bRl7ZF72ArZBCdhc7ebGubuStXW3844goDAVoyD6E(B3wlAEJB4qyNiaKkqigUt0BECCdNoTxhSocF(B3wlAERNpeXABGIHbakNKKHV5XXnC60EDW6ORN)Mhh3WPt7TfUfdx)nfYqpqmsbdXsS6A3sijGqM9TBRfnVtRE7WafYyEDW6i(ZFZJJB40P92c3IHR)2IqMesXG56XteddabQLnjmit67eE72ArZBsejpfasfiYGG0)6G1P0N)Mhh3WPt7TfUfdx)nUMQkwGHEm1sIPflKGaIqcAHSCdpfwGHEm1sIXJJB40B3wlAERfyGTyYWRdwhO883844goDAVhNKFhbrtuaigUKUba6r8B3wlAEhbrtuaigUKUba6r8BlClgU(BLiKkriTiKjHumy0rlfrYtHPQzmaq2s5WigOwswijGqsCHeeqesLiKGwil3WtHzHAbpXWaaD0srK8uy844gojKzkKXqwpGiBcthgD0srK8ucPYfsLlKzkKweYKqkgmxpEIyyaiqTSjHbzsFNGqsaHK4czMcjUMQkwGHEm1sIbzsFNGqsaHK4cPYfsqarivIqIRPQIfyOhtTKyqM03jiKktijUqQ8xhSoc(83844goDAVhNKFtYqoJIYdaQ(e92T1IM3KmKZOO8aGQprVTWTy46VbTqIRPQI56Xt0orakGErHPflKzkKkriX1uvXcm0JPwsmTyHeeqesqlKLB4PWcm0JPwsmECCdNesL)6G1PVp)npoUHtN27Xj53qNyjTjJaa(gba5eaUwvO5TBRfnVHoXsAtgba8ncaYjaCTQqZRxVtSQRzQNFW6E(BECCdNoT3UTw0826gdGBRfnaMnuVnBOagNKFBritcPycVoycF(BECCdNoT3w4wmC93uid9aXifmelXQRDlHKUfYSVDBTO5DGAztcaPcuumaCJOkgPfEDW01ZFZJJB40P92c3IHR)MczOhigPGHyjwDTBjKeqiZ(2T1IM3uojjdbqQakGEr96Gj(ZFZJJB40P92c3IHR)gxtvflWqpMAjX0IfYmfsCnvvSad9yQLedYK(obHuzcjD92T1IM3MnIQca0rlfrYt96Gv6ZFZJJB40P92c3IHR)2IqMesXGrhTuejpfgKj9DccPYeYiBsiZuiTiKjHumyuid9abkKndmit67eesLjKr2KqMPqsHm0deJuWqSeRU2TesciKzfYmfslczsifdaKDB92T1IM30rlfrYt96GbLNFW6E(R3844goDAVDBTO5nfYqpqGczZ4TfUfdx)nfYqpqmsbdXsS6A3sijGqM91btWNFW6E(R3844goDAVDBTO5TfQf8edbcfCZGFBHBXW1FReH0IqMesXGzHAbpXqGqb3mymit67eesLjKr2KqMPqAritcPyWOqg6bcuiBgyqM03jiKebcPomLkKeqiJSjHmtH0IqMesXaaz3wcPYfsqaribTqwUHNcZc1cEIHbaYnIQW4XXnC61bRVp)G198xVDBTO5nfYqpqmCdKV5XXnC60EDWe1N)Mhh3WPt7TfUfdx)nOfslAcSf61IgmT43UTw082IMaBHETO51bRl7ZFZJJB40P92c3IHR)g0cz5gEkSad9yQLeJhh3WjHeeqesCnvvSad9yQLetl(TBRfnVnBevfaOJwkIKN61bRt3ZFZJJB40P92c3IHR)(TBRfnVdulBsaivGIIbGBevXiTWRdwhHp)TBRfnVTOjWwOxlAEZJJB40P9617yiBrK4E98dw3ZF72ArZBZgrvba6OLIi5PEZJJB40P961R36XWWIMdMWSeMvxwcj4BfoC2jk8MOqgJGfNesIlKUTw0iKMnubmbr)ogIuxd)(nUh4erEER)id9cP(5gpTZ7qmBpyqrPVE9d]] )
end