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.

1378 lines
74 KiB

5 years ago
-- DeathKnightFrost.lua
-- June 2018
local addon, ns = ...
local Hekili = _G[ addon ]
local class = Hekili.Class
local state = Hekili.State
local PTR = ns.PTR
-- Conduits
-- [x] Accelerated Cold
-- [x] Biting Cold
-- [x] Eradicating Blow
-- [x] Unleashed Frenzy
if UnitClassBase( "player" ) == "DEATHKNIGHT" then
local spec = Hekili:NewSpecialization( 251 )
spec:RegisterResource( Enum.PowerType.Runes, {
rune_regen = {
last = function ()
return state.query_time
end,
interval = function( time, val )
local r = state.runes
if val == 6 then return -1 end
return r.expiry[ val + 1 ] - time
end,
stop = function( x )
return x == 6
end,
value = 1
},
empower_rune = {
aura = "empower_rune_weapon",
last = function ()
return state.buff.empower_rune_weapon.applied + floor( state.query_time - state.buff.empower_rune_weapon.applied )
end,
stop = function ( x )
return x == 6
end,
interval = 5,
value = 1
},
}, setmetatable( {
expiry = { 0, 0, 0, 0, 0, 0 },
cooldown = 10,
regen = 0,
max = 6,
forecast = {},
fcount = 0,
times = {},
values = {},
resource = "runes",
reset = function()
local t = state.runes
for i = 1, 6 do
local start, duration, ready = GetRuneCooldown( i )
start = start or 0
duration = duration or ( 10 * state.haste )
t.expiry[ i ] = ready and 0 or start + duration
t.cooldown = duration
end
table.sort( t.expiry )
t.actual = nil
end,
gain = function( amount )
local t = state.runes
for i = 1, amount do
t.expiry[ 7 - i ] = 0
end
table.sort( t.expiry )
t.actual = nil
end,
spend = function( amount )
local t = state.runes
for i = 1, amount do
t.expiry[ 1 ] = ( t.expiry[ 4 ] > 0 and t.expiry[ 4 ] or state.query_time ) + t.cooldown
table.sort( t.expiry )
end
state.gain( amount * 10, "runic_power" )
if state.talent.gathering_storm.enabled and state.buff.remorseless_winter.up then
state.buff.remorseless_winter.expires = state.buff.remorseless_winter.expires + ( 0.5 * amount )
end
t.actual = nil
end,
timeTo = function( x )
return state:TimeToResource( state.runes, x )
end,
}, {
__index = function( t, k, v )
if k == "actual" then
local amount = 0
for i = 1, 6 do
if t.expiry[ i ] <= state.query_time then
amount = amount + 1
end
end
return amount
elseif k == "current" then
-- If this is a modeled resource, use our lookup system.
if t.forecast and t.fcount > 0 then
local q = state.query_time
local index, slice
if t.values[ q ] then return t.values[ q ] end
for i = 1, t.fcount do
local v = t.forecast[ i ]
if v.t <= q then
index = i
slice = v
else
break
end
end
-- We have a slice.
if index and slice then
t.values[ q ] = max( 0, min( t.max, slice.v ) )
return t.values[ q ]
end
end
return t.actual
elseif k == "deficit" then
return t.max - t.current
elseif k == "time_to_next" then
return t[ "time_to_" .. t.current + 1 ]
elseif k == "time_to_max" then
return t.current == 6 and 0 or max( 0, t.expiry[6] - state.query_time )
elseif k == "add" then
return t.gain
else
local amount = k:match( "time_to_(%d+)" )
amount = amount and tonumber( amount )
if amount then return state:TimeToResource( t, amount ) end
end
end
} ) )
spec:RegisterResource( Enum.PowerType.RunicPower, {
breath = {
talent = "breath_of_sindragosa",
aura = "breath_of_sindragosa",
last = function ()
return state.buff.breath_of_sindragosa.applied + floor( state.query_time - state.buff.breath_of_sindragosa.applied )
end,
stop = function ( x ) return x < 16 end,
interval = 1,
value = -16
},
empower_rp = {
aura = "empower_rune_weapon",
last = function ()
return state.buff.empower_rune_weapon.applied + floor( state.query_time - state.buff.empower_rune_weapon.applied )
end,
interval = 5,
value = 5
},
swarming_mist = {
aura = "swarming_mist",
last = function ()
return state.buff.swarming_mist.applied + floor( state.query_time - state.buff.swarming_mist.applied )
end,
interval = 1,
value = function () return min( 15, state.true_active_enemies * 3 ) end,
},
} )
local virtual_rp_spent_since_pof = 0
local spendHook = function( amt, resource, noHook )
if amt > 0 and resource == "runic_power" and buff.breath_of_sindragosa.up and runic_power.current < 16 then
removeBuff( "breath_of_sindragosa" )
end
if amt > 0 and resource == "runes" and active_dot.shackle_the_unworthy > 0 then
reduceCooldown( "shackle_the_unworthy", 4 * amt )
end
end
spec:RegisterHook( "spend", spendHook )
-- Talents
spec:RegisterTalents( {
inexorable_assault = 22016, -- 253593
icy_talons = 22017, -- 194878
cold_heart = 22018, -- 281208
runic_attenuation = 22019, -- 207104
murderous_efficiency = 22020, -- 207061
horn_of_winter = 22021, -- 57330
deaths_reach = 22515, -- 276079
asphyxiate = 22517, -- 108194
blinding_sleet = 22519, -- 207167
avalanche = 22521, -- 207142
frozen_pulse = 22523, -- 194909
frostscythe = 22525, -- 207230
permafrost = 22527, -- 207200
wraith_walk = 22530, -- 212552
death_pact = 23373, -- 48743
gathering_storm = 22531, -- 194912
hypothermic_presence = 22533, -- 321995
glacial_advance = 22535, -- 194913
icecap = 22023, -- 207126
obliteration = 22109, -- 281238
breath_of_sindragosa = 22537, -- 152279
} )
-- PvP Talents
spec:RegisterPvpTalents( {
bitter_chill = 5435, -- 356470
chill_streak = 706, -- 305392
dark_simulacrum = 3512, -- 77606
dead_of_winter = 3743, -- 287250
deathchill = 701, -- 204080
deaths_echo = 5427, -- 356367
delirium = 702, -- 233396
dome_of_ancient_shadow = 5369, -- 328718
shroud_of_winter = 3439, -- 199719
spellwarden = 5424, -- 356332
strangulate = 5429, -- 47476
} )
-- Auras
spec:RegisterAuras( {
antimagic_shell = {
id = 48707,
duration = function () return ( legendary.deaths_embrace.enabled and 2 or 1 ) * 5 + ( conduit.reinforced_shell.mod * 0.001 ) end,
max_stack = 1,
},
antimagic_zone = {
id = 145629,
duration = 8,
max_stack = 1,
},
asphyxiate = {
id = 108194,
duration = 4,
max_stack = 1,
},
blinding_sleet = {
id = 207167,
duration = 5,
max_stack = 1,
},
breath_of_sindragosa = {
id = 152279,
duration = 3600,
max_stack = 1,
dot = "buff"
},
chains_of_ice = {
id = 45524,
duration = 8,
max_stack = 1,
},
cold_heart_item = {
id = 235599,
duration = 3600,
max_stack = 20
},
cold_heart_talent = {
id = 281209,
duration = 3600,
max_stack = 20,
},
cold_heart = {
alias = { "cold_heart_item", "cold_heart_talent" },
aliasMode = "first",
aliasType = "buff",
duration = 3600,
max_stack = 20,
},
dark_command = {
id = 56222,
duration = 3,
max_stack = 1,
},
dark_succor = {
id = 101568,
duration = 20,
},
death_and_decay = {
id = 43265,
duration = 10,
max_stack = 1,
},
death_pact = {
id = 48743,
duration = 15,
max_stack = 1,
},
deaths_advance = {
id = 48265,
duration = 10,
max_stack = 1,
},
empower_rune_weapon = {
id = 47568,
duration = 20,
max_stack = 1,
},
frost_breath = {
id = 279303,
duration = 10,
type = "Magic",
max_stack = 1,
},
frost_fever = {
id = 55095,
duration = 30,
type = "Disease",
max_stack = 1,
},
frost_shield = {
id = 207203,
duration = 10,
max_stack = 1,
},
frostwyrms_fury = {
id = 279303,
duration = 10,
type = "Magic",
max_stack = 1,
},
frozen_pulse = {
-- pseudo aura for talent.
name = "Frozen Pulse",
meta = {
up = function () return runes.current < 3 end,
down = function () return runes.current >= 3 end,
stack = function () return runes.current < 3 and 1 or 0 end,
duration = 15,
remains = function () return runes.time_to_3 end,
applied = function () return runes.current < 3 and query_time or 0 end,
expires = function () return runes.current < 3 and ( runes.time_to_3 + query_time ) or 0 end,
}
},
gathering_storm = {
id = 211805,
duration = 3600,
max_stack = 9,
},
hypothermic_presence = {
id = 321995,
duration = 8,
max_stack = 1,
},
icebound_fortitude = {
id = 48792,
duration = 8,
max_stack = 1,
},
icy_talons = {
id = 194879,
duration = 6,
max_stack = 3,
},
inexorable_assault = {
id = 253595,
duration = 3600,
max_stack = 5,
},
killing_machine = {
id = 51124,
duration = 10,
max_stack = 1,
},
lichborne = {
id = 49039,
duration = 10,
max_stack = 1,
},
obliteration = {
id = 281238,
},
on_a_pale_horse = {
id = 51986,
},
path_of_frost = {
id = 3714,
duration = 600,
max_stack = 1,
},
pillar_of_frost = {
id = 51271,
duration = 12,
max_stack = 1,
},
razorice = {
id = 51714,
duration = 26,
max_stack = 5,
},
remorseless_winter = {
id = 196770,
duration = 8,
max_stack = 1,
},
rime = {
id = 59052,
duration = 15,
type = "Magic",
max_stack = 1,
},
runic_empowerment = {
id = 81229,
},
unholy_strength = {
id = 53365,
duration = 15,
max_stack = 1,
},
wraith_walk = {
id = 212552,
duration = 4,
type = "Magic",
max_stack = 1,
},
-- PvP Talents
-- Chill Streak
chilled = {
id = 204206,
duration = 4,
max_stack = 1
},
dead_of_winter = {
id = 289959,
duration = 4,
max_stack = 5,
},
deathchill = {
id = 204085,
duration = 4,
max_stack = 1
},
delirium = {
id = 233396,
duration = 15,
max_stack = 1,
},
shroud_of_winter = {
id = 199719,
duration = 3600,
max_stack = 1,
},
lichborne = {
id = 287081,
duration = 10,
max_stack = 1,
},
-- Azerite Powers
cold_hearted = {
id = 288426,
duration = 8,
max_stack = 1
},
frostwhelps_indignation = {
id = 287338,
duration = 6,
max_stack = 1,
},
} )
spec:RegisterGear( "acherus_drapes", 132376 )
spec:RegisterGear( "aggramars_stride", 132443 )
spec:RegisterGear( "cold_heart", 151796 ) -- chilled_heart stacks NYI
spec:RegisterAura( "cold_heart_item", {
id = 235599,
duration = 3600,
max_stack = 20
} )
spec:RegisterGear( "consorts_cold_core", 144293 )
spec:RegisterGear( "kiljaedens_burning_wish", 144259 )
spec:RegisterGear( "koltiras_newfound_will", 132366 )
spec:RegisterGear( "perseverance_of_the_ebon_martyr", 132459 )
spec:RegisterGear( "rethus_incessant_courage", 146667 )
spec:RegisterGear( "seal_of_necrofantasia", 137223 )
spec:RegisterGear( "shackles_of_bryndaor", 132365 ) -- NYI
spec:RegisterGear( "soul_of_the_deathlord", 151640 )
spec:RegisterGear( "toravons_whiteout_bindings", 132458 )
spec:RegisterTotem( "ghoul", 1100170 )
local any_dnd_set = false
spec:RegisterHook( "reset_precast", function ()
if state:IsKnown( "deaths_due" ) then
class.abilities.any_dnd = class.abilities.deaths_due
cooldown.any_dnd = cooldown.deaths_due
setCooldown( "death_and_decay", cooldown.deaths_due.remains )
elseif state:IsKnown( "defile" ) then
class.abilities.any_dnd = class.abilities.defile
cooldown.any_dnd = cooldown.defile
setCooldown( "death_and_decay", cooldown.defile.remains )
else
class.abilities.any_dnd = class.abilities.death_and_decay
cooldown.any_dnd = cooldown.death_and_decay
end
if not any_dnd_set then
class.abilityList.any_dnd = "|T136144:0|t |cff00ccff[Any]|r " .. class.abilities.death_and_decay.name
any_dnd_set = true
end
local control_expires = action.control_undead.lastCast + 300
if control_expires > now and pet.up then
summonPet( "controlled_undead", control_expires - now )
end
-- Reset CDs on any Rune abilities that do not have an actual cooldown.
for action in pairs( class.abilityList ) do
local data = class.abilities[ action ]
if data.cooldown == 0 and data.spendType == "runes" then
setCooldown( action, 0 )
end
end
end )
-- Abilities
spec:RegisterAbilities( {
antimagic_shell = {
id = 48707,
cast = 0,
cooldown = 60,
gcd = "spell",
toggle = "defensives",
startsCombat = false,
texture = 136120,
handler = function ()
applyBuff( "antimagic_shell" )
end,
},
antimagic_zone = {
id = 51052,
cast = 0,
cooldown = 180,
gcd = "spell",
toggle = "defensives",
startsCombat = false,
texture = 237510,
handler = function ()
applyBuff( "antimagic_zone" )
end,
},
asphyxiate = {
id = 108194,
cast = 0,
cooldown = 45,
gcd = "spell",
startsCombat = true,
texture = 538558,
toggle = "interrupts",
talent = "asphyxiate",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
applyDebuff( "target", "asphyxiate" )
interrupt()
end,
},
blinding_sleet = {
id = 207167,
cast = 0,
cooldown = 60,
gcd = "spell",
startsCombat = true,
texture = 135836,
talent = "blinding_sleet",
handler = function ()
applyDebuff( "target", "blinding_sleet" )
active_dot.blinding_sleet = max( active_dot.blinding_sleet, active_enemies )
end,
},
breath_of_sindragosa = {
id = 152279,
cast = 0,
cooldown = 120,
gcd = "spell",
spend = 16,
readySpend = function () return settings.bos_rp end,
spendType = "runic_power",
toggle = "cooldowns",
startsCombat = true,
texture = 1029007,
handler = function ()
gain( 2, "runes" )
applyBuff( "breath_of_sindragosa" )
end,
},
chains_of_ice = {
id = 45524,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = true,
texture = 135834,
handler = function ()
applyDebuff( "target", "chains_of_ice" )
removeBuff( "cold_heart_item" )
removeBuff( "cold_heart_talent" )
end,
},
chill_streak = {
id = 305392,
cast = 0,
cooldown = 45,
gcd = "spell",
pvptalent = function ()
if essence.conflict_and_strife.major then return end
return "chill_streak"
end,
handler = function ()
applyDebuff( "target", "chilled" )
end,
},
control_undead = {
id = 111673,
cast = 1.5,
hasteCD = true,
cooldown = 0,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = false,
texture = 237273,
usable = function () return target.is_undead and target.level <= level + 1, "requires undead target up to 1 level above player" end,
handler = function ()
summonPet( "controlled_undead", 300 )
end,
},
dark_command = {
id = 56222,
cast = 0,
cooldown = 8,
gcd = "off",
startsCombat = true,
texture = 136088,
handler = function ()
applyDebuff( "target", "dark_command" )
end,
},
dark_simulacrum = {
id = 77606,
cast = 0,
cooldown = 20,
gcd = "spell",
startsCombat = true,
texture = 135888,
pvptalent = "dark_simulacrum",
usable = function ()
if not target.is_player then return false, "target is not a player" end
return true
end,
handler = function ()
applyDebuff( "target", "dark_simulacrum" )
end,
},
death_and_decay = {
id = 43265,
noOverride = 324128,
cast = 0,
cooldown = 30,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = true,
texture = 136144,
handler = function ()
applyBuff( "death_and_decay" )
end,
},
death_coil = {
id = 47541,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function () return ( buff.hypothermic_presence.up and 0.65 or 1 ) * 40 end,
spendType = "runic_power",
startsCombat = true,
texture = 136145,
handler = function ()
end,
},
--[[ death_gate = {
id = 50977,
cast = 4,
hasteCD = true,
cooldown = 60,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = false,
texture = 135766,
handler = function ()
end,
}, ]]
death_grip = {
id = 49576,
cast = 0,
cooldown = 25,
gcd = "spell",
startsCombat = true,
texture = 237532,
handler = function ()
applyDebuff( "target", "death_grip" )
setDistance( 5 )
if conduit.unending_grip.enabled then applyDebuff( "target", "unending_grip" ) end
end,
},
death_pact = {
id = 48743,
cast = 0,
cooldown = 120,
gcd = "spell",
toggle = "defensives",
startsCombat = false,
texture = 136146,
talent = "death_pact",
handler = function ()
gain( health.max * 0.5, "health" )
applyDebuff( "player", "death_pact" )
end,
},
death_strike = {
id = 49998,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function ()
if buff.dark_succor.up then return 0 end
return 35 * ( buff.hypothermic_presence.up and 0.65 or 1 )
end,
spendType = "runic_power",
startsCombat = true,
texture = 237517,
handler = function ()
gain( health.max * 0.10, "health" )
end,
},
deaths_advance = {
id = 48265,
cast = 0,
cooldown = 45,
gcd = "off",
startsCombat = false,
texture = 237561,
handler = function ()
applyBuff( "deaths_advance" )
if conduit.fleeting_wind.enabled then applyBuff( "fleeting_wind" ) end
end,
},
empower_rune_weapon = {
id = 47568,
cast = 0,
charges = 1,
cooldown = function () return ( conduit.accelerated_cold.enabled and 0.9 or 1 ) * ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * ( level > 55 and 105 or 120 ) end,
recharge = function () return ( conduit.accelerated_cold.enabled and 0.9 or 1 ) * ( essence.vision_of_perfection.enabled and 0.87 or 1 ) * ( level > 55 and 105 or 120 ) end,
gcd = "off",
toggle = "cooldowns",
startsCombat = false,
texture = 135372,
nobuff = "empower_rune_weapon",
handler = function ()
stat.haste = state.haste + 0.15 + ( conduit.accelerated_cold.mod * 0.01 )
gain( 1, "runes" )
gain( 5, "runic_power" )
applyBuff( "empower_rune_weapon" )
end,
copy = "empowered_rune_weapon" -- typo often in SimC APL.
},
frost_strike = {
id = 49143,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function () return ( buff.hypothermic_presence.up and 0.65 or 1 ) * 25 end,
spendType = "runic_power",
startsCombat = true,
texture = 237520,
cycle = function ()
if death_knight.runeforge.razorice then return "razorice" end
end,
handler = function ()
applyDebuff( "target", "razorice", 20, 2 )
if talent.obliteration.enabled and buff.pillar_of_frost.up then applyBuff( "killing_machine" ) end
removeBuff( "eradicating_blow" )
if conduit.unleashed_frenzy.enabled then addStack( "eradicating_frenzy", nil, 1 ) end
if pvptalent.bitter_chill.enabled and debuff.chains_of_ice.up then
applyDebuff( "target", "chains_of_ice" )
end
end,
auras = {
unleashed_frenzy = {
id = 338501,
duration = 6,
max_stack = 5,
}
}
},
frostscythe = {
id = 207230,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = true,
texture = 1060569,
talent = "frostscythe",
range = 7,
handler = function ()
removeBuff( "killing_machine" )
removeStack( "inexorable_assault" )
end,
},
frostwyrms_fury = {
id = 279302,
cast = 0,
cooldown = function () return legendary.absolute_zero.enabled and 90 or 180 end,
gcd = "spell",
toggle = "cooldowns",
startsCombat = true,
texture = 341980,
handler = function ()
applyDebuff( "target", "frost_breath" )
if legendary.absolute_zero.enabled then applyDebuff( "target", "absolute_zero" ) end
end,
auras = {
-- Legendary.
absolute_zero = {
id = 334693,
duration = 3,
max_stack = 1,
}
}
},
glacial_advance = {
id = 194913,
cast = 0,
cooldown = 6,
hasteCD = true,
gcd = "spell",
spend = function () return ( buff.hypothermic_presence.up and 0.65 or 1 ) * 30 end,
spendType = "runic_power",
startsCombat = true,
texture = 537514,
handler = function ()
applyDebuff( "target", "razorice", nil, 1 )
end,
},
horn_of_winter = {
id = 57330,
cast = 0,
cooldown = 45,
gcd = "spell",
startsCombat = true,
texture = 134228,
talent = "horn_of_winter",
handler = function ()
gain( 2, "runes" )
gain( 25, "runic_power" )
end,
},
howling_blast = {
id = 49184,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function () return buff.rime.up and 0 or 1 end,
spendType = "runes",
startsCombat = true,
texture = 135833,
handler = function ()
applyDebuff( "target", "frost_fever" )
active_dot.frost_fever = max( active_dot.frost_fever, active_enemies )
if talent.obliteration.enabled and buff.pillar_of_frost.up then applyBuff( "killing_machine" ) end
if pvptalent.delirium.enabled then applyDebuff( "target", "delirium" ) end
if legendary.rage_of_the_frozen_champion.enabled and buff.rime.up then
gain( 8, "runic_power" )
end
removeBuff( "rime" )
end,
},
hypothermic_presence = {
id = 321995,
cast = 0,
cooldown = 45,
gcd = "spell",
startsCombat = true,
texture = 236224,
handler = function ()
applyBuff( "hypothermic_presence" )
end,
},
icebound_fortitude = {
id = 48792,
cast = 0,
cooldown = function () return 180 - ( azerite.cold_hearted.enabled and 15 or 0 ) + ( conduit.chilled_resilience.mod * 0.001 ) end,
gcd = "spell",
toggle = "defensives",
startsCombat = false,
texture = 237525,
handler = function ()
applyBuff( "icebound_fortitude" )
end,
},
lichborne = {
id = 49039,
cast = 0,
cooldown = 120,
gcd = "off",
startsCombat = false,
texture = 136187,
toggle = "defensives",
handler = function ()
applyBuff( "lichborne" )
if conduit.hardened_bones.enabled then applyBuff( "hardened_bones" ) end
end,
},
mind_freeze = {
id = 47528,
cast = 0,
cooldown = 15,
gcd = "spell",
startsCombat = true,
texture = 237527,
toggle = "interrupts",
debuff = "casting",
readyTime = state.timeToInterrupt,
handler = function ()
if conduit.spirit_drain.enabled then gain( conduit.spirit_drain.mod * 0.1, "runic_power" ) end
interrupt()
end,
},
obliterate = {
id = 49020,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 2,
spendType = "runes",
startsCombat = true,
texture = 135771,
cycle = function ()
if death_knight.runeforge.razorice then return "razorice" end
end,
handler = function ()
removeStack( "inexorable_assault" )
-- Koltira's Favor is not predictable.
if conduit.eradicating_blow.enabled then addStack( "eradicating_blow", nil, 1 ) end
end,
auras = {
-- Conduit
eradicating_blow = {
id = 337936,
duration = 10,
max_stack = 2
}
}
},
path_of_frost = {
id = 3714,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = false,
texture = 237528,
handler = function ()
applyBuff( "path_of_frost" )
end,
},
pillar_of_frost = {
id = 51271,
cast = 0,
cooldown = 60,
gcd = "off",
startsCombat = false,
texture = 458718,
handler = function ()
applyBuff( "pillar_of_frost" )
if azerite.frostwhelps_indignation.enabled then applyBuff( "frostwhelps_indignation" ) end
virtual_rp_spent_since_pof = 0
end,
},
--[[ raise_ally = {
id = 61999,
cast = 0,
cooldown = 600,
gcd = "spell",
spend = 30,
spendType = "runic_power",
toggle = "cooldowns",
startsCombat = true,
texture = 136143,
handler = function ()
end,
}, ]]
raise_dead = {
id = 46585,
cast = 0,
cooldown = 120,
gcd = "spell",
toggle = "cooldowns",
startsCombat = true,
texture = 1100170,
usable = function () return not pet.alive, "cannot have an active pet" end,
handler = function ()
summonPet( "ghoul" )
end,
},
remorseless_winter = {
id = 196770,
cast = 0,
cooldown = function () return pvptalent.dead_of_winter.enabled and 45 or 20 end,
gcd = "spell",
spend = 1,
spendType = "runes",
startsCombat = false,
texture = 538770,
range = 7,
handler = function ()
applyBuff( "remorseless_winter" )
if active_enemies > 2 and legendary.biting_cold.enabled then
applyBuff( "rime" )
end
if conduit.biting_cold.enabled then applyDebuff( "target", "biting_cold" ) end
-- if pvptalent.deathchill.enabled then applyDebuff( "target", "deathchill" ) end
end,
auras = {
-- Conduit
biting_cold = {
id = 337989,
duration = 8,
max_stack = 10
}
}
},
sacrificial_pact = {
id = 327574,
cast = 0,
cooldown = 120,
gcd = "spell",
spend = 20,
spendType = "runic_power",
toggle = "cooldowns",
startsCombat = true,
texture = 136133,
usable = function () return pet.alive, "requires an undead pet" end,
handler = function ()
dismissPet( "ghoul" )
gain( 0.25 * health.max, "health" )
end,
},
wraith_walk = {
id = 212552,
cast = 4,
channeled = true,
cooldown = 60,
gcd = "spell",
startsCombat = false,
texture = 1100041,
start = function ()
applyBuff( "wraith_walk" )
end,
},
} )
spec:RegisterOptions( {
enabled = true,
aoe = 2,
nameplates = true,
nameplateRange = 8,
damage = true,
damageDots = false,
damageExpiration = 8,
potion = "potion_of_spectral_strength",
package = "Frost DK",
} )
spec:RegisterSetting( "bos_rp", 50, {
name = "Runic Power for |T1029007:0|t Breath of Sindragosa",
desc = "The addon will recommend |T1029007:0|t Breath of Sindragosa only if you have this much Runic Power (or more).",
icon = 1029007,
iconCoords = { 0.1, 0.9, 0.1, 0.9 },
type = "range",
min = 16,
max = 100,
step = 1,
width = 1.5
} )
spec:RegisterPack( "Frost DK", 20210705, [[d4042cqiLQ6rsvvUevKYMOs9jPsJcsCki0QqPGxbkmlQKUfkfQ2fu)cuQHbbDmLklds6zOuzAqGUgkL2geGVrfPACqa5CsvvzDujmpqj3dsTpPQCqQiXcbf9qQiMOuvH6IOuK2ikfXhLQkyKsvfYjrPOwji6LOuO0mPs0oLk8tiGAOsvv1sPIKEkjnvPIUkkfk8vukKXQuL9kQ)kYGbomLfJIhtvtwkxgzZk5ZkLrdQoTWQrPqrVgeMnQUneTBj)wLHdshxQQOLRQNtQPtCDsSDQW3LQmEuQ68urTEPQsZhLSFfN3L7mR2mHYDGkcrDhcD6iKTyeIaHGOYweqwvCgkLvHAEiSnkRwgskRYM8Nwgq)y2yZQqnN5N1YDMv1NY7PSkCrGQDbSH9wiWvyW(djS1bsfUjXv(3wcS1bspSZQmkbxyZvMjR2mHYDGkcrDhcD6iKTyeIaHGOIkQzvtrGFFwvnq6KSk8O1OkZKvBK2Nv7htMaFaSXwXgCzaSj)PLbsiv4opa266aqfHOUBGCG0jWTAJ0dKSXhGtLqEoO2a4MwyJRj)vTbOOTnAa3AaobUfLEa3AaSzpnatpGqgq7iD1vgauU58a6rC(aIAaqFZlHNWzvEOfDUZS6XWdHEtIRsqVJh1wUZCh7YDMvPYy4uldZSQ5L4QS6tiVxtCsRt9IsOpR2iT)dOsCvwT)FhpQTbWMC)aqGz4HqVjXvUyaQI9IEa7q4a0K)QMEam06EAa9)GZTFa3AaSj)PLb4pKKEa3AnaN0poR6)qOpSSQyCQe8MjWPpQTKwUhjMkJHtTbWI1a8x1ucbtoOF9NwWuzmCQnawSgWRu06(ncZesuBj)XByQmgo1galwdW8s4GsuridspG(qpauZsUduZDMvPYy4uldZSQ)dH(WYQmkRf(dKewbAw18sCvwf(1Jh1wIHBAjl5oyxUZSkvgdNAzyMvnVexLvpgEi0BcLv9Fi0hwwLrzTWqeCEuBjKMhEue(jZlzvVZEoLe73irN7yxwYDGG5oZQuzmCQLHzw1)HqFyzvnuIZtI9BKOXBCZhgpznhw5Pb0h6bG6aCpGxPcFc61JECJwHpKbaRbGaqyw18sCvwDJB(W4jR5WkpLLChSn3zwLkJHtTmmZQMxIRYQR)0sslFabLv9Fi0hww9vQWNGE9Oh3Ov4dzaWAaoDeMv9o75usSFJeDUJDzj3bci3zwLkJHtTmmZQMxIRYQhdpe6nHYQ(pe6dlR(kfnG(qpa2Lv9o75usSFJeDUJDzj3Htp3zwLkJHtTmmZQ(pe6dlRAEjCqjQiKbPhqFOhacoa3daLbS)aAKjWtw1snYBoJLWdruBdW9a8NdQSsWvSbxslJgalwdy)b4phuzLGRydUKwgnaeZQMxIRYQR)0I27SaNYswYQ(J3sWj7LCN5o2L7mRsLXWPwgMzvZlXvzvpClkD6wPWtz1gP9FavIRYQSXqtdOP8rTnG(FW52pGEHaFaSzp5nOWgMpzc8SQ)dH(WYQ7paX4uj4JHhc9MexHPYy4uBaUhaJYAHHgCU9PBLw)Pf8tiTO0dawdGDdW9ayuwlm0GZTpDR06pTGvGoa3dGrzTW(J3sWj7fSwmpedOp0dyhcZsUduZDMvPYy4uldZSQ5L4QSQhUfLoDRu4PSAJ0(pGkXvzveyfrhnAa3Aa9)GZTFakAY2Ob0le4dGn7jVbf2W8jtGNv9Fi0hwwD)bigNkbFm8qO3K4kmvgdNAdW9aAKjWtquXgCb)kfTUFJWlJZPk5FfT1OFaUhW(dGrzTWqdo3(0TsR)0cwb6aCpaugaJYAH9hVLGt2lyTyEigqFOhWoeWaCpagL1cRuWpUZjT8uTjWXkqhalwdGrzTW(J3sWj7fSwmpedOp0dyx)BaUhG)oE76vyObNBF6wP1FAb)eslk9a6Ba7q4aqml5oyxUZSkvgdNAzyMv9Fi0hwwD)bigNkbFm8qO3K4kmvgdNAdW9a2FanYe4jiQydUGFLIw3Vr4LX5uL8VI2A0pa3dGrzTW(J3sWj7fSwmpedOp0dyhchG7bS)ayuwlm0GZTpDR06pTGvGoa3dWFhVD9km0GZTpDR06pTGFcPfLEa9nauryw18sCvw1d3IsNUvk8uwYDGG5oZQuzmCQLHzw18sCvw1d3IsNUvk8uwTrA)hqL4QSA))jhujdWjhVnG(rK9Yaoh07nOqJABanLpQTban4C7ZQ(pe6dlRkgNkbFm8qO3K4kmvgdNAdW9a2FamkRfgAW52NUvA9NwWkqhG7bGYayuwlS)4TeCYEbRfZdXa6d9a2HagG7bWOSwyLc(XDoPLNQnbowb6ayXAamkRf2F8wcozVG1I5Hya9HEa76FdGfRb4VJ3UEfgAW52NUvA9NwWpH0Ispayna2na3dGrzTW(J3sWj7fSwmpedOp0dyhcoaeZswYQhdpe6njUk3zUJD5oZQuzmCQLHzw18sCvw9jK3RjoP1PErj0NvBK2)bujUkRIaZWdHEtIRgWFIjXvzv)hc9HLvnVeoOeveYG0dOp0dGDdW9aqzaIXPsWBMaN(O2sA5EKyQmgo1galwdWFvtjem5G(1FAbtLXWP2ayXAaVsrR73imtirTL8hVHPYy4uBaiMLChOM7mRsLXWPwgMzvZlXvzv4xpEuBjgUPLSQ)dH(WYQ7pG2j41FAjTih0JLWdruBdW9a2FamkRfgIGZJAlH08WJIWkqhG7b8kfnG(qpa2Lv9o75usSFJeDUJDzj3b7YDMvPYy4uldZSQ)dH(WYQmkRfgIGZJAlH08WJIWpzEzaUhGgkX5jX(ns041FAr7DwGtdOp0da1b4EaOmagL1c3itGRtnfcRfZdXaqpaeCaSynG9hqJmbEYQwQrEZzSeEiIABaSynG9hG)CqLvcUIn4sAz0aqmRAEjUkRU(tlAVZcCkl5oqWCNzvQmgo1YWmRAEjUkREm8qO3ekR6)qOpSSkJYAHHi48O2sinp8Oi8tMxgalwdy)bWOSw4pqsyfOdW9a0qjopj2VrIgd)6XJAlXWnTmG(qpa2Lv9o75usSFJeDUJDzj3bBZDMvPYy4uldZSQ)dH(WYQAOeNNe73irJ34MpmEYAoSYtdOp0da1b4EaOmGxPcFc61JECJwHpKbaRbSdHdGfRb8kfHLajLKlH6a6BaB(2aqCaSynaugqJyuwl8B979HNWAX8qmayna2oawSgqJyuwl8B979HNWpH0IspaynGDSDaiMvnVexLv34MpmEYAoSYtzj3bci3zwLkJHtTmmZQ(pe6dlRAEjCqjQiKbPha6bSBaUhakdWFvtjem9wl8Me1wIHF9WuzmCQna3dGrzTW0BTWBsuBjg(1dRfZdXaqpauhalwdWFvtjeSsXjtdNAP1tv)6mMkJHtTb4EamkRfwP4KPHtT06PQFDg)eslk9aG1a28TbGyw18sCvwD9NwsA5diOSK7WPN7mRsLXWPwgMzv)hc9HLvzuwl8hijSc0b4EaAOeNNe73irJHF94rTLy4MwgqFOhaQzvZlXvzv4xpEuBjgUPLSK7abk3zwLkJHtTmmZQ(pe6dlRQHsCEsSFJenEJB(W4jR5WkpnG(qpauZQMxIRYQBCZhgpznhw5PSK7O)L7mRsLXWPwgMzvZlXvz11FAjPLpGGYQ(pe6dlRU)aeJtLGnhg3kpCctLXWP2aCpG9haJYAHHi48O2sinp8OiSc0bWI1aeJtLGnhg3kpCctLXWP2aCpG9haJYAH)ajHvGoawSgaJYAH)ajHvGoa3d4vkclbskjxc1b0h6bS5BzvVZEoLe73irN7yxwYDSdH5oZQuzmCQLHzw1)HqFyzvgL1c)bscRanRAEjUkRc)6XJAlXWnTKLCh72L7mRsLXWPwgMzvZlXvz1JHhc9MqzvVZEoLe73irN7yxwYswL50jj8qe1wUZCh7YDMvPYy4uldZSQ5L4QS6XWdHEtOSQ3zpNsI9BKOZDSlR6)qOpSS6RuHpb96rpUrRWhYa6d9aqaimR2iT)dOsCvwfMpzc8bCRbOgv7TTtBdWP4LWbnaN6jMexLLChOM7mRsLXW
end