TradeSkillMaster/LibTSM/Data/ItemClass.lua

138 lines
4.1 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local ItemClass = TSM.Init("Data.ItemClass")
local STATIC_DATA = {
classes = {},
subClasses = {},
classLookup = {},
classIdLookup = {},
inventorySlotIdLookup = {},
}
-- ============================================================================
-- Population of the Static Data
-- ============================================================================
do
-- Needed because NUM_LE_ITEM_CLASSS contains an erroneous value
local ITEM_CLASS_IDS = nil
if not TSM.IsWowClassic() then
ITEM_CLASS_IDS = {
LE_ITEM_CLASS_WEAPON,
LE_ITEM_CLASS_ARMOR,
LE_ITEM_CLASS_CONTAINER,
LE_ITEM_CLASS_GEM,
LE_ITEM_CLASS_ITEM_ENHANCEMENT,
LE_ITEM_CLASS_CONSUMABLE,
LE_ITEM_CLASS_GLYPH,
LE_ITEM_CLASS_TRADEGOODS,
LE_ITEM_CLASS_RECIPE,
LE_ITEM_CLASS_BATTLEPET,
LE_ITEM_CLASS_QUESTITEM,
LE_ITEM_CLASS_MISCELLANEOUS,
}
else
ITEM_CLASS_IDS = {
LE_ITEM_CLASS_WEAPON,
LE_ITEM_CLASS_ARMOR,
LE_ITEM_CLASS_CONTAINER,
LE_ITEM_CLASS_CONSUMABLE,
LE_ITEM_CLASS_TRADEGOODS,
LE_ITEM_CLASS_PROJECTILE,
LE_ITEM_CLASS_QUIVER,
LE_ITEM_CLASS_RECIPE,
LE_ITEM_CLASS_REAGENT,
LE_ITEM_CLASS_MISCELLANEOUS,
}
end
for _, classId in ipairs(ITEM_CLASS_IDS) do
local class = GetItemClassInfo(classId)
if class then
STATIC_DATA.classIdLookup[strlower(class)] = classId
STATIC_DATA.classLookup[class] = {}
STATIC_DATA.classLookup[class]._index = classId
local subClasses = nil
if TSM.IsWowClassic() then
subClasses = {GetAuctionItemSubClasses(classId)}
else
subClasses = C_AuctionHouse.GetAuctionItemSubClasses(classId)
end
for _, subClassId in pairs(subClasses) do
local subClassName = GetItemSubClassInfo(classId, subClassId)
if not strfind(subClassName, "(OBSOLETE)") then
STATIC_DATA.classLookup[class][subClassName] = subClassId
end
end
end
end
for class, subClasses in pairs(STATIC_DATA.classLookup) do
tinsert(STATIC_DATA.classes, class)
STATIC_DATA.subClasses[class] = {}
for subClass in pairs(subClasses) do
if subClass ~= "_index" then
tinsert(STATIC_DATA.subClasses[class], subClass)
end
end
sort(STATIC_DATA.subClasses[class], function(a, b) return STATIC_DATA.classLookup[class][a] < STATIC_DATA.classLookup[class][b] end)
end
sort(STATIC_DATA.classes, function(a, b) return STATIC_DATA.classIdLookup[strlower(a)] < STATIC_DATA.classIdLookup[strlower(b)] end)
if TSM.IsShadowlands() then
for _, id in pairs(Enum.InventoryType) do
local invType = GetItemInventorySlotInfo(id)
if invType then
STATIC_DATA.inventorySlotIdLookup[strlower(invType)] = id
end
end
else
for i = 0, NUM_LE_INVENTORY_TYPES do
local invType = GetItemInventorySlotInfo(i)
if invType then
STATIC_DATA.inventorySlotIdLookup[strlower(invType)] = i
end
end
end
end
-- ============================================================================
-- Module Functions
-- ============================================================================
function ItemClass.GetClasses()
return STATIC_DATA.classes
end
function ItemClass.GetSubClasses(class)
return STATIC_DATA.subClasses[class]
end
function ItemClass.GetClassIdFromClassString(classStr)
return STATIC_DATA.classIdLookup[strlower(classStr)]
end
function ItemClass.GetSubClassIdFromSubClassString(subClass, classId)
if not classId then return end
local class = GetItemClassInfo(classId)
if not STATIC_DATA.classLookup[class] then return end
for str, index in pairs(STATIC_DATA.classLookup[class]) do
if strlower(str) == strlower(subClass) then
return index
end
end
end
function ItemClass.GetInventorySlotIdFromInventorySlotString(slot)
return STATIC_DATA.inventorySlotIdLookup[strlower(slot)]
end