Files
pfUI/modules/tracking.lua
T
2026-03-20 22:15:42 -07:00

233 lines
7.2 KiB
Lua

pfUI:RegisterModule("tracking", "vanilla", 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"
local knownTrackingSpellTextures = {
any = {
"Racial_Dwarf_FindTreasure", -- Find Treasure
"Spell_Nature_Earthquake", -- Find Minerals
"INV_Misc_Flower_02", -- Find Herbs
"inv_tradeskillitem_03" -- Find Trees (TurtleWow Survival)
},
HUNTER = {
"Ability_Tracking", -- Track Beasts, 4+
"Spell_Holy_PrayerOfHealing", -- Track Humanoids, 10+
"Spell_Shadow_DarkSummoning", -- Track Undead, 18+
"Ability_Stealth", -- Track Hidden, 24+
"Spell_Frost_SummonWaterElemental", -- Track Elementals, 26+
"Spell_Shadow_SummonFelHunter", -- Track Deamons, 32+
"Ability_Racial_Avatar", -- Track Giants, 40+
"INV_Misc_Head_Dragon_01" -- Track Dragonkin, 50+
},
PALADIN = {
"Spell_Holy_SenseUndead" -- Sense Undead, 20+
},
WARLOCK = {
"Spell_Shadow_Metamorphosis" -- Sense Demons, 24+
},
DRUID = {
"Ability_Tracking" -- Track Humanoids, 32+, Cat Form only!
}
}
local state = {
texture = nil,
spells = {}
}
pfUI.tracking = CreateFrame("Button", "pfUITracking", UIParent)
pfUI.tracking.invalidSpells = {}
pfUI.tracking:SetFrameStrata("HIGH")
CreateBackdrop(pfUI.tracking, border)
CreateBackdropShadow(pfUI.tracking)
pfUI.tracking:SetPoint("TOPLEFT", pfUI.minimap, -10, -10)
UpdateMovable(pfUI.tracking)
pfUI.tracking:SetWidth(size)
pfUI.tracking:SetHeight(size)
pfUI.tracking.icon = pfUI.tracking:CreateTexture("BACKGROUND")
pfUI.tracking.icon:SetTexCoord(.08, .92, .08, .92)
pfUI.tracking.icon:SetAllPoints(pfUI.tracking)
pfUI.tracking.menu = CreateFrame("Frame", "pfUIDropDownMenuTracking", nil, "UIDropDownMenuTemplate")
pfUI.tracking:RegisterEvent("PLAYER_ENTERING_WORLD")
pfUI.tracking:RegisterEvent("PLAYER_AURAS_CHANGED")
pfUI.tracking:RegisterEvent("SPELLS_CHANGED")
pfUI.tracking:RegisterEvent("UPDATE_SHAPESHIFT_FORMS")
pfUI.tracking:SetScript("OnEvent", function()
if event == "SPELLS_CHANGED" then
state.spells = {}
end
this:RefreshSpells()
this:RefreshMenu()
end)
pfUI.tracking:SetScript("OnUpdate", function()
if this.pulse then
local _,_,_,alpha = this.icon:GetVertexColor()
local fpsmod = GetFramerate() / 30
if not alpha or alpha >= 0.9 then
this.modifier = -0.03 / fpsmod
elseif alpha <= .5 then
this.modifier = 0.03 / fpsmod
end
this.icon:SetVertexColor(1,1,1,alpha + this.modifier)
end
end)
pfUI.tracking:RegisterForClicks("LeftButtonUp", "RightButtonUp")
pfUI.tracking:SetScript("OnClick", function()
if arg1 == "RightButton" then
pfUI.tracking:InitMenu()
ToggleDropDownMenu(1, nil, pfUI.tracking.menu, this, -5, -5)
end
if arg1 == "LeftButton" and state.texture then
CancelTrackingBuff()
end
end)
pfUI.tracking:SetScript("OnEnter", function()
GameTooltip_SetDefaultAnchor(GameTooltip, this)
if state.texture then
GameTooltip:SetTrackingSpell()
else
GameTooltip:SetText(T["No tracking spell active"])
end
GameTooltip:Show()
end)
pfUI.tracking:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
function pfUI.tracking:RefreshSpells()
local _, playerClass = UnitClass("player")
local isCatForm = pfUI.tracking:PlayerIsDruidInCatForm(playerClass)
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)
-- disable and remove invalid spells
if pfUI.tracking.invalidSpells[spellName] then
-- delete all previously set bad spell icons
for _, texture in pairs(knownTrackingSpellTextures["any"]) do
if spellTexture and strfind(spellTexture, texture) then
state.spells[texture] = nil
end
end
-- unset current variable to stop here
spellTexture = nil
end
-- scan for generic tracking icons
for _, texture in pairs(knownTrackingSpellTextures["any"]) do
if spellTexture and strfind(spellTexture, texture) and not state.spells[texture] then
state.spells[texture] = {
index = spellIndex,
name = GetSpellName(spellIndex, BOOKTYPE_SPELL),
texture = spellTexture
}
end
end
-- scan class specific tracking icons
if knownTrackingSpellTextures[playerClass] then
for _, texture in pairs(knownTrackingSpellTextures[playerClass]) do
if spellTexture and strfind(spellTexture, texture) and not state.spells[texture] then
state.spells[texture] = {
index = spellIndex,
name = GetSpellName(spellIndex, BOOKTYPE_SPELL),
texture = spellTexture
}
end
end
end
end
end
-- remove humanoid tracking for non-cat druids
if playerClass == "DRUID" and not isCatForm then
state.spells["Ability_Tracking"] = nil
end
end
function pfUI.tracking:RefreshMenu()
local texture = GetTrackingTexture()
if texture and texture ~= state.texture then
state.texture = texture
pfUI.tracking.pulse = nil
pfUI.tracking.icon:SetTexture(texture)
pfUI.tracking.icon:SetVertexColor(1,1,1,1)
pfUI.tracking:Show()
elseif not texture then
state.texture = nil
if pulse and HasEntries(state.spells) then
pfUI.tracking.pulse = true
pfUI.tracking.icon:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark")
pfUI.tracking.icon:SetVertexColor(1,1,1,1)
pfUI.tracking:Show()
else
pfUI.tracking.pulse = nil
pfUI.tracking:Hide()
end
end
end
function pfUI.tracking:PlayerIsDruidInCatForm(playerClass)
if playerClass == "DRUID" then
for i = 0, 31 do
local texture = GetPlayerBuffTexture(i)
if not texture then break end
if strfind(texture, "Ability_Druid_CatForm") then
return true
end
end
end
return false
end
function pfUI.tracking:InitMenu()
UIDropDownMenu_Initialize(pfUI.tracking.menu, function ()
UIDropDownMenu_AddButton({text = T["Minimap Tracking"], isTitle = 1})
for _, spell in pairs(state.spells) do
UIDropDownMenu_AddButton({
text = spell.name,
icon = spell.texture,
tCoordLeft = .1,
tCoordRight = .9,
tCoordTop = .1,
tCoordBottom = .9,
checked = spell.texture == state.texture,
arg1 = spell,
func = function (arg1)
CastSpell(arg1.index, BOOKTYPE_SPELL)
CloseDropDownMenus()
end
})
end
end, "MENU")
end
end)