This project is abandoned.

Whether this project is out of date or its author marked it as abandoned, this project is no longer maintained.

If you wish to take this project over, please report it and state your intentions.

A high level interface to the standard talent API. All of the default Blizzard talent functions are mapped onto equivelant library functions which accept a unit ID. Plus many convenience functions are provided to allow collection of much of the commonly needed information.

The library takes care of all of the talent querying, roster changes and so forth. It simply notifies you when someone's talents have changed. You can directly query a talent by name, or get a quick and easy summary of their spec.

LibGroupTalents-1.0 is intended to do the following basic functions usually handled at the mod level.

  • Maintain a raid wide table of talents, automatically updated on roster changes, notifying you on talent receipts.
  • Provide easy access to talent queries (spec weight, spec name, specific talent presence).
  • Monitor talent changes in players, and notify of changes (respec, talent swap, update after out of sight, level up).
  • Monitor player roles, and notify of changes (melee, tank, healer, caster).
  • Communicate directly with itself to other users to update talents and glyphs via addon channel when possible.

Note that the LibTalentQuery-1.0 dependancy must be included before LibGroupTalents-1.0 in any lib.xml or mod side TOC declarations.

You might wander why two libraries are needed to handle talents? LibTalentQuery-1.0 has it's place; It deals exclusively with queueing and processing inspect requests, and this may still be an easier solution for some. LibGroupTalents-1.0 handles the higher level caching of talents so that re-querying on-demand is not required, and deals with comparing specs on updates from the queue and providing easy access to often needed information.


UnitHasTalent(unit, talentName[, group])

  • Returns: Points spent in talent or nil

GUIDHasTalent(guid, talentName[, group])

  • As UnitHasTalent

GetUnitTalentSpec(unitid[, group])

  • Returns: Returns: Specialization Tree, spent1, spent2, spent3, non-localized name of specialization tree
    It is possible that dominant tree will return a number in cases where talent specs have been received by comms and you have not yet encountered a player of the same class to inspect the talent names and tree names from.

GetGUIDTalentSpec(guid[, group])

  • As GetUnitTalentSpec

GetUnitTalents(unit, refresh)

  • Returns: Raw talent information in form of table of 3 strings of points spent. The refresh arg will force a re-query of the unit's talents.

GetGUIDTalents(guid, refresh)

  • As GetUnitTalents


  • Returns one of: "melee", "caster", "healer", "tank"


  • As GetUnitRole.


  • Force a refresh of talents for the specific unit.


  • Force a refresh of talents for the specific player GUID.


  • Returns: The three talent tree names for that class, then the three non-localized tree names
    Note: These return values are only valid after a player of that class has been seen by this library.


  • Returns: The three talent tree icons for that class.
    Note: These return values are only valid after a player of that class has been seen by this library.


  • Returns: Talent info got, Talent info missing


  • Returns: Comma delimited list of player names we're missing talents for

GetClassTalentInfo(class, talentName)

  • Returns: Max Rank, Icon, Tab, Tier, Column, Tree Index.
    Note: These return values are only valid after a player of that class has been seen by this library.


  • Returns: An encoded data string containing talent information for the player which can be stored by mods to set in later sessions using SetStorageString().

    This string is encoded and double checked on receipt. It has a CRC combining the WoW build number so any saved sets from old versions of WoW are automatically invalid.


  • As GetUnitStorageString.


  • Returns: true on success (applicable). Any second return value indicates the data was invalid and should not be kept.

GetUnitGlyphs(unit[, group])

  • Returns: Up to 6 spell IDs for the currently assigned Glyphs (Note: For the moment, we can only see the glyphs of players running LibGroupTalents-1.0).

GetGUIDGlyphs(guid[, group])

  • As GetUnitGlyphs

UnitHasGlyph(unit, glyph [, group])

  • Returns: true if the player has the glyph associated with spellID or spellName (Note: For the moment, we can only see the glyphs of players running LibGroupTalents-1.0).

