You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2378 lines
76 KiB
2378 lines
76 KiB
|
3 years ago
|
-- Covenants.lua
|
||
|
|
-- November 2020
|
||
|
|
|
||
|
|
local addon, ns = ...
|
||
|
|
local Hekili = _G[ addon ]
|
||
|
|
|
||
|
|
local state = Hekili.State
|
||
|
|
local class = Hekili.Class
|
||
|
|
|
||
|
|
local all = Hekili.Class.specs[ 0 ]
|
||
|
|
|
||
|
|
local GetItemCooldown = _G.GetItemCooldown
|
||
|
|
local AreCovenantsDisabled = ns.AreCovenantsDisabled
|
||
|
|
|
||
|
|
-- Covenants
|
||
|
|
do
|
||
|
|
local CovenantSignatures = {
|
||
|
|
kyrian = { 324739 },
|
||
|
|
necrolord = { 324631 },
|
||
|
|
night_fae = { 310143, 324701 },
|
||
|
|
venthyr = { 300728 },
|
||
|
|
}
|
||
|
|
|
||
|
|
CovenantSignatures[1] = CovenantSignatures.kyrian
|
||
|
|
CovenantSignatures[2] = CovenantSignatures.venthyr
|
||
|
|
CovenantSignatures[3] = CovenantSignatures.night_fae
|
||
|
|
CovenantSignatures[4] = CovenantSignatures.necrolord
|
||
|
|
|
||
|
|
local CovenantKeys = { "kyrian", "venthyr", "night_fae", "necrolord" }
|
||
|
|
local GetActiveCovenantID = C_Covenants.GetActiveCovenantID
|
||
|
|
|
||
|
|
-- v1, no caching.
|
||
|
|
state.covenant = setmetatable( {}, {
|
||
|
|
__index = function( t, k )
|
||
|
|
if AreCovenantsDisabled() then
|
||
|
|
if type( k ) == "string" and k == "none" then return true end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
if type( k ) == "number" then
|
||
|
|
if disabled then return false end
|
||
|
|
|
||
|
|
if GetActiveCovenantID() == k then return true end
|
||
|
|
if CovenantSignatures[ k ] then
|
||
|
|
for _, spell in ipairs( CovenantSignatures[ k ] ) do
|
||
|
|
if IsSpellKnownOrOverridesKnown( spell ) then return true end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Strings.
|
||
|
|
local myCovenant = GetActiveCovenantID()
|
||
|
|
|
||
|
|
if k == "none" then
|
||
|
|
if disabled then return true end
|
||
|
|
|
||
|
|
-- thanks glue
|
||
|
|
if myCovenant > 0 then return false end
|
||
|
|
|
||
|
|
-- We have to rule out Threads of Fate as well as real Covenants.
|
||
|
|
for i, cov in ipairs( CovenantSignatures ) do
|
||
|
|
for _, spell in ipairs( cov ) do
|
||
|
|
if IsSpellKnownOrOverridesKnown( spell ) then return false end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
if disabled then return false end
|
||
|
|
|
||
|
|
if myCovenant > 0 then
|
||
|
|
if k == CovenantKeys[ myCovenant ] then return true end
|
||
|
|
end
|
||
|
|
|
||
|
|
if CovenantSignatures[ k ] then
|
||
|
|
for _, spell in ipairs( CovenantSignatures[ k ] ) do
|
||
|
|
if IsSpellKnownOrOverridesKnown( spell ) then return true end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Support covenant.fae_guardians and similar syntax.
|
||
|
|
if class.abilities[ k ] then
|
||
|
|
if state:IsKnown( k ) then return true end
|
||
|
|
end
|
||
|
|
|
||
|
|
return false
|
||
|
|
end,
|
||
|
|
} )
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
-- 9.0 Covenant Shared Abilities and Effects
|
||
|
|
do
|
||
|
|
all:RegisterGear( "relic_of_the_first_ones", 184807 )
|
||
|
|
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
door_of_shadows = {
|
||
|
|
id = 300728,
|
||
|
|
cast = 1.5,
|
||
|
|
cooldown = function () return equipped.relic_of_the_first_ones and 48 or 60 end,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
toggle = "cooldowns",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3586270,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
end,
|
||
|
|
},
|
||
|
|
|
||
|
|
phial_of_serenity = {
|
||
|
|
name = function () return ( GetItemInfo( 177278 ) ) or "Phial of Serenity" end,
|
||
|
|
listName = function ()
|
||
|
|
local _, link, _, _, _, _, _, _, _, tex = GetItemInfo( 177278 )
|
||
|
|
if link and tex then return "|T" .. tex .. ":0|t " .. link end
|
||
|
|
return "|cff00ccff[Phial of Serenity]|r"
|
||
|
|
end,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = function () return time > 0 and 3600 or 60 end,
|
||
|
|
gcd = "off",
|
||
|
|
|
||
|
|
item = 177278,
|
||
|
|
bagItem = true,
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 463534,
|
||
|
|
|
||
|
|
toggle = function ()
|
||
|
|
if not toggle.interrupts then return "interrupts" end
|
||
|
|
if not toggle.essences then return "essences" end
|
||
|
|
return "essences"
|
||
|
|
end,
|
||
|
|
|
||
|
|
usable = function ()
|
||
|
|
if GetItemCount( 177278 ) == 0 then return false, "requires phial in bags"
|
||
|
|
elseif not IsUsableItem( 177278 ) then return false, "phial on combat cooldown"
|
||
|
|
elseif health.current == health.max then return false, "requires a health deficit" end
|
||
|
|
return true
|
||
|
|
end,
|
||
|
|
|
||
|
|
readyTime = function ()
|
||
|
|
local start, duration = GetItemCooldown( 177278 )
|
||
|
|
return max( 0, start + duration - query_time )
|
||
|
|
end,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
gain( 0.15 * health.max, "health" )
|
||
|
|
removeBuff( "dispellable_disease" )
|
||
|
|
removeBuff( "dispellable_poison" )
|
||
|
|
removeBuff( "dispellable_curse" )
|
||
|
|
removeBuff( "dispellable_bleed" ) -- TODO: Bleeds?
|
||
|
|
end,
|
||
|
|
},
|
||
|
|
|
||
|
|
fleshcraft = {
|
||
|
|
id = 324631,
|
||
|
|
cast = function () return 3 * haste end,
|
||
|
|
channeled = true,
|
||
|
|
cooldown = function () return equipped.relic_of_the_first_ones and 96 or 120 end,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3586267,
|
||
|
|
|
||
|
|
start = function ()
|
||
|
|
applyBuff( "fleshcraft" )
|
||
|
|
|
||
|
|
if conduit.volatile_solvent.enabled then
|
||
|
|
applyBuff( "volatile_solvent" )
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
fleshcraft = {
|
||
|
|
id = 324867,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
volatile_solvent_beast = {
|
||
|
|
id = 323498,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent_elemental = {
|
||
|
|
id = 323504,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent_aberration = {
|
||
|
|
id = 323497,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent_mechanical = {
|
||
|
|
id = 323507,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent_undead = {
|
||
|
|
id = 323509,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent_humanoid = {
|
||
|
|
id = 323491,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent_demon = {
|
||
|
|
id = 323500,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent_dragonkin = {
|
||
|
|
id = 323502,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent_giant = {
|
||
|
|
id = 323506,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
volatile_solvent = {
|
||
|
|
alias = { "volatile_solvent_beast", "volatile_solvent_elemental", "volatile_solvent_aberration", "volatile_solvent_mechanical", "volatile_solvent_undead", "volatile_solvent_humanoid", "volatile_solvent_demon", "volatile_solvent_dragonkin", "volatile_solvent_giant" },
|
||
|
|
aliasMode = "longest", -- use duration info from the buff with the longest remaining time.
|
||
|
|
aliasType = "buff",
|
||
|
|
duration = 120,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
|
||
|
|
all:RegisterAuras( {
|
||
|
|
echo_of_eonar = {
|
||
|
|
id = 338489,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
|
||
|
|
maw_rattle = {
|
||
|
|
id = 341617,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
|
||
|
|
sephuzs_proclamation = {
|
||
|
|
id = 339463,
|
||
|
|
duration = 15,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
sephuz_proclamation_icd = {
|
||
|
|
duration = 30,
|
||
|
|
max_stack = 1,
|
||
|
|
-- TODO: Track last application of Sephuz's buff via event and create a generator to manufacture this buff.
|
||
|
|
},
|
||
|
|
|
||
|
|
third_eye_of_the_jailer = {
|
||
|
|
id = 339970,
|
||
|
|
duration = 60,
|
||
|
|
max_stack = 5,
|
||
|
|
},
|
||
|
|
|
||
|
|
vitality_sacrifice_buff = {
|
||
|
|
id = 338746,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
--[[ vitality_sacrifice_debuff = {
|
||
|
|
id = 339131,
|
||
|
|
duration = 60,
|
||
|
|
max_stack = 1
|
||
|
|
} ]]
|
||
|
|
} )
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
local baseClass = UnitClassBase( "player" )
|
||
|
|
|
||
|
|
if baseClass == "DEATHKNIGHT" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
shackle_the_unworthy = {
|
||
|
|
id = 312202,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565442,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "shackle_the_unworthy" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
final_sentence = {
|
||
|
|
id = 353823,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 5,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
abomination_limb = {
|
||
|
|
id = 315443,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 120,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3578196,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "abomination_limb" )
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
abominations_frenzy = {
|
||
|
|
id = 353546,
|
||
|
|
duration = 12,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
deaths_due = {
|
||
|
|
id = 324128,
|
||
|
|
cast = 0,
|
||
|
|
charges = function ()
|
||
|
|
if not talent.deaths_echo.enabled then return end
|
||
|
|
return 2
|
||
|
|
end,
|
||
|
|
cooldown = 15,
|
||
|
|
recharge = function ()
|
||
|
|
if not talent.deaths_echo.enabled then return end
|
||
|
|
return 15
|
||
|
|
end,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = function () return buff.crimson_scourge.up and 0 or 1 end,
|
||
|
|
spendType = "runes",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636837,
|
||
|
|
|
||
|
|
notalent = "defile",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
removeBuff( "crimson_scourge" )
|
||
|
|
|
||
|
|
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" )
|
||
|
|
setCooldown( "death_and_decay", 15 )
|
||
|
|
|
||
|
|
applyBuff( "deaths_due_buff" )
|
||
|
|
-- TODO: Model increase RP income within Death's Due.
|
||
|
|
applyDebuff( "target", "deaths_due_debuff" )
|
||
|
|
-- Note: Debuff is actually a buff on the target...
|
||
|
|
end,
|
||
|
|
|
||
|
|
bind = { "defile", "any_dnd" },
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
deaths_due_buff = {
|
||
|
|
id = 324165,
|
||
|
|
duration = function () return legendary.rampant_transference.enabled and 12 or 10 end,
|
||
|
|
max_stack = 15,
|
||
|
|
copy = "deaths_due"
|
||
|
|
},
|
||
|
|
deaths_due_debuff = {
|
||
|
|
id = 324164,
|
||
|
|
duration = 15,
|
||
|
|
max_stack = 15,
|
||
|
|
generate = function( t, auraType )
|
||
|
|
local name, icon, count, debuffType, duration, expirationTime, caster, stealable, nameplateShowPersonal, spellID, canApplyAura, isBossDebuff, nameplateShowAll, timeMod, value1, value2, value3 = FindUnitDebuffByID( "target", 324164, "PLAYER" )
|
||
|
|
|
||
|
|
if name and expirationTime > query_time then
|
||
|
|
t.name = name
|
||
|
|
t.count = count > 0 and count or 1
|
||
|
|
t.expires = expirationTime
|
||
|
|
t.applied = expirationTime - duration
|
||
|
|
t.caster = "player"
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
t.count = 0
|
||
|
|
t.expires = 0
|
||
|
|
t.applied = 0
|
||
|
|
t.caster = "nobody"
|
||
|
|
end
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
swarming_mist = {
|
||
|
|
id = 311648,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 1,
|
||
|
|
spendType = "runes",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565716,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "swarming_mist" )
|
||
|
|
if conduit.impenetrable_gloom.enabled then applyBuff( "impenetrable_gloom" ) end
|
||
|
|
if legendary.insatiable_hunger.enabled then applyBuff( "insatiable_hunger" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
swarming_mist = { -- Venthyr
|
||
|
|
id = 311648,
|
||
|
|
duration = 8,
|
||
|
|
tick_time = 1,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
-- Conduit
|
||
|
|
impenetrable_gloom = {
|
||
|
|
id = 338629,
|
||
|
|
duration = 4,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
insatiable_hunger = {
|
||
|
|
id = 353729,
|
||
|
|
duration = 8,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
elseif baseClass == "DEMONHUNTER" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
elysian_decree = {
|
||
|
|
id = 306830,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565443,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
create_sigil( "elysian_decree" )
|
||
|
|
|
||
|
|
if legendary.blind_faith.enabled then applyBuff( "blind_faith" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
blind_faith = {
|
||
|
|
id = 355894,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
--[[ fodder_to_the_flame = {
|
||
|
|
id = 329554,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 120,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3591588,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "player", "fodder_to_the_flame_chase" )
|
||
|
|
applyDebuff( "player", "fodder_to_the_flame_cooldown" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
-- The buff from standing in the pool.
|
||
|
|
fodder_to_the_flame = {
|
||
|
|
id = 330910,
|
||
|
|
duration = function () return 30 + ( conduit.brooding_pool.mod * 0.001 ) end,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
|
||
|
|
-- The demon is linked to you.
|
||
|
|
fodder_to_the_flame_chase = {
|
||
|
|
id = 328605,
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
|
||
|
|
-- This is essentially the countdown before the demon despawns (you can Imprison it for a long time).
|
||
|
|
fodder_to_the_flame_cooldown = {
|
||
|
|
id = 342357,
|
||
|
|
duration = 120,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
}, ]]
|
||
|
|
the_hunt = {
|
||
|
|
id = 323639,
|
||
|
|
cast = 1,
|
||
|
|
cooldown = 180,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636838,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "the_hunt" )
|
||
|
|
applyDebuff( "target", "the_hunt_dot" )
|
||
|
|
applyDebuff( "target", "the_hunt_root" )
|
||
|
|
setDistance( 5 )
|
||
|
|
|
||
|
|
if legendary.blazing_slaughter.enabled then
|
||
|
|
applyBuff( "immolation_aura" )
|
||
|
|
applyBuff( "blazing_slaughter" )
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
the_hunt_root = {
|
||
|
|
id = 323996,
|
||
|
|
duration = 1.5,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
the_hunt_dot = {
|
||
|
|
id = 345335,
|
||
|
|
duration = 6,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
the_hunt = {
|
||
|
|
id = 323802,
|
||
|
|
duration = 30,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
blazing_slaughter = {
|
||
|
|
id = 355892,
|
||
|
|
duration = 12,
|
||
|
|
max_stack = 20,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
sinful_brand = {
|
||
|
|
id = 317009,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = function () return 60 + ( conduit.sinful_brand.mod * 0.001 ) end,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565717,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "sinful_brand" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
sinful_brand = {
|
||
|
|
id = 317009,
|
||
|
|
duration = 8,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} )
|
||
|
|
elseif baseClass == "DRUID" then
|
||
|
|
local SinfulHysteriaHandler = setfenv( function ()
|
||
|
|
applyBuff( "ravenous_frenzy_sinful_hysteria" )
|
||
|
|
end, state )
|
||
|
|
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
kindred_spirits = {
|
||
|
|
id = 326434,
|
||
|
|
cast = 2.5,
|
||
|
|
cooldown = 0,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3565444,
|
||
|
|
|
||
|
|
essential = true,
|
||
|
|
|
||
|
|
usable = function ()
|
||
|
|
return buff.lone_spirit.down and buff.kindred_spirits.down, "lone_spirit/kindred_spirits already applied"
|
||
|
|
end,
|
||
|
|
|
||
|
|
bind = "empower_bond",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
if not ( buff.moonkin_form.up or buff.treant_form.up ) then unshift() end
|
||
|
|
-- Let's just assume.
|
||
|
|
applyBuff( "lone_spirit" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
-- Damager
|
||
|
|
kindred_empowerment = {
|
||
|
|
id = 327139,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
shared = "player",
|
||
|
|
},
|
||
|
|
-- From Damager
|
||
|
|
kindred_empowerment_partner = {
|
||
|
|
id = 327022,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
dot = "buff",
|
||
|
|
shared = "player",
|
||
|
|
},
|
||
|
|
kindred_focus = {
|
||
|
|
id = 327148,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
shared = "player",
|
||
|
|
},
|
||
|
|
kindred_focus_partner = {
|
||
|
|
id = 327071,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
dot = "buff",
|
||
|
|
shared = "player",
|
||
|
|
},
|
||
|
|
-- Tank
|
||
|
|
kindred_protection = {
|
||
|
|
id = 327037,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
shared = "player",
|
||
|
|
},
|
||
|
|
kindred_protection_partner = {
|
||
|
|
id = 327148,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
dot = "buff",
|
||
|
|
shared = "player",
|
||
|
|
},
|
||
|
|
kindred_spirits = {
|
||
|
|
id = 326967,
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
shared = "player",
|
||
|
|
},
|
||
|
|
lone_spirit = {
|
||
|
|
id = 338041,
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
lone_empowerment = {
|
||
|
|
id = 338142,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
|
||
|
|
kindred_empowerment_energize = {
|
||
|
|
alias = { "kindred_empowerment", "kindred_focus", "kindred_protection", "lone_empowerment" },
|
||
|
|
aliasMode = "first",
|
||
|
|
aliasType = "buff",
|
||
|
|
duration = 10,
|
||
|
|
},
|
||
|
|
|
||
|
|
kindred_affinity = {
|
||
|
|
id = 357564,
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
empower_bond = {
|
||
|
|
id = 326647,
|
||
|
|
known = function () return covenant.kyrian and ( buff.lone_spirit.up or buff.kindred_spirits.up ) end,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = function () return 60 * ( 1 - ( conduit.deep_allegiance.mod * 0.01 ) ) end,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
|
||
|
|
usable = function ()
|
||
|
|
return buff.lone_spirit.up or buff.kindred_spirits.up, "requires kindred_spirits/lone_spirit"
|
||
|
|
end,
|
||
|
|
|
||
|
|
toggle = function () return role.tank and "defensives" or "essences" end,
|
||
|
|
|
||
|
|
bind = "kindred_spirits",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
if buff.lone_spirit.up then
|
||
|
|
if role.tank then applyBuff( "lone_protection" )
|
||
|
|
elseif role.healer then applyBuff( "lone_meditation" )
|
||
|
|
else applyBuff( "lone_empowerment" ) end
|
||
|
|
else
|
||
|
|
if role.tank then
|
||
|
|
applyBuff( "kindred_protection" )
|
||
|
|
applyBuff( "kindred_protection_partner" )
|
||
|
|
elseif role.healer then
|
||
|
|
applyBuff( "kindred_meditation" )
|
||
|
|
applyBuff( "kindred_meditation_partner" )
|
||
|
|
else
|
||
|
|
applyBuff( "kindred_empowerment" )
|
||
|
|
applyBuff( "kindred_empowerment_partner" )
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
|
||
|
|
copy = { "lone_empowerment", "lone_meditation", "lone_protection", 326462, 326446, 338142, 338018 }
|
||
|
|
},
|
||
|
|
ravenous_frenzy = {
|
||
|
|
id = 323546,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 180,
|
||
|
|
gcd = "off",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565718,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "ravenous_frenzy" )
|
||
|
|
|
||
|
|
if legendary.sinful_hysteria.enabled then
|
||
|
|
state:QueueAuraExpiration( "ravenous_frenzy", SinfulHysteriaHandler, buff.ravenous_frenzy.expires )
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
ravenous_frenzy = {
|
||
|
|
id = 323546,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 20,
|
||
|
|
},
|
||
|
|
ravenous_frenzy_sinful_hysteria = {
|
||
|
|
id = 355315,
|
||
|
|
duration = 5,
|
||
|
|
max_stack = 20,
|
||
|
|
},
|
||
|
|
ravenous_frenzy_stun = {
|
||
|
|
id = 323557,
|
||
|
|
duration = 1,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} )
|
||
|
|
elseif baseClass == "HUNTER" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
resonating_arrow = {
|
||
|
|
id = 308491,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565445,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "resonating_arrow" )
|
||
|
|
active_dot.resonating_arrow = active_enemies
|
||
|
|
applyBuff( "resonating_arrow" )
|
||
|
|
if legendary.pact_of_the_soulstalkers.enabled then applyBuff( "pact_of_the_soulstalkers" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
resonating_arrow = {
|
||
|
|
id = 308498,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
pact_of_the_soulstalkers = {
|
||
|
|
id = 356263,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
death_chakram = {
|
||
|
|
id = 325028,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3578207,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "death_chakram" )
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
death_chakram = {
|
||
|
|
duration = 3.5,
|
||
|
|
tick_time = 0.5,
|
||
|
|
max_stack = 1,
|
||
|
|
generate = function( t, auraType )
|
||
|
|
local cast = action.death_chakram.lastCast or 0
|
||
|
|
|
||
|
|
if cast + class.auras.death_chakram.duration >= query_time then
|
||
|
|
t.name = class.abilities.death_chakram.name
|
||
|
|
t.count = 1
|
||
|
|
t.applied = cast
|
||
|
|
t.expires = cast + duration
|
||
|
|
t.caster = "player"
|
||
|
|
return
|
||
|
|
end
|
||
|
|
t.count = 0
|
||
|
|
t.applied = 0
|
||
|
|
t.expires = 0
|
||
|
|
t.caster = "nobody"
|
||
|
|
end
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
wild_spirits = {
|
||
|
|
id = 328231,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 120,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636840,
|
||
|
|
|
||
|
|
spend = 0,
|
||
|
|
spendType = "focus",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "wild_mark" )
|
||
|
|
applyBuff( "wild_spirits" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
disabled = function ()
|
||
|
|
return covenant.night_fae and not IsSpellKnownOrOverridesKnown( 328231 ), "you have not finished your night_fae covenant intro"
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
wild_mark = {
|
||
|
|
id = 328275,
|
||
|
|
duration = function () return conduit.spirit_attunement.enabled and 18 or 15 end,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
wild_spirits = {
|
||
|
|
duration = function () return conduit.spirit_attunement.enabled and 18 or 15 end,
|
||
|
|
max_stack = 1,
|
||
|
|
generate = function( t )
|
||
|
|
local cast = action.wild_spirits.lastCast or 0
|
||
|
|
local up = cast + t.duration > state.query_time
|
||
|
|
|
||
|
|
t.name = t.name or class.abilities.wild_spirits.name
|
||
|
|
t.count = up and 1 or 0
|
||
|
|
t.expires = up and cast + t.duration or 0
|
||
|
|
t.applied = up and cast or 0
|
||
|
|
t.caster = "player"
|
||
|
|
end,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
flayed_shot = {
|
||
|
|
id = 324149,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 30,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565719,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "flayed_shot" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
flayed_shot = {
|
||
|
|
id = 324149,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
flayers_mark = {
|
||
|
|
id = 324156,
|
||
|
|
duration = 12,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
pouch_of_razor_fragments = {
|
||
|
|
id = 356620,
|
||
|
|
duration = 6,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
-- Not really a Covenant ability but putting it here to keep it bundled into SL stuff.
|
||
|
|
wailing_arrow = {
|
||
|
|
id = 355589,
|
||
|
|
cast = 1.9,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 15,
|
||
|
|
spendType = "focus",
|
||
|
|
|
||
|
|
toggle = "cooldowns",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
interrupt()
|
||
|
|
applyDebuff( "target", "wailing_arrow" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
wailing_arrow = {
|
||
|
|
id = 355589,
|
||
|
|
duration = 5,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
elseif baseClass == "MAGE" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
radiant_spark = {
|
||
|
|
id = 307443,
|
||
|
|
cast = 1.5,
|
||
|
|
cooldown = 30,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.02,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565446,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "radiant_spark" )
|
||
|
|
applyDebuff( "target", "radiant_spark" )
|
||
|
|
-- applyDebuff( "target", "radiant_spark_vulnerability" )
|
||
|
|
-- RSV doesn't apply until the next hit.
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
radiant_spark = {
|
||
|
|
id = 307443,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
radiant_spark_vulnerability = {
|
||
|
|
id = 307454,
|
||
|
|
duration = 8,
|
||
|
|
max_stack = 5
|
||
|
|
},
|
||
|
|
radiant_spark_consumed = {
|
||
|
|
id = 307747,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
deathborne = {
|
||
|
|
id = 324220,
|
||
|
|
cast = 1.5,
|
||
|
|
cooldown = 180,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.05,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3578226,
|
||
|
|
|
||
|
|
toggle = "essences", -- maybe should be cooldowns.
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "deathborne" )
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
deathborne = {
|
||
|
|
id = 324220,
|
||
|
|
duration = function () return 20 + ( conduit.gift_of_the_lich.mod * 0.001 ) end,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
shifting_power = {
|
||
|
|
id = 314791,
|
||
|
|
cast = function () return 4 * haste end,
|
||
|
|
channeled = true,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.05,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636841,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
-- -action.shifting_power.execute_time%action.shifting_power.new_tick_time*(dbc.effect.815503.base_value%1000+conduit.discipline_of_the_grove.time_value)
|
||
|
|
cdr = function ()
|
||
|
|
return - action.shifting_power.execute_time / action.shifting_power.tick_time * ( -3 + conduit.discipline_of_the_grove.time_value )
|
||
|
|
end,
|
||
|
|
|
||
|
|
full_reduction = function ()
|
||
|
|
return - action.shifting_power.execute_time / action.shifting_power.tick_time * ( -3 + conduit.discipline_of_the_grove.time_value )
|
||
|
|
end,
|
||
|
|
|
||
|
|
start = function ()
|
||
|
|
applyBuff( "shifting_power" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
tick = function ()
|
||
|
|
-- TODO: Identify which abilities have their CDs reduced.
|
||
|
|
end,
|
||
|
|
|
||
|
|
finish = function ()
|
||
|
|
removeBuff( "shifting_power" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
shifting_power = {
|
||
|
|
id = 314791,
|
||
|
|
duration = function () return 4 * haste end,
|
||
|
|
tick_time = function () return haste end,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
heart_of_the_fae = {
|
||
|
|
id = 356881,
|
||
|
|
duration = 15,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
mirrors_of_torment = {
|
||
|
|
id = 314793,
|
||
|
|
cast = 1.5,
|
||
|
|
cooldown = 90,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.04,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565720,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "mirrors_of_torment", nil, 3 )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
mirrors_of_torment = {
|
||
|
|
id = 314793,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 3, -- ???
|
||
|
|
},
|
||
|
|
-- Conduit
|
||
|
|
siphoned_malice = {
|
||
|
|
id = 337090,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 3
|
||
|
|
}
|
||
|
|
},
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
elseif baseClass == "MONK" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
weapons_of_order = {
|
||
|
|
id = 310454,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 120,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3565447,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "weapons_of_order" )
|
||
|
|
|
||
|
|
if state.spec.mistweaver then
|
||
|
|
setCooldown( "essence_font", 0 )
|
||
|
|
if legendary.call_to_arms.enabled then summonPet( "yulon", 12 ) end
|
||
|
|
elseif state.spec.brewmaster then
|
||
|
|
setCooldown( "keg_smash", 0 )
|
||
|
|
if legendary.call_to_arms.enabled then summonPet( "niuzao", 12 ) end
|
||
|
|
else
|
||
|
|
if legendary.call_to_arms.enabled then summonPet( "xuen", 12 ) end
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
weapons_of_order = {
|
||
|
|
id = 310454,
|
||
|
|
duration = function () return conduit.strike_with_clarity.enabled and 35 or 30 end,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
weapons_of_order_debuff = {
|
||
|
|
id = 312106,
|
||
|
|
duration = 8,
|
||
|
|
max_stack = 5
|
||
|
|
},
|
||
|
|
weapons_of_order_ww = {
|
||
|
|
id = 311054,
|
||
|
|
duration = 5,
|
||
|
|
max_stack = 1,
|
||
|
|
copy = "weapons_of_order_buff"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
bonedust_brew = {
|
||
|
|
id = 325216,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3578227,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "bonedust_brew" )
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
bonedust_brew = {
|
||
|
|
id = 325216,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
copy = "bonedust_brew_debuff"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
faeline_stomp = {
|
||
|
|
id = 327104,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 30,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636842,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "faeline_stomp" )
|
||
|
|
|
||
|
|
if spec.brewmaster then
|
||
|
|
applyDebuff( "target", "breath_of_fire" )
|
||
|
|
active_dot.breath_of_fire = active_enemies
|
||
|
|
end
|
||
|
|
|
||
|
|
if legendary.fae_exposure.enabled then applyDebuff( "target", "fae_exposure" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
faeline_stomp = {
|
||
|
|
id = 327104,
|
||
|
|
duration = 30,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
fae_exposure = {
|
||
|
|
id = 356773,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
fallen_order = {
|
||
|
|
id = 326860,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 180,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3565721,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "fallen_order" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
fallen_order = {
|
||
|
|
id = 326860,
|
||
|
|
duration = 24,
|
||
|
|
max_stack = 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
elseif baseClass == "PALADIN" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
divine_toll = {
|
||
|
|
id = 304971,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565448,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
local spellToCast
|
||
|
|
|
||
|
|
if state.spec.protection then spellToCast = class.abilities.avengers_shield.handler
|
||
|
|
elseif state.spec.retribution then spellToCast = class.abilities.judgment.handler
|
||
|
|
else spellToCast = class.abilities.holy_shock.handler end
|
||
|
|
|
||
|
|
for i = 1, min( 5, true_active_enemies ) do
|
||
|
|
spellToCast()
|
||
|
|
end
|
||
|
|
|
||
|
|
if legendary.divine_resonance.enabled then
|
||
|
|
applyBuff( "divine_resonance" )
|
||
|
|
state:QueueAuraEvent( "divine_toll", spellToCast, buff.divine_resonance.expires, "AURA_PERIODIC" )
|
||
|
|
state:QueueAuraEvent( "divine_toll", spellToCast, buff.divine_resonance.expires - 5, "AURA_PERIODIC" )
|
||
|
|
state:QueueAuraEvent( "divine_toll", spellToCast, buff.divine_resonance.expires - 10, "AURA_PERIODIC" )
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
divine_resonance = {
|
||
|
|
id = 355455,
|
||
|
|
duration = 15,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
vanquishers_hammer = {
|
||
|
|
id = 328204,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 30,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = function ()
|
||
|
|
if buff.divine_purpose.up then return 0 end
|
||
|
|
return 1 - ( buff.the_magistrates_judgment.up and 1 or 0 )
|
||
|
|
end,
|
||
|
|
spendType = "holy_power",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3578228,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
removeBuff( "divine_purpose" )
|
||
|
|
removeBuff( "the_magistrates_judgment" )
|
||
|
|
applyBuff( "vanquishers_hammer", nil, legendary.dutybound_gavel.enabled and 2 or nil )
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
vanquishers_hammer = {
|
||
|
|
id = 328204,
|
||
|
|
duration = 15,
|
||
|
|
max_stack = function () return legendary.dutybound_gavel.enabled and 2 or 1 end,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
blessing_of_summer = {
|
||
|
|
id = 328620,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.05,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3636845,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
buff = "blessing_of_summer_active",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "blessing_of_summer" ) -- We'll just apply to self because we don't care.
|
||
|
|
|
||
|
|
removeBuff( "blessing_of_summer_active" )
|
||
|
|
applyBuff( "blessing_of_autumn_active" )
|
||
|
|
setCooldown( "blessing_of_autumn", 45 )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
blessing_of_summer = {
|
||
|
|
id = 328620,
|
||
|
|
duration = function () return 30 * ( 1 - ( conduit.the_long_summer.mod * 0.01 ) ) end,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
|
||
|
|
blessing_of_summer_active = {
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
generate = function( t )
|
||
|
|
if IsActiveSpell( 328620 ) then
|
||
|
|
t.name = class.auras.blessing_of_summer.name .. " Active"
|
||
|
|
t.count = 1
|
||
|
|
t.applied = now
|
||
|
|
t.expires = now + 3600
|
||
|
|
t.caster = "player"
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
t.count = 0
|
||
|
|
t.applied = 0
|
||
|
|
t.expires = 0
|
||
|
|
t.caster = "nobody"
|
||
|
|
end,
|
||
|
|
},
|
||
|
|
|
||
|
|
-- Leaving reactive for now, will see if we need to do anything differently.
|
||
|
|
equinox = {
|
||
|
|
id = 355567,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
bind = { "blessing_of_spring", "blessing_of_autumn", "blessing_of_winter" }
|
||
|
|
},
|
||
|
|
blessing_of_autumn = {
|
||
|
|
id = 328622,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.05,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3636843,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
buff = "blessing_of_autumn_active",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "blessing_of_autumn" )
|
||
|
|
|
||
|
|
removeBuff( "blessing_of_autumn_active" )
|
||
|
|
applyBuff( "blessing_of_winter_active" )
|
||
|
|
setCooldown( "blessing_of_winter", 45 )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
blessing_of_autumn = {
|
||
|
|
id = 328622,
|
||
|
|
duration = 30,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
blessing_of_autumn_active = {
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
generate = function( t )
|
||
|
|
if IsActiveSpell( 328622 ) then
|
||
|
|
t.name = class.auras.blessing_of_autumn.name .. " Active"
|
||
|
|
t.count = 1
|
||
|
|
t.applied = now
|
||
|
|
t.expires = now + 3600
|
||
|
|
t.caster = "player"
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
t.count = 0
|
||
|
|
t.applied = 0
|
||
|
|
t.expires = 0
|
||
|
|
t.caster = "nobody"
|
||
|
|
end,
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
bind = { "blessing_of_summer", "blessing_of_spring", "blessing_of_winter" }
|
||
|
|
},
|
||
|
|
blessing_of_winter = {
|
||
|
|
id = 328281,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.05,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3636846,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
buff = "blessing_of_winter_active",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "blessing_of_winter" )
|
||
|
|
|
||
|
|
removeBuff( "blessing_of_winter_active" )
|
||
|
|
applyBuff( "blessing_of_spring_active" )
|
||
|
|
setCooldown( "blessing_of_spring", 45 )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
blessing_of_winter = {
|
||
|
|
id = 328281,
|
||
|
|
duration = 30,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
blessing_of_winter_debuff = {
|
||
|
|
id = 328506,
|
||
|
|
duration = 6,
|
||
|
|
max_stack = 10
|
||
|
|
},
|
||
|
|
blessing_of_winter_active = {
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
generate = function( t )
|
||
|
|
if IsActiveSpell( 328281 ) then
|
||
|
|
t.name = class.auras.blessing_of_winter.name .. " Active"
|
||
|
|
t.count = 1
|
||
|
|
t.applied = now
|
||
|
|
t.expires = now + 3600
|
||
|
|
t.caster = "player"
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
t.count = 0
|
||
|
|
t.applied = 0
|
||
|
|
t.expires = 0
|
||
|
|
t.caster = "nobody"
|
||
|
|
end,
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
bind = { "blessing_of_summer", "blessing_of_autumn", "blessing_of_spring" }
|
||
|
|
},
|
||
|
|
blessing_of_spring = {
|
||
|
|
id = 328282,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.05,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3636844,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
buff = "blessing_of_spring_active",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "blessing_of_spring" )
|
||
|
|
|
||
|
|
removeBuff( "blessing_of_spring_active" )
|
||
|
|
applyBuff( "blessing_of_summer_active" )
|
||
|
|
setCooldown( "blessing_of_summer", 45 )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
blessing_of_spring = {
|
||
|
|
id = 328281,
|
||
|
|
duration = 30,
|
||
|
|
max_stack = 1,
|
||
|
|
friendly = true,
|
||
|
|
},
|
||
|
|
blessing_of_spring_active = {
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
generate = function( t )
|
||
|
|
if IsActiveSpell( 328282 ) then
|
||
|
|
t.name = class.auras.blessing_of_winter.name .. " Active"
|
||
|
|
t.count = 1
|
||
|
|
t.applied = now
|
||
|
|
t.expires = now + 3600
|
||
|
|
t.caster = "player"
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
t.count = 0
|
||
|
|
t.applied = 0
|
||
|
|
t.expires = 0
|
||
|
|
t.caster = "nobody"
|
||
|
|
end,
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
bind = { "blessing_of_summer", "blessing_of_autumn", "blessing_of_winter" }
|
||
|
|
},
|
||
|
|
ashen_hallow = {
|
||
|
|
id = 316958,
|
||
|
|
cast = function () return 1.5 * haste end,
|
||
|
|
cooldown = 120,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3565722,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
hammer_of_wrath_hallow = {
|
||
|
|
duration = function () return legendary.radiant_embers.enabled and 45 or 30 end,
|
||
|
|
max_stack = 1,
|
||
|
|
generate = function( t )
|
||
|
|
if IsUsableSpell( 24275 ) and not ( target.health_pct < 20 or ( level > 57 and ( buff.avenging_wrath.up or buff.crusade.up ) ) and not buff.final_verdict.up ) then
|
||
|
|
t.name = class.abilities.hammer_of_wrath.name .. " " .. class.abilities.ashen_hallow.name
|
||
|
|
t.count = 1
|
||
|
|
t.applied = action.ashen_hallow.lastCast
|
||
|
|
t.expires = action.ashen_hallow.lastCast + 30
|
||
|
|
t.caster = "player"
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
t.count = 0
|
||
|
|
t.applied = 0
|
||
|
|
t.expires = 0
|
||
|
|
t.caster = "nobody"
|
||
|
|
end,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
elseif baseClass == "PRIEST" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
boon_of_the_ascended = {
|
||
|
|
id = 325013,
|
||
|
|
cast = 1.5,
|
||
|
|
cooldown = 180,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3565449,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "boon_of_the_ascended" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
boon_of_the_ascended = {
|
||
|
|
id = 325013,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 20 -- ???
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
ascended_nova = {
|
||
|
|
id = 325020,
|
||
|
|
known = 325013,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 0,
|
||
|
|
gcd = "totem", -- actually 1s and not 1.5s...
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3528287,
|
||
|
|
|
||
|
|
buff = "boon_of_the_ascended",
|
||
|
|
bind = "boon_of_the_ascended",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
addStack( "boon_of_the_ascended", nil, active_enemies )
|
||
|
|
end
|
||
|
|
},
|
||
|
|
ascended_blast = {
|
||
|
|
id = 325283,
|
||
|
|
known = 15407,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 3,
|
||
|
|
hasteCD = true,
|
||
|
|
gcd = "totem",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3528286,
|
||
|
|
|
||
|
|
buff = "boon_of_the_ascended",
|
||
|
|
bind = "mind_flay",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
addStack( "boon_of_the_ascended", nil, 5 )
|
||
|
|
if state.spec.shadow then gain( 6, "insanity" ) end
|
||
|
|
end,
|
||
|
|
},
|
||
|
|
unholy_nova = {
|
||
|
|
id = 324724,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.05,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3578229,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "unholy_transfusion" )
|
||
|
|
active_dot.unholy_transfusion = active_enemies
|
||
|
|
|
||
|
|
if legendary.pallid_command.enabled then applyBuff( "pallid_command" ) end
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
range = 15,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
unholy_transfusion = {
|
||
|
|
id = 324724,
|
||
|
|
duration = function () return conduit.festering_transfusion.enabled and 17 or 15 end,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
pallid_command = {
|
||
|
|
id = 356418,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
fae_guardians = {
|
||
|
|
id = 327661,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 90,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.02,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
nobuff = "direct_mask",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "fae_guardians" )
|
||
|
|
summonPet( "wrathful_faerie" )
|
||
|
|
applyDebuff( "target", "wrathful_faerie" )
|
||
|
|
summonPet( "guardian_faerie" )
|
||
|
|
applyBuff( "guardian_faerie" )
|
||
|
|
summonPet( "benevolent_faerie" )
|
||
|
|
applyBuff( "benevolent_faerie" )
|
||
|
|
|
||
|
|
if legendary.bwonsamdis_pact.enabled then
|
||
|
|
applyBuff( "direct_mask" )
|
||
|
|
applyDebuff( "target", "haunted_mask" )
|
||
|
|
end
|
||
|
|
-- TODO: Check totem/guardian API re: faeries.
|
||
|
|
end,
|
||
|
|
|
||
|
|
bind = "direct_mask",
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
fae_guardians = {
|
||
|
|
id = 327661,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
wrathful_faerie = {
|
||
|
|
id = 342132,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
wrathful_faerie_fermata = {
|
||
|
|
id = 345452,
|
||
|
|
duration = function () return conduit.fae_fermata.enabled and ( conduit.fae_fermata.mod * 0.001 ) or 3 end,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
guardian_faerie = {
|
||
|
|
id = 327694,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
guardian_faerie_fermata = {
|
||
|
|
id = 345451,
|
||
|
|
duration = function () return conduit.fae_fermata.enabled and ( conduit.fae_fermata.mod * 0.001 ) or 3 end,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
benevolent_faerie = {
|
||
|
|
id = 327710,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
benevolent_faerie_fermata = {
|
||
|
|
id = 345453,
|
||
|
|
duration = function () return conduit.fae_fermata.enabled and ( conduit.fae_fermata.mod * 0.001 ) or 3 end,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
haunted_mask = {
|
||
|
|
id = 356968,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
direct_mask = {
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
direct_mask = {
|
||
|
|
id = 356532,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 0,
|
||
|
|
gcd = "off",
|
||
|
|
|
||
|
|
buff = "direct_mask",
|
||
|
|
bind = "fae_guardians",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "haunted_mask" )
|
||
|
|
end,
|
||
|
|
},
|
||
|
|
mindgames = {
|
||
|
|
id = 323673,
|
||
|
|
cast = 1.5,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.002,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "mindgames" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
mindgames = {
|
||
|
|
id = 323673,
|
||
|
|
duration = function () return ( conduit.shattered_perceptions.enabled and 7 or 5 ) + ( legendary.shadow_word_manipulation.enabled and 3 or 0 ) end,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
shadow_word_manipulation = {
|
||
|
|
id = 357028,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
elseif baseClass == "ROGUE" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
echoing_reprimand = {
|
||
|
|
id = 323547,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = function () return 10 * ( ( talent.shadow_focus.enabled and ( buff.shadow_dance.up or buff.stealth.up ) ) and 0.8 or 1 ) end,
|
||
|
|
spendType = "energy",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565450,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
cp_gain = function () return ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + 2 end,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
-- Can't predict the Animacharge, unless you have the legendary.
|
||
|
|
if legendary.resounding_clarity.enabled then
|
||
|
|
applyBuff( "echoing_reprimand_2", nil, 2 )
|
||
|
|
applyBuff( "echoing_reprimand_3", nil, 3 )
|
||
|
|
applyBuff( "echoing_reprimand_4", nil, 4 )
|
||
|
|
applyBuff( "echoing_reprimand_5", nil, 5 )
|
||
|
|
end
|
||
|
|
gain( action.echoing_reprimand.cp_gain, "combo_points" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
disabled = function ()
|
||
|
|
return covenant.kyrian and not IsSpellKnownOrOverridesKnown( 323547 ), "you have not finished your kyrian covenant intro"
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
echoing_reprimand_2 = {
|
||
|
|
id = 323558,
|
||
|
|
duration = 45,
|
||
|
|
max_stack = 6,
|
||
|
|
},
|
||
|
|
echoing_reprimand_3 = {
|
||
|
|
id = 323559,
|
||
|
|
duration = 45,
|
||
|
|
max_stack = 6,
|
||
|
|
},
|
||
|
|
echoing_reprimand_4 = {
|
||
|
|
id = 323560,
|
||
|
|
duration = 45,
|
||
|
|
max_stack = 6,
|
||
|
|
copy = 354835,
|
||
|
|
},
|
||
|
|
echoing_reprimand_5 = {
|
||
|
|
id = 354838,
|
||
|
|
duration = 45,
|
||
|
|
max_stack = 6,
|
||
|
|
},
|
||
|
|
echoing_reprimand = {
|
||
|
|
alias = { "echoing_reprimand_2", "echoing_reprimand_3", "echoing_reprimand_4", "echoing_reprimand_5" },
|
||
|
|
aliasMode = "first",
|
||
|
|
aliasType = "buff",
|
||
|
|
meta = {
|
||
|
|
stack = function ()
|
||
|
|
if combo_points.current > 1 and combo_points.current < 6 and buff[ "echoing_reprimand_" .. combo_points.current ].up then return combo_points.current end
|
||
|
|
|
||
|
|
if buff.echoing_reprimand_2.up then return 2 end
|
||
|
|
if buff.echoing_reprimand_3.up then return 3 end
|
||
|
|
if buff.echoing_reprimand_4.up then return 4 end
|
||
|
|
if buff.echoing_reprimand_5.up then return 5 end
|
||
|
|
|
||
|
|
return 0
|
||
|
|
end
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
serrated_bone_spike = {
|
||
|
|
id = 328547,
|
||
|
|
cast = 0,
|
||
|
|
charges = function () return legendary.deathspike.equipped and 5 or 3 end,
|
||
|
|
cooldown = 30,
|
||
|
|
recharge = 30,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3578230,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
cycle = "serrated_bone_spike",
|
||
|
|
|
||
|
|
cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( ( buff.broadside.up and 1 or 0 ) + active_dot.serrated_bone_spike ) end,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "serrated_bone_spike" )
|
||
|
|
debuff.serrated_bone_spike.exsanguinated_rate = 1
|
||
|
|
gain( action.serrated_bone_spike.cp_gain, "combo_points" )
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
serrated_bone_spike = {
|
||
|
|
id = 324073,
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
exsanguinated = false,
|
||
|
|
meta = {
|
||
|
|
exsanguinated_rate = function( t ) return t.up and tracked_bleeds.serrated_bone_spike.rate[ target.unit ] or 1 end,
|
||
|
|
last_tick = function( t ) return t.up and ( tracked_bleeds.serrated_bone_spike.last_tick[ target.unit ] or t.applied ) or 0 end,
|
||
|
|
tick_time = function( t ) return t.up and ( haste * 2 / t.exsanguinated_rate ) or ( haste * 2 ) end,
|
||
|
|
},
|
||
|
|
copy = "serrated_bone_spike_dot",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
sepsis = {
|
||
|
|
id = 328305,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 90,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636848,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "sepsis" )
|
||
|
|
debuff.sepsis.exsanguinated_rate = 1
|
||
|
|
end,
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
elseif baseClass == "SHAMAN" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
vesper_totem = {
|
||
|
|
id = 324386,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "totem",
|
||
|
|
|
||
|
|
spend = 0.1,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565451,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
summonPet( "vesper_totem", 30 )
|
||
|
|
applyBuff( "vesper_totem" )
|
||
|
|
|
||
|
|
vesper_totem_heal_charges = 3
|
||
|
|
vesper_totem_dmg_charges = 3
|
||
|
|
vesper_totem_used_charges = 0
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
vesper_totem = {
|
||
|
|
duration = 30,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
primordial_wave = {
|
||
|
|
id = 326059,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 45,
|
||
|
|
recharge = 45,
|
||
|
|
charges = 1,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.1,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3578231,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
cycle = "flame_shock",
|
||
|
|
velocity = 45,
|
||
|
|
|
||
|
|
impact = function ()
|
||
|
|
applyDebuff( "target", "flame_shock" )
|
||
|
|
applyBuff( "primordial_wave" )
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
primordial_wave = {
|
||
|
|
id = 327164,
|
||
|
|
duration = 15,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
splintered_elements = {
|
||
|
|
id = 354648,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 10,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
fae_transfusion = {
|
||
|
|
id = 328923,
|
||
|
|
cast = function () return haste * 3 * ( 1 + ( conduit.essential_extraction.mod * 0.01 ) ) end,
|
||
|
|
channeled = true,
|
||
|
|
cooldown = 120,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.075,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636849,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
nobuff = "fae_transfusion",
|
||
|
|
|
||
|
|
start = function ()
|
||
|
|
applyBuff( "fae_transfusion" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
tick = function ()
|
||
|
|
if legendary.seeds_of_rampant_growth.enabled then
|
||
|
|
if state.spec.enhancement then reduceCooldown( "feral_spirit", 9 )
|
||
|
|
elseif state.spec.elemental then reduceCooldown( talent.storm_elemental.enabled and "storm_elemental" or "fire_elemental", 6 )
|
||
|
|
else reduceCooldown( "healing_tide_totem", 5 ) end
|
||
|
|
addStack( "seeds_of_rampant_growth" )
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
|
||
|
|
finish = function ()
|
||
|
|
if state.spec.enhancement then addStack( "maelstrom_weapon", nil, 3 ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
fae_transfusion = {
|
||
|
|
id = 328933,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
seeds_of_rampant_growth = {
|
||
|
|
id = 358945,
|
||
|
|
duration = 15,
|
||
|
|
max_stack = 5
|
||
|
|
}
|
||
|
|
},
|
||
|
|
},
|
||
|
|
fae_transfusion_heal = {
|
||
|
|
id = 328930,
|
||
|
|
cast = 0,
|
||
|
|
channeled = true,
|
||
|
|
cooldown = 0,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
suffix = "(Heal)",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3636849,
|
||
|
|
|
||
|
|
buff = "fae_transfusion",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
removeBuff( "fae_transfusion" )
|
||
|
|
end,
|
||
|
|
},
|
||
|
|
chain_harvest = {
|
||
|
|
id = 320674,
|
||
|
|
cast = 2.5,
|
||
|
|
cooldown = 90,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.1,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565725,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
if legendary.elemental_conduit.enabled then
|
||
|
|
applyDebuff( "target", "flame_shock" )
|
||
|
|
active_dot.flame_shock = min( active_enemies, active_dot.flame_shock + min( 5, active_enemies ) )
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
}
|
||
|
|
} )
|
||
|
|
elseif baseClass == "WARLOCK" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
scouring_tithe = {
|
||
|
|
id = 312321,
|
||
|
|
cast = 2,
|
||
|
|
cooldown = 40,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.02,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565452,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "scouring_tithe" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
scouring_tithe = {
|
||
|
|
id = 312321,
|
||
|
|
duration = 18,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
-- Conduit
|
||
|
|
soul_tithe = {
|
||
|
|
id = 340238,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
-- Legendary
|
||
|
|
languishing_soul_detritus = {
|
||
|
|
id = 356255,
|
||
|
|
duration = 8,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
decimating_bolt = {
|
||
|
|
id = 325289,
|
||
|
|
cast = 2.5,
|
||
|
|
cooldown = 45,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.04,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3578232,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
indicator = function()
|
||
|
|
if active_enemies > 1 and settings.cycle and target.time_to_die > shortest_ttd then return "cycle" end
|
||
|
|
end,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "decimating_bolt", nil, 3 )
|
||
|
|
if legendary.shard_of_annihilation.enabled then
|
||
|
|
applyBuff( "shard_of_annihilation" )
|
||
|
|
end
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
decimating_bolt = {
|
||
|
|
id = 325299,
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 3,
|
||
|
|
},
|
||
|
|
shard_of_annihilation = {
|
||
|
|
id = 356342,
|
||
|
|
duration = 44,
|
||
|
|
max_stack = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
soul_rot = {
|
||
|
|
id = 325640,
|
||
|
|
cast = 1.5,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.005,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636850,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "soul_rot" )
|
||
|
|
active_dot.soul_rot = min( 4, active_enemies )
|
||
|
|
if legendary.decaying_soul_satchel.enabled then
|
||
|
|
applyBuff( "decaying_soul_satchel", nil, active_dot.soul_rot )
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
soul_rot = {
|
||
|
|
id = 325640,
|
||
|
|
duration = 8,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
decaying_soul_satchel = {
|
||
|
|
id = 356369,
|
||
|
|
duration = 8,
|
||
|
|
max_stack = 4,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
impending_catastrophe = {
|
||
|
|
id = 321792,
|
||
|
|
cast = 2,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = 0.04,
|
||
|
|
spendType = "mana",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565726,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
velocity = 30,
|
||
|
|
|
||
|
|
impact = function ()
|
||
|
|
applyDebuff( "target", "impending_catastrophe" )
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
impending_catastrophe = {
|
||
|
|
id = 322170,
|
||
|
|
duration = function () return 12 * ( 1 + conduit.catastrophic_origin.mod * 0.01 ) end,
|
||
|
|
max_stack = 1,
|
||
|
|
copy = "impending_catastrophe_dot"
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
} )
|
||
|
|
elseif baseClass == "WARRIOR" then
|
||
|
|
all:RegisterAbilities( {
|
||
|
|
-- Warrior - Kyrian - 307865 - spear_of_bastion (Spear of Bastion)
|
||
|
|
spear_of_bastion = {
|
||
|
|
id = 307865,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 60,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
spend = function () return -25 * ( 1 + conduit.piercing_verdict.mod * 0.01 ) end,
|
||
|
|
spendType = "rage",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565453,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
velocity = 30,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "spear_of_bastion" )
|
||
|
|
if legendary.elysian_might.enabled then applyBuff( "elysian_might" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
spear_of_bastion = {
|
||
|
|
id = 307871,
|
||
|
|
duration = function () return legendary.elysian_might.enabled and 8 or 4 end,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
elysian_might = {
|
||
|
|
id = 311193,
|
||
|
|
duration = 8,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
-- Warrior - Necrolord - 324143 - conquerors_banner (Conqueror's Banner)
|
||
|
|
conquerors_banner = {
|
||
|
|
id = 324143,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = 180,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = false,
|
||
|
|
texture = 3578234,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyBuff( "conquerors_banner" )
|
||
|
|
if conduit.veterans_repute.enabled then
|
||
|
|
applyBuff( "veterans_repute" )
|
||
|
|
end
|
||
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
conquerors_banner = {
|
||
|
|
id = 324143,
|
||
|
|
duration = 20,
|
||
|
|
max_stack = 1
|
||
|
|
},
|
||
|
|
-- Conduit
|
||
|
|
veterans_repute = {
|
||
|
|
id = 339267,
|
||
|
|
duration = 30,
|
||
|
|
max_stack = 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
-- Warrior - Night Fae - 325886 - ancient_aftershock (Ancient Aftershock)
|
||
|
|
ancient_aftershock = {
|
||
|
|
id = 325886,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = function () return 90 - conduit.destructive_reverberations.mod * 0.001 end,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3636851,
|
||
|
|
|
||
|
|
toggle = "essences",
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "ancient_aftershock" )
|
||
|
|
-- Rage gain will be reactive, can't tell what is going to get hit.
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
ancient_aftershock = {
|
||
|
|
id = 325886,
|
||
|
|
duration = 1,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
-- Warrior - Venthyr - 317320 - condemn (Condemn)
|
||
|
|
condemn = {
|
||
|
|
id = function () return talent.massacre.enabled and 330325 or 317485 end,
|
||
|
|
known = 317349,
|
||
|
|
cast = 0,
|
||
|
|
cooldown = function () return state.spec.fury and ( 4.5 * haste ) or 0 end,
|
||
|
|
hasteCD = true,
|
||
|
|
gcd = "spell",
|
||
|
|
|
||
|
|
rangeSpell = function () return class.abilities.execute and class.abilities.execute.id end,
|
||
|
|
|
||
|
|
spend = function ()
|
||
|
|
if state.spec.fury then return -20 end
|
||
|
|
return buff.sudden_death.up and 0 or 20
|
||
|
|
end,
|
||
|
|
spendType = "rage",
|
||
|
|
|
||
|
|
startsCombat = true,
|
||
|
|
texture = 3565727,
|
||
|
|
|
||
|
|
-- toggle = "essences", -- no need to toggle.
|
||
|
|
|
||
|
|
usable = function ()
|
||
|
|
if buff.sudden_death.up then return true end
|
||
|
|
if cycle_for_condemn then return true end
|
||
|
|
return target.health_pct < ( talent.massacre.enabled and 35 or 20 ) or target.health_pct > 80, "requires > 80% or < " .. ( talent.massacre.enabled and 35 or 20 ) .. "% health"
|
||
|
|
end,
|
||
|
|
|
||
|
|
cycle = "condemn_ineligible",
|
||
|
|
|
||
|
|
indicator = function () if cycle_for_condemn then return "cycle" end end,
|
||
|
|
|
||
|
|
handler = function ()
|
||
|
|
applyDebuff( "target", "condemned" )
|
||
|
|
|
||
|
|
if not state.spec.fury and buff.sudden_death.down then
|
||
|
|
local extra = min( 20, rage.current )
|
||
|
|
|
||
|
|
if extra > 0 then spend( extra, "rage" ) end
|
||
|
|
if state.spec.arms and state.talent.improved_execute.enabled then
|
||
|
|
gain( 4 + floor( 0.1 * extra ), "rage" )
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if legendary.sinful_surge.enabled then
|
||
|
|
if state.spec.protection and buff.last_stand.up then buff.last_stand.expires = buff.last_stand.expires + 3
|
||
|
|
elseif state.spec.arms and debuff.colossus_smash.up then debuff.colossus_smash.expires = debuff.colossus_smash.expires + 1.5
|
||
|
|
elseif state.spec.fury and buff.recklessness.up then buff.recklessness.expires = buff.recklessness.expires + 1.5 end
|
||
|
|
end
|
||
|
|
|
||
|
|
if legendary.exploiter.enabled then applyDebuff( "target", "exploiter", nil, min( 2, debuff.exploiter.stack + 1 ) ) end
|
||
|
|
|
||
|
|
removeBuff( "sudden_death" )
|
||
|
|
|
||
|
|
if conduit.ashen_juggernaut.enabled then addStack( "ashen_juggernaut" ) end
|
||
|
|
end,
|
||
|
|
|
||
|
|
auras = {
|
||
|
|
condemned = {
|
||
|
|
id = 317491,
|
||
|
|
duration = 10,
|
||
|
|
max_stack = 1,
|
||
|
|
},
|
||
|
|
-- Target Swapping
|
||
|
|
condemn_ineligible = {
|
||
|
|
duration = 3600,
|
||
|
|
max_stack = 1,
|
||
|
|
generate = function( t, auraType )
|
||
|
|
if buff.sudden_death.up or not covenant.venthyr or ( target.health_pct > ( talent.massacre.enabled and 35 or 20 ) and target.health_pct < 80 ) then
|
||
|
|
t.count = 1
|
||
|
|
t.expires = query_time + 3600
|
||
|
|
t.applied = query_time
|
||
|
|
t.duration = 3600
|
||
|
|
t.caster = "player"
|
||
|
|
return
|
||
|
|
end
|
||
|
|
t.count = 0
|
||
|
|
t.expires = 0
|
||
|
|
t.applied = 0
|
||
|
|
t.caster = "nobody"
|
||
|
|
end
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
copy = { 317485, 330325, 317349, 330334 }
|
||
|
|
}
|
||
|
|
} )
|
||
|
|
end
|