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.

1418 lines
66 KiB

4 years ago
-- PaladinRetribution.lua
-- May 2018
local addon, ns = ...
local Hekili = _G[ addon ]
local class = Hekili.Class
local state = Hekili.State
local PTR = ns.PTR
-- Conduits
-- [x] expurgation
-- [-] templars_vindication
-- [x] truths_wake
-- [x] virtuous_command
if UnitClassBase( "player" ) == "PALADIN" then
local spec = Hekili:NewSpecialization( 70 )
spec:RegisterResource( Enum.PowerType.HolyPower, {
divine_resonance = {
aura = "divine_resonance",
last = function ()
local app = state.buff.divine_resonance.applied
local t = state.query_time
return app + floor( t - app )
end,
interval = 5,
value = 1,
},
} )
spec:RegisterResource( Enum.PowerType.Mana )
-- Talents
spec:RegisterTalents( {
zeal = 22590, -- 269569
righteous_verdict = 22557, -- 267610
execution_sentence = 23467, -- 343527
fires_of_justice = 22319, -- 203316
blade_of_wrath = 22592, -- 231832
empyrean_power = 23466, -- 326732
fist_of_justice = 22179, -- 234299
repentance = 22180, -- 20066
blinding_light = 21811, -- 115750
unbreakable_spirit = 22433, -- 114154
cavalier = 22434, -- 230332
eye_for_an_eye = 22183, -- 205191
divine_purpose = 17597, -- 223817
holy_avenger = 17599, -- 105809
seraphim = 17601, -- 152262
selfless_healer = 23167, -- 85804
justicars_vengeance = 22483, -- 215661
healing_hands = 23086, -- 326734
sanctified_wrath = 23456, -- 317866
crusade = 22215, -- 231895
final_reckoning = 22634, -- 343721
} )
-- PvP Talents
spec:RegisterPvpTalents( {
aura_of_reckoning = 756, -- 247675
blessing_of_sanctuary = 752, -- 210256
divine_punisher = 755, -- 204914
judgments_of_the_pure = 5422, -- 355858
jurisdiction = 757, -- 204979
law_and_order = 858, -- 204934
lawbringer = 754, -- 246806
luminescence = 81, -- 199428
ultimate_retribution = 753, -- 355614
unbound_freedom = 641, -- 305394
vengeance_aura = 751, -- 210323
} )
-- Auras
spec:RegisterAuras( {
avenging_wrath = {
id = 31884,
duration = function () return ( azerite.lights_decree.enabled and 25 or 20 ) * ( talent.sanctified_wrath.enabled and 1.25 or 1 ) end,
max_stack = 1,
},
avenging_wrath_autocrit = {
id = 294027,
duration = 20,
max_stack = 1,
copy = "avenging_wrath_crit"
},
blade_of_wrath = {
id = 281178,
duration = 10,
max_stack = 1,
},
blessing_of_freedom = {
id = 1044,
duration = 8,
type = "Magic",
max_stack = 1,
},
blessing_of_protection = {
id = 1022,
duration = 10,
type = "Magic",
max_stack = 1,
},
blinding_light = {
id = 115750,
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
},
crusade = {
id = 231895,
duration = 25,
type = "Magic",
max_stack = 10,
},
crusader_aura = {
id = 32223,
duration = 3600,
max_stack = 1,
},
devotion_aura = {
id = 465,
duration = 3600,
max_stack = 1,
},
divine_purpose = {
id = 223819,
duration = 12,
max_stack = 1,
},
divine_shield = {
id = 642,
duration = 8,
type = "Magic",
max_stack = 1,
},
-- Check racial for aura ID.
divine_steed = {
id = 221885,
duration = function () return 3 * ( 1 + ( conduit.lights_barding.mod * 0.01 ) ) end,
max_stack = 1,
copy = { 221886 },
},
empyrean_power = {
id = 326733,
duration = 15,
max_stack = 1,
},
execution_sentence = {
id = 343527,
duration = 8,
max_stack = 1,
},
eye_for_an_eye = {
id = 205191,
duration = 10,
max_stack = 1,
},
final_reckoning = {
id = 343721,
duration = 8,
max_stack = 1,
},
fires_of_justice = {
id = 209785,
duration = 15,
max_stack = 1,
copy = "the_fires_of_justice" -- backward compatibility
},
forbearance = {
id = 25771,
duration = 30,
max_stack = 1,
},
hammer_of_justice = {
id = 853,
duration = 6,
type = "Magic",
max_stack = 1,
},
hand_of_hindrance = {
id = 183218,
duration = 10,
type = "Magic",
max_stack = 1,
},
hand_of_reckoning = {
id = 62124,
duration = 3,
max_stack = 1,
},
holy_avenger = {
id = 105809,
duration = 20,
max_stack = 1,
},
inquisition = {
id = 84963,
duration = 45,
max_stack = 1,
},
judgment = {
id = 197277,
duration = 15,
max_stack = 1,
},
retribution_aura = {
id = 183435,
duration = 3600,
max_stack = 1,
},
righteous_verdict = {
id = 267611,
duration = 6,
max_stack = 1,
},
selfless_healer = {
id = 114250,
duration = 15,
max_stack = 4,
},
seraphim = {
id = 152262,
duration = 15,
max_stack = 1,
},
shield_of_the_righteous = {
id = 132403,
duration = 4.5,
max_stack = 1,
},
shield_of_vengeance = {
id = 184662,
duration = 15,
max_stack = 1,
},
the_magistrates_judgment = {
id = 337682,
duration = 15,
max_stack = 1,
},
-- what is the undead/demon stun?
wake_of_ashes = { -- snare.
id = 255937,
duration = 5,
max_stack = 1,
},
zeal = {
id = 269571,
duration = 20,
max_stack = 3,
},
-- 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,
},
-- PvP
reckoning = {
id = 247677,
max_stack = 30,
duration = 30
},
-- Legendaries
blessing_of_dawn = {
id = 337767,
duration = 12,
max_stack = 1
},
blessing_of_dusk = {
id = 337757,
duration = 12,
max_stack = 1
},
final_verdict = {
id = 337228,
duration = 15,
type = "Magic",
max_stack = 1,
},
relentless_inquisitor = {
id = 337315,
duration = 12,
max_stack = 20
},
-- Conduits
expurgation = {
id = 344067,
duration = 6,
max_stack = 1
}
} )
4 years ago
-- Tier 28
spec:RegisterSetBonuses( "tier28_2pc", 363677, "tier28_4pc", 364370 )
-- 2-Set - Ashes to Ashes - When you benefit from Art of War, you gain Seraphim for 3 sec.
-- 4-Set - Ashes to Ashes - Art of War has a 50% chance to reset the cooldown of Wake of Ashes instead of Blade of Justice.
-- 2/13/22: No mechanics that can be proactively modeled.
4 years ago
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
} )
spec:RegisterGear( "tier21", 152151, 152153, 152149, 152148, 152150, 152152 )
spec:RegisterAura( "hidden_retribution_t21_4p", {
id = 253806,
duration = 15
} )
spec:RegisterGear( "class", 139690, 139691, 139692, 139693, 139694, 139695, 139696, 139697 )
spec:RegisterGear( "truthguard", 128866 )
spec:RegisterGear( "whisper_of_the_nathrezim", 137020 )
spec:RegisterAura( "whisper_of_the_nathrezim", {
id = 207633,
duration = 3600
} )
spec:RegisterGear( "justice_gaze", 137065 )
spec:RegisterGear( "ashes_to_dust", 51745 )
spec:RegisterAura( "ashes_to_dust", {
id = 236106,
duration = 6
} )
spec:RegisterGear( "aegisjalmur_the_armguards_of_awe", 140846 )
spec:RegisterGear( "chain_of_thrayn", 137086 )
spec:RegisterAura( "chain_of_thrayn", {
id = 236328,
duration = 3600
} )
spec:RegisterGear( "liadrins_fury_unleashed", 137048 )
spec:RegisterAura( "liadrins_fury_unleashed", {
id = 208410,
duration = 3600,
} )
spec:RegisterGear( "soul_of_the_highlord", 151644 )
spec:RegisterGear( "pillars_of_inmost_light", 151812 )
spec:RegisterGear( "scarlet_inquisitors_expurgation", 151813 )
spec:RegisterAura( "scarlet_inquisitors_expurgation", {
id = 248289,
duration = 3600,
max_stack = 3
} )
spec:RegisterHook( "prespend", function( amt, resource, overcap )
if resource == "holy_power" and amt < 0 and buff.holy_avenger.up then
return amt * 3, resource, overcap
end
end )
spec:RegisterHook( "spend", function( amt, resource )
if amt > 0 and resource == "holy_power" then
if talent.crusade.enabled and buff.crusade.up then
addStack( "crusade", buff.crusade.remains, amt )
end
if talent.fist_of_justice.enabled then
setCooldown( "hammer_of_justice", max( 0, cooldown.hammer_of_justice.remains - 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
if buff.relentless_inquisitor.stack < 6 then
stat.haste = stat.haste + 0.01
end
addStack( "relentless_inquisitor" )
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 )
spec:RegisterStateExpr( "time_to_hpg", function ()
return max( gcd.remains, min( cooldown.judgment.true_remains, cooldown.crusader_strike.true_remains, cooldown.blade_of_justice.true_remains, ( state:IsUsable( "hammer_of_wrath" ) and cooldown.hammer_of_wrath.true_remains or 999 ), cooldown.wake_of_ashes.true_remains, ( race.blood_elf and cooldown.arcane_torrent.true_remains or 999 ), ( covenant.kyrian and cooldown.divine_toll.true_remains or 999 ) ) )
end )
spec:RegisterHook( "reset_precast", function ()
--[[ Moved to hammer_of_wrath_hallow generator.
if IsUsableSpell( 24275 ) and not ( target.health_pct < 20 or buff.avenging_wrath.up or buff.crusade.up or buff.final_verdict.up ) then
applyBuff( "hammer_of_wrath_hallow", action.ashen_hallow.lastCast + 30 - now )
end ]]
end )
spec:RegisterStateFunction( "apply_aura", function( name )
removeBuff( "concentration_aura" )
removeBuff( "crusader_aura" )
removeBuff( "devotion_aura" )
removeBuff( "retribution_aura" )
if name then applyBuff( name ) end
end )
spec:RegisterStateFunction( "foj_cost", function( amt )
if buff.fires_of_justice.up then return max( 0, amt - 1 ) end
return amt
end )
-- Abilities
spec:RegisterAbilities( {
avenging_wrath = {
id = 31884,
cast = 0,
cooldown = function () return ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * ( level > 42 and 120 or 180 ) end,
gcd = "off",
toggle = "cooldowns",
notalent = "crusade",
startsCombat = true,
texture = 135875,
nobuff = "avenging_wrath",
handler = function ()
applyBuff( "avenging_wrath" )
applyBuff( "avenging_wrath_crit" )
end,
},
blade_of_justice = {
id = 184575,
cast = 0,
cooldown = function () return 12 * haste end,
gcd = "spell",
spend = -2,
spendType = "holy_power",
startsCombat = true,
texture = 1360757,
handler = function ()
removeBuff( "blade_of_wrath" )
removeBuff( "sacred_judgment" )
end,
},
blessing_of_freedom = {
id = 1044,
cast = 0,
charges = 1,
cooldown = 25,
recharge = 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,
charges = 1,
cooldown = 300,
recharge = 300,
gcd = "spell",
spend = 0.15,
spendType = "mana",
startsCombat = false,
texture = 135964,
readyTime = function () return debuff.forbearance.remains end,
handler = function ()
applyBuff( "blessing_of_protection" )
applyDebuff( "player", "forbearance" )
if talent.liadrins_fury_reborn.enabled then
gain( 5, "holy_power" )
end
end,
},
blinding_light = {
id = 115750,
cast = 0,
cooldown = 90,
gcd = "spell",
spend = 0.06,
spendType = "mana",
talent = "blinding_light",
startsCombat = true,
texture = 571553,
handler = function ()
applyDebuff( "target", "blinding_light", 6 )
active_dot.blinding_light = active_enemies
end,
},
cleanse_toxins = {
id = 213644,
cast = 0,
cooldown = 8,
gcd = "spell",
spend = 0.06,
spendType = "mana",
startsCombat = false,
texture = 135953,
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,
},
concentration_aura = {
id = 317920,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = false,
texture = 135933,
nobuff = "paladin_aura",
handler = function ()
apply_aura( "concentration_aura" )
end,
},
consecration = {
id = 26573,
cast = 0,
cooldown = 20,
gcd = "spell",
startsCombat = true,
texture = 135926,
handler = function ()
applyBuff( "consecration" )
end,
},
crusade = {
id = 231895,
cast = 0,
cooldown = 120,
gcd = "off",
talent = "crusade",
toggle = "cooldowns",
startsCombat = false,
texture = 236262,
nobuff = "crusade",
handler = function ()
applyBuff( "crusade" )
end,
},
crusader_aura = {
id = 32223,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = false,
texture = 135890,
nobuff = "paladin_aura",
handler = function ()
apply_aura( "crusader_aura" )
end,
},
crusader_strike = {
id = 35395,
cast = 0,
charges = 2,
cooldown = function () return 6 * ( talent.fires_of_justice.enabled and 0.85 or 1 ) * haste end,
recharge = function () return 6 * ( talent.fires_of_justice.enabled and 0.85 or 1 ) * 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" )
end,
},
devotion_aura = {
id = 465,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = false,
texture = 135893,
nobuff = "paladin_aura",
handler = function ()
apply_aura( "devotion_aura" )
end,
},
divine_shield = {
id = 642,
cast = 0,
cooldown = function () return 300 * ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) end,
gcd = "spell",
startsCombat = false,
texture = 524354,
readyTime = function () return debuff.forbearance.remains end,
handler = function ()
applyBuff( "divine_shield" )
applyDebuff( "player", "forbearance" )
if talent.liadrins_fury_reborn.enabled then
gain( 5, "holy_power" )
end
end,
},
divine_steed = {
id = 190784,
cast = 0,
charges = function () return talent.cavalier.enabled and 2 or nil end,
cooldown = function () return level > 48 and 30 or 45 end,
recharge = function () return level > 48 and 30 or 45 end,
gcd = "spell",
startsCombat = false,
texture = 1360759,
handler = function ()
applyBuff( "divine_steed" )
end,
},
divine_storm = {
id = 53385,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function ()
if buff.divine_purpose.up then return 0 end
if buff.empyrean_power.up then return 0 end
return 3 - ( buff.fires_of_justice.up and 1 or 0 ) - ( buff.hidden_retribution_t21_4p.up and 1 or 0 ) - ( buff.the_magistrates_judgment.up and 1 or 0 )
end,
spendType = "holy_power",
startsCombat = true,
texture = 236250,
handler = function ()
removeDebuff( "target", "judgment" )
if buff.empyrean_power.up or buff.divine_purpose.up then
removeBuff( "divine_purpose" )
removeBuff( "empyrean_power" )
else
removeBuff( "fires_of_justice" )
removeBuff( "hidden_retribution_t21_4p" )
end
if buff.avenging_wrath_crit.up then removeBuff( "avenging_wrath_crit" ) end
end,
},
execution_sentence = {
id = 343527,
cast = 0,
cooldown = 60,
gcd = "spell",
spend = function ()
if buff.divine_purpose.up then return 0 end
return 3 - ( buff.fires_of_justice.up and 1 or 0 ) - ( buff.hidden_retribution_t21_4p.up and 1 or 0 ) - ( buff.the_magistrates_judgment.up and 1 or 0 )
end,
spendType = "holy_power",
talent = "execution_sentence",
startsCombat = true,
texture = 613954,
handler = function ()
if buff.divine_purpose.up then removeBuff( "divine_purpose" )
else
removeBuff( "fires_of_justice" )
removeBuff( "hidden_retribution_t21_4p" )
end
applyDebuff( "target", "execution_sentence" )
end,
},
eye_for_an_eye = {
id = 205191,
cast = 0,
cooldown = 60,
gcd = "spell",
talent = "eye_for_an_eye",
startsCombat = false,
texture = 135986,
handler = function ()
applyBuff( "eye_for_an_eye" )
end,
},
final_reckoning = {
id = 343721,
cast = 0,
cooldown = 60,
gcd = "spell",
talent = "final_reckoning",
startsCombat = true,
texture = 135878,
toggle = "cooldowns",
handler = function ()
applyDebuff( "target", "final_reckoning" )
end,
},
flash_of_light = {
id = 19750,
cast = function () return ( 1.5 - ( buff.selfless_healer.stack * 0.5 ) ) * haste end,
cooldown = 0,
gcd = "spell",
spend = 0.22,
spendType = "mana",
startsCombat = false,
texture = 135907,
handler = function ()
removeBuff( "selfless_healer" )
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_reckoning = {
id = 247675,
cast = 0,
cooldown = 60,
gcd = "spell",
startsCombat = true,
-- texture = ???,
pvptalent = "hammer_of_reckoning",
usable = function () return buff.reckoning.stack >= 50 end,
handler = function ()
removeStack( "reckoning", 50 )
if talent.crusade.enabled then
applyBuff( "crusade", 12 )
else
applyBuff( "avenging_wrath", 6 )
end
end,
},
hammer_of_wrath = {
id = 24275,
cast = 0,
charges = function () return legendary.vanguards_momentum.enabled and 2 or nil end,
cooldown = function () return 7.5 * haste end,
recharge = function () return legendary.vanguards_momentum.enabled and ( 7.5 * haste ) or nil end,
gcd = "spell",
spend = -1,
spendType = "holy_power",
startsCombat = true,
texture = 613533,
usable = function () return target.health_pct < 20 or ( level > 57 and ( buff.avenging_wrath.up or buff.crusade.up ) ) or buff.final_verdict.up or buff.hammer_of_wrath_hallow.up or buff.negative_energy_token_proc.up end,
handler = function ()
removeBuff( "final_verdict" )
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
if legendary.vanguards_momentum.enabled then
addStack( "vanguards_momentum" )
end
end,
auras = {
vanguards_momentum = {
id = 345046,
duration = 10,
max_stack = 3
},
-- Power: 335069
negative_energy_token_proc = {
id = 345693,
duration = 5,
max_stack = 1,
},
}
},
hand_of_hindrance = {
id = 183218,
cast = 0,
cooldown = 30,
gcd = "spell",
spend = 0.1,
spendType = "mana",
startsCombat = true,
texture = 1360760,
handler = function ()
applyDebuff( "target", "hand_of_hindrance" )
end,
},
hand_of_reckoning = {
id = 62124,
cast = 0,
cooldown = 8,
gcd = "spell",
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 = "off",
toggle = "cooldowns",
talent = "holy_avenger",
startsCombat = true,
texture = 571555,
handler = function ()
applyBuff( "holy_avenger" )
end,
},
judgment = {
id = 20271,
cast = 0,
charges = 1,
cooldown = function () return 12 * haste end,
gcd = "spell",
spend = -1,
spendType = "holy_power",
startsCombat = true,
texture = 135959,
handler = function ()
applyDebuff( "target", "judgment" )
if talent.zeal.enabled then applyBuff( "zeal", 20, 3 ) end
if set_bonus.tier20_2pc > 0 then applyBuff( "sacred_judgment" ) end
if set_bonus.tier21_4pc > 0 then applyBuff( "hidden_retribution_t21_4p", 15 ) end
if talent.sacred_judgment.enabled then applyBuff( "sacred_judgment" ) end
if conduit.virtuous_command.enabled then applyBuff( "virtuous_command" ) end
end,
auras = {
virtuous_command = {
id = 339664,
duration = 6,
max_stack = 1
}
}
},
justicars_vengeance = {
id = 215661,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function ()
if buff.divine_purpose.up then return 0 end
return 5 - ( buff.fires_of_justice.up and 1 or 0 ) - ( buff.hidden_retribution_t21_4p.up and 1 or 0 ) - ( buff.the_magistrates_judgment.up and 1 or 0 )
end,
spendType = "holy_power",
startsCombat = true,
texture = 135957,
handler = function ()
if buff.divine_purpose.up then removeBuff( "divine_purpose" )
else
removeBuff( "fires_of_justice" )
removeBuff( "hidden_retribution_t21_4p" )
end
end,
},
lay_on_hands = {
id = 633,
cast = 0,
cooldown = function () return 600 * ( talent.unbreakable_spirit.enabled and 0.7 or 1 ) end,
gcd = "off",
startsCombat = false,
texture = 135928,
readyTime = function () return debuff.forbearance.remains end,
handler = function ()
gain( health.max, "health" )
applyDebuff( "player", "forbearance", 30 )
if talent.liadrins_fury_reborn.enabled then
gain( 5, "holy_power" )
end
if azerite.empyreal_ward.enabled then applyBuff( "empyreal_ward" ) end
end,
},
rebuke = {
id = 96231,
cast = 0,
cooldown = 15,
gcd = "off",
toggle = "interrupts",
startsCombat = true,
texture = 523893,
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
interrupt()
end,
},
redemption = {
id = 7328,
cast = function () return 10 * haste end,
cooldown = 0,
gcd = "spell",
spend = 0.04,
spendType = "mana",
startsCombat = true,
texture = 135955,
handler = function ()
end,
},
repentance = {
id = 20066,
cast = function () return 1.7 * haste end,
cooldown = 15,
gcd = "spell",
spend = 0.06,
spendType = "mana",
startsCombat = false,
texture = 135942,
handler = function ()
interrupt()
applyDebuff( "target", "repentance", 60 )
end,
},
retribution_aura = {
id = 183435,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = false,
texture = 135889,
nobuff = "paladin_aura",
handler = function ()
apply_aura( "retribution_aura" )
end,
},
seraphim = {
id = 152262,
cast = 0,
cooldown = 45,
gcd = "spell",
spend = function () return 3 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end,
spendType = "holy_power",
talent = "seraphim",
startsCombat = false,
texture = 1030103,
handler = function ()
applyBuff( "seraphim" )
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,
usable = function() return false end,
handler = function ()
applyBuff( "shield_of_the_righteous" )
-- TODO: Detect that we're wearing a shield.
-- Can probably use the same thing for Stormstrike requiring non-daggers, etc.
end,
},
shield_of_vengeance = {
id = 184662,
cast = 0,
cooldown = 120,
gcd = "spell",
startsCombat = true,
texture = 236264,
usable = function () return incoming_damage_3s > 0.2 * health.max, "incoming damage over 3s is less than 20% of max health" end,
handler = function ()
applyBuff( "shield_of_vengeance" )
end,
},
templars_verdict = {
id = 85256,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function ()
if buff.divine_purpose.up then return 0 end
return 3 - ( buff.fires_of_justice.up and 1 or 0 ) - ( buff.hidden_retribution_t21_4p.up and 1 or 0 ) - ( buff.the_magistrates_judgment.up and 1 or 0 )
end,
spendType = "holy_power",
startsCombat = true,
texture = 461860,
handler = function ()
removeDebuff( "target", "judgment" )
if buff.divine_purpose.up then removeBuff( "divine_purpose" )
else
removeBuff( "fires_of_justice" )
removeBuff( "hidden_retribution_t21_4p" )
end
if buff.vanquishers_hammer.up then removeBuff( "vanquishers_hammer" ) end
if buff.avenging_wrath_crit.up then removeBuff( "avenging_wrath_crit" ) end
if talent.righteous_verdict.enabled then applyBuff( "righteous_verdict" ) end
if talent.divine_judgment.enabled then addStack( "divine_judgment", 15, 1 ) end
removeStack( "vanquishers_hammer" )
end,
copy = { "final_verdict", 336872 }
},
vanquishers_hammer = {
id = 328204,
cast = 0,
cooldown = 30,
gcd = "spell",
spend = function () return 1 - ( buff.the_magistrates_judgment.up and 1 or 0 ) end,
spendType = "holy_power",
startsCombat = true,
texture = 3578228,
handler = function ()
applyBuff( "vanquishers_hammer" )
end,
auras = {
vanquishers_hammer = {
id = 328204,
duration = 20,
max_stack = 1,
}
}
},
wake_of_ashes = {
id = 255937,
cast = 0,
cooldown = 45,
gcd = "spell",
spend = -3,
spendType = "holy_power",
startsCombat = true,
texture = 1112939,
usable = function ()
if settings.check_wake_range and not ( target.exists and target.within12 ) then return false, "target is outside of 12 yards" end
return true
end,
handler = function ()
if target.is_undead or target.is_demon then applyDebuff( "target", "wake_of_ashes" ) end
if talent.divine_judgment.enabled then addStack( "divine_judgment", 15, 1 ) end
if conduit.truths_wake.enabled then applyDebuff( "target", "truths_wake" ) end
end,
},
--[[ wartime_ability = {
id = 264739,
cast = 0,
cooldown = 0,
gcd = "spell",
startsCombat = true,
texture = 1518639,
handler = function ()
end,
}, ]]
word_of_glory = {
id = 85673,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function ()
if buff.divine_purpose.up then return 0 end
return 3 - ( buff.fires_of_justice.up and 1 or 0 ) - ( buff.hidden_retribution_t21_4p.up and 1 or 0 ) - ( buff.the_magistrates_judgment.up and 1 or 0 )
end,
spendType = "holy_power",
startsCombat = false,
texture = 133192,
handler = function ()
if buff.divine_purpose.up then removeBuff( "divine_purpose" )
else
removeBuff( "fires_of_justice" )
removeBuff( "hidden_retribution_t21_4p" )
end
gain( 1.33 * stat.spell_power * 8, "health" )
if conduit.shielding_words.enabled then applyBuff( "shielding_words" ) end
end,
},
} )
spec:RegisterOptions( {
enabled = true,
aoe = 3,
nameplates = true,
nameplateRange = 8,
damage = true,
damageExpiration = 8,
potion = "spectral_strength",
package = "Retribution",
} )
spec:RegisterSetting( "check_wake_range", false, {
name = "Check |T1112939:0|t Wake of Ashes Range",
desc = "If checked, when your target is outside of |T1112939:0|t Wake of Ashes' range, it will not be recommended.",
type = "toggle",
width = 1.5
} )
4 years ago
spec:RegisterPack( "Retribution", 20220226, [[dG0j9bqibQhHKkztKuFcPYOqQ6ueOvjkXRufAwQcUfsQu1Uq1VufzyiHogjPLrapdjLPjkPRHeSnvrX3ijKXjG4CQIsRtvunpb4EG0(qsoOaszHIs9qKu1frsLYgrsLkFuajDsKuHvIentsc2POWpfqQmubKQwksQONsktvu0xfqIXss0Ef6VImyGdlzXc6XenzQ6YqBguFMunAvPtRYQfq9AKIztLBtIDt53kgUO64KeQLJ45OmDPUUQA7e03bX4fiNhP08j0(v6OQXmJA(QXygcqrbeGIciWZWfGAu7zunQ10MJrT8sstPJrnRuWOg1j2Kl833yrT8Iw3u(yMrn28jsmQf1c)NRPoSyyuZxngZqakkGauuabEgUauJAuJAptuJLJYygQikg1EpVhTyyuZJmzuJ6eBYf(7BSfeOVCL)SLsQ7WqYVi0UabOWdlqakkGalLlLu)Bz6i75lLu3VaQdRrDs14cmeYcYj3qUM2fWYDxVayYOSaTtH65rTCYaFomQrDrDTaQtSjx4VVXwqG(Yv(ZwkPUOUwa1Dyi5xeAxGau4HfiaffqGLYLsQlQRfq9VLPJSNVusDrDTaQ7xa1H1OoPACbgczb5KBixt7cy5URxamzuwG2Pq98LYLYs23ymEobLJsy1qZN(gBPSK9ngJNtq5Oew9JqFk0Hm2z6PboX(kkizPSK9ngJNtq5Oew9JqFk0Hm2z6Pbov)(RylLLSVXy8CckhLWQFe6tHoKXotpnWjiN1izPSK9ngJNtq5Oew9JqFk0Hm2z6PboXYjNPVuwY(gJXZjOCucR(rOpb7q2RKuW9dhmu28DHN555Fw)Dycj)8(gtuKnFx4zEUWXv95WeBCcrRxklzFJX45euokHv)i0NkISmm1dHGw)WbdTlhAnh(SYLiOKMXotNJwf6qV6UCO1CgsQ83tHJwf6q)szj7BmgpNGYrjS6hH(e79qNpnWjHOPJLjXLYLsQlQRfqDliu(B0VauisODb9PGlOFXfuYEil4ylOewNRcDiFPSK9ngdkbd)0GlLLSVXypc9jz5CPs23yj3X6hSsbHkNX5higBPSK9ng7rOpjlNlvY(gl5ow)GvkiuKLGjP8zCNP)WbdL(Gj15tOq0AE59mog0XAMOiPoFcfIwZlVNX)5IIK68juiAnV8Eg)SaEwrrsD(ekeTMxEpJFgvuJIcQM(UCO1Cmiu(7BSedTgnjQwoJZpqmogek)9nwIHwJMe5euPoJfWZQMLJoxQlIo2mU)eEgMy9qucGcIID5qR5WNvUebL0m2z6QLZ48deJdFw5seusZyNPZjOsDglGNvq1Dr0XM3NcM6j5pKQazPSK9ng7rOpjlNlvY(gl5ow)GvkiuKLGjPs2Nq8bwtozdv1hoyOEm8ddZXGq5VVXsm0A0Ki)Nlk6XWpmmh(SYLiOKMXotN)ZxklzFJXEe6tYY5sLSVXsUJ1pyLccvhnKu9qylLlLLSVXyC5mo)aXyqZN(g7HdgA4hgMxcrt)m9ees1V8FUOy4hgMljFw5r(pxD4hgMljFw5roRljnqvLIIIHdJPg(0F7ebvQZybiafwklzFJX4YzC(bIXEe6tUt)TzPa)96kO1pCWqz5OZL6IOJnJ7o93MLc83RRGwtfubefdMuNpHcrR5L3Z4yqhRzIIK68juiAnV8Eg)mQuruquKuNpHcrR5L3Z4)8LYs23ymUCgNFGyShH(e8rWq3m(hoyO0h(HH5Lq00ptpbHu9l)Nlkg(HH5sYNvEK)Zvh(HH5sYNvEKZ6ssduvPOGQdUlhAnhdcL)(glXqRrtIlLLSVXyC5mo)aXypc9jyhYELKcUF4GHYMVl8mpp)Z6Vdti5N33yIIS57cpZZfoUQphMyJtiA9dN1iH8Z70POG(RAeQQpCwJeYpVt6UjSCqv9HZAKq(5D6GHYMVl8mpx44Q(CyInoHO1lLLSVXyC5mo)aXypc9j27HoFAGtcrthltIpCWqPp4UCO1Cmiu(7BSedTgnjkkkNX5highdcL)(glXqRrtICcQuNXcGcciOA4t)TteuPoJrLQuyPSK9ngJlNX5hig7rOpf6qg7m90aNyFffKSuwY(gJXLZ48deJ9i0NcDiJDMEAGt1V)k2szj7BmgxoJZpqm2JqFk0Hm2z6Pbob5SgjlLLSVXyC5mo)aXypc9PqhYyNPNg4elNCM(szj7BmgxoJZpqm2JqF6ZW01OYdwPGqpJjj)UcDysf)lR)kjpk8K4dhm0WpmmVeIM(z6jiKQF5)CrXWpmmxs(SYJ8FU6Wpmmxs(SYJCwxsAGQkfffdhgtn8P)2jcQuNXcGAuCPSK9ngJlNX5hig7rOp9zy6Au5bRuqOJqKa5fDkNPNYhiijjj0Y6Y9Wbdn8ddZlHOPFMEccP6x(pxum8ddZLKpR8i)NRo8ddZLKpR8iN1LKgOQsrrXWHXudF6VDIGk1zSauLclLLSVXyC5mo)aXypc9PpdtxJkpyLcc1xeAuMXsEusts4qk510(Wbdn8ddZlHOPFMEccP6x(pxum8ddZLKpR8i)NRo8ddZLKpR8iN1LKgOQsrrXWHXudF6VDIGk1zSaeGIlLLSVXyC5mo)aXypc9PpdtxJkpyLccvPKvibtSxe7KYNDYhoyOHFyyEjen9Z0tqiv)Y)5IIHFyyUK8zLh5)C1HFyyUK8zLh5SUK0avvkkkgomMA4t)TteuPoJfGauCPSK9ngJlNX5hig7rOp9zy6Au5bRuqOW1310MKZ3AKOGf7tWhoyOb3LdTMljFw5rrXWpmmxs(SYJ8FUOy4WyQHp93orqL6mwauJIlLLSVXyC5mo)aXypc9PpdtxJkpyLcc1tWYdFemjezm0TuwY(gJXLZ48deJ9i0N(mmDnQ8GvkiugnFhniHLGCM(szj7BmgxoJZpqm2JqF6ZW01OYdwPGq1jNssoEmOLYs23ymUCgNFGyShH(0NHPRrLhSsbHQGkdH20aNYlwNyNXwklzFJX4YzC(bIXEe6tFgMUgvEWkfeklViysbRo9odnlLLSVXyC5mo)aXypc9PpdtxJkpyLccLvoHLo6tWF2nwQuYDh8HKLYs23ymUCgNFGyShH(0NHPRrLhSsbHQFL1PHyLcAD5s5yrClLLSVXyC5mo)aXypc9PpdtxJkpyLccfYzEMSijiVyZ6XWLYs23ymUCgNFGyShH(0NHPRrLhSsbHYKfHLg4emPAKyLlXAYbJlLLSVXyC5mo)aXypc9PpdtxJkpyLccv(wNXsdCYpkNv9n2szj7BmgxoJZpqm2JqF6ZW01OYdwPGqXI0VHeSObjS0PKxYEPSK9ngJlNX5hig7rOp9zy6Au5bRuqOVyr60aN6xmXGueLhoyObh(HH5Lq00ptpbHu9l)NRo8ddZLKpR8i)NVuwY(gJXLZ48deJ9i0N(mmDnQ8GvkiuDx5VQhclfwED8HdgA4hgMxcrt)m9ees1V8FUOy4hgMljFw5r(pxD4hgMljFw5roRljnubvvkkkkNX5higVeIM(z6jiKQF5euPoJrvwPGOOCgNFGyCj5ZkpYjOsDgJQSsHLYs23ymUCgNFGyShH(0NHPRrf2dhm0WpmmVeIM(z6jiKQF5)CrXWpmmxs(SYJ8FU6Wpmmxs(SYJCwxsAOcQQuCPSK9ngJlNX5hig7rOpvcrt)m9ees1VpCWqP)DC0MYhiiHkOzvDFkyauqu8DC0MYhiiHkOutn99PGurbrrY3q4HOJ8(ftkL(XAs1ilf4VxxbTwqrX3XrBkFGGeQGkGAY3q4HOJCHLP)lINLugf06VI6UCO1C4ZkxIGsAg7mDrXUCO183XrBQeIMosulNX5hig)DC0MkHOPJeobvQZyqPOGQPp4UCO1CgsQ83trum4UCO1C4ZkxIGsAg7mDrr5mo)aX4mKu5VNcNGk1zmQOOGlLLSVXyC5mo)aXypc9jj5Zkp(Wbd9DC0MYhiiHkOzvDFkyauqu8DC0MYhiiHkOutDFkivuyPSK9ngJlNX5hig7rOpvSx0sVLZnqwklzFJX4YzC(bIXEe6tVJJ2ujenDK8WbdTpfm1t6n
4 years ago
end