From 98c77514162032ea7ca2b97ee74d3c39825d064b Mon Sep 17 00:00:00 2001 From: Brues <5278969+brues-code@users.noreply.github.com> Date: Sun, 30 Aug 2026 17:11:15 -0500 Subject: [PATCH] Utilize CAPI Tracking functions commit 8ea5c817894329879621eab7c56ecaad5dd0bb3e Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Mon Aug 24 23:40:01 2026 -0500 bump CAPI min to 1.12.4 commit 39a46563a160e80fad56827e8b14b50c8460f00c Author: Brues <5278969+brues-code@users.noreply.github.com> Date: Mon Aug 24 23:35:49 2026 -0500 tracking: use native ClassicAPI tracking API Replace the hardcoded knownTrackingSpells class table and the icon-substring spellbook scan with ClassicAPI's native tracking functions: - RefreshSpells now enumerates GetNumTrackingTypes() / GetTrackingInfo(), which the DLL derives from the spellbook by tracking-aura effect. This drops the per-class spell/icon table and picks up server-custom trackers (e.g. Turtle's Find Trees) automatically. - Selecting a tracker in the menu uses SetTracking(index) instead of CastSpell(slot, BOOKTYPE_SPELL). - Keep the Druid Cat Form gate on Track Humanoids (5225) and the existing invalidSpells filter. Falls back to no entries if the tracking API is absent. Active icon (GetTrackingTexture), cancel (CancelTrackingBuff), and the hover tooltip (GameTooltip:SetTrackingSpell) were already native and are unchanged. Fixes #42 --- modules/tracking.lua | 113 +++++++++---------------------------------- pfUI.lua | 2 +- 2 files changed, 24 insertions(+), 91 deletions(-) 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"