-- DeathKnightBlood.lua -- August 2025 -- Patch 11.2 if UnitClassBase( "player" ) ~= "DEATHKNIGHT" then return end local addon, ns = ... local Hekili = _G[ addon ] local class, state = Hekili.Class, Hekili.State local PTR = ns.PTR local spec = Hekili:NewSpecialization( 250 ) ---- Local function declarations for increased performance -- Strings local strformat = string.format -- Tables local insert, remove, sort, wipe = table.insert, table.remove, table.sort, table.wipe -- Math local abs, ceil, floor, max, sqrt = math.abs, math.ceil, math.floor, math.max, math.sqrt -- Common WoW APIs, comment out unneeded per-spec -- local GetSpellCastCount = C_Spell.GetSpellCastCount -- local GetSpellInfo = C_Spell.GetSpellInfo -- local GetSpellInfo = ns.GetUnpackedSpellInfo -- local GetPlayerAuraBySpellID = C_UnitAuras.GetPlayerAuraBySpellID -- local FindUnitBuffByID, FindUnitDebuffByID = ns.FindUnitBuffByID, ns.FindUnitDebuffByID -- local IsSpellOverlayed = C_SpellActivationOverlay.IsSpellOverlayed -- local IsSpellKnownOrOverridesKnown = C_SpellBook.IsSpellInSpellBook local IsActiveSpell = ns.IsActiveSpell -- Specialization-specific local functions (if any) local ForEachAura = AuraUtil.ForEachAura local GetAuraDataByAuraInstanceID = C_UnitAuras.GetAuraDataByAuraInstanceID spec:RegisterResource( Enum.PowerType.Runes, { rune_regen = { last = function () return state.query_time end, interval = function( time, val ) local r = state.runes val = math.floor( val ) if val == 6 then return -1 end return r.expiry[ val + 1 ] - time end, stop = function( x ) return x == 6 end, 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 -- Reset actual to force recalculation end, gain = function( amount ) local t = state.runes for i = 1, amount do table.insert( t.expiry, 0 ) t.expiry[ 7 ] = nil 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 local rpGainMultiplier = state.buff.rune_of_hysteria.up and 1.2 or 1 state.gain( amount * 10 * rpGainMultiplier, "runic_power" ) if state.talent.rune_strike.enabled then state.gainChargeTime( "rune_strike", amount ) end -- Handle Eternal Rune Weapon interactions (Dancing Rune Weapon synergy). if state.buff.dancing_rune_weapon.up and state.azerite.eternal_rune_weapon.enabled then local maxExtension = state.buff.dancing_rune_weapon.duration + 5 if state.buff.dancing_rune_weapon.expires - state.buff.dancing_rune_weapon.applied < maxExtension then state.buff.eternal_rune_weapon.expires = min( state.buff.dancing_rune_weapon.applied + maxExtension, state.buff.dancing_rune_weapon.expires + ( 0.5 * amount ) ) end end t.actual = nil end, timeTo = function( x ) return state:TimeToResource( state.runes, x ) end, }, { __index = function( t, k ) if k == "actual" then -- Calculate the number of runes available based on `expiry`. 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 and v.v ~= nil then index = i slice = v else break end end -- We have a slice. if index and slice and slice.v 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, { swarming_mist = { aura = "swarming_mist", last = function () local app = state.buff.swarming_mist.applied local t = state.query_time return app + floor( ( t - app ) / class.auras.swarming_mist.tick_time ) * class.auras.swarming_mist.tick_time end, interval = function () return class.auras.swarming_mist.tick_time end, value = function () return min( 15, state.true_active_enemies * 3 ) end, }, -- TODO: Add blooddrinker } ) local spendHook = function( amt, resource ) -- Runic Power if amt > 0 and resource == "runic_power" then if talent.red_thirst.enabled then reduceCooldown( "vampiric_blood", floor( amt / 5 ) ) end -- it seems to reduce it by intervals of 5, not 10 if talent.icy_talons.enabled then addStack( "icy_talons", nil, 1 ) end end -- Runes if resource == "rune" and amt > 0 then if active_dot.shackle_the_unworthy > 0 then reduceCooldown( "shackle_the_unworthy", 4 * amt ) end if talent.rune_carved_plates.enabled then addStack( "rune_carved_plates" ) end end end local bpUnits = {} local myName = UnitName( "player" ) local myRuneWeapon = 0x2111 local matchThreshold = 0.02 local MINE = 1 local RUNE_WEAPON = 2 local dnd_damage_ids = { [52212] = "death_and_decay", [156000] = "defile" } local dmg_events = { SPELL_DAMAGE = 1, SPELL_PERIODIC_DAMAGE = 1 } local last_dnd_tick, dnd_spell = 0, "death_and_decay" spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _, spellID, spellName ) if spellID == 55078 and ( subtype == "SPELL_AURA_APPLIED" or subtype == "SPELL_AURA_REFRESH" ) then local source if sourceName == myName then source = MINE elseif sourceFlags == myRuneWeapon then source = RUNE_WEAPON end if not source then return end local unit = UnitTokenFromGUID( destGUID ) if not unit then return end local storage = bpUnits[ destGUID ] or {} ForEachAura( unit, "HARMFUL", nil, function( info ) if info.spellId ~= 55078 then return end if storage[ info.auraInstanceID ] then return end -- May require tuning. local tOffset = math.abs( info.expirationTime - info.duration - GetTime() ) if tOffset < matchThreshold then insert( storage, info.auraInstanceID ) while( #storage > 3 ) do storage[ remove( storage, 1 ) ] = nil end storage[ info.auraInstanceID ] = source return true end end, true ) bpUnits[ destGUID ] = storage end if sourceGUID == state.GUID and dnd_damage_ids[ spellID ] and dmg_events[ subtype ] then last_dnd_tick = GetTime() dnd_spell = dnd_damage_ids[ spellID ] return end end ) local dnd_model = setmetatable( {}, { __index = function( t, k ) if k == "ticking" then -- Disabled -- if state.query_time - class.abilities.any_dnd.lastCast < 10 then return true end return debuff.death_and_decay.up elseif k == "remains" then return debuff.death_and_decay.remains end return false end } ) spec:RegisterStateTable( "death_and_decay", dnd_model ) spec:RegisterStateTable( "defile", dnd_model ) spec:RegisterStateExpr( "dnd_ticking", function () return death_and_decay.ticking end ) spec:RegisterStateExpr( "dnd_remains", function () return death_and_decay.remains end ) spec:RegisterHook( "spend", spendHook ) -- Talents spec:RegisterTalents( { -- Death Knight antimagic_barrier = { 76046, 205727, 1 }, -- Reduces the cooldown of Anti-Magic Shell by $s1 sec and increases its duration and amount absorbed by $s2% antimagic_zone = { 76065, 51052, 1 }, -- Places an Anti-Magic Zone for $s1 sec, reducing the magic damage taken by party or raid members by $s2% asphyxiate = { 76064, 221562, 1 }, -- Lifts the enemy target off the ground, crushing their throat with dark energy and stunning them for $s1 sec assimilation = { 76048, 374383, 1 }, -- blinding_sleet = { 76044, 207167, 1 }, -- Targets in a cone in front of you are blinded, causing them to wander disoriented for $s1 sec. Damage may cancel the effect. When Blinding Sleet ends, enemies are slowed by $s2% for $s3 sec blood_draw = { 76056, 374598, 1 }, -- When you fall below $s1% health you drain $s2 health from nearby enemies, the damage you take is reduced by $s3% and your Death Strike cost is reduced by $s4 for $s5 sec. Can only occur every $s6 min blood_scent = { 76078, 374030, 1 }, -- Increases Leech by $s1% brittle = { 76061, 374504, 1 }, -- Your diseases have a chance to weaken your enemy causing your attacks against them to deal $s1% increased damage for $s2 sec cleaving_strikes = { 76073, 316916, 1 }, -- Heart Strike hits up to $s1 additional enemies while you remain in Death and Decay. When leaving your Death and Decay you retain its bonus effects for $s2 sec coldthirst = { 76083, 378848, 1 }, -- Successfully interrupting an enemy with Mind Freeze grants $s1 Runic Power and reduces its cooldown by $s2 sec control_undead = { 76059, 111673, 1 }, -- Dominates the target undead creature up to level $s1, forcing it to do your bidding for $s2 min death_pact = { 76075, 48743, 1 }, -- Create a death pact that heals you for $s1% of your maximum health, but absorbs incoming healing equal to $s2% of your max health for $s3 sec death_strike = { 76071, 49998, 1 }, -- Focuses dark power into a strike that deals $s$s2 Physical damage and heals you for $s3% of all damage taken in the last $s4 sec, minimum $s5% of maximum health deaths_echo = { 102007, 356367, 1 }, -- Death's Advance, Death and Decay, and Death Grip have $s1 additional charge deaths_reach = { 102006, 276079, 1 }, -- enfeeble = { 76060, 392566, 1 }, -- gloom_ward = { 76052, 391571, 1 }, -- Absorbs are $s1% more effective on you grip_of_the_dead = { 76057, 273952, 1 }, -- ice_prison = { 76086, 454786, 1 }, -- icebound_fortitude = { 76081, 48792, 1 }, -- Your blood freezes, granting immunity to Stun effects and reducing all damage you take by $s1% for $s2 sec icy_talons = { 76085, 194878, 1 }, -- Your Runic Power spending abilities increase your melee attack speed by $s1% for $s2 sec, stacking up to $s3 times improved_death_strike = { 76067, 374277, 1 }, -- Death Strike's cost is reduced by $s1, and its healing is increased by $s2% insidious_chill = { 76051, 391566, 1 }, -- Your auto-attacks reduce the target's auto-attack speed by $s1% for $s2 sec, stacking up to $s3 times march_of_darkness = { 76074, 391546, 1 }, -- Death's Advance grants an additional $s1% movement speed over the first $s2 sec mind_freeze = { 76084, 47528, 1 }, -- Smash the target's mind with cold, interrupting spellcasting and preventing any spell in that school from being cast for $s1 sec null_magic = { 102008, 454842, 1 }, -- Magic damage taken is reduced by $s1% and the duration of harmful Magic effects against you are reduced by $s2% osmosis = { 76088, 454835, 1 }, -- permafrost = { 76066, 207200, 1 }, -- proliferating_chill = { 101708, 373930, 1 }, -- raise_dead = { 76072, 46585, 1 }, -- Raises a ghoul to fight by your side. You can have a maximum of one ghoul at a time. Lasts $s1 min rune_mastery = { 76079, 374574, 2 }, -- Consuming a Rune has a chance to increase your Strength by $s1% for $s2 sec runic_attenuation = { 76045, 207104, 1 }, -- Auto attacks have a chance to generate $s1 Runic Power runic_protection = { 76055, 454788, 1 }, -- Your chance to be critically struck is reduced by $s1% and your Armor is increased by $s2% sacrificial_pact = { 76060, 327574, 1 }, -- Sacrifice your ghoul to deal $s$s2 Shadow damage to all nearby enemies and heal for $s3% of your maximum health. Deals reduced damage beyond $s4 targets soul_reaper = { 76063, 343294, 1 }, -- Strike an enemy for $s$s3 Shadowfrost damage and afflict the enemy with Soul Reaper. After $s4 sec, if the target is below $s5% health this effect will explode dealing an additional $s$s6 Shadowfrost damage to the target. If the enemy that yields experience or honor dies while afflicted by Soul Reaper, gain Runic Corruption subduing_grasp = { 76080, 454822, 1 }, -- When you pull an enemy, the damage they deal to you is reduced by $s1% for $s2 sec suppression = { 76087, 374049, 1 }, -- Damage taken from area of effect attacks reduced by $s1%. When suffering a loss of control effect, this bonus is increased by an additional $s2% for $s3 sec unholy_bond = { 76076, 374261, 1 }, -- Increases the effectiveness of your Runeforge effects by $s1% unholy_endurance = { 76058, 389682, 1 }, -- Increases Lichborne duration by $s1 sec and while active damage taken is reduced by $s2% unholy_momentum = { 76069, 374265, 1 }, -- Increases Haste by $s1% unyielding_will = { 76050, 457574, 1 }, -- vestigial_shell = { 76053, 454851, 1 }, -- veteran_of_the_third_war = { 76068, 48263, 1 }, -- Stamina increased by $s1% will_of_the_necropolis = { 76054, 206967, 2 }, -- Damage taken below $s1% Health is reduced by $s2% wraith_walk = { 76077, 212552, 1 }, -- Embrace the power of the Shadowlands, removing all root effects and increasing your movement speed by $s1% for $s2 sec. Taking any action cancels the effect. While active, your movement speed cannot be reduced below $s3% -- Blood blood_boil = { 76170, 50842, 1 }, -- Deals $s$s2 Shadow damage and infects all enemies within $s3 yds with Blood Plague. Blood Plague A shadowy disease that drains $s6 health from the target over $s7 sec blood_feast = { 102243, 391386, 1 }, -- blood_tap = { 76039, 221699, 1 }, -- Consume the essence around you to generate $s1 Rune. Recharge time reduced by $s2 sec whenever a Bone Shield charge is consumed blooddrinker = { 102244, 206931, 1 }, -- Drains $s2 health from the target over $s3 sec$s$s4 The damage they deal to you is reduced by $s5% for the duration and $s6 sec after channeling it fully. You can move, parry, dodge, and use defensive abilities while channeling this ability. Generates $s7 additional Runic Power over the duration bloodied_blade = { 102242, 458753, 1 }, -- bloodshot = { 76125, 391398, 1 }, -- bloodworms = { 76174, 195679, 1 }, -- bone_collector = { 76171, 458572, 1 }, -- When you would pull an enemy generate $s1 charge of Bone Shield. Bone Shield Surrounds you with a barrier of whirling bones, increasing Armor by $s4. Each melee attack against you consumes a charge. Lasts $s5 sec or until all charges are consumed bonestorm = { 76127, 194844, 1 }, -- Consume up to $s2 Bone Shield charges to create a whirl of bone and gore that batters all nearby enemies, dealing $s$s3 Shadow damage every $s4 sec, and healing you for $s5% of your maximum health every time it deals damage (up to $s6%). Deals reduced damage beyond $s7 targets. Lasts $s8 sec per Bone Shield charge spent and rapidly regenerates a Bone Shield every $s9 sec carnage = { 102245, 458752, 1 }, -- coagulopathy = { 76038, 391477, 1 }, -- Enemies affected by Blood Plague take $s1% increased damage from you and Death Strike increases the damage of your Blood Plague by $s2% for $s3 sec, stacking up to $s4 times consumption = { 102244, 274156, 1 }, -- Strikes all enemies in front of you with a hungering attack that deals $s$s2 Physical damage and heals you for $s3% of that damage. Deals reduced damage beyond $s4 targets. Causes your Blood Plague damage to occur $s5% more quickly for $s6 sec. Generates $s7 Runes dancing_rune_weapon = { 76138, 49028, 1 }, -- Summons a rune weapon for $s1 sec that mirrors your melee attacks and bolsters your defenses. While active, you gain $s2% parry chance everlasting_bond = { 76130, 377668, 1 }, -- Summons $s1 additional copy of Dancing Rune Weapon and increases its duration by $s2 sec foul_bulwark = { 76167, 206974, 1 }, -- Each charge of Bone Shield increases your maximum health by $s1% gorefiends_grasp = { 76042, 108199, 1 }, -- Shadowy tendrils coil around all enemies within $s1 yards of a hostile or friendly target, pulling them to the target's location heart_strike = { 76169, 206930, 1 }, -- Instantly strike the target and $s2 other nearby enemy, causing $s$s3 Physical damage, and reducing enemies' movement speed by $s4% for $s5 sec, plus $s6 Runic Power per additional enemy struck heartbreaker = { 76135, 221536, 1 }, -- Heart Strike generates $s1 additional Runic Power per target hit heartrend = { 76131, 377655, 1 }, -- Heart Strike has a chance to increase the damage of your next Death Strike by $s1% hemostasis = { 76137, 273946, 1 }, -- improved_bone_shield = { 76142, 374715, 1 }, -- Bone Shield increases your Haste by $s1% improved_heart_strike = { 76126, 374717, 2 }, -- improved_vampiric_blood = { 76140, 317133, 2 }, -- Vampiric Blood's healing and absorb amount is increased by $s1% and duration by $s2 sec insatiable_blade = { 76129, 377637, 1 }, -- Dancing Rune Weapon generates $s1 Bone Shield charges. When a charge of Bone Shield is consumed, the cooldown of Dancing Rune Weapon is reduced by $s2 sec iron_heart = { 76172, 391395, 1 }, -- leeching_strike = { 76145, 377629, 1 }, -- mark_of_blood = { 76139, 206940, 1 }, -- Places a Mark of Blood on an enemy for $s1 sec. The enemy's damaging auto attacks will also heal their victim for $s2% of the victim's maximum health marrowrend = { 76168, 195182, 1 }, -- Smash the target, dealing $s$s2 Physical damage and generating $s3 charges of Bone Shield. Bone Shield Surrounds you with a barrier of whirling bones, increasing Armor by $s6. Each melee attack against you consumes a charge. Lasts $s7 sec or until all charges are consumed ossified_vitriol = { 76146, 458744, 1 }, -- When you lose a Bone Shield charge the damage of your next Marrowrend is increased by $s1%, stacking up to $s2% ossuary = { 76144, 219786, 1 }, -- While you have at least $s1 Bone Shield charges, the cost of Death Strike is reduced by $s2 Runic Power. Additionally, your maximum Runic Power is increased by $s3 perseverance_of_the_ebon_blade = { 76124, 374747, 1 }, -- When Crimson Scourge is consumed, you gain $s1% Versatility for $s2 sec purgatory = { 76133, 114556, 1 }, -- An unholy pact that prevents fatal damage, instead absorbing incoming healing equal to the damage prevented, lasting $s1 sec. If any healing absorption remains when this effect expires, you will die. This effect may only occur every $s2 min rapid_decomposition = { 76141, 194662, 1 }, -- Your Blood Plague and Death and Decay deal damage $s1% more often. Additionally, your Blood Plague leeches $s2% more Health red_thirst = { 76132, 205723, 1 }, -- Reduces the cooldown on Vampiric Blood by $s1 sec per $s2 Runic Power spent reinforced_bones = { 76143, 374737, 1 }, -- Increases Armor gained from Bone Shield by $s1% and it can stack $s2 additional times relish_in_blood = { 76147, 317610, 1 }, -- rune_tap = { 76166, 194679, 1 }, -- Reduces all damage taken by $s1% for $s2 sec sanguine_ground = { 76041, 391458, 1 }, -- You deal $s1% more damage and receive $s2% more healing while standing in your Death and Decay shattering_bone = { 76128, 377640, 1 }, -- When Bone Shield is consumed it shatters dealing $s$s3 Shadow damage to nearby enemies$s$s4 This damage is tripled while you are within your Death and Decay tightening_grasp = { 76165, 206970, 1 }, -- tombstone = { 76139, 219809, 1 }, -- Consume up to $s1 Bone Shield charges. For each charge consumed, you gain $s2 Runic Power and absorb damage equal to $s3% of your maximum health for $s4 sec umbilicus_eternus = { 76040, 391517, 1 }, -- After Vampiric Blood expires, you absorb damage equal to $s1 times the damage your Blood Plague dealt during Vampiric Blood vampiric_blood = { 76173, 55233, 1 }, -- Embrace your undeath, increasing your maximum health by $s1% and increasing all healing and absorbs received by $s2% for $s3 sec voracious = { 76043, 273953, 1 }, -- Death Strike's healing is increased by $s1% and grants you $s2% Leech for $s3 sec -- Deathbringer bind_in_darkness = { 95043, 440031, 1 }, -- dark_talons = { 95057, 436687, 1 }, -- deaths_messenger = { 95049, 437122, 1 }, -- expelling_shield = { 95049, 439948, 1 }, -- exterminate = { 95068, 441378, 1 }, -- grim_reaper = { 95034, 434905, 1 }, -- pact_of_the_deathbringer = { 95035, 440476, 1 }, -- reaper_of_souls = { 95034, 440002, 1 }, -- reapers_mark = { 95062, 439843, 1 }, -- Viciously slice into the soul of your enemy, dealing $s$s2 Shadowfrost damage and applying Reaper's Mark. Each time you deal Shadow or Frost damage, add a stack of Reaper's Mark. After $s3 sec or reaching $s4 stacks, the mark explodes, dealing $s5 damage per stack. Reaper's Mark travels to an unmarked enemy nearby if the target dies reapers_onslaught = { 95057, 469870, 1 }, -- rune_carved_plates = { 95035, 440282, 1 }, -- soul_rupture = { 95061, 437161, 1 }, -- swift_and_painful = { 95032, 443560, 1 }, -- wave_of_souls = { 95036, 439851, 1 }, -- wither_away = { 95058, 441894, 1 }, -- -- Sanlayn bloodsoaked_ground = { 95048, 434033, 1 }, -- While you are within your Death and Decay, your physical damage taken is reduced by $s1% and your chance to gain Vampiric Strike is increased by $s2% bloody_fortitude = { 95056, 434136, 1 }, -- Icebound Fortitude reduces all damage you take by up to an additional $s1% based on your missing health. Killing an enemy that yields experience or honor reduces the cooldown of Icebound Fortitude by $s2 sec frenzied_bloodthirst = { 95065, 434075, 1 }, -- Essence of the Blood Queen stacks $s1 additional times and increases the damage of your Death Coil and Death Strike by $s2% per stack gift_of_the_sanlayn = { 95053, 434152, 1 }, -- While Dancing Rune Weapon is active you gain Gift of the San'layn. Gift of the San'layn increases the effectiveness of your Essence of the Blood Queen by $s1%, and Vampiric Strike replaces your Heart Strike for the duration incite_terror = { 95040, 434151, 1 }, -- Vampiric Strike and Heart Strike cause your targets to take $s1% increased Shadow damage, up to $s2% for $s3 sec. Vampiric Strike benefits from Incite Terror at $s4% effectiveness infliction_of_sorrow = { 95033, 434143, 1 }, -- When Vampiric Strike damages an enemy affected by your Blood Plague, it extends the duration of the disease by $s1 sec, and deals $s2% of the remaining damage to the enemy. After Gift of the San'layn ends, you gain a charge of Death and Decay, and your next Heart Strike consumes the disease to deal $s3% of their remaining damage to the target newly_turned = { 95064, 433934, 1 }, -- pact_of_the_sanlayn = { 95055, 434261, 1 }, -- You store $s1% of all Shadow damage dealt into your Blood Beast to explode for additional damage when it expires sanguine_scent = { 95055, 434263, 1 }, -- the_blood_is_life = { 95046, 434260, 1 }, -- Dancing Rune Weapon summons a Blood Beast to attack your enemy for $s1 sec. Each time the Blood Beast attacks, it stores a portion of the damage dealt. When the Blood Beast dies, it explodes, dealing $s2% of the damage accumulated to nearby enemies and healing the Death Knight for the same amount. Deals reduced damage beyond $s3 targets vampiric_aura = { 95056, 434100, 1 }, -- Your Leech is increased by $s1%. While Lichborne is active, the Leech bonus of this effect is increased by $s2%, and it affects $s3 allies within $s4 yds vampiric_speed = { 95064, 434028, 1 }, -- Death's Advance and Wraith Walk movement speed bonuses are increased by $s1%. Activating Death's Advance or Wraith Walk increases $s2 nearby allies movement speed by $s3% for $s4 sec vampiric_strike = { 95051, 433901, 1 }, -- Your Death Coil and Death Strike have a $s1% chance to make your next Heart Strike become Vampiric Strike. Vampiric Strike heals you for $s2% of your maximum health and grants you Essence of the Blood Queen, increasing your Haste by $s3%, up to $s4% for $s5 sec visceral_strength = { 95045, 434157, 1 }, -- When Crimson Scourge is consumed, you gain $s1% Strength for $s2 sec. When Blood Boil hits $s3 or more targets, it generates $s4 charge of Bone Shield } ) -- PvP Talents spec:RegisterPvpTalents( { bloodforged_armor = 5587, -- (410301) dark_simulacrum = 3511, -- (77606) Places a dark ward on an enemy player that persists for $s1 sec, triggering when the enemy next spends mana on a spell, and allowing the Death Knight to unleash an exact duplicate of that spell death_chain = 609, -- (203173) Chains $s2 enemies together, dealing $s$s3 Shadow damage and causing $s4% of all damage taken to also be received by the others in the chain. Lasts for $s5 sec decomposing_aura = 3441, -- (199720) last_dance = 608, -- (233412) murderous_intent = 841, -- (207018) price_of_progress = 5712, -- (1233429) rot_and_wither = 204, -- (202727) spellwarden = 5592, -- (410320) strangulate = 206, -- (47476) Shadowy tendrils constrict an enemy's throat, silencing them for $s1 sec } ) -- Auras spec:RegisterAuras( { a_feast_of_souls = { id = 440861, duration = 3600, max_stack = 1 }, -- Pulling enemies to your location and dealing $323798s1 Shadow damage to nearby enemies every $t1 sec. -- https://wowhead.com/beta/spell=315443 abomination_limb = { id = 315443, duration = function () return legendary.abominations_frenzy.enabled and 16 or 12 end, tick_time = 1, max_stack = 1 }, -- Talent: Recently pulled by Abomination Limb and can't be pulled again. -- https://wowhead.com/beta/spell=323710 abomination_limb_immune = { id = 323710, duration = 4, type = "Magic", copy = 383312 }, -- Talent: Absorbing up to $w1 magic damage. Immune to harmful magic effects. -- https://wowhead.com/beta/spell=48707 antimagic_shell = { id = 48707, duration = function () return ( legendary.deaths_embrace.enabled and 2 or 1 ) * ( ( azerite.runic_barrier.enabled and 1 or 0 ) + ( talent.antimagic_barrier.enabled and 7 or 5 ) ) + ( conduit.reinforced_shell.mod * 0.001 ) end, max_stack = 1 }, antimagic_zone = { id = 145629, duration = function () return 6 + ( 2 * talent.assimilation.rank ) end, max_stack = 1 }, -- Talent: Stunned. -- https://wowhead.com/beta/spell=221562 asphyxiate = { id = 221562, duration = 5, mechanic = "stun", type = "Magic", max_stack = 1 }, -- Talent: Disoriented. -- https://wowhead.com/beta/spell=207167 blinding_sleet = { id = 207167, duration = 5, mechanic = "disorient", type = "Magic", max_stack = 1 }, -- Next Howling Blast deals Shadowfrost damage. bind_in_darkness = { id = 443532, duration = 3600, max_stack = 1, }, blood_draw = { id = 454871, duration = 8, max_stack = 1 }, -- You may not benefit from the effects of Blood Draw. -- https://wowhead.com/beta/spell=374609 blood_draw_cd = { id = 374609, duration = 120, max_stack = 1 }, -- Draining $w1 health from the target every $t1 sec. -- https://wowhead.com/beta/spell=55078 blood_plague = { id = 55078, duration = function() return 24 * ( spec.blood and talent.wither_away.enabled and 0.5 or 1 ) end, tick_time = function() return 3 * ( talent.rapid_decomposition.enabled and 0.85 or 1 ) * ( buff.consumption.up and 0.7 or 1 ) * ( spec.blood and talent.wither_away.enabled and 0.5 or 1 ) end, type = "Disease", max_stack = 1 }, drw_blood_plague_1 = { duration = function() return 24 * ( spec.blood and talent.wither_away.enabled and 0.5 or 1 ) end, tick_time = function() return 3 * ( talent.rapid_decomposition.enabled and 0.85 or 1 ) * ( buff.consumption.up and 0.7 or 1 ) * ( spec.blood and talent.wither_away.enabled and 0.5 or 1 ) end, type = "Disease", }, drw_blood_plague_2 = { duration = function() return 24 * ( spec.blood and talent.wither_away.enabled and 0.5 or 1 ) end, tick_time = function() return 3 * ( talent.rapid_decomposition.enabled and 0.85 or 1 ) * ( buff.consumption.up and 0.7 or 1 ) * ( spec.blood and talent.wither_away.enabled and 0.5 or 1 ) end, type = "Disease", }, drw_blood_plague = { alias = { "drw_blood_plague_1", "drw_blood_plague_2" }, aliasType = "debuff", aliasMode = "longest", duration = function() return 24 * ( spec.blood and talent.wither_away.enabled and 0.5 or 1 ) end, tick_time = function() return 3 * ( talent.rapid_decomposition.enabled and 0.85 or 1 ) * ( buff.consumption.up and 0.7 or 1 ) * ( spec.blood and talent.wither_away.enabled and 0.5 or 1 ) end, max_stack = 2, type = "Disease", }, -- Absorbs $w1 Physical damage$?a391398 [ and Physical damage increased by $s2%][]. -- https://wowhead.com/beta/spell=77535 blood_shield = { id = 77535, duration = 10, max_stack = 1 }, -- Talent: Draining $s1 health from the target every $t1 sec. -- https://wowhead.com/beta/spell=206931 blooddrinker = { id = 206931, duration = 3, type = "Magic", max_stack = 1 }, blooddrinker_debuff = { id = 458687, duration = 5.0, max_stack = 1, }, -- Strength increased by ${$W1}.1%. bloodied_blade = { id = 460499, duration = 15.0, max_stack = 1, }, -- Physical damage taken reduced by $s1%.; Chance to gain Vampiric Strike increased by $434033s2%. bloodsoaked_ground = { id = 434034, duration = 3600, max_stack = 1, }, -- Armor increased by ${$w1*$STR/100}.; $?a374715[Haste increased by $w4%.][] bone_shield = { id = 195181, duration = 30.0, max_stack = function() return talent.reinforced_bones.enabled and 12 or 10 end, -- Affected by: -- foul_bulwark[206974] #0: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': 1.0, 'target': TARGET_UNIT_CASTER, 'modifies': EFFECT_3_VALUE, } -- improved_bone_shield[374715] #0: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': 10.0, 'target': TARGET_UNIT_CASTER, 'modifies': EFFECT_4_VALUE, } -- reinforced_bones[374737] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 10.0, 'target': TARGET_UNIT_CASTER, 'modifies': EFFECT_1_VALUE, } -- reinforced_bones[374737] #1: { 'type': APPLY_AREA_AURA_PARTY, 'subtype': ADD_FLAT_MODIFIER, 'points': 2.0, 'value': 37, 'schools': ['physical', 'fire', 'shadow'], 'target': TARGET_UNIT_CASTER, } }, -- Talent: Dealing $196528s1 Shadow damage to nearby enemies every $t3 sec, and healing for $196545s1% of maximum health for each target hit (up to ${$s1*$s4}%). -- https://wowhead.com/beta/spell=194844 bonestorm = { id = 194844, duration = 10, tick_time = 1, max_stack = 1 }, brittle = { id = 374557, duration = 5, max_stack = 1 }, -- Talent: Movement slowed $w1% $?$w5!=0[and Haste reduced $w5% ][]by frozen chains. -- https://wowhead.com/beta/spell=45524 chains_of_ice = { id = 45524, duration = 8, mechanic = "snare", type = "Magic", max_stack = 1 }, coagulating_blood = PTR and { id = 463730, duration = 3600, max_stack = 100 } or {}, -- Talent: Blood Plague damage is increased by $s1%. -- https://wowhead.com/beta/spell=391481 coagulopathy = { id = 391481, duration = 8, max_stack = 5 }, -- Your next Chains of Ice will deal $281210s1 Frost damage. -- https://wowhead.com/beta/spell=281209 cold_heart = { id = 281209, duration = 3600, max_stack = 20 }, -- Your Blood Plague deals damage $w5% more often. consumption = { id = 274156, duration = 6, max_stack = 1, }, -- Talent: Controlled. -- https://wowhead.com/beta/spell=111673 control_undead = { id = 111673, duration = 300, mechanic = "charm", type = "Magic", max_stack = 1 }, -- Your next Death and Decay costs no Runes and generates no Runic Power. -- https://wowhead.com/beta/spell=81141 crimson_scourge = { id = 81141, duration = 15, max_stack = 1, }, -- Talent: Parry chance increased by $s1%. -- https://wowhead.com/beta/spell=81256 dancing_rune_weapon = { id = 81256, duration = function () return ( pvptalent.last_dance.enabled and 6 or 8 ) + ( talent.everlasting_bond.enabled and 6 or 0 ) end, type = "Magic", max_stack = 1, active_weapons = function() return buff.dancing_rune_weapon.up and 1 + talent.everlasting_bond.rank or 0 end }, -- Taunted. -- https://wowhead.com/beta/spell=56222 dark_command = { id = 56222, duration = 3, mechanic = "taunt", max_stack = 1 }, -- Reduces healing done by $m1%. -- https://wowhead.com/beta/spell=327095 death = { id = 327095, duration = 6, type = "Magic", max_stack = 3 }, -- $?s206930[Heart Strike will hit up to ${$m3+2} targets.]?s207311[Clawing Shadows will hit ${$55090s4-1} enemies near the target.]?s55090[Scourge Strike will hit ${$55090s4-1} enemies near the target.][Dealing Shadow damage to enemies inside Death and Decay.] -- https://wowhead.com/beta/spell=188290 death_and_decay = { id = 188290, duration = 10, tick_time = function() return talent.rapid_decomposition.enabled and 0.85 or 1 end, max_stack = 1, copy = "death_and_decay_actual" }, deaths_due = { id = 324165, duration = function () return legendary.rampant_transference.enabled and 12 or 10 end, max_stack = 1, copy = "deaths_due_buff" }, -- Talent: The next $w2 healing received will be absorbed. -- https://wowhead.com/beta/spell=48743 death_pact = { id = 48743, duration = 15, max_stack = 1 }, -- Your movement speed is increased by $s1%, you cannot be slowed below $s2% of normal speed, and you are immune to forced movement effects and knockbacks. -- https://wowhead.com/beta/spell=48265 deaths_advance = { id = 48265, duration = 10, type = "Magic", max_stack = 1 }, -- Weakened by Death's Due, damage dealt to $@auracaster reduced by $s1%.$?a333388[ Toxins accumulate, increasing Death's Due damage by $s3%.][] -- https://wowhead.com/beta/spell=324164 deaths_due_zone = { id = 324164, duration = 12, max_stack = 4 }, -- Casting speed reduced by $w1%. expelling_shield = { id = 440739, duration = 6.0, max_stack = 1, }, exterminate = { id = 441416, duration = 30, max_stack = function () return talent.reapers_onslaught.enabled and 1 or 2 end, copy = { 447954, "exterminate_painful_death" } }, -- Reduces damage dealt to $@auracaster by $m1%. -- https://wowhead.com/beta/spell=327092 famine = { id = 327092, duration = 6, max_stack = 3 }, -- Suffering $w1 Frost damage every $t1 sec. -- https://wowhead.com/beta/spell=55095 frost_fever = { id = 55095, duration = function() return 24 * ( state.spec.frost and talent.wither_away.enabled and 0.5 or 1 ) end, tick_time = function() return 3 * ( state.spec.frost and talent.wither_away.enabled and 0.5 or 1 ) end, max_stack = 1 }, -- Absorbs damage. -- https://wowhead.com/beta/spell=207203 frost_shield = { id = 207203, duration = 10, max_stack = 1 }, -- Movement speed slowed by $s2%. -- https://wowhead.com/beta/spell=279303 frostwyrms_fury = { id = 279303, duration = 10, type = "Magic", max_stack = 1 }, -- Dealing $w1 Frost damage every $t1 sec. -- https://wowhead.com/beta/spell=274074 glacial_contagion = { id = 274074, duration = 14, tick_time = 2, type = "Magic", max_stack = 1 }, -- Dealing $w1 Shadow damage every $t1 sec. -- https://wowhead.com/beta/spell=275931 harrowing_decay = { id = 275931, duration = 4, tick_time = 1, type = "Magic", max_stack = 1 }, -- Talent: Movement speed reduced by $s5%. -- https://wowhead.com/beta/spell=206930 heart_strike_206930 = { id = 206930, duration = 8, max_stack = 1, copy = 228645 }, heart_strike_228645 = { id = 228645, duration = 8, max_stack = 1 }, heart_strike = { alias = { "heart_strike_206930", "heart_strike_228645" }, aliasMode = "first", aliasType = "debuff", duration = 8 }, -- Talent: Your next Death Strike deals an additional $s2% damage. -- https://wowhead.com/beta/spell=377656 heartrend = { id = 377656, duration = 20, max_stack = 1 }, -- Deals $s1 Fire damage. -- https://wowhead.com/beta/spell=286979 helchains = { id = 286979, duration = 15, tick_time = 1, type = "Magic", max_stack = 1 }, -- Talent: Damage and healing done by your next Death Strike increased by $s1%. -- https://wowhead.com/beta/spell=273947 hemostasis = { id = 273947, duration = 15, max_stack = 5, copy = "haemostasis" }, -- Talent: Damage taken reduced by $w3%. Immune to Stun effects. -- https://wowhead.com/beta/spell=48792 icebound_fortitude = { id = 48792, duration = 8, max_stack = 1 }, -- Rooted. ice_prison = { id = 454787, duration = 4.0, max_stack = 1, }, -- Attack speed increased by $w1%$?a436687[, and Runic Power spending abilities deal Shadowfrost damage.][.] icy_talons = { id = 194879, duration = 10.0, max_stack = function() return talent.dark_talons.enabled and 3 or 1 end, copy = { 443586, 436687, 443586, "dark_talons_icy_talons", "dark_talons_shadowfrost" } }, -- Taking $w1% increased Shadow damage from $@auracaster. incite_terror = { id = 458478, duration = 15.0, max_stack = 5, }, infliction_of_sorrow = { id = 460049, duration = 30, max_stack = 1 }, -- Time between auto-attacks increased by $w1%. insidious_chill = { id = 391568, duration = 30, max_stack = 4, }, -- Absorbing up to $w1 magic damage.; Duration of harmful magic effects reduced by $s2%. lesser_antimagic_shell = { id = 454863, duration = function() return 5.0 * ( talent.antimagic_barrier.enabled and 1.4 or 1 ) end, max_stack = 1, }, -- Casting speed reduced by $w1%. -- https://wowhead.com/beta/spell=326868 lethargy = { id = 326868, duration = 6, max_stack = 1 }, -- Leech increased by $s1%$?a389682[, damage taken reduced by $s8%][] and immune to Charm, Fear and Sleep. Undead. -- https://wowhead.com/beta/spell=49039 lichborne = { id = 49039, duration = function() return talent.unholy_endurance.enabled and 12 or 10 end, tick_time = 1, max_stack = 1 }, -- Death's Advance movement speed increase by 25%. -- https://wowhead.com/beta/spell=391547 march_of_darkness = { id = 391547, duration = 3, max_stack = 1, }, -- Talent: Auto attacks will heal the victim for $206940s1% of their maximum health. -- https://wowhead.com/beta/spell=206940 mark_of_blood = { id = 206940, duration = 15, type = "Magic", max_stack = 1 }, mograines_might = { id = 444505, duration = 3600, max_stack = 1 }, -- $@spellaura281238 -- https://wowhead.com/beta/spell=207256 obliteration = { id = 207256, duration = 3600, max_stack = 1 }, ossified_vitriol = { id = 458745, duration = 8, max_stack = 5 }, ossuary = { id = 219788, duration = 3600, max_stack = 1 }, -- Grants the ability to walk across water. -- https://wowhead.com/beta/spell=3714 path_of_frost = { id = 3714, duration = 600, tick_time = 0.5, max_stack = 1 }, -- Talent: Versatility increased by $w1% -- https://wowhead.com/beta/spell=374748 perseverance_of_the_ebon_blade = { id = 374748, duration = 6, max_stack = 1 }, -- Suffering $o1 shadow damage over $d and slowed by $m2%. -- https://wowhead.com/beta/spell=327093 pestilence = { id = 327093, duration = 6, tick_time = 1, type = "Magic", max_stack = 3 }, -- Strength increased by $w1%. -- https://wowhead.com/beta/spell=51271 pillar_of_frost = { id = 51271, duration = 12, type = "Magic", max_stack = 1 }, reaper_of_souls = { id = 469172, duration = 12, max_stack = 1 }, -- You are a prey for the Deathbringer... This effect will explode for $436304s1 Shadowfrost damage for each stack. reapers_mark = { id = 434765, duration = 12.0, tick_time = 1.0, max_stack = function() if set_bonus.tww3 >= 4 then return 55 else return 40 end end, copy = "reapers_mark_debuff", onRemove = function() if set_bonus.tww3 >= 4 then applyBuff( "empowered_soul" ) end end, }, -- Magical damage taken reduced by $w1%. rune_carved_plates = { id = 440290, duration = 5.0, max_stack = 5 }, -- Absorb... -- https://wowhead.com/beta/spell=116888 shroud_of_purgatory = { id = 116888, duration = 3, max_stack = 1, }, -- Frost damage taken from the Death Knight's abilities increased by $s1%. -- https://wowhead.com/beta/spell=51714 razorice = { id = 51714, duration = 20, tick_time = 1, type = "Magic", max_stack = 5 }, -- Talent: Strength increased by $w1% -- https://wowhead.com/beta/spell=374585 rune_mastery = { id = 374585, duration = 8, max_stack = 1 }, -- Runic Power generation increased by $s1%. -- https://wowhead.com/beta/spell=326918 rune_of_hysteria = { id = 326918, duration = 8, max_stack = 1 }, -- Healing for $s1% of your maximum health every $t sec. -- https://wowhead.com/beta/spell=326808 rune_of_sanguination = { id = 326808, duration = 8, max_stack = 1 }, -- Absorbs $w1 magic damage. When an enemy damages the shield, their cast speed is reduced by $w2% for $326868d. -- https://wowhead.com/beta/spell=326867 rune_of_spellwarding = { id = 326867, duration = 8, max_stack = 1 }, -- Haste and Movement Speed increased by $s1%. -- https://wowhead.com/beta/spell=326984 rune_of_unending_thirst = { id = 326984, duration = 10, max_stack = 1 }, -- Talent: Damage taken reduced by $s1%. -- https://wowhead.com/beta/spell=194679 rune_tap = { id = 194679, duration = 4, max_stack = 1 }, -- Talent: Afflicted by Soul Reaper, if the target is below $s3% health this effect will explode dealing an additional $343295s1 Shadowfrost damage. -- https://wowhead.com/beta/spell=343294 soul_reaper = { id = 343294, duration = 5, tick_time = 5, max_stack = 1, }, grim_reaper_soul_reaper = { id = 448229, duration = 5, tick_time = 5, max_stack = 1 }, -- Silenced. strangulate = { id = 47476, duration = 5.0, max_stack = 1, }, -- Damage dealt to $@auracaster reduced by $w1%. subduing_grasp = { id = 454824, duration = 6.0, max_stack = 1, }, -- Damage taken from area of effect attacks reduced by an additional $w1%. suppression = { id = 454886, duration = 6.0, max_stack = 1, }, -- Covenant: Surrounded by a mist of Anima, increasing your chance to Dodge by $s2% and dealing $311730s1 Shadow damage every $t1 sec to nearby enemies. -- https://wowhead.com/beta/spell=311648 swarming_mist = { id = 311648, duration = 8, tick_time = 1, max_stack = 1 }, swift_and_painful = { id = 443560, duration = 8, max_stack = 1 }, -- Silenced. tightening_grasp = { id = 374776, duration = 3, type = "Magic", max_stack = 1 }, -- Talent: Absorbing $w1 damage. -- https://wowhead.com/beta/spell=219809 tombstone = { id = 219809, duration = 8, max_stack = 1 }, -- Talent: Absorbing damage dealt by Blood Plague. -- https://wowhead.com/beta/spell=391519 umbilicus_eternus = { id = 391519, duration = 10, max_stack = 1 }, -- Haste increased by $s1%. -- https://wowhead.com/beta/spell=207289 unholy_assault = { id = 207289, duration = 20, type = "Magic", max_stack = 1 }, -- Deals $s1 Fire damage. -- https://wowhead.com/beta/spell=319245 unholy_pact = { id = 319245, duration = 15, tick_time = 1, type = "Magic", max_stack = 1 }, -- Strength increased by $s1%. -- https://wowhead.com/beta/spell=53365 unholy_strength = { id = 53365, duration = 15, max_stack = 1 }, -- Vampiric Aura's Leech amount increased by $s1% and is affecting $s2 nearby allies. vampiric_aura = { id = 434105, duration = 3600, max_stack = 1, }, -- Talent: Maximum health increased by $s4%. Healing and absorbs received increased by $s1%. -- https://wowhead.com/beta/spell=55233 vampiric_blood = { id = 55233, duration = function () return 10 + ( talent.improved_vampiric_blood.rank * 2 ) + ( legendary.vampiric_aura.enabled and 3 or 0 ) end, max_stack = 1 }, -- Movement speed increased by $w1%. vampiric_speed = { id = 434029, duration = 5.0, max_stack = 1, }, vampiric_strike = { id = 433899, duration = 3600, max_stack = 1 }, -- Suffering $w1 Shadow damage every $t1 sec. Erupts for $191685s1 damage split among all nearby enemies when the infected dies. -- https://wowhead.com/beta/spell=191587 virulent_plague = { id = 191587, duration = 27, tick_time = 3, max_stack = 1 }, -- The touch of the spirit realm lingers.... -- https://wowhead.com/beta/spell=97821 voidtouched = { id = 97821, duration = 300, max_stack = 1 }, -- Leech increased by 15%. -- https://wowhead.com/beta/spell=274009 voracious = { id = 274009, duration = 8, max_stack = 1, }, -- Increases damage taken from $@auracaster by $m1%. -- https://wowhead.com/beta/spell=327096 war = { id = 327096, duration = 6, type = "Magic", max_stack = 3 }, wave_of_souls = { id = 443404, duration = 15, max_stack = 2, }, -- Talent: Movement speed increased by $w1%. Cannot be slowed below $s2% of normal movement speed. Cannot attack. -- https://wowhead.com/beta/spell=212552 wraith_walk = { id = 212552, duration = 4, max_stack = 1 }, } ) -- Pets spec:RegisterPets({ blood_beast = { id = 217228, spell = "dancing_rune_weapon", duration = 12, }, ghoul = { id = 26125, spell = "raise_dead", duration = 60 }, }) spec:RegisterGear({ -- The War Within tww3 = { items = { 237631, 237629, 237627, 237628, 237626 }, auras = { -- Deathbringer -- Crit Buff empowered_soul = { id = 1236996, duration = 8, max_stack = 1 }, } }, tww2 = { items = { 229253, 229251, 229256, 229254, 229252 }, auras = { luck_of_the_draw = { id = 1218601, duration = function() if set_bonus.tww2 >= 4 then return 12 end return 10 end, max_stack = 1 }, murderous_frenzy = { id = 1222698, duration = 6, max_stack = 1 } } }, tww1 = { items = { 212005, 212003, 212002, 212001, 212000 }, auras = { unbreakable = { id = 457468, duration = 3600, max_stack = 1 }, unbroken = { id = 457473, duration = 6, max_stack = 1 }, piledriver = { id = 457506, duration = 3600, max_stack = 10 }, icy_vigor = { id = 457189, duration = 8, max_stack = 1 }, unholy_commander = { id = 456698, duration = 8, max_stack = 1 } } }, -- Dragonflight tier31 = { items = { 207198, 207199, 207200, 207201, 207203 }, auras = { ashen_decay_proc = { id = 425721, duration = 20, max_stack = 1 }, ashen_decay = { id = 425719, duration = 8, max_stack = 1, copy = "ashen_decay_debuff" } } }, tier30 = { items = { 202464, 202462, 202461, 202460, 202459, 217223, 217225, 217221, 217222, 217224 }, auras = { vampiric_strength = { id = 408356, duration = 5, max_stack = 1 } } }, tier29 = { items = { 200405, 200407, 200408, 200409, 200410 }, auras = { vigorous_lifeblood = { id = 394570, duration = 10, max_stack = 1 } } }, -- Legacy acherus_drapes = { items = { 132376 } }, cold_heart = { items = { 151796 } }, -- chilled_heart stacks NYI consorts_cold_core = { items = { 144293 } }, death_march = { items = { 144280 } }, draugr_girdle_of_the_everlasting_king = { items = { 132441 } }, koltiras_newfound_will = { items = { 132366 } }, lanathels_lament = { items = { 133974 } }, perseverance_of_the_ebon_martyr = { items = { 132459 } }, rethus_incessant_courage = { items = { 146667 } }, seal_of_necrofantasia = { items = { 137223 } }, service_of_gorefiend = { items = { 132367 } }, shackles_of_bryndaor = { items = { 132365 } }, -- NYI (Death Strike heals refund RP...) skullflowers_haemostasis = { items = { 144281 }, auras = { haemostasis = { id = 235559, duration = 3600, max_stack = 5 } } }, soul_of_the_deathlord = { items = { 151740 } }, soulflayers_corruption = { items = { 151795 } }, the_instructors_fourth_lesson = { items = { 132448 } }, toravons_whiteout_bindings = { items = { 132458 } }, uvanimor_the_unbeautiful = { items = { 137037 } } } ) spec:RegisterTotem( "ghoul", 1100170 ) -- Texture ID spec:RegisterHook( "TALENTS_UPDATED", function() class.abilityList.any_dnd = "|T136144:0|t |cff00ccff[Any " .. class.abilities.death_and_decay.name .. "]|r" local dnd = talent.defile.enabled and "defile" or "death_and_decay" class.abilities.any_dnd = class.abilities[ dnd ] rawset( cooldown, "any_dnd", nil ) rawset( cooldown, "death_and_decay", nil ) rawset( cooldown, "defile", nil ) if dnd == "defile" then rawset( cooldown, "death_and_decay", cooldown.defile ) else rawset( cooldown, "defile", cooldown.death_and_decay ) end end ) local TriggerInflictionOfSorrow = setfenv( function () applyBuff( "infliction_of_sorrow" ) gainCharges( "death_and_decay", 1 ) end, state ) local TriggerUmbilicusEternus = setfenv( function() applyBuff( "umbilicus_eternus" ) end, state ) local BonestormShield = setfenv( function() addStack( "bone_shield" ) gain( min( 0.1, 0.02 * active_enemies ) * health.max, "health" ) end, state ) spec:RegisterHook( "reset_precast", function () if UnitExists( "pet" ) then for i = 1, 40 do local expires, _, _, _, id = select( 6, UnitDebuff( "pet", i ) ) if not expires then break end if id == 111673 then summonPet( "controlled_undead", expires - now ) break end end 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 and data.cooldown == 0 and data.spendType == "runes" then setCooldown( action, 0 ) end end if talent.umbilicus_eternus.enabled and buff.vampiric_blood.up then state:QueueAuraExpiration( "vampiric_blood", TriggerUmbilicusEternus, buff.vampiric_blood.expires ) end if talent.infliction_of_sorrow.enabled and buff.gift_of_the_sanlayn.up then state:QueueAuraExpiration( "gift_of_the_sanlayn", TriggerInflictionOfSorrow, buff.gift_of_the_sanlayn.expires ) end if IsActiveSpell( 433895 ) then applyBuff( "vampiric_strike" ) end if buff.bonestorm.up then local tick_time = buff.bonestorm.expires state:QueueAuraExpiration( "bonestorm", BonestormShield, tick_time ) tick_time = tick_time - 1 while( tick_time > query_time ) do state:QueueAuraEvent( "bonestorm", BonestormShield, tick_time, "AURA_TICK" ) tick_time = tick_time - 1 end end if debuff.blood_plague.up and bpUnits[ target.unit ] then -- Target has at least 1 Blood Plague, but we don't know whose it is. removeDebuff( "target", "blood_plague" ) for id, caster in pairs( bpUnits[ target.unit ] ) do -- Index 1 - 3 used for caps. if id > 3 then local aura = "blood_plague" if caster == RUNE_WEAPON then if debuff.drw_blood_plague_1.down then aura = "drw_blood_plague_1" elseif debuff.drw_blood_plague_2.down then aura = "drw_blood_plague_2" else break end end local info = GetAuraDataByAuraInstanceID( "target", id ) if info then applyDebuff( "target", aura, info.expirationTime - state.query_time ) debuff[ aura ].duration = info.duration debuff[ aura ].applied = info.expirationTime - info.duration end end end end if buff.death_and_decay.up and buff.death_and_decay.duration > 4 then -- Extend by 4 to support on-leave effect. buff.death_and_decay.expires = buff.death_and_decay.expires + 4 end -- Death and Decay tick time is 1s; if we haven't seen a tick in 2 seconds, it's not ticking. local last_dnd = action[ dnd_spell ].lastCast local dnd_expires = last_dnd + 10 if now - last_dnd_tick < 2 and dnd_expires > now then applyDebuff( "target", "death_and_decay", dnd_expires - now ) debuff.death_and_decay.duration = 10 debuff.death_and_decay.applied = debuff.death_and_decay.expires - 10 end end ) spec:RegisterStateExpr( "save_blood_shield", function () return ( settings.save_blood_shield or false ) end ) spec:RegisterStateExpr( "ibf_damage", function () return health.max * ( settings.ibf_damage or 0 ) * 0.01 end ) spec:RegisterStateExpr( "rt_damage", function () return health.max * ( settings.rt_damage or 0 ) * 0.01 end ) spec:RegisterStateExpr( "vb_damage", function () return health.max * ( settings.vb_damage or 0 ) * 0.01 end ) spec:RegisterStateTable( "death_and_decay", setmetatable( { onReset = function( self ) end }, { __index = function( t, k ) if k == "ticking" then return buff.death_and_decay.up elseif k == "remains" then return buff.death_and_decay.remains end return false end } ) ) spec:RegisterStateFunction( "applyRunePlagues", function() -- Should only reach here when DRW is active. local num = min( 2, buff.dancing_rune_weapon.active_weapons ) if num == 0 then return end for i = 1, num do if buff.drw_blood_plague_1.down then applyDebuff( "target", "drw_blood_plague_1" ) if this_action == "blood_boil" then active_dot.drw_blood_plague_1 = true_active_enemies end elseif buff.drw_blood_plague_2.down then applyDebuff( "target", "drw_blood_plague_2" ) if this_action == "blood_boil" then active_dot.drw_blood_plague_2 = true_active_enemies end return end end end ) spec:RegisterStateTable( "drw", setmetatable( { onReset = function( self ) end }, { __index = function( t, k ) if k == "bp_ticking" then return buff.drw_blood_plague.up end return false end } ) ) -- Abilities spec:RegisterAbilities( { -- Sprout an additional limb, dealing ${$383313s1*13} Shadow damage over $d to all nearby enemies. Deals reduced damage beyond $s5 targets. Every $t1 sec, an enemy is pulled to your location if they are further than $383312s3 yds from you. The same enemy can only be pulled once every $383312d. abomination_limb = { id = 315443, cast = 0, cooldown = 120, gcd = "spell", startsCombat = false, toggle = "cooldowns", handler = function () applyBuff( "abomination_limb" ) if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end end, }, -- Talent: Surrounds you in an Anti-Magic Shell for $d, absorbing up to $ magic damage and preventing application of harmful magical effects.$?s207188[][ Damage absorbed generates Runic Power.] antimagic_shell = { id = 48707, cast = 0, cooldown = function () return talent.osmosis.enabled and 40 or 60 end, gcd = "off", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "antimagic_shell" ) end, }, -- Talent: Places an Anti-Magic Zone that reduces spell damage taken by party or raid members by $145629m1%. The Anti-Magic Zone lasts for $d or until it absorbs $?a374383[${$*1.1}][$] damage. antimagic_zone = { id = 51052, cast = 0, cooldown = function() return 240 - ( talent.assimilation.enabled and 60 or 0 ) end, gcd = "spell", talent = "antimagic_zone", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "antimagic_zone" ) end, }, -- Talent: Lifts the enemy target off the ground, crushing their throat with dark energy and stunning them for $d. asphyxiate = { id = 221562, cast = 0, cooldown = 45, gcd = "spell", talent = "asphyxiate", startsCombat = true, toggle = "interrupts", debuff = "casting", readyTime = state.timeToInterrupt, handler = function () interrupt() applyDebuff( "target", "asphyxiate" ) end, }, -- Talent: Targets in a cone in front of you are blinded, causing them to wander disoriented for $d. Damage may cancel the effect. When Blinding Sleet ends, enemies are slowed by $317898s1% for $317898d. blinding_sleet = { id = 207167, cast = 0, cooldown = 60, gcd = "spell", talent = "blinding_sleet", startsCombat = true, handler = function () applyDebuff( "target", "blinding_sleet" ) end, }, -- Talent: Deals $s1 Shadow damage$?s212744[ to all enemies within $A1 yds.][ and infects all enemies within $A1 yds with Blood Plague. |Tinterface\icons\spell_deathknight_bloodplague.blp:24|t |cFFFFFFFFBlood Plague|r $@spelldesc55078] blood_boil = { id = 50842, cast = 0, charges = 2, cooldown = 7.5, recharge = 7.5, hasteCD = true, school = function() return talent.bind_in_darkness.enabled and "shadowfrost" or "physical" end, gcd = "spell", talent = "blood_boil", startsCombat = true, handler = function () applyDebuff( "target", "blood_plague" ) active_dot.blood_plague = active_enemies if buff.dancing_rune_weapon.up then applyRunePlagues() end if talent.bind_in_darkness.enabled and debuff.reapers_mark.up then applyDebuff( "target", "reapers_mark", nil, debuff.reapers_mark.stack + 2 ) end if talent.visceral_strength.enabled and true_active_enemies > 1 then addStack( "bone_shield", 1 ) end if talent.hemostasis.enabled then addStack( "hemostasis", nil, min( 5, active_enemies ) ) end if set_bonus.tier31_4pc > 0 and debuff.ashen_decay.up then debuff.ashen_decay.expires = debuff.ashen_decay.expires + 1 end -- Legacy if legendary.superstrain.enabled then applyDebuff( "target", "frost_fever" ) active_dot.frost_fever = active_enemies applyDebuff( "target", "virulent_plague" ) active_dot.virulent_plague = active_enemies end if set_bonus.tier30_4pc > 0 and buff.vampiric_strength.up then buff.vampiric_strength.expires = buff.vampiric_strength.expires + 0.5 end if conduit.debilitating_malady.enabled then addStack( "debilitating_malady", nil, 1 ) end end, auras = { -- Conduit debilitating_malady = { id = 338523, duration = 6, max_stack = 3 } } }, -- Talent: Consume the essence around you to generate $s1 Rune. Recharge time reduced by $s2 sec whenever a Bone Shield charge is consumed. blood_tap = { id = 221699, cast = 0, charges = 2, cooldown = 60, recharge = 60, gcd = "off", talent = "blood_tap", startsCombat = false, handler = function () gain( 1, "runes" ) end }, -- Drains $o1 health from the target over $d. The damage they deal to you is reduced by $s2% for the duration and $458687d after channeling it fully.; You can move, parry, dodge, and use defensive abilities while channeling this ability.; Generates ${$s3*4/10} additional Runic Power over the duration. blooddrinker = { id = 206931, cast = 3, channeled = true, cooldown = 30, gcd = "spell", spend = 1, spendType = "runes", talent = "blooddrinker", startsCombat = true, start = function () applyDebuff( "target", "blooddrinker" ) end, }, -- Consume your Bone Shield charges to create a whirl of bone and gore that batters all nearby enemies, dealing $196528s1 Shadow damage every $t3 sec, and healing you for $196545s1% of your maximum health every time it deals damage (up to ${$s1*$s4}%). Deals reduced damage beyond $196528s2 targets.; Lasts $d per Bone Shield charge spent and rapidly regenerates a Bone Shield every $t3 sec. bonestorm = { id = 194844, cast = 0, cooldown = 60, gcd = "spell", talent = "bonestorm", startsCombat = true, buff = "bone_shield", handler = function () local consume = min( 5, buff.bone_shield.stack ) gain( consume * 0.02 * health.max, "health" ) local dur = 2 * consume applyBuff( "bonestorm", dur ) removeStack( "bone_shield", consume ) for i = 1, dur do state:QueueAuraEvent( "bonestorm", BonestormShield, query_time + i, i == dur and "AURA_EXPIRATION" or "AURA_TICK" ) end if set_bonus.tww1_4pc > 0 then if buff.bone_shield.up then applyBuff( "piledriver", nil, buff.bone_shield.stack ) else removeBuff( "piledriver" ) end end end, -- TODO Bone Shield regeneration (1 per sec.) -- #2: { 'type': APPLY_AURA, 'subtype': PERIODIC_TRIGGER_SPELL, 'tick_time': 1.0, 'trigger_spell': 196528, 'points': 1.0, 'target': TARGET_UNIT_CASTER, } }, -- Talent: Shackles the target $?a373930[and $373930s1 nearby enemy ][]with frozen chains, reducing movement speed by $s1% for $d. chains_of_ice = { id = 45524, cast = 0, cooldown = function() return talent.ice_prison.enabled and 12 or 0 end, gcd = "spell", spend = 1, spendType = "runes", startsCombat = true, max_targets = function () return talent.proliferating_chill.enabled and 2 or 1 end, handler = function () applyDebuff( "target", "chains_of_ice" ) if talent.ice_prison.enabled then applyDebuff( "target", "ice_prison" ) end if talent.proliferating_chill.enabled then active_dot.chains_of_ice = min( true_active_enemies, active_dot.chains_of_ice + 1 ) end end, }, -- Strikes all enemies in front of you with a hungering attack that deals $sw1 Physical damage and heals you for ${$e1*100}% of that damage. Deals reduced damage beyond $s3 targets.; Causes your Blood Plague damage to occur $s5% more quickly for $d. ; Generates $s4 Runes. consumption = { id = 274156, cast = 0, cooldown = 30, gcd = "spell", talent = "consumption", startsCombat = true, handler = function () gain( 2, "runes" ) applyBuff( "consumption" ) if talent.carnage.enabled then applyBuff( "blood_shield" ) end end, }, -- Talent: Dominates the target undead creature up to level $s1, forcing it to do your bidding for $d. control_undead = { id = 111673, cast = 1.5, cooldown = 0, gcd = "spell", spend = 1, spendType = "runes", talent = "control_undead", startsCombat = false, usable = function () return target.is_undead, "requires undead target" end, handler = function () summonPet( "controlled_undead" ) end, }, -- Talent: Summons a rune weapon for $81256d that mirrors your melee attacks and bolsters your defenses. While active, you gain $81256s1% parry chance. dancing_rune_weapon = { id = 49028, cast = 0, cooldown = function () return pvptalent.last_dance.enabled and 60 or 120 end, gcd = "spell", talent = "dancing_rune_weapon", startsCombat = true, toggle = "cooldowns", handler = function () applyBuff( "dancing_rune_weapon" ) if talent.gift_of_the_sanlayn.enabled then applyBuff( "gift_of_the_sanlayn", buff.dancing_rune_weapon.remains ) end if talent.insatiable_blade.enabled then addStack( "bone_shield", nil, buff.dancing_rune_weapon.up and 10 or 5 ) end if talent.the_blood_is_life.enabled then summonPet( "blood_beast" ) end if set_bonus.tww1_4pc > 0 then if buff.bone_shield.up then applyBuff( "piledriver", nil, buff.bone_shield.stack ) else removeBuff( "piledriver" ) end end -- legacy if azerite.eternal_rune_weapon.enabled then applyBuff( "dancing_rune_weapon" ) end if legendary.crimson_rune_weapon.enabled then addStack( "bone_shield", nil, buff.dancing_rune_weapon.up and 10 or 5 ) end end, }, -- Command the target to attack you. dark_command = { id = 56222, cast = 0, cooldown = 8, gcd = "off", startsCombat = true, nopvptalent = "murderous_intent", handler = function () applyDebuff( "target", "dark_command" ) end, }, dark_simulacrum = { id = 77606, cast = 0, cooldown = 20, gcd = "spell", spend = 0, spendType = "runic_power", 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, }, -- Corrupts the targeted ground, causing ${$341340m1*11} Shadow damage over $d to targets within the area.$?!c2[; While you remain within the area, your ][]$?s223829&!c2[Necrotic Strike and ][]$?c1[Heart Strike will hit up to $188290m3 additional targets.]?s207311&!c2[Clawing Shadows will hit up to ${$55090s4-1} enemies near the target.]?!c2[Scourge Strike will hit up to ${$55090s4-1} enemies near the target.][; While you remain within the area, your Obliterate will hit up to $316916M2 additional $Ltarget:targets;.] death_and_decay = { id = 43265, noOverride = 324128, cast = 0, charges = function () if talent.deaths_echo.enabled then return 2 end end, cooldown = 15, recharge = function () if talent.deaths_echo.enabled then return 15 end end, gcd = "spell", spend = function () return buff.crimson_scourge.up and 0 or 1 end, spendType = "runes", startsCombat = true, usable = function () return ( settings.dnd_while_moving or not moving ), "cannot cast while moving" end, handler = function () if buff.crimson_scourge.up then if talent.perseverance_of_the_ebon_blade.enabled then applyBuff( "perseverance_of_the_ebon_blade" ) end removeBuff( "crimson_scourge" ) if talent.relish_in_blood.enabled then gain( 10, "runic_power" ) gain( 0.25 * buff.bone_shield.stack, "health" ) end end if legendary.phearomones.enabled and buff.death_and_decay.down then stat.haste = stat.haste + ( state.spec.blood and 0.1 or 0.15 ) end applyBuff( "death_and_decay_actual" ) end, }, death_chain = { id = 203173, cast = 0, cooldown = 30, gcd = "spell", startsCombat = true, texture = 1390941, pvptalent = "death_chain", handler = function () applyDebuff( "target", "death_chain" ) active_dot.death_chain = min( 3, active_enemies ) end, }, -- Fires a blast of unholy energy at the target$?a377580[ and $377580s2 additional nearby target][], causing $47632s1 Shadow damage to an enemy or healing an Undead ally for $47633s1 health.$?s390268[ Increases the duration of Dark Transformation by $390268s1 sec.][] death_coil = { id = 47541, cast = 0, cooldown = 0, gcd = "spell", spend = 30, spendType = "runic_power", startsCombat = false, handler = function () end, }, -- Opens a gate which you can use to return to Ebon Hold. Using a Death Gate while in Ebon Hold will return you back to near your departure point. death_gate = { id = 50977, cast = 4, cooldown = 60, gcd = "spell", spend = 1, spendType = "runes", startsCombat = false, handler = function () end, }, -- Harnesses the energy that surrounds and binds all matter, drawing the target toward you$?a389679[ and slowing their movement speed by $389681s1% for $389681d][]$?s137008[ and forcing the enemy to attack you][]. death_grip = { id = 49576, cast = 0, charges = function () if talent.deaths_echo.enabled then return 2 end end, cooldown = 15, recharge = function () if talent.deaths_echo.enabled then return 15 end end, gcd = "off", startsCombat = true, handler = function () applyDebuff( "target", "death_grip" ) setDistance( 5 ) if legendary.grip_of_the_everlasting.enabled and buff.grip_of_the_everlasting.down then applyBuff( "grip_of_the_everlasting" ) else removeBuff( "grip_of_the_everlasting" ) end if conduit.unending_grip.enabled then applyDebuff( "target", "unending_grip" ) end end, auras = { unending_grip = { id = 338311, duration = 5, max_stack = 1 } } }, -- Talent: Create a death pact that heals you for $s1% of your maximum health, but absorbs incoming healing equal to $s3% of your max health for $d. death_pact = { id = 48743, cast = 0, cooldown = 120, gcd = "off", talent = "death_pact", startsCombat = false, toggle = "defensives", handler = function () applyDebuff( "target", "death_pact" ) end, }, -- Talent: Focuses dark power into a strike$?s137006[ with both weapons, that deals a total of ${$s1+$66188s1}][ that deals $s1] Physical damage and heals you for ${$s2}.2% of all damage taken in the last $s4 sec, minimum ${$s3}.1% of maximum health. death_strike = { id = 49998, cast = 0, cooldown = 0, gcd = "spell", spend = function () return ( ( talent.ossuary.enabled and buff.bone_shield.stack >= 5 ) and 40 or 45 ) - ( talent.improved_death_strike.enabled and 5 or 0 ) - ( buff.blood_draw.up and 10 or 0 ) - ( set_bonus.tww2 >= 4 and buff.luck_of_the_draw.up and 10 or 0 ) end, spendType = "runic_power", talent = "death_strike", startsCombat = true, handler = function () applyBuff( "blood_shield" ) -- gain absorb shield gain( health.max * max( 0.074, 0.01 * buff.coagulating_blood.stack * 0.25 ) * ( talent.voracious.enabled and 1.15 or 1 ) * ( talent.improved_death_strike.enabled and 1.05 or 1 ) * ( talent.hemostasis.enabled and ( 1.08 * buff.hemostasis.stack ) or 1 ), "health" ) removeBuff( "coagulating_blood" ) if talent.hemostasis.enabled then removeBuff( "hemostasis" ) end if talent.coagulopathy.enabled then addStack( "coagulopathy" ) end if talent.voracious.enabled then applyBuff( "voracious" ) end if talent.heartrend.enabled then removeBuff( "heartrend" ) end end, }, -- For $d, your movement speed is increased by $s1%, you cannot be slowed below $s2% of normal speed, and you are immune to forced movement effects and knockbacks. |cFFFFFFFFPassive:|r You cannot be slowed below $124285s1% of normal speed. deaths_advance = { id = 48265, cast = 0, charges = function () if talent.deaths_echo.enabled then return 2 end end, cooldown = function () return azerite.march_of_the_damned.enabled and 40 or 45 end, recharge = function () if talent.deaths_echo.enabled then return ( azerite.march_of_the_damned.enabled and 40 or 45 ) end end, gcd = "off", startsCombat = false, handler = function () applyBuff( "deaths_advance" ) if talent.march_of_darkness.enabled then applyBuff( "march_of_darkness" ) end if conduit.fleeting_wind.enabled then applyBuff( "fleeting_wind" ) end end, auras = { -- Conduit fleeting_wind = { id = 338093, duration = 3, max_stack = 1 } } }, -- Talent: Reach out with necrotic tendrils, dealing $s1 Shadow damage and applying Blood Plague to your target and generating $s3 Bone Shield charges. |Tinterface\icons\spell_deathknight_bloodplague.blp:24|t |cFFFFFFFFBlood Plague|r $@spelldesc55078 deaths_caress = { id = 195292, cast = 0, cooldown = 6, gcd = "spell", spend = 1, spendType = "runes", startsCombat = true, handler = function () applyDebuff( "target", "blood_plague" ) if buff.dancing_rune_weapon.up then applyRunePlagues() end local RWStrikes = 1 + buff.dancing_rune_weapon.active_weapons -- the 1 is your actual spell hit addStack( "bone_shield", nil, ( 2 * RWStrikes ) ) if set_bonus.tww1_4pc > 0 then if buff.bone_shield.up then applyBuff( "piledriver", nil, buff.bone_shield.stack ) else removeBuff( "piledriver" ) end end end, }, -- Talent: Shadowy tendrils coil around all enemies within $A2 yards of a hostile or friendly target, pulling them to the target's location. gorefiends_grasp = { id = 108199, cast = 0, cooldown = function () return talent.tightening_grasp.enabled and 90 or 120 end, gcd = "spell", talent = "gorefiends_grasp", startsCombat = false, toggle = "interrupts", handler = function () if talent.tightening_grasp.enabled then applyDebuff( "target", "tightening_grasp" ) end end, }, -- Talent: Instantly strike the target and 1 other nearby enemy, causing $s2 Physical damage, and reducing enemies' movement speed by $s5% for $d$?s316575[ |cFFFFFFFFGenerates $s3 bonus Runic Power][]$?s221536[, plus ${$210738s1/10} Runic Power per additional enemy struck][].|r heart_strike = { id = function () return ( buff.vampiric_strike.up or buff.gift_of_the_sanlayn.up ) and 433895 or 206930 end, known = 206930, cast = 0, cooldown = 0, gcd = "spell", spend = 1, spendType = "runes", talent = "heart_strike", texture = function () return ( buff.vampiric_strike.up or buff.gift_of_the_sanlayn.up ) and 5927645 or 135675 end, startsCombat = true, max_targets = function () return buff.death_and_decay.up and talent.cleaving_strikes.enabled and 5 or 2 end, handler = function () local strikes = 1 + buff.dancing_rune_weapon.active_weapons if talent.heartbreaker.enabled then gain( 15 + ( talent.heartbreaker.enabled and ( 2 * min( action.heart_strike.max_targets, true_active_enemies ) ) or 0 ) + 3 * buff.dancing_rune_weapon.active_weapons, "runic_power" ) end -- San'Layn stuff if buff.vampiric_strike.up or buff.gift_of_the_sanlayn.up then gain( 0.02 * health.max, "health" ) addStack( "essence_of_the_blood_queen" ) -- TODO: mod haste if talent.infliction_of_sorrow.enabled and dot.blood_plague.ticking then dot.blood_plague.expires = dot.blood_plague.expires + 3 end removeBuff( "vampiric_strike" ) else applyDebuff( "target", "heart_strike" ) active_dot.heart_strike = min( true_active_enemies, active_dot.heart_strike + action.heart_strike.max_targets ) end if talent.infliction_of_sorrow.enabled and buff.infliction_of_sorrow.up then removeDebuff( "target", "blood_plague" ) removeBuff( "infliction_of_sorrow" ) end if talent.incite_terror.enabled then applyDebuff( "target", "incite_terror", nil, min( debuff.incite_terror.stack + 1, debuff.incite_terror.max_stack ) ) end -- PvP if pvptalent.blood_for_blood.enabled then health.current = health.current - 0.03 * health.max end --- Legacy if set_bonus.tier31_4pc > 0 and debuff.ashen_decay.up and set_bonus.tier31_4pc > 0 then debuff.ashen_decay.expires = debuff.ashen_decay.expires + 1 end if azerite.deep_cuts.enabled then applyDebuff( "target", "deep_cuts" ) end if legendary.gorefiends_domination.enabled and cooldown.vampiric_blood.remains > 0 then gainChargeTime( "vampiric_blood", 2 ) end if set_bonus.tier31_4pc > 0 and buff.ashen_decay_proc.up then applyDebuff( "target", "ashen_decay" ) removeBuff( "ashen_decay_proc" ) end if set_bonus.tier30_4pc > 0 and buff.vampiric_strength.up then buff.vampiric_strength.expires = buff.vampiric_strength.expires + 0.5 end end, bind = "vampiric_strike", copy = { 206930, "vampiric_strike", 433895 } }, -- Talent: Your blood freezes, granting immunity to Stun effects and reducing all damage you take by $s3% for $d. icebound_fortitude = { id = 48792, cast = 0, cooldown = function () return 180 - ( talent.acclimation.enabled and 60 or 0 ) - ( azerite.cold_hearted.enabled and 15 or 0 ) + ( conduit.chilled_resilience.mod * 0.001 ) end, gcd = "off", talent = "icebound_fortitude", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "icebound_fortitude" ) end, }, -- Draw upon unholy energy to become Undead for $d, increasing Leech by $s1%$?a389682[, reducing damage taken by $s8%][], and making you immune to Charm, Fear, and Sleep. lichborne = { id = 49039, cast = 0, cooldown = function() return 120 - ( talent.deaths_messenger.enabled and 30 or 0 ) end, gcd = "off", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "lichborne" ) if conduit.hardened_bones.enabled then applyBuff( "hardened_bones" ) end end, auras = { -- Conduit hardened_bones = { id = 337973, duration = 10, max_stack = 1 } } -- deaths_messenger[437122] #0: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -30000.0, 'target': TARGET_UNIT_CASTER, 'modifies': COOLDOWN, } }, -- Talent: Places a Mark of Blood on an enemy for $d. The enemy's damaging auto attacks will also heal their victim for $206940s1% of the victim's maximum health. mark_of_blood = { id = 206940, cast = 0, cooldown = 6, gcd = "spell", talent = "mark_of_blood", startsCombat = false, handler = function () applyDebuff( "target", "mark_of_blood" ) end, }, -- Talent: Smash the target, dealing $s2 Physical damage and generating $s3 charges of Bone Shield. |Tinterface\icons\ability_deathknight_boneshield.blp:24|t |cFFFFFFFFBone Shield|r $@spelldesc195181 marrowrend = { id = 195182, cast = 0, cooldown = 0, gcd = "spell", spend = function() return talent.exterminate.enabled and buff.exterminate.up and 1 or 2 end, spendType = "runes", talent = "marrowrend", startsCombat = true, handler = function () local RWStrikes = 1 + buff.dancing_rune_weapon.active_weapons -- the 1 is your actual spell hit addStack( "bone_shield", 30, buff.bone_shield.stack + 3 * RWStrikes ) if talent.exterminate.enabled and buff.exterminate.up then removeStack( "exterminate" ) applyDebuff( "target", "blood_plague" ) if buff.dancing_rune_weapon.up then applyRunePlagues() end applyBuff( "bonestorm", 2 ) end if talent.ossified_vitriol.enabled then removeBuff( "ossified_vitriol" ) end if set_bonus.tww1_4pc > 0 then if buff.bone_shield.up then applyBuff( "piledriver", nil, buff.bone_shield.stack ) else removeBuff( "piledriver" ) end end -- Legacy if azerite.bones_of_the_damned.enabled then applyBuff( "bones_of_the_damned" ) end end, }, -- Talent: Smash the target's mind with cold, interrupting spellcasting and preventing any spell in that school from being cast for $d. mind_freeze = { id = 47528, cast = 0, cooldown = 15, gcd = "off", talent = "mind_freeze", startsCombat = true, 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 if talent.coldthirst.enabled then gain( 10, "runic_power" ) reduceCooldown( "mind_freeze", 3 ) end interrupt() end, }, murderous_intent = { id = 207018, cast = 0, cooldown = 20, gcd = "spell", startsCombat = true, texture = 136088, pvptalent = "murderous_intent", handler = function () applyDebuff( "target", "focused_assault" ) end, }, -- Activates a freezing aura for $d that creates ice beneath your feet, allowing party or raid members within $a1 yards to walk on water. Usable while mounted, but being attacked or damaged will cancel the effect. path_of_frost = { id = 3714, cast = 0, cooldown = 0, gcd = "spell", spend = 1, spendType = "runes", startsCombat = false, handler = function () applyBuff( "path_of_frost" ) end, }, --[[ Pours dark energy into a dead target, reuniting spirit and body to allow the target to reenter battle with $s2% health and at least $s1% mana. raise_ally = { id = 61999, cast = 0, cooldown = 600, gcd = "spell", spend = 30, spendType = "runic_power", startsCombat = false, toggle = "cooldowns", handler = function () -- trigger voidtouched [97821] end, }, ]] -- Talent: Raises a $?s58640[geist][ghoul] to fight by your side. You can have a maximum of one $?s58640[geist][ghoul] at a time. Lasts $46585d. raise_dead = { id = 46585, cast = 0, cooldown = 120, gcd = "off", talent = "raise_dead", startsCombat = false, toggle = "cooldowns", usable = function () return not pet.alive, "cannot have an active pet" end, handler = function() summonPet( "ghoul" ) end, }, -- Viciously slice into the soul of your enemy, dealing $?a137008[$s1][$s4] Shadowfrost damage and applying Reaper's Mark.; Each time you deal Shadow or Frost damage, add a stack of Reaper's Mark. After $434765d or reaching $434765u stacks, the mark explodes, dealing $?a137008[$436304s1][$436304s2] damage per stack.; Reaper's Mark travels to an unmarked enemy nearby if the target dies, or explodes below 35% health when there are no enemies to travel to. This explosion cannot occur again on a target for $443761d. reapers_mark = { id = 439843, cast = 0.0, cooldown = function() return 60.0 - ( 15 * talent.reapers_onslaught.rank ) end, gcd = "spell", spend = 2, spendType = 'runes', talent = "reapers_mark", startsCombat = true, handler = function () applyDebuff( "target", "reapers_mark" ) if talent.grim_reaper.enabled then addStack( "bone_shield", nil, 3 ) end if talent.reaper_of_souls.enabled then setCooldown( "soul_reaper", 0 ) applyBuff( "reaper_of_souls" ) end if set_bonus.tww3 >= 2 then addStack( "exterminate", 2 ) end end, -- Effects: -- #0: { 'type': SCHOOL_DAMAGE, 'subtype': NONE, 'attributes': ['Chain from Initial Target', 'Enforce Line Of Sight To Chain Targets'], 'ap_bonus': 0.8, 'target': TARGET_UNIT_TARGET_ENEMY, } -- #1: { 'type': TRIGGER_SPELL, 'subtype': NONE, 'trigger_spell': 434765, 'value': 10, 'schools': ['holy', 'nature'], 'target': TARGET_UNIT_TARGET_ENEMY, } -- #2: { 'type': ENERGIZE, 'subtype': NONE, 'points': 200.0, 'target': TARGET_UNIT_CASTER, 'resource': runic_power, } -- #3: { 'type': SCHOOL_DAMAGE, 'subtype': NONE, 'attributes': ['Chain from Initial Target', 'Enforce Line Of Sight To Chain Targets'], 'ap_bonus': 1.5, 'target': TARGET_UNIT_TARGET_ENEMY, } }, -- Strike the target for $s1 Physical damage. This attack cannot be dodged, blocked, or parried. rune_strike = { id = 316239, cast = 0, cooldown = 0, gcd = "spell", spend = 1, spendType = "runes", notalent = "heart_strike", startsCombat = true, handler = function () end, }, -- Talent: Reduces all damage taken by $s1% for $d. rune_tap = { id = 194679, cast = 0, charges = function () if level > 43 then return 2 end end, cooldown = 25, recharge = function () if level > 43 then return 25 end end, gcd = "off", spend = 1, spendType = "runes", talent = "rune_tap", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "rune_tap" ) end, }, -- Talent: Sacrifice your ghoul to deal $327611s1 Shadow damage to all nearby enemies and heal for $s1% of your maximum health. Deals reduced damage beyond $327611s2 targets. sacrificial_pact = { id = 327574, cast = 0, cooldown = 120, gcd = "spell", spend = 20, spendType = "runic_power", talent = "sacrificial_pact", startsCombat = false, toggle = "defensives", usable = function () return pet.ghoul.alive, "requires an undead pet" end, handler = function () gain( 0.25 * health.max, "health" ) pet.ghoul.expires = query_time - 0.01 end, }, -- Talent: Strike an enemy for $s1 Shadowfrost damage and afflict the enemy with Soul Reaper. After $d, if the target is below $s3% health this effect will explode dealing an additional $343295s1 Shadowfrost damage to the target. If the enemy that yields experience or honor dies while afflicted by Soul Reaper, gain Runic Corruption. soul_reaper = { id = 343294, cast = 0, cooldown = 6, gcd = "spell", spend = function() return buff.reaper_of_souls.up and 0 or 1 end, spendType = "runes", talent = "soul_reaper", startsCombat = true, handler = function () if buff.reaper_of_souls.up then removeBuff( "reaper_of_souls" ) end applyBuff( "soul_reaper" ) end, }, strangulate = { id = 47476, cast = 0, cooldown = 45, gcd = "spell", spend = 0, spendType = "runes", toggle = "interrupts", pvptalent = "strangulate", interrupt = true, startsCombat = true, texture = 136214, debuff = "casting", readyTime = state.timeToInterrupt, handler = function () interrupt() applyDebuff( "target", "strangulate" ) end, }, -- Talent: Consume up to $s5 Bone Shield charges. For each charge consumed, you gain $s3 Runic Power and absorb damage equal to $s4% of your maximum health for $d. tombstone = { id = 219809, cast = 0, cooldown = 60, gcd = "spell", talent = "tombstone", startsCombat = true, buff = "bone_shield", handler = function () local bs = min( 5, buff.bone_shield.stack ) if talent.insatiable_blade.enabled then reduceCooldown( "dancing_rune_weapon", bs * 5 ) end if talent.blood_tap.enabled then gainChargeTime( "blood_tap", bs * 2 ) end removeStack( "bone_shield", bs ) gain( 6 * bs, "runic_power" ) if set_bonus.tww1_4pc > 0 then if buff.bone_shield.up then applyBuff( "piledriver", nil, buff.bone_shield.stack ) else removeBuff( "piledriver" ) end end applyBuff( "tombstone" ) -- Legacy if set_bonus.tier21_2pc == 1 then cooldown.dancing_rune_weapon.expires = max( 0, cooldown.dancing_rune_weapon.expires - ( 3 * bs ) ) end end, }, -- Talent: Embrace your undeath, increasing your maximum health by $s4% and increasing all healing and absorbs received by $s1% for $d. vampiric_blood = { id = 55233, cast = 0, cooldown = function () return 90 * ( essence.vision_of_perfection.enabled and 0.87 or 1 ) end, gcd = "off", talent = "vampiric_blood", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "vampiric_blood" ) if set_bonus.tier30_4pc > 0 then applyBuff( "vampiric_strength" ) end if legendary.gorefiends_domination.enabled then gain( 45, "runic_power" ) end if talent.umbilicus_eternus.enabled then state:QueueAuraExpiration( "vampiric_blood", TriggerUmbilicusEternus, buff.vampiric_blood.expires ) end end, }, -- Talent: Embrace the power of the Shadowlands, removing all root effects and increasing your movement speed by $s1% for $d. Taking any action cancels the effect. While active, your movement speed cannot be reduced below $m2%. wraith_walk = { id = 212552, cast = 4, fixedCast = true, channeled = true, cooldown = 60, gcd = "spell", talent = "wraith_walk", startsCombat = false, start = function () applyBuff( "wraith_walk" ) end, }, } ) spec:RegisterRanges( "death_strike", "mind_freeze", "death_coil" ) spec:RegisterOptions( { enabled = true, aoe = 3, cycle = false, nameplates = true, nameplateRange = 10, rangeFilter = false, damage = true, damageExpiration = 8, potion = "tempered_potion", package = "Blood", } ) spec:RegisterSetting( "dnd_while_moving", true, { name = strformat( "Allow %s while moving", Hekili:GetSpellLinkWithTexture( spec.abilities.death_and_decay.id ) ), desc = strformat( "If checked, then allow recommending %s while the player is moving otherwise only recommend it if the player is standing still.", Hekili:GetSpellLinkWithTexture( spec.abilities.death_and_decay.id ) ), type = "toggle", width = "full", } ) spec:RegisterSetting( "save_blood_shield", true, { name = strformat( "Save %s", Hekili:GetSpellLinkWithTexture( spec.auras.blood_shield.id ) ), desc = strformat( "If checked, the default priority (or any priority checking |cFFFFD100save_blood_shield|r) will try to avoid letting your %s fall off during " .. "lulls in damage.", Hekili:GetSpellLinkWithTexture( spec.auras.blood_shield.id ) ), type = "toggle", width = "full" } ) spec:RegisterSetting( "death_strike_pool_amount", 65, { name = strformat( "%s %s", Hekili:GetSpellLinkWithTexture( spec.abilities.death_strike.id ), _G.POWER_TYPE_RUNIC_POWER ), desc = strformat( "The default priority will (usually) avoid spending %s on %s unless you have pooled at least this much.", _G.POWER_TYPE_RUNIC_POWER, Hekili:GetSpellLinkWithTexture( spec.abilities.death_strike.id ) ), type = "range", min = 40, max = 125, step = 1, width = "full" } ) spec:RegisterSetting( "ibf_damage", 40, { name = strformat( "%s Damage Threshold", Hekili:GetSpellLinkWithTexture( spec.abilities.icebound_fortitude.id ) ), desc = strformat( "When set above zero, the default priority can recommend %s if you've lost this percentage of your maximum health in the past 5 seconds.\n\n" .. "|W%s|w also requires the Defensives toggle by default.", Hekili:GetSpellLinkWithTexture( spec.abilities.icebound_fortitude.id ), spec.abilities.icebound_fortitude.name ), type = "range", min = 0, max = 200, step = 1, width = "full", } ) spec:RegisterSetting( "rt_damage", 30, { name = strformat( "%s Damage Threshold", Hekili:GetSpellLinkWithTexture( spec.abilities.rune_tap.id ) ), desc = strformat( "When set above zero, the default priority can recommend %s if you've lost this percentage of your maximum health in the past 5 seconds.\n\n" .. "|W%s|w also requires the Defensives toggle by default.", Hekili:GetSpellLinkWithTexture( spec.abilities.rune_tap.id ), spec.abilities.rune_tap.name ), type = "range", min = 0, max = 200, step = 1, width = "full", } ) spec:RegisterSetting( "vb_damage", 50, { name = strformat( "%s Damage Threshold", Hekili:GetSpellLinkWithTexture( spec.abilities.vampiric_blood.id ) ), desc = strformat( "When set above zero, the default priority can recommend %s if you've lost this percentage of your maximum health in the past 5 seconds.\n\n" .. "|W%s|w also requires the Defensives toggle by default.", Hekili:GetSpellLinkWithTexture( spec.abilities.vampiric_blood.id ), spec.abilities.vampiric_blood.name ), type = "range", min = 0, max = 200, step = 1, width = "full", } ) spec:RegisterPack( "Blood", 20250429, [[Hekili:DR1xVnoUr8plbfWNDsoxl7OSzlI8d3wuGDF4EO(U23SmTeDSqKLeOOIVuyOp7DiPSePejLCs2Rl6l5UvKZF4W5p)MHETZ6FB9QqefV(xNpBU7S7M)5PZND39U3VEf91m86vzOGNrpb)pjOdWF)L400q2xFnoffYOopTGeaRSk6qrmIgLM8fcAhD9QTfrX0VMSERgj44SWfindhaF2D26v7JcdXI9IZdwVIT3FE2D)88p)3k38pX5VMeuU5yeDF5gqqFz9Q4OCAot(7JEAVFgjk1hfWKE(0q8ourmfw8x5NpCcABmoC9VSEvajIIjrO1RgxUHuKGl38Ox5M5LBgj(3tPrhW(0u)fLBwwU5PGWPhq)bF5G9iYt4C)DeHGqXWwaIDM(q5MjRxj(kCUzMiFkkB9QICSF6UD(aBy6cfoSdtHC6vHgQaxWeyRpxtjbfbReIHBsjLcO6oJQ52ID7MUnnb7NVpchhoLGpGIsYb9ws7UgSPnIbeaDFUFaIGZZzS31o7dsrpveNMbu960ImUTO7cnc2ZUK9ZPKONXmbFVrbFvLieuGscbZsaIj(gUHsE1pmjKXOpzKrHP0PIBKSyqBXdXaj2)20OygVFWiVz7)fSpobFicdCS2tbCEOmVtAT7swa1FHlxOWFNW3vRTegH5(uaXmLgcKJ9jyugM0OZ3iroSpWkThts9PemEAokjg9As5MtNk3KbmoeLeeL8KpZV1)iWP0eLtVRIBRK8yN6pB8ulclafDHKNlte6D5HupHB9dcZRtautexy5(hqKNB5WpxEFAohT2(IHhFKtHmOImfUsMrkkgNag99ikJsqAmIMwXtHnTTVink4zyNQb)av50uYHlmSvsTE4dtTe5jttJdtpMy3DGj45UnNdA6HTW5ibBp)qDyQgEReQUn9qucVCKFC0HTv(fTQmCE3WwdH86y8)bRZVqstKuxMBhW7N2tZbdXlPIfAzYJssWeWlppkocNeG5kPOuQjwOX9Q(YgUQbRxCku6RIlkFQB6)7KpMSLbT7qERdzpPJ7ZwlYETRG8Q9uSdJzqakMW8NSNMDqmdwgmpeumu7jUNCRdIH7Iiy(X1EgRbXRS6RBNzg5efLiITGaROKaMt9t(HOdaKmF3QWOx2w9f(UUIhkBrdebXcVZa820cMVFkHgrlcX81LsV8c6qwejkWV(u70gtvkCMYXuzAavhwL9)fxa)hhxEHeqTCMXl9vLLHGbuC79JseCVjlZKZ7FHY2lsafHLykPGhzRHaaszCSVOqx(09yeHwv(xMt8VVfkh8muRRMjxZbcoHFa8frxKmiUCxuqe1NUhII3dP24gHbIJ7ppGLoMlj9DczPZDVjOLo9KT59IT0PNeqF)ax6yoB1fIU0XCAQ3p8shZ5T()z8LZBNK98(6Meu0ekjktSHFphohFTAxLB(hN3gKrEx5Mxtl(jcMD4fjQZH7ziHbKMbo2vPLrm6GnYmej)eSWE0lWN)7IZd0Glp88FZprLBsjLB(xv5Dl3W74UCtr20lTUq02DV1cdQP9RkkWmITt(3fpExtN409BOSVpgSB7yTUvyd1EL9gSJqjejZyt3iFew1(lfZS6MR2OjAzupqKzjScOQjRlsQMEIpBUkIPRuvce4RFi5ixpmxJPJEOvomuywfeRRnMGm3iZWeuphioDm5yTrJHjkRNPQgrzIY6OhgMOSDQ4vw2Y6yJNUdwmJGb)5TOUT7OwZ0Edp9JU7tYaMKQEd5E3XGm5l2hxNoFhBD0CVJE8(G7JVB56MWlDntFUf)b2cmuDvQd4b2jVOkP1eoJmI24CP2EpbcS2zPhHI1viGfjdxm7YoHM6XN2YL1QhHwTbk4F2xCQoC6NBjWeYbbyhowPfsDqu1Ia(fmjgX6TMpcKqL2ewOa0OnoqZzR5MD8Fa)lUJlwXD(aIqspsWciGx(eMa7X9NljXrjE2F68aAmjkZ(A9z6Qeg540Tz(DKIkSZEG9laQXMhcd3w(z)4H4NzeY3aM2R5iO2yHBANZs3cQdPKBacbh8Nf6ZN6Ke(SxJAwPhK3xqAsEXHk8ukBZmoEZDu6ASRaZZGOcXJOzagGfLUhNl35rd3LB9MZFLkqsYUv3HkjWvysRnAoarFUl42BMuTdsaIHynLarbuodV8HNcNBhhtLvRR3Xapzn72BTuJHshwhnrBV6MlvUKIlcEMfds3d9UtqhLkz8MYbBojP5RVbNr5Ub6Q4oWWU7hwy3NgIJmTbNz)39rj7IJ4muK)JLCwP0q7GPEQWu3NHGcRSY69W)dYrAok8d2b0k0FT1pTgqkRigbbBbALA6j1c03pqhyZZFQUPvhZEcxsvN(C)RkN0FWjpsbGALZ2N4xia8N1RoIijGjhQT)1dzqhXmGxpiC4yJiH)6)tl)giIc6(uc)NFWxy98KUlI1BIyJ5tRBc6gV)Qs(5YVPBlNVcVL1nJNX7XB5)17tLFRMnaXsVIK8Np)QlcEA4vFUnANxvUGopyKzMj94p3kniwphDKKl)XM3SPwYgIZLjQ(TzUaIuFdMlGW63A5cOjt1y2pbQJKHry1eHg1DAql9QFPLrxn2IaoDY8iDMOkDz3nD5VQ80CCVzSZSRT)UjtUz8IR77TsGnz(nsU2Y7JC98jDDGOOmvhpMfCmZA8O38rk4exSScJ4OUOtx65m9HlK9ogyVcBAEfcZXhkPfQDD08mepwjHRN3H8k7xn1TEKHrglh(ONwMw9wam(DLj4HDSwS0Wmkm9eb61FPEMyeRwshSYJ1o4)hDNmQ74(xo2WG(Vb2(4R6mLRtN6zS(Gyk)2FPCZpkJGx2W1n8UV0hndKFq5p6mUyjBXpAZuxjORq8wa9zoQNRopsE5I3MrzWjBjQtpvKZTQbTBftBvKGPJB6ObwmP9OGBerqyUDrmefLTVHZf9kJyG0kCPByzVkJ8K76LxniTec3t(NHv7fzju7AN1SRA05AZyZbLV0Zfs6y)x00Ptg(1mnrJmRNFPnz(W7qMJgY4Uw6n3vJY1EA4s1om44kXeP7tV2f000VYJw756MX2NB41laqiggZkSME1IHVUUPOA7V6SuVek7CZ949JUsFBFM4QAvx7NzG3kZ0WitBvoMRRDNn6GCuSR4v9C3NBYivabmyDgbZSCHrrk7uzCtsnDoqJUEOKUgPwgSBLVngO40jfSKZziLgGgmiXyCtQJG0qK2Y5ZSBtTcCv4y74ihR353lVx)yTF7q57kUpiW9AzCVW91sv)2rZaOnZWp0wc0kMlPjbl3dVH2g0YTF8BKWQRZzqRDCjfGtLdHQq05D5LCBXH(q70STUWD6EzpYaKe3bvTyPJRobRG5zS1kfguRjM1lDj88wmBy6ldfKQgdLy9ExgQoSttW842o2vnGO5PtMO7aAh7Konqnm1iqIgc0x(r)rs36ARdRtFADbWIe9AxIv0DM(x4Od1AkrR21x9lAOJ0)mW10iT3nozDmvfPQEaPgCFFS)3FqBaNmcd9NUHCnXZs6OBNM8MKV0AbNsVy4pwW6)l]] )