diff --git a/api/unitframes.lua b/api/unitframes.lua index 2ce61e66..4b8facab 100644 --- a/api/unitframes.lua +++ b/api/unitframes.lua @@ -235,7 +235,50 @@ function pfUI.api.GetUnitStats(unitstr) end local aggrodata = { } -local aggroScan = nil -- static { u, t, tt } triples, built once so the hot scan allocates nothing + +-- every unit whose target or target's target UnitHasAggro checks, as static +-- { u, t, tt } triples so the hot scan allocates nothing +local aggroScan = { } +do + local function add(u) + local t = u .. "target" + table.insert(aggroScan, { u = u, t = t, tt = t .. "target" }) + end + + add("pet") + add("player") + add("target") + add("mouseover") + + add("focus") + add("focustarget") + add("focustargettarget") + + add("pettarget") + add("playertarget") + add("targettarget") + add("mouseovertarget") + add("targettargettarget") + + for i=1,4 do + add("party" .. i) + add("party" .. i .. "target") + add("partypet" .. i) + add("partypet" .. i .. "target") + end + + for i=1,40 do + add("raid" .. i) + add("raid" .. i .. "target") + + add("raidpet" .. i) + add("raidpet" .. i .. "target") + + add("nameplate" .. i) + add("nameplate" .. i .. "target") + end +end + function pfUI.api.UnitHasAggro(unit) local now = GetTime() local data = aggrodata[unit] @@ -250,16 +293,6 @@ function pfUI.api.UnitHasAggro(unit) data.state = 0 if UnitExists(unit) and UnitIsFriend(unit, "player") then - -- pfValidUnits never changes after load, so precompute the "target" / - -- "targettarget" token strings once instead of concatenating per call. - if not aggroScan then - aggroScan = {} - for u in pairs(pfValidUnits) do - local t = u .. "target" - table.insert(aggroScan, { u = u, t = t, tt = t .. "target" }) - end - end - for i = 1, table.getn(aggroScan) do local s = aggroScan[i] if UnitExists(s.t) and UnitIsUnit(s.t, unit) and UnitCanAttack(s.u, unit) then @@ -349,11 +382,10 @@ function pfUI.uf:UpdateVisibility() -- this runs for every frame five times a second, so only touch the -- attribute when the unit actually changed - local unitstr = (self.label or "") .. (self.id or "") - local unit = unitstr ~= "" and unitstr or nil - if unit ~= self.unitstr then - self.unitstr = unit - self:SetAttribute("unit", unit) + local unitstr = self.label .. self.id + if unitstr ~= self.unitstr then + self.unitstr = unitstr + self:SetAttribute("unit", unitstr) end -- anything but "show"/"hide" means "show if the unit exists" local visibility = "exists" @@ -395,9 +427,7 @@ function pfUI.uf:UpdateVisibility() self:RegisterUnitEvents(visibility ~= "hide" and self.unitstr or nil) -- vanilla visibility - if self.unitname then - self:Show() - elseif visibility == "hide" then + if visibility == "hide" then self:Hide() elseif visibility == "show" then self:Show() @@ -1246,8 +1276,6 @@ function pfUI.uf.OnUpdate() end end - if not this.label or this.label == "" then return end - -- update portrait on first visible frame if this.portrait and this.portrait.model and this.portrait.model.update then this.portrait.model.lastUnit = UnitName(this.portrait.model.update) @@ -1334,11 +1362,7 @@ end -- ============================================================ function pfUI.uf.OnClick() - if not this.label and this.unitname then - TargetByName(this.unitname, true) - else - pfUI.uf:ClickAction(arg1) - end + pfUI.uf:ClickAction(arg1) end function pfUI.uf:ClickAction(button) @@ -1435,13 +1459,6 @@ function pfUI.uf:CreateUnitFrame(unit, id, config, tick) f.config = config or pfUI_config.unitframes.fallback f.tick = tick - -- disable events for unknown unitstrings - if not pfValidUnits[strlower(unit) .. id] then - f.unitname = unit - f.label, f.id = "", "" - f.RegisterEvent = function() return end - end - CreateBackdropShadow(f) f.hp = CreateFrame("Frame",nil, f) @@ -1558,9 +1575,7 @@ function pfUI.uf:CreateUnitFrame(unit, id, config, tick) f:Hide() end - if f.label ~= "" then - f:SetAttribute("unit", f.label .. f.id) - end + f:SetAttribute("unit", f.label .. f.id) -- register frame for clique _G.ClickCastFrames = ClickCastFrames or {} diff --git a/env/tables.lua b/env/tables.lua index 54e068ff..c2a7f385 100644 --- a/env/tables.lua +++ b/env/tables.lua @@ -13,38 +13,3 @@ pfGridmath = { [11] = {{11,1},{1,11}}, [12] = {{12,1},{6,2},{4,3},{3,4},{2,6},{1,12}} } - --- list of valid unitstrings -pfValidUnits = {} -pfValidUnits["pet"] = true -pfValidUnits["player"] = true -pfValidUnits["target"] = true -pfValidUnits["mouseover"] = true - -pfValidUnits["focus"] = true -pfValidUnits["focustarget"] = true -pfValidUnits["focustargettarget"] = true - -pfValidUnits["pettarget"] = true -pfValidUnits["playertarget"] = true -pfValidUnits["targettarget"] = true -pfValidUnits["mouseovertarget"] = true -pfValidUnits["targettargettarget"] = true - -for i=1,4 do - pfValidUnits["party" .. i] = true - pfValidUnits["party" .. i .. "target"] = true - pfValidUnits["partypet" .. i] = true - pfValidUnits["partypet" .. i .. "target"] = true -end - -for i=1,40 do - pfValidUnits["raid" .. i] = true - pfValidUnits["raid" .. i .. "target"] = true - - pfValidUnits["raidpet" .. i] = true - pfValidUnits["raidpet" .. i .. "target"] = true - - pfValidUnits["nameplate" .. i] = true - pfValidUnits["nameplate" .. i .. "target"] = true -end diff --git a/modules/castbar.lua b/modules/castbar.lua index c781c9b0..c71b24b5 100644 --- a/modules/castbar.lua +++ b/modules/castbar.lua @@ -150,8 +150,8 @@ pfUI:RegisterModule("castbar", function () -- One-shot poll: read C_Spell for the bar's unit, stamp or clear. Called -- from event handlers (cast start, target/focus change), never per-frame. local function RefreshBar(cb, rank) - local query = cb.unitstr ~= "" and cb.unitstr or cb.unitname - if not query or (cb.unitstr ~= "" and not UnitExists(cb.unitstr)) then + local query = cb.unitstr + if not UnitExists(query) then ClearBar(cb) return end @@ -178,7 +178,7 @@ pfUI:RegisterModule("castbar", function () end end - local function CreateCastbar(name, parent, unitstr, unitname) + local function CreateCastbar(name, parent, unitstr) local cb = CreateFrame("Frame", name, parent or UIParent) cb:SetHeight(C.global.font_size * 1.5) @@ -186,7 +186,6 @@ pfUI:RegisterModule("castbar", function () cb:SetFrameLevel(8) cb.unitstr = unitstr - cb.unitname = unitname -- icon cb.icon = CreateFrame("Frame", nil, cb) @@ -277,7 +276,7 @@ pfUI:RegisterModule("castbar", function () -- Non-player bars: if the unit disappears (target died / detarget), -- drop the bar immediately. - if this.unitstr ~= "" and this.unitstr ~= "player" and not UnitExists(this.unitstr) then + if this.unitstr ~= "player" and not UnitExists(this.unitstr) then ClearBar(this) return end @@ -423,13 +422,12 @@ pfUI:RegisterModule("castbar", function () -- endMs. delay is a positive magnitude; OnUpdate signs it "+" for casts -- and "-" for channels. Skipped during a tradeskill merge. if this.endTime and not this.tradeskillTotal then - local query = this.unitstr ~= "" and this.unitstr or this.unitname local startMs, endMs if this.isChannel then - local _, _, _, s, e = C_Spell.UnitChannelInfo(query) + local _, _, _, s, e = C_Spell.UnitChannelInfo(unit) startMs, endMs = s, e else - local _, _, _, s, e = C_Spell.UnitCastingInfo(query) + local _, _, _, s, e = C_Spell.UnitCastingInfo(unit) startMs, endMs = s, e end if startMs and endMs then @@ -544,9 +542,6 @@ pfUI:RegisterModule("castbar", function () pfUI.castbar.focus:SetHeight(C.castbar.focus.height) end - -- bind castbar to the "focus" unit token; the GUID resolves at read time - pfUI.castbar.focus.unitstr = "focus" - UpdateMovable(pfUI.castbar.focus) end end) \ No newline at end of file diff --git a/modules/focus.lua b/modules/focus.lua index 207e7f8b..9cb51504 100644 --- a/modules/focus.lua +++ b/modules/focus.lua @@ -29,38 +29,15 @@ pfUI:RegisterModule("focus", function () end) -- /focus and /clearfocus live in ClassicAPI's SlashCommandsRegistry now. --- /focusname is pfUI-specific because the engine has no name→GUID --- lookup for off-screen units — we resolve via a short target-swap. +-- `/focus Name` takes the nearest prefix match; /focusname tries the exact +-- name first, so "Bob" still wins over a nearer "Bobby". pfUI.api.RegisterSlashCommand("PFFOCUSNAME", { '/focusname', '/pffocusname' }, function(msg) if msg == "" then return end - local prevGUID = UnitGUID("target") - local prevPlayer = UnitIsUnit("target", "player") - - -- Suppress async "Unknown unit" errors fired by TargetByName misses. - UIErrorsFrame:UnregisterEvent("UI_ERROR_MESSAGE") - - -- Try exact match first, then prefix match via /target. - TargetByName(msg, true) - if not UnitExists("target") then - SlashCmdList.TARGET(msg) - end - - if UnitExists("target") then - FocusUnit("target") - end - - RunNextFrame(function() - UIErrorsFrame:RegisterEvent("UI_ERROR_MESSAGE") - end) - - if prevGUID and prevGUID ~= "0x0000000000000000" then - TargetUnit(prevGUID) - elseif prevPlayer then - TargetUnit("player") - else - ClearTarget() + local unit = UnitTokenFromName(msg, true) or UnitTokenFromName(msg) + if unit then + FocusUnit(unit) end end, true)