diff --git a/TitanBag/TitanBag.lua b/TitanBag/TitanBag.lua
index 67e8b4f..3f724c6 100644
--- a/TitanBag/TitanBag.lua
+++ b/TitanBag/TitanBag.lua
@@ -19,91 +19,139 @@ local AceTimer = LibStub("AceTimer-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true)
local BagTimer
-local bag_info = {
- ENCHANTING = { color = {r=0,g=0,b=1}}, -- BLUE
- ENGINEERING = { color = {r=1,g=0.49,b=0.04}}, -- ORANGE
- HERBALISM = { color = {r=0,g=1,b=0}}, -- GREEN
- INSCRIPTION = { color = {r=0.58,g=0.51,b=0.79}}, -- PURPLE
- JEWELCRAFTING = { color = {r=1,g=0,b=0}}, -- RED
- LEATHERWORKING = { color = {r=0.78,g=0.61,b=0.43}}, -- TAN
- MINING = { color = {r=1,g=1,b=1}}, -- WHITE
- FISHING = { color = {r=0.41,g=0.8,b=0.94}}, -- LIGHT_BLUE
- COOKING = { color = {r=0.96,g=0.55,b=0.73}}, -- PINK
-}
--- "Khorium Toolbox" removed???
- -- names are for debug only
- -- Can use wowdb.com to look at bags by profession
-
-local prof_bags = {
- [333] = {style = "", name = ""},
- [21858] = {style = "ENCHANTING", name = "Spellfire Bag"},
- [22246] = {style = "ENCHANTING", name = "Enchanted Mageweave Pouch"},
- [22248] = {style = "ENCHANTING", name = "Enchanted Runecloth Bag"},
- [22249] = {style = "ENCHANTING", name = "Big Bag of Enchantment"},
- [22250] = {style = "HERBALISM", name = "Herb Pouch"},
- [22251] = {style = "HERBALISM", name = "Cenarion Herb Bag"},
- [22252] = {style = "HERBALISM", name = "Satchel of Cenarius"},
- [23774] = {style = "ENGINEERING", name = "Fel Iron Toolbox"},
- [23775] = {style = "ENGINEERING", name = "Titanium Toolbox"},
- [24270] = {style = "JEWELCRAFTING", name = "Bag of Jewels"},
- [29540] = {style = "MINING", name = "Reinforced Mining Bag"},
- [30745] = {style = "ENGINEERING", name = "Heavy Toolbox"}, -- *
- [30746] = {style = "MINING", name = "Mining Sack"},
- [30747] = {style = "JEWELCRAFTING", name = "Gem Pouch"},
- [30748] = {style = "ENCHANTING", name = "Enchanter's Satchel"},
- [34482] = {style = "LEATHERWORKING", name = "Leatherworker's Satchel"},
- [34490] = {style = "LEATHERWORKING", name = "Bag of Many Hides"},
- [38225] = {style = "HERBALISM", name = "Mycah's Botanical Bag"},
- [38307] = {style = "INSCRIPTION", name = "Crafty's Bottomless Inscription Bag"}, -- *
- [38347] = {style = "MINING", name = "Mammoth Mining Bag"},
- [38399] = {style = "LEATHERWORKING", name = "Trapper's Traveling Pack"},
- [39489] = {style = "INSCRIPTION", name = "Scribe's Satchel"},
- [41598] = {style = "ENCHANTING", name = "Mysterious Bag"},
- [44446] = {style = "INSCRIPTION", name = "Pack of Endless Pockets"},
- [45773] = {style = "HERBALISM", name = "Emerald Bag"},
- [54445] = {style = "ENCHANTING", name = "Otherworldly Bag"},
- [54446] = {style = "HERBALISM", name = "Hyjal Expedition Bag"},
- [60217] = {style = "ENGINEERING", name = "Elementium Toolbox"},
- [60218] = {style = "FISHING", name = "Lure Master Tackle Box"},
- [67389] = {style = "ENCHANTING", name = "\"Carriage - Exclusive\" Enchanting Evening Purse"},
- [67390] = {style = "ENGINEERING", name = "\"Carriage - Maddy\" High Tech Bag"},
- [67392] = {style = "JEWELCRAFTING", name = "\"Carriage - Exclusive\" Gem Studded Clutch"},
- [67393] = {style = "HERBALISM", name = "\"Carriage - Going Green\" Herb Tote Bag"},
- [67394] = {style = "INSCRIPTION", name = "\"Carriage - Xandera\" Student's Satchel"},
- [67395] = {style = "LEATHERWORKING", name = "\"Carriage - Meeya\" Leather Bag"},
- [67396] = {style = "MINING", name = "\"Carriage - Christina\" Precious Metal Bag"},
- [70136] = {style = "INSCRIPTION", name = "Royal Scribe's Satchel"}, -- *
- [70137] = {style = "MINING", name = "Triple-Reinforced Mining Bag"},-- *
- [92746] = {style = "COOKING", name = "Portable Refrigerator [28]"}, -- repeat, which one is real?
- [92747] = {style = "COOKING", name = "Advanced Refrigeration Unit"},
- [92748] = {style = "COOKING", name = "Portable Refrigerator [32]"},
- [70138] = {style = "JEWELCRAFTING", name = "Luxurious Silk Gem Bag"}, -- *
- [95536] = {style = "LEATHERWORKING", name = "Magnificent Hide Pack"}, -- *
- [116259] = {style = "LEATHERWORKING", name = "Burnished Leather Bag"},
- [116260] = {style = "MINING", name = "Burnished Mining Bag"},
- [116261] = {style = "MINING", name = "Burnished Inscription Bag"},
- [116404] = {style = "ENGINEERING", name = "Pilgrim's Bounty"}, -- *
- [130943] = {style = "COOKING", name = "Reusable Tote Bag"}, -- *
- [162588] = {style = "INSCRIPTION", name = "Weathered Scrollcase"},
+local bag_info = { -- itemType : warcraft.wiki.gg/wiki/itemType
+ [1] = -- Soul bag
+ { color = {r=0.96,g=0.55,b=0.73}}, -- PINK
+ [2] = -- HERBALISM =
+ { color = {r=0,g=1,b=0}}, -- GREEN
+ [3] = -- ENCHANTING =
+ { color = {r=0,g=0,b=1}}, -- BLUE
+ [4] = -- ENGINEERING =
+ { color = {r=1,g=0.49,b=0.04}}, -- ORANGE
+ [5] = -- JEWELCRAFTING =
+ { color = {r=1,g=0,b=0}}, -- RED
+ [6] = -- MINING =
+ { color = {r=1,g=1,b=1}}, -- WHITE
+ [7] = -- LEATHERWORKING =
+ { color = {r=0.78,g=0.61,b=0.43}}, -- TAN
+ [8] = -- INSCRIPTION =
+ { color = {r=0.58,g=0.51,b=0.79}}, -- PURPLE
+ [9] = -- FISHING =
+ { color = {r=0.41,g=0.8,b=0.94}}, -- LIGHT_BLUE
+ [10] = -- COOKING =
+ { color = {r=0.96,g=0.55,b=0.73}}, -- PINK
+ -- These are Classic arrow or bullet bags
+ [22] = -- Classic arrow
+ { color = {r=1,g=.4,b=0}}, -- copper
+ [23] = -- Classic bullet
+ { color = {r=0.8,g=0.8,b=0.8}}, -- silver
}
+local trace = false
local MIN_BAGS = 0
local MAX_BAGS = Constants.InventoryConstants.NumBagSlots
local bag_data = {} -- to hold the user bag data
-- ******************************** Functions *******************************
-local function ToggleBags()
+local function IsProfessionBagID(slot)
+ -- The info needed is available using GetItemInfoInstant; only the bag / item id is required
+ -- itemType : warcraft.wiki.gg/wiki/itemType
+ local res = false
+ local style = ""
+ local info, itemId, itemType, itemSubType, itemEquipLoc, itemTexture, classID, subclassID
+ local inv_id = C_Container.ContainerIDToInventoryID(slot)
+
+ if inv_id == nil then
+ -- Only works on bag and bank bags NOT backpack!
+ else
+ info = GetInventoryItemLink("player", inv_id)
+ itemId, itemType, itemSubType, itemEquipLoc, itemTexture, classID, subclassID = GetItemInfoInstant(info)
+ style = subclassID
+--[[
+TitanDebug("T isP 0:"
+ .." "..tostring(slot)..""
+ .." "..tostring(itemId)..""
+ .." '"..tostring(itemType).."'"
+ .." '"..tostring(itemSubType).."'"
+ .." "..tostring(itemEquipLoc)..""
+ .." '"..tostring(itemTexture).."'"
+ .." "..tostring(classID)..""
+ .." "..tostring(subclassID)..""
+ )
+--]]
+ if classID == 1 then -- is a container / bag
+ if subclassID >= 1 then
+ -- profession bag of some type [2 - 10] Jan 2024 (DragonFlight / Wrath / Classic Era)
+ -- OR soul bag [1]
+ res = true
+ else
+ -- is a arrow or bullet; only two options
+ end
+ elseif classID == 6 then -- is a 'projectile' holder
+ res = true
+ -- is a ammo bag or quiver; only two options
+ elseif classID == 11 then -- is a 'quiver'; Wrath and CE
+ res = true
+ -- is a ammo pouch or quiver; only two options
+ style = subclassID + 20 -- change to get local color for name
+ else
+ -- not a bag
+ end
+ end
+
+ if trace then
+ TitanDebug("T isP:"
+ .." "..tostring(res)..""
+ .." "..tostring(style)..""
+ .." "..tostring(itemId)..""
+ .." "..tostring(classID)..""
+ .." "..tostring(subclassID)..""
+ .." "..tostring(inv_id)..""
+ )
+ end
+
+ return res, style
+end
+local function IsProfessionBag(class, subclass)
+ local prof = false
+ local style = ""
+ if class == 1 then -- is a container
+ if subclass == 0 then style = ""
+ elseif subclass == 1 then style = "SOUL"
+ elseif subclass == 2 then style = "HERBALISM"
+ elseif subclass == 3 then style = "ENCHANTING"
+ elseif subclass == 4 then style = "ENGINEERING"
+ elseif subclass == 5 then style = "JEWELCRAFTING"
+ elseif subclass == 6 then style = "MINING"
+ elseif subclass == 7 then style = "LEATHERWORKING"
+ elseif subclass == 8 then style = "INSCRIPTION"
+ elseif subclass == 9 then style = "FISHING"
+ elseif subclass == 10 then style = "COOKING"
+ else
+ end
+ if subclass >= 1
+ and subclass <= 10
+ then prof = true
+ else
+ end
+ else
+ -- Not even a bag
+ end
+
+ return prof, style
+end
+
+local function ToggleBags()
if TitanGetVar(TITAN_BAG_ID, "OpenBags") then
ToggleAllBags()
else
end
-
end
local function GetBagData(id)
--[[
- The old code grabbed the bag name but since 10.00.02 it seems name is not always available by player entering world event
+ The bag name is not always available when player entering world
Grabbing the total slots is available though to determine if a bag exists.
The user may see bag name as <unknown> until an event triggers a bag check AND the name is available.
--]]
@@ -111,24 +159,22 @@ local function GetBagData(id)
local total_slots = 0
local total_free = 0
local total_used = 0
+
+ local count_prof = TitanGetVar(TITAN_BAG_ID, "CountProfBagSlots")
for bag_slot = MIN_BAGS, MAX_BAGS do -- assuming 0 (Backpack) will not be a profession bag
local slots = C_Container.GetContainerNumSlots(bag_slot)
-- Ensure a blank structure exists
--- if bag_data[bag_slot] then
- -- This has been processed at least once
--- else
- bag_data[bag_slot] = {
- has_bag = false,
- name = "",
- maxi_slots = 0,
- free_slots = 0,
- used_slots = 0,
- style = "",
- color = "",
- }
--- end
+ bag_data[bag_slot] = {
+ has_bag = false,
+ name = "",
+ maxi_slots = 0,
+ free_slots = 0,
+ used_slots = 0,
+ style = "",
+ color = "",
+ }
if slots > 0 then
bag_data[bag_slot].has_bag = true
@@ -142,6 +188,14 @@ local function GetBagData(id)
bag_data[bag_slot].free_slots = free
bag_data[bag_slot].used_slots = used
+--[[
+TitanDebug("T Bag:"
+.." "..tostring(bag_slot)..""
+.." "..tostring(slots)..""
+.." "..tostring(free)..""
+.." '"..tostring(bag_name).."'"
+)
+--]]
-- some info is not known until the name is available...
-- The API requires name to get the bag ID.
local bag_type = "none"
@@ -150,37 +204,38 @@ local function GetBagData(id)
if bag_name == UNKNOWN then
-- name not available yet
else
- local itemID, itemType, itemSubType, itemEquipLoc, icon, itemClassID, itemSubClassID = GetItemInfoInstant(bag_name)
- -- For some inexplicable reason the Backpack does not return as an item...
- -- so create a default so routine is successful
- itemID = itemID or 0
-
- if prof_bags[itemID] then
- bag_type = prof_bags[itemID].style
- color = bag_info[bag_type].color
- bag_type = "profession"
- else
- bag_type = "normal"
- end
+ end
+
+ -- Jan 2024 : Moved away from named based to an id based. Allows name to come later from server
+ local is_prof_bag, style = IsProfessionBagID(bag_slot)
+--[[
+if trace then
+TitanDebug("T Bag...:"
+.." "..tostring(bag_slot)..""
+.." "..tostring(is_prof_bag)..""
+.." '"..tostring(style).."'"
+.." "..tostring(itemClassID)..""
+.." "..tostring(itemSubClassID)..""
+)
+end
+--]]
+ if is_prof_bag then
+ color = bag_info[style].color
+ bag_type = "profession"
+ else
+ bag_type = "normal"
end
bag_data[bag_slot].style = bag_type
bag_data[bag_slot].color = color
-- add to total
if bag_data[bag_slot].style == "profession" then
- if TitanGetVar(TITAN_BAG_ID, "CountProfBagSlots") then
+ if count_prof then
total_slots = total_slots + slots
total_free = total_free + free
total_used = total_used + used
else
-- ignore in totals
---[[
-TitanDebug("T Bag: ignore"
-.." "..tostring(bag_slot)..""
-.." "..tostring(bag_data[bag_slot].name)..""
-.." "..tostring(bag_data[bag_slot].style)..""
-)
---]]
end
else
total_slots = total_slots + slots
@@ -190,17 +245,19 @@ TitanDebug("T Bag: ignore"
else
bag_data[bag_slot].has_bag = false
end
---[[
-TitanDebug("T Bag: info"
-.." "..tostring(bag_slot)..""
-.." "..tostring(bag_data[bag_slot].has_bag)..""
-.." "..tostring(bag_data[bag_slot].name)..""
-.." "..tostring(bag_data[bag_slot].maxi_slots)..""
-.." "..tostring(bag_data[bag_slot].used_slots)..""
-.." "..tostring(bag_data[bag_slot].free_slots)..""
-.." "..tostring(bag_data[bag_slot].style)..""
-)
---]]
+
+ if trace then
+ TitanDebug("T info"
+ .." "..tostring(bag_slot)..""
+ .." ?:"..tostring(bag_data[bag_slot].has_bag)..""
+ .." max: "..tostring(bag_data[bag_slot].maxi_slots)..""
+ .." used: "..tostring(bag_data[bag_slot].used_slots)..""
+ .." free: "..tostring(bag_data[bag_slot].free_slots)..""
+ .." type: "..tostring(bag_data[bag_slot].style)..""
+ .." count: "..tostring(count_prof)..""
+ .." '"..tostring(bag_data[bag_slot].name).."'"
+ )
+ end
end
bag_data.total_slots = total_slots
@@ -286,6 +343,38 @@ end
--]]
function TitanPanelBagButton_OnEvent(self, event, a1, a2, ...)
if event == "PLAYER_ENTERING_WORLD" then
+--[===[
+local inv_id = C_Container.ContainerIDToInventoryID(1)
+local info = GetInventoryItemLink("player", inv_id)
+local name, _, Color, Ltype, Id, Enchant, Gem1, Gem2, Gem3, Gem4, Suffix, Unique, LinkLvl, reforging, Name = string.find(info, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?")
+
+local itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount,
+itemEquipLoc, itemTexture, sellPrice, classID, subclassID, bindType, expacID, setID, isCraftingReagent
+= GetItemInfo(Id)
+
+local iitemId, iitemType, iitemSubType,
+iitemEquipLoc, iitemTexture, iclassID, isubclassID
+= GetItemInfoInstant(info)
+
+print("======")
+print("bag"
+ .." "..tostring(inv_id)..""
+)
+print("inv"
+ .." "..tostring(name)..""
+ .." "..tostring(Id)..""
+ .." "..tostring(classID)..""
+ .." "..tostring(subclassID)..""
+)
+print("iinv"
+ .." "..tostring(iitemId)..""
+ .." "..tostring(Id)..""
+ .." "..tostring(iclassID)..""
+ .." "..tostring(isubclassID)..""
+)
+print("======")
+--]===]
+
if a1 == true and TITAN_ID == "Titan" then -- 10.* / Retail
-- initial login
@@ -479,7 +568,7 @@ function TitanPanelRightClickMenu_PrepareBagMenu()
info = {};
info.text = L["TITAN_BAG_MENU_IGNORE_PROF_BAGS_SLOTS"];
info.func = TitanPanelBagButton_ToggleIgnoreProfBagSlots;
- info.checked = TitanUtils_Toggle(TitanGetVar(TITAN_BAG_ID, "CountProfBagSlots"));
+ info.checked = not TitanGetVar(TITAN_BAG_ID, "CountProfBagSlots")
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddControlVars(TITAN_BAG_ID)