mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-22 15:46:56 +00:00
f0d9dca63f
* focus: migrate to FocusUnit / "focus" token / PLAYER_FOCUS_CHANGED
ClassicAPI now polyfills modern WoW's focus system: FocusUnit / ClearFocus
+ "focus" / "focustarget" unit tokens accepted by every UnitX function +
PLAYER_FOCUS_CHANGED event. Drop pfUI's GUID-juggling pseudo-frame.
- env/tables.lua: add "focus" and "focustarget" to pfValidUnits — the
focus frames now follow the standard event-driven CreateUnitFrame path
with f.label = "focus"
- modules/focus.lua: rewrite. Slash commands use FocusUnit / ClearFocus
directly; no more manual frame.label/unitname/id manipulation. /focus
<name> still does a target-swap to resolve names → units, then
FocusUnit("target") captures the GUID before the target is restored.
PLAYER_FOCUS_CHANGED triggers immediate frame refresh on assign/clear.
- api/unitframes.lua: delete the pseudo-focus block (per-tick "scan all
units for matching name" loop) and the "focus"/"focustarget" special-
case in the visibility branch — "focus" is now a real token.
- modules/castbar.lua: bind the focus castbar to unitstr = "focus" once;
drop the OnUpdate that synced pfUI.castbar.focus from
pfUI.uf.focus.label/unitname. UnitGUID("focus") resolves at read time.
- Drop C_Minimap.SetFocusByGUID / SetFocusByName / ClearFocus calls —
C_Minimap subscribes to PLAYER_FOCUS_CHANGED on its own.
Net -183 lines. Focus stops being a pfUI-special pseudo-frame and
becomes "just another unit token" — same treatment as target/player.
* add nameplate to valid units
---------
Co-authored-by: Brues <5278969+brues-code@users.noreply.github.com>
130 lines
3.8 KiB
Lua
130 lines
3.8 KiB
Lua
pfUI:RegisterModule("focus", function ()
|
|
-- do not go further on disabled UFs
|
|
if C.unitframes.disable == "1" then return end
|
|
|
|
pfUI.uf.focus = pfUI.uf:CreateUnitFrame("Focus", nil, C.unitframes.focus, .2)
|
|
pfUI.uf.focus:UpdateFrameSize()
|
|
pfUI.uf.focus:SetPoint("BOTTOMLEFT", UIParent, "BOTTOM", 220, 220)
|
|
UpdateMovable(pfUI.uf.focus)
|
|
pfUI.uf.focus:Hide()
|
|
|
|
pfUI.uf.focustarget = pfUI.uf:CreateUnitFrame("FocusTarget", nil, C.unitframes.focustarget, .2)
|
|
pfUI.uf.focustarget:UpdateFrameSize()
|
|
pfUI.uf.focustarget:SetPoint("BOTTOMLEFT", pfUI.uf.focus, "TOP", 0, 10)
|
|
UpdateMovable(pfUI.uf.focustarget)
|
|
pfUI.uf.focustarget:Hide()
|
|
|
|
-- PLAYER_FOCUS_CHANGED drives immediate refresh on focus assign / clear.
|
|
-- The frame's 0.2s tick keeps health/power/aura data fresh between events.
|
|
local refresher = CreateFrame("Frame")
|
|
refresher:RegisterEvent("PLAYER_FOCUS_CHANGED")
|
|
refresher:SetScript("OnEvent", function()
|
|
pfUI.uf.focus.instantRefresh = true
|
|
pfUI.uf:RefreshUnit(pfUI.uf.focus, "all")
|
|
pfUI.uf.focustarget.instantRefresh = true
|
|
pfUI.uf:RefreshUnit(pfUI.uf.focustarget, "all")
|
|
end)
|
|
end)
|
|
|
|
SLASH_PFFOCUS1, SLASH_PFFOCUS2 = '/focus', '/pffocus'
|
|
function SlashCmdList.PFFOCUS(msg)
|
|
if msg == "" then
|
|
FocusUnit("target")
|
|
return
|
|
end
|
|
|
|
-- Resolve name → unit via short target-swap, capturing focus during the swap.
|
|
local prevGUID = UnitGUID("target")
|
|
local prevPlayer = UnitIsUnit("target", "player")
|
|
|
|
-- Suppress "Unknown unit" errors during targeting attempts (fired async)
|
|
UIErrorsFrame:UnregisterEvent("UI_ERROR_MESSAGE")
|
|
|
|
-- Try exact match first, then prefix match via /tar
|
|
TargetByName(msg, true)
|
|
if not UnitExists("target") then
|
|
SlashCmdList.TARGET(msg)
|
|
end
|
|
|
|
if UnitExists("target") then
|
|
FocusUnit("target")
|
|
end
|
|
|
|
-- Re-enable errors next frame
|
|
local restore = CreateFrame("Frame")
|
|
restore:SetScript("OnUpdate", function()
|
|
UIErrorsFrame:RegisterEvent("UI_ERROR_MESSAGE")
|
|
restore:SetScript("OnUpdate", nil)
|
|
end)
|
|
|
|
if prevGUID and prevGUID ~= "0x0000000000000000" then
|
|
TargetUnit(prevGUID)
|
|
elseif prevPlayer then
|
|
TargetUnit("player")
|
|
else
|
|
ClearTarget()
|
|
end
|
|
end
|
|
|
|
SLASH_PFCLEARFOCUS1, SLASH_PFCLEARFOCUS2 = '/clearfocus', '/pfclearfocus'
|
|
function SlashCmdList.PFCLEARFOCUS(msg)
|
|
ClearFocus()
|
|
end
|
|
|
|
SLASH_PFCASTFOCUS1, SLASH_PFCASTFOCUS2 = '/castfocus', '/pfcastfocus'
|
|
function SlashCmdList.PFCASTFOCUS(msg)
|
|
local focusGUID = UnitGUID("focus")
|
|
if not focusGUID or focusGUID == "0x0000000000000000" then
|
|
UIErrorsFrame:AddMessage(SPELL_FAILED_BAD_TARGETS, 1, 0, 0)
|
|
return
|
|
end
|
|
|
|
local func = pfUI.api.TryMemoizedFuncLoadstringForSpellCasts(msg)
|
|
|
|
-- GUID-based cast (Nampower) - no target toggle needed
|
|
if not func then
|
|
CastSpellByName(msg, focusGUID)
|
|
return
|
|
end
|
|
|
|
-- Lua-function cast: short target swap via GUID
|
|
local prevGUID = UnitGUID("target")
|
|
local prevPlayer = UnitIsUnit("target", "player")
|
|
|
|
TargetUnit(focusGUID)
|
|
if UnitGUID("target") ~= focusGUID then
|
|
if prevGUID and prevGUID ~= "0x0000000000000000" then
|
|
TargetUnit(prevGUID)
|
|
elseif prevPlayer then
|
|
TargetUnit("player")
|
|
else
|
|
TargetLastTarget()
|
|
end
|
|
UIErrorsFrame:AddMessage(SPELL_FAILED_BAD_TARGETS, 1, 0, 0)
|
|
return
|
|
end
|
|
|
|
func()
|
|
|
|
if prevGUID and prevGUID ~= "0x0000000000000000" then
|
|
TargetUnit(prevGUID)
|
|
elseif prevPlayer then
|
|
TargetUnit("player")
|
|
else
|
|
TargetLastTarget()
|
|
end
|
|
end
|
|
|
|
SLASH_PFSWAPFOCUS1, SLASH_PFSWAPFOCUS2 = '/swapfocus', '/pfswapfocus'
|
|
function SlashCmdList.PFSWAPFOCUS(msg)
|
|
local targetGUID = UnitGUID("target")
|
|
local oldFocusGUID = UnitGUID("focus")
|
|
|
|
if targetGUID and targetGUID ~= "0x0000000000000000" then
|
|
FocusUnit("target")
|
|
if oldFocusGUID and oldFocusGUID ~= "0x0000000000000000" then
|
|
TargetUnit(oldFocusGUID)
|
|
end
|
|
end
|
|
end
|