GUIDHasGlyph(unit, glyph[, group])

  • As UnitHasGlyph


  • Wipe current roster of all talents and rescan from start

Convenience Functions

Similar to Blizzard API functions, but callable with a unit ID. Talent data is read in quite quickly once you see raid members (approximately 3 per second assuming you don't have a mod that's thrashing the NotifyInspect queue), and it's trivial to then access these familiar functions.


  • Returns: Active talent group for unit.


  • Returns: Number of talent groups for unit.


  • Returns: Number of talent tabs.

GetTalentTabInfo(unit, tab[, group])

  • Returns: Tree ID, tree name, tree description, tree icon, points spent, non-localized tree name, preview points spent (or 0 if not player), isSpecialization

GetNumTalents(unit, tab)

  • Returns: Number of talents for specified tree

GetTalentInfo(unit, tab, index[, group])

  • Returns: Talent Name, Icon, Tier, Column, Points Spent, Max Rank Note that preview return values are not given unless called with "player".

GetUnspentTalentPoints(unit[, group])

  • Returns: Number of un-spent talent points for the unit


These events are fired when any group member's talents change for any reason. You don't need to worry about querying the default API for them, just watch these events and update from the library.

LibGroupTalents_Update(guid, unit) LibGroupTalents_Update(guid, unit, newSpec, n1, n2, n3 [, oldSpec, o1, o2, o3])

  • Received updated talents. If it's a respec, or old set is known, it passes the old info also in last four args.
    This is not sent if new talent scan is same as previous.

LibGroupTalents_UpdateComplete(guid1, guid2[, ...])

  • Sent when there are no more pending talent reads due and passes all GUIDs that were updated since last time this event was fired.

LibGroupTalents_Add(guid, unit, name, realm)

  • Unit added to talent roster.
    Talents not necessarily available yet, but this is the mod's chance to feed talents using SetStorageString

LibGroupTalents_Remove(guid, name, realm)

  • Unit removed from talent roster.
    This is your last chance to store talents if required using GetUnitStorageString.

LibGroupTalents_RoleChange(guid, unit, newrole, oldrole)

  • Roles are: "melee", "caster", "healer", "tank"

