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.
83 lines
2.9 KiB
83 lines
2.9 KiB
-- Classes.lua (for Dragonflight)
|
|
-- Overrides legacy class/spec registration methods as needed.
|
|
|
|
local addon, ns = ...
|
|
local Hekili = _G[ addon ]
|
|
|
|
if not Hekili.IsDragonflight() then return end
|
|
|
|
local C_ClassTalents, C_Traits = _G.C_ClassTalents, _G.C_Traits
|
|
local IsPlayerSpell = _G.IsPlayerSpell
|
|
|
|
local ResetDisabledGearAndSpells, WipeCovenantCache = ns.ResetDisabledGearAndSpells, ns.WipeCovenantCache
|
|
|
|
local state, class = Hekili.State, Hekili.Class
|
|
|
|
-- Revise state.talent to use trait metatables instead of legacy talent API.
|
|
table.wipe( state.talent )
|
|
setmetatable( state.talent, ns.metatables.mt_generic_traits )
|
|
state.talent.no_trait = { rank = 0, max = 1 }
|
|
|
|
-- Replace ns.updateTalents() as DF talents use new Traits and ClassTalents API.
|
|
do
|
|
function ns.updateTalents()
|
|
for _, data in pairs( state.talent ) do
|
|
data.rank = 0
|
|
end
|
|
|
|
WipeCovenantCache()
|
|
ResetDisabledGearAndSpells()
|
|
|
|
if GetSpecialization() == 5 then return end
|
|
|
|
local configID = C_ClassTalents.GetActiveConfigID() or -1
|
|
|
|
for token, data in pairs( class.talents ) do
|
|
local node = C_Traits.GetNodeInfo( configID, data[1] )
|
|
local talent = rawget( state.talent, token ) or {}
|
|
|
|
if not node or not node.activeEntry then
|
|
talent.rank = 0
|
|
talent.max = 1
|
|
else
|
|
local entryID = node.activeEntry.entryID
|
|
local entry = entryID and C_Traits.GetEntryInfo( configID, entryID )
|
|
local defn = entry and C_Traits.GetDefinitionInfo( entry.definitionID )
|
|
|
|
talent.rank = defn and defn.spellID == data[2] and node.activeEntry.rank or 0
|
|
talent.max = node.maxRanks
|
|
end
|
|
|
|
-- Perform a sanity check on maxRanks vs. data[3]. If they don't match, the talent model is likely wrong.
|
|
if data[3] and node and node.maxRanks > 0 and node.maxRanks ~= data[3] then
|
|
Hekili:Error( "Talent '%s' model expects %d ranks but actual max ranks was %d.", token, data[3], node.maxRanks )
|
|
end
|
|
|
|
state.talent[ token ] = talent
|
|
end
|
|
|
|
for k, _ in pairs( state.pvptalent ) do
|
|
state.pvptalent[ k ]._enabled = false
|
|
end
|
|
|
|
for k, v in pairs( class.pvptalents ) do
|
|
local _, name, _, enabled, _, sID, _, _, _, known = GetPvpTalentInfoByID( v, 1 )
|
|
|
|
if not name then
|
|
enabled = IsPlayerSpell( v )
|
|
end
|
|
|
|
enabled = enabled or known
|
|
|
|
if rawget( state.pvptalent, k ) then
|
|
state.pvptalent[ k ]._enabled = enabled
|
|
else
|
|
state.pvptalent[ k ] = {
|
|
_enabled = enabled
|
|
}
|
|
end
|
|
end
|
|
|
|
ns.callHook( "TALENTS_UPDATED" )
|
|
end
|
|
end
|