117 lines
4.2 KiB
Lua
117 lines
4.2 KiB
Lua
-- Ade Alts: tooltip (recipe items show which of your alts can learn them)
|
|
local AA = AdeAlts
|
|
|
|
local PREFIX = { Pattern = 1, Recipe = 1, Plans = 1, Formula = 1, Schematic = 1, Manual = 1, Design = 1, Book = 1, Technique = 1 }
|
|
|
|
-- finds the craft(s) taught by the item in the tooltip: by item id (from the item link) first,
|
|
-- then by the "Teaches you how to craft X" line, finally by the item name
|
|
local function FindHits(tt)
|
|
local idx = AA.RIndex()
|
|
if tt.adeLink then
|
|
local _, _, id = string.find(tt.adeLink, "item:(%d+)")
|
|
if id and idx.byItem[tonumber(id)] then return idx.byItem[tonumber(id)] end
|
|
end
|
|
local name = tt:GetName()
|
|
local title
|
|
for i = 1, tt:NumLines() do
|
|
local fs = getglobal(name .. "TextLeft" .. i)
|
|
local txt = fs and fs:GetText()
|
|
if txt then
|
|
if i == 1 then title = txt end
|
|
local _, _, id = string.find(txt, "ItemID: (%d+)")
|
|
if id and idx.byItem[tonumber(id)] then return idx.byItem[tonumber(id)] end
|
|
local _, _, craft = string.find(txt, "Teaches you how to craft (.-)%.?$")
|
|
if craft and idx.byAny[string.lower(craft)] then return idx.byAny[string.lower(craft)] end
|
|
end
|
|
end
|
|
if title then
|
|
local _, _, pre, nm = string.find(title, "^(%a+): (.+)$")
|
|
if pre and PREFIX[pre] and idx.byAny[string.lower(nm)] then return idx.byAny[string.lower(nm)] end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function AA.EnhanceTooltip(tt)
|
|
if not AA.db or not AA.RIndex or tt.adeDone then return end
|
|
local hits = FindHits(tt)
|
|
if not hits then return end
|
|
tt.adeDone = true
|
|
local added = false
|
|
for _, h in ipairs(hits) do
|
|
local key = string.lower(h.c[2])
|
|
for _, k in ipairs(AA.SortedAlts()) do
|
|
local ch = AA.db.chars[k]
|
|
local p = ch and ch.prof and ch.prof[h.prof]
|
|
if p then
|
|
if not added then
|
|
tt:AddLine(" ")
|
|
tt:AddLine("Ade Alts", 0.2, 1, 0.8)
|
|
added = true
|
|
end
|
|
local col = "|cff" .. AA.ClassHex(ch.class)
|
|
local label
|
|
if not p.rec then
|
|
label = "|cff808080" .. h.prof .. " recipes not scanned|r"
|
|
else
|
|
local has = false
|
|
for _, n in ipairs(p.rec) do
|
|
if string.lower(n) == key then has = true; break end
|
|
end
|
|
if has then
|
|
label = "|cff808080already known|r"
|
|
elseif h.c[3] > (p.r or 0) then
|
|
label = "|cffff6060needs " .. h.prof .. " " .. h.c[3] .. " (has " .. (p.r or 0) .. ")|r"
|
|
else
|
|
label = "|cff40ff40can learn now|r"
|
|
end
|
|
end
|
|
tt:AddDoubleLine(col .. ch.name .. "|r", label)
|
|
end
|
|
end
|
|
end
|
|
if added then tt:Show() end
|
|
end
|
|
|
|
-- tooltip functions that show an item: remember the item link, then add our lines
|
|
local GETTERS = {
|
|
SetBagItem = function(a, b) return GetContainerItemLink(a, b) end,
|
|
SetInventoryItem = function(a, b) return GetInventoryItemLink(a, b) end,
|
|
SetHyperlink = function(a) return a end,
|
|
SetLootItem = function(a) return GetLootSlotLink(a) end,
|
|
SetMerchantItem = function(a) return GetMerchantItemLink(a) end,
|
|
SetAuctionItem = function(a, b) return GetAuctionItemLink(a, b) end,
|
|
SetQuestItem = function(a, b) return GetQuestItemLink(a, b) end,
|
|
SetQuestLogItem = function(a, b) return GetQuestLogItemLink(a, b) end,
|
|
SetTradePlayerItem = function(a) return GetTradePlayerItemLink(a) end,
|
|
SetTradeTargetItem = function(a) return GetTradeTargetItemLink(a) end,
|
|
SetInboxItem = function(a) return GetInboxItemLink and GetInboxItemLink(a, 1) end,
|
|
SetTradeSkillItem = function(a, b) return GetTradeSkillItemLink and GetTradeSkillItemLink(a) end,
|
|
}
|
|
|
|
local function Hook(tt)
|
|
if not tt then return end
|
|
for fname, getter in pairs(GETTERS) do
|
|
local orig = tt[fname]
|
|
if orig then
|
|
tt[fname] = function(self, a, b, c, d)
|
|
local r1, r2, r3 = orig(self, a, b, c, d)
|
|
self.adeDone = nil
|
|
local ok, link = pcall(getter, a, b)
|
|
self.adeLink = ok and link or nil
|
|
AA.EnhanceTooltip(self)
|
|
return r1, r2, r3
|
|
end
|
|
end
|
|
end
|
|
-- forget the item when the tooltip closes
|
|
local oldHide = tt:GetScript("OnHide")
|
|
tt:SetScript("OnHide", function()
|
|
this.adeDone = nil
|
|
this.adeLink = nil
|
|
if oldHide then oldHide() end
|
|
end)
|
|
end
|
|
|
|
Hook(GameTooltip)
|
|
Hook(ItemRefTooltip)
|