You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

186 lines
6.7 KiB

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- http://www.curse.com/addons/wow/tradeskillmaster_warehousing --
-- --
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
-- All Rights Reserved* - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
-- This file contains APIs related to items (itemLinks/itemStrings/etc)
local TSM = select(2, ...)
function TSMAPI:SafeTooltipLink(link)
-- if strmatch(link, "battlepet") then
-- local _, speciesID, level, breedQuality, maxHealth, power, speed, battlePetID = strsplit(":", link)
-- BattlePetToolTip_Show(tonumber(speciesID), tonumber(level), tonumber(breedQuality), tonumber(maxHealth), tonumber(power), tonumber(speed), gsub(gsub(link, "^(.*)%[", ""), "%](.*)$", ""))
-- else
GameTooltip:SetHyperlink(link)
-- end
end
function TSMAPI:GetItemString(item)
if type(item) == "string" then
item = item:trim()
end
if type(item) ~= "string" and type(item) ~= "number" then
return nil, "invalid arg type"
end
item = select(2, TSMAPI:GetSafeItemInfo(item)) or item
if tonumber(item) then
return "item:"..item..":0:0:0:0:0:0"
end
local itemInfo = {strfind(item, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%-?%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?")}
if not itemInfo[11] then return nil, "invalid link" end
itemInfo[11] = tonumber(itemInfo[11]) or 0
if itemInfo[4] == "item" then
for i=6, 10 do itemInfo[i] = 0 end
return table.concat(itemInfo, ":", 4, 11)
else
return table.concat(itemInfo, ":", 4, 7)
end
end
function TSMAPI:GetBaseItemString(itemString, doGroupLookup)
if type(itemString) ~= "string" then return end
if strsub(itemString, 1, 2) == "|c" then
-- this is an itemLink so get the itemString first
itemString = TSMAPI:GetItemString(itemString)
if not itemString then return end
end
local parts = {(":"):split(itemString)}
for i=3, #parts do
parts[i] = 0
end
local baseItemString = table.concat(parts, ":")
if not doGroupLookup then return baseItemString end
if TSM.db.profile.items[itemString] and TSM.db.profile.items[baseItemString] then
return itemString
elseif TSM.db.profile.items[baseItemString] then
return baseItemString
else
return itemString
end
end
local itemInfoCache = {}
local PET_CAGE_ITEM_INFO = {isDefault=true, 0, "Battle Pets", "", 1, "", "", 0}
function TSMAPI:GetSafeItemInfo(link)
if type(link) ~= "string" then return end
if not itemInfoCache[link] then
-- if strmatch(link, "battlepet:") then
-- local _, speciesID, level, quality, health, power, speed, petID = strsplit(":", link)
-- if not tonumber(speciesID) then return end
-- level, quality, health, power, speed, petID = level or 0, quality or 0, health or 0, power or 0, speed or 0, petID or "0"
-- local name, texture = C_PetJournal.GetPetInfoBySpeciesID(tonumber(speciesID))
-- if name == "" then return end
-- level, quality = tonumber(level), tonumber(quality)
-- petID = strsub(petID, 1, (strfind(petID, "|") or #petID)-1)
-- link = ITEM_QUALITY_COLORS[quality].hex.."|Hbattlepet:"..speciesID..":"..level..":"..quality..":"..health..":"..power..":"..speed..":"..petID.."|h["..name.."]|h|r"
-- if PET_CAGE_ITEM_INFO.isDefault then
-- local data = {select(5, GetItemInfo(82800))}
-- if #data > 0 then
-- PET_CAGE_ITEM_INFO = data
-- end
-- end
-- local minLvl, iType, _, stackSize, _, _, vendorPrice = unpack(PET_CAGE_ITEM_INFO)
-- local subType, equipLoc = 0, ""
-- itemInfoCache[link] = {name, link, quality, level, minLvl, iType, subType, stackSize, equipLoc, texture, vendorPrice}
--elseif strmatch(link, "item:") then
if strmatch(link, "item:") then
itemInfoCache[link] = {GetItemInfo(link)}
end
if itemInfoCache[link] and #itemInfoCache[link] == 0 then itemInfoCache[link] = nil end
end
if not itemInfoCache[link] then return end
return unpack(itemInfoCache[link])
end
--- Attempts to get the itemID from a given itemLink/itemString.
-- @param itemLink The link or itemString for the item.
-- @param ignoreGemID If true, will not attempt to get the equivalent id for the item (ie for old gems where there are multiple ids for a single item).
-- @return Returns the itemID as the first parameter. On error, will return nil as the first parameter and an error message as the second.
function TSMAPI:GetItemID(itemLink)
if not itemLink or type(itemLink) ~= "string" then return nil, "invalid args" end
local test = select(2, strsplit(":", itemLink))
if not test then return nil, "invalid link" end
local s, e = strfind(test, "[0-9]+")
if not (s and e) then return nil, "not an itemLink" end
local itemID = tonumber(strsub(test, s, e))
if not itemID then return nil, "invalid number" end
return itemID
end
-- check if an item is soulbound or not
local function GetTooltipCharges(tooltip)
for id=1, tooltip:NumLines() do
local text = _G["TSMSoulboundScanTooltipTextLeft" .. id]
if text and text:GetText() then
local maxCharges = strmatch(text:GetText(), "^([0-9]+) Charges?$")
if maxCharges then
return maxCharges
end
end
end
end
local scanTooltip
local resultsCache = {lastClear=GetTime()}
function TSMAPI:IsSoulbound(bag, slot)
if GetTime() - resultsCache.lastClear > 0.5 then
resultsCache = {lastClear=GetTime()}
end
if not scanTooltip then
scanTooltip = CreateFrame("GameTooltip", "TSMSoulboundScanTooltip", UIParent, "GameTooltipTemplate")
scanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
end
scanTooltip:ClearLines()
local slotID
if type(bag) == "string" then
if strfind(bag, "battlepet") then return end
slotID = bag
scanTooltip:SetHyperlink(slotID)
elseif bag and slot then
slotID = bag.."@"..slot
local itemID = GetContainerItemID(bag, slot)
local maxCharges
if itemID then
scanTooltip:SetHyperlink("item:"..itemID)
maxCharges = GetTooltipCharges(scanTooltip)
end
scanTooltip:SetBagItem(bag, slot)
if maxCharges then
if GetTooltipCharges(scanTooltip) ~= maxCharges then
resultsCache[slotID] = true
return resultsCache[slotID]
end
end
else
return
end
if resultsCache[slotID] ~= nil then return resultsCache[slotID] end
resultsCache[slotID] = false
for id=1, scanTooltip:NumLines() do
local text = _G["TSMSoulboundScanTooltipTextLeft" .. id]
if text and ((text:GetText() == ITEM_BIND_ON_PICKUP and id < 4) or text:GetText() == ITEM_SOULBOUND or text:GetText() == ITEM_BIND_QUEST) then
resultsCache[slotID] = true
break
end
end
return resultsCache[slotID]
end