Compare with Previous | Blame | View Log
local qmobs, qitems = {} , {} -- cache the data local match, format, tonumber = strmatch, format, tonumber --apparently its good for you --taken from the wonderful LibQuixote-2.0 by kemayo local objects_pattern = "^"..QUEST_OBJECTS_FOUND:gsub("(%%.)", "(.+)").."$" --QUEST_OBJECTS_FOUND = "%s: %d/%d" local monsters_pattern = "^"..QUEST_MONSTERS_KILLED:gsub("(%%.)", "(.+)").."$" --QUEST_MONSTERS_KILLED = "%s slain: %d/%d" local function ColourGradient(perc) -- for colouring in if perc <= 0.5 then return 1, perc*2, 0 else return 2 - perc*2, 1, 0 end end local function AddQuest(table, title, name, have, need) if table[name] then -- incase theres more than one quest wanting the same thing if type(table[name]) == "string" then table[name] = {table[name]} end local t = table[name] t[#t+1] = format("%s:%d/%d", title, tonumber(have), tonumber(need)) else table[name] = format("%s:%d/%d", title, tonumber(have), tonumber(need)) end end local qtitle, header, _, need, have, desc, qtype, mobname --update qmobs/qitems when quest log updates local f = CreateFrame("Frame") f:RegisterEvent("QUEST_LOG_UPDATE") f:SetScript("OnEvent", function() for i, v in pairs(qmobs) do qmobs[i] = nil end --erase tables for i, v in pairs(qitems) do qitems[i] = nil end for questid = 1, GetNumQuestLogEntries() do qtitle, _, _, _, header = GetQuestLogTitle(questid) if not header and GetNumQuestLeaderBoards(questid) > 0 then for questob = 1, GetNumQuestLeaderBoards(questid) do desc, qtype = GetQuestLogLeaderBoard(questob, questid) if qtype == "monster" then mobname, have, need = desc:match(monsters_pattern) if mobname == nil or have == nil or need == nil then AddQuest(qmobs,qtitle,desc:match("^%w+ (.+):(.+)/(.+)$")) -- Find Mankrik's Wife: 0/1 AddQuest(qmobs,qtitle,desc:match("^(.+) %w+:(.+)/(.+)$")) --Aether Rays Wrangled: 5/6 else AddQuest(qmobs,qtitle,mobname,have,need) end elseif qtype == "item" or qtype == "object" then AddQuest(qitems,qtitle,desc:match(objects_pattern)) end end end end end) local function AddQuestTooltipLine(name, table, tooltip) local obs = table[name] if obs then if type(obs) == "table" then for i, v in ipairs(obs) do qtitle, have, need = match(v, "(.+:)(%d+)/(%d+)") tooltip:AddDoubleLine(qtitle, have.."/"..need, 1, 1, 1, ColourGradient(have/need)) end else qtitle, have, need = match(obs, "(.+:)(%d+)/(%d+)") tooltip:AddDoubleLine(qtitle, have.."/"..need, 1, 1, 1, ColourGradient(have/need)) end end end --Hooks local name GameTooltip:HookScript("OnTooltipSetItem", function(tooltip) name = tooltip:GetItem() if name then AddQuestTooltipLine(name, qitems, tooltip) end end) ItemRefTooltip:HookScript("OnTooltipSetItem", function(tooltip) name = tooltip:GetItem() if name then AddQuestTooltipLine(name, qitems, tooltip) end end) GameTooltip:HookScript("OnTooltipSetUnit", function(tooltip) name = tooltip:GetUnit() if not UnitIsPlayer("mouseover") and name then AddQuestTooltipLine(name, qmobs, tooltip) end end)