-- 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)