Files
pfUI/modules/superwow.lua
T
Brues f37ea00226 Give pfUI its own EventRegistry and move event-only frames onto it
pfUI.events was a bare CallbackRegistry for pfUI's custom events. Build it
from ClassicAPI's EventRegistry instead, so the same object also takes game
events through RegisterFrameEventAndCallback, sharing one frame for all of
them.

Move the frames that existed only to listen for a few events onto it:
libspell, focus, pixelperfect, innervatecall, loothistory, unusable,
equipmentmanager (bank + window refresh), the actionbar grid, updatenotify,
turtle-wow's steady shot, nampower's spell queue, superwow's group tracking
and unitxp's notifications, plus newitem and mapreveal, which used the
global EventRegistry. Handlers take their payload as arguments instead of
the event/arg globals, and the per-frame PLAYER_LOGOUT teardown goes away,
since the registry unregisters its frame on logout.
2026-10-30 12:37:56 -05:00

175 lines
5.9 KiB
Lua

-- Compatibility layer to use castbars provided by SuperWoW:
-- https://github.com/balakethelock/SuperWoW
-- DLL Status Check Command (always available)
pfUI.api.RegisterSlashCommand("PFDLLSTATUS", { "/pfdll" }, function()
local chat = DEFAULT_CHAT_FRAME
chat:AddMessage("|cff33ffccpfUI|r: DLL Status Check")
-- SuperWoW
if SUPERWOW_VERSION then
chat:AddMessage(" |cff00ff00SuperWoW|r: v" .. tostring(SUPERWOW_VERSION))
elseif SpellInfo or SetAutoloot then
chat:AddMessage(" |cffffff00SuperWoW|r: Detected (old version)")
else
chat:AddMessage(" |cffff0000SuperWoW|r: Not detected")
end
-- Nampower
if GetNampowerVersion then
chat:AddMessage(" |cff00ff00Nampower|r: v" .. tostring(GetNampowerVersion()))
else
chat:AddMessage(" |cffff0000Nampower|r: Not detected")
end
-- ClassicAPI
if CLASSIC_API_VERSION then
chat:AddMessage(" |cff00ff00ClassicAPI|r: v" .. CLASSIC_API_VERSION)
else
chat:AddMessage(" |cffff0000ClassicAPI|r: Not detected")
end
-- Check if castbar exists for indicator positioning
if pfUI.castbar and pfUI.castbar.player then
chat:AddMessage(" |cff00ff00Castbar|r: Available for indicator anchoring")
else
chat:AddMessage(" |cffffff00Castbar|r: Not available (indicators use fallback position)")
end
-- Check indicator frames
if pfUI.uf and pfUI.uf.target then
chat:AddMessage(" |cff00ff00Target frame|r: exists")
else
chat:AddMessage(" |cffff0000Target frame|r: NOT found")
end
end, true)
pfUI:RegisterModule("superwow", function ()
if SetAutoloot and SpellInfo and not SUPERWOW_VERSION then
-- Turn every enchanting link that we create in the enchanting frame,
-- from "spell:" back into "enchant:". The enchant-version is what is
-- used by all unmodified game clients. This is required to generate
-- usable links for everyone from the enchant frame while having SuperWoW.
local HookGetCraftItemLink = GetCraftItemLink
_G.GetCraftItemLink = function(index)
local link = HookGetCraftItemLink(index)
return string.gsub(link, "spell:", "enchant:")
end
-- Convert every enchanting link that we receive into a
-- spell link, as for some reason SuperWoW can't handle
-- enchanting links at all and requires it to be a spell.
local HookSetItemRef = SetItemRef
_G.SetItemRef = function(link, text, button)
link = string.gsub(link, "enchant:", "spell:")
HookSetItemRef(link, text, button)
end
local HookGameTooltipSetHyperlink = GameTooltip.SetHyperlink
_G.GameTooltip.SetHyperlink = function(self, link)
link = string.gsub(link, "enchant:", "spell:")
HookGameTooltipSetHyperlink(self, link)
end
DEFAULT_CHAT_FRAME:AddMessage("|cffffffaaAn old version of SuperWoW was detected. Please consider updating:")
DEFAULT_CHAT_FRAME:AddMessage("-> https://github.com/balakethelock/SuperWoW/releases/")
end
-- compare numerically: an exact string match silently drops this on any
-- SuperWoW release past 1.5
local swVersion = tonumber(SUPERWOW_VERSION)
if swVersion and swVersion >= 1.5 then
QueueFunction(function()
local pfCombatText_AddMessage = _G.CombatText_AddMessage
_G.CombatText_AddMessage = function(message, a, b, c, d, e, f)
local match, _, hex = string.find(message, ".+ %[(0x.+)%]")
if hex and UnitName(hex) then
message = string.gsub(message, hex, UnitName(hex))
end
pfCombatText_AddMessage(message, a, b, c, d, e, f)
end
end)
end
-- TrackUnit API for adding group members to minimap
-- Tracks friendly units on the minimap for easier group coordination
if TrackUnit and C.unitframes.track_group == "1" then
local function TrackGroup()
-- Track party members
for i = 1, 4 do
local unit = "party" .. i
if UnitExists(unit) and UnitIsConnected(unit) then
pcall(TrackUnit, unit)
end
end
-- Track raid members
for i = 1, 40 do
local unit = "raid" .. i
if UnitExists(unit) and UnitIsConnected(unit) and not UnitIsUnit(unit, "player") then
pcall(TrackUnit, unit)
end
end
end
pfUI.events:RegisterFrameEventAndCallback("PARTY_MEMBERS_CHANGED", TrackGroup)
pfUI.events:RegisterFrameEventAndCallback("RAID_ROSTER_UPDATE", TrackGroup)
pfUI.events:RegisterFrameEventAndCallback("PLAYER_ENTERING_WORLD", TrackGroup)
end
-- Raid Marker Targeting API
-- Allows targeting units by raid marker ("mark1" to "mark8")
if SUPERWOW_VERSION then
pfUI.api.GetMarkedUnit = function(markIndex)
local markUnit = "mark" .. markIndex
if UnitExists(markUnit) then
return markUnit
end
return nil
end
pfUI.api.TargetMark = function(markIndex)
local markUnit = "mark" .. markIndex
if UnitExists(markUnit) then
TargetUnit(markUnit)
return true
end
return false
end
-- Get owner of pet/totem using "owner" suffix
pfUI.api.GetUnitOwner = function(unit)
local ownerUnit = unit .. "owner"
if UnitExists(ownerUnit) then
return UnitName(ownerUnit), ownerUnit
end
return nil
end
end
-- Clickthrough Mode API
-- Allows clicking through corpses to loot underneath
if Clickthrough then
pfUI.api.SetClickthrough = function(enabled)
Clickthrough(enabled and 1 or 0)
end
pfUI.api.GetClickthrough = function()
return Clickthrough() == 1
end
pfUI.api.ToggleClickthrough = function()
local current = Clickthrough()
Clickthrough(current == 1 and 0 or 1)
return Clickthrough() == 1
end
-- Add slash command for clickthrough toggle
pfUI.api.RegisterSlashCommand("PFCLICKTHROUGH", { "/clickthrough", "/ct" }, function()
local enabled = pfUI.api.ToggleClickthrough()
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: Clickthrough mode " .. (enabled and "|cff00ff00enabled|r" or "|cffff0000disabled|r"))
end, true)
end
end)