/
local LIBSN2SID = LibStub:GetLibrary("LibSpellName2SID-Passives"); |
local SID = LIBSN2SID.SID; |
local LSN = LIBSN2SID.LSN; |
local AddonName, AddonEnv = ...; |
local LIBSN2SIDP = LibStub:GetLibrary("LibSpellName2SIDPassives"); |
local SID = LIBSN2SIDP.SID; |
local LSN = LIBSN2SIDP.LSN; |
print(AddonName.. ": Starting test!"); |
local Frame = CreateFrame("Frame"); |
-- Frame:RegisterEvent("PLAYER_LOGIN"); -- Not enough data from game til this event fires. |
Frame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED"); -- This talent and/or the one in the line bellow |
Frame:RegisterEvent("PLAYER_LOGIN"); -- Not enough data from game til this event fires. |
-- Frame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED"); -- This talent and/or the one in the line bellow |
-- Frame:RegisterEvent("PLAYER_TALENT_UPDATE"); -- should fire when the player switches spec. |
-- TESTED: Both of these fire Twice on Changing |
-- spec. On Login but "ACTIVE_..." fires Once, |
--------------------- |
-- LibSpellName2SID-Passives - fork off LibSpellName2SID by aallkkaa |
-- LibSpellName2SIDPassives - fork off LibSpellName2SID by aallkkaa |
-- |
-- V.10008 - 10012: 2018 WoW-7.3.x release, by aallkkaa [1] |
-- |
-- [1] https://www.wowinterface.com/forums/member.php?u=335646 |
--------------------- |
-- API: |
-- LibSpellName2SID-Passives.SID["EnglishSpellName"] -- Spell ID of English Spell Name |
-- LibSpellName2SID-Passives.LSN["EnglishSpellName"] -- Localized Spell Name |
-- LibSpellName2SID-Passives:GetNumSpells() -- Get the number of spells in the database - TEMP. OUT |
-- LibSpellName2SID-Passives:Cleanup() -- Clean up the database (remove from RAM) - DEPRECATED |
-- LibSpellName2SIDPassives.SID["EnglishSpellName"] -- Spell ID of English Spell Name |
-- LibSpellName2SIDPassives.LSN["EnglishSpellName"] -- Localized Spell Name |
-- LibSpellName2SIDPassives:GetNumSpells() -- Get the number of spells in the database - TEMP. OUT |
-- LibSpellName2SIDPassives:Cleanup() -- Clean up the database (remove from RAM) - DEPRECATED |
--------------------- |
-- Initialisation -- |
AddonName, AddonEnv = ...; |
-- Library's version values -- |
local LibSpellName2SID_MAJOR = "LibSpellName2SID-Passives"; |
local LibSpellName2SID_MINOR = 10012; |
-- print(LibSpellName2SID_MAJOR.. "-".. LibSpellName2SID_MINOR.. ": AddonName = ".. AddonName); |
local LibSpellName2SIDPassives_MAJOR = "LibSpellName2SIDPassives"; |
local LibSpellName2SIDPassives_MINOR = 10012; |
-- print(LibSpellName2SIDPassives_MAJOR.. "-".. LibSpellName2SIDPassives_MINOR.. ": AddonName = ".. AddonName); |
-- DataSource -- |
-- gameBuild = 27178 |
-- clientLocale = enUS |
-- Register with LibStub -- |
assert(LibStub, LibSpellName2SID_MAJOR.. "-".. LibSpellName2SID_MINOR.." requires LibStub."); |
local LibSN2SIDP = LibStub:NewLibrary(LibSpellName2SID_MAJOR, LibSpellName2SID_MINOR); |
assert(LibStub, LibSpellName2SIDPassives_MAJOR.. "-".. LibSpellName2SIDPassives_MINOR.." requires LibStub."); |
local LibSN2SIDP = LibStub:NewLibrary(LibSpellName2SIDPassives_MAJOR, LibSpellName2SIDPassives_MINOR); |
if not LibSN2SIDP then -- Same version or newer already loaded; |
return; -- I.e. nothing else to do. |
end |
--------------------------------------- |
LibSN2SIDP.owner = AddonName; |
LibSN2SIDP.minor = LibSpellName2SID_MINOR; |
LibSN2SIDP.minor = LibSpellName2SIDPassives_MINOR; |
LibSN2SIDP.DB = {}; -- Clear old version's contents, if applicable |
end |
} |
); |
-- For backwards compatibility (LibSpellName2SID_MINOR < 10008) |
-- For backwards compatibility (LibSpellName2SIDPassives_MINOR < 10008) |
LibSN2SIDP.ID = LibSN2SIDP.SID; |
-- Return Localised Name of the English Spell Name |
-- not if we're a Global library, which may be in use by several addons. |
-- print("LibSN2SIDP.owner = ".. LibSN2SIDP.owner); |
-- print("LibSN2SIDP: AddonName = ".. AddonName); |
if LibSN2SIDP.owner ~= "LibSpellName2SID-1.0" then |
if LibSN2SIDP.owner ~= "LibSpellName2SIDPassives-1.0" then |
LibSN2SIDP.DB = {}; |
-- print(AddonName.. ": LibSN2SIDP.DB NOW has ".. LibSN2SIDP.GetNumSpells().. " keys."); |
return true; |
## Interface: 80000 |
## Title: Lib: SpellName2SID-1.0-Passives |
## Notes: Table of English Spell Names and corresponding Spell IDs|nPassive spells database variant |
## Version: 1.0.12b |
## Version: 1.0.12 |
## LoadOnDemand: 1 |
## Author: aallkkaa |
## X-Original-Author: twobits |
local AddonName, AddonEnv = ...; |
local LIBSN2SIDP = LibStub:GetLibrary("LibSpellName2SIDPassives"); |
local SID = LIBSN2SIDP.SID; |
local LSN = LIBSN2SIDP.LSN; |
print(AddonName.. ": Starting test!"); |
local Frame = CreateFrame("Frame"); |
Frame:RegisterEvent("PLAYER_LOGIN"); -- Not enough data from game til this event fires. |
-- Frame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED"); -- This talent and/or the one in the line bellow |
-- Frame:RegisterEvent("PLAYER_TALENT_UPDATE"); -- should fire when the player switches spec. |
-- TESTED: Both of these fire Twice on Changing |
-- spec. On Login but "ACTIVE_..." fires Once, |
-- but "PLAYER_TALENT_..." fires Twice. |
Frame:SetScript("OnEvent", function() |
C_Timer.After(3, function() |
if SID and LSN then |
local startTime = GetTime() *1000000; |
print(AddonName.. tostring(": SID and LSN found.")); |
local endTime = GetTime() *1000000; |
print("print time with tostring(...) = ".. (endTime - startTime).. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": SID[\"Armor Skills\"] = ".. SID["Armor Skills"]); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[\"Armor Skills\"] = ".. tostring(LSN["Armor Skills"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": SID[\"Made It Up\"] = ".. tostring(SID["Made It Up"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[\"Made It Up\"] = ".. tostring(LSN["Made It Up"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": SID[20585] = ".. tostring(SID[20585])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[20585] = ".. tostring(LSN[20585])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": SID[90265] = ".. tostring(SID[90265])); |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[90265] = ".. tostring(LSN[90265])); |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": SID[\"Sudden Doom\"] = ".. tostring(SID["Sudden Doom"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[\"Sudden Doom\"] = ".. tostring(LSN["Sudden Doom"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": SID[\"Killing Machine\"] = ".. tostring(SID["Killing Machine"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[\"Killing Machine\"] = ".. tostring(LSN["Killing Machine"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
else |
print(AddonName.. ": SID and/or LSN not found."); |
end |
end); |
end); |
--------------------- |
-- LibSpellName2SIDPassives - fork off LibSpellName2SID by aallkkaa |
-- |
-- V.10008 - 10012: 2018 WoW-7.3.x release, by aallkkaa [1] |
-- |
-- [1] https://www.wowinterface.com/forums/member.php?u=335646 |
--------------------- |
-- API: |
-- LibSpellName2SIDPassives.SID["EnglishSpellName"] -- Spell ID of English Spell Name |
-- LibSpellName2SIDPassives.LSN["EnglishSpellName"] -- Localized Spell Name |
-- LibSpellName2SIDPassives:GetNumSpells() -- Get the number of spells in the database - TEMP. OUT |
-- LibSpellName2SIDPassives:Cleanup() -- Clean up the database (remove from RAM) - DEPRECATED |
--------------------- |
-- Initialisation -- |
-------------------- |
AddonName, AddonEnv = ...; |
-- Library's version values -- |
local LibSpellName2SIDPassives_MAJOR = "LibSpellName2SIDPassives"; |
local LibSpellName2SIDPassives_MINOR = 10012; |
-- print(LibSpellName2SIDPassives_MAJOR.. "-".. LibSpellName2SIDPassives_MINOR.. ": AddonName = ".. AddonName); |
-- DataSource -- |
-- gameBuild = 27178 |
-- clientLocale = enUS |
-- Register with LibStub -- |
assert(LibStub, LibSpellName2SIDPassives_MAJOR.. "-".. LibSpellName2SIDPassives_MINOR.." requires LibStub."); |
local LibSN2SIDP = LibStub:NewLibrary(LibSpellName2SIDPassives_MAJOR, LibSpellName2SIDPassives_MINOR); |
if not LibSN2SIDP then -- Same version or newer already loaded; |
return; -- I.e. nothing else to do. |
end |
-- Set the library database contents -- |
--------------------------------------- |
LibSN2SIDP.owner = AddonName; |
LibSN2SIDP.minor = LibSpellName2SIDPassives_MINOR; |
LibSN2SIDP.DB = {}; -- Clear old version's contents, if applicable |
LibSN2SIDP.DB = { |
["General"] = { |
["Others"] = { |
["Draenor Pathfinder"] = 191645, |
["Apprentice Riding"] = 33388, |
["Broken Isles Pathfinder"] = 233368, |
["Artisan Riding"] = 34091, |
["Expert Riding"] = 34090, |
["Journeyman Riding"] = 33391, |
["Master Riding"] = 90265, |
}, |
["Racials"] = { |
["Draenei"] = { |
["Languages"] = 79741, |
["Shadow Resistance"] = 59221, |
["Gemcutting"] = 28875, |
["Heroic Presence"] = 6562, |
}, |
["NightElf"] = { |
["Wisp Spirit"] = 20585, |
["Touch of Elune"] = 154748, |
["Languages"] = 76252, |
["Quickness"] = 20582, |
["Nature Resistance"] = 20583, |
}, |
["Scourge"] = { |
["Languages"] = 79747, |
["Shadow Resistance"] = 20579, |
["Touch of the Grave"] = 5227, |
}, |
["Orc"] = { |
["Command"] = 21563, |
["Hardiness"] = 20573, |
["Languages"] = 79743, |
}, |
["Gnome"] = { |
["Expansive Mind"] = 20591, |
["Languages"] = 79740, |
["Arcane Resistance"] = 20592, |
["Engineering Specialization"] = 20593, |
["Nimble Fingers"] = 92680, |
}, |
["Troll"] = { |
["Da Voodoo Shuffle"] = 58943, |
["Beast Slaying"] = 20557, |
["Languages"] = 79744, |
["Regeneration"] = 20555, |
}, |
["BloodElf"] = { |
["Arcane Resistance"] = 822, |
["Arcane Acuity"] = 154742, |
["Languages"] = 79748, |
["Arcane Affinity"] = 28877, |
}, |
["Worgen"] = { |
["Aberration"] = 68976, |
["Viciousness"] = 68975, |
["Languages"] = 79742, |
["Flayer"] = 68978, |
}, |
["Tauren"] = { |
["Endurance"] = 20550, |
["Brawn"] = 154743, |
["Languages"] = 79746, |
["Cultivation"] = 20552, |
["Nature Resistance"] = 20551, |
}, |
["Dwarf"] = { |
["Explorer"] = 92682, |
["Might of the Mountain"] = 59224, |
["Languages"] = 79739, |
["Frost Resistance"] = 20596, |
}, |
["Human"] = { |
["Languages"] = 79738, |
["Diplomacy"] = 20599, |
["The Human Spirit"] = 20598, |
}, |
["Pandaren"] = { |
["Inner Peace"] = 107074, |
["Gourmand"] = 107073, |
["Languages"] = 131701, |
["Bouncy"] = 107076, |
["Epicurean"] = 107072, |
}, |
["Goblin"] = { |
["Languages"] = 79749, |
["Time is Money"] = 69042, |
["Best Deals Anywhere"] = 69044, |
["Better Living Through Chemistry"] = 69045, |
}, |
["VoidElf"] = { |
["Entropic Embrace"] = 255669, |
["Chill of Night"] = 255668, |
["Ethereal Connection"] = 255667, |
["Preternatural Calm"] = 255670, |
["Languages"] = 262486, |
}, |
["Nightborne"] = { |
["Arcane Resistance"] = 255664, |
["Ancient History"] = 255663, |
["Magical Affinity"] = 255665, |
["Languages"] = 262438, |
}, |
["HighmountainTauren"] = { |
["Waste Not, Want Not"] = 255656, |
["Rugged Tenacity"] = 255659, |
["Languages"] = 79746, |
["Pride of Ironhorn"] = 255655, |
["Mountaineer"] = 255658, |
}, |
["LightforgedDraenei"] = { |
["Languages"] = 79741, |
["Light's Reckoning"] = 255652, |
["Holy Resistance"] = 255651, |
["Demonbane"] = 255653, |
}, |
["DarkIronDwarf"] = { |
["Languages"] = 273105, |
["Forged in Flames"] = 265224, |
["Dungeon Delver"] = 265223, |
["Mass Production"] = 265222, |
}, |
["MagharOrc"] = { |
["Open Skies"] = 273216, |
["Languages"] = 274743, |
["Sympathetic Vigor"] = 273217, |
["Savage Blood"] = 273220, |
}, |
}, |
["ZoneAbilities"] = { |
["Upgrades"] = 170733, |
["Swift Recovery"] = 169608, |
["Dragoon"] = 169605, |
["Trading Pact"] = 170200, |
}, |
["GuildPerks"] = { |
["The Quick and the Dead"] = 83950, |
["Guild Mail"] = 83951, |
["Mount Up"] = 78633, |
["Hasty Hearth"] = 83944, |
}, |
}, |
["DEATHKNIGHT"] = { |
["Frost_Talents"] = { |
["Avalanche"] = 207142, |
["Obliteration"] = 281238, |
["Cold Heart"] = 281208, |
["Permafrost"] = 207200, |
["Gathering Storm"] = 194912, |
["Runic Attenuation"] = 207104, |
["Death's Reach"] = 276079, |
["Murderous Efficiency"] = 207061, |
["Icy Talons"] = 194878, |
["Inexorable Assault"] = 253593, |
["Icecap"] = 207126, |
["Frozen Pulse"] = 194909, |
}, |
["Unholy"] = { |
["Sudden Doom"] = 49530, |
["Mastery: Dreadblade"] = 77515, |
["Armor Skills"] = 76282, |
["Weapon Skills"] = 76292, |
["Runic Corruption"] = 51462, |
["On a Pale Horse"] = 51986, |
["Dark Succor"] = 178819, |
}, |
["Blood"] = { |
["Crimson Scourge"] = 81136, |
["Armor Skills"] = 76282, |
["Weapon Skills"] = 76292, |
["Veteran of the Third War"] = 48263, |
["On a Pale Horse"] = 51986, |
["Mastery: Blood Shield"] = 77513, |
}, |
["Pets"] = { |
["Ghoul"] = { |
["Avoidance"] = 62137, |
}, |
}, |
["Frost"] = { |
["Armor Skills"] = 76282, |
["Mastery: Frozen Heart"] = 77514, |
["Rime"] = 59057, |
["Weapon Skills"] = 76292, |
["Killing Machine"] = 51128, |
["Runic Empowerment"] = 81229, |
["On a Pale Horse"] = 51986, |
["Death Strike"] = 278223, |
["Dark Succor"] = 178819, |
}, |
["Blood_Talents"] = { |
["Foul Bulwark"] = 206974, |
["Heartbreaker"] = 221536, |
["Ossuary"] = 219786, |
["Rapid Decomposition"] = 194662, |
["Hemostasis"] = 273946, |
["Tightening Grasp"] = 206970, |
["Red Thirst"] = 205723, |
["Will of the Necropolis"] = 206967, |
["Bloodworms"] = 195679, |
["Anti-Magic Barrier"] = 205727, |
["Grip of the Dead"] = 273952, |
["Voracious"] = 273953, |
["Purgatory"] = 114556, |
}, |
["Unholy_PVPTalents"] = { |
["Heartstop Aura"] = 199719, |
["Crypt Fever"] = 199722, |
["Adaptation"] = 214027, |
["Wandering Plague"] = 199725, |
["Decomposing Aura"] = 199720, |
["Ghoulish Monstrosity"] = 280428, |
["Unholy Mutation"] = 201934, |
["Relentless"] = 196029, |
["Pandemic"] = 199724, |
["Cadaverous Pallor"] = 201995, |
["Necrotic Aura"] = 199642, |
}, |
["Unholy_Talents"] = { |
["Grip of the Dead"] = 273952, |
["Ebon Fever"] = 207269, |
["Harbinger of Doom"] = 276023, |
["Pestilence"] = 277234, |
["Army of the Damned"] = 276837, |
["Spell Eater"] = 207321, |
["Bursting Sores"] = 207264, |
["All Will Serve"] = 194916, |
["Death's Reach"] = 276079, |
["Pestilent Pustules"] = 194917, |
["Infected Claws"] = 207272, |
}, |
["Frost_PVPTalents"] = { |
["Heartstop Aura"] = 199719, |
["Crypt Fever"] = 199722, |
["Adaptation"] = 214027, |
["Wandering Plague"] = 199725, |
["Decomposing Aura"] = 199720, |
["Ghoulish Monstrosity"] = 280428, |
["Unholy Mutation"] = 201934, |
["Relentless"] = 196029, |
["Pandemic"] = 199724, |
["Cadaverous Pallor"] = 201995, |
["Necrotic Aura"] = 199642, |
}, |
["Blood_PVPTalents"] = { |
["Heartstop Aura"] = 199719, |
["Crypt Fever"] = 199722, |
["Adaptation"] = 214027, |
["Wandering Plague"] = 199725, |
["Decomposing Aura"] = 199720, |
["Ghoulish Monstrosity"] = 280428, |
["Unholy Mutation"] = 201934, |
["Relentless"] = 196029, |
["Pandemic"] = 199724, |
["Cadaverous Pallor"] = 201995, |
["Necrotic Aura"] = 199642, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Unholy"] = 252, |
["Frost"] = 251, |
["Blood"] = 250, |
}, |
}, |
}, |
["DEMONHUNTER"] = { |
["Havoc_Talents"] = { |
["Fel Mastery"] = 192939, |
["Blind Fury"] = 203550, |
["Demonic"] = 213410, |
["Insatiable Hunger"] = 258876, |
["Soul Rending"] = 204909, |
["Momentum"] = 206476, |
["Desperate Instincts"] = 205411, |
["Demonic Appetite"] = 206478, |
["Cycle of Hatred"] = 258887, |
["Master of the Glaive"] = 203556, |
["Trail of Ruin"] = 258881, |
["First Blood"] = 206416, |
["Demon Blades"] = 203555, |
["Unleashed Power"] = 206477, |
}, |
["Vengeance_Talents"] = { |
["Last Resort"] = 209258, |
["Feed the Demon"] = 218612, |
["Soul Rending"] = 217996, |
["Gluttony"] = 264004, |
["Agonizing Flames"] = 207548, |
["Burning Alive"] = 207739, |
["Void Reaver"] = 268175, |
["Razor Spikes"] = 209400, |
["Charred Flesh"] = 264002, |
["Concentrated Sigils"] = 207666, |
["Quickened Sigils"] = 209281, |
["Flame Crash"] = 227322, |
["Feast of Souls"] = 207697, |
["Fallout"] = 227174, |
["Abyssal Strike"] = 207550, |
}, |
["Havoc"] = { |
["Chaos Brand"] = 255260, |
["Mastery: Demonic Presence"] = 185164, |
["Double Jump"] = 196055, |
["Armor Skills"] = 202782, |
["Shattered Souls"] = 178940, |
["Demonic Wards"] = 278386, |
["Weapon Skills"] = 202783, |
}, |
["Vengeance"] = { |
["Chaos Brand"] = 255260, |
["Double Jump"] = 196055, |
["Armor Skills"] = 202782, |
["Mastery: Fel Blood"] = 203747, |
["Shattered Souls"] = 204254, |
["Demonic Wards"] = 203513, |
["Weapon Skills"] = 202783, |
}, |
["Havoc_PVPTalents"] = { |
["Sigil Mastery"] = 211489, |
["Cleansed by Flame"] = 205625, |
["Adaptation"] = 214027, |
["Solitude"] = 211509, |
["Jagged Spikes"] = 205627, |
["Unending Hatred"] = 213480, |
["Relentless"] = 196029, |
["Detainment"] = 205596, |
["Everlasting Hunt"] = 205626, |
}, |
["Vengeance_PVPTalents"] = { |
["Sigil Mastery"] = 211489, |
["Cleansed by Flame"] = 205625, |
["Adaptation"] = 214027, |
["Solitude"] = 211509, |
["Jagged Spikes"] = 205627, |
["Unending Hatred"] = 213480, |
["Relentless"] = 196029, |
["Detainment"] = 205596, |
["Everlasting Hunt"] = 205626, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Havoc"] = 577, |
["Vengeance"] = 581, |
}, |
}, |
}, |
["DRUID"] = { |
["Restoration_PVPTalents"] = { |
["Dying Stars"] = 232546, |
["Protector of the Grove"] = 209730, |
["Deep Roots"] = 233755, |
["Ferocious Wound"] = 236020, |
["Tooth and Claw"] = 236019, |
["Crescent Burn"] = 200567, |
["Malorne's Swiftness"] = 236012, |
["Celestial Guardian"] = 233754, |
["Adaptation"] = 214027, |
["Fresh Wound"] = 203224, |
["Celestial Downpour"] = 200726, |
["Ironfeather Armor"] = 233752, |
["Freedom of the Herd"] = 213200, |
["Earthen Grasp"] = 236023, |
["Moon and Stars"] = 233750, |
["Prickling Thorns"] = 200549, |
["Savage Momentum"] = 205673, |
["Moonkin Aura"] = 209740, |
["King of the Jungle"] = 203052, |
["Relentless"] = 196029, |
}, |
["Feral_Talents"] = { |
["Moment of Clarity"] = 236068, |
["Jagged Wounds"] = 202032, |
["Blood Scent"] = 202022, |
["Predator"] = 202021, |
["Soul of the Forest"] = 158476, |
["Balance Affinity"] = 197488, |
["Guardian Affinity"] = 217615, |
["Lunar Inspiration"] = 155580, |
["Sabertooth"] = 202031, |
["Restoration Affinity"] = 197492, |
["Bloodtalons"] = 155672, |
}, |
["Feral"] = { |
["Infected Wounds"] = 48484, |
["Armor Skills"] = 76275, |
["Mastery: Razor Claws"] = 77493, |
["Feline Swiftness"] = 131768, |
["Predatory Swiftness"] = 16974, |
["Feral Instinct"] = 16949, |
["Aquatic Form"] = 276012, |
["Swipe"] = 231283, |
["Omen of Clarity"] = 16864, |
["Tiger's Fury"] = 231055, |
["Travel Form"] = 159456, |
["Flight Form"] = 276029, |
["Shred"] = 231057, |
["Ferocious Bite"] = 231056, |
["Rake"] = 231052, |
["Primal Fury"] = 159286, |
["Weapon Skills"] = 76300, |
}, |
["Feral_PVPTalents"] = { |
["Dying Stars"] = 232546, |
["Protector of the Grove"] = 209730, |
["Deep Roots"] = 233755, |
["Ferocious Wound"] = 236020, |
["Tooth and Claw"] = 236019, |
["Crescent Burn"] = 200567, |
["Malorne's Swiftness"] = 236012, |
["Celestial Guardian"] = 233754, |
["Adaptation"] = 214027, |
["Fresh Wound"] = 203224, |
["Celestial Downpour"] = 200726, |
["Ironfeather Armor"] = 233752, |
["Freedom of the Herd"] = 213200, |
["Earthen Grasp"] = 236023, |
["Moon and Stars"] = 233750, |
["Prickling Thorns"] = 200549, |
["Savage Momentum"] = 205673, |
["Moonkin Aura"] = 209740, |
["King of the Jungle"] = 203052, |
["Relentless"] = 196029, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Feral"] = 103, |
["Balance"] = 102, |
["Guardian"] = 104, |
["Restoration"] = 105, |
}, |
}, |
["Restoration"] = { |
["Omen of Clarity"] = 113043, |
["Armor Skills"] = 76275, |
["Mastery: Harmony"] = 77495, |
["Ysera's Gift"] = 145108, |
["Flight Form"] = 276029, |
["Travel Form"] = 159456, |
["Sunfire"] = 231050, |
["Aquatic Form"] = 276012, |
["Rejuvenation"] = 231040, |
["Weapon Skills"] = 76300, |
}, |
["Balance"] = { |
["Mastery: Starlight"] = 77492, |
["Moonkin Form"] = 231042, |
["Armor Skills"] = 76275, |
["Eclipse"] = 279619, |
["Astral Influence"] = 197524, |
["Weapon Skills"] = 76300, |
["Flight Form"] = 276029, |
["Empowerments"] = 279708, |
["Aquatic Form"] = 276012, |
["Sunfire"] = 231050, |
["Starsurge"] = 231021, |
["Travel Form"] = 159456, |
}, |
["Guardian"] = { |
["Lightning Reflexes"] = 231065, |
["Armor Skills"] = 76275, |
["Frenzied Regeneration"] = 273048, |
["Flight Form"] = 276029, |
["Mastery: Nature's Guardian"] = 155783, |
["Bear Form"] = 270100, |
["Mangle"] = 231064, |
["Ironfur"] = 231070, |
["Thick Hide"] = 16931, |
["Gore"] = 210706, |
["Aquatic Form"] = 276012, |
["Travel Form"] = 159456, |
["Weapon Skills"] = 76300, |
}, |
["Restoration_Talents"] = { |
["Inner Peace"] = 197073, |
["Photosynthesis"] = 274902, |
["Spring Blossoms"] = 207385, |
["Cultivation"] = 200390, |
["Feral Affinity"] = 197490, |
["Soul of the Forest"] = 158478, |
["Abundance"] = 207383, |
["Germination"] = 155675, |
["Guardian Affinity"] = 197491, |
["Prosperity"] = 200383, |
["Balance Affinity"] = 197632, |
["Stonebark"] = 197061, |
}, |
["Balance_Talents"] = { |
["Starlord"] = 202345, |
["Restoration Affinity"] = 197492, |
["Nature's Balance"] = 202430, |
["Soul of the Forest"] = 114107, |
["Feral Affinity"] = 202157, |
["Guardian Affinity"] = 197491, |
["Stellar Drift"] = 202354, |
["Twin Moons"] = 279620, |
["Shooting Stars"] = 202342, |
}, |
["Guardian_PVPTalents"] = { |
["Dying Stars"] = 232546, |
["Protector of the Grove"] = 209730, |
["Deep Roots"] = 233755, |
["Ferocious Wound"] = 236020, |
["Tooth and Claw"] = 236019, |
["Crescent Burn"] = 200567, |
["Malorne's Swiftness"] = 236012, |
["Celestial Guardian"] = 233754, |
["Adaptation"] = 214027, |
["Fresh Wound"] = 203224, |
["Celestial Downpour"] = 200726, |
["Ironfeather Armor"] = 233752, |
["Freedom of the Herd"] = 213200, |
["Earthen Grasp"] = 236023, |
["Moon and Stars"] = 233750, |
["Prickling Thorns"] = 200549, |
["Savage Momentum"] = 205673, |
["Moonkin Aura"] = 209740, |
["King of the Jungle"] = 203052, |
["Relentless"] = 196029, |
}, |
["Balance_PVPTalents"] = { |
["Dying Stars"] = 232546, |
["Protector of the Grove"] = 209730, |
["Deep Roots"] = 233755, |
["Ferocious Wound"] = 236020, |
["Tooth and Claw"] = 236019, |
["Crescent Burn"] = 200567, |
["Malorne's Swiftness"] = 236012, |
["Celestial Guardian"] = 233754, |
["Adaptation"] = 214027, |
["Fresh Wound"] = 203224, |
["Celestial Downpour"] = 200726, |
["Ironfeather Armor"] = 233752, |
["Freedom of the Herd"] = 213200, |
["Earthen Grasp"] = 236023, |
["Moon and Stars"] = 233750, |
["Prickling Thorns"] = 200549, |
["Savage Momentum"] = 205673, |
["Moonkin Aura"] = 209740, |
["King of the Jungle"] = 203052, |
["Relentless"] = 196029, |
}, |
["Guardian_Talents"] = { |
["Blood Frenzy"] = 203962, |
["Restoration Affinity"] = 197492, |
["Feral Affinity"] = 202155, |
["Soul of the Forest"] = 158477, |
["Balance Affinity"] = 197488, |
["Brambles"] = 203953, |
["Galactic Guardian"] = 203964, |
["Guardian of Elune"] = 155578, |
["Earthwarden"] = 203974, |
["Survival of the Fittest"] = 203965, |
["Rend and Tear"] = 204053, |
}, |
}, |
["HUNTER"] = { |
["Beast Mastery_Talents"] = { |
["Trailblazer"] = 199921, |
["Stomp"] = 199530, |
["One with the Pack"] = 199528, |
["Animal Companion"] = 267116, |
["Scent of Blood"] = 193532, |
["Aspect of the Beast"] = 191384, |
["Killer Instinct"] = 273887, |
["Natural Mending"] = 270581, |
["Posthaste"] = 109215, |
["Venomous Bite"] = 257891, |
["Born To Be Wild"] = 266921, |
["Thrill of the Hunt"] = 257944, |
["Killer Cobra"] = 199532, |
}, |
["Marksmanship_Talents"] = { |
["Streamline"] = 260367, |
["Master Marksman"] = 260309, |
["Careful Aim"] = 260228, |
["Volley"] = 260243, |
["Lock and Load"] = 194595, |
["Calling the Shots"] = 260404, |
["Natural Mending"] = 270581, |
["Steady Focus"] = 193533, |
["Lethal Shots"] = 260393, |
["Born To Be Wild"] = 266921, |
["Posthaste"] = 109215, |
["Trailblazer"] = 199921, |
}, |
["Marksmanship"] = { |
["Disengage"] = 231549, |
["Trick Shots"] = 257621, |
["Lone Wolf"] = 155228, |
["Armor Skills"] = 76250, |
["Exhilaration"] = 231546, |
["Mastery: Sniper Training"] = 193468, |
["Precise Shots"] = 260240, |
["Weapon Skills"] = 76249, |
}, |
["Pets"] = { |
["Tenacity"] = { |
["Avoidance"] = 65220, |
["Endurance Training"] = 264662, |
}, |
["Cunning"] = { |
["Pathfinding"] = 264656, |
["Avoidance"] = 65220, |
}, |
["Ferocity"] = { |
["Avoidance"] = 65220, |
["Predator's Thirst"] = 264663, |
}, |
}, |
["Survival_PVPTalents"] = { |
["The Beast Within"] = 212668, |
["Wild Protector"] = 204190, |
["Hunting Pack"] = 203235, |
["Relentless"] = 196029, |
["Dragonscale Armor"] = 202589, |
["Adaptation"] = 214027, |
["Survival Tactics"] = 202746, |
}, |
["Marksmanship_PVPTalents"] = { |
["The Beast Within"] = 212668, |
["Wild Protector"] = 204190, |
["Hunting Pack"] = 203235, |
["Relentless"] = 196029, |
["Dragonscale Armor"] = 202589, |
["Adaptation"] = 214027, |
["Survival Tactics"] = 202746, |
}, |
["Survival"] = { |
["Disengage"] = 231549, |
["Harpoon"] = 231550, |
["Exhilaration"] = 231546, |
["Armor Skills"] = 76250, |
["Raptor Strike"] = 262839, |
["Kill Command"] = 263186, |
["Mastery: Spirit Bond"] = 263135, |
["Weapon Skills"] = 76249, |
}, |
["Survival_Talents"] = { |
["Bloodseeker"] = 260248, |
["Tip of the Spear"] = 260285, |
["Terms of Engagement"] = 265895, |
["Alpha Predator"] = 269737, |
["Viper's Venom"] = 268501, |
["Posthaste"] = 109215, |
["Birds of Prey"] = 260331, |
["Natural Mending"] = 270581, |
["Hydra's Bite"] = 260241, |
["Trailblazer"] = 199921, |
["Born To Be Wild"] = 266921, |
["Guerrilla Tactics"] = 264332, |
["Wildfire Infusion"] = 271014, |
}, |
["Beast Mastery"] = { |
["Armor Skills"] = 76250, |
["Mastery: Master of Beasts"] = 76657, |
["Beast Cleave"] = 115939, |
["Wild Call"] = 185789, |
["Kindred Spirits"] = 56315, |
["Exotic Beasts"] = 53270, |
["Weapon Skills"] = 76249, |
}, |
["Beast Mastery_PVPTalents"] = { |
["The Beast Within"] = 212668, |
["Wild Protector"] = 204190, |
["Hunting Pack"] = 203235, |
["Relentless"] = 196029, |
["Dragonscale Armor"] = 202589, |
["Adaptation"] = 214027, |
["Survival Tactics"] = 202746, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Marksmanship"] = 254, |
["Beast Mastery"] = 253, |
["Survival"] = 255, |
}, |
}, |
}, |
["MAGE"] = { |
["Fire_PVPTalents"] = { |
["Deep Shatter"] = 198123, |
["Prismatic Cloak"] = 198064, |
["Adaptation"] = 214027, |
["Dampened Magic"] = 236788, |
["Concentrated Coolness"] = 198148, |
["Relentless"] = 196029, |
["Burst of Cold"] = 206431, |
["Frostbite"] = 198120, |
["Netherwind Armor"] = 198062, |
["Kleptomania"] = 198100, |
["Chilled to the Bone"] = 198126, |
}, |
["Frost_Talents"] = { |
["Frigid Winds"] = 235224, |
["Chain Reaction"] = 278309, |
["Splitting Ice"] = 56377, |
["Frozen Touch"] = 205030, |
["Lonely Winter"] = 205024, |
["Thermal Void"] = 155149, |
["Incanter's Flow"] = 1463, |
["Glacial Insulation"] = 235297, |
["Bone Chilling"] = 205027, |
["Ice Ward"] = 205036, |
["Freezing Rain"] = 270233, |
}, |
["Arcane_Talents"] = { |
["Rule of Threes"] = 264354, |
["Mana Shield"] = 235463, |
["Chrono Shift"] = 235711, |
["Reverberate"] = 281482, |
["Time Anomaly"] = 210805, |
["Touch of the Magi"] = 210725, |
["Overpowered"] = 155147, |
["Slipstream"] = 236457, |
["Amplification"] = 236628, |
["Incanter's Flow"] = 1463, |
["Ice Ward"] = 205036, |
["Resonance"] = 205028, |
}, |
["Pets"] = { |
["Water Elemental"] = { |
["Avoidance"] = 65220, |
}, |
}, |
["Frost"] = { |
["Mastery: Icicles"] = 76613, |
["Fingers of Frost"] = 112965, |
["Armor Skills"] = 76276, |
["Shatter"] = 12982, |
["Brain Freeze"] = 190447, |
["Weapon Skills"] = 76298, |
}, |
["Frost_PVPTalents"] = { |
["Deep Shatter"] = 198123, |
["Prismatic Cloak"] = 198064, |
["Adaptation"] = 214027, |
["Dampened Magic"] = 236788, |
["Concentrated Coolness"] = 198148, |
["Relentless"] = 196029, |
["Burst of Cold"] = 206431, |
["Frostbite"] = 198120, |
["Netherwind Armor"] = 198062, |
["Kleptomania"] = 198100, |
["Chilled to the Bone"] = 198126, |
}, |
["Arcane"] = { |
["Mastery: Savant"] = 190740, |
["Clearcasting"] = 79684, |
["Arcane Barrage"] = 231564, |
["Evocation"] = 231565, |
["Armor Skills"] = 76276, |
["Weapon Skills"] = 76298, |
}, |
["Arcane_PVPTalents"] = { |
["Deep Shatter"] = 198123, |
["Prismatic Cloak"] = 198064, |
["Adaptation"] = 214027, |
["Dampened Magic"] = 236788, |
["Concentrated Coolness"] = 198148, |
["Relentless"] = 196029, |
["Burst of Cold"] = 206431, |
["Frostbite"] = 198120, |
["Netherwind Armor"] = 198062, |
["Kleptomania"] = 198100, |
["Chilled to the Bone"] = 198126, |
}, |
["Fire"] = { |
["Fire Blast"] = 231567, |
["Enhanced Pyrotechnics"] = 157642, |
["Cauterize"] = 86949, |
["Armor Skills"] = 76276, |
["Hot Streak"] = 195283, |
["Critical Mass"] = 117216, |
["Mastery: Ignite"] = 12846, |
["Weapon Skills"] = 76298, |
}, |
["Fire_Talents"] = { |
["Blazing Soul"] = 235365, |
["Incanter's Flow"] = 1463, |
["Conflagration"] = 205023, |
["Pyromaniac"] = 205020, |
["Firestarter"] = 205026, |
["Pyroclasm"] = 269650, |
["Alexstrasza's Fury"] = 235870, |
["Frenetic Speed"] = 236058, |
["Flame Patch"] = 205037, |
["Kindling"] = 155148, |
["Flame On"] = 205029, |
["Ice Ward"] = 205036, |
["Searing Touch"] = 269644, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Fire"] = 63, |
["Frost"] = 64, |
["Arcane"] = 62, |
}, |
}, |
}, |
["MONK"] = { |
["Windwalker_Talents"] = { |
["Hit Combo"] = 196740, |
["Tiger Tail Sweep"] = 264348, |
["Ascension"] = 115396, |
["Good Karma"] = 280195, |
["Eye of the Tiger"] = 196607, |
["Spiritual Focus"] = 280197, |
["Inner Strength"] = 261767, |
["Celerity"] = 115173, |
}, |
["Mistweaver_Talents"] = { |
["Spirit of the Crane"] = 210802, |
["Focused Thunder"] = 197895, |
["Rising Mist"] = 274909, |
["Tiger Tail Sweep"] = 264348, |
["Mist Wrap"] = 197900, |
["Upwelling"] = 274963, |
["Lifecycles"] = 197915, |
["Celerity"] = 115173, |
}, |
["Mistweaver"] = { |
["Thunder Focus Tea"] = 231876, |
["Armor Skills"] = 106904, |
["Vivify"] = 274586, |
["Renewing Mist"] = 281231, |
["Teachings of the Monastery"] = 116645, |
["Mastery: Gust of Mists"] = 117907, |
["Enveloping Mist"] = 231605, |
["Weapon Skills"] = 106902, |
["Rising Sun Kick"] = 262840, |
["Mystic Touch"] = 8647, |
["Essence Font"] = 231633, |
}, |
["Brewmaster"] = { |
["Gift of the Ox"] = 124502, |
["Armor Skills"] = 106904, |
["Vivify"] = 231602, |
["Stagger"] = 115069, |
["Mastery: Elusive Brawler"] = 117906, |
["Brewmaster's Balance"] = 245013, |
["Weapon Skills"] = 106902, |
["Mystic Touch"] = 8647, |
["Celestial Fortune"] = 216519, |
}, |
["Windwalker"] = { |
["Storm, Earth, and Fire"] = 231627, |
["Armor Skills"] = 106904, |
["Vivify"] = 231602, |
["Afterlife"] = 116092, |
["Blackout Kick"] = 261917, |
["Weapon Skills"] = 106902, |
["Mastery: Combo Strikes"] = 115636, |
["Rising Sun Kick"] = 262840, |
["Windwalking"] = 157411, |
["Mystic Touch"] = 8647, |
}, |
["Mistweaver_PVPTalents"] = { |
["Control the Mists"] = 233765, |
["Adaptation"] = 214027, |
["Disabling Reach"] = 201769, |
["Heavy-Handed Strikes"] = 232054, |
["Ride the Wind"] = 201372, |
["Eminence"] = 216255, |
["Relentless"] = 196029, |
["Tiger Style"] = 206743, |
["Fast Feet"] = 201201, |
["Yu'lon's Gift"] = 232879, |
}, |
["Windwalker_PVPTalents"] = { |
["Control the Mists"] = 233765, |
["Adaptation"] = 214027, |
["Disabling Reach"] = 201769, |
["Heavy-Handed Strikes"] = 232054, |
["Ride the Wind"] = 201372, |
["Eminence"] = 216255, |
["Relentless"] = 196029, |
["Tiger Style"] = 206743, |
["Fast Feet"] = 201201, |
["Yu'lon's Gift"] = 232879, |
}, |
["Brewmaster_Talents"] = { |
["Special Delivery"] = 196730, |
["Eye of the Tiger"] = 196607, |
["Celerity"] = 115173, |
["Blackout Combo"] = 196736, |
["Spitfire"] = 242580, |
["Tiger Tail Sweep"] = 264348, |
["Light Brewing"] = 196721, |
["High Tolerance"] = 196737, |
["Bob and Weave"] = 280515, |
}, |
["Brewmaster_PVPTalents"] = { |
["Control the Mists"] = 233765, |
["Adaptation"] = 214027, |
["Disabling Reach"] = 201769, |
["Heavy-Handed Strikes"] = 232054, |
["Ride the Wind"] = 201372, |
["Eminence"] = 216255, |
["Relentless"] = 196029, |
["Tiger Style"] = 206743, |
["Fast Feet"] = 201201, |
["Yu'lon's Gift"] = 232879, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Mistweaver"] = 270, |
["Brewmaster"] = 268, |
["Windwalker"] = 269, |
}, |
}, |
}, |
["PALADIN"] = { |
["Protection"] = { |
["Mastery: Divine Bulwark"] = 76671, |
["Grand Crusader"] = 85043, |
["Heart of the Crusader"] = 32223, |
["Judgment"] = 231657, |
["Avenger's Shield"] = 231665, |
["Armor Skills"] = 76271, |
["Weapon Skills"] = 76294, |
}, |
["Holy"] = { |
["Heart of the Crusader"] = 32223, |
["Blessing of Sacrifice"] = 200327, |
["Holy Shock"] = 272906, |
["Infusion of Light"] = 53576, |
["Armor Skills"] = 76271, |
["Mastery: Lightbringer"] = 183997, |
["Judgment"] = 231644, |
["Crusader Strike"] = 231667, |
["Beacon of Light"] = 231642, |
["Weapon Skills"] = 76294, |
}, |
["Protection_PVPTalents"] = { |
["Luminescence"] = 199428, |
["Holy Ritual"] = 199422, |
["Adaptation"] = 214027, |
["Jurisdiction"] = 204979, |
["Lawbringer"] = 246806, |
["Vengeance Aura"] = 210323, |
["Unbound Freedom"] = 199325, |
["Relentless"] = 196029, |
["Seraphim's Blessing"] = 204927, |
["Divine Punisher"] = 204914, |
["Law and Order"] = 204934, |
}, |
["Holy_Talents"] = { |
["Devotion Aura"] = 183425, |
["Divine Purpose"] = 197646, |
["Judgment of Light"] = 183778, |
["Aura of Sacrifice"] = 183416, |
["Aura of Mercy"] = 183415, |
["Fist of Justice"] = 198054, |
["Cavalier"] = 230332, |
["Crusader's Might"] = 196926, |
["Awakening"] = 248033, |
["Unbreakable Spirit"] = 114154, |
["Sanctified Wrath"] = 53376, |
}, |
["Holy_PVPTalents"] = { |
["Luminescence"] = 199428, |
["Holy Ritual"] = 199422, |
["Adaptation"] = 214027, |
["Jurisdiction"] = 204979, |
["Lawbringer"] = 246806, |
["Vengeance Aura"] = 210323, |
["Unbound Freedom"] = 199325, |
["Relentless"] = 196029, |
["Seraphim's Blessing"] = 204927, |
["Divine Punisher"] = 204914, |
["Law and Order"] = 204934, |
}, |
["Retribution_Talents"] = { |
["Divine Judgment"] = 271580, |
["Fires of Justice"] = 203316, |
["Selfless Healer"] = 85804, |
["Fist of Justice"] = 234299, |
["Righteous Verdict"] = 267610, |
["Unbreakable Spirit"] = 114154, |
["Divine Purpose"] = 223817, |
["Cavalier"] = 230332, |
["Blade of Wrath"] = 231832, |
["Zeal"] = 269569, |
}, |
["Retribution_PVPTalents"] = { |
["Luminescence"] = 199428, |
["Holy Ritual"] = 199422, |
["Adaptation"] = 214027, |
["Jurisdiction"] = 204979, |
["Lawbringer"] = 246806, |
["Vengeance Aura"] = 210323, |
["Unbound Freedom"] = 199325, |
["Relentless"] = 196029, |
["Seraphim's Blessing"] = 204927, |
["Divine Punisher"] = 204914, |
["Law and Order"] = 204934, |
}, |
["Protection_Talents"] = { |
["Crusader's Judgment"] = 204023, |
["Consecrated Ground"] = 204054, |
["Retribution Aura"] = 203797, |
["Redoubt"] = 280373, |
["Judgment of Light"] = 183778, |
["Fist of Justice"] = 198054, |
["Last Defender"] = 203791, |
["Final Stand"] = 204077, |
["Unbreakable Spirit"] = 114154, |
["Holy Shield"] = 152261, |
["Cavalier"] = 230332, |
["Righteous Protector"] = 204074, |
["First Avenger"] = 203776, |
}, |
["Retribution"] = { |
["Mastery: Hand of Light"] = 267316, |
["Art of War"] = 267344, |
["Heart of the Crusader"] = 32223, |
["Armor Skills"] = 76271, |
["Retribution"] = 183435, |
["Weapon Skills"] = 76294, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Protection"] = 66, |
["Holy"] = 65, |
["Retribution"] = 70, |
}, |
}, |
}, |
["PRIEST"] = { |
["Shadow"] = { |
["Shadowy Apparitions"] = 78203, |
["Armor Skills"] = 76279, |
["Voidform"] = 228264, |
["Void Bolt"] = 228266, |
["Mastery: Madness"] = 77486, |
["Weapon Skills"] = 76301, |
}, |
["Shadow_PVPTalents"] = { |
["Purified Resolve"] = 196439, |
["Adaptation"] = 214027, |
["Ultimate Radiance"] = 236499, |
["Searing Light"] = 215768, |
["Strength of Soul"] = 197535, |
["Relentless"] = 196029, |
["Purification"] = 196162, |
["Dome of Light"] = 197590, |
["Trinity"] = 214205, |
}, |
["Holy_Talents"] = { |
["Enduring Renewal"] = 200153, |
["Angel's Mercy"] = 238100, |
["Enlightenment"] = 193155, |
["Afterlife"] = 196707, |
["Surge of Light"] = 109186, |
["Guardian Angel"] = 200209, |
["Censure"] = 200199, |
["Perseverance"] = 235189, |
["Psychic Voice"] = 196704, |
["Benediction"] = 193157, |
["Light of the Naaru"] = 196985, |
["Trail of Light"] = 200128, |
["Cosmic Ripple"] = 238136, |
}, |
["Holy_PVPTalents"] = { |
["Purified Resolve"] = 196439, |
["Adaptation"] = 214027, |
["Ultimate Radiance"] = 236499, |
["Searing Light"] = 215768, |
["Strength of Soul"] = 197535, |
["Relentless"] = 196029, |
["Purification"] = 196162, |
["Dome of Light"] = 197590, |
["Trinity"] = 214205, |
}, |
["Shadow_Talents"] = { |
["Misery"] = 238558, |
["Mania"] = 193173, |
["Fortress of the Mind"] = 193195, |
["Body and Soul"] = 64129, |
["Auspicious Spirits"] = 155271, |
["Last Word"] = 263716, |
["Shadowy Insight"] = 162452, |
["Legacy of the Void"] = 193225, |
["San'layn"] = 199855, |
["Twist of Fate"] = 109142, |
["Lingering Insanity"] = 199849, |
}, |
["Discipline"] = { |
["Mastery: Grace"] = 271534, |
["Focused Will"] = 45243, |
["Armor Skills"] = 76279, |
["Power of the Dark Side"] = 198068, |
["Atonement"] = 81749, |
["Weapon Skills"] = 76301, |
}, |
["Discipline_PVPTalents"] = { |
["Purified Resolve"] = 196439, |
["Adaptation"] = 214027, |
["Ultimate Radiance"] = 236499, |
["Searing Light"] = 215768, |
["Strength of Soul"] = 197535, |
["Relentless"] = 196029, |
["Purification"] = 196162, |
["Dome of Light"] = 197590, |
["Trinity"] = 214205, |
}, |
["Holy"] = { |
["Weapon Skills"] = 76301, |
["Holy Fire"] = 231687, |
["Focused Will"] = 45243, |
["Smite"] = 262861, |
["Armor Skills"] = 76279, |
["Spirit of Redemption"] = 20711, |
["Mastery: Echo of Light"] = 77485, |
["Holy Words"] = 63733, |
}, |
["Discipline_Talents"] = { |
["Lenience"] = 238063, |
["Psychic Voice"] = 196704, |
["Twist of Fate"] = 265259, |
["Castigation"] = 193134, |
["Body and Soul"] = 64129, |
["Dominant Mind"] = 205367, |
["Sins of the Many"] = 280391, |
["Contrition"] = 197419, |
["Shield Discipline"] = 197045, |
["Masochism"] = 193063, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Discipline"] = 256, |
["Shadow"] = 258, |
["Holy"] = 257, |
}, |
}, |
}, |
["ROGUE"] = { |
["Subtlety_PVPTalents"] = { |
["System Shock"] = 198145, |
["Deadly Brew"] = 197044, |
["Adaptation"] = 214027, |
["Creeping Venom"] = 198092, |
["Flying Daggers"] = 198128, |
["Mind-Numbing Poison"] = 197050, |
["Relentless"] = 196029, |
["Intent to Kill"] = 197007, |
["Honor Among Thieves"] = 198032, |
["Maneuverability"] = 197000, |
}, |
["Assassination_PVPTalents"] = { |
["System Shock"] = 198145, |
["Deadly Brew"] = 197044, |
["Adaptation"] = 214027, |
["Creeping Venom"] = 198092, |
["Flying Daggers"] = 198128, |
["Mind-Numbing Poison"] = 197050, |
["Relentless"] = 196029, |
["Intent to Kill"] = 197007, |
["Honor Among Thieves"] = 198032, |
["Maneuverability"] = 197000, |
}, |
["Assassination"] = { |
["Venomous Wounds"] = 79134, |
["Mastery: Potent Assassin"] = 76803, |
["Weapon Skills"] = 76297, |
["Fleet Footed"] = 31209, |
["Armor Skills"] = 76273, |
["Seal Fate"] = 14190, |
}, |
["Assassination_Talents"] = { |
["Internal Bleeding"] = 154904, |
["Subterfuge"] = 108208, |
["Venom Rush"] = 152152, |
["Poison Bomb"] = 255544, |
["Elusiveness"] = 79008, |
["Master Assassin"] = 255989, |
["Deeper Stratagem"] = 193531, |
["Iron Wire"] = 196861, |
["Vigor"] = 14983, |
["Prey on the Weak"] = 131511, |
["Master Poisoner"] = 196864, |
["Cheat Death"] = 31230, |
["Nightstalker"] = 14062, |
["Hidden Blades"] = 270061, |
["Elaborate Planning"] = 193640, |
["Leeching Poison"] = 280716, |
}, |
["Subtlety"] = { |
["Shadow Techniques"] = 196912, |
["Shadow's Grasp"] = 277950, |
["Armor Skills"] = 76273, |
["Eviscerate"] = 231716, |
["Deepening Shadows"] = 185314, |
["Fleet Footed"] = 31209, |
["Mastery: Executioner"] = 76808, |
["Shadowstrike"] = 231718, |
["Relentless Strikes"] = 58423, |
["Shuriken Combo"] = 245639, |
["Sprint"] = 245751, |
["Weapon Skills"] = 76297, |
}, |
["Outlaw_PVPTalents"] = { |
["System Shock"] = 198145, |
["Deadly Brew"] = 197044, |
["Adaptation"] = 214027, |
["Creeping Venom"] = 198092, |
["Flying Daggers"] = 198128, |
["Mind-Numbing Poison"] = 197050, |
["Relentless"] = 196029, |
["Intent to Kill"] = 197007, |
["Honor Among Thieves"] = 198032, |
["Maneuverability"] = 197000, |
}, |
["Outlaw_Talents"] = { |
["Retractable Hook"] = 256188, |
["Cheat Death"] = 31230, |
["Deeper Stratagem"] = 193531, |
["Quick Draw"] = 196938, |
["Loaded Dice"] = 256170, |
["Alacrity"] = 193539, |
["Weaponmaster"] = 200733, |
["Blinding Powder"] = 256165, |
["Vigor"] = 14983, |
["Prey on the Weak"] = 131511, |
["Acrobatic Strikes"] = 196924, |
["Iron Stomach"] = 193546, |
["Dirty Tricks"] = 108216, |
["Elusiveness"] = 79008, |
["Dancing Steel"] = 272026, |
["Hit and Run"] = 196922, |
}, |
["Outlaw"] = { |
["Sprint"] = 231691, |
["Mastery: Main Gauche"] = 76806, |
["Combat Potency"] = 61329, |
["Armor Skills"] = 76273, |
["Sinister Strike"] = 279876, |
["Restless Blades"] = 79096, |
["Between the Eyes"] = 235484, |
["Fleet Footed"] = 31209, |
["Ruthlessness"] = 14161, |
["Weapon Skills"] = 76297, |
}, |
["Subtlety_Talents"] = { |
["Shadow Focus"] = 108209, |
["Cheat Death"] = 31230, |
["Soothing Darkness"] = 200759, |
["Night Terrors"] = 277953, |
["Dark Shadow"] = 245687, |
["Enveloping Shadows"] = 238104, |
["Shot in the Dark"] = 257505, |
["Elusiveness"] = 79008, |
["Subterfuge"] = 108208, |
["Deeper Stratagem"] = 193531, |
["Vigor"] = 14983, |
["Prey on the Weak"] = 131511, |
["Master of Shadows"] = 196976, |
["Nightstalker"] = 14062, |
["Alacrity"] = 193539, |
["Find Weakness"] = 91023, |
["Weaponmaster"] = 193537, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Outlaw"] = 260, |
["Subtlety"] = 261, |
["Assassination"] = 259, |
}, |
}, |
}, |
["SHAMAN"] = { |
["Restoration_PVPTalents"] = { |
["Electrocute"] = 206642, |
["Spectral Recovery"] = 204261, |
["Tidebringer"] = 236501, |
["Purifying Waters"] = 204247, |
["Calming Waters"] = 221678, |
["Voodoo Mastery"] = 204268, |
["Relentless"] = 196029, |
["Swelling Waves"] = 204264, |
["Rippling Waters"] = 204269, |
["Adaptation"] = 214027, |
}, |
["Elemental"] = { |
["Lava Surge"] = 77756, |
["Lava Burst"] = 231721, |
["Weapon Skills"] = 76296, |
["Armor Skills"] = 76272, |
["Elemental Fury"] = 60188, |
["Mastery: Elemental Overload"] = 168534, |
["Chain Lightning"] = 231722, |
["Reincarnation"] = 20608, |
}, |
["Enhancement"] = { |
["Healing Surge"] = 190899, |
["Stormbringer"] = 201845, |
["Mastery: Enhanced Elements"] = 77223, |
["Windfury"] = 33757, |
["Weapon Skills"] = 76296, |
["Feral Spirit"] = 231723, |
["Armor Skills"] = 76272, |
["Reincarnation"] = 20608, |
["Maelstrom Weapon"] = 187880, |
}, |
["Enhancement_PVPTalents"] = { |
["Electrocute"] = 206642, |
["Spectral Recovery"] = 204261, |
["Tidebringer"] = 236501, |
["Purifying Waters"] = 204247, |
["Calming Waters"] = 221678, |
["Voodoo Mastery"] = 204268, |
["Relentless"] = 196029, |
["Swelling Waves"] = 204264, |
["Rippling Waters"] = 204269, |
["Adaptation"] = 214027, |
}, |
["Enhancement_Talents"] = { |
["Forceful Winds"] = 262647, |
["Hailstorm"] = 210853, |
["Elemental Spirits"] = 262624, |
["Crashing Storm"] = 192246, |
["Hot Hand"] = 201900, |
["Searing Assault"] = 192087, |
["Spirit Wolf"] = 260878, |
["Boulderfist"] = 246035, |
["Static Charge"] = 265046, |
["Nature's Guardian"] = 30884, |
["Overcharge"] = 210727, |
["Landslide"] = 197992, |
}, |
["Elemental_PVPTalents"] = { |
["Electrocute"] = 206642, |
["Spectral Recovery"] = 204261, |
["Tidebringer"] = 236501, |
["Purifying Waters"] = 204247, |
["Calming Waters"] = 221678, |
["Voodoo Mastery"] = 204268, |
["Relentless"] = 196029, |
["Swelling Waves"] = 204264, |
["Rippling Waters"] = 204269, |
["Adaptation"] = 214027, |
}, |
["Elemental_Talents"] = { |
["Exposed Elements"] = 260694, |
["Earthen Rage"] = 170374, |
["Primal Elementalist"] = 117013, |
["Unlimited Power"] = 260895, |
["Master of the Elements"] = 16166, |
["Spirit Wolf"] = 260878, |
["Nature's Guardian"] = 30884, |
["Static Charge"] = 265046, |
["Echo of the Elements"] = 108283, |
["High Voltage"] = 260890, |
["Aftershock"] = 273221, |
}, |
["Restoration_Talents"] = { |
["High Tide"] = 157154, |
["Graceful Spirit"] = 192088, |
["Undulation"] = 200071, |
["Torrent"] = 200072, |
["Deluge"] = 200076, |
["Spirit Wolf"] = 260878, |
["Nature's Guardian"] = 30884, |
["Static Charge"] = 265046, |
["Echo of the Elements"] = 108283, |
["Flash Flood"] = 280614, |
["Ancestral Vigor"] = 207401, |
}, |
["Restoration"] = { |
["Lava Surge"] = 77756, |
["Mastery: Deep Healing"] = 77226, |
["Armor Skills"] = 76272, |
["Weapon Skills"] = 76296, |
["Tidal Waves"] = 51564, |
["Resurgence"] = 16196, |
["Reincarnation"] = 20608, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Enhancement"] = 263, |
["Elemental"] = 262, |
["Restoration"] = 264, |
}, |
}, |
}, |
["WARLOCK"] = { |
["Destruction_Talents"] = { |
["Eradication"] = 196412, |
["Flashover"] = 267115, |
["Internal Combustion"] = 266134, |
["Demon Skin"] = 219272, |
["Fire and Brimstone"] = 196408, |
["Roaring Blaze"] = 205184, |
["Soul Conduit"] = 215941, |
["Darkfury"] = 264874, |
["Inferno"] = 270545, |
["Grimoire of Supremacy"] = 266086, |
["Reverse Entropy"] = 205148, |
}, |
["Affliction"] = { |
["Agony"] = 231792, |
["Soul Leech"] = 108370, |
["Soul Shards"] = 246985, |
["Soulstone"] = 231811, |
["Weapon Skills"] = 76299, |
["Armor Skills"] = 76277, |
["Unstable Affliction"] = 231791, |
["Mastery: Potent Afflictions"] = 77215, |
}, |
["Affliction_Talents"] = { |
["Sow the Seeds"] = 196226, |
["Absolute Corruption"] = 196103, |
["Creeping Death"] = 264000, |
["Demon Skin"] = 219272, |
["Soul Conduit"] = 215941, |
["Darkfury"] = 264874, |
["Writhe in Agony"] = 196102, |
["Shadow Embrace"] = 32388, |
["Nightfall"] = 108558, |
}, |
["Pets"] = { |
["Fel Imp"] = { |
["Avoidance"] = 32233, |
}, |
["Wrathguard"] = { |
["Avoidance"] = 32233, |
["Void Reflexes"] = 117225, |
}, |
["Shivarra"] = { |
["Avoidance"] = 32233, |
}, |
["Voidlord"] = { |
["Avoidance"] = 32233, |
["Void Reflexes"] = 117225, |
}, |
["Observer"] = { |
["Avoidance"] = 32233, |
}, |
["Imp"] = { |
["Avoidance"] = 32233, |
}, |
}, |
["Destruction_PVPTalents"] = { |
["Pleasure through Pain"] = 212618, |
["Master Summoner"] = 212628, |
["Relentless"] = 196029, |
["Essence Drain"] = 221711, |
["Adaptation"] = 214027, |
}, |
["Destruction"] = { |
["Mastery: Chaotic Energies"] = 77220, |
["Soul Leech"] = 108370, |
["Soul Shards"] = 246985, |
["Soulstone"] = 231811, |
["Weapon Skills"] = 76299, |
["Armor Skills"] = 76277, |
["Conflagrate"] = 231793, |
["Backdraft"] = 196406, |
}, |
["Demonology_PVPTalents"] = { |
["Pleasure through Pain"] = 212618, |
["Master Summoner"] = 212628, |
["Relentless"] = 196029, |
["Essence Drain"] = 221711, |
["Adaptation"] = 214027, |
}, |
["Demonology"] = { |
["Demonic Core"] = 267102, |
["Soul Leech"] = 108370, |
["Soul Shards"] = 246985, |
["Armor Skills"] = 76277, |
["Weapon Skills"] = 76299, |
["Mastery: Master Demonologist"] = 77219, |
["Soul Link"] = 108415, |
}, |
["Demonology_Talents"] = { |
["From the Shadows"] = 267170, |
["Sacrificed Souls"] = 267214, |
["Demonic Calling"] = 205145, |
["Demonic Consumption"] = 267215, |
["Soul Conduit"] = 215941, |
["Demon Skin"] = 219272, |
["Inner Demons"] = 267216, |
["Darkfury"] = 264874, |
["Dreadlash"] = 264078, |
}, |
["Affliction_PVPTalents"] = { |
["Pleasure through Pain"] = 212618, |
["Master Summoner"] = 212628, |
["Relentless"] = 196029, |
["Essence Drain"] = 221711, |
["Adaptation"] = 214027, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Demonology"] = 266, |
["Affliction"] = 265, |
["Destruction"] = 267, |
}, |
}, |
}, |
["WARRIOR"] = { |
["Protection"] = { |
["Shield Slam"] = 231834, |
["Mastery: Critical Block"] = 76857, |
["Shield Block"] = 231847, |
["Deep Wounds"] = 115768, |
["Vanguard"] = 71, |
["Armor Skills"] = 76268, |
["Weapon Skills"] = 76290, |
}, |
["Arms_Talents"] = { |
["Bounding Stride"] = 202163, |
["Double Time"] = 103827, |
["Fervor of Battle"] = 202316, |
["Collateral Damage"] = 268243, |
["Massacre"] = 281001, |
["Second Wind"] = 29838, |
["Sudden Death"] = 29725, |
["War Machine"] = 262231, |
["Dreadnaught"] = 262150, |
["Anger Management"] = 152278, |
["In For The Kill"] = 248621, |
}, |
["Fury"] = { |
["Enrage"] = 184361, |
["Armor Skills"] = 76268, |
["Mastery: Unshackled Fury"] = 76856, |
["Titan's Grip"] = 46917, |
["Weapon Skills"] = 76290, |
}, |
["Fury_Talents"] = { |
["Furious Charge"] = 202224, |
["Endless Rage"] = 202296, |
["Warpaint"] = 208154, |
["Bounding Stride"] = 202163, |
["Inner Rage"] = 215573, |
["Double Time"] = 103827, |
["Meat Cleaver"] = 280392, |
["Massacre"] = 206315, |
["Carnage"] = 202922, |
["Reckless Abandon"] = 202751, |
["Sudden Death"] = 280721, |
["War Machine"] = 262231, |
["Fresh Meat"] = 215568, |
["Anger Management"] = 152278, |
["Frothing Berserker"] = 215571, |
}, |
["Protection_PVPTalents"] = { |
["Slaughterhouse"] = 280747, |
["Adaptation"] = 214027, |
["Enduring Rage"] = 198877, |
["Barbarian"] = 280745, |
["Thirst for Battle"] = 199202, |
["Relentless"] = 196029, |
["Master and Commander"] = 235941, |
["Battle Trance"] = 213857, |
["Death Sentence"] = 198500, |
}, |
["Fury_PVPTalents"] = { |
["Slaughterhouse"] = 280747, |
["Adaptation"] = 214027, |
["Enduring Rage"] = 198877, |
["Barbarian"] = 280745, |
["Thirst for Battle"] = 199202, |
["Relentless"] = 196029, |
["Master and Commander"] = 235941, |
["Battle Trance"] = 213857, |
["Death Sentence"] = 198500, |
}, |
["Arms_PVPTalents"] = { |
["Slaughterhouse"] = 280747, |
["Adaptation"] = 214027, |
["Enduring Rage"] = 198877, |
["Barbarian"] = 280745, |
["Thirst for Battle"] = 199202, |
["Relentless"] = 196029, |
["Master and Commander"] = 235941, |
["Battle Trance"] = 213857, |
["Death Sentence"] = 198500, |
}, |
["Arms"] = { |
["Seasoned Soldier"] = 279423, |
["Tactician"] = 184783, |
["Execute"] = 231830, |
["Mastery: Deep Wounds"] = 262111, |
["Armor Skills"] = 76268, |
["Weapon Skills"] = 76290, |
}, |
["Protection_Talents"] = { |
["Vengeance"] = 202572, |
["Menace"] = 275338, |
["Rumbling Earth"] = 275339, |
["Bolster"] = 280001, |
["Devastator"] = 236279, |
["Booming Voice"] = 202743, |
["Safeguard"] = 223657, |
["Punish"] = 275334, |
["Bounding Stride"] = 202163, |
["Heavy Repercussions"] = 203177, |
["Unstoppable Force"] = 275336, |
["Never Surrender"] = 202561, |
["Crackling Thunder"] = 203201, |
["Into the Fray"] = 202603, |
["Indomitable"] = 202095, |
["Anger Management"] = 152278, |
["Best Served Cold"] = 202560, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Fury"] = 72, |
["Arms"] = 71, |
["Protection"] = 73, |
}, |
}, |
}, |
}; |
-- Helper functions: Default lookup priorities -- |
------------------------------------------------- |
local playerUniversalClassName; -- Player only, gathered upon PLAYER_LOGIN |
local playerUniversalRaceName; -- Player only, gathered upon PLAYER_LOGIN |
local petFamily; |
local GetEnglishSpecialisationName = function(specID, ...) -- Any class/spec |
-- Arguments (1 to 2): |
-- specID (number) *mandatory - Specialisation ID for which we want to get the English Name. |
-- universalClassName (string) *optional - Class where the specialisation should be found; |
-- Defaults to the current Player's class. |
-- Returns (2): |
-- engSpecName (string): English name for the given Specialisation; Nil if the spec wasn't |
-- found. |
-- uniClassName (string): Non-localised name of the Class the spec belongs to (given as arg2 |
-- or otherwise discovered if the given class was wrong or nil). Nil if the spec wasn't |
-- found. |
-- |
-- Look first in the provided universal class name (or the player class if argument is missing) |
local lookupFirstInClass = ... or playerUniversalClassName; |
for engSpecName, DBspecID in pairs(LibSN2SIDP.DB[lookupFirstInClass].METADATA.Specs) do |
if DBspecID == specID then |
return engSpecName, lookupFirstInClass; |
end |
end |
-- Look up the specialisation ID in all other classes |
local generalTabName = (GetSpellTabInfo(1)); |
local uniClassName = (next(LibSN2SIDP.DB, nil)); |
while uniClassName do |
if (uniClassName ~= generalTabName) and (uniClassName ~= lookupFirstInClass) then |
for engSpecName, DBspecID in pairs(LibSN2SIDP.DB[uniClassName].METADATA.Specs) do |
-- print(uniClassName); |
if DBspecID == specID then |
return engSpecName, uniClassName; |
end |
end |
end |
uniClassName = (next(LibSN2SIDP.DB, uniClassName)); |
end |
-- Could not find the given specID in the database |
return nil, nil; |
end |
local GetActiveEnglishSpecialisationName = function() -- Player only |
-- Returns(3): |
-- engSpecName (string) - English name for the active Player Specialisation; Nil if no spec |
-- is active (e.g. if character level < 10). |
-- uniClassName (string) - Non-localised name of the Player Class. Nil if no active spec. |
-- activeSpecID (number) - Specialisation ID for the active spec. Nil if no active spec. |
-- |
local activeSpecIndex = (GetSpecialization()); |
-- print(tostring(activeSpecIndex)); |
if activeSpecIndex then |
local activeSpecID = (GetSpecializationInfo(activeSpecIndex)); |
-- print(tostring(activeSpecID)); |
return GetEnglishSpecialisationName(activeSpecID, playerUniversalClassName), activeSpecID; |
else |
return nil, nil, nil; -- Player does not have an active specialisation |
end |
end |
local LookupOrder_table = {}; -- Any class/spec |
-- Order to lookup spells in the DB: |
-- 1st: Player's class: |
-- 1.1. Active spec baseline spells; |
-- 1.2. Active spec Talents' spells; |
-- 1.3. Active spec PvP Talents' spells; |
-- 1.4. Flyouts (if there are spells for); |
-- 1.5. Pets (if there are spells for); |
-- 1.5.1. Current pet specialization (if there is one) spells; NOT properly working, pet family |
-- 1.5.2. Current pet fmaily (if there is one) spells; gets bumped up above pet specicalization |
-- 1.6. Other specs' baseline spells; |
-- 1.7. Other specs' Talents' spells; |
-- 1.8. Other specs' PvP Talents' spells; |
-- 2nd: GeneralTab; |
-- 3rd: Other classes: |
-- 3.1. Each spec baseline spells; |
-- 3.2. Each spec Talents' spells; |
-- 3.3. Each spec PvP Talents' spells; |
-- 3.4. Flyouts (if there are spells for); |
-- 3.5. Pets (if there are spells for). |
local setCurrentPetFirstInLookupOrder = function() |
local classKey = playerUniversalClassName; |
if LookupOrder_table[classKey].Pets then |
wipe(LookupOrder_table[classKey].Pets); |
else |
local index = (LibSN2SIDP.DB[classKey].Flyouts and 5) or 4; |
tinsert(LookupOrder_table[classKey], index, "Pets"); |
LookupOrder_table[classKey].Pets = {}; |
end |
local petSpecName; |
if classKey == "HUNTER" then |
local petSpecIndex = (GetSpecialization(false, true)); |
petSpecName = (petSpecIndex == 1 and "Ferocity") or (petSpecIndex == 2 and |
"Tenacity") or (petSpecIndex == 3 and "Cunning") or nil; |
-- print(tostring(petSpecIndex).. " : ".. tostring(petSpecName)); |
end |
local petKey = (next(LibSN2SIDP.DB[classKey].Pets, nil)); |
while petKey do |
if petSpecName and petKey == petSpecName then |
tinsert(LookupOrder_table[classKey].Pets, 1, petKey); |
elseif petFamily and petKey == petFamily then |
local index = (petSpecName and LookupOrder_table[classKey].Pets[petSpecName] and 2) or 1; |
tinsert(LookupOrder_table[classKey].Pets, index, petKey); |
else |
tinsert(LookupOrder_table[classKey].Pets, petKey); |
end |
petKey = (next(LibSN2SIDP.DB[classKey].Pets, petKey)); |
end |
-- for iii = 1, #(LookupOrder_table[classKey].Pets) do |
-- local subTableKey = LookupOrder_table[classKey].Pets[iii]; |
-- print(AddonName.. ": ".. iii.. ". ".. tostring(subTableKey)); |
-- end |
end |
local SetLookupOrder = function() |
-- LookupOrder_table = {}; -- Reset the table |
wipe(LookupOrder_table); -- Reset the table |
local classOrderIndex = 1; |
local classKey = (next(LibSN2SIDP.DB, nil)); |
-- print(tostring(classKey)); |
while classKey do |
if classKey == playerUniversalClassName then -- Current player class |
tinsert(LookupOrder_table, 1, classKey); |
LookupOrder_table[classKey] = {}; |
-- print(tostring(LookupOrder_table[1])); |
-- Order specs et al |
local playerActiveEnglishSpecName = (GetActiveEnglishSpecialisationName()); |
-- print("Active SpecName = ".. tostring(playerActiveEnglishSpecName)); |
local specKey = (next(LibSN2SIDP.DB[classKey].METADATA.Specs, nil)); |
while specKey do |
if specKey == playerActiveEnglishSpecName then |
tinsert(LookupOrder_table[classKey], 1, specKey); |
tinsert(LookupOrder_table[classKey], 2, specKey.."_Talents"); |
tinsert(LookupOrder_table[classKey], 3, specKey.."_PVPTalents"); |
-- print(tostring(LookupOrder_table[classKey][1]).. " *"); |
-- else |
-- elseif LibSN2SIDP.DB[classKey].METADATA.Specs[specKey] then |
else |
tinsert(LookupOrder_table[classKey], specKey); |
tinsert(LookupOrder_table[classKey], specKey.."_Talents"); |
tinsert(LookupOrder_table[classKey], specKey.."_PVPTalents"); |
-- print(tostring(LookupOrder_table[classKey][(specOrderIndex == 1) and specOrderIndex or (specOrderIndex +specOrderIndex -1)])); |
end |
specKey = (next(LibSN2SIDP.DB[classKey].METADATA.Specs, specKey)); |
-- specOrderIndex = specOrderIndex + 1; |
end |
if LibSN2SIDP.DB[classKey].Flyouts then |
tinsert(LookupOrder_table[classKey], 4, "Flyouts"); |
LookupOrder_table[classKey].Flyouts = {}; |
local flyoutButtonKey = (next(LibSN2SIDP.DB[classKey].Flyouts, nil)); |
while flyoutButtonKey do |
tinsert(LookupOrder_table[classKey].Flyouts, flyoutButtonKey); |
flyoutButtonKey = (next(LibSN2SIDP.DB[classKey].Flyouts, flyoutButtonKey)); |
end |
end |
if LibSN2SIDP.DB[classKey].Pets then |
setCurrentPetFirstInLookupOrder(); |
end |
elseif classKey ~= "General" then -- Other classes |
tinsert(LookupOrder_table, classKey); |
-- print(tostring(LookupOrder_table[classOrderIndex])); |
LookupOrder_table[classKey] = {}; |
local specKey = (next(LibSN2SIDP.DB[classKey].METADATA.Specs, nil)); |
while specKey do |
-- local numSpecSubTables = 3; -- Unless we also have Flyouts, making it 4 or more |
tinsert(LookupOrder_table[classKey], specKey); |
tinsert(LookupOrder_table[classKey], specKey.."_Talents"); |
tinsert(LookupOrder_table[classKey], specKey.."_PVPTalents"); |
specKey = (next(LibSN2SIDP.DB[classKey].METADATA.Specs, specKey)); |
end |
if LibSN2SIDP.DB[classKey].Flyouts then |
tinsert(LookupOrder_table[classKey], "Flyouts"); |
LookupOrder_table[classKey].Flyouts = {}; |
local flyoutButtonKey = (next(LibSN2SIDP.DB[classKey].Flyouts, nil)); |
while flyoutButtonKey do |
-- print(AddonName.. ": ".. tostring(flyoutButtonKey)); |
tinsert(LookupOrder_table[classKey].Flyouts, flyoutButtonKey); |
flyoutButtonKey = (next(LibSN2SIDP.DB[classKey].Flyouts, flyoutButtonKey)); |
end |
end |
if LibSN2SIDP.DB[classKey].Pets then |
tinsert(LookupOrder_table[classKey], "Pets"); |
LookupOrder_table[classKey].Pets = {}; |
local petKey = (next(LibSN2SIDP.DB[classKey].Pets, nil)); |
while petKey do |
tinsert(LookupOrder_table[classKey].Pets, petKey); |
petKey = (next(LibSN2SIDP.DB[classKey].Pets, petKey)); |
end |
end |
end |
classKey = (next(LibSN2SIDP.DB, classKey)); |
classOrderIndex = classOrderIndex + 1; |
end |
tinsert(LookupOrder_table, 2, "General"); |
-- tinsert(LookupOrder_table, "General"); |
LookupOrder_table["General"] = {}; |
local categoryKey = (next(LibSN2SIDP.DB.General, nil)); |
while categoryKey do |
if categoryKey == "Racials" then |
tinsert(LookupOrder_table.General, "Racials"); |
LookupOrder_table.General.Racials = {}; |
local racialKey = (next(LibSN2SIDP.DB.General.Racials, nil)); |
while racialKey do |
if racialKey == playerUniversalRaceName then |
tinsert(LookupOrder_table.General.Racials, 1, racialKey); |
else |
tinsert(LookupOrder_table.General.Racials, racialKey); |
end |
racialKey = (next(LibSN2SIDP.DB.General.Racials, racialKey)); |
end |
-- elseif categoryKey ~= "METADATA" then -- Currentlu not on the database |
-- tinsert(LookupOrder_table.General, categoryKey); |
end |
categoryKey = (next(LibSN2SIDP.DB.General, categoryKey)); |
end |
end |
-- Get Player's character data when it's available |
local libFrame = CreateFrame("Frame"); |
libFrame:RegisterEvent("PLAYER_LOGIN"); |
local lookupOrderTableInitialized = false; |
libFrame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED"); -- This talent and/or the one in the line bellow |
libFrame:RegisterEvent("PLAYER_TALENT_UPDATE"); -- should fire when the player switches spec. |
libFrame:RegisterUnitEvent("UNIT_PET", "player"); -- Fired when a unit's pet changes. |
libFrame:RegisterEvent("PET_SPECIALIZATION_CHANGED"); -- Fired upon pet's specialisation changes. |
libFrame:SetScript("OnEvent", function(self, event) |
if event == "PLAYER_LOGIN" or event == "PLAYER_ENTERING_WORLD" then |
local stubVal; |
stubVal, playerUniversalClassName = UnitClass("player"); |
stubVal, playerUniversalRaceName = UnitRace("player"); |
if UnitExists("pet") then -- Get current Pet data to build the corresponding lookup table |
petFamily = UnitCreatureFamily("pet"); |
end |
SetLookupOrder(); |
lookupOrderTableInitialized = true; |
elseif lookupOrderTableInitialized then |
if event == "UNIT_PET" or event == "PET_SPECIALIZATION_CHANGED" then |
if not playerUniversalClassName or not LookupOrder_table[playerUniversalClassName] then |
return; -- Build lookup table for Pet only after we built the lookup table for Class |
end |
petFamily = UnitCreatureFamily("pet"); |
if not petFamily then -- UNIT_PET fires several times when a pet is lost and when a |
return; -- new one is called; we'll get the new pet info eventually but |
end -- wait til it's up. |
setCurrentPetFirstInLookupOrder(); |
else |
SetLookupOrder(); |
end |
end |
-- for i = 1, #LookupOrder_table do |
-- local classKey = LookupOrder_table[i]; |
-- print(AddonName.. ": ".. i.. ". ".. tostring(classKey)); |
-- for ii = 1, #(LookupOrder_table[classKey]) do |
-- local specKey = LookupOrder_table[classKey][ii]; |
-- print(AddonName.. ": ".. i.. ".".. ii.. ". ".. tostring(specKey)); |
-- if type(LookupOrder_table[classKey][specKey]) == "table" then |
-- for iii = 1, #(LookupOrder_table[classKey][specKey]) do |
-- local subTableKey = LookupOrder_table[classKey][specKey][iii]; |
-- print(AddonName.. ": ".. i.. ".".. ii.. ".".. iii.. ". ".. tostring(subTableKey)); |
-- end |
-- end |
-- end |
-- end |
end); |
-- API -- |
--------- |
-- Return SpellID of the English Spell Name |
LibSN2SIDP.SID = setmetatable( |
{}, -- We do start with an empty table, passed as 'tbl' to '__index' bellow. |
{ __index = function(tbl, engSpellName) -- If spell name not found in 'tbl'. |
local paramType = type(engSpellName); |
-- print(AddonName.. ": ".. engSpellName.. " is a ".. paramType); |
if (paramType == "string") then |
for classIndex = 1, #LookupOrder_table do |
local classKey = LookupOrder_table[classIndex]; |
-- print(AddonName.. ": ".. tostring(classKey)); |
for specIndex = 1, #(LookupOrder_table[classKey]) do |
local specKey = LookupOrder_table[classKey][specIndex]; |
local spID = LibSN2SIDP.DB[classKey][specKey][engSpellName] or nil; |
if spID then |
return spID; -- FOUND IT! |
end |
-- if specKey == "Flyouts" or specKey == "Pets" then |
if LookupOrder_table[classKey][specKey] ~= nil and type(LookupOrder_table[classKey][specKey]) == "table" then |
local subTableKey = (next(LibSN2SIDP.DB[classKey][specKey], nil)); |
while subTableKey do |
-- print(tostring(classKey).. " ".. tostring(specKey).. " ".. tostring(subTableKey)); |
local spID = LibSN2SIDP.DB[classKey][specKey][subTableKey][engSpellName] or nil; |
if spID then |
return spID; -- FOUND IT! |
end |
subTableKey = (next(LibSN2SIDP.DB[classKey][specKey], subTableKey)); |
end |
end |
end |
end |
-- Didn't find the given spell name in our database. So try and get it from game API |
local locSpellName, _, _, _, _, _, spID = GetSpellInfo(engSpellName); |
return spID; |
elseif (paramType == "number") then |
local locSpellName = (GetSpellInfo(engSpellName)); |
-- print(tostring(locSpellName)); |
if locSpellName then |
return engSpellName; |
else |
return nil; |
end |
else |
-- TODO: error() ? |
return nil; |
end |
end |
} |
); |
-- For backwards compatibility (LibSpellName2SIDPassives_MINOR < 10008) |
LibSN2SIDP.ID = LibSN2SIDP.SID; |
-- Return Localised Name of the English Spell Name |
LibSN2SIDP.LSN = setmetatable( |
{}, -- We do start with an empty table, passed as 'tbl' to '__index' bellow. |
{ __index = function(tbl, engSpellName) |
-- print("LSN __index"); |
local paramType = type(engSpellName); |
-- print(AddonName.. ": ".. engSpellName.. " is a ".. paramType); |
if paramType == "string" then |
for classIndex = 1, #LookupOrder_table do |
local classKey = LookupOrder_table[classIndex]; |
-- print(AddonName.. ": ".. tostring(classKey)); |
for specIndex = 1, #(LookupOrder_table[classKey]) do |
local specKey = LookupOrder_table[classKey][specIndex]; |
-- print(AddonName.. ": ".. tostring(specKey)); |
local spID = LibSN2SIDP.DB[classKey][specKey][engSpellName] or nil; |
if spID then |
-- print("Found in ".. classKey.. ": ".. specKey); |
local locSpellName = (GetSpellInfo(spID)); -- Localised spell name |
return locSpellName; -- FOUND IT! |
end |
-- if specKey == "Flyouts" or specKey == "Pets" then |
if LookupOrder_table[classKey][specKey] ~= nil and type(LookupOrder_table[classKey][specKey]) == "table" then |
local subTableKey = (next(LibSN2SIDP.DB[classKey][specKey], nil)); |
while subTableKey do |
-- print(tostring(classKey).. " ".. tostring(specKey).. " ".. tostring(subTableKey)); |
local spID = LibSN2SIDP.DB[classKey][specKey][subTableKey][engSpellName] or nil; |
if spID then |
local locSpellName = (GetSpellInfo(spID)); -- Localised spell name |
return locSpellName; -- FOUND IT! |
end |
subTableKey = (next(LibSN2SIDP.DB[classKey][specKey], subTableKey)); |
end |
end |
end |
end |
-- Didn't find the given spell name in our database. So try and get it from game API |
local locSpellName, _, _, _, _, _, spID = GetSpellInfo(engSpellName); |
return locSpellName; |
elseif paramType == "number" then |
local locSpellName = (GetSpellInfo(engSpellName)); |
-- print(locSpellName); |
return locSpellName; |
else |
-- TODO: error() ? |
return nil; |
end |
end |
} |
); |
-- Get the number of spells in the database |
-- TODO: Redo for new DB structure in 10008+ ! |
function LibSN2SIDP:GetNumSpells() |
-- local count = 0; |
-- for _ in pairs(LibSN2SIDP.DB) do |
-- count = count + 1; |
-- end |
-- return count; |
end |
-- REMOVED. This was in twobits' original version (10000), when it was still |
-- only used in ReadySpells. With my release of LibSpellName2SID as a freely |
-- accessible library, the implications of calling this function are not clear |
-- to me. Therefore, at least for now, this function will be made unaccessible. |
-- Clean up (free the RAM) if the data isn't needed anymore |
-- NB: 'Clean up ONLY IF we're (embeded) ...' feature added by aallkkaa |
function LibSN2SIDP:Cleanup() |
--[[ |
-- Clean up ONLY IF we're (embeded) within the scope of another addon, |
-- not if we're a Global library, which may be in use by several addons. |
-- print("LibSN2SIDP.owner = ".. LibSN2SIDP.owner); |
-- print("LibSN2SIDP: AddonName = ".. AddonName); |
if LibSN2SIDP.owner ~= "LibSpellName2SIDPassives-1.0" then |
LibSN2SIDP.DB = {}; |
-- print(AddonName.. ": LibSN2SIDP.DB NOW has ".. LibSN2SIDP.GetNumSpells().. " keys."); |
return true; |
else |
-- print(AddonName.. ": LibSN2SIDP.DB STILL has ".. LibSN2SIDP.GetNumSpells().. " keys."); |
-- TODO: error(); |
return false; |
end |
]]-- |
end |
------------------------------------------ |
-- print(AddonName.. ": LibSN2SIDP.DB has ".. LibSN2SIDP.GetNumSpells().. " keys."); |
## Interface: 80000 |
## Title: Lib: SpellName2SID-1.0-Passives |
## Notes: Table of English Spell Names and corresponding Spell IDs|nPassive spells database variant |
## Version: 1.0.12 |
## LoadOnDemand: 1 |
## Author: aallkkaa |
## X-Original-Author: twobits |
## X-Credits: benots4 |
## X-Category: Library |
# X-WoWI-ID: 24509 |
LibStub\LibStub.lua |
LibSpellName2SID-1.0-Passives\LibSpellName2SID-1.0-Passives.lua |
#test.lua |
-- $Id: LibStub.lua 103 2014-10-16 03:02:50Z mikk $ |
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/addons/libstub/ for more info |
-- LibStub is hereby placed in the Public Domain |
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke |
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! |
local LibStub = _G[LIBSTUB_MAJOR] |
-- Check to see is this version of the stub is obsolete |
if not LibStub or LibStub.minor < LIBSTUB_MINOR then |
LibStub = LibStub or {libs = {}, minors = {} } |
_G[LIBSTUB_MAJOR] = LibStub |
LibStub.minor = LIBSTUB_MINOR |
-- LibStub:NewLibrary(major, minor) |
-- major (string) - the major version of the library |
-- minor (string or number ) - the minor version of the library |
-- |
-- returns nil if a newer or same version of the lib is already present |
-- returns empty library object or old library object if upgrade is needed |
function LibStub:NewLibrary(major, minor) |
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") |
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") |
local oldminor = self.minors[major] |
if oldminor and oldminor >= minor then return nil end |
self.minors[major], self.libs[major] = minor, self.libs[major] or {} |
return self.libs[major], oldminor |
end |
-- LibStub:GetLibrary(major, [silent]) |
-- major (string) - the major version of the library |
-- silent (boolean) - if true, library is optional, silently return nil if its not found |
-- |
-- throws an error if the library can not be found (except silent is set) |
-- returns the library object if found |
function LibStub:GetLibrary(major, silent) |
if not self.libs[major] and not silent then |
error(("Cannot find a library instance of %q."):format(tostring(major)), 2) |
end |
return self.libs[major], self.minors[major] |
end |
-- LibStub:IterateLibraries() |
-- |
-- Returns an iterator for the currently registered libraries |
function LibStub:IterateLibraries() |
return pairs(self.libs) |
end |
setmetatable(LibStub, { __call = LibStub.GetLibrary }) |
end |
## Interface: 70000 |
## Title: Lib: LibStub |
## Notes: Universal Library Stub |
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel |
## X-Website: http://www.wowace.com/addons/libstub/ |
## X-Category: Library |
## X-License: Public Domain |
## X-Curse-Packaged-Version: 1.0.2-70000 |
## X-Curse-Project-Name: LibStub |
## X-Curse-Project-ID: libstub |
## X-Curse-Repository-ID: wow/libstub/mainline |
LibStub.lua |
-- $Id: LibStub.lua 103 2014-10-16 03:02:50Z mikk $ |
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/addons/libstub/ for more info |
-- LibStub is hereby placed in the Public Domain |
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke |
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! |
local LibStub = _G[LIBSTUB_MAJOR] |
-- Check to see is this version of the stub is obsolete |
if not LibStub or LibStub.minor < LIBSTUB_MINOR then |
LibStub = LibStub or {libs = {}, minors = {} } |
_G[LIBSTUB_MAJOR] = LibStub |
LibStub.minor = LIBSTUB_MINOR |
-- LibStub:NewLibrary(major, minor) |
-- major (string) - the major version of the library |
-- minor (string or number ) - the minor version of the library |
-- |
-- returns nil if a newer or same version of the lib is already present |
-- returns empty library object or old library object if upgrade is needed |
function LibStub:NewLibrary(major, minor) |
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") |
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") |
local oldminor = self.minors[major] |
if oldminor and oldminor >= minor then return nil end |
self.minors[major], self.libs[major] = minor, self.libs[major] or {} |
return self.libs[major], oldminor |
end |
-- LibStub:GetLibrary(major, [silent]) |
-- major (string) - the major version of the library |
-- silent (boolean) - if true, library is optional, silently return nil if its not found |
-- |
-- throws an error if the library can not be found (except silent is set) |
-- returns the library object if found |
function LibStub:GetLibrary(major, silent) |
if not self.libs[major] and not silent then |
error(("Cannot find a library instance of %q."):format(tostring(major)), 2) |
end |
return self.libs[major], self.minors[major] |
end |
-- LibStub:IterateLibraries() |
-- |
-- Returns an iterator for the currently registered libraries |
function LibStub:IterateLibraries() |
return pairs(self.libs) |
end |
setmetatable(LibStub, { __call = LibStub.GetLibrary }) |
end |
## Interface: 70000 |
## Title: Lib: LibStub |
## Notes: Universal Library Stub |
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel |
## X-Website: http://www.wowace.com/addons/libstub/ |
## X-Category: Library |
## X-License: Public Domain |
## X-Curse-Packaged-Version: 1.0.2-70000 |
## X-Curse-Project-Name: LibStub |
## X-Curse-Project-ID: libstub |
## X-Curse-Repository-ID: wow/libstub/mainline |
LibStub.lua |
--------------------- |
-- LibspellName2SID (deprecated) / LibSpellName2SID |
-- V.10000: 2009, originally by Twobits[1], as part of ReadySpells[2] |
-- 2010, edited by benots4[3] |
-- 2017, published as an addon of its own by aallkkaa[4] |
-- V.10001 - 10012: 2017-2018 WoW-7.3.x up to date version by aallkkaa [4] |
-- |
-- [1] https://www.wowinterface.com/forums/member.php?userid=139157 |
-- https://www.curseforge.com/members/twobits |
-- [2] https://www.curseforge.com/wow/addons/readyspells (Twobits' 3.x version: |
-- 2009) |
-- [3] https://www.wowinterface.com/forums/member.php?action=getinfo&userid=201937 |
-- [4] https://www.wowinterface.com/forums/member.php?u=335646 |
--------------------- |
-- API: |
-- LibSpellName2SID.ID["EnglishSpellName"] -- Spell ID of English Spell Name |
-- LibSpellName2SID.LSN["EnglishSpellName"] -- Localized Spell Name |
-- LibSpellName2SID:GetNumSpells() -- Get the number of spells in the database - TEMPORARILY OUT |
-- LibSpellName2SID:Cleanup() -- Clean up the database (remove from RAM) - DEPRECATED |
--------------------- |
-- Initialisation -- |
-------------------- |
AddonName, AddonEnv = ...; |
-- TODO: We hardcoded spells such as "Teleport: Shattrath" as "Teleport: Shattrath(Alliance)" and |
-- "Teleport: Shattrath(Horde)". SID and LSN must instead of just look for the default name in our |
-- DB, look for any whatsoever one that starts the same (strfind(string, "Teleport: Place") and |
-- strfind("«string, "Portal: Place") might do the trick). |
-- Library's version values -- |
local LibSpellName2SID_MAJOR = "LibSpellName2SID"; |
local LibSpellName2SID_MINOR = 10012; |
-- print(LibSpellName2SID_MAJOR.. "-".. LibSpellName2SID_MINOR.. ": AddonName = ".. AddonName); |
-- DataSource -- |
-- gameBuild = 27178 |
-- clientLocale = enUS |
-- Register with LibStub -- |
assert(LibStub, LibSpellName2SID_MAJOR.. "-".. LibSpellName2SID_MINOR.." requires LibStub."); |
local LibSN2SID = LibStub:NewLibrary(LibSpellName2SID_MAJOR, LibSpellName2SID_MINOR); |
if not LibSN2SID then -- Same version or newer already loaded; |
return; -- I.e. nothing else to do. |
end |
-- Set the library database contents -- |
--------------------------------------- |
LibSN2SID.owner = AddonName; |
LibSN2SID.minor = LibSpellName2SID_MINOR; |
if LibSN2SID.DB then -- Clear old version's contents, if applicable |
wipe(LibSN2SID.DB); |
end |
LibSN2SID.DB = { |
["General"] = { |
["Others"] = { |
["Shoot"] = 5019, |
["Revive Battle Pets"] = 125439, |
["Auto Shot"] = 75, |
["Honorable Medallion"] = 195710, |
["Auto Attack"] = 6603, |
}, |
["Racials"] = { |
["Draenei"] = { |
["Gift of the Naaru"] = 59547, |
}, |
["NightElf"] = { |
["Shadowmeld"] = 58984, |
}, |
["Scourge"] = { |
["Cannibalize"] = 20577, |
["Will of the Forsaken"] = 7744, |
}, |
["Orc"] = { |
["Blood Fury"] = 20572, |
}, |
["Gnome"] = { |
["Escape Artist"] = 20589, |
}, |
["Troll"] = { |
["Berserking"] = 26297, |
}, |
["BloodElf"] = { |
["Arcane Torrent"] = 129597, |
}, |
["Worgen"] = { |
["Running Wild"] = 87840, |
["Darkflight"] = 68992, |
["Two Forms"] = 68996, |
}, |
["Tauren"] = { |
["War Stomp"] = 20549, |
}, |
["Dwarf"] = { |
["Stoneform"] = 20594, |
}, |
["Human"] = { |
["Every Man for Himself"] = 59752, |
}, |
["Pandaren"] = { |
["Quaking Palm"] = 107079, |
}, |
["Goblin"] = { |
["Rocket Barrage"] = 69041, |
["Rocket Jump"] = 69070, |
["Pack Hobgoblin"] = 69046, |
}, |
["VoidElf"] = { |
["Spatial Rift"] = 256948, |
}, |
["Nightborne"] = { |
["Arcane Pulse"] = 260364, |
["Cantrips"] = 255661, |
}, |
["HighmountainTauren"] = { |
["Bull Rush"] = 255654, |
}, |
["LightforgedDraenei"] = { |
["Forge of Light"] = 259930, |
}, |
["DarkIronDwarf"] = { |
["Fireblood"] = 265221, |
["Mole Machine"] = 265225, |
}, |
["MagharOrc"] = { |
["Ancestral Call"] = 274738, |
}, |
}, |
["ZoneAbilities"] = { |
["Summon Mechashredder 5000"] = 164050, |
["Telaari Talbuk"] = 165803, |
["Summon Lightforged Warframe"] = 250436, |
["Fel Heart Bond"] = 248011, |
["Frostwolf War Wolf"] = 164222, |
["Home Away from Home"] = 168487, |
["Call to Arms"] = 161676, |
["Shroud of Arcane Echoes"] = 248779, |
["Light's Judgment"] = 247427, |
["Garrison Ability"] = 161691, |
["Guardian Orb"] = 161767, |
["Vindicaar Matrix Crystal"] = 251463, |
["Artillery Strike"] = 162075, |
["Smuggling Run!"] = 170108, |
["Telaari Siege Engine"] = 160240, |
["Champion's Honor"] = 164221, |
}, |
["GuildPerks"] = { |
["Mobile Banking"] = 83958, |
}, |
}, |
["DEATHKNIGHT"] = { |
["Frost_Talents"] = { |
["Wraith Walk"] = 212552, |
["Blinding Sleet"] = 207167, |
["Frostscythe"] = 207230, |
["Death Pact"] = 48743, |
["Horn of Winter"] = 57330, |
["Asphyxiate"] = 108194, |
["Breath of Sindragosa"] = 152279, |
["Frostwyrm's Fury"] = 279302, |
["Glacial Advance"] = 194913, |
}, |
["Unholy"] = { |
["Scourge Strike"] = 55090, |
["Death and Decay"] = 43265, |
["Death Coil"] = 47541, |
["Control Undead"] = 111673, |
["Runeforging"] = 53428, |
["Festering Strike"] = 85948, |
["Chains of Ice"] = 45524, |
["Army of the Dead"] = 42650, |
["Death Strike"] = 49998, |
["Raise Ally"] = 61999, |
["Dark Transformation"] = 63560, |
["Death Gate"] = 50977, |
["Outbreak"] = 77575, |
["Icebound Fortitude"] = 48792, |
["Anti-Magic Shell"] = 48707, |
["Raise Dead"] = 46584, |
["Mind Freeze"] = 47528, |
["Path of Frost"] = 3714, |
["Death Grip"] = 49576, |
["Death's Advance"] = 48265, |
["Dark Command"] = 56222, |
["Apocalypse"] = 275699, |
}, |
["Blood"] = { |
["Death and Decay"] = 43265, |
["Control Undead"] = 111673, |
["Runeforging"] = 53428, |
["Marrowrend"] = 195182, |
["Dancing Rune Weapon"] = 49028, |
["Gorefiend's Grasp"] = 108199, |
["Icebound Fortitude"] = 48792, |
["Heart Strike"] = 206930, |
["Death Strike"] = 49998, |
["Raise Ally"] = 61999, |
["Death Gate"] = 50977, |
["Death's Advance"] = 48265, |
["Blood Boil"] = 50842, |
["Death's Caress"] = 195292, |
["Anti-Magic Shell"] = 48707, |
["Mind Freeze"] = 47528, |
["Path of Frost"] = 3714, |
["Asphyxiate"] = 221562, |
["Vampiric Blood"] = 55233, |
["Death Grip"] = 49576, |
["Dark Command"] = 56222, |
}, |
["Pets"] = { |
["Ghoul"] = { |
["Monstrous Blow"] = 91797, |
["Leap"] = 47482, |
["Shambling Rush"] = 91802, |
["Putrid Bulwark"] = 91837, |
["Gnaw"] = 47481, |
["Claw"] = 47468, |
["Huddle"] = 47484, |
["Sweeping Claws"] = 91778, |
}, |
}, |
["Frost"] = { |
["Pillar of Frost"] = 51271, |
["Control Undead"] = 111673, |
["Runeforging"] = 53428, |
["Chains of Ice"] = 45524, |
["Death Strike"] = 49998, |
["Raise Ally"] = 61999, |
["Howling Blast"] = 49184, |
["Death's Advance"] = 48265, |
["Death Gate"] = 50977, |
["Remorseless Winter"] = 196770, |
["Obliterate"] = 49020, |
["Anti-Magic Shell"] = 48707, |
["Frost Strike"] = 49143, |
["Mind Freeze"] = 47528, |
["Path of Frost"] = 3714, |
["Icebound Fortitude"] = 48792, |
["Empower Rune Weapon"] = 47568, |
["Death Grip"] = 49576, |
["Dark Command"] = 56222, |
}, |
["Blood_Talents"] = { |
["Tombstone"] = 219809, |
["Wraith Walk"] = 212552, |
["Rune Tap"] = 194679, |
["Blooddrinker"] = 206931, |
["Bonestorm"] = 194844, |
["Rune Strike"] = 210764, |
["Consumption"] = 274156, |
["Mark of Blood"] = 206940, |
}, |
["Unholy_PVPTalents"] = { |
["Necrotic Strike"] = 223829, |
["Gladiator's Medallion"] = 208683, |
["Anti-Magic Zone"] = 51052, |
["Reanimation"] = 210128, |
["Dark Simulacrum"] = 77606, |
}, |
["Unholy_Talents"] = { |
["Summon Gargoyle"] = 49206, |
["Wraith Walk"] = 212552, |
["Clawing Shadows"] = 207311, |
["Epidemic"] = 207317, |
["Death Pact"] = 48743, |
["Unholy Blight"] = 115989, |
["Asphyxiate"] = 108194, |
["Unholy Frenzy"] = 207289, |
["Soul Reaper"] = 130736, |
["Defile"] = 152280, |
}, |
["Frost_PVPTalents"] = { |
["Necrotic Strike"] = 223829, |
["Gladiator's Medallion"] = 208683, |
["Anti-Magic Zone"] = 51052, |
["Reanimation"] = 210128, |
["Dark Simulacrum"] = 77606, |
}, |
["Blood_PVPTalents"] = { |
["Necrotic Strike"] = 223829, |
["Gladiator's Medallion"] = 208683, |
["Anti-Magic Zone"] = 51052, |
["Reanimation"] = 210128, |
["Dark Simulacrum"] = 77606, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Unholy"] = 252, |
["Frost"] = 251, |
["Blood"] = 250, |
}, |
}, |
}, |
["DEMONHUNTER"] = { |
["Havoc_Talents"] = { |
["Nemesis"] = 206491, |
["Dark Slash"] = 258860, |
["Netherwalk"] = 196555, |
["Fel Eruption"] = 211881, |
["Felblade"] = 232893, |
["Fel Barrage"] = 258925, |
["Immolation Aura"] = 258920, |
}, |
["Vengeance_Talents"] = { |
["Fracture"] = 263642, |
["Sigil of Chains"] = 202138, |
["Fel Devastation"] = 212084, |
["Felblade"] = 232893, |
["Soul Barrier"] = 263648, |
["Spirit Bomb"] = 247454, |
}, |
["Havoc"] = { |
["Blur"] = 198589, |
["Chaos Nova"] = 179057, |
["Torment"] = 281854, |
["Metamorphosis"] = 191427, |
["Demon's Bite"] = 162243, |
["Darkness"] = 196718, |
["Eye Beam"] = 198013, |
["Chaos Strike"] = 162794, |
["Spectral Sight"] = 188501, |
["Fel Rush"] = 195072, |
["Disrupt"] = 183752, |
["Consume Magic"] = 278326, |
["Glide"] = 131347, |
["Throw Glaive"] = 185123, |
["Vengeful Retreat"] = 198793, |
["Blade Dance"] = 188499, |
["Imprison"] = 217832, |
}, |
["Vengeance"] = { |
["Soul Cleave"] = 162794, |
["Torment"] = 198589, |
["Fiery Brand"] = 179057, |
["Metamorphosis"] = 191427, |
["Shear"] = 203782, |
["Imprison"] = 217832, |
["Demon Spikes"] = 198793, |
["Spectral Sight"] = 188501, |
["Sigil of Misery"] = 207684, |
["Disrupt"] = 183752, |
["Consume Magic"] = 278326, |
["Glide"] = 131347, |
["Throw Glaive"] = 185123, |
["Sigil of Flame"] = 188499, |
["Infernal Strike"] = 195072, |
["Sigil of Silence"] = 202137, |
["Immolation Aura"] = 198013, |
}, |
["Vengeance_PVPTalents"] = { |
["Tormentor"] = 207029, |
["Gladiator's Medallion"] = 208683, |
["Illidan's Grasp"] = 205630, |
["Demonic Trample"] = 205629, |
["Reverse Magic"] = 205604, |
}, |
["Havoc_PVPTalents"] = { |
["Tormentor"] = 207029, |
["Gladiator's Medallion"] = 208683, |
["Illidan's Grasp"] = 205630, |
["Demonic Trample"] = 205629, |
["Reverse Magic"] = 205604, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Havoc"] = 577, |
["Vengeance"] = 581, |
}, |
}, |
}, |
["DRUID"] = { |
["Restoration_PVPTalents"] = { |
["Rip and Tear"] = 203242, |
["Gladiator's Medallion"] = 208683, |
["Enraged Maim"] = 236026, |
["Thorns"] = 236696, |
["Faerie Swarm"] = 209749, |
["Cyclone"] = 209753, |
}, |
["Feral_Talents"] = { |
["Mass Entanglement"] = 102359, |
["Brutal Slash"] = 202028, |
["Savage Roar"] = 52610, |
["Typhoon"] = 132469, |
["Feral Frenzy"] = 274837, |
["Mighty Bash"] = 5211, |
["Wild Charge"] = 102401, |
["Renewal"] = 108238, |
["Tiger Dash"] = 252216, |
["Incarnation: King of the Jungle"] = 102543, |
}, |
["Feral"] = { |
["Prowl"] = 5215, |
["Stampeding Roar"] = 106898, |
["Regrowth"] = 8936, |
["Ferocious Bite"] = 22568, |
["Skull Bash"] = 106839, |
["Entangling Roots"] = 339, |
["Growl"] = 6795, |
["Hibernate"] = 2637, |
["Mangle"] = 33917, |
["Remove Corruption"] = 2782, |
["Revive"] = 50769, |
["Swipe"] = 213764, |
["Survival Instincts"] = 61336, |
["Rebirth"] = 20484, |
["Rake"] = 1822, |
["Rip"] = 1079, |
["Tiger's Fury"] = 5217, |
["Maim"] = 22570, |
["Moonfire"] = 8921, |
["Soothe"] = 2908, |
["Shred"] = 5221, |
["Teleport: Moonglade"] = 18960, |
["Cat Form"] = 768, |
["Berserk"] = 106951, |
["Dash"] = 1850, |
["Bear Form"] = 5487, |
["Thrash"] = 106832, |
["Travel Form"] = 783, |
}, |
["Feral_PVPTalents"] = { |
["Rip and Tear"] = 203242, |
["Gladiator's Medallion"] = 208683, |
["Enraged Maim"] = 236026, |
["Thorns"] = 236696, |
["Faerie Swarm"] = 209749, |
["Cyclone"] = 209753, |
}, |
["Guardian_Talents"] = { |
["Mass Entanglement"] = 102359, |
["Bristling Fur"] = 155835, |
["Lunar Beam"] = 204066, |
["Pulverize"] = 80313, |
["Typhoon"] = 132469, |
["Intimidating Roar"] = 236748, |
["Mighty Bash"] = 5211, |
["Incarnation: Guardian of Ursoc"] = 102558, |
["Tiger Dash"] = 252216, |
["Wild Charge"] = 102401, |
}, |
["Balance_PVPTalents"] = { |
["Rip and Tear"] = 203242, |
["Gladiator's Medallion"] = 208683, |
["Enraged Maim"] = 236026, |
["Thorns"] = 236696, |
["Faerie Swarm"] = 209749, |
["Cyclone"] = 209753, |
}, |
["Balance"] = { |
["Prowl"] = 5215, |
["Lunar Strike"] = 194153, |
["Regrowth"] = 8936, |
["Growl"] = 6795, |
["Celestial Alignment"] = 194223, |
["Solar Wrath"] = 190984, |
["Sunfire"] = 93402, |
["Mangle"] = 33917, |
["Entangling Roots"] = 339, |
["Revive"] = 50769, |
["Hibernate"] = 2637, |
["Moonfire"] = 8921, |
["Moonkin Form"] = 24858, |
["Shred"] = 5221, |
["Starsurge"] = 78674, |
["Starfall"] = 191034, |
["Soothe"] = 2908, |
["Rebirth"] = 20484, |
["Barkskin"] = 22812, |
["Innervate"] = 29166, |
["Teleport: Moonglade"] = 18960, |
["Cat Form"] = 768, |
["Remove Corruption"] = 2782, |
["Dash"] = 1850, |
["Bear Form"] = 5487, |
["Solar Beam"] = 78675, |
["Travel Form"] = 783, |
}, |
["Guardian"] = { |
["Prowl"] = 5215, |
["Stampeding Roar"] = 106898, |
["Regrowth"] = 8936, |
["Skull Bash"] = 106839, |
["Entangling Roots"] = 339, |
["Mangle"] = 33917, |
["Hibernate"] = 2637, |
["Maul"] = 6807, |
["Frenzied Regeneration"] = 22842, |
["Revive"] = 50769, |
["Swipe"] = 213764, |
["Thrash"] = 106832, |
["Survival Instincts"] = 61336, |
["Shred"] = 5221, |
["Soothe"] = 2908, |
["Moonfire"] = 8921, |
["Remove Corruption"] = 2782, |
["Cat Form"] = 768, |
["Barkskin"] = 22812, |
["Rebirth"] = 20484, |
["Teleport: Moonglade"] = 18960, |
["Ironfur"] = 192081, |
["Growl"] = 6795, |
["Dash"] = 1850, |
["Bear Form"] = 5487, |
["Incapacitating Roar"] = 99, |
["Travel Form"] = 783, |
}, |
["Restoration_Talents"] = { |
["Mass Entanglement"] = 102359, |
["Flourish"] = 197721, |
["Typhoon"] = 132469, |
["Mighty Bash"] = 5211, |
["Wild Charge"] = 102401, |
["Renewal"] = 108238, |
["Incarnation: Tree of Life"] = 33891, |
["Cenarion Ward"] = 102351, |
["Tiger Dash"] = 252216, |
}, |
["Guardian_PVPTalents"] = { |
["Rip and Tear"] = 203242, |
["Gladiator's Medallion"] = 208683, |
["Enraged Maim"] = 236026, |
["Thorns"] = 236696, |
["Faerie Swarm"] = 209749, |
["Cyclone"] = 209753, |
}, |
["Balance_Talents"] = { |
["Force of Nature"] = 205636, |
["New Moon"] = 274281, |
["Stellar Flare"] = 202347, |
["Renewal"] = 108238, |
["Typhoon"] = 132469, |
["Warrior of Elune"] = 202425, |
["Mighty Bash"] = 5211, |
["Wild Charge"] = 102401, |
["Tiger Dash"] = 252216, |
["Fury of Elune"] = 202770, |
["Incarnation: Chosen of Elune"] = 102560, |
["Mass Entanglement"] = 102359, |
}, |
["Restoration"] = { |
["Prowl"] = 5215, |
["Solar Wrath"] = 5176, |
["Regrowth"] = 8936, |
["Tranquility"] = 740, |
["Wild Growth"] = 48438, |
["Ursol's Vortex"] = 102793, |
["Entangling Roots"] = 339, |
["Nature's Cure"] = 88423, |
["Innervate"] = 29166, |
["Ironbark"] = 102342, |
["Mangle"] = 33917, |
["Efflorescence"] = 145205, |
["Revive"] = 50769, |
["Hibernate"] = 2637, |
["Swiftmend"] = 18562, |
["Sunfire"] = 93402, |
["Shred"] = 5221, |
["Revitalize"] = 212040, |
["Moonfire"] = 8921, |
["Soothe"] = 2908, |
["Cat Form"] = 768, |
["Barkskin"] = 22812, |
["Rebirth"] = 20484, |
["Teleport: Moonglade"] = 18960, |
["Rejuvenation"] = 774, |
["Lifebloom"] = 33763, |
["Dash"] = 1850, |
["Bear Form"] = 5487, |
["Growl"] = 6795, |
["Travel Form"] = 783, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Feral"] = 103, |
["Balance"] = 102, |
["Guardian"] = 104, |
["Restoration"] = 105, |
}, |
}, |
}, |
["HUNTER"] = { |
["Beast Mastery_Talents"] = { |
["Spitting Cobra"] = 194407, |
["Barrage"] = 120360, |
["A Murder of Crows"] = 131894, |
["Camouflage"] = 199483, |
["Binding Shot"] = 109248, |
["Stampede"] = 201430, |
["Chimaera Shot"] = 53209, |
["Dire Beast"] = 120679, |
}, |
["Marksmanship_Talents"] = { |
["Piercing Shot"] = 198670, |
["Camouflage"] = 199483, |
["Serpent Sting"] = 271788, |
["Explosive Shot"] = 212431, |
["Double Tap"] = 260402, |
["Hunter's Mark"] = 257284, |
["Binding Shot"] = 109248, |
["A Murder of Crows"] = 131894, |
["Barrage"] = 120360, |
}, |
["Marksmanship"] = { |
["Pet Utility"] = 103, |
["Flare"] = 1543, |
["Rapid Fire"] = 257044, |
["Command Pet"] = 272651, |
["Feign Death"] = 5384, |
["Arcane Shot"] = 185358, |
["Aimed Shot"] = 19434, |
["Tar Trap"] = 187698, |
["Multi-Shot"] = 257620, |
["Aspect of the Turtle"] = 186265, |
["Disengage"] = 781, |
["Trueshot"] = 193526, |
["Counter Shot"] = 147362, |
["Misdirection"] = 34477, |
["Steady Shot"] = 56641, |
["Aspect of the Cheetah"] = 186257, |
["Exhilaration"] = 109304, |
["Freezing Trap"] = 187650, |
["Call Pet"] = 9, |
["Concussive Shot"] = 5116, |
["Bursting Shot"] = 186387, |
["Eagle Eye"] = 6197, |
}, |
["Flyouts"] = { |
["Call Pet"] = { |
["Call Pet 3"] = 83243, |
["Call Pet 4"] = 83244, |
["Call Pet 5"] = 83245, |
["Call Pet 2"] = 83242, |
["Call Pet 1"] = 883, |
}, |
["Pet Utility"] = { |
["Beast Lore"] = 1462, |
["Feed Pet"] = 6991, |
["Tame Beast"] = 1515, |
["Revive Pet"] = 982, |
["Dismiss Pet"] = 2641, |
}, |
}, |
["Pets"] = { |
["Ferocity"] = { |
["Bite"] = 17253, |
["Primal Rage"] = 264667, |
["Smack"] = 49966, |
["Claw"] = 16827, |
["Growl"] = 2649, |
}, |
["Worm"] = { |
["Burrow Attack"] = 93433, |
}, |
["Quilen"] = { |
["Stone Armor"] = 160049, |
["Eternal Guardian"] = 126393, |
}, |
["Basilisk"] = { |
["Stone Scales"] = 159733, |
}, |
["Silithid"] = { |
["Tendon Rip"] = 160065, |
}, |
["Nether Ray"] = { |
["Netherwinds"] = 160452, |
}, |
["Water Strider"] = { |
["Surface Trot"] = 126311, |
}, |
["Scorpid"] = { |
["Deadly Sting"] = 160060, |
}, |
["Bear"] = { |
["Rest"] = 94019, |
}, |
["Beetle"] = { |
["Harden Carapace"] = 90339, |
}, |
["Chimaera"] = { |
["Froststorm Breath"] = 92380, |
["Frost Breath"] = 54644, |
}, |
["Clefthoof"] = { |
["Thick Hide"] = 160057, |
}, |
["Tenacity"] = { |
["Bite"] = 17253, |
["Claw"] = 16827, |
["Smack"] = 49966, |
["Growl"] = 2649, |
}, |
["Moth"] = { |
["Dust of Life"] = 159956, |
}, |
["Devilsaur"] = { |
["Feast"] = 159953, |
["Monstrous Bite"] = 54680, |
}, |
["Fox"] = { |
["Play"] = 90347, |
["Agile Reflexes"] = 160011, |
}, |
["Monkey"] = { |
["Primal Agility"] = 160044, |
}, |
["Cat"] = { |
["Prowl"] = 24450, |
}, |
["Carrion Bird"] = { |
["Bloody Screech"] = 24423, |
}, |
["Riverbeast"] = { |
["Gruesome Bite"] = 160018, |
}, |
["Spider"] = { |
["Web Spray"] = 160067, |
}, |
["Cunning"] = { |
["Bite"] = 17253, |
["Claw"] = 16827, |
["Smack"] = 49966, |
["Growl"] = 2649, |
}, |
["Turtle"] = { |
["Shell Shield"] = 26064, |
}, |
["Crab"] = { |
["Harden Shell"] = 159926, |
}, |
["Core Hound"] = { |
["Ancient Hysteria"] = 90355, |
["Molten Hide"] = 159788, |
}, |
["Crane"] = { |
["Gift of Chi-Ji"] = 159931, |
["Trick"] = 126259, |
}, |
["Crocolisk"] = { |
["Ankle Crack"] = 50433, |
}, |
["Direhorn"] = { |
["Reflective Armor Plating"] = 137798, |
}, |
["Rodent"] = { |
["Rest"] = 126364, |
}, |
["Rylak"] = { |
["Updraft"] = 160007, |
}, |
["Shale Spider"] = { |
["Solid Shell"] = 160063, |
}, |
["Bird of Prey"] = { |
["Trick"] = 94022, |
}, |
["Spirit Beast"] = { |
["Spirit Mend"] = 90361, |
["Spirit Walk"] = 90328, |
}, |
["Warp Stalker"] = { |
["Warp Time"] = 35346, |
}, |
}, |
["Survival_PVPTalents"] = { |
["Spider Sting"] = 202914, |
["Dire Beast: Basilisk"] = 205691, |
["Hi-Explosive Trap"] = 236776, |
["Viper Sting"] = 202797, |
["Scorpid Sting"] = 202900, |
["Gladiator's Medallion"] = 208683, |
["Dire Beast: Hawk"] = 208652, |
["Interlope"] = 248518, |
["Roar of Sacrifice"] = 53480, |
}, |
["Marksmanship_PVPTalents"] = { |
["Spider Sting"] = 202914, |
["Dire Beast: Basilisk"] = 205691, |
["Hi-Explosive Trap"] = 236776, |
["Viper Sting"] = 202797, |
["Scorpid Sting"] = 202900, |
["Gladiator's Medallion"] = 208683, |
["Dire Beast: Hawk"] = 208652, |
["Interlope"] = 248518, |
["Roar of Sacrifice"] = 53480, |
}, |
["Survival"] = { |
["Harpoon"] = 190925, |
["Flare"] = 1543, |
["Command Pet"] = 272651, |
["Kill Command"] = 259489, |
["Feign Death"] = 5384, |
["Misdirection"] = 34477, |
["Muzzle"] = 187707, |
["Tar Trap"] = 187698, |
["Aspect of the Turtle"] = 186265, |
["Disengage"] = 781, |
["Raptor Strike"] = 186270, |
["Wildfire Bomb"] = 259495, |
["Wing Clip"] = 195645, |
["Serpent Sting"] = 259491, |
["Pet Utility"] = 103, |
["Intimidation"] = 19577, |
["Carve"] = 187708, |
["Eagle Eye"] = 6197, |
["Exhilaration"] = 109304, |
["Call Pet"] = 9, |
["Aspect of the Cheetah"] = 186257, |
["Aspect of the Eagle"] = 186289, |
["Freezing Trap"] = 187650, |
["Coordinated Assault"] = 266779, |
}, |
["Survival_Talents"] = { |
["Chakrams"] = 259391, |
["Flanking Strike"] = 269751, |
["Mongoose Bite"] = 259387, |
["Camouflage"] = 199483, |
["Butchery"] = 212436, |
["Steel Trap"] = 162488, |
["A Murder of Crows"] = 131894, |
["Binding Shot"] = 109248, |
}, |
["Beast Mastery_PVPTalents"] = { |
["Spider Sting"] = 202914, |
["Dire Beast: Basilisk"] = 205691, |
["Hi-Explosive Trap"] = 236776, |
["Viper Sting"] = 202797, |
["Scorpid Sting"] = 202900, |
["Gladiator's Medallion"] = 208683, |
["Dire Beast: Hawk"] = 208652, |
["Interlope"] = 248518, |
["Roar of Sacrifice"] = 53480, |
}, |
["Beast Mastery"] = { |
["Pet Utility"] = 103, |
["Cobra Shot"] = 193455, |
["Kill Command"] = 34026, |
["Feign Death"] = 5384, |
["Misdirection"] = 34477, |
["Tar Trap"] = 187698, |
["Multi-Shot"] = 2643, |
["Aspect of the Turtle"] = 186265, |
["Disengage"] = 781, |
["Barbed Shot"] = 217200, |
["Counter Shot"] = 147362, |
["Primal Rage"] = 272651, |
["Call Pet"] = 9, |
["Intimidation"] = 19577, |
["Flare"] = 1543, |
["Aspect of the Cheetah"] = 186257, |
["Exhilaration"] = 109304, |
["Aspect of the Wild"] = 193530, |
["Eagle Eye"] = 6197, |
["Concussive Shot"] = 5116, |
["Freezing Trap"] = 187650, |
["Bestial Wrath"] = 19574, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Marksmanship"] = 254, |
["Beast Mastery"] = 253, |
["Survival"] = 255, |
}, |
}, |
}, |
["MAGE"] = { |
["Fire_PVPTalents"] = { |
["Ice Form"] = 198144, |
["Temporal Shield"] = 198111, |
["Gladiator's Medallion"] = 208683, |
}, |
["Frost_Talents"] = { |
["Ice Nova"] = 157997, |
["Ebonbolt"] = 257537, |
["Glacial Spike"] = 199786, |
["Mirror Image"] = 55342, |
["Rune of Power"] = 116011, |
["Ring of Frost"] = 113724, |
["Ray of Frost"] = 205021, |
["Comet Storm"] = 153595, |
["Shimmer"] = 212653, |
["Ice Floes"] = 108839, |
}, |
["Pets"] = { |
["Water Elemental"] = { |
["Waterbolt"] = 31707, |
["Freeze"] = 33395, |
}, |
}, |
["Flyouts"] = { |
["Portal"] = { |
["Portal: Exodar"] = 32266, |
["Portal: Stonard"] = 49361, |
["Portal: Undercity"] = 11418, |
["Portal: Vale of Eternal Blossoms(Horde)"] = 132626, |
["Portal: Vale of Eternal Blossoms(Alliance)"] = 132620, |
["Ancient Portal: Dalaran"] = 120146, |
["Portal: Stormwind"] = 10059, |
["Portal: Warspear"] = 176244, |
["Portal: Theramore"] = 49360, |
["Portal: Thunder Bluff"] = 11420, |
["Portal: Darnassus"] = 11419, |
["Portal: Ironforge"] = 11416, |
["Portal: Orgrimmar"] = 11417, |
["Portal: Shattrath(Horde)"] = 35717, |
["Portal: Dazar'alor"] = 281402, |
["Portal: Dalaran - Broken Isles"] = 224871, |
["Portal: Stormshield"] = 176246, |
["Portal: Shattrath(Alliance)"] = 33691, |
["Portal: Tol Barad(Horde)"] = 88346, |
["Portal: Dalaran - Northrend"] = 53142, |
["Portal: Tol Barad(Alliance)"] = 88345, |
["Portal: Silvermoon"] = 32267, |
}, |
["Polymorph Variants"] = { |
["Polymorph(Rabbit)"] = 61721, |
["Polymorph(Monkey)"] = 161354, |
["Polymorph(Black Cat)"] = 61305, |
["Polymorph(Turtle)"] = 28271, |
["Polymorph(Turkey)"] = 61780, |
["Polymorph(Penguin)"] = 161355, |
["Polymorph(Serpent)"] = 61025, |
["Polymorph(Polar Bear Cub)"] = 161353, |
["Polymorph(Pig)"] = 126819, |
}, |
["Teleport"] = { |
["Teleport: Dalaran - Northrend"] = 53140, |
["Teleport: Vale of Eternal Blossoms(Horde)"] = 132627, |
["Teleport: Stonard"] = 49358, |
["Teleport: Stormshield"] = 176248, |
["Teleport: Darnassus"] = 3565, |
["Teleport: Vale of Eternal Blossoms(Alliance"] = 132621, |
["Teleport: Dalaran - Broken Isles"] = 224869, |
["Teleport: Stormwind"] = 3561, |
["Teleport: Hall of the Guardian"] = 193759, |
["Teleport: Shattrath(Horde)"] = 35715, |
["Teleport: Dazar'alor"] = 281404, |
["Teleport: Tol Barad(Horde)"] = 88344, |
["Teleport: Shattrath(Alliance)"] = 33690, |
["Teleport: Tol Barad(Alliance)"] = 88342, |
["Teleport: Orgrimmar"] = 3567, |
["Teleport: Exodar"] = 32271, |
["Teleport: Warspear"] = 176242, |
["Teleport: Silvermoon"] = 32272, |
["Teleport: Theramore"] = 49359, |
["Teleport: Undercity"] = 3563, |
["Ancient Teleport: Dalaran"] = 120145, |
["Teleport: Ironforge"] = 3562, |
["Teleport: Thunder Bluff"] = 3566, |
}, |
}, |
["Arcane_Talents"] = { |
["Mirror Image"] = 55342, |
["Rune of Power"] = 116011, |
["Nether Tempest"] = 114923, |
["Supernova"] = 157980, |
["Ring of Frost"] = 113724, |
["Arcane Orb"] = 153626, |
["Shimmer"] = 212653, |
["Arcane Familiar"] = 205022, |
["Charged Up"] = 205032, |
}, |
["Frost"] = { |
["Arcane Intellect"] = 1459, |
["Blizzard"] = 190356, |
["Frostbolt"] = 116, |
["Frozen Orb"] = 84714, |
["Polymorph"] = 118, |
["Cold Snap"] = 235219, |
["Remove Curse"] = 475, |
["Ice Lance"] = 108853, |
["Ice Barrier"] = 11426, |
["Time Warp"] = 80353, |
["Portal"] = 11, |
["Teleport"] = 1, |
["Icy Veins"] = 12472, |
["Summon Water Elemental"] = 31687, |
["Spellsteal"] = 30449, |
["Frost Nova"] = 122, |
["Ice Block"] = 45438, |
["Blink"] = 1953, |
["Slow Fall"] = 130, |
["Flurry"] = 44614, |
["Counterspell"] = 2139, |
["Conjure Refreshment"] = 190336, |
["Cone of Cold"] = 120, |
["Invisibility"] = 66, |
}, |
["Frost_PVPTalents"] = { |
["Ice Form"] = 198144, |
["Temporal Shield"] = 198111, |
["Gladiator's Medallion"] = 208683, |
}, |
["Arcane"] = { |
["Arcane Blast"] = 30451, |
["Arcane Intellect"] = 1459, |
["Arcane Explosion"] = 1449, |
["Prismatic Barrier"] = 235450, |
["Polymorph"] = 118, |
["Presence of Mind"] = 205025, |
["Remove Curse"] = 475, |
["Slow"] = 31589, |
["Conjure Refreshment"] = 190336, |
["Time Warp"] = 80353, |
["Portal"] = 11, |
["Teleport"] = 1, |
["Spellsteal"] = 30449, |
["Arcane Missiles"] = 5143, |
["Arcane Barrage"] = 44425, |
["Frost Nova"] = 122, |
["Ice Block"] = 45438, |
["Blink"] = 1953, |
["Slow Fall"] = 130, |
["Greater Invisibility"] = 110959, |
["Counterspell"] = 2139, |
["Evocation"] = 12051, |
["Arcane Power"] = 12042, |
["Displacement"] = 195676, |
}, |
["Arcane_PVPTalents"] = { |
["Ice Form"] = 198144, |
["Temporal Shield"] = 198111, |
["Gladiator's Medallion"] = 208683, |
}, |
["Fire"] = { |
["Fireball"] = 133, |
["Arcane Intellect"] = 1459, |
["Fire Blast"] = 108853, |
["Polymorph"] = 118, |
["Pyroblast"] = 11366, |
["Remove Curse"] = 475, |
["Scorch"] = 2948, |
["Flamestrike"] = 2120, |
["Conjure Refreshment"] = 190336, |
["Portal"] = 11, |
["Teleport"] = 1, |
["Combustion"] = 190319, |
["Time Warp"] = 80353, |
["Spellsteal"] = 30449, |
["Ice Block"] = 45438, |
["Blink"] = 1953, |
["Slow Fall"] = 130, |
["Counterspell"] = 2139, |
["Frost Nova"] = 122, |
["Blazing Barrier"] = 235313, |
["Dragon's Breath"] = 31661, |
["Invisibility"] = 66, |
}, |
["Fire_Talents"] = { |
["Living Bomb"] = 44457, |
["Blast Wave"] = 157981, |
["Meteor"] = 153561, |
["Ring of Frost"] = 113724, |
["Mirror Image"] = 55342, |
["Rune of Power"] = 116011, |
["Shimmer"] = 212653, |
["Phoenix Flames"] = 257541, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Fire"] = 63, |
["Frost"] = 64, |
["Arcane"] = 62, |
}, |
}, |
}, |
["MONK"] = { |
["Windwalker_Talents"] = { |
["Chi Burst"] = 123986, |
["Rushing Jade Wind"] = 261715, |
["Fist of the White Tiger"] = 261947, |
["Energizing Elixir"] = 115288, |
["Ring of Peace"] = 116844, |
["Chi Torpedo"] = 115008, |
["Chi Wave"] = 115098, |
["Diffuse Magic"] = 122783, |
["Dampen Harm"] = 122278, |
["Tiger's Lust"] = 116841, |
["Invoke Xuen, the White Tiger"] = 123904, |
["Whirling Dragon Punch"] = 152175, |
["Serenity"] = 152173, |
}, |
["Mistweaver_Talents"] = { |
["Chi Burst"] = 123986, |
["Diffuse Magic"] = 122783, |
["Invoke Chi-Ji, the Red Crane"] = 198664, |
["Mana Tea"] = 197908, |
["Ring of Peace"] = 116844, |
["Chi Torpedo"] = 115008, |
["Chi Wave"] = 115098, |
["Healing Elixir"] = 122281, |
["Summon Jade Serpent Statue"] = 115313, |
["Tiger's Lust"] = 116841, |
["Song of Chi-Ji"] = 198898, |
["Dampen Harm"] = 122278, |
["Refreshing Jade Wind"] = 196725, |
}, |
["Mistweaver"] = { |
["Life Cocoon"] = 116849, |
["Revival"] = 115310, |
["Resuscitate"] = 115178, |
["Fortifying Brew"] = 243435, |
["Renewing Mist"] = 115151, |
["Leg Sweep"] = 119381, |
["Detox"] = 115450, |
["Roll"] = 109132, |
["Soothing Mist"] = 115175, |
["Transcendence"] = 101643, |
["Tiger Palm"] = 100780, |
["Zen Pilgrimage"] = 126892, |
["Paralysis"] = 115078, |
["Reawaken"] = 212051, |
["Crackling Jade Lightning"] = 117952, |
["Enveloping Mist"] = 124682, |
["Thunder Focus Tea"] = 116680, |
["Spinning Crane Kick"] = 101546, |
["Blackout Kick"] = 100784, |
["Provoke"] = 115546, |
["Transcendence: Transfer"] = 119996, |
["Rising Sun Kick"] = 107428, |
["Vivify"] = 116670, |
["Essence Font"] = 191837, |
}, |
["Brewmaster"] = { |
["Resuscitate"] = 115178, |
["Blackout Strike"] = 205523, |
["Breath of Fire"] = 115181, |
["Fortifying Brew"] = 115203, |
["Leg Sweep"] = 119381, |
["Detox"] = 218164, |
["Roll"] = 109132, |
["Spear Hand Strike"] = 116705, |
["Zen Meditation"] = 115176, |
["Transcendence"] = 101643, |
["Keg Smash"] = 121253, |
["Zen Pilgrimage"] = 126892, |
["Expel Harm"] = 115072, |
["Crackling Jade Lightning"] = 117952, |
["Paralysis"] = 115078, |
["Purifying Brew"] = 119582, |
["Provoke"] = 115546, |
["Transcendence: Transfer"] = 119996, |
["Tiger Palm"] = 100780, |
["Vivify"] = 116670, |
["Ironskin Brew"] = 115308, |
}, |
["Windwalker"] = { |
["Fists of Fury"] = 113656, |
["Resuscitate"] = 115178, |
["Vivify"] = 116670, |
["Touch of Death"] = 115080, |
["Leg Sweep"] = 119381, |
["Detox"] = 218164, |
["Roll"] = 109132, |
["Touch of Karma"] = 122470, |
["Spear Hand Strike"] = 116705, |
["Storm, Earth, and Fire"] = 137639, |
["Tiger Palm"] = 100780, |
["Zen Pilgrimage"] = 126892, |
["Flying Serpent Kick"] = 101545, |
["Spinning Crane Kick"] = 101546, |
["Crackling Jade Lightning"] = 117952, |
["Paralysis"] = 115078, |
["Blackout Kick"] = 100784, |
["Provoke"] = 115546, |
["Transcendence: Transfer"] = 119996, |
["Rising Sun Kick"] = 107428, |
["Transcendence"] = 101643, |
["Disable"] = 116095, |
}, |
["Mistweaver_PVPTalents"] = { |
["Gladiator's Medallion"] = 208683, |
["Fortifying Brew"] = 201318, |
["Tigereye Brew"] = 247483, |
["Grapple Weapon"] = 233759, |
}, |
["Windwalker_PVPTalents"] = { |
["Gladiator's Medallion"] = 208683, |
["Fortifying Brew"] = 201318, |
["Tigereye Brew"] = 247483, |
["Grapple Weapon"] = 233759, |
}, |
["Brewmaster_Talents"] = { |
["Chi Burst"] = 123986, |
["Summon Black Ox Statue"] = 115315, |
["Black Ox Brew"] = 115399, |
["Ring of Peace"] = 116844, |
["Chi Torpedo"] = 115008, |
["Chi Wave"] = 115098, |
["Dampen Harm"] = 122278, |
["Invoke Niuzao, the Black Ox"] = 132578, |
["Tiger's Lust"] = 116841, |
["Healing Elixir"] = 122281, |
["Guard"] = 115295, |
["Rushing Jade Wind"] = 116847, |
}, |
["Brewmaster_PVPTalents"] = { |
["Gladiator's Medallion"] = 208683, |
["Fortifying Brew"] = 201318, |
["Tigereye Brew"] = 247483, |
["Grapple Weapon"] = 233759, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Mistweaver"] = 270, |
["Brewmaster"] = 268, |
["Windwalker"] = 269, |
}, |
}, |
}, |
["PALADIN"] = { |
["Protection"] = { |
["Divine Shield"] = 642, |
["Guardian of Ancient Kings"] = 86659, |
["Judgment"] = 275779, |
["Light of the Protector"] = 184092, |
["Hand of Reckoning"] = 62124, |
["Hammer of Justice"] = 853, |
["Consecration"] = 26573, |
["Shield of the Righteous"] = 53600, |
["Redemption"] = 7328, |
["Cleanse Toxins"] = 213644, |
["Avenger's Shield"] = 31935, |
["Avenging Wrath"] = 31884, |
["Lay on Hands"] = 633, |
["Rebuke"] = 96231, |
["Blessing of Protection"] = 1022, |
["Hammer of the Righteous"] = 53595, |
["Blessing of Sacrifice"] = 6940, |
["Flash of Light"] = 19750, |
["Blessing of Freedom"] = 1044, |
["Ardent Defender"] = 31850, |
["Divine Steed"] = 190784, |
}, |
["Holy"] = { |
["Divine Shield"] = 642, |
["Avenging Wrath"] = 31884, |
["Cleanse"] = 4987, |
["Judgment"] = 275773, |
["Light of the Martyr"] = 183998, |
["Holy Shock"] = 20473, |
["Hand of Reckoning"] = 62124, |
["Hammer of Justice"] = 853, |
["Consecration"] = 26573, |
["Beacon of Light"] = 53563, |
["Divine Protection"] = 498, |
["Blessing of Protection"] = 1022, |
["Redemption"] = 7328, |
["Holy Light"] = 82326, |
["Lay on Hands"] = 633, |
["Blessing of Freedom"] = 1044, |
["Light of Dawn"] = 85222, |
["Blessing of Sacrifice"] = 6940, |
["Aura Mastery"] = 31821, |
["Flash of Light"] = 19750, |
["Crusader Strike"] = 35395, |
["Absolution"] = 212056, |
["Divine Steed"] = 190784, |
}, |
["Protection_PVPTalents"] = { |
["Cleansing Light"] = 236186, |
["Hammer of Reckoning"] = 247675, |
["Blessing of Sanctuary"] = 210256, |
["Gladiator's Medallion"] = 208683, |
}, |
["Holy_Talents"] = { |
["Holy Avenger"] = 105809, |
["Blinding Light"] = 115750, |
["Beacon of Faith"] = 156910, |
["Bestow Faith"] = 223306, |
["Light's Hammer"] = 114158, |
["Rule of Law"] = 214202, |
["Beacon of Virtue"] = 200025, |
["Avenging Crusader"] = 216331, |
["Holy Prism"] = 114165, |
["Repentance"] = 20066, |
}, |
["Holy_PVPTalents"] = { |
["Cleansing Light"] = 236186, |
["Hammer of Reckoning"] = 247675, |
["Blessing of Sanctuary"] = 210256, |
["Gladiator's Medallion"] = 208683, |
}, |
["Retribution_Talents"] = { |
["Word of Glory"] = 210191, |
["Blinding Light"] = 115750, |
["Hammer of Wrath"] = 24275, |
["Justicar's Vengeance"] = 215661, |
["Wake of Ashes"] = 255937, |
["Inquisition"] = 84963, |
["Crusade"] = 231895, |
["Consecration"] = 205228, |
["Eye for an Eye"] = 205191, |
["Execution Sentence"] = 267798, |
["Repentance"] = 20066, |
}, |
["Retribution_PVPTalents"] = { |
["Cleansing Light"] = 236186, |
["Hammer of Reckoning"] = 247675, |
["Blessing of Sanctuary"] = 210256, |
["Gladiator's Medallion"] = 208683, |
}, |
["Protection_Talents"] = { |
["Bastion of Light"] = 204035, |
["Blessing of Spellwarding"] = 204018, |
["Blinding Light"] = 115750, |
["Blessed Hammer"] = 204019, |
["Seraphim"] = 152262, |
["Hand of the Protector"] = 213652, |
["Aegis of Light"] = 204150, |
["Repentance"] = 20066, |
}, |
["Retribution"] = { |
["Divine Shield"] = 642, |
["Avenging Wrath"] = 31884, |
["Divine Storm"] = 53385, |
["Shield of Vengeance"] = 184662, |
["Judgment"] = 20271, |
["Redemption"] = 7328, |
["Hand of Reckoning"] = 62124, |
["Hammer of Justice"] = 853, |
["Blessing of Protection"] = 1022, |
["Rebuke"] = 96231, |
["Hand of Hindrance"] = 183218, |
["Blade of Justice"] = 184575, |
["Lay on Hands"] = 633, |
["Templar's Verdict"] = 85256, |
["Cleanse Toxins"] = 213644, |
["Greater Blessing of Kings"] = 203538, |
["Crusader Strike"] = 35395, |
["Flash of Light"] = 19750, |
["Blessing of Freedom"] = 1044, |
["Greater Blessing of Wisdom"] = 203539, |
["Divine Steed"] = 190784, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Protection"] = 66, |
["Holy"] = 65, |
["Retribution"] = 70, |
}, |
}, |
}, |
["PRIEST"] = { |
["Shadow"] = { |
["Purify Disease"] = 213634, |
["Resurrection"] = 2006, |
["Shackle Undead"] = 9484, |
["Shadow Word: Pain"] = 589, |
["Fade"] = 586, |
["Mind Vision"] = 2096, |
["Mass Dispel"] = 32375, |
["Silence"] = 15487, |
["Dispersion"] = 47585, |
["Mind Sear"] = 48045, |
["Shadowform"] = 232698, |
["Levitate"] = 1706, |
["Void Eruption"] = 228260, |
["Dispel Magic"] = 528, |
["Mind Flay"] = 15407, |
["Mind Control"] = 605, |
["Power Word: Fortitude"] = 21562, |
["Psychic Scream"] = 8122, |
["Leap of Faith"] = 73325, |
["Power Word: Shield"] = 17, |
["Shadow Mend"] = 186263, |
["Shadowfiend"] = 34433, |
["Vampiric Touch"] = 34914, |
["Vampiric Embrace"] = 15286, |
["Mind Blast"] = 8092, |
}, |
["Shadow_PVPTalents"] = { |
["Dark Archangel"] = 197871, |
["Premonition"] = 209780, |
["Archangel"] = 197862, |
["Gladiator's Medallion"] = 208683, |
}, |
["Holy_Talents"] = { |
["Circle of Healing"] = 204883, |
["Divine Star"] = 110744, |
["Shining Force"] = 204263, |
["Binding Heal"] = 32546, |
["Halo"] = 120517, |
["Holy Word: Salvation"] = 265202, |
["Apotheosis"] = 200183, |
["Angelic Feather"] = 121536, |
}, |
["Holy_PVPTalents"] = { |
["Dark Archangel"] = 197871, |
["Premonition"] = 209780, |
["Archangel"] = 197862, |
["Gladiator's Medallion"] = 208683, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Discipline"] = 256, |
["Holy"] = 257, |
["Shadow"] = 258, |
}, |
}, |
["Discipline"] = { |
["Power Word: Radiance"] = 194509, |
["Resurrection"] = 2006, |
["Shackle Undead"] = 9484, |
["Rapture"] = 47536, |
["Pain Suppression"] = 33206, |
["Fade"] = 586, |
["Mind Vision"] = 2096, |
["Mass Dispel"] = 32375, |
["Power Word: Barrier"] = 62618, |
["Desperate Prayer"] = 19236, |
["Holy Nova"] = 132157, |
["Levitate"] = 1706, |
["Mass Resurrection"] = 212036, |
["Dispel Magic"] = 528, |
["Shadow Mend"] = 2061, |
["Leap of Faith"] = 73325, |
["Penance"] = 47540, |
["Psychic Scream"] = 8122, |
["Mind Control"] = 605, |
["Power Word: Shield"] = 17, |
["Smite"] = 585, |
["Shadowfiend"] = 34433, |
["Power Word: Fortitude"] = 21562, |
["Purify"] = 527, |
["Shadow Word: Pain"] = 589, |
}, |
["Discipline_PVPTalents"] = { |
["Dark Archangel"] = 197871, |
["Premonition"] = 209780, |
["Archangel"] = 197862, |
["Gladiator's Medallion"] = 208683, |
}, |
["Holy"] = { |
["Renew"] = 139, |
["Resurrection"] = 2006, |
["Shackle Undead"] = 9484, |
["Holy Nova"] = 132157, |
["Symbol of Hope"] = 64901, |
["Fade"] = 586, |
["Mind Vision"] = 2096, |
["Mass Dispel"] = 32375, |
["Leap of Faith"] = 73325, |
["Holy Word: Serenity"] = 2050, |
["Holy Word: Chastise"] = 88625, |
["Heal"] = 2060, |
["Desperate Prayer"] = 19236, |
["Holy Fire"] = 14914, |
["Purify"] = 527, |
["Flash Heal"] = 2061, |
["Dispel Magic"] = 528, |
["Guardian Spirit"] = 47788, |
["Mass Resurrection"] = 212036, |
["Holy Word: Sanctify"] = 34861, |
["Psychic Scream"] = 8122, |
["Mind Control"] = 605, |
["Divine Hymn"] = 64843, |
["Smite"] = 585, |
["Power Word: Fortitude"] = 21562, |
["Prayer of Healing"] = 596, |
["Levitate"] = 1706, |
["Prayer of Mending"] = 33076, |
}, |
["Discipline_Talents"] = { |
["Evangelism"] = 246287, |
["Schism"] = 214621, |
["Mindbender"] = 123040, |
["Halo"] = 120517, |
["Shadow Covenant"] = 204065, |
["Angelic Feather"] = 121536, |
["Power Word: Solace"] = 129250, |
["Divine Star"] = 110744, |
["Shining Force"] = 204263, |
["Luminous Barrier"] = 271466, |
["Purge the Wicked"] = 204197, |
}, |
["Shadow_Talents"] = { |
["Mindbender"] = 200174, |
["Dark Void"] = 263346, |
["Void Torrent"] = 263165, |
["Shadow Word: Death"] = 32379, |
["Shadow Crash"] = 205385, |
["Mind Bomb"] = 205369, |
["Psychic Horror"] = 64044, |
["Shadow Word: Void"] = 205351, |
["Surrender to Madness"] = 193223, |
["Dark Ascension"] = 280711, |
}, |
}, |
["ROGUE"] = { |
["Subtlety_PVPTalents"] = { |
["Death from Above"] = 269513, |
["Neurotoxin"] = 206328, |
["Gladiator's Medallion"] = 208683, |
["Shiv"] = 248744, |
["Smoke Bomb"] = 212182, |
}, |
["Assassination_PVPTalents"] = { |
["Death from Above"] = 269513, |
["Neurotoxin"] = 206328, |
["Gladiator's Medallion"] = 208683, |
["Shiv"] = 248744, |
["Smoke Bomb"] = 212182, |
}, |
["Assassination"] = { |
["Sprint"] = 2983, |
["Cloak of Shadows"] = 31224, |
["Garrote"] = 703, |
["Envenom"] = 196819, |
["Crimson Vial"] = 185311, |
["Shadowstep"] = 36554, |
["Rupture"] = 1943, |
["Poisons"] = 66, |
["Evasion"] = 5277, |
["Vendetta"] = 79140, |
["Stealth"] = 1784, |
["Pick Pocket"] = 921, |
["Blind"] = 2094, |
["Mutilate"] = 1752, |
["Pick Lock"] = 1804, |
["Kick"] = 1766, |
["Shroud of Concealment"] = 114018, |
["Distract"] = 1725, |
["Fan of Knives"] = 51723, |
["Poisoned Knife"] = 185565, |
["Sap"] = 6770, |
["Kidney Shot"] = 408, |
["Feint"] = 1966, |
["Tricks of the Trade"] = 57934, |
["Cheap Shot"] = 1833, |
["Vanish"] = 1856, |
}, |
["Assassination_Talents"] = { |
["Crimson Tempest"] = 121411, |
["Blindside"] = 111240, |
["Exsanguinate"] = 200806, |
["Marked for Death"] = 137619, |
["Toxic Blade"] = 245388, |
}, |
["Subtlety"] = { |
["Sprint"] = 2983, |
["Cloak of Shadows"] = 31224, |
["Backstab"] = 53, |
["Symbols of Death"] = 212283, |
["Eviscerate"] = 196819, |
["Shadowstep"] = 36554, |
["Shadow Blades"] = 121471, |
["Shadowstrike"] = 185438, |
["Poisons"] = 66, |
["Crimson Vial"] = 185311, |
["Stealth"] = 1784, |
["Kick"] = 1766, |
["Kidney Shot"] = 408, |
["Pick Pocket"] = 921, |
["Blind"] = 2094, |
["Nightblade"] = 195452, |
["Pick Lock"] = 1804, |
["Shadow Dance"] = 185313, |
["Shroud of Concealment"] = 114018, |
["Distract"] = 1725, |
["Evasion"] = 5277, |
["Shuriken Storm"] = 197835, |
["Sap"] = 6770, |
["Shuriken Toss"] = 114014, |
["Feint"] = 1966, |
["Tricks of the Trade"] = 57934, |
["Cheap Shot"] = 1833, |
["Vanish"] = 1856, |
}, |
["Flyouts"] = { |
["Poisons"] = { |
["Wound Poison"] = 8679, |
["Crippling Poison"] = 3408, |
["Leeching Poison"] = 108211, |
["Deadly Poison"] = 2823, |
}, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Outlaw"] = 260, |
["Subtlety"] = 261, |
["Assassination"] = 259, |
}, |
}, |
["Outlaw_Talents"] = { |
["Slice and Dice"] = 5171, |
["Ghostly Strike"] = 196937, |
["Blade Rush"] = 271877, |
["Marked for Death"] = 137619, |
["Killing Spree"] = 51690, |
}, |
["Outlaw"] = { |
["Sprint"] = 2983, |
["Cloak of Shadows"] = 31224, |
["Riposte"] = 199754, |
["Pistol Shot"] = 185763, |
["Crimson Vial"] = 185311, |
["Blade Flurry"] = 13877, |
["Between the Eyes"] = 199804, |
["Dispatch"] = 2098, |
["Grappling Hook"] = 195457, |
["Tricks of the Trade"] = 57934, |
["Stealth"] = 1784, |
["Feint"] = 1966, |
["Ambush"] = 8676, |
["Blind"] = 2094, |
["Gouge"] = 1776, |
["Pick Lock"] = 1804, |
["Roll the Bones"] = 193316, |
["Sinister Strike"] = 193315, |
["Distract"] = 1725, |
["Adrenaline Rush"] = 13750, |
["Shroud of Concealment"] = 114018, |
["Sap"] = 6770, |
["Pick Pocket"] = 921, |
["Kick"] = 1766, |
["Poisons"] = 66, |
["Cheap Shot"] = 1833, |
["Vanish"] = 1856, |
}, |
["Subtlety_Talents"] = { |
["Gloomblade"] = 200758, |
["Secret Technique"] = 280719, |
["Marked for Death"] = 137619, |
["Shuriken Tornado"] = 277925, |
}, |
["Outlaw_PVPTalents"] = { |
["Death from Above"] = 269513, |
["Neurotoxin"] = 206328, |
["Gladiator's Medallion"] = 208683, |
["Shiv"] = 248744, |
["Smoke Bomb"] = 212182, |
}, |
}, |
["SHAMAN"] = { |
["Restoration_PVPTalents"] = { |
["Counterstrike Totem"] = 204331, |
["Gladiator's Medallion"] = 208683, |
["Skyfury Totem"] = 204330, |
["Spirit Link"] = 204293, |
["Grounding Totem"] = 204336, |
}, |
["Elemental"] = { |
["Astral Shift"] = 108271, |
["Healing Surge"] = 8004, |
["Ghost Wolf"] = 2645, |
["Flame Shock"] = 188389, |
["Fire Elemental"] = 198067, |
["Earthquake"] = 61882, |
["Earth Elemental"] = 198103, |
["Ancestral Spirit"] = 2008, |
["Water Walking"] = 546, |
["Tremor Totem"] = 8143, |
["Earthbind Totem"] = 2484, |
["Hex"] = 51514, |
["Capacitor Totem"] = 192058, |
["Far Sight"] = 6196, |
["Cleanse Spirit"] = 51886, |
["Hex Variants"] = 106, |
["Frost Shock"] = 196840, |
["Lightning Bolt"] = 188196, |
["Bloodlust"] = 2825, |
["Lava Burst"] = 51505, |
["Heroism"] = 32182, |
["Wind Shear"] = 57994, |
["Astral Recall"] = 556, |
["Purge"] = 370, |
["Thunderstorm"] = 51490, |
["Chain Lightning"] = 188443, |
["Earth Shock"] = 8042, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Enhancement"] = 263, |
["Elemental"] = 262, |
["Restoration"] = 264, |
}, |
}, |
["Flyouts"] = { |
["Hex Variants"] = { |
["Hex(Spider)"] = 211004, |
["Hex(Compy)"] = 210873, |
["Hex(Cockroach)"] = 211015, |
["Hex(Snake)"] = 211010, |
}, |
}, |
["Pets"] = { |
["Storm Elemental"] = { |
["Call Lightning"] = 157348, |
["Eye of the Storm"] = 157375, |
["Wind Gust"] = 157331, |
}, |
["Earth Elemental"] = { |
["Pulverize"] = 118345, |
["Angered Earth"] = 36213, |
["Harden Skin"] = 118337, |
}, |
["Fire Elemental"] = { |
["Immolate"] = 118297, |
["Meteor"] = 117588, |
["Fire Blast"] = 57984, |
}, |
}, |
["Enhancement_PVPTalents"] = { |
["Counterstrike Totem"] = 204331, |
["Gladiator's Medallion"] = 208683, |
["Skyfury Totem"] = 204330, |
["Spirit Link"] = 204293, |
["Grounding Totem"] = 204336, |
}, |
["Restoration_Talents"] = { |
["Earthen Wall Totem"] = 198838, |
["Wind Rush Totem"] = 192077, |
["Ancestral Protection Totem"] = 207399, |
["Earth Shield"] = 974, |
["Unleash Life"] = 73685, |
["Wellspring"] = 197995, |
["Cloudburst Totem"] = 157153, |
["Ascendance"] = 114052, |
["Downpour"] = 207778, |
["Earthgrab Totem"] = 51485, |
}, |
["Elemental_PVPTalents"] = { |
["Counterstrike Totem"] = 204331, |
["Gladiator's Medallion"] = 208683, |
["Skyfury Totem"] = 204330, |
["Spirit Link"] = 204293, |
["Grounding Totem"] = 204336, |
}, |
["Elemental_Talents"] = { |
["Liquid Magma Totem"] = 192222, |
["Totem Mastery"] = 210643, |
["Icefury"] = 210714, |
["Wind Rush Totem"] = 192077, |
["Earth Shield"] = 974, |
["Storm Elemental"] = 192249, |
["Stormkeeper"] = 191634, |
["Ascendance"] = 114050, |
["Ancestral Guidance"] = 108281, |
["Elemental Blast"] = 117014, |
}, |
["Enhancement"] = { |
["Astral Shift"] = 108271, |
["Healing Surge"] = 188070, |
["Crash Lightning"] = 187874, |
["Lava Lash"] = 60103, |
["Ghost Wolf"] = 2645, |
["Flametongue"] = 193796, |
["Earth Elemental"] = 198103, |
["Ancestral Spirit"] = 2008, |
["Water Walking"] = 546, |
["Capacitor Totem"] = 192058, |
["Earthbind Totem"] = 2484, |
["Hex"] = 51514, |
["Feral Spirit"] = 51533, |
["Tremor Totem"] = 8143, |
["Frostbrand"] = 196834, |
["Hex Variants"] = 106, |
["Far Sight"] = 6196, |
["Cleanse Spirit"] = 51886, |
["Bloodlust"] = 2825, |
["Purge"] = 370, |
["Lightning Bolt"] = 187837, |
["Wind Shear"] = 57994, |
["Astral Recall"] = 556, |
["Stormstrike"] = 17364, |
["Spirit Walk"] = 58875, |
["Heroism"] = 32182, |
["Rockbiter"] = 193786, |
}, |
["Restoration"] = { |
["Astral Shift"] = 108271, |
["Earth Elemental"] = 198103, |
["Healing Surge"] = 8004, |
["Healing Tide Totem"] = 108280, |
["Tremor Totem"] = 8143, |
["Ghost Wolf"] = 2645, |
["Flame Shock"] = 188838, |
["Spiritwalker's Grace"] = 79206, |
["Healing Wave"] = 77472, |
["Far Sight"] = 6196, |
["Capacitor Totem"] = 192058, |
["Ancestral Spirit"] = 2008, |
["Water Walking"] = 546, |
["Chain Heal"] = 1064, |
["Spirit Link Totem"] = 98008, |
["Hex"] = 51514, |
["Purge"] = 370, |
["Purify Spirit"] = 77130, |
["Lava Burst"] = 51505, |
["Hex Variants"] = 106, |
["Healing Rain"] = 73920, |
["Lightning Bolt"] = 403, |
["Bloodlust"] = 2825, |
["Riptide"] = 61295, |
["Heroism"] = 32182, |
["Wind Shear"] = 57994, |
["Astral Recall"] = 556, |
["Earthbind Totem"] = 2484, |
["Healing Stream Totem"] = 5394, |
["Chain Lightning"] = 421, |
["Ancestral Vision"] = 212048, |
}, |
["Enhancement_Talents"] = { |
["Fury of Air"] = 197211, |
["Wind Rush Totem"] = 192077, |
["Earth Shield"] = 974, |
["Lightning Shield"] = 192106, |
["Totem Mastery"] = 262395, |
["Sundering"] = 197214, |
["Ascendance"] = 114051, |
["Feral Lunge"] = 196884, |
["Earthen Spike"] = 188089, |
}, |
}, |
["WARLOCK"] = { |
["Affliction_Talents"] = { |
["Grimoire of Sacrifice"] = 108503, |
["Siphon Life"] = 63106, |
["Mortal Coil"] = 6789, |
["Demonic Circle"] = 268358, |
["Drain Soul"] = 198590, |
["Phantom Singularity"] = 205179, |
["Dark Soul: Misery"] = 113860, |
["Dark Pact"] = 108416, |
["Haunt"] = 48181, |
["Burning Rush"] = 111400, |
["Deathbolt"] = 264106, |
["Vile Taint"] = 278350, |
}, |
["Destruction_Talents"] = { |
["Grimoire of Sacrifice"] = 108503, |
["Dark Pact"] = 108416, |
["Mortal Coil"] = 6789, |
["Demonic Circle"] = 268358, |
["Channel Demonfire"] = 196447, |
["Shadowburn"] = 17877, |
["Cataclysm"] = 152108, |
["Soul Fire"] = 6353, |
["Dark Soul: Instability"] = 113858, |
["Burning Rush"] = 111400, |
}, |
["Affliction"] = { |
["Corruption"] = 172, |
["Shadowfury"] = 30283, |
["Soulstone"] = 20707, |
["Command Demon"] = 119898, |
["Create Soulwell"] = 29893, |
["Agony"] = 980, |
["Ritual of Summoning"] = 698, |
["Health Funnel"] = 755, |
["Eye of Kilrogg"] = 126, |
["Fear"] = 5782, |
["Demonic Gateway"] = 111771, |
["Drain Life"] = 234153, |
["Enslave Demon"] = 1098, |
["Seed of Corruption"] = 27243, |
["Banish"] = 710, |
["Create Healthstone"] = 6201, |
["Shadow Bolt"] = 232670, |
["Unending Breath"] = 5697, |
["Summon Darkglare"] = 205180, |
["Summon Demon"] = 10, |
["Unending Resolve"] = 104773, |
["Unstable Affliction"] = 30108, |
}, |
["Flyouts"] = { |
["Summon Demon"] = { |
["Summon Imp"] = 688, |
["Summon Wrathguard"] = 112870, |
["Summon Voidlord"] = 112867, |
["Summon Felhunter"] = 691, |
["Summon Voidwalker"] = 697, |
["Summon Succubus"] = 712, |
["Summon Shivarra"] = 112868, |
["Summon Observer"] = 112869, |
["Summon Felguard"] = 30146, |
["Summon Fel Imp"] = 112866, |
}, |
}, |
["Pets"] = { |
["Voidlord"] = { |
["Suffering"] = 119907, |
["Consuming Shadows"] = 3716, |
["Void Shield"] = 115236, |
["Shadow Bulwark"] = 17767, |
["Threatening Presence"] = 112042, |
}, |
["Voidwalker"] = { |
["Suffering"] = 17735, |
["Consuming Shadows"] = 3716, |
["Threatening Presence"] = 112042, |
["Shadow Bulwark"] = 119907, |
}, |
["Shivarra"] = { |
["Mesmerize"] = 115268, |
["Lesser Invisibility"] = 7870, |
["Bladedance"] = 115748, |
["Fellash"] = 115770, |
}, |
["Observer"] = { |
["Optical Blast"] = 115781, |
["Devour Magic"] = 19505, |
["Tongue Lash"] = 115778, |
}, |
["Wrathguard"] = { |
["Mortal Cleave"] = 115625, |
["Threatening Presence"] = 134477, |
["Wrathstorm"] = 115831, |
["Axe Toss"] = 89766, |
["Pursuit"] = 30151, |
}, |
["Succubus"] = { |
["Whiplash"] = 6360, |
["Lesser Invisibility"] = 7870, |
["Lash of Pain"] = 7814, |
["Seduction"] = 119909, |
}, |
["Felguard"] = { |
["Legion Strike"] = 30213, |
["Pursuit"] = 30151, |
["Axe Toss"] = 119914, |
["Felstorm"] = 89751, |
}, |
["Felhunter"] = { |
["Shadow Bite"] = 54049, |
["Spell Lock"] = 119910, |
["Devour Magic"] = 19505, |
}, |
["Fel Imp"] = { |
["Felbolt"] = 115746, |
["Cauterize Master"] = 119905, |
["Sear Magic"] = 115276, |
["Flee"] = 89792, |
}, |
["Imp"] = { |
["Blood Pact"] = 6307, |
["Firebolt"] = 3110, |
["Singe Magic"] = 119905, |
["Flee"] = 89792, |
}, |
}, |
["Affliction_PVPTalents"] = { |
["Call Felhunter"] = 212619, |
["Singe Magic"] = 212623, |
["Casting Circle"] = 221703, |
["Curse of Tongues"] = 199890, |
["Call Fel Lord"] = 212459, |
["Nether Ward"] = 212295, |
["Curse of Weakness"] = 199892, |
["Gladiator's Medallion"] = 208683, |
["Curse of Fragility"] = 199954, |
["Call Observer"] = 201996, |
}, |
["Destruction"] = { |
["Shadowfury"] = 30283, |
["Soulstone"] = 20707, |
["Command Demon"] = 119898, |
["Create Soulwell"] = 29893, |
["Conflagrate"] = 17962, |
["Ritual of Summoning"] = 698, |
["Health Funnel"] = 755, |
["Eye of Kilrogg"] = 126, |
["Fear"] = 5782, |
["Demonic Gateway"] = 111771, |
["Unending Resolve"] = 104773, |
["Incinerate"] = 29722, |
["Drain Life"] = 234153, |
["Enslave Demon"] = 1098, |
["Banish"] = 710, |
["Summon Infernal"] = 1122, |
["Chaos Bolt"] = 116858, |
["Havoc"] = 80240, |
["Create Healthstone"] = 6201, |
["Immolate"] = 348, |
["Summon Demon"] = 10, |
["Unending Breath"] = 5697, |
["Rain of Fire"] = 5740, |
}, |
["Demonology_PVPTalents"] = { |
["Call Felhunter"] = 212619, |
["Singe Magic"] = 212623, |
["Casting Circle"] = 221703, |
["Curse of Tongues"] = 199890, |
["Call Fel Lord"] = 212459, |
["Nether Ward"] = 212295, |
["Curse of Weakness"] = 199892, |
["Gladiator's Medallion"] = 208683, |
["Curse of Fragility"] = 199954, |
["Call Observer"] = 201996, |
}, |
["Demonology"] = { |
["Call Dreadstalkers"] = 104316, |
["Singe Magic"] = 119898, |
["Soulstone"] = 20707, |
["Implosion"] = 196277, |
["Create Soulwell"] = 29893, |
["Summon Demonic Tyrant"] = 265187, |
["Ritual of Summoning"] = 698, |
["Health Funnel"] = 755, |
["Eye of Kilrogg"] = 126, |
["Shadow Bulwark"] = 119898, |
["Demonbolt"] = 264178, |
["Demonic Gateway"] = 111771, |
["Hand of Gul'dan"] = 105174, |
["Drain Life"] = 234153, |
["Enslave Demon"] = 1098, |
["Shadow Bolt"] = 686, |
["Create Healthstone"] = 6201, |
["Fear"] = 5782, |
["Banish"] = 710, |
["Shadowfury"] = 30283, |
["Summon Demon"] = 10, |
["Unending Breath"] = 5697, |
["Unending Resolve"] = 104773, |
}, |
["Destruction_PVPTalents"] = { |
["Call Felhunter"] = 212619, |
["Singe Magic"] = 212623, |
["Casting Circle"] = 221703, |
["Curse of Tongues"] = 199890, |
["Call Fel Lord"] = 212459, |
["Nether Ward"] = 212295, |
["Curse of Weakness"] = 199892, |
["Gladiator's Medallion"] = 208683, |
["Curse of Fragility"] = 199954, |
["Call Observer"] = 201996, |
}, |
["Demonology_Talents"] = { |
["Dark Pact"] = 108416, |
["Demonic Strength"] = 267171, |
["Demonic Circle"] = 268358, |
["Soul Strike"] = 264057, |
["Summon Vilefiend"] = 264119, |
["Grimoire: Felguard"] = 111898, |
["Doom"] = 265412, |
["Nether Portal"] = 267217, |
["Power Siphon"] = 264130, |
["Mortal Coil"] = 6789, |
["Burning Rush"] = 111400, |
["Bilescourge Bombers"] = 267211, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Demonology"] = 266, |
["Affliction"] = 265, |
["Destruction"] = 267, |
}, |
}, |
}, |
["WARRIOR"] = { |
["Protection"] = { |
["Shield Slam"] = 23922, |
["Intimidating Shout"] = 5246, |
["Avatar"] = 107574, |
["Berserker Rage"] = 18499, |
["Shield Block"] = 2565, |
["Thunder Clap"] = 6343, |
["Shockwave"] = 46968, |
["Victory Rush"] = 34428, |
["Shield Wall"] = 871, |
["Rallying Cry"] = 97462, |
["Demoralizing Shout"] = 1160, |
["Ignore Pain"] = 190456, |
["Spell Reflection"] = 23920, |
["Intercept"] = 198304, |
["Last Stand"] = 12975, |
["Battle Shout"] = 6673, |
["Revenge"] = 6572, |
["Pummel"] = 6552, |
["Heroic Leap"] = 6544, |
["Devastate"] = 20243, |
["Heroic Throw"] = 57755, |
["Taunt"] = 355, |
}, |
["Arms_Talents"] = { |
["Warbreaker"] = 262161, |
["Rend"] = 772, |
["Skullsplitter"] = 260643, |
["Defensive Stance"] = 197690, |
["Deadly Calm"] = 262228, |
["Impending Victory"] = 202168, |
["Avatar"] = 107574, |
["Ravager"] = 152277, |
["Cleave"] = 845, |
["Storm Bolt"] = 107570, |
}, |
["Fury"] = { |
["Taunt"] = 355, |
["Intimidating Shout"] = 5246, |
["Execute"] = 5308, |
["Whirlwind"] = 190411, |
["Rampage"] = 184367, |
["Piercing Howl"] = 12323, |
["Bloodthirst"] = 23881, |
["Raging Blow"] = 85288, |
["Recklessness"] = 1719, |
["Rallying Cry"] = 97462, |
["Berserker Rage"] = 18499, |
["Charge"] = 100, |
["Enraged Regeneration"] = 184364, |
["Pummel"] = 6552, |
["Heroic Leap"] = 6544, |
["Victory Rush"] = 34428, |
["Heroic Throw"] = 57755, |
["Battle Shout"] = 6673, |
}, |
["Fury_Talents"] = { |
["Impending Victory"] = 202168, |
["Storm Bolt"] = 107570, |
["Bladestorm"] = 46924, |
["Dragon Roar"] = 118000, |
["Siegebreaker"] = 280772, |
["Furious Slash"] = 100130, |
}, |
["Protection_PVPTalents"] = { |
["Death Wish"] = 199261, |
["Disarm"] = 236077, |
["Spell Reflection"] = 216890, |
["Gladiator's Medallion"] = 208683, |
}, |
["Fury_PVPTalents"] = { |
["Death Wish"] = 199261, |
["Disarm"] = 236077, |
["Spell Reflection"] = 216890, |
["Gladiator's Medallion"] = 208683, |
}, |
["Arms_PVPTalents"] = { |
["Death Wish"] = 199261, |
["Disarm"] = 236077, |
["Spell Reflection"] = 216890, |
["Gladiator's Medallion"] = 208683, |
}, |
["Arms"] = { |
["Battle Shout"] = 6673, |
["Intimidating Shout"] = 5246, |
["Execute"] = 163201, |
["Whirlwind"] = 1680, |
["Mortal Strike"] = 12294, |
["Berserker Rage"] = 18499, |
["Overpower"] = 7384, |
["Hamstring"] = 1715, |
["Taunt"] = 355, |
["Rallying Cry"] = 97462, |
["Colossus Smash"] = 167105, |
["Charge"] = 100, |
["Victory Rush"] = 34428, |
["Heroic Leap"] = 6544, |
["Slam"] = 1464, |
["Pummel"] = 6552, |
["Bladestorm"] = 227847, |
["Die by the Sword"] = 118038, |
["Heroic Throw"] = 57755, |
["Sweeping Strikes"] = 260708, |
}, |
["Protection_Talents"] = { |
["Ravager"] = 228920, |
["Dragon Roar"] = 118000, |
["Impending Victory"] = 202168, |
["Storm Bolt"] = 107570, |
}, |
["METADATA"] = { |
["Specs"] = { |
["Fury"] = 72, |
["Protection"] = 73, |
["Arms"] = 71, |
}, |
}, |
}, |
}; |
-- Helper functions: Default lookup priorities -- |
------------------------------------------------- |
local playerUniversalClassName; -- Player only, gathered upon PLAYER_LOGIN |
local playerUniversalRaceName; -- Player only, gathered upon PLAYER_LOGIN |
local petFamily; |
local GetEnglishSpecialisationName = function(specID, ...) -- Any class/spec |
-- Arguments (1 to 2): |
-- specID (number) *mandatory - Specialisation ID for which we want to get the English Name. |
-- universalClassName (string) *optional - Class where the specialisation should be found; |
-- Defaults to the current Player's class. |
-- Returns (2): |
-- engSpecName (string): English name for the given Specialisation; Nil if the spec wasn't |
-- found. |
-- uniClassName (string): Non-localised name of the Class the spec belongs to (given as arg2 |
-- or otherwise discovered if the given class was wrong or nil). Nil if the spec wasn't |
-- found. |
-- |
-- Look first in the provided universal class name (or the player class if argument is missing) |
local lookupFirstInClass = ... or playerUniversalClassName; |
for engSpecName, DBspecID in pairs(LibSN2SID.DB[lookupFirstInClass].METADATA.Specs) do |
if DBspecID == specID then |
return engSpecName, lookupFirstInClass; |
end |
end |
-- Look up the specialisation ID in all other classes |
local generalTabName = (GetSpellTabInfo(1)); |
local uniClassName = (next(LibSN2SID.DB, nil)); |
while uniClassName do |
if (uniClassName ~= generalTabName) and (uniClassName ~= lookupFirstInClass) then |
for engSpecName, DBspecID in pairs(LibSN2SID.DB[uniClassName].METADATA.Specs) do |
-- print(uniClassName); |
if DBspecID == specID then |
return engSpecName, uniClassName; |
end |
end |
end |
uniClassName = (next(LibSN2SID.DB, uniClassName)); |
end |
-- Could not find the given specID in the database |
return nil, nil; |
end |
local GetActiveEnglishSpecialisationName = function() -- Player only |
-- Returns(3): |
-- engSpecName (string) - English name for the active Player Specialisation; Nil if no spec |
-- is active (e.g. if character level < 10). |
-- uniClassName (string) - Non-localised name of the Player Class. Nil if no active spec. |
-- activeSpecID (number) - Specialisation ID for the active spec. Nil if no active spec. |
-- |
local activeSpecIndex = (GetSpecialization()); |
-- print(tostring(activeSpecIndex)); |
if activeSpecIndex then |
local activeSpecID = (GetSpecializationInfo(activeSpecIndex)); |
-- print(tostring(activeSpecID)); |
return GetEnglishSpecialisationName(activeSpecID, playerUniversalClassName), activeSpecID; |
else |
return nil, nil, nil; -- Player does not have an active specialisation |
end |
end |
local LookupOrder_table = {}; -- Any class/spec |
-- Order to lookup spells in the DB: |
-- 1st: Player's class: |
-- 1.1. Active spec baseline spells; |
-- 1.2. Active spec Talents' spells; |
-- 1.3. Active spec PvP Talents' spells; |
-- 1.4. Flyouts (if there are spells for); |
-- 1.5. Pets (if there are spells for); |
-- 1.5.1. Current pet specialization (if there is one) spells; NOT properly working, pet family |
-- 1.5.2. Current pet fmaily (if there is one) spells; gets bumped up above pet specicalization |
-- 1.6. Other specs' baseline spells; |
-- 1.7. Other specs' Talents' spells; |
-- 1.8. Other specs' PvP Talents' spells; |
-- 2nd: GeneralTab; |
-- 3rd: Other classes: |
-- 3.1. Each spec baseline spells; |
-- 3.2. Each spec Talents' spells; |
-- 3.3. Each spec PvP Talents' spells; |
-- 3.4. Flyouts (if there are spells for); |
-- 3.5. Pets (if there are spells for). |
local setCurrentPetFirstInLookupOrder = function() |
local classKey = playerUniversalClassName; |
if LookupOrder_table[classKey].Pets then |
wipe(LookupOrder_table[classKey].Pets); |
else |
local index = (LibSN2SID.DB[classKey].Flyouts and 5) or 4; |
tinsert(LookupOrder_table[classKey], index, "Pets"); |
LookupOrder_table[classKey].Pets = {}; |
end |
local petSpecName; |
if classKey == "HUNTER" then |
local petSpecIndex = (GetSpecialization(false, true)); |
petSpecName = (petSpecIndex == 1 and "Ferocity") or (petSpecIndex == 2 and |
"Tenacity") or (petSpecIndex == 3 and "Cunning") or nil; |
-- print(tostring(petSpecIndex).. " : ".. tostring(petSpecName)); |
end |
local petKey = (next(LibSN2SID.DB[classKey].Pets, nil)); |
while petKey do |
if petSpecName and petKey == petSpecName then |
tinsert(LookupOrder_table[classKey].Pets, 1, petKey); |
elseif petFamily and petKey == petFamily then |
local index = (petSpecName and LookupOrder_table[classKey].Pets[petSpecName] and 2) or 1; |
tinsert(LookupOrder_table[classKey].Pets, index, petKey); |
else |
tinsert(LookupOrder_table[classKey].Pets, petKey); |
end |
petKey = (next(LibSN2SID.DB[classKey].Pets, petKey)); |
end |
-- for iii = 1, #(LookupOrder_table[classKey].Pets) do |
-- local subTableKey = LookupOrder_table[classKey].Pets[iii]; |
-- print(AddonName.. ": ".. iii.. ". ".. tostring(subTableKey)); |
-- end |
end |
local SetLookupOrder = function() |
-- LookupOrder_table = {}; -- Reset the table |
wipe(LookupOrder_table); -- Reset the table |
local classOrderIndex = 1; |
local classKey = (next(LibSN2SID.DB, nil)); |
-- print(tostring(classKey)); |
while classKey do |
if classKey == playerUniversalClassName then -- Current player class |
tinsert(LookupOrder_table, 1, classKey); |
LookupOrder_table[classKey] = {}; |
-- print(tostring(LookupOrder_table[1])); |
-- Order specs et al |
local playerActiveEnglishSpecName = (GetActiveEnglishSpecialisationName()); |
-- print("Active SpecName = ".. tostring(playerActiveEnglishSpecName)); |
local specKey = (next(LibSN2SID.DB[classKey].METADATA.Specs, nil)); |
while specKey do |
if specKey == playerActiveEnglishSpecName then |
tinsert(LookupOrder_table[classKey], 1, specKey); |
tinsert(LookupOrder_table[classKey], 2, specKey.."_Talents"); |
tinsert(LookupOrder_table[classKey], 3, specKey.."_PVPTalents"); |
-- print(tostring(LookupOrder_table[classKey][1]).. " *"); |
-- else |
-- elseif LibSN2SID.DB[classKey].METADATA.Specs[specKey] then |
else |
tinsert(LookupOrder_table[classKey], specKey); |
tinsert(LookupOrder_table[classKey], specKey.."_Talents"); |
tinsert(LookupOrder_table[classKey], specKey.."_PVPTalents"); |
-- print(tostring(LookupOrder_table[classKey][(specOrderIndex == 1) and specOrderIndex or (specOrderIndex +specOrderIndex -1)])); |
end |
specKey = (next(LibSN2SID.DB[classKey].METADATA.Specs, specKey)); |
-- specOrderIndex = specOrderIndex + 1; |
end |
if LibSN2SID.DB[classKey].Flyouts then |
tinsert(LookupOrder_table[classKey], 4, "Flyouts"); |
LookupOrder_table[classKey].Flyouts = {}; |
local flyoutButtonKey = (next(LibSN2SID.DB[classKey].Flyouts, nil)); |
while flyoutButtonKey do |
tinsert(LookupOrder_table[classKey].Flyouts, flyoutButtonKey); |
flyoutButtonKey = (next(LibSN2SID.DB[classKey].Flyouts, flyoutButtonKey)); |
end |
end |
if LibSN2SID.DB[classKey].Pets then |
setCurrentPetFirstInLookupOrder(); |
end |
elseif classKey ~= "General" then -- Other classes |
tinsert(LookupOrder_table, classKey); |
-- print(tostring(LookupOrder_table[classOrderIndex])); |
LookupOrder_table[classKey] = {}; |
local specKey = (next(LibSN2SID.DB[classKey].METADATA.Specs, nil)); |
while specKey do |
-- local numSpecSubTables = 3; -- Unless we also have Flyouts, making it 4 or more |
tinsert(LookupOrder_table[classKey], specKey); |
tinsert(LookupOrder_table[classKey], specKey.."_Talents"); |
tinsert(LookupOrder_table[classKey], specKey.."_PVPTalents"); |
specKey = (next(LibSN2SID.DB[classKey].METADATA.Specs, specKey)); |
end |
if LibSN2SID.DB[classKey].Flyouts then |
tinsert(LookupOrder_table[classKey], "Flyouts"); |
LookupOrder_table[classKey].Flyouts = {}; |
local flyoutButtonKey = (next(LibSN2SID.DB[classKey].Flyouts, nil)); |
while flyoutButtonKey do |
-- print(AddonName.. ": ".. tostring(flyoutButtonKey)); |
tinsert(LookupOrder_table[classKey].Flyouts, flyoutButtonKey); |
flyoutButtonKey = (next(LibSN2SID.DB[classKey].Flyouts, flyoutButtonKey)); |
end |
end |
if LibSN2SID.DB[classKey].Pets then |
tinsert(LookupOrder_table[classKey], "Pets"); |
LookupOrder_table[classKey].Pets = {}; |
local petKey = (next(LibSN2SID.DB[classKey].Pets, nil)); |
while petKey do |
tinsert(LookupOrder_table[classKey].Pets, petKey); |
petKey = (next(LibSN2SID.DB[classKey].Pets, petKey)); |
end |
end |
end |
classKey = (next(LibSN2SID.DB, classKey)); |
classOrderIndex = classOrderIndex + 1; |
end |
tinsert(LookupOrder_table, 2, "General"); |
-- tinsert(LookupOrder_table, "General"); |
LookupOrder_table["General"] = {}; |
local categoryKey = (next(LibSN2SID.DB.General, nil)); |
while categoryKey do |
if categoryKey == "Racials" then |
tinsert(LookupOrder_table.General, "Racials"); |
LookupOrder_table.General.Racials = {}; |
local racialKey = (next(LibSN2SID.DB.General.Racials, nil)); |
while racialKey do |
if racialKey == playerUniversalRaceName then |
tinsert(LookupOrder_table.General.Racials, 1, racialKey); |
else |
tinsert(LookupOrder_table.General.Racials, racialKey); |
end |
racialKey = (next(LibSN2SID.DB.General.Racials, racialKey)); |
end |
-- elseif categoryKey ~= "METADATA" then -- Currentlu not in the database |
else |
tinsert(LookupOrder_table.General, categoryKey); |
end |
categoryKey = (next(LibSN2SID.DB.General, categoryKey)); |
end |
end |
-- Get Player's character data when it's available |
local libFrame = CreateFrame("Frame"); |
libFrame:RegisterEvent("PLAYER_LOGIN"); |
local lookupOrderTableInitialized = false; |
libFrame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED"); -- This talent and/or the one in the line bellow |
libFrame:RegisterEvent("PLAYER_TALENT_UPDATE"); -- should fire when the player switches spec. |
libFrame:RegisterUnitEvent("UNIT_PET", "player"); -- Fired when a unit's pet changes. |
libFrame:RegisterEvent("PET_SPECIALIZATION_CHANGED"); -- Fired upon pet's specialisation changes. |
libFrame:SetScript("OnEvent", function(self, event) |
if event == "PLAYER_LOGIN" or event == "PLAYER_ENTERING_WORLD" then |
local stubVal; |
stubVal, playerUniversalClassName = UnitClass("player"); |
stubVal, playerUniversalRaceName = UnitRace("player"); |
if UnitExists("pet") then -- Get current Pet data to build the corresponding lookup table |
petFamily = UnitCreatureFamily("pet"); |
end |
SetLookupOrder(); |
lookupOrderTableInitialized = true; |
elseif lookupOrderTableInitialized then |
if event == "UNIT_PET" or event == "PET_SPECIALIZATION_CHANGED" then |
if not playerUniversalClassName or not LookupOrder_table[playerUniversalClassName] then |
return; -- Build lookup table for Pet only after we built the lookup table for Class |
end |
petFamily = UnitCreatureFamily("pet"); |
if not petFamily then -- UNIT_PET fires several times when a pet is lost and when a |
return; -- new one is called; we'll get the new pet info eventually but |
end -- wait til it's up. |
setCurrentPetFirstInLookupOrder(); |
else |
SetLookupOrder(); |
end |
end |
-- for i = 1, #LookupOrder_table do |
-- local classKey = LookupOrder_table[i]; |
-- print(AddonName.. ": ".. i.. ". ".. tostring(classKey)); |
-- for ii = 1, #(LookupOrder_table[classKey]) do |
-- local specKey = LookupOrder_table[classKey][ii]; |
-- print(AddonName.. ": ".. i.. ".".. ii.. ". ".. tostring(specKey)); |
-- if type(LookupOrder_table[classKey][specKey]) == "table" then |
-- for iii = 1, #(LookupOrder_table[classKey][specKey]) do |
-- local subTableKey = LookupOrder_table[classKey][specKey][iii]; |
-- print(AddonName.. ": ".. i.. ".".. ii.. ".".. iii.. ". ".. tostring(subTableKey)); |
-- end |
-- end |
-- end |
-- end |
end); |
-- API -- |
--------- |
-- Return SpellID of the English Spell Name |
LibSN2SID.SID = setmetatable( |
{}, -- We do start with an empty table, passed as 'tbl' to '__index' bellow. |
{ __index = function(tbl, engSpellName) -- If spell name not found in 'tbl'. |
local paramType = type(engSpellName); |
-- print(AddonName.. ": ".. engSpellName.. " is a ".. paramType); |
if (paramType == "string") then |
for classIndex = 1, #LookupOrder_table do |
local classKey = LookupOrder_table[classIndex]; |
-- print(AddonName.. ": ".. tostring(classKey)); |
for specIndex = 1, #(LookupOrder_table[classKey]) do |
local specKey = LookupOrder_table[classKey][specIndex]; |
local spID = LibSN2SID.DB[classKey][specKey][engSpellName] or nil; |
if spID then |
return spID; -- FOUND IT! |
end |
-- if specKey == "Flyouts" or specKey == "Pets" then |
if LookupOrder_table[classKey][specKey] ~= nil and type(LookupOrder_table[classKey][specKey]) == "table" then |
local subTableKey = (next(LibSN2SID.DB[classKey][specKey], nil)); |
while subTableKey do |
-- print(tostring(classKey).. " ".. tostring(specKey).. " ".. tostring(subTableKey)); |
local spID = LibSN2SID.DB[classKey][specKey][subTableKey][engSpellName] or nil; |
if spID then |
return spID; -- FOUND IT! |
end |
subTableKey = (next(LibSN2SID.DB[classKey][specKey], subTableKey)); |
end |
end |
end |
end |
-- Didn't find the given spell name in our database. So try and get it from game API |
local locSpellName, _, _, _, _, _, spID = GetSpellInfo(engSpellName); |
return spID; |
elseif (paramType == "number") then |
local locSpellName = (GetSpellInfo(engSpellName)); |
-- print(tostring(locSpellName)); |
if locSpellName then |
return engSpellName; |
else |
return nil; |
end |
else |
-- TODO: error() ? |
return nil; |
end |
end |
} |
); |
-- For backwards compatibility (LibSpellName2SID_MINOR < 10008) |
LibSN2SID.ID = LibSN2SID.SID; |
-- Return Localised Name of the English Spell Name |
LibSN2SID.LSN = setmetatable( |
{}, -- We do start with an empty table, passed as 'tbl' to '__index' bellow. |
{ __index = function(tbl, engSpellName) |
-- print("LSN __index"); |
local paramType = type(engSpellName); |
-- print(AddonName.. ": ".. engSpellName.. " is a ".. paramType); |
if paramType == "string" then |
for classIndex = 1, #LookupOrder_table do |
local classKey = LookupOrder_table[classIndex]; |
-- print(AddonName.. ": ".. tostring(classKey)); |
for specIndex = 1, #(LookupOrder_table[classKey]) do |
local specKey = LookupOrder_table[classKey][specIndex]; |
-- print(AddonName.. ": ".. tostring(specKey)); |
local spID = LibSN2SID.DB[classKey][specKey][engSpellName] or nil; |
if spID then |
-- print("Found in ".. classKey.. ": ".. specKey); |
local locSpellName = (GetSpellInfo(spID)); -- Localised spell name |
return locSpellName; -- FOUND IT! |
end |
-- if specKey == "Flyouts" or specKey == "Pets" then |
if LookupOrder_table[classKey][specKey] ~= nil and type(LookupOrder_table[classKey][specKey]) == "table" then |
local subTableKey = (next(LibSN2SID.DB[classKey][specKey], nil)); |
while subTableKey do |
-- print(tostring(classKey).. " ".. tostring(specKey).. " ".. tostring(subTableKey)); |
local spID = LibSN2SID.DB[classKey][specKey][subTableKey][engSpellName] or nil; |
if spID then |
local locSpellName = (GetSpellInfo(spID)); -- Localised spell name |
return locSpellName; -- FOUND IT! |
end |
subTableKey = (next(LibSN2SID.DB[classKey][specKey], subTableKey)); |
end |
end |
end |
end |
-- Didn't find the given spell name in our database. So try and get it from game API |
local locSpellName, _, _, _, _, _, spID = GetSpellInfo(engSpellName); |
return locSpellName; |
elseif paramType == "number" then |
local locSpellName = (GetSpellInfo(engSpellName)); |
-- print(locSpellName); |
return locSpellName; |
else |
-- TODO: error() ? |
return nil; |
end |
end |
} |
); |
-- Get the number of spells in the database |
-- TODO: Redo for new DB structure in 10008+ ! |
function LibSN2SID:GetNumSpells() |
-- local count = 0; |
-- for _ in pairs(LibSN2SID.DB) do |
-- count = count + 1; |
-- end |
-- return count; |
end |
-- REMOVED. This was in twobits' original version (10000), when it was still |
-- only used in ReadySpells. With my release of LibSpellName2SID as a freely |
-- accessible library, the implications of calling this function are not clear |
-- to me. Therefore, at least for now, this function will be made unaccessible. |
-- Clean up (free the RAM) if the data isn't needed anymore |
-- NB: 'Clean up ONLY IF we're (embeded) ...' feature added by aallkkaa |
function LibSN2SID:Cleanup() |
--[[ |
-- Clean up ONLY IF we're (embeded) within the scope of another addon, |
-- not if we're a Global library, which may be in use by several addons. |
-- print("LibSN2SID.owner = ".. LibSN2SID.owner); |
-- print("LibSN2SID: AddonName = ".. AddonName); |
if LibSN2SID.owner ~= "LibSpellName2SID-1.0" then |
LibSN2SID.DB = {}; |
-- print(AddonName.. ": LibSN2SID.DB NOW has ".. LibSN2SID.GetNumSpells().. " keys."); |
return true; |
else |
-- print(AddonName.. ": LibSN2SID.DB STILL has ".. LibSN2SID.GetNumSpells().. " keys."); |
-- TODO: error(); |
return false; |
end |
]]-- |
end |
------------------------------------------ |
-- print(AddonName.. ": LibSN2SID.DB has ".. LibSN2SID.GetNumSpells().. " keys."); |
## Interface: 80000 |
## Title: Lib: SpellName2SID-1.0 |
## Notes: Table of English Spell Names and corresponding Spell IDs |
## Version: 1.0.12 |
## LoadOnDemand: 1 |
## Author: aallkkaa |
## X-Original-Author: twobits |
## X-Credits: benots4 |
## X-Category: Library |
## X-WoWI-ID: 24509 |
LibStub\LibStub.lua |
LibSpellName2SID-1.0\LibSpellName2SID-1.0.lua |
#test.lua |
local AddonName, AddonEnv = ...; |
local LIBSN2SID = LibStub:GetLibrary("LibSpellName2SID"); |
local SID = LIBSN2SID.SID; |
local LSN = LIBSN2SID.LSN; |
print(AddonName.. ": Starting test!"); |
local Frame = CreateFrame("Frame"); |
Frame:RegisterEvent("PLAYER_LOGIN"); -- Not enough data from game til this event fires. |
-- Frame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED"); -- This talent and/or the one in the line bellow |
-- Frame:RegisterEvent("PLAYER_TALENT_UPDATE"); -- should fire when the player switches spec. |
-- TESTED: Both of these fire Twice on Changing |
-- spec. On Login but "ACTIVE_..." fires Once, |
-- but "PLAYER_TALENT_..." fires Twice. |
-- Frame:RegisterEvent("PLAYER_ENTERING_WORLD"); |
Frame:SetScript("OnEvent", function() |
C_Timer.After(3, function() |
if SID and LSN then |
local startTime = GetTime(); |
print(AddonName.. tostring(": SID and LSN found.")); |
local endTime = GetTime(); |
print("print time with tostring(...) = ".. (endTime - startTime).. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Auto Attack\"] = ".. tostring(SID["Auto Attack"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": LSN[\"Auto Attack\"] = ".. tostring(LSN["Auto Attack"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Made It Up\"] = ".. tostring(SID["Made It Up"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": LSN[\"Made It Up\"] = ".. tostring(LSN["Made It Up"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[210873] = ".. tostring(SID[210873])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": LSN[210873] = ".. tostring(LSN[210873])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[6603] = ".. tostring(SID[6603])); |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": LSN[6603] = ".. tostring(LSN[6603])); |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Lightning Bolt\"] = ".. tostring(SID["Lightning Bolt"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": LSN[\"Lightning Bolt\"] = ".. tostring(LSN["Lightning Bolt"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Taunt\"] = ".. tostring(SID["Taunt"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": LSN[\"Taunt\"] = ".. tostring(LSN["Taunt"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Hex\"] = ".. tostring(SID["Hex"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Hex(Spider)\"] = ".. tostring(SID["Hex(Spider)"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Web Spray\"] = ".. tostring(SID["Web Spray"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Gift of the Naaru\"] = ".. tostring(SID["Gift of the Naaru"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[\"Hex\"] = ".. tostring(LSN["Hex"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[\"Hex(Spider)\"] = ".. tostring(LSN["Hex(Spider)"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime() *1000000; |
print(AddonName.. ": LSN[\"Web Spray\"] = ".. tostring(LSN["Web Spray"])); -- |
endTime = GetTime() *1000000; |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": LSN[\"Gift of the Naaru\"] = ".. tostring(LSN["Gift of the Naaru"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
else |
print(AddonName.. ": SID and/or LSN not found."); |
end |
end); |
end); |
local AddonName, AddonEnv = ...; |
local LIBSN2SID = LibStub:GetLibrary("LibSpellName2SID"); |
local SID = LIBSN2SID.SID; |
local LSN = LIBSN2SID.LSN; |
print("print time with tostring(...) = ".. (endTime - startTime).. "ns."); |
startTime = GetTime(); |
print(AddonName.. ": SID[\"Auto Attack\"] = ".. SID["Auto Attack"]); -- |
print(AddonName.. ": SID[\"Auto Attack\"] = ".. tostring(SID["Auto Attack"])); -- |
endTime = GetTime(); |
print(AddonName.. "... in ".. endTime - startTime.. "ns."); |
end |
racialKey = (next(LibSN2SID.DB.General.Racials, racialKey)); |
end |
-- elseif categoryKey ~= "METADATA" then -- Currentlu not on the database |
-- tinsert(LookupOrder_table.General, categoryKey); |
-- elseif categoryKey ~= "METADATA" then -- Currentlu not in the database |
else |
tinsert(LookupOrder_table.General, categoryKey); |
end |
categoryKey = (next(LibSN2SID.DB.General, categoryKey)); |
end |
## Interface: 80000 |
## Title: Lib: SpellName2SID-1.0 |
## Notes: Table of English Spell Names and corresponding Spell IDs |
## Version: 1.0.12b |
## Version: 1.0.12 |
## LoadOnDemand: 1 |
## Author: aallkkaa |
## X-Original-Author: twobits |
---------- |
-- (C) 2017-2018 by aallkkaa |
-- http://www.wowinterface.com/forums/member.php?action=getinfo&userid=335646 |
-- |
-- LibSpellName2SID-1.0: Populator |
-- Notes: Populates the library's database |
-- http://svn.wowinterface.com/listing.php?repname=LibSpellName2ID&path=%2Fpopulator%2F#_populator_ |
---------- |
local AddonName, AddonEnv = ...; |
-- Local copies of the saved variables' tables: SpellNamesAndIDs and SpellNamesAndIDs_PASSIVES |
-- local SN2SID_table, SN2SID_PASSIVES_table; |
-- Stuff |
local NumberOfTalentTiers = 7; -- Current number of talent tiers - WoW-7.x.y and 8.x.y |
-- local NumberOfPVPTalentTiers = 6; -- Current number of PVP talent tiers - WoW-7.x.y |
local NumberOfPVPTalentSlots = 4; -- Current number of PVP talent tiers - WoW-8.x.y |
-- "Manually" added/modified spells - normally AFTER regular update functions were called |
local postUpdate_Spells2Add = { |
["General"] = { |
["ZoneAbilities"] = { |
-- TODO: Maybe a hooksecurefunc(ZoneAbilityFrame, "Show", function())? |
-- Also check: /dump Enum.ZoneAbilityType |
-- Dump: value=Enum.ZoneAbilityType |
-- [1]={ |
-- Argus=2, |
-- OrderHall=1, |
-- Garrison=0 |
-- } |
-- |
-- Draenor -- These are never added to the Spellbook |
["Garrison Ability"] = 161691, -- Cast the Garrison/Outpost ability active on the zone |
["Call to Arms"] = 161676, -- Shadowmoon Valley /Frostfire Ridge |
["Artillery Strike"] = 162075, -- Talador outpost |
["Guardian Orb"] = 161767, -- Talador outpost |
["Summon Mechashredder 5000"] = 164050, -- Gorgrond outpost |
["Champion's Honor"] = 164221, -- Gorgrond outpost |
["Smuggling Run!"] = 170108, -- Spires of Arak |
["Home Away from Home"] = 168487, -- Spires of Arak |
["Telaari Siege Engine"] = 160240, -- Nagrand |
["Telaari Talbuk"] = 165803, -- Nagrand (Alliance) |
["Frostwolf War Wolf"] = 164222, -- Nagrand (Horde) |
-- Argus |
["Vindicaar Matrix Crystal"] = 251463, -- Cast the one active of the other four |
["Light's Judgment"] = 247427, |
["Summon Lightforged Warframe"] = 250436, |
["Fel Heart Bond"] = 248011, -- Passive workings? - tooltip says "Instant" |
["Shroud of Arcane Echoes"] = 248779, |
}, |
}, |
["DEATHKNIGHT"] = { |
["Pets"] = { |
["Ghoul"] = { -- The Unholy DK regular Ghoul can be temporarily turned to an empowered |
-- version (by casting 'Dark Transformation' spell), but it's still a |
-- "Ghoul", even though the spells do change: |
["Sweeping Claws"] = 91778, |
["Monstrous Blow"] = 91797, |
["Shambling Rush"] = 91802, |
["Putrid Bulwark"] = 91837, |
-- In case the DK is not Unholy OR has the talent 'Sludge Belcher' active (see |
-- bellow), these arethe standard Ghoul abilities: |
["Claw"] = 47468, |
["Gnaw"] = 47481, |
["Leap"] = 47482, |
["Huddle"] = 47484, |
}, |
-- The Unholy spec talent "Sludge Belcher" which summoned an Abomination instead of a |
-- Ghoul before 8.0.1 is no longer ingame. AFAIK, this type of DK pet is now gone. |
-- ["Abomination"] = { -- If the talent 'Sludge Belcher' is taken, the Ghoul becomes an |
-- -- 'Abomination' instead. |
-- ["Cleaver"] = 212333, |
-- ["Smash"] = 212336, |
-- ["Hook"] = 212468, |
-- ["Protective Bile"] = 212384, |
-- -- 'Abomination' + 'Dark Transformation': |
-- ["Vile Gas"] = 212338, |
-- ["Gastric Bloat"] = 212383, |
-- }, |
}, |
}, |
["HUNTER"] = { |
["Pets"] = { |
["Ferocity"] = { -- Some pets bite, some claw and some smack (Basic Ability) |
["Bite"] = 17253, |
["Claw"] = 16827, |
["Smack"] = 49966, |
}, |
["Tenacity"] = { -- Some pets bite and some pets claw ... |
["Bite"] = 17253, |
["Claw"] = 16827, |
["Smack"] = 49966, |
}, |
["Cunning"] = { -- Some pets bite and some pets claw ... |
["Bite"] = 17253, |
["Claw"] = 16827, |
["Smack"] = 49966, |
}, |
-- We categorize Hunter Pet spells mainly by their specialiZations, but some pet |
-- families also have Special abilites. And yes, same-name diff-ID spells do occur. |
-- Spell types: Special, Bonus and Exotic |
["Basilisk"] = { |
["Stone Scales"] = 159733, |
}, |
["Bear"] = { |
["Rest"] = 94019, |
}, |
["Beetle"] = { |
["Harden Carapace"] = 90339, |
}, |
["Bird of Prey"] = { |
["Trick"] = 94022, |
}, |
["Carrion Bird"] = { |
["Bloody Screech"] = 24423, |
}, |
["Cat"] = { |
["Prowl"] = 24450, |
}, |
["Chimaera"] = { |
["Frost Breath"] = 54644, |
["Froststorm Breath"] = 92380, |
}, |
["Clefthoof"] = { |
["Thick Hide"] = 160057, |
}, |
["Core Hound"] = { |
["Ancient Hysteria"] = 90355, |
["Molten Hide"] = 159788, |
}, |
["Crab"] = { |
["Harden Shell"] = 159926, |
}, |
["Crane"] = { |
["Gift of Chi-Ji"] = 159931, |
["Trick"] = 126259, |
}, |
["Crocolisk"] = { |
["Ankle Crack"] = 50433, |
}, |
["Devilsaur"] = { |
["Feast"] = 159953, |
["Monstrous Bite"] = 54680, |
}, |
["Direhorn"] = { |
["Reflective Armor Plating"] = 137798, |
}, |
["Fox"] = { |
["Agile Reflexes"] = 160011, |
["Play"] = 90347, |
}, |
["Monkey"] = { |
["Primal Agility"] = 160044, |
}, |
["Moth"] = { |
["Dust of Life"] = 159956, |
}, |
["Nether Ray"] = { |
["Netherwinds"] = 160452, |
}, |
["Quilen"] = { |
["Eternal Guardian"] = 126393, |
["Stone Armor"] = 160049, |
}, |
["Riverbeast"] = { |
["Gruesome Bite"] = 160018, |
}, |
["Rodent"] = { |
["Rest"] = 126364, |
}, |
["Rylak"] = { |
["Updraft"] = 160007, |
}, |
["Scorpid"] = { |
["Deadly Sting"] = 160060, |
}, |
["Shale Spider"] = { |
["Solid Shell"] = 160063, |
}, |
["Silithid"] = { |
["Tendon Rip"] = 160065, |
}, |
["Spider"] = { |
["Web Spray"] = 160067, |
}, |
["Spirit Beast"] = { |
["Spirit Mend"] = 90361, |
["Spirit Walk"] = 90328, |
}, |
["Turtle"] = { |
["Shell Shield"] = 26064, |
}, |
["Warp Stalker"] = { |
["Warp Time"] = 35346, |
}, |
["Water Strider"] = { |
["Surface Trot"] = 126311, |
}, |
["Worm"] = { |
["Burrow Attack"] = 93433, |
}, |
}, |
}, |
["MAGE"] = { |
["Flyouts"] = { |
["Polymorph Variants"] = { -- On WoW 7.x.y, Polymorph variants (including the default |
-- "Sheep") are all called "Polymorph", but unlike the |
-- Shaman Hex, these variants do bear information about the |
-- variant via GetSpellInfo(), on its 2nd return value |
-- (spell "rank" / spell subname). This subname can be |
-- suffixed onto the spell name to specify the variant, as |
-- in e.g. "Polymorph(Sheep)"; works with GetSpellInfo(). |
-- On WoW 8.x.y Beta. the above still holds true, except the |
-- part of the 2nd return value (as Spells' Subnames/Ranks |
-- have all been removed from the game). "Polymorph(Sheep)" |
-- still works for GetSpellInfo() though, as well as for |
-- "7cast". |
["Polymorph(Black Cat)"] = 61305, |
["Polymorph(Monkey)"] = 161354, |
["Polymorph(Penguin)"] = 161355, -- No longer obtainable, but still usable if |
-- you'd gotten it before ...? |
["Polymorph(Pig)"] = 126819, |
["Polymorph(Polar Bear Cub)"] = 161353, |
["Polymorph(Rabbit)"] = 61721, |
["Polymorph(Serpent)"] = 61025, -- No longer obtainable, but still usable if |
-- you'd gotten it before ...? |
["Polymorph(Turkey)"] = 61780, -- No longer obtainable, but still usable if |
-- you'd gotten it before ...? |
["Polymorph(Turtle)"] = 28271, |
-- NB: There is a "Tome of Polymorph: Porcupine" whose tooltip says "Use: Teaches |
-- Polymorph: Porcupine", but in fact teaches "Polymorph: Pig". |
}, |
-- The 'Portal: ' and 'Teleport: ' flyouts have (mostly) different destinations for |
-- Alliance and for Horde Magi. Thus, we'll add them all here (incl. faction-shared): |
["Portal"] = { |
["Portal: Exodar"] = 32266, -- Alliance only |
["Portal: Stonard"] = 49361, -- Horde only |
["Portal: Undercity"] = 11418, -- Horde only |
["Portal: Vale of Eternal Blossoms(Alliance)"] = 132620, -- Added: "(Alliance)" |
["Portal: Vale of Eternal Blossoms(Horde)"] = 132626, -- Added: "(Horde)" |
["Ancient Portal: Dalaran"] = 120146, -- Dalaran Crater (way ABOVE it! -> FALL!) |
["Portal: Tol Barad(Alliance)"] = 88345, -- Added: "(Alliance)" |
["Portal: Tol Barad(Horde)"] = 88346, -- Added: "(Horde)" |
["Portal: Shattrath(Alliance)"] = 33691, -- Added: "(Alliance)" |
["Portal: Shattrath(Horde)"] = 35717, -- Added: "(Horde)" |
["Portal: Warspear"] = 176244, -- Horde only |
["Portal: Theramore"] = 49360, -- Alliance only |
["Portal: Thunder Bluff"] = 11420, -- Horde only |
["Portal: Darnassus"] = 11419, -- Alliance only |
["Portal: Silvermoon"] = 32267, -- Horde only |
["Portal: Dalaran - Northrend"] = 53142, |
["Portal: Stormwind"] = 10059, -- Alliance only |
["Portal: Stormshield"] = 176246, -- Alliance only |
["Portal: Dalaran - Broken Isles"] = 224871, |
["Portal: Orgrimmar"] = 11417, -- Horde only |
["Portal: Ironforge"] = 11416, -- Alliance only |
["Portal: Dalaran - Broken Isles"] = 224871, |
}, |
["Teleport"] = { |
["Teleport: Vale of Eternal Blossoms(Alliance"] = 132621, -- Added: "(Alliance)" |
["Teleport: Vale of Eternal Blossoms(Horde)"] = 132627, -- Added: (Horde) |
["Teleport: Dalaran - Northrend"] = 53140, |
["Teleport: Shattrath(Alliance)"] = 33690, -- Added: "(Alliance)" |
["Teleport: Shattrath(Horde)"] = 35715, -- Added: "(Horde)" |
["Teleport: Stonard"] = 49358, -- Horde only |
["Teleport: Stormshield"] = 176248, -- Alliance only |
["Teleport: Darnassus"] = 3565, -- Alliance only |
["Teleport: Dalaran - Broken Isles"] = 224869, |
["Teleport: Stormwind"] = 3561, -- Alliance only |
["Teleport: Hall of the Guardian"] = 193759, -- Mage Class Hall |
["Teleport: Tol Barad(Alliance)"] = 88342, -- Added: "(Alliance)" |
["Teleport: Tol Barad(Horde)"] = 88344, -- Added: "(Horde)" |
["Teleport: Orgrimmar"] = 3567, -- Horde only |
["Teleport: Ironforge"] = 3562, -- Alliance only |
["Teleport: Warspear"] = 176242, -- Horde only |
["Teleport: Theramore"] = 49359, -- Alliance only |
["Teleport: Silvermoon"] = 32272, -- Horde only |
["Teleport: Undercity"] = 3563, -- Horde only |
["Ancient Teleport: Dalaran"] = 120145, -- Dalaran Crater (way ABOVE it! -> FALL!) |
["Teleport: Exodar"] = 32271, -- Alliance only |
["Teleport: Thunder Bluff"] = 3566, -- Horde only |
}, |
}, |
-- NB: Only the Frost spec has a pet ('Water Elemental') |
}, |
["ROGUE"] = { |
["Flyouts"] = { |
["Poisons"] = { -- Got some weird Lua error upon fecthing these. Consequently, this list |
-- would sometimes be empty, sometimes get only one spell and. at best, |
-- get only three ('Leeching Poison' would always be missing). The same |
-- code works fine for Hunter flyouts (and the other classes as well). |
["Wound Poison"] = 8679, |
["Crippling Poison"] = 3408, |
["Deadly Poison"] = 2823, |
["Leeching Poison"] = 108211, |
}, |
}, |
}, |
["SHAMAN"] = { |
["Elemental"] = { |
["Bloodlust"] = 2825, -- Horde |
["Heroism"] = 32182, -- Alliance |
}, |
["Enhancement"] = { |
["Bloodlust"] = 2825, -- Horde |
["Heroism"] = 32182, -- Alliance |
}, |
["Restoration"] = { |
["Bloodlust"] = 2825, -- Horde |
["Heroism"] = 32182, -- Alliance |
}, |
["Flyouts"] = { |
["Hex Variants"] = { -- Unlike Mage's Polymorph, Shaman Hex variants all get the |
-- same spell name ("Hex", same as default spell) AND NO |
-- spell subname, although they do get different spell IDs, |
-- icon textures, ... BUT we cannot have the same key value |
-- ("Hex") multiple times; thus we'll create our own (re) |
-- naming of Hex variants here, replacing the fetched list |
-- with one that follows the Mage's Polymorph Variants |
-- convention: "Spell(Variant)". |
-- Also, see note above, on Polymorph and WoW 8.x.y Beta. |
["Hex(Cockroach)"] = 211015, |
["Hex(Compy)"] = 210873, |
["Hex(Snake)"] = 211010, |
["Hex(Spider)"] = 211004, |
}, |
}, |
["Pets"] = { -- In WoW 7.x.y, only the Elemental specialization has pets, which are only |
-- controllable if the talent "Primal Elementalist"(5,2) is active (they're |
-- guardians (no spells castable by the player) otherwise). On top of that, |
-- although the Earth Elemental is always available to the Elemental Shaman |
-- , the Fire and Storm elementals are mutually exclusive (Fire Elemental |
-- becomes Storm Elemental if the talent "Storm Elemental" is chosen). |
-- TL;DR: Better make sure the spells bellow are added, rather than going |
-- through the gimmick of swithcing the talents every time we update the |
-- SHAMAN lists of spells. |
["Fire Elemental"] = { |
["Meteor"] = 117588, -- Was "Fire Nova" (same ID) on WoW-7.x.y |
["Fire Blast"] = 57984, |
["Immolate"] = 118297, |
}, |
["Storm Elemental"] = { |
-- ["Eye of the Storm"] = 157382, -- WoW-8.0.1: This spell ID still reports the same |
-- name (via GetSpellInfo()), but the name returns |
-- the "new"spell ID which was previously "Gale |
-- Force". NB: The spell IS added automativlly! |
["Wind Gust"] = 157331, |
["Eye of the Storm"] = 157375, -- Was "Gale Force" (same ID, but different spell). |
["Call Lightning"] = 157348, |
}, |
["Earth Elemental"] = { |
["Pulverize"] = 118345, -- Stun |
["Harden Skin"] = 118337, -- -40% damage taken by the Shaman |
["Angered Earth"] = 36213, -- Taunt |
}, |
}, |
}, |
["WARLOCK"] = { |
["Pets"] = { -- Spells of the glyph-enhanced versions of the regular Warlock Demons. |
-- NB: We're including spells that remain the same on both versions of the |
-- demon. |
["Fel Imp"] = { |
["Felbolt"] = 115746, -- Fel Imp |
["Sear Magic"] = 115276, -- Fel Imp |
["Cauterize Master"] = 119905, -- Fel Imp & Imp |
["Flee"] = 89792, -- Fel Imp & Imp |
}, |
["Voidlord"] = { |
["Void Shield"] = 115236, -- Voidlord |
["Suffering"] = 119907, -- Voidlord & Voidwalker |
["Consuming Shadows"] = 3716, -- Voidlord & Voidwalker |
["Shadow Bulwark"] = 17767, -- Voidlord & Voidwalker |
["Threatening Presence"] = 112042, -- Voidlord & Voidwalker |
-- NB: Voidlord & Voidwalker 's "Threatening Presence" has a different spell ID than |
-- that of Wrathguard & Felguard. |
}, |
["Observer"] = { |
["Optical Blast"] = 115781, -- Observer |
["Tongue Lash"] = 115778, -- Observer |
["Devour Magic"] = 19505, -- Observer & Felhunter |
}, |
["Shivarra"] = { |
["Bladedance"] = 115748, -- Shivarra |
["Fellash"] = 115770, -- Shivarra |
["Mesmerize"] = 115268, -- Shivarra |
["Lesser Invisibility"] = 7870, -- Shivarra & Succubus |
}, |
["Wrathguard"] = { |
["Mortal Cleave"] = 115625, -- Wrathguard |
["Wrathstorm"] = 115831, -- Wrathguard |
["Axe Toss"] = 89766, -- Wrathguard & Felguard |
["Pursuit"] = 30151, -- Wrathguard & Felguard |
["Threatening Presence"] = 134477 -- Wrathguard & Felguard |
-- NB: Voidlord & Voidwalker 's "Threatening Presence" has a different spell ID than |
-- that of Wrathguard & Felguard. |
}, |
}, |
}, |
}; |
local postUpdate_Spells2Add_PASSIVES = { |
["General"] = { |
["ZoneAbilities"] = { |
-- Draenor |
["Dragoon"] = 169605, |
["Swift Recovery"] = 169608, |
["Trading Pact"] = 170200, |
["Upgrades"] = 170733, |
}, |
}, |
["DEATHKNIGHT"] = { |
["Pets"] = { |
-- With talent 'Sludge Belcher': |
["Ghoul"] = { |
["Avoidance"] = 62137, |
}, |
-- The Unholy spec talent "Sludge Belcher" which summoned an Abomination instead of a |
-- Ghoul before 8.0.1 is no longer ingame. AFAIK, this type of DK pet is now gone. |
-- ["Abomination"] = { |
-- ["Avoidance"] = 62137, |
-- }, |
}, |
}, |
["WARLOCK"] = { |
["Pets"] = { -- Spells of the glyph-enhanced versions of the regular Warlock Demons. |
-- NB: We're including spells that remain the same on both versions. |
["Fel Imp"] = { |
["Avoidance"] = 32233, -- Fel Imp & Imp |
}, |
["Voidlord"] = { |
["Avoidance"] = 32233, -- Voidlord & Voidwalker |
["Void Reflexes"] = 117225, -- Voidlord & Voidwalker |
}, |
["Observer"] = { |
["Avoidance"] = 32233, -- Observer & Felhunter |
}, |
["Shivarra"] = { |
["Avoidance"] = 32233, -- Shivarra & Succubus |
}, |
["Wrathguard"] = { |
["Avoidance"] = 32233, -- Wrathguard & Felguard |
["Void Reflexes"] = 117225, -- Wrathguard & Felguard |
}, |
}, |
}, |
}; |
-- Functions to store information about the dataSource (how up to date it is) and other metadata -- |
---------------------------------------------------------------------------------------------------- |
-- Update the General tab dataSource + raceBuilds -- |
local updateGeneralTabMetadata_func = function(SN2SID_table, SN2SID_PASSIVES_table, curLocale, gameBuild, universalRaceName, generalTabName, charLevel) |
if not updateGeneralTabMetadata then |
return; |
end |
-- print(AddonName.. ": Will now check whether the GeneralTab Metadata needs updating."); |
-- Actively-cast spells |
if charLevel > SN2SID_table[generalTabName].METADATA.dataSource.charLevel then |
SN2SID_table[generalTabName].METADATA.dataSource.charLevel = charLevel; |
if charLevel > SN2SID_table[generalTabName].METADATA.dataSource.charMaxLevel then |
SN2SID_table[generalTabName].METADATA.dataSource.charMaxLevel = charLevel; |
end |
updateGeneralSpells = true; |
end |
if gameBuild > SN2SID_table[generalTabName].METADATA.dataSource.gameBuild then |
SN2SID_table[generalTabName].METADATA.dataSource.gameBuild = gameBuild; |
-- Highest charLevel stored upon the most recent gameBuild |
SN2SID_table[generalTabName].METADATA.dataSource.charLevel = charLevel; |
-- Highest charLevel ever stored is kept in [...].charMaxLevel |
updateGeneralSpells = true; |
end |
if (not SN2SID_table[generalTabName].METADATA.raceBuilds[universalRaceName]) or |
(gameBuild > SN2SID_table[generalTabName].METADATA.raceBuilds[universalRaceName]) then |
SN2SID_table[generalTabName].METADATA.raceBuilds[universalRaceName] = gameBuild; |
updateGeneralSpells = true; |
end |
-- Passive spells |
if charLevel > SN2SID_PASSIVES_table[generalTabName].METADATA.dataSource.charLevel then |
SN2SID_PASSIVES_table[generalTabName].METADATA.dataSource.charLevel = charLevel; |
if charLevel > SN2SID_PASSIVES_table[generalTabName].METADATA.dataSource.charMaxLevel then |
SN2SID_PASSIVES_table[generalTabName].METADATA.dataSource.charMaxLevel = charLevel; |
end |
updateGeneralSpells = true; |
end |
if gameBuild > SN2SID_PASSIVES_table[generalTabName].METADATA.dataSource.gameBuild then |
SN2SID_PASSIVES_table[generalTabName].METADATA.dataSource.gameBuild = gameBuild; |
-- Highest charLevel stored upon the most recent gameBuild |
SN2SID_PASSIVES_table[generalTabName].METADATA.dataSource.charLevel = charLevel; |
-- Highest charLevel ever stored is kept in [...].charMaxLevel |
updateGeneralSpells = true; |
end |
if (not SN2SID_PASSIVES_table[generalTabName].METADATA.raceBuilds[universalRaceName]) or |
(gameBuild > SN2SID_PASSIVES_table[generalTabName].METADATA.raceBuilds[universalRaceName]) then |
SN2SID_PASSIVES_table[generalTabName].METADATA.raceBuilds[universalRaceName] = gameBuild; |
updateGeneralSpells = true; |
end |
updateGeneralTabMetadata = false; |
end |
-- Update the Class dataSource -- |
local updateClassMetadata_func = function(SN2SID_table, SN2SID_PASSIVES_table, curLocale, gameBuild, universalClassName, charLevel) |
if not updateClassMetadata then |
return; |
end |
-- print(AddonName.. ": Will now check whether the ".. universalClassName.. " Metadata needs updating."); |
-- Actively-cast spells |
if charLevel > SN2SID_table[universalClassName].METADATA.dataSource.charLevel then |
SN2SID_table[universalClassName].METADATA.dataSource.charLevel = charLevel; |
if charLevel > SN2SID_table[universalClassName].METADATA.dataSource.charMaxLevel then |
SN2SID_table[universalClassName].METADATA.dataSource.charMaxLevel = charLevel; |
end |
updateClassSpells = true; |
end |
if gameBuild > SN2SID_table[universalClassName].METADATA.dataSource.gameBuild then |
SN2SID_table[universalClassName].METADATA.dataSource.gameBuild = gameBuild; |
SN2SID_table[universalClassName].METADATA.dataSource.charLevel = charLevel; |
updateClassSpells = true; |
end |
-- Passive spells |
if charLevel > SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource.charLevel then |
SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource.charLevel = charLevel; |
if charLevel > SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource.charMaxLevel then |
SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource.charMaxLevel = charLevel; |
end |
updateClassSpells = true; |
end |
if gameBuild > SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource.gameBuild then |
SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource.gameBuild = gameBuild; |
SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource.charLevel = charLevel; |
updateClassSpells = true; |
end |
updateClassMetadata = false; |
end |
---- Functions to update the lists of Spell Names and their IDs ---- |
-------------------------------------------------------------------- |
-- Update the Talents' lists of spells |
local updateTalentSpells_func = function(SN2SID_table, SN2SID_PASSIVES_table, universalClassName, ClassNumSpecs, ClassSpecNames2IDs) |
if not updateClassSpells then -- Sanity check |
return; |
end |
for i = 1, ClassNumSpecs do |
-- Create "SpecName_Talents" subtables if they doesn't exist yet |
local specID, locSpecName = GetSpecializationInfo(i); |
if locSpecName then -- Sanity check |
-- print(AddonName.. ": locSpecName = ".. locSpecName); |
-- Actives |
if not SN2SID_table[universalClassName][locSpecName.."_Talents"] then |
SN2SID_table[universalClassName][locSpecName.."_Talents"] = {}; |
end |
-- Passives |
if not SN2SID_PASSIVES_table[universalClassName][locSpecName.."_Talents"] then |
SN2SID_PASSIVES_table[universalClassName][locSpecName.."_Talents"] = {}; |
end |
else |
print(AddonName.. ": PVE: NO specialization has been selected for this character!"); |
return; |
end |
-- Populate the "SpecName_Talents" subtables |
for ii = 1, NumberOfTalentTiers do |
for iii = 1, 3 do |
local _, spellName, _, _, _, spellID, _, _, _, _, _ = GetTalentInfoBySpecialization(i, ii, iii); |
if spellName then |
if IsPassiveSpell(spellID) then |
SN2SID_PASSIVES_table[universalClassName][locSpecName.."_Talents"][spellName] = spellID; |
else |
SN2SID_table[universalClassName][locSpecName.."_Talents"][spellName] = spellID; |
end |
end |
end |
end |
end |
end |
local updatePVPTalentSpells_func = function(SN2SID_table, SN2SID_PASSIVES_table, universalClassName, ClassNumSpecs, ClassSpecNames2IDs) |
if not updateClassSpells then -- Sanity check |
return; |
end |
for i = 1, ClassNumSpecs do |
-- Create "SpecName_PVPTalents" subtables if they don't exist yet |
local specID, locSpecName = GetSpecializationInfo(i); |
if locSpecName then -- Sanity check |
-- print(AddonName.. ": locSpecName = ".. locSpecName); |
-- Actives |
if not SN2SID_table[universalClassName][locSpecName.."_PVPTalents"] then |
SN2SID_table[universalClassName][locSpecName.."_PVPTalents"] = {}; |
end |
-- Passives |
if not SN2SID_PASSIVES_table[universalClassName][locSpecName.."_PVPTalents"] then |
SN2SID_PASSIVES_table[universalClassName][locSpecName.."_PVPTalents"] = {}; |
end |
else |
print(AddonName.. ": PVP: NO specialization has been selected for this character!"); |
return; |
end |
-- Populate the "SpecName_PVPTalents" subtables |
for ii = 1, NumberOfPVPTalentSlots do |
local talentOptions = C_SpecializationInfo.GetPvpTalentSlotInfo(ii).availableTalentIDs; |
for iii = 1, #talentOptions do |
-- local _, spellName, _, _, _, spellID, _, _, _, _, _ = GetPvpTalentInfoBySpecialization(i, ii, iii); |
local talentID = talentOptions[iii]; |
local _, spellName, _, _, _, spellID, _, _, _, _, _ = GetPvpTalentInfoByID(talentID); |
-- print(AddonName.. ": PVPTalent spellName = ".. tostring(spellName)); |
if spellName then |
if IsPassiveSpell(spellID) then |
SN2SID_PASSIVES_table[universalClassName][locSpecName.."_PVPTalents"][spellName] = spellID; |
else |
SN2SID_table[universalClassName][locSpecName.."_PVPTalents"][spellName] = spellID; |
end |
end |
end |
end |
end |
end |
-- Update the Spellbook's GeneralTab and ClassTabs lists of spells |
local updateSpellbookSpells_func = function(SN2SID_table, SN2SID_PASSIVES_table, generalTabName, universalClassName, ClassNumSpecs, ClassSpecNames2IDs) |
-- "Armor Skills" and "Weapon Skills" are found on the Spellbook's General tab, but are indeed |
-- different from one class to the other. Therefore, we'll save them into local variables upon |
-- fetching the General tab spells and then insert them into the Class Specialisations' tables. |
local armorSkills, weaponSkills; |
-- General tab spells |
-- if updateGeneralSpells then -- In current addon version, always true |
local _, universalRaceName = UnitRace("player"); |
if not SN2SID_table[generalTabName].Racials then |
SN2SID_table[generalTabName].Racials = {}; |
end |
if not SN2SID_PASSIVES_table[generalTabName].Racials then |
SN2SID_PASSIVES_table[generalTabName].Racials = {}; |
end |
if not SN2SID_table[generalTabName].GuildPerks then |
SN2SID_table[generalTabName].GuildPerks = {}; |
end |
if not SN2SID_PASSIVES_table[generalTabName].GuildPerks then |
SN2SID_PASSIVES_table[generalTabName].GuildPerks = {}; |
end |
if not SN2SID_table[generalTabName].Others then |
SN2SID_table[generalTabName].Others = {}; |
end |
if not SN2SID_PASSIVES_table[generalTabName].Others then |
SN2SID_PASSIVES_table[generalTabName].Others = {}; |
end |
local generalTabName, _, offset, numEntries, _, _, _ = GetSpellTabInfo(1); |
-- name, texture, offset, numEntries, isGuild, offspecID = GetSpellTabInfo(tabIndex) |
for i = offset +1, offset +numEntries do |
local spellName, spellSubName = GetSpellBookItemName(i, BOOKTYPE_SPELL); |
if spellName then |
local _, spellID = GetSpellBookItemInfo(i, BOOKTYPE_SPELL); |
-- Store Passive and Active abilities into their own separate tables |
if IsPassiveSpell(spellID) then |
if spellName == "Armor Skills" then |
armorSkills = spellID; |
elseif spellName == "Weapon Skills" then |
weaponSkills = spellID; |
elseif postUpdate_Spells2Add_PASSIVES.General.ZoneAbilities[spellName] then |
if not SN2SID_table[generalTabName].ZoneAbilities then |
SN2SID_PASSIVES_table[generalTabName].ZoneAbilities = { [spellName] = spellID }; |
else |
SN2SID_PASSIVES_table[generalTabName].ZoneAbilities[spellName] = spellID; |
end |
elseif spellSubName and strfind(spellSubName, "Racial") then |
if not SN2SID_PASSIVES_table[generalTabName].Racials[universalRaceName] then |
SN2SID_PASSIVES_table[generalTabName].Racials[universalRaceName] = { [spellName] = spellID }; |
else |
SN2SID_PASSIVES_table[generalTabName].Racials[universalRaceName][spellName] = spellID; |
end |
elseif spellSubName and strfind(spellSubName, "Guild") then |
if not SN2SID_PASSIVES_table[generalTabName].GuildPerks then |
SN2SID_PASSIVES_table[generalTabName].GuildPerks = { [spellName] = spellID }; |
else |
SN2SID_PASSIVES_table[generalTabName].GuildPerks[spellName] = spellID; |
end |
elseif not SN2SID_PASSIVES_table[generalTabName].Others then |
N2SID_PASSIVES_table[generalTabName].Others = { [spellName] = spellID }; |
else |
SN2SID_PASSIVES_table[generalTabName].Others[spellName] = spellID; |
end |
else |
if postUpdate_Spells2Add.General.ZoneAbilities[spellName] then |
if not SN2SID_table[generalTabName].ZoneAbilities then |
SN2SID_table[generalTabName].ZoneAbilities = { [spellName] = spellID }; |
else |
SN2SID_table[generalTabName].ZoneAbilities[spellName] = spellID; |
end |
elseif spellSubName and strfind(spellSubName, "Racial") then |
if not SN2SID_table[generalTabName].Racials[universalRaceName] then |
SN2SID_table[generalTabName].Racials[universalRaceName] = { [spellName] = spellID }; |
else |
SN2SID_table[generalTabName].Racials[universalRaceName][spellName] = spellID; |
end |
elseif spellSubName and strfind(spellSubName, "Guild") then |
if not SN2SID_table[generalTabName].GuildPerks then |
SN2SID_table[generalTabName].GuildPerks = { [spellName] = spellID }; |
else |
SN2SID_table[generalTabName].GuildPerks[spellName] = spellID; |
end |
elseif not SN2SID_table[generalTabName].Others then |
SN2SID_table[generalTabName].Others = { [spellName] = spellID }; |
else |
SN2SID_table[generalTabName].Others[spellName] = spellID; |
end |
end |
end |
end |
-- end |
-- Class spells |
if updateClassSpells then |
updateTalentSpells_func(SN2SID_table, SN2SID_PASSIVES_table, universalClassName, ClassNumSpecs, ClassSpecNames2IDs); |
updatePVPTalentSpells_func(SN2SID_table, SN2SID_PASSIVES_table, universalClassName, ClassNumSpecs, ClassSpecNames2IDs); |
for i = 2, (ClassNumSpecs +1) do |
-- Get the current tab's first spell's index, total number of spells therein and specID |
local _, _, offset, numEntries, _, _, _, specID = GetSpellTabInfo(i); |
if specID then -- Sanity check |
local _, locSpecName = GetSpecializationInfoByID(specID); |
--- Create SpecName subtables and SpecName_Talents subtables if they doesn't exist yet |
if locSpecName then -- Sanity check |
if not SN2SID_table[universalClassName][locSpecName] then |
SN2SID_table[universalClassName][locSpecName] = {}; |
end |
if not SN2SID_PASSIVES_table[universalClassName][locSpecName] then |
SN2SID_PASSIVES_table[universalClassName][locSpecName] = {}; |
end |
end |
-- Populate |
for ii = offset +1, offset +numEntries do |
local spellName, spellSubName = GetSpellBookItemName(ii, BOOKTYPE_SPELL); |
if spellName then |
local spellType, spellID = GetSpellBookItemInfo(ii, BOOKTYPE_SPELL); |
-- Store Passive and Active abilities into their own separate tables IF they |
-- are not already stored in the respective Talents' tables. |
if IsPassiveSpell(spellID) and ((not SN2SID_PASSIVES_table[universalClassName][locSpecName.."_Talents"]) |
or (not SN2SID_PASSIVES_table[universalClassName][locSpecName.."_Talents"][spellName])) then |
SN2SID_PASSIVES_table[universalClassName][locSpecName][spellName] = spellID; |
elseif (not SN2SID_table[universalClassName][locSpecName.."_Talents"]) |
or (not SN2SID_table[universalClassName][locSpecName.."_Talents"][spellName]) then |
SN2SID_table[universalClassName][locSpecName][spellName] = spellID; |
end |
-- If it's a Flyout type of button (e.g. Mage Polymorph variants, Hunter Pet |
-- Utility spells, etc), then fetch the spells that ... fly out. |
if spellType == "FLYOUT" then |
-- print(AddonName.. ": SpellID ".. spellID.. " on SpecTab ".. i.. ", Pos ".. ii.. " is a FLYOUT button."); |
-- if SN2SID_table[universalClassName].Flyouts == nil then |
if not SN2SID_table[universalClassName].Flyouts then |
tinsert(SN2SID_table[universalClassName], "Flyouts"); |
SN2SID_table[universalClassName].Flyouts = {}; |
end |
-- if SN2SID_table[universalClassName].Flyouts[spellName] == nil then |
if not SN2SID_table[universalClassName].Flyouts[spellName] then |
tinsert(SN2SID_table[universalClassName].Flyouts, spellName); |
SN2SID_table[universalClassName].Flyouts[spellName] = {}; |
end |
local _, _, numFlyouts, flyoutKnown = GetFlyoutInfo(spellID); |
-- if flyoutKnown then |
for flyoutSlot = 1, numFlyouts do |
-- local flyoutSpellID, overrideSpellID, flyoutSlotKnown, slotSpecID = GetFlyoutSlotInfo(spellID, flyoutSlot); |
local flyoutSpellID, _, _, _ = GetFlyoutSlotInfo(spellID, flyoutSlot); |
local flyoutSpellName, flyoutSpellSubname, _, _, _, _, _ = GetSpellInfo(flyoutSpellID); |
-- print(AddonName.. ": ".. tostring(flyoutSpellID).. " = ".. tostring(flyoutSpellName)); |
if spellName == "Hex Variants" then -- Shaman "Hex Variants" are |
-- all called "Hex"; therefore we'll use the |
-- hardcoded 'Hex(<variant>)' values, from the |
-- table 'postUpdate_Spells2Add' above, instead. |
-- if SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellID] == nil then |
-- print(AddonName.. "Adding flyout spellID ".. flyoutSpellID.. " = ".. flyoutSpellName); |
-- SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellID] = flyoutSpellName; |
-- end |
elseif spellName == "Polymorph Variants" then -- Mage "Polymorph |
-- Variants", like Shaman Hex Variants, are all |
-- called "Pollymorph". But they are different |
-- in that they, unlike Hex's, have a subname |
-- specifying the variant AND can be called by |
-- suffixing the subname in parenthesis, as in |
-- e.g. "Polymorph(Sheep)". We'll do just that. |
local flyoutSpellFullName = flyoutSpellName.. "(".. flyoutSpellSubname.. ")"; |
-- if SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellFullName] == nil |
if not SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellFullName] |
or SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellFullName] ~= flyoutSpellID then |
-- print(AddonName.. "Adding flyout spellFullName ".. flyoutSpellFullName.. " = ".. flyoutSpellID); |
SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellFullName] = flyoutSpellID; |
end |
elseif (spellName == "Portal" or spellName == "Teleport") and |
(strfind(flyoutSpellName, "Shattrath") or strfind(flyoutSpellName, "Tol Barad") or |
strfind(flyoutSpellName, "Vale of Eternal Blossoms")) then |
-- These spells have Alliance and Horde versions (same spell |
-- name, different spell IDs). We hardcoded them into post. |
elseif spellName == "Poisons" then |
-- There's some weird bug that only happens when fetching |
-- Rogue Poisons. Thus, we're hardcoding them into post |
-- update instead. |
elseif not SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellName] then |
SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellName] = flyoutSpellID; |
elseif SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellName] ~= flyoutSpellID then |
-- print(AddonName.. "Adding flyout spellName ".. flyoutSpellName.. " = ".. flyoutSpellID); |
SN2SID_table[universalClassName].Flyouts[spellName][flyoutSpellName] = flyoutSpellID; |
end |
end |
-- else |
-- print(AddonName.. ": BUT is unknown!"); |
-- end |
-- NB: AFAITIK, as far as Warlocks are concerned, only the Demonology |
-- specialization has the flyout spells: "Grimoire of Service"-> |
-- ->"Grimoire: Felguard", "Summon Demon"->"Summon Felguard" and |
-- "Summon Demon"->"Summon Wrathguard". But the Affliction and the |
-- Destruction specialiZations are also having these spells added into |
-- their lists of flyoutSpells spells (using the routine above). These |
-- spells are not actually available in the UI spellbook but we're |
-- leaving them on the table anyway. Note: Also makes it possible to |
-- implement the 'Flyouts' table per Class instead of per Spec. |
end |
end |
end |
SN2SID_PASSIVES_table[universalClassName][locSpecName]["Armor Skills"] = armorSkills; |
SN2SID_PASSIVES_table[universalClassName][locSpecName]["Weapon Skills"] = weaponSkills; |
end |
end |
updateClassSpells = false; |
end |
end |
-- Update the Pet-Spellbook and PetActionBar's spells -- |
-- Table of spellnames to exclude from storage |
local PetSpellNameExclusions = { PET_ASSIST, PET_ACTION_ATTACK, PET_DEFENSIVE,PET_ACTION_FOLLOW, |
PET_ACTION_MOVE_TO, PET_PASSIVE, "Stay" }; |
-- TABLE ABOVE: The 7 default actions for which GetSpellInfo() returns |
-- nil. QUESTION: Would it be desirable to save these spell references, |
-- which names would be the tokens (string) above? |
-- Pet Spells update function |
local updatePetSpellNames = function(SN2SID_table, SN2SID_PASSIVES_table, universalClassName) |
-- print(AddonName.. ": Fetching Pet spells"); |
-- local petHasSpellsConfirmed = false; |
-- NOTES: |
-- GetSpellInfo(spellName) is the most reliable way to get the SpellID for a give SpellName, 7th |
-- return value. BUT we need to get a list of spell names first, and that's where the other two |
-- Blizzard functions, GetPetActionInfo(buttonNumber) and GetSpellBookItemName(SpellbookIndex, |
-- BOOKTYPE_PET), come in. |
-- |
-- GetPetActionInfo(buttonNumber) only retrieves information for spells on the PetActionBar; |
-- given that there might be other Pet Spells - on the PetSpellbook - we will later need to get |
-- them using other means. But first we will get these spells from the bar, for these reasons: |
-- - One thing to note is the 'isToken' return value from GetPetActionInfo(). This value will be |
-- true if the spell is one of the 7 standard spells that every controllable pet gets: Assist, |
-- Attack, Defensive, Follow, Move To, Passive, Stay. This flag is NOT returned by any of the |
-- the other functions we get info on PetSpells from. Again, unfortunately, GetPetActionInfo() |
-- only returns info on spells in the PetActionBar and not all PetSpells are in there. |
-- Another important thing to note is that Temporary Controllable-pets (e.g. the Elemental |
-- Shaman pets, if the talent 'Primal Elementalist' is active) do not have any spells in a |
-- spellbook; but all their spells should be on the PetActionBar. Thus GetPetActionInfo is the |
-- only way - and the only way needed - to get info on these pets' spells. |
-- |
-- GetSpellBookItemInfo() not only does not return anything for Temporary Controllable-pets, it |
-- also seems BUGGED, as it returns weird values for Pet SpellIDs (9 or 10 digits long numbers, |
-- sometimes negatives!). |
-- GetSpellBookItemName() (other function) however returns correct SpellNames and is rather |
-- exaustive as far as getting them for permanent pets. |
-- local petName = GetUnitName("pet", nil); |
local petFamily = UnitCreatureFamily("pet"); |
if not petFamily then -- First time UNIT_PET fires, the info on the Pet hasn't been loaded yet |
return; -- UNIT_PET fires two to three times when a new pet is summoned. |
end |
-- print(AddonName.. ": Pet Family = ".. tostring(petFamily)); |
local _, isHunterPet = HasPetUI(); |
if isHunterPet then -- Hunter Pets, unlike all others, have specializations, so we'll handle |
-- their spells differently |
local curPetSpecIndex = GetSpecialization(false, true); |
_, petSpec = GetSpecializationInfo(curPetSpecIndex or 1, false, true); |
-- print(AddonName.. ": Pet Spec #".. tostring(curPetSpecIndex).. "; Pet Family: ".. tostring(petFamily)); |
-- GetSpellBookItemName(SpellbookIndex, BOOKTYPE_PET) + GetSpellInfo(spellName) -- |
if HasPetSpells() then -- I.e. whether there is a Pet Spellbook. WARNING: Returns 'true' for |
-- classes which have pets but are too low level to have control |
-- over them; e.g. Hunters and Warlocks under Level 10. |
print(AddonName.. ": Getting SBook spells for pet: ".. petFamily); |
local i = 0; |
repeat |
i = i + 1; |
local spellName, spellSubName = GetSpellBookItemName(i, BOOKTYPE_PET); |
-- print(AddonName.. ": Book: ".. tostring(spellName).. " ; ".. tostring(spellSubName)); |
if spellName then |
-- No isToken flag from GetPetActionInfo() here, so do the check ourselves |
local isToken = false; |
if PetSpellNameExclusions[spellName] then |
isToken = true; |
end |
if not isToken then |
local _, _, _, _, _, _, spellID = GetSpellInfo(spellName); |
local isPassive = IsPassiveSpell(spellID) |
if spellID then -- Sanity check |
if isPassive then |
-- print(AddonName.. ": Add "..petSpec.. " Passive : ".. spellName); |
-- if SN2SID_PASSIVES_table[universalClassName].Pets[petSpec] == nil then |
if not SN2SID_PASSIVES_table[universalClassName].Pets[petSpec] then |
SN2SID_PASSIVES_table[universalClassName].Pets[petSpec] = { [spellName] = spellID, }; |
else |
SN2SID_PASSIVES_table[universalClassName].Pets[petSpec][spellName] = spellID; |
end |
-- TODO: As of WoW 8.0.1, GetSpellInfo() no longer returns value #2; |
-- but GetSpellBookItemName() does; so I don't know why the this is |
-- evaluating to false.... TODO: Fix! |
elseif strfind(spellSubName, "Special") or strfind(spellSubName, "Bonus") or strfind(spellSubName, "Exotic") then -- Pet Family ability |
-- print(AddonName.. ": Add ".. petFamily.. " : ".. spellName); |
if not SN2SID_table[universalClassName].Pets[petFamily] then |
SN2SID_table[universalClassName].Pets[petFamily] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets[petFamily][spellName] = spellID; |
end |
elseif strfind(spellSubName, "Basic") then -- All three specs |
-- print(AddonName.. ": Add All Specs : ".. spellName); |
-- if SN2SID_table[universalClassName].Pets["Ferocity"] == nil then |
if not SN2SID_table[universalClassName].Pets["Ferocity"] then |
SN2SID_table[universalClassName].Pets["Ferocity"] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets["Ferocity"][spellName] = spellID; |
end |
-- if SN2SID_table[universalClassName].Pets["Tenacity"] == nil then |
if not SN2SID_table[universalClassName].Pets["Tenacity"] then |
SN2SID_table[universalClassName].Pets["Tenacity"] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets["Tenacity"][spellName] = spellID; |
end |
-- if SN2SID_table[universalClassName].Pets["Cunning"] == nil then |
if not SN2SID_table[universalClassName].Pets["Cunning"] then |
SN2SID_table[universalClassName].Pets["Cunning"] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets["Cunning"][spellName] = spellID; |
end |
-- end |
else |
if strfind(spellSubName, "Ferocity") then -- Ferocity |
-- print(AddonName.. ": Add Ferocity : ".. spellName); |
-- if SN2SID_table[universalClassName].Pets["Ferocity"] == nil then |
if not SN2SID_table[universalClassName].Pets["Ferocity"] then |
SN2SID_table[universalClassName].Pets["Ferocity"] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets["Ferocity"][spellName] = spellID; |
end |
end |
if strfind(spellSubName, "Tenacity") then -- Tenacity |
-- print(AddonName.. ": Add Tenacity : ".. spellName); |
-- if SN2SID_table[universalClassName].Pets["Tenacity"] == nil then |
if not SN2SID_table[universalClassName].Pets["Tenacity"] then |
SN2SID_table[universalClassName].Pets["Tenacity"] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets["Tenacity"][spellName] = spellID; |
end |
end |
if strfind(spellSubName, "Cunning") then -- Cunning |
-- print(AddonName.. ": Add Cunning : ".. spellName); |
-- if SN2SID_table[universalClassName].Pets["Cunning"] == nil then |
if not SN2SID_table[universalClassName].Pets["Cunning"] then |
SN2SID_table[universalClassName].Pets["Cunning"] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets["Cunning"][spellName] = spellID; |
end |
end |
end |
-- else |
-- print(AddonName.. ": Pet spell #".. i.. ": NO ID!"); |
end |
-- else |
-- print(AddonName.. ": Pet spell #".. i.." is a token."); |
end |
end |
until spellName == nil; |
-- petHasSpellsConfirmed = true; |
end |
else -- NOT a Hunter Pet |
-- GetPetActionInfo(buttonNumber) + GetSpellInfo(spellName) -- |
if PetHasActionBar() then -- As all controllable pets are marked to have. Note: HasPetUI() |
-- returns 'true' for classes which have pets but are too low level |
-- to have control over them; e.g. Warlocks under Level 10. |
-- PetHasActionBar() only returns 1 if a PetActionBar actually |
-- should be shown (but regardless of the result of :IsShown). |
-- print(AddonName.. ": Getting ABar spells for pet: ".. petFamily); |
for i = 1, NUM_PET_ACTION_SLOTS do |
local spellName, spellSubName, _, isToken, _, _, _ = GetPetActionInfo(i); |
-- print(AddonName.. ": BarButton".. i..": ".. tostring(spellName)); |
if spellName and (not isToken) then |
local _, _, _, _, _, _, spellID = GetSpellInfo(spellName); |
if spellID then -- Sanity check |
if IsPassiveSpell(spellID) then |
if not SN2SID_PASSIVES_table[universalClassName].Pets[petFamily] then |
SN2SID_PASSIVES_table[universalClassName].Pets[petFamily] = { [spellName] = spellID, }; |
else |
SN2SID_PASSIVES_table[universalClassName].Pets[petFamily][spellName] = spellID; |
end |
else |
if not SN2SID_table[universalClassName].Pets[petFamily] then |
SN2SID_table[universalClassName].Pets[petFamily] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets[petFamily][spellName] = spellID; |
end |
end |
end |
end |
end |
-- petHasSpellsConfirmed = true; |
end |
-- GetSpellBookItemName(SpellbookIndex, BOOKTYPE_PET) + GetSpellInfo(spellName) -- |
if HasPetSpells() then -- I.e. whether there is a Pet Spellbook. WARNING: Returns 'true' |
-- for classes which have pets but are too low level to have |
-- control over them; e.g. Warlocks under Level 10. |
local i = 0; |
repeat |
i = i + 1; |
local spellName, spellSubName = GetSpellBookItemName(i, BOOKTYPE_PET); |
-- print(AddonName.. ": Book: ".. tostring(spellName)); |
if spellName then |
local isToken = false; |
if PetSpellNameExclusions[spellName] then |
isToken = true; |
end |
if not isToken then |
-- local _, spellID = GetSpellBookItemInfo(i, BOOKTYPE_PET); |
local _, _, _, _, _, _, spellID = GetSpellInfo(spellName); |
if spellID then -- Sanity check |
if IsPassiveSpell(spellID) then |
-- if SN2SID_PASSIVES_table[universalClassName].Pets[petFamily] == nil then |
if not SN2SID_PASSIVES_table[universalClassName].Pets[petFamily] then |
SN2SID_PASSIVES_table[universalClassName].Pets[petFamily] = { [spellName] = spellID, }; |
else |
SN2SID_PASSIVES_table[universalClassName].Pets[petFamily][spellName] = spellID; |
end |
else |
-- if SN2SID_table[universalClassName].Pets[petFamily] == nil then |
if not SN2SID_table[universalClassName].Pets[petFamily] then |
SN2SID_table[universalClassName].Pets[petFamily] = { [spellName] = spellID, }; |
else |
SN2SID_table[universalClassName].Pets[petFamily][spellName] = spellID; |
end |
end |
end |
end |
end |
until spellName == nil; |
-- petHasSpellsConfirmed = true; |
end |
end |
-- print(AddonName.. ": Fetched? ".. tostring(petHasSpellsConfirmed)); |
end |
--[[ |
-- Helper function for addSpellsPostUpdate() |
local addNestedSpells = function(sourceTbl, srcKey, srcVal, targetTbl) |
-- sourceTbl = postUpdate_Spells2Add (or nested table within) |
-- srcKey, value = pair from postUpdate_Spells2Add |
-- targetTbl = SN2SID_table OR SN2SID_PASSIVES_table |
if (sourceTbl == nil) or (srcKey == nil) or (srcVal == nil) then -- Sanity check |
return; |
end |
if targetTbl[srcKey] == nil then |
targetTbl[srcKey] = sourceTbl[srcKey]; |
elseif type(srcVal) == "table" then |
for key, val in pairs(sourceTbl) do |
addNestedSpells(sourceTbl[srcKey]); -- Function recursively calling itself DOES NOT WORK |
end |
end |
end |
]]-- |
-- local addSpellsPostUpdate = function(SN2SID_table, SN2SID_PASSIVES_table, generalTabName, universalClassName) |
local addSpellsPostUpdate = function(SN2SID_table, SN2SID_PASSIVES_table) |
-- Sanity check |
if (postUpdate_Spells2Add ~= nil) and (SN2SID_table ~= nil) then |
for key, value in pairs(postUpdate_Spells2Add) do |
-- if SN2SID_table[key] == nil then -- Sanity check, key == "General" OR universalClassName |
if not SN2SID_table[key] then -- Sanity check, key == "General" OR universalClassName |
-- print(AddonName.. ": Adding: ".. tostring(value)); |
SN2SID_table[key] = value |
elseif type(value) == "table" then -- Should always be 'true' i.e. always either |
-- specName(..somethingMaybe) OR "Flyouts" OR |
-- "Pets" OR someGeneralTabCategory. |
for keyk, valuev in pairs(value) do |
-- if SN2SID_table[key][keyk] == nil then -- specName(..somethingMaybe) OR |
if not SN2SID_table[key][keyk] then -- specName(..somethingMaybe) OR |
-- "Flyouts" OR "Pets" OR |
-- someGeneralTabCategory. |
-- print(AddonName.. ": Adding: ".. tostring(valuev)); |
SN2SID_table[key][keyk] = valuev; |
elseif type(valuev) == "table" then -- |
-- |
for keykk, valuevv in pairs(valuev) do |
-- if SN2SID_table[key][keyk][keykk] == nil then -- Spell OR Flyouts_spell OR |
if not SN2SID_table[key][keyk][keykk] then -- Spell OR Flyouts_spell OR |
-- PetFamily is not on the |
-- target table yet |
-- print(AddonName.. ": Adding: ".. tostring(valuevv)); |
SN2SID_table[key][keyk][keykk] = valuevv; |
end |
if type(valuevv) == "table" then -- Flyouts_spell OR PetFamily |
for keykkk, valuevvv in pairs(valuevv) do |
-- if SN2SID_table[key][keyk][keykk][keykkk] == nil then -- Flyouts_spell_Spell OR |
if not SN2SID_table[key][keyk][keykk][keykkk] then -- Flyouts_spell_Spell OR |
-- PetFamily_spell is not |
-- on the target table yet |
-- print(AddonName.. ": Adding: ".. tostring(valuevvv)); |
SN2SID_table[key][keyk][keykk][keykkk] = valuevvv; |
end |
end |
end |
end |
end |
end |
end |
end |
end |
if (postUpdate_Spells2Add_PASSIVES ~= nil) and (SN2SID_PASSIVES_table ~= nil) then |
for key, value in pairs(postUpdate_Spells2Add_PASSIVES) do |
-- if SN2SID_PASSIVES_table[key] == nil then -- Sanity check, key == "General" OR universalClassName |
if not SN2SID_PASSIVES_table[key] then -- Sanity check, key == "General" OR universalClassName |
-- print(AddonName.. ": Adding: ".. tostring(value)); |
SN2SID_PASSIVES_table[key] = value; |
elseif type(value) == "table" then -- Should always be 'true' i.e. always either "Spells" |
-- OR specName(..somethingMaybe) OR "Pets" |
for keyk, valuev in pairs(value) do |
-- if SN2SID_PASSIVES_table[key][keyk] == nil then -- "Spells" OR specName(..somethingMaybe) OR |
if not SN2SID_PASSIVES_table[key][keyk] then -- "Spells" OR specName(..somethingMaybe) OR |
-- "Pets" is not on the target table yet |
-- print(AddonName.. ": Adding: ".. tostring(valuev)); |
SN2SID_PASSIVES_table[key][keyk] = valuev; |
elseif type(valuev) == "table" then -- "Spells" OR specName(..somethingMaybe) OR |
-- "Pets" table |
for keykk, valuevv in pairs(valuev) do |
-- if SN2SID_PASSIVES_table[key][keyk][keykk] == nil then -- Spell OR Flyouts_spell OR |
if not SN2SID_PASSIVES_table[key][keyk][keykk] then -- Spell OR Flyouts_spell OR |
-- PetFamily is not on the |
-- target table yet |
-- print(AddonName.. ": Adding: ".. tostring(valuevv)); |
SN2SID_PASSIVES_table[key][keyk][keykk] = valuevv; |
elseif type(valuevv) == "table" then -- Flyouts_spell OR PetFamily |
for keykkk, valuevvv in pairs(valuevv) do |
-- if SN2SID_PASSIVES_table[key][keyk][keykk][keykkk] == nil then -- Flyouts_spell_Spell OR |
if not SN2SID_PASSIVES_table[key][keyk][keykk][keykkk] then -- Flyouts_spell_Spell OR |
-- PetFamily_spell is not |
-- on the target table yet |
-- print(AddonName.. ": Adding: ".. tostring(valuevvv)); |
SN2SID_PASSIVES_table[key][keyk][keykk][keykkk] = valuevvv; |
end |
end |
end |
end |
end |
end |
end |
end |
end |
end |
-- -- -- RUNTIME -- -- -- |
------------------------- |
-- Frame to listen to game events |
local SN2SID_frame, SN2SID_events = CreateFrame("Frame", nil), {}; |
-- NB: When ADDON_LOADED fires, the SpellBook etc aren't available yet, only upon PLAYER_LOGIN. |
SN2SID_frame:RegisterEvent("PLAYER_LOGIN"); |
-- Function to call upon PLAYER_LOGIN (see bottom of file) |
local lsn2sidpStartup = function() |
-- Startup -- |
print(AddonName.. ": Startup!"); |
-- Copy the global saved-variables tables to our local tables |
local SN2SID_table = AddonEnv.SpellNamesAndIDs or SpellNamesAndIDs or {}; |
local SN2SID_PASSIVES_table = AddonEnv.SpellNamesAndIDs_PASSIVES or SpellNamesAndIDs_PASSIVES or {}; |
-- print(AddonName.. ": AddonEnv.SpellNamesAndIDs = ".. tostring(AddonEnv.SpellNamesAndIDs)); -- nil |
-- print(AddonName.. ": AddonEnv.SpellNamesAndIDs_PASSIVES = ".. tostring(AddonEnv.SpellNamesAndIDs_PASSIVES)); -- nil |
-- print(AddonName.. ": SpellNamesAndIDs = ".. tostring(SpellNamesAndIDs)); -- TableA |
-- print(AddonName.. ": SpellNamesAndIDs_PASSIVES = ".. tostring(SpellNamesAndIDs_PASSIVES)); -- TableB |
-- print(AddonName.. ": SN2SID_table = ".. tostring(SN2SID_table));-- TableA |
-- print(AddonName.. ": SN2SID_PASSIVES_table = ".. tostring(SN2SID_PASSIVES_table)); -- TableB |
-- -- Metadata fields: Data source, Class', ... -- -- |
-- Data source -- |
-- We're only interested in storing the English names, at least for now |
local curLocale = GetLocale(); |
if ( curLocale ~= "enUS") then |
SN2SID_frame:UnregisterAllEvents(); |
error(AddonName.. " only retrieves data from English (enUS or enGB) clients."); |
return; |
end |
local _, universalRaceName = UnitRace("player"); |
-- Self-explanatory: |
local _, gameBuild = GetBuildInfo(); |
-- For some reason, the variable gameBuild is being saved as a string; convert to number: |
gameBuild = tonumber(gameBuild); |
local charLevel = UnitLevel("player"); |
-- Spells in the General tab: Racial abilities, etc |
local generalTabName = (GetSpellTabInfo(1)); -- Tab#1 = General |
-- Class stuff -- |
local universalClassName = select(2, UnitClass("player")); -- Locale-independent Class name |
local ClassNumSpecs = GetNumSpecializations(false, false); -- Number of Specialisations |
-- Ordered list of Class specs' IDs and Names -- Do we still use this? |
local specID, specName = GetSpecializationInfo(1); |
local ClassSpecNames2IDs = {}; |
for i = 1, ClassNumSpecs do |
local specID, specName = GetSpecializationInfo(i); |
ClassSpecNames2IDs[specName] = specID; |
end |
---- Check the tables' skeleton structure and build whatever may be missing ---- |
-- |
if not SN2SID_table then -- sanity check |
error(AddonName.. "Local copy of saved variables is missing."); |
return; |
end |
if not SN2SID_PASSIVES_table then -- sanity check |
error(AddonName.. "Local copy of saved variables is missing."); |
return; |
end |
-- |
-- If needed, create and populate the Metadata subtables; -- |
-- Flag spell-lists for update if applicable -- |
-- |
-- General tab skeleton + dataSource + raceBuilds |
-- NB: We separate the two types of tables in two if-loops for the sake of sanity-keep (against |
-- e.g. manual edits to the file). |
if not SN2SID_table[generalTabName] then |
print(AddonName.. ": Will now create the ".. generalTabName.. " dataSource for Active spells."); |
SN2SID_table[generalTabName] = {}; |
-- SN2SID_table[generalTabName].Spells = {}; |
SN2SID_table[generalTabName].METADATA = {}; |
SN2SID_table[generalTabName].METADATA.dataSource = { |
clientLocale = curLocale, -- Currently always enUS |
gameBuild = gameBuild, |
charLevel = charLevel, |
charMaxLevel = charLevel, |
}; |
SN2SID_table[generalTabName].METADATA.raceBuilds = { [universalRaceName] = gamebuild }; |
-- We've just created and populated the GeneralTabMetadata, hence no need to update |
updateGeneralTabMetadata = false; |
updateGeneralSpells = true; -- Do populate the actual list of spells |
else |
updateGeneralTabMetadata = true; -- Will check whether it's updated; if not, will update; |
-- The function which checks above var will also flag for Spells-list update if needed. |
end |
if not SN2SID_PASSIVES_table[generalTabName] then |
print(AddonName.. ": Will now create the ".. generalTabName.. " dataSource for Passive spells."); |
SN2SID_PASSIVES_table[generalTabName] = {}; |
-- SN2SID_PASSIVES_table[generalTabName].Spells = {}; |
SN2SID_PASSIVES_table[generalTabName].METADATA = {}; |
SN2SID_PASSIVES_table[generalTabName].METADATA.dataSource = { |
clientLocale = curLocale, -- Currently always enUS |
gameBuild = gameBuild, |
charLevel = charLevel, |
charMaxLevel = charLevel, |
}; |
SN2SID_PASSIVES_table[generalTabName].METADATA.raceBuilds = { [universalRaceName] = gamebuild }; |
-- We've just created and populated the GeneralTabMetadata, hence no need to update ... |
if not updateGeneralTabMetadata then -- ... unless it's needed for the Active spells |
updateGeneralTabMetadata = false; -- And this seems redundant. Keep it 'cause I'll forget it otherwise... |
end |
updateGeneralSpells = true; -- Do populate the actual list of spells |
else |
updateGeneralTabMetadata = true; -- Will check whether it's updated, if not will update; |
-- The function which checks above var will also flag for Spells-list update if needed. |
end |
-- Run the update function (does both Active and Passive trees), delayed |
updateGeneralTabMetadata_func(SN2SID_table, SN2SID_PASSIVES_table, curLocale, gameBuild, universalRaceName, generalTabName, charLevel); |
-- Class spells' Metadata (dataSource only; class Specs will be handled afterwards) |
if not SN2SID_table[universalClassName] then |
print(AddonName.. ": Will now create the ".. universalClassName.. "'s table and dataSource for Active spells."); |
SN2SID_table[universalClassName] = {}; |
else |
updateClassMetadata = true; -- Will check whether it's updated and if not, will update; |
-- The function which checks above var will also flag for Spells-list update if needed. |
end |
if not SN2SID_table[universalClassName].METADATA then |
SN2SID_table[universalClassName].METADATA = {}; |
SN2SID_table[universalClassName].METADATA.dataSource = { |
clientLocale = curLocale, -- Currently always enUS |
gameBuild = gameBuild, |
charLevel = charLevel, |
charMaxLevel = charLevel, |
}; |
-- We've just created and populated the Class' dataSource fields, hence no need to update; |
-- Class Specs fields are updated in another if-clause, further ahead. |
updateClassMetadata = false; |
updateClassSpells = true; -- Do populate the actual list of spells. |
else |
updateClassMetadata = true; -- Will check whether it's updated and if not, will update; |
-- The function which checks above var will also flag for Spells-list update if needed. |
end |
if not SN2SID_PASSIVES_table[universalClassName] then |
print(AddonName.. ": Will now create the ".. universalClassName.. "'s table and dataSource for Passive spells."); |
SN2SID_PASSIVES_table[universalClassName] = {}; |
SN2SID_PASSIVES_table[universalClassName].METADATA = {}; |
SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource = { |
clientLocale = curLocale, -- Currently always enUS |
gameBuild = gameBuild, |
charLevel = charLevel, |
charMaxLevel = charLevel, |
}; |
if not updateClassMetadata then -- See above, in the Actives snippet |
updateClassMetadata = false; |
end |
updateClassSpells = true; -- Do populate the actual list of spells. |
else |
updateClassMetadata = true; |
end |
if not SN2SID_PASSIVES_table[universalClassName].METADATA then |
SN2SID_PASSIVES_table[universalClassName].METADATA = {}; |
SN2SID_PASSIVES_table[universalClassName].METADATA.dataSource = { |
clientLocale = curLocale, -- Currently always enUS |
gameBuild = gameBuild, |
charLevel = charLevel, |
charMaxLevel = charLevel, |
}; |
-- We've just created and populated the Class' dataSource fields, hence no need to update; |
-- Class Specs fields are updated in another if-clause, further ahead. |
updateClassMetadata = false; |
updateClassSpells = true; -- Do populate the actual list of spells. |
else |
updateClassMetadata = true; -- Will check whether it's updated and if not, will update; |
-- The function which checks above var will also flag for Spells-list update if needed. |
end |
-- Do the actual update of the Class Metadata (dataSource only now; Specs will be handled next) |
updateClassMetadata_func(SN2SID_table, SN2SID_PASSIVES_table, curLocale, gameBuild, universalClassName, charLevel); |
-- If needed, create and populate Class Specs' Active and Passive Spells -- |
-- Flag spell-lists for update if applicable -- |
if not SN2SID_table[universalClassName].METADATA.Specs then |
print(AddonName.. ": Will now create the ".. universalClassName.. "'s \'Specs\' (Actives) tables."); |
for i = 1, ClassNumSpecs do |
local specID, specName = GetSpecializationInfo(i); |
-- ClassSpecNames2IDs[i] = { specID, specName }; |
ClassSpecNames2IDs[specName] = specID; |
-- print(AddonName.. ": ".. i.. " = ".. specID.. " = ".. specName); -- For reference |
-- local specString = "Spec"..specID; |
if not SN2SID_table[universalClassName].METADATA.Specs then |
SN2SID_table[universalClassName].METADATA.Specs = {}; |
SN2SID_table[universalClassName].METADATA.Specs[specName] = specID; -- Reference |
SN2SID_table[universalClassName][specName] = {}; -- For "[SpellName] = SpellID" |
elseif not SN2SID_table[universalClassName].METADATA.Specs[i] then |
SN2SID_table[universalClassName].METADATA.Specs[specName] = specID; -- Reference |
SN2SID_table[universalClassName][specName] = {}; -- For "[SpellName] = SpellID" |
end |
end |
updateClassSpells = true; -- Do populate the actual list of spells. |
end |
if not SN2SID_PASSIVES_table[universalClassName].METADATA.Specs then |
print(AddonName.. ": Will now create the ".. universalClassName.. "'s \'Specs\' (Passives) tables."); |
for i = 1, ClassNumSpecs do |
local specID, specName = GetSpecializationInfo(i); |
-- ClassSpecNames2IDs[i] = { specID, specName }; |
ClassSpecNames2IDs[specName] = specID; |
-- print(AddonName.. ": ".. i.. " = ".. specID.. " = ".. specName); -- For reference |
if not SN2SID_PASSIVES_table[universalClassName].METADATA.Specs then |
SN2SID_PASSIVES_table[universalClassName].METADATA.Specs = {}; |
SN2SID_PASSIVES_table[universalClassName].METADATA.Specs[specName] = specID; -- Ref. |
SN2SID_PASSIVES_table[universalClassName][specName] = {}; -- "[SpellName] = SpellID" |
elseif not SN2SID_PASSIVES_table[universalClassName].METADATA.Specs[i] then |
SN2SID_PASSIVES_table[universalClassName].METADATA.Specs[specName] = specID; -- Ref. |
SN2SID_PASSIVES_table[universalClassName][specName] = {}; -- "[SpellName] = SpellID" |
end |
end |
updateClassSpells = true; -- Do populate the actual list of spells. |
end |
-- Update General (always ATM) and Class SpellNames2SIDs (both Actives and Passives) -- |
updateClassSpells = true; |
updateSpellbookSpells_func(SN2SID_table, SN2SID_PASSIVES_table, generalTabName, universalClassName, ClassNumSpecs, ClassSpecNames2IDs); |
-- Pet spells will only be available when a pet is out, so wait for it, i.e. wait for UNIT_PET |
-- to fire for "player". |
-- TODO: Remove the following line after successful testing - is called upon PLAYER_LOGOUT |
addSpellsPostUpdate(SN2SID_table, SN2SID_PASSIVES_table); |
-- Set up Other Event-Handlers -- |
--------------------------------- |
function SN2SID_events:PLAYER_TALENT_UPDATE(self) |
-- updateGeneralSpells = true; -- unneeded, placeholder for future version |
updateClassSpells = true; |
updateSpellbookSpells_func(SN2SID_table, SN2SID_PASSIVES_table, generalTabName, universalClassName, ClassNumSpecs, ClassSpecNames2IDs); |
end |
function SN2SID_events:PLAYER_LEVEL_UP(self, ...) |
-- UnitLevel("player") doesn't update its result soon enough to have it indicate the *new* |
-- char level in response to this event. OTH, this event does provide arguments but, |
-- whatever they are, they're NOT the new char leve, for sure. Might be best to just flag |
-- for update on Logout. But we'll still do it here, for now. |
updateGeneralTabMetadata = true; -- Maybe useful. |
updateClassMetadata = true; -- Stuff like talents only become available at level 10. |
updateClassMetadata_func(SN2SID_table, SN2SID_PASSIVES_table, curLocale, gameBuild, universalClassName, charLevel); |
updateGeneralTabMetadata = true; -- Maybe useful. |
updateClassMetadata = true; -- Stuff like talents only become available at level 10. |
end |
-- Update pets' existence and spells when one comes up for "player" |
-- NB: Fires after PLAYER_LOGIN if the player already has a pet out. NO LONGER SO as of game |
-- build 26365 and later; I only got this event to fire on 'Pet Dismiss' and 'Summon Pet' button |
-- clicks. Also, see BUG described bellow! |
-- fire on 'Pet Dismiss' and 'Summon Pet' button clicks. Also, see BUG described bellow! |
function SN2SID_events:UNIT_PET(self, ...) |
local arg1 = ...; |
-- BUG: As of game build 26365, arg1 is no longer being passed (always nil). Registering the |
-- event as RegisterUnitEvent() instead of RegisterEvent() doesn't work either. |
-- print(AddonName.. ": UNIT_PET fired for ".. tostring(arg1)); |
-- if arg1 and arg1 == "player" then |
if not SN2SID_table[universalClassName].Pets then |
SN2SID_table[universalClassName].Pets = {}; |
end |
if not SN2SID_PASSIVES_table[universalClassName].Pets then |
SN2SID_PASSIVES_table[universalClassName].Pets = {}; |
end |
updatePetSpellNames(SN2SID_table, SN2SID_PASSIVES_table, universalClassName); |
-- end |
end |
-- Switch Hunter pet's specialisation |
function SN2SID_events:PET_SPECIALIZATION_CHANGED(self, ...) |
-- local petOwner = ...; |
-- if petOwner == "player" then |
print(AddonName.. ": Player Pet spec changed."); |
if not SN2SID_table[universalClassName].Pets then |
SN2SID_table[universalClassName].Pets = {}; |
end |
updatePetSpellNames(SN2SID_table, SN2SID_PASSIVES_table, universalClassName); |
-- end |
end |
function SN2SID_events:PLAYER_LOGOUT(self) |
-- Bring everything up to date |
charLevel = UnitLevel("player"); |
updateGeneralTabMetadata = true; |
updateClassMetadata = true; |
updateGeneralTabMetadata_func(SN2SID_table, SN2SID_PASSIVES_table, curLocale, gameBuild, universalRaceName, generalTabName, charLevel); |
updateClassMetadata_func(SN2SID_table, SN2SID_PASSIVES_table, curLocale, gameBuild, universalClassName, charLevel); |
updateSpellbookSpells_func(SN2SID_table, SN2SID_PASSIVES_table, generalTabName, universalClassName, ClassNumSpecs, ClassSpecNames2IDs); |
-- NB: UNIT_PET fires upon summoning new pets; but NOT upon switching Hunters' Pet-Specs. |
if SN2SID_table[universalClassName].Pets or SN2SID_PASSIVES_table[universalClassName].Pets then |
updatePetSpellNames(SN2SID_table, SN2SID_PASSIVES_table, universalClassName); |
end |
-- "Manually" add spells we cannot (or is not convenient to) get automatically |
addSpellsPostUpdate(SN2SID_table, SN2SID_PASSIVES_table); |
-- Copy our local tables to the global saved-variables tables -- |
if AddonEnv.SpellNamesAndIDs then |
AddonEnv.SpellNamesAndIDs = SN2SID_table; |
else |
SpellNamesAndIDs = SN2SID_table; |
end |
if AddonEnv.SpellNamesAndIDs_PASSIVES then |
AddonEnv.SpellNamesAndIDs_PASSIVES = SN2SID_PASSIVES_table; |
else |
SpellNamesAndIDs_PASSIVES = SN2SID_PASSIVES_table; |
end |
end |
-- Unregister the event (handler) in which we are now running |
SN2SID_frame:UnregisterEvent("PLAYER_LOGIN"); |
-- Set the post-PLAYER_LOGIN event-handlers and Register the respective events |
SN2SID_frame:SetScript("OnEvent", function(self, event, ...) |
SN2SID_events[event](self, ...); |
end); |
for k, v in pairs(SN2SID_events) do |
if k == "UNIT_PET" then |
SN2SID_frame:RegisterUnitEvent("UNIT_PET", "player"); |
else |
SN2SID_frame:RegisterEvent(k); |
end |
-- if SN2SID_frame:IsEventRegistered(k) then |
-- print(AddonName.. ": Registered event: ".. tostring(k)); |
-- end |
end |
end |
-- PLAYER_LOGIN event handler; we set up the other events when this one fires -- |
SN2SID_frame:SetScript("OnEvent", function(self, event) |
C_Timer.After(3, lsn2sidpStartup); |
end); |
## Interface: 80000 |
## Title: LibSpellName2SID: Populator (DEV) |
## Notes: Get all spells from a character and save them to file. |
## Author: aallkkaa |
## Version: 1.0.12 |
## SavedVariables: SpellNamesAndIDs, SpellNamesAndIDs_PASSIVES |
## DefaultState: disabled |
## X-Category: Development |
LibSpellName2SID-1.0-Populator.lua |
## Title: LibSpellName2SID: Populator (DEV) |
## Notes: Get all spells from a character and save them to file. |
## Author: aallkkaa |
## Version: 1.0.12b |
## Version: 1.0.12 |
## SavedVariables: SpellNamesAndIDs, SpellNamesAndIDs_PASSIVES |
## DefaultState: disabled |
## X-Category: Development |