WoWInterface SVN LibSpellName2SID

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 101 to Rev 102
    Reverse comparison

Rev 101 → Rev 102

trunk/LibSpellName2SID-1.0/test.lua
1,3 → 1,5
local AddonName, AddonEnv = ...;
 
local LIBSN2SID = LibStub:GetLibrary("LibSpellName2SID");
local SID = LIBSN2SID.SID;
local LSN = LIBSN2SID.LSN;
22,7 → 24,7
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.");
 
trunk/LibSpellName2SID-1.0/LibSpellName2SID-1.0/LibSpellName2SID-1.0.lua
2389,8 → 2389,9
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
trunk/LibSpellName2SID-1.0/LibSpellName2SID-1.0.toc
1,7 → 1,7
## 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
populator/tags/LibSpellName2SID-Populator-1.0.12/LibspellName2SID-1.0-Populator.lua New file
0,0 → 1,1494
----------
-- (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);
\ No newline at end of file
populator/tags/LibSpellName2SID-Populator-1.0.12/LibSpellName2SID-1.0-Populator.toc New file
0,0 → 1,10
## 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
populator/trunk/LibSpellName2SID-1.0-Populator/LibSpellName2SID-1.0-Populator.toc
2,7 → 2,7
## 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
passives/tags/LibSpellName2SID-1.0.12-Passives/test.lua New file
0,0 → 1,87
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);
passives/tags/LibSpellName2SID-1.0.12-Passives/LibSpellName2SID-1.0-Passives/LibSpellName2SID-1.0-Passives.lua New file
0,0 → 1,2077
---------------------
-- 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.");
passives/tags/LibSpellName2SID-1.0.12-Passives/LibSpellName2SID-1.0-Passives.toc New file
0,0 → 1,16
## 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
\ No newline at end of file
passives/tags/LibSpellName2SID-1.0.12-Passives/LibStub/LibStub.toc New file
0,0 → 1,13
## 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
passives/tags/LibSpellName2SID-1.0.12-Passives/LibStub/LibStub.lua New file
0,0 → 1,51
-- $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
passives/trunk/LibSpellName2SID-1.0-Passives/test.lua
1,10 → 1,14
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,
passives/trunk/LibSpellName2SID-1.0-Passives/LibSpellName2SID-1.0-Passives/LibSpellName2SID-1.0-Passives.lua
1,15 → 1,15
---------------------
-- 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 --
18,17 → 18,17
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
38,7 → 38,7
---------------------------------------
 
LibSN2SIDP.owner = AddonName;
LibSN2SIDP.minor = LibSpellName2SID_MINOR;
LibSN2SIDP.minor = LibSpellName2SIDPassives_MINOR;
 
LibSN2SIDP.DB = {}; -- Clear old version's contents, if applicable
 
1983,7 → 1983,7
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
2060,7 → 2060,7
-- 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;
passives/trunk/LibSpellName2SID-1.0-Passives/LibSpellName2SID-1.0-Passives.toc
1,7 → 1,7
## 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
tags/LibSpellName2SID-1.0.12/LibStub/LibStub.toc New file
0,0 → 1,13
## 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
tags/LibSpellName2SID-1.0.12/LibStub/LibStub.lua New file
0,0 → 1,51
-- $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
tags/LibSpellName2SID-1.0.12/LibSpellName2SID-1.0/LibSpellName2SID-1.0.lua New file
0,0 → 1,2591
---------------------
-- 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.");
tags/LibSpellName2SID-1.0.12/LibSpellName2SID-1.0.toc New file
0,0 → 1,16
## 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
tags/LibSpellName2SID-1.0.12/test.lua New file
0,0 → 1,123
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);