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.
146 lines
4.4 KiB
146 lines
4.4 KiB
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
local TSM = select(2, ...) ---@type TSM
|
|
local ItemClass = TSM.Init("Data.ItemClass") ---@class Data.ItemClass
|
|
local Environment = TSM.Include("Environment")
|
|
local STATIC_DATA = {
|
|
classes = {},
|
|
subClasses = {},
|
|
classLookup = {},
|
|
classIdLookup = {},
|
|
inventorySlotIdLookup = {},
|
|
}
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Population of the Static Data
|
|
-- ============================================================================
|
|
|
|
do
|
|
local ITEM_CLASS_IDS = nil
|
|
if Environment.IsRetail() then
|
|
ITEM_CLASS_IDS = {
|
|
Enum.ItemClass.Weapon,
|
|
Enum.ItemClass.Armor,
|
|
Enum.ItemClass.Container,
|
|
Enum.ItemClass.Gem,
|
|
Enum.ItemClass.ItemEnhancement,
|
|
Enum.ItemClass.Consumable,
|
|
Enum.ItemClass.Glyph,
|
|
Enum.ItemClass.Tradegoods,
|
|
Enum.ItemClass.Recipe,
|
|
Enum.ItemClass.Profession,
|
|
Enum.ItemClass.Battlepet,
|
|
Enum.ItemClass.Questitem,
|
|
Enum.ItemClass.Miscellaneous,
|
|
}
|
|
elseif Environment.IsWrathClassic() then
|
|
ITEM_CLASS_IDS = {
|
|
Enum.ItemClass.Weapon,
|
|
Enum.ItemClass.Armor,
|
|
Enum.ItemClass.Container,
|
|
Enum.ItemClass.Consumable,
|
|
Enum.ItemClass.Glyph,
|
|
Enum.ItemClass.Tradegoods,
|
|
Enum.ItemClass.Projectile,
|
|
Enum.ItemClass.Quiver,
|
|
Enum.ItemClass.Recipe,
|
|
Enum.ItemClass.Gem,
|
|
Enum.ItemClass.Miscellaneous,
|
|
Enum.ItemClass.Questitem,
|
|
}
|
|
elseif Environment.IsVanillaClassic() then
|
|
ITEM_CLASS_IDS = {
|
|
Enum.ItemClass.Weapon,
|
|
Enum.ItemClass.Armor,
|
|
Enum.ItemClass.Container,
|
|
Enum.ItemClass.Consumable,
|
|
Enum.ItemClass.Tradegoods,
|
|
Enum.ItemClass.Projectile,
|
|
Enum.ItemClass.Quiver,
|
|
Enum.ItemClass.Recipe,
|
|
Enum.ItemClass.Reagent,
|
|
Enum.ItemClass.Miscellaneous,
|
|
}
|
|
else
|
|
error("Invalid game version")
|
|
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 Environment.HasFeature(Environment.FEATURES.C_AUCTION_HOUSE) then
|
|
subClasses = C_AuctionHouse.GetAuctionItemSubClasses(classId)
|
|
else
|
|
subClasses = {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)
|
|
|
|
for _, id in pairs(Enum.InventoryType) do
|
|
local invType = GetItemInventorySlotInfo(id)
|
|
if invType then
|
|
STATIC_DATA.inventorySlotIdLookup[strlower(invType)] = id
|
|
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
|
|
|