diff --git a/modules/tracking.lua b/modules/tracking.lua index 852a440b..ec203893 100644 --- a/modules/tracking.lua +++ b/modules/tracking.lua @@ -3,56 +3,15 @@ pfUI:RegisterModule("tracking", function () MINIMAP_TRACKING_FRAME:UnregisterAllEvents() MINIMAP_TRACKING_FRAME:Hide() - local function HasEntries(tbl) - for _ in pairs(tbl) do - return true - end - return nil - end - local rawborder, border = GetBorderSize() local size = tonumber(C.appearance.minimap.tracking_size) local pulse = C.appearance.minimap.tracking_pulse == "1" - -- Tracking spells identified by SpellID + expected icon path. - -- SpellID is the primary identifier (stable, locale-independent). - -- Icon path is used as secondary confirmation when scanning the spellbook. - local knownTrackingSpells = { - any = { - { id = 2481, icon = "Racial_Dwarf_FindTreasure" }, -- Find Treasure - { id = 2580, icon = "Spell_Nature_Earthquake" }, -- Find Minerals - { id = 2383, icon = "INV_Misc_Flower_02" }, -- Find Herbs (Rank 1) - { id = 8387, icon = "INV_Misc_Flower_02" }, -- Find Herbs (Rank 2) - { id = 52917, icon = "INV_TradeSkillItem_03" }, -- Find Trees (TurtleWow) - }, - HUNTER = { - { id = 1494, icon = "Ability_Tracking" }, -- Track Beasts - { id = 19883, icon = "Spell_Holy_PrayerOfHealing" }, -- Track Humanoids - { id = 19884, icon = "Spell_Shadow_DarkSummoning" }, -- Track Undead - { id = 19885, icon = "Ability_Stealth" }, -- Track Hidden - { id = 19880, icon = "Spell_Frost_SummonWaterElemental" }, -- Track Elementals - { id = 19878, icon = "Spell_Shadow_SummonFelHunter" }, -- Track Demons - { id = 19882, icon = "Ability_Racial_Avatar" }, -- Track Giants - { id = 19879, icon = "INV_Misc_Head_Dragon_01" }, -- Track Dragonkin - }, - PALADIN = { - { id = 5502, icon = "Spell_Holy_SenseUndead" }, -- Sense Undead - }, - WARLOCK = { - { id = 5500, icon = "Spell_Shadow_Metamorphosis" }, -- Sense Demons - }, - DRUID = { - { id = 5225, icon = "Ability_Tracking" }, -- Track Humanoids (Cat Form only) - }, - } - - -- Build a flat lookup: spellId -> entry, for fast spellbook matching - local spellIdLookup = {} - for _, entries in pairs(knownTrackingSpells) do - for _, entry in ipairs(entries) do - spellIdLookup[entry.id] = entry - end - end + -- Tracking spells come from ClassicAPI's native GetNumTrackingTypes / + -- GetTrackingInfo (see the DLL's docs/API.md "Tracking"). The DLL + -- enumerates them straight from the spellbook by tracking-aura effect, + -- so there is no spell table to maintain here and server-custom trackers + -- (e.g. Turtle's Find Trees) are picked up automatically. local state = { texture = nil, @@ -128,50 +87,24 @@ pfUI:RegisterModule("tracking", function () end) function pfUI.tracking:RefreshSpells() - local playerClass = UnitClassBase("player") - local isCatForm = pfUI.tracking:PlayerIsDruidInCatForm(playerClass) + state.spells = {} + if not GetNumTrackingTypes then return end - -- Build set of valid SpellIDs for this class - local validIds = {} - for _, entry in ipairs(knownTrackingSpells.any) do - validIds[entry.id] = true - end - if knownTrackingSpells[playerClass] then - for _, entry in ipairs(knownTrackingSpells[playerClass]) do - validIds[entry.id] = true - end - end + -- Druid Track Humanoids (5225) only casts in Cat Form. Hide it out of + -- form so the menu never offers a tracker that would fail to cast. + local isCatForm = pfUI.tracking:PlayerIsDruidInCatForm(UnitClassBase("player")) - -- Druids only get Track Humanoids in Cat Form - if playerClass == "DRUID" and not isCatForm then - validIds[5225] = nil - end - - -- Scan spellbook: match by icon path, confirm SpellID is valid for this class - for tabIndex = 1, GetNumSpellTabs() do - local _, _, offset, numSpells = GetSpellTabInfo(tabIndex) - for spellIndex = offset + 1, offset + numSpells do - local spellTexture = GetSpellTexture(spellIndex, BOOKTYPE_SPELL) - local spellName = GetSpellName(spellIndex, BOOKTYPE_SPELL) - - if pfUI.tracking.invalidSpells[spellName] then - spellTexture = nil - end - - if spellTexture then - local lowerTexture = string.lower(spellTexture) - for spellId, entry in pairs(spellIdLookup) do - if validIds[spellId] and not state.spells[spellId] - and strfind(lowerTexture, string.lower(entry.icon)) then - state.spells[spellId] = { - index = spellIndex, - name = spellName, - texture = spellTexture, - spellId = spellId, - } - end - end - end + for i = 1, GetNumTrackingTypes() do + local name, texture, _, _, spellId = GetTrackingInfo(i) + local castable = not (spellId == 5225 and not isCatForm) + if name and texture and castable + and not pfUI.tracking.invalidSpells[name] then + state.spells[i] = { + index = i, -- tracking index, passed to SetTracking() + name = name, + texture = texture, + spellId = spellId, + } end end end @@ -187,7 +120,7 @@ pfUI:RegisterModule("tracking", function () elseif not texture then state.texture = nil - if pulse and HasEntries(state.spells) then + if pulse and next(state.spells) ~= nil then pfUI.tracking.pulse = true pfUI.tracking.icon:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark") pfUI.tracking.icon:SetVertexColor(1,1,1,1) @@ -217,7 +150,7 @@ pfUI:RegisterModule("tracking", function () checked = spell.texture == state.texture, arg1 = spell, func = function (arg1) - CastSpell(arg1.index, BOOKTYPE_SPELL) + SetTracking(arg1.index) CloseDropDownMenus() end }) diff --git a/pfUI.lua b/pfUI.lua index 1b45d14f..340a9a8b 100644 --- a/pfUI.lua +++ b/pfUI.lua @@ -23,7 +23,7 @@ do -- ClassicAPI dependency check. -- pfUI relies pervasively on the modern C_* / SuperWoW / nameplate / focus -- API surface that ClassicAPI polyfills, so presence is required. - local PFUI_CLASSIC_API_MIN = 11201 -- (X*10000 + Y*100 + Z) + local PFUI_CLASSIC_API_MIN = 11204 -- (X*10000 + Y*100 + Z) local PFUI_CLASSIC_API_LATEST = PFUI_CLASSIC_API_MIN local PFUI_CLASSIC_API_WEBSITE = "https://github.com/brues-code/ClassicAPI" local PFUI_CLASSIC_API_LATEST_URL = PFUI_CLASSIC_API_WEBSITE .. "/releases/latest"