|
|
|
|
-- 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 ) / 5 ) * 5
|
|
|
|
|
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 ) / 5 ) * 5
|
|
|
|
|
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,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- 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 )
|
|
|
|
|
|
|
|
|
|
-- Tier 28
|
|
|
|
|
spec:RegisterSetBonuses( "tier28_2pc", 364383, "tier28_4pc", 363411 )
|
|
|
|
|
-- 2-Set - Arctic Assault - Remorseless Winter grants 8% Critical Strike while active.
|
|
|
|
|
-- 4-Set - Arctic Assault - Consuming Killing Machine fires a Glacial Advance through your target.
|
|
|
|
|
|
|
|
|
|
spec:RegisterAura( "arctic_assault", {
|
|
|
|
|
id = 364384,
|
|
|
|
|
duration = 8,
|
|
|
|
|
max_stack = 1,
|
|
|
|
|
} )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 ()
|
|
|
|
|
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" )
|
|
|
|
|
|
|
|
|
|
removeBuff( "killing_machine" )
|
|
|
|
|
-- Tier 28: Decide if modeling the Glacial Advance on multiple targets is worthwhile.
|
|
|
|
|
if set_bonus.tier28_4pc > 0 then applyDebuff( "target", "razorice", nil, debuff.razorice.stack + 1 ) end
|
|
|
|
|
|
|
|
|
|
-- 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 set_bonus.tier28_2pc > 0 then applyBuff( "arctic_assault" ) end
|
|
|
|
|
|
|
|
|
|
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", 20220523, [[da1UAdqiPs9iPQsxIivztevFsLQrbHofezvuvkVcKywuvClIuP2fQ(fe0Wis6yQuwgu0ZKkQPjvvDnIeBtQQ4BsfIXbfsNdkewNubZdK09ik7tQK)bfI6Gsfklec8qQkzIsfsCrOqLncfk9rPcPgjuiItsKQALquVuQqsMPurUjuisTtQQ6NqHIHcfQAPsfQEkvzQsv5QqHi5RePsgluWELYFPYGbomLfdPhlYKvXLr2SO(mOmAqCAHvlviPEni1Sr52GQDl53QA4QKJtKkwUspNW0jDDOA7qPVlvz8ePCEQQSEQkvZNi2VIB3A918oMsn)XuQyIPuLcMDMFtQsP)9)wZt97IAExwcAdg18kdo18Wy3xOdOJshvnVlZp2BNwFnpXJVjQ5br1lrhqicHfkeCuE6HJqrahNzA8vATSIqrapHWMhkEWuPF1qBEhtPM)ykvmXuQsbZoZVjvP0)oJrBEgUc53MNxa3xnpiX5qvdT5DirQ51rHmfYa6OQcyq0bGXUVqhKXiT53aWSZ(mamLkMyoipi7liwbJedYs3dOJtWFS0zamtOs3ck91za4cdgnGppaFbXIsmGppaPFIgGjgqOd48KOURd4Iz(nGEeJnGOgW1AjnseFqw6EaDu(6UoGeeRkInamwgjGKwlRd4GVrbBaiyjtHmGppaVOoRb7fgV5XcHkA918EuwO0AA8L76FwuWA918)wRVMhvgkJone08SKgF18wc(VcIrcHRxukTnVdjsBCPXxnpm()zrbBayS)oamguwO0AA8vhgGNARkgWnPoabL(6igakL)LgagFWy2oGppam29f6aspCsmGpNhGV6O08sBO0gwZdRTHHYi(2ZHINZIbirYaSKgyjhve8GedOlzdaZM28hZwFnpQmugDAiO5L2qPnSMN4IymNAlmsfCymlfgZzhSwLOb0LSbG5aKpa1yuP88(cvK8tHqCQmugDAEwsJVAEWywkmMZoyTkrnT5FNB918OYqz0PHGMxAdL2WAEO45mh6GXIcMdULGefXxYs6aKpalPbwYrfbpiXa6Aayoa5dO7bG12Wqze)qMcr4o4KZsAGLAEwsJVAE59fQi5NcHAAZ)(36R5rLHYOtdbnplPXxnVhLfkTMsnV0gkTH18qXZzo0bJffmhClbjkIVKL0MxYVeJCQTWiv08)wtB(lLwFnpQmugDAiO5L2qPnSMNL0al5OIGhKyaYgWTbiFayTnmugXZ7luNq3aAYL(6GhQO5zjn(Q5L3xOoHUb0utB(3pT(AEuzOm60qqZZsA8vZ7rzHsRPuZlTHsBynpu8CMdDWyrbZb3sqII4lzjT5L8lXiNAlmsfn)V10M)DKwFnpQmugDAiO5L2qPnSMhwBddLr891CYTbCQ5zjn(Q5b57XIcMdLzcTPn)XOT(AEuzOm60qqZlTHsBynpXfXyo1wyKk4WywkmMZoyTkrdOlzdaZbiFalEfj313Jw(HYrk0ba1b0psT5zjn(Q5bJzPWyo7G1Qe10M)yeT(AEuzOm60qqZZsA8vZlVVqDcDdOPMxAdL2WAElEfj313Jw(HYrk0ba1b0rKAZl5xIro1wyKkA(FRPn)Vj1wFnpQmugDAiO5zjn(Q59OSqP1uQ5L2qPnSM3Ix0a6s2a68aKpaehq3daUfLdIvhoMqgGejdi9yPYkLxuAF2VNbirYaspwQSs5q73gwnaKgGejdyXlAaDjBa9FaYhaClkheRoCmH08s(LyKtTfgPIM)3AAZ)B3A918OYqz0PHGMxAdL2WAEwsdSKJkcEqIb0LSb0)biFaDpaS2ggkJ4hYuic3bNCwsdSuZZsA8vZlVVqfj)uiutBAZl9SJdczR26R5)TwFnpQmugDAiO5L2qPnSMh6ledq(aYbmiQBj4wuIba1balDgG8bG4aw8IgauhaMdqIKb09aqXZzo0bJffmhClbjkIJFna5daXb09aGBr5Gy1HJjKbiFaO45mp9SJdczRYfQLGEaDjBa9FaqzalEr5FHrCOFMgRjCzd7VCQmugDgGejdaUfLdIvhoMqgG8bGINZ80ZooiKTkxOwc6b01aWOdakdyXlk)lmId9Z0ynHlBy)LtLHYOZaqAasKmau8CMdDWyrbZb3sqII44xdq(aqCaDpa4wuoiwD4yczaYhakEoZtp74Gq2QCHAjOhqxdaJoaOmGfVO8VWio0ptJ1eUSH9xovgkJodqIKba3IYbXQdhtidq(aqXZzE6zhheYwLlulb9a6Aa3K6aGYaw8IY)cJ4q)mnwt4Yg2F5uzOm6maKgasnplPXxnVeelkH7ZUirnT5pMT(AEuzOm60qqZZsA8vZlbXIs4(SlsuZ7qI0gxA8vZdJucAah8nkydaJpymBhqVqHmaPFIs2fcrWsMcP5L2qPnSMx3dqngvk)rzHsRPXxCQmugDgG8bGINZ8RGXS19zxEFHYXVgG8bGINZ80ZooiKTkxOwc6b0LSbCtQdq(aqCaO45m)kymBDF2L3xO8LGBrjgauhaS0za(2aqCa3gaugq6F257v88(cTNFlCHlJV(XxYo(naKgGejdafpN54fKN5NtOlvWui8LGBrjgauhaS0zasKmau8CMNGyVWHAfXxcUfLyaqDaWsNbGutB(35wFnpQmugDAiO5zjn(Q5LGyrjCF2fjQ5DirAJln(Q5HXGRI4qd4ZdaJpymBhaUGmy0a6fkKbi9tuYUqicwYuinV0gkTH186EaQXOs5pkluAnn(ItLHYOZaKpGdzkeh0vadIYx8IY)cJ4zJXOYLwCHDODaYhq3dafpN5xbJzR7ZU8(cLJFna5di9p789k(vWy26(SlVVq5lb3IsmGUgWnPma5daXbGINZ80ZooiKTkxOwc6b0LSbCtQdq(aqCaO45mhVG8m)CcDPcMcHJFnajsgakEoZtqSx4qTI44xdaPbirYaqXZzE6zhheYwLlulb9a6s2aU15bGutB(3)wFnpQmugDAiO5L2qPnSMx3dqngvk)rzHsRPXxCQmugDgG8b09aoKPqCqxbmikFXlk)lmINngJkxAXf2H2biFaO45mp9SJdczRYfQLGEaDjBa3K6aKpGUhakEoZVcgZw3ND59fkh)AaYhq6F257v8RGXS19zxEFHYxcUfLyaDnamLAZZsA8vZlbXIs4(SlsutB(lLwFnpQmugDAiO5zjn(Q5LGyrjCF2fjQ5DirAJln(Q5HXVewQ0b4RNDgagjKT6aES0MSRROGnGd(gfSbCfmMTnV0gkTH18uJrLYFuwO0AA8fNkdLrNbiFaDpau8CMFfmMTUp7Y7luo(1aKpaehakEoZtp74Gq2QCHAjOhqxYgWT(pa5daXbGINZC8cYZ8Zj0Lkykeo(1aKizaO45mpbXEHd1kIJFnaKgGejdafpN5PNDCqiBvUqTe0dOlzd4ggXaKizaP)zNVxXVcgZw3ND59fkFj4wuIba1b05biFaO45mp9SJdczRYfQLGEaDjBa36)aqQPnT59OSqP104RwFn)V16R5rLHYOtdbnplPXxnVLG)RGyKq46fLsBZ7qI0gxA8vZdJbLfkTMgFnG9vtJVAEPnuAdR5zjnWsoQi4bjgqxYgqNhG8bG12WqzeF75qXZzrtB(JzRVMhvgkJone08sBO0gwZR7bGINZCOdglkyo4wcsueh)AaYhaIdyXlAaqDayoajsgGAmQuEK8ZPg7lbNkdLrNbiFaO45mps(5uJ9LGVeClkXaG6aGLodW3gaMdqIKbK(6GhkhVyKjGqhxEPY39JtLHYOZaKpaehakEoZXlgzci0XLxQ8D)4lb3IsmaOoayPZa8TbG5aKizaO45mhVyKjGqhxEPY39Jlulb9aG6a68aqAai18SKgF18Y7luNq3aAQPn)7CRVMhvgkJone08sBO0gwZR7bGINZCOdglkyo4wcsueh)AaYhWIx0a6s2a68aKpaehakEoZ3aoXxcUfLyaqDaDEaYhakEoZ3aoXXVgGejdWsAGLCNx559fQltyPDaqDawsdSKJkcEqIbGuZZsA8vZdY3JffmhkZeAtB(3)wFnpQmugDAiO5L2qPnS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end
|