3 Commits
Author SHA1 Message Date
Brues cf47d8caba Use SetSpellByID for tooltip 2026-08-06 00:33:12 -05:00
Brues 71f8f74237 Support #showtooltip spell:<id> and item:<id>
GetSpell/GetItem now resolve explicit spell:/item: ID forms. spell:<id>
prefers the player's spellbook entry via FindSpellBookSlotByID (per-rank
and pet aware) for full cost/cooldown/usability, falling back to an
id-only entry rendered via SetSpellByID for spells not in the book.
item:<id> reuses the existing numeric lookup for location-aware tooltips.

Guard the id-only path against nil spellSlot/cost in TestForActiveAction
and GetActionCooldown so display-only spell references don't crash.

Remove the dead, no-op GetSpellSlotByID stub.
2026-08-06 00:15:19 -05:00
Brues 1a98a05b7e Remove redundant local 'i' declarations
Delete unnecessary local 'i' declarations in Extensions/Mouseover/pfUI.lua (ResolvePfUnit, RegisterPartyScripts, RegisterRaidScripts, RegisterRaidMarkScripts). The for-loop headers already provide a local loop variable, so the explicit locals were redundant and could shadow variables. No functional change.
2026-08-02 15:18:48 -05:00
4 changed files with 33 additions and 23 deletions
+6 -7
View File
@@ -970,7 +970,10 @@ function CleveRoids.TestForActiveAction(actions)
actions.active.oom = (manaToCheck < actions.active.spell.cost) actions.active.oom = (manaToCheck < actions.active.spell.cost)
end end
local start, duration = GetSpellCooldown(actions.active.spell.spellSlot, actions.active.spell.bookType) local start, duration = 0, 0
if actions.active.spell.spellSlot then
start, duration = GetSpellCooldown(actions.active.spell.spellSlot, actions.active.spell.bookType)
end
local onCooldown = (start > 0 and duration > 0) local onCooldown = (start > 0 and duration > 0)
if actions.active.isReactive then if actions.active.isReactive then
@@ -4189,11 +4192,7 @@ function GameTooltip.SetAction(self, slot)
local current_spell_data = CleveRoids.GetSpell(action_name) local current_spell_data = CleveRoids.GetSpell(action_name)
if current_spell_data and current_spell_data.id then if current_spell_data and current_spell_data.id then
if current_spell_data.spellSlot and current_spell_data.bookType then GameTooltip:SetSpellByID(current_spell_data.id)
GameTooltip:SetSpell(current_spell_data.spellSlot, current_spell_data.bookType)
else
GameTooltip:SetSpellByID(current_spell_data.id)
end
GameTooltip:Show() GameTooltip:Show()
return return
end end
@@ -4626,7 +4625,7 @@ function GetActionCooldown(slot)
return GetInventoryItemCooldown("player", slotId) return GetInventoryItemCooldown("player", slotId)
end end
if a.spell then if a.spell and a.spell.spellSlot then
return GetSpellCooldown(a.spell.spellSlot, a.spell.bookType) return GetSpellCooldown(a.spell.spellSlot, a.spell.bookType)
elseif a.item then elseif a.item then
if a.item.bagID and a.item.slot then if a.item.bagID and a.item.slot then
-4
View File
@@ -34,7 +34,6 @@ local function ResolvePfUnit(frame, fallbackName)
name = strlower(name) name = strlower(name)
local candidates = { "target", "targettarget", "player", "pet" } local candidates = { "target", "targettarget", "player", "pet" }
local i
for i = 1, 4 do for i = 1, 4 do
table.insert(candidates, "party"..i) table.insert(candidates, "party"..i)
table.insert(candidates, "partypet"..i) table.insert(candidates, "partypet"..i)
@@ -156,7 +155,6 @@ end
function Extension.RegisterPartyScripts() function Extension.RegisterPartyScripts()
if not pfUI or not pfUI.uf or not pfUI.uf.group then return end if not pfUI or not pfUI.uf or not pfUI.uf.group then return end
local i
for i = 0, 4 do for i = 0, 4 do
local frame = pfUI.uf.group[i] local frame = pfUI.uf.group[i]
if frame then if frame then
@@ -184,7 +182,6 @@ end
function Extension.RegisterRaidScripts() function Extension.RegisterRaidScripts()
if not pfUI or not pfUI.uf or not pfUI.uf.raid then return end if not pfUI or not pfUI.uf or not pfUI.uf.raid then return end
local i
for i = 1, 40 do for i = 1, 40 do
local frame = pfUI.uf.raid[i] local frame = pfUI.uf.raid[i]
if frame then if frame then
@@ -336,7 +333,6 @@ end
function Extension.RegisterRaidMarkScripts() function Extension.RegisterRaidMarkScripts()
if not pfUI or not pfUI.raidmarkers or not pfUI.raidmarkers.rows then return end if not pfUI or not pfUI.raidmarkers or not pfUI.raidmarkers.rows then return end
local i
for i = 1, 8 do for i = 1, 8 do
local row = pfUI.raidmarkers.rows[i] local row = pfUI.raidmarkers.rows[i]
if row then if row then
+27
View File
@@ -421,6 +421,27 @@ end
function CleveRoids.GetSpell(text) function CleveRoids.GetSpell(text)
text = CleveRoids.Trim(text) text = CleveRoids.Trim(text)
-- Explicit "spell:<id>" form. If the player knows the spell, reuse its cached
-- spellbook entry (full cost/cooldown/usability). FindSpellBookSlotByID
-- (ClassicAPI) resolves per-rank IDs and pet spells natively and returns the
-- same bookType string CleveRoids.Spells is keyed by. If the spell is not in
-- either book, fall back to an id-only entry that SetAction renders via
-- SetSpellByID; cost=0 keeps the downstream active-action checks nil-safe.
local _, _, spellId = string.find(text, "^spell:(%d+)$")
if spellId then
spellId = tonumber(spellId)
local slot, book = FindSpellBookSlotByID(spellId)
if slot then
local name, rank = GetSpellInfo(slot, book)
local byName = name and CleveRoids.Spells[book] and CleveRoids.Spells[book][name]
if byName then
return (rank and rank ~= "" and byName[rank]) or byName.highest or byName
end
end
return { id = spellId, texture = C_Spell.GetSpellTexture(spellId) or CleveRoids.unknownTexture, cost = 0 }
end
local rs, _, rank = string.find(text, "[^%s]%((Rank %d+)%)$") local rs, _, rank = string.find(text, "[^%s]%((Rank %d+)%)$")
local name = rank and string.sub(text, 1, rs) or text local name = rank and string.sub(text, 1, rs) or text
@@ -508,6 +529,12 @@ end
function CleveRoids.GetItem(text) function CleveRoids.GetItem(text)
if not text or text == "" then return end if not text or text == "" then return end
-- Explicit "item:<id>" form: force resolution by item ID. Reuses the numeric
-- lookup below (equipped -> bags -> GetItemInfo), so location-aware tooltip
-- rendering (SetInventoryItem/SetBagItem) still applies when the player has it.
local _, _, prefixedId = string.find(text, "^item:(%d+)$")
if prefixedId then text = prefixedId end
local Items = CleveRoids.Items local Items = CleveRoids.Items
local item = Items[text] or Items[tostring(text)] local item = Items[text] or Items[tostring(text)]
if not item then if not item then
-12
View File
@@ -117,18 +117,6 @@ local cachedSpellDurations = {}
local spellDurationCacheTime = {} local spellDurationCacheTime = {}
local SPELL_CACHE_DURATION = 0.5 -- Re-scan every 0.5 seconds (haste can change mid-fight) local SPELL_CACHE_DURATION = 0.5 -- Re-scan every 0.5 seconds (haste can change mid-fight)
-- Get a spell's slot in the spellbook by spell ID
local function GetSpellSlotByID(targetSpellID)
local i = 1
while true do
local spellName = GetSpellName(i, BOOKTYPE_SPELL)
if not spellName then break end
-- Note: spell ID matching done via GetSpellTexture comparison if needed
i = i + 1
end
return nil, nil
end
-- Get a spell's slot in the spellbook by name (finds highest rank by default) -- Get a spell's slot in the spellbook by name (finds highest rank by default)
-- If targetRank is specified (e.g., "Rank 5"), finds that specific rank -- If targetRank is specified (e.g., "Rank 5"), finds that specific rank
local function GetSpellSlotByName(targetSpellName, targetRank) local function GetSpellSlotByName(targetSpellName, targetRank)