You must login to post a comment. Don't have an account? Register to get one!

  • Avatar of Jitter88 Jitter88 Dec 08, 2012 at 11:44 UTC - 0 likes

    Any comment from the author? Will this be updated?

  • Avatar of oscarucb oscarucb Aug 28, 2012 at 01:46 UTC - 0 likes

    This library is effectively dead as of 5.0. The new talent system has not only broken the code, but more importantly made the library interface obsolete. Small fixes for lua errors are not going to magically fix the broken design of the API.

    This project should be marked abandoned and addon authors need to migrate to a new library, eg

    Last edited Dec 08, 2012 by oscarucb
  • Avatar of tomsommer tomsommer Dec 04, 2010 at 23:04 UTC - 0 likes

    Would it be possible to use the built in 4.0 role definitions as a guide, if no role can be determined because of inspect range or similar?

  • Avatar of lordvance lordvance Nov 23, 2010 at 23:55 UTC - 0 likes

    I'm getting the following error on low-level characters (below 10):

    Message: ...Lax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:534: attempt to index field 'primary' (a nil value)
    Time: 11/23/10 18:54:02
    Count: 1
    Stack: ...Lax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:534: in function `GetGUIDStorageString'
    ...Lax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1545: in function `SendMyTalents'
    ...Lax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1219: in function `RefreshTalentsByGUID'
    ...Lax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:209: in function <...Lax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:171>
    Locals: self = <table> {
     talentThrottle = <table> {
     GetTalentTreeMasterySpells = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1787
     RefreshTalentsByUnit = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1175
     GetGUIDGlyphs = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1016
     SendMyGlyphs = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1553
     OnReceiveTalents = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:941
     GetUnitTalentSpec = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:913
     RefreshTalentsByGUID = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1183
     GUIDHasTalent = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1590
     GetActiveTalentGroup = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1633
     GetGUIDRole = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1255
     GLYPH_REMOVED = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1071
     GetUnitStorageString = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:507
     batch = <table> {
     pendingStorageStrings = <table> {
     GetNumTalentGroups = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1644
     GetUnitRole = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1247
     GLYPH_UPDATED = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1076
     UserCount = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1570
     distribution = "PARTY"
     roster = <table> {
     SendCommMessage = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1402
     CheckForMissingTalents = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1224
     UNIT_AURA = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:313
     GetTalentCount = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1817
     TalentQuery_Ready_Outsider = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:847
     GetTreeNames = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:794
     UnitHasGlyph = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1033
     events = <table> {
     frame = LibGroupTalents_Frame {
     refreshCheckTimer = 15
     UnitHasTalent = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1584
     TriggerRefreshTalents = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:1164
     commQueried = <table> {
     OnReceiveGlyphs = <function> defined @Interface\AddOns\PugLax\libs\LibGroupTalents-1.0\LibGroupTalents-1.0.lua:987
     classTalentData = <table> {
     RAID_ROSTER_UPDATE = <function> defined @Interface\AddOns\Pug

    My addon isn't calling anything from GroupTalents unless the character is above level 10. If there's any more information I can provide, please let me know!

    And thanks for the incredibly helpful library!

  • Avatar of mysticalos mysticalos Nov 16, 2010 at 20:35 UTC - 0 likes

    4.0.3 is out, inspect is fixed, still returns nil for any roll but your own

  • Avatar of EasySham EasySham Nov 13, 2010 at 02:33 UTC - 0 likes

    Thanks. just wanted to check it wasn't a new/different problem to that one :P

  • Avatar of mysticalos mysticalos Nov 08, 2010 at 05:12 UTC - 0 likes

    zeks comment pretty much covers your problem easysham, it's cause inspect is broken in 4.x

  • Avatar of EasySham EasySham Oct 30, 2010 at 22:27 UTC - 0 likes

    I've just started using this (first library I have used) and can't seem to get LibStub("LibGroupTalents-1.0"):GetUnitRole("target") working as mentioned below. As this was before the last update can some one tell me if I'm using the library wrong.

    I have included LibTalentQuery-1.0\LibTalentQuery-1.0 LibGroupTalents-1.0\LibGroupTalents-1.0 in my toc file and then declared it using lGT = LibStub("LibGroupTalents-1.0")

    I was assuming I could then simply use lGT:UnitHasTalent(sourceName,"Totemic Focus") to get the number of points in this talent. this seems ok on me but anyone else returns nil.

    Are there other steps to using this (initialisation, callbacks etc) or do I just need to wait for an update (no problem waiting but not sure if I'm using it correctly to start with)

  • Avatar of Zeksie Zeksie Oct 24, 2010 at 12:46 UTC - 0 likes

    Updates are coming. I expect role problem is related to the wow inspect bug.

  • Avatar of mysticalos mysticalos Oct 21, 2010 at 17:44 UTC - 0 likes

    still doesn't work right in 4.0. ensidiafails is spamming away on tanks cause LGT is not returning "tank" for the right classes/specs. and all EF is passes the check onto the lib

    debugging i have found that this works

    /dump LibStub("LibGroupTalents-1.0"):GetUnitRole("player")

    it can return my role fine. ANYONE elses role returns nil

    /dump LibStub("LibGroupTalents-1.0"):GetUnitRole("target") nil

    always nil. :\

    Last edited Oct 21, 2010 by mysticalos


Date created
Aug 21, 2009
Last update
Oct 12, 2012
Development stage
  • enUS
MIT License
Reverse relationships
Recent files
  • A: r74 for 5.0.5 Oct 12, 2012
  • A: r73 for 5.0.4 Aug 29, 2012
  • A: r72 for 5.0.4 Aug 29, 2012
  • A: r71 for 5.0.4 Aug 29, 2012
  • A: r70 for 4.0.6 May 19, 2012