Files
AtlasLoot/Core/Tooltip.lua
T
Spit 2c4f7d8580 3.0.6 update
Added little preview frame for things like tier tokens and sets
added ability to change page with mouse wheel
some minor fixes
2025-01-04 01:23:43 +03:00

479 lines
14 KiB
Lua

-- extra info on GameTooltip and ItemRefTooltip
local AtlasLootTip = CreateFrame("Frame", "AtlasLootTip", GameTooltip)
local GREY = "|cff999999"
local lastSearchName = nil
local lastSearchID = nil
local function GetItemIDByName(name)
if name ~= lastSearchName then
for itemID = 1, 99999 do
local itemName = GetItemInfo(itemID)
if (itemName and itemName == name) then
lastSearchID = itemID
break
end
end
lastSearchName = name
end
return lastSearchID
end
local HookSetItemRef = SetItemRef
SetItemRef = function(link, text, button)
local item, _, id = string.find(link, "item:(%d+)")
ItemRefTooltip.itemID = id
HookSetItemRef(link, text, button)
if not IsShiftKeyDown() and not IsControlKeyDown() and item then
AtlasLootTip.extendTooltip(ItemRefTooltip)
end
end
local HookSetHyperlink = GameTooltip.SetHyperlink
function GameTooltip.SetHyperlink(self, arg1)
if arg1 then
local _, _, linktype = string.find(arg1, "^(.-):(.+)$")
if linktype == "item" then
local _, _, id = string.find(arg1,"item:(%d+)")
GameTooltip.itemID = id
end
end
return HookSetHyperlink(self, arg1)
end
local HookSetBagItem = GameTooltip.SetBagItem
function GameTooltip.SetBagItem(self, container, slot)
if GetContainerItemLink(container, slot) then
local _, _, id = string.find(GetContainerItemLink(container, slot),"item:(%d+)")
GameTooltip.itemID = id
end
return HookSetBagItem(self, container, slot)
end
local HookSetInboxItem = GameTooltip.SetInboxItem
function GameTooltip.SetInboxItem(self, mailID, attachmentIndex)
local itemName = GetInboxItem(mailID)
if itemName then
GameTooltip.itemID = GetItemIDByName(itemName)
end
return HookSetInboxItem(self, mailID, attachmentIndex)
end
local HookSetInventoryItem = GameTooltip.SetInventoryItem
function GameTooltip.SetInventoryItem(self, unit, slot)
if GetInventoryItemLink(unit, slot) then
local _, _, id = string.find(GetInventoryItemLink(unit, slot),"item:(%d+)")
GameTooltip.itemID = id
end
return HookSetInventoryItem(self, unit, slot)
end
local HookSetCraftItem = GameTooltip.SetCraftItem
function GameTooltip.SetCraftItem(self, skill, slot)
if GetCraftReagentItemLink(skill, slot) then
local _, _, id = string.find(GetCraftReagentItemLink(skill, slot),"item:(%d+)")
GameTooltip.itemID = id
end
return HookSetCraftItem(self, skill, slot)
end
local HookSetTradeSkillItem = GameTooltip.SetTradeSkillItem
function GameTooltip.SetTradeSkillItem(self, skillIndex, reagentIndex)
if reagentIndex then
if GetTradeSkillReagentItemLink(skillIndex, reagentIndex) then
local _, _, id = string.find(GetTradeSkillReagentItemLink(skillIndex, reagentIndex),"item:(%d+)")
GameTooltip.itemID = id
end
else
if GetTradeSkillItemLink(skillIndex) then
local _, _, id = string.find(GetTradeSkillItemLink(skillIndex),"item:(%d+)")
GameTooltip.itemID = id
end
end
return HookSetTradeSkillItem(self, skillIndex, reagentIndex)
end
local HookSetAuctionItem = GameTooltip.SetAuctionItem
function GameTooltip.SetAuctionItem(self, atype, index)
local itemName = GetAuctionItemInfo(atype, index)
if itemName then
GameTooltip.itemID = GetItemIDByName(itemName)
end
return HookSetAuctionItem(self, atype, index)
end
local HookSetAuctionSellItem = GameTooltip.SetAuctionSellItem
function GameTooltip.SetAuctionSellItem(self)
local itemName = GetAuctionSellItemInfo()
if itemName then
GameTooltip.itemID = GetItemIDByName(itemName)
end
return HookSetAuctionSellItem(self)
end
local HookSetTradePlayerItem = GameTooltip.SetTradePlayerItem
function GameTooltip.SetTradePlayerItem(self, index)
if GetTradePlayerItemLink(index) then
local _, _, id = string.find(GetTradePlayerItemLink(index),"item:(%d+)")
GameTooltip.itemID = id
end
return HookSetTradePlayerItem(self, index)
end
local HookSetTradeTargetItem = GameTooltip.SetTradeTargetItem
function GameTooltip.SetTradeTargetItem(self, index)
if GetTradeTargetItemLink(index) then
local _, _, id = string.find(GetTradeTargetItemLink(index),"item:(%d+)")
GameTooltip.itemID = id
end
return HookSetTradeTargetItem(self, index)
end
local sets = {
["SpiritofEskhandar"]=true,
["HakkariBlades"]=true,
["PrimalBlessing"]=true,
["ShardOfGods"]=true,
["DalRend"]=true,
["SpiderKiss"]=true,
["UnobMounts"]=true,
["Legendaries"]=true,
["Artifacts"]=true,
["ZGRings"]=true,
["Tabards"]=true,
}
local function SetContains(set, key)
if not set or not key then
return false
end
return set[key] ~= nil
end
local lastItemID, lastSourceStr, lastDropRate
function AtlasLootTip.extendTooltip(tooltip)
if AtlasLootCharDB.ShowSource ~= true or IsShiftKeyDown() then
return
end
local strfind = string.find
local pairs = pairs
local tooltipName = tooltip:GetName()
local originalTooltip = {}
local itemName = getglobal(tooltipName .. "TextLeft1"):GetText()
local line2 = getglobal(tooltipName .. "TextLeft2")
local craftSpell, source, sourceStr, dropRate
local isCraft, isWBLoot, isPvP, isRepReward, isSetPiece, isWorldEvent = false, false, false, false, false, false
local itemID = tonumber(tooltip.itemID)
if itemName and itemName ~= "Fashion Coin" and itemID then
if itemID ~= lastItemID then
for row = 1, 30 do
local tooltipRowLeft = getglobal(tooltipName .. 'TextLeft' .. row)
if tooltipRowLeft then
local rowtext = tooltipRowLeft:GetText()
if rowtext then
originalTooltip[row] = {}
originalTooltip[row].text = rowtext
end
end
end
for row=1, table.getn(originalTooltip) do
if strfind(originalTooltip[row].text, "—",1,true) then -- skip items that state which rep they require
return
end
end
-- first check if its craftable item
for k,v in pairs(GetSpellInfoAtlasLootDB["craftspells"]) do
if v["craftItem"] == itemID then
craftSpell = "s"..tostring(k)
end
end
for k1, v1 in pairs(AtlasLoot_Data["AtlasLootCrafting"]) do
if source then
break
end
for k2, v2 in pairs(AtlasLoot_Data["AtlasLootCrafting"][k1]) do
if v2[1] ~= 0 and v2[1] ~= "" and string.sub(v2[1], 1, 1) ~= "e" then
if (v2[1] == craftSpell or v2[1] == itemID) and
(strfind(k1, "Apprentice", 1, true) or
strfind(k1, "Journeyman", 1, true) or
strfind(k1, "Expert", 1, true) or
strfind(k1, "Artisan", 1, true) or
strfind(k1, "Goblin", 1, true) or
strfind(k1, "Gnomish", 1, true) or
strfind(k1, "Survival", 1, true) or
strfind(k1, "Herbalism", 1, true) or
strfind(k1, "FirstAid", 1, true) or
strfind(k1, "Poisons", 1, true) or
strfind(k1, "Mining", 1, true) or
strfind(k1, "Smelting", 1, true) or
strfind(k1, "Elemental", 1, true) or
strfind(k1, "Tribal", 1, true) or
strfind(k1, "Dragonscale", 1, true) or
strfind(k1, "Weaponsmith", 1, true) or
strfind(k1, "Axesmith", 1, true) or
strfind(k1, "Hammersmith", 1, true) or
strfind(k1, "Swordsmith", 1, true) or
strfind(k1, "Armorsmith", 1, true) or
strfind(k1, "Gemology", 1, true) or
strfind(k1, "Goldsmithing", 1, true))
then
source = k1
isCraft = true
lastDropRate = nil
break
end
end
end
end
-- check if its world boss loot
if not isCraft then
for k1,v1 in pairs(AtlasLoot_Data["AtlasLootWBItems"]) do
if source then
break
end
for k2,v2 in pairs(AtlasLoot_Data["AtlasLootWBItems"][k1]) do
if v2[1] == itemID then
source = k1
isWBLoot = true
if v2[5] then
dropRate = v2[5]
lastDropRate = dropRate
else
lastDropRate = nil
end
break
end
end
end
end
-- check if its a pvp reward
if not isCraft and not isWBLoot then
for k1,v1 in pairs(AtlasLoot_Data["AtlasLootGeneralPvPItems"]) do
if source then
break
end
for k2,v2 in pairs(AtlasLoot_Data["AtlasLootGeneralPvPItems"][k1]) do
if v2[1] == itemID then
source = k1
isPvP = true
lastDropRate = nil
break
end
end
end
end
-- check if its a rep reward
-- bgs
if not isCraft and not isWBLoot and not isPvP then
for k1,v1 in pairs(AtlasLoot_Data["AtlasLootBGItems"]) do
if source then
break
end
for k2,v2 in pairs(AtlasLoot_Data["AtlasLootBGItems"][k1]) do
if v2[1] == itemID then
source = k1
isRepReward = true
if v2[5] then
dropRate = v2[5]
lastDropRate = dropRate
else
lastDropRate = nil
end
break
end
end
end
-- factions
for k1,v1 in pairs(AtlasLoot_Data["AtlasLootRepItems"]) do
if source then
break
end
for k2,v2 in pairs(AtlasLoot_Data["AtlasLootRepItems"][k1]) do
if v2[1] == itemID then
source = k1
isRepReward = true
if v2[5] and source ~= "Darkmoon" and not strfind(source, "Cenarion",1,true) then
dropRate = v2[5]
lastDropRate = dropRate
else
lastDropRate = nil
end
break
end
end
end
end
-- check if its a set piece
if not isCraft and not isWBLoot and not isPvP and not isRepReward then
for k1,v1 in pairs(AtlasLoot_Data["AtlasLootSetItems"]) do
if source then
break
end
for k2,v2 in pairs(AtlasLoot_Data["AtlasLootSetItems"][k1]) do
if v2[1] == itemID then
source = k1
isSetPiece = true
if (SetContains(sets, source) or strfind(source, "WorldEpics",1,true)) then
source = nil
isSetPiece = false
end
lastDropRate = nil
break
end
end
end
end
-- check world events
if not isCraft and not isWBLoot and not isPvP and not isRepReward and not isSetPiece then
for k1,v1 in pairs(AtlasLoot_Data["AtlasLootWorldEvents"]) do
if source then
break
end
for k2,v2 in pairs(AtlasLoot_Data["AtlasLootWorldEvents"][k1]) do
if v2[1] == itemID then
source = k1
isWorldEvent = true
if v2[5] then
dropRate = v2[5]
lastDropRate = dropRate
else
lastDropRate = nil
end
break
end
end
end
end
-- check if its a dungeon/raid loot
if not isCraft and not isWBLoot and not isPvP and not isRepReward and not isWorldEvent and not isSetPiece then
for k1,v1 in pairs(AtlasLoot_Data["AtlasLootItems"]) do
if source then
break
end
for k2,v2 in pairs(AtlasLoot_Data["AtlasLootItems"][k1]) do
if v2[1] == itemID then
if k1 ~= "VanillaKeys" then
source = k1
end
if v2[5] then
dropRate = v2[5]
lastDropRate = dropRate
else
lastDropRate = nil
end
break
end
end
end
-- check containers
for k1,v1 in pairs(AtlasLoot_Data["AtlasLootItems"]) do
if source then
break
end
for k2,v2 in pairs(AtlasLoot_Data["AtlasLootItems"][k1]) do
if source then
break
end
if v2[16] then
for i, n in pairs(v2[16]) do
if source then
break
end
for i2, n2 in pairs(v2[16][i]) do
if v2[16][i][i2][1] == itemID then
source = k1
break
end
end
end
end
end
end
end
lastItemID = itemID
if not source then
lastSourceStr = nil
return
end
for k,v in pairs(AtlasLoot_TableNames) do
if k == source then
sourceStr = AtlasLoot_TableNames[k][1]
lastSourceStr = sourceStr
break
end
end
if not sourceStr then
return
end
if line2 and line2:GetText() then
if dropRate then
line2:SetText(GREY..sourceStr.." ("..dropRate..")|r\n"..line2:GetText())
else
line2:SetText(GREY..sourceStr.."|r\n"..line2:GetText())
end
else
if dropRate then
tooltip:AddLine(GREY..sourceStr.." ("..dropRate..")|r")
else
tooltip:AddLine(GREY..sourceStr.."|r")
end
end
elseif itemID == lastItemID then
if lastSourceStr then
if line2:GetText() then
if lastDropRate then
line2:SetText(GREY..lastSourceStr.." ("..lastDropRate..")|r\n"..line2:GetText())
else
line2:SetText(GREY..lastSourceStr.."|r\n"..line2:GetText())
end
else
if lastDropRate then
tooltip:AddLine(GREY..lastSourceStr.." ("..lastDropRate..")|r")
else
tooltip:AddLine(GREY..lastSourceStr.."|r")
end
end
end
end
end
tooltip:Show()
end
AtlasLootTip:SetScript("OnHide", function()
GameTooltip.itemID = nil
ItemRefTooltip.itemID = nil
end)
AtlasLootTip:SetScript("OnShow", function()
AtlasLootTip.extendTooltip(GameTooltip)
end)
-- adapted from http://shagu.org/ShaguTweaks/
AtlasLootTip.HookAddonOrVariable = function(addon, func)
local lurker = CreateFrame("Frame", nil)
lurker.func = func
lurker:RegisterEvent("ADDON_LOADED")
lurker:RegisterEvent("VARIABLES_LOADED")
lurker:RegisterEvent("PLAYER_ENTERING_WORLD")
lurker:SetScript("OnEvent",function()
if IsAddOnLoaded(addon) or getglobal(addon) then
this:func()
this:UnregisterAllEvents()
end
end)
end
AtlasLootTip.HookAddonOrVariable("Tmog", function()
local tmog = CreateFrame("Frame", nil, TmogTooltip)
tmog:SetScript("OnHide", function()
for row=1, 30 do
getglobal("TmogTooltipTextRight" .. row):SetText("")
end
end)
tmog:SetScript("OnShow", function()
AtlasLootTip.extendTooltip(TmogTooltip)
end)
end)