zz_itemsdb/module_bags.lua

171 lines
4.6 KiB
Lua
Raw Normal View History

2021-04-02 12:05:20 +00:00
local addonName, addon = ...
local childName = addon['childName']
local child = addon[childName]
local modulname = 'bags'
local events = {}
local modul = {
['frame'] = CreateFrame("FRAME"),
['name'] = modulname
}
local db
2021-04-04 13:22:38 +00:00
local desc = format('%sCount', modulname)
2023-01-22 11:50:18 +00:00
local GetContainerItemInfo = GetContainerItemInfo
if(C_Container and C_Container.GetContainerItemInfo) then
GetContainerItemInfo2 = C_Container.GetContainerItemInfo
else
GetContainerItemInfo2 = function(bag, slot)
local icon, itemCount, locked, quality, readable, lootable, itemLink, isFiltered, noValue, itemID, isBound = GetContainerItemInfo(bag, slot)
if(icon) then
return {
['iconFileID'] = icon,
['stackCount'] = itemCount,
['isLocked'] = locked,
['quality'] = quality,
['isReadable'] = readable,
['hasLoot'] = lootable,
['hyperlink'] = itemLink,
['isFiltered'] = isFiltered,
['hasNoValue'] = noValue,
['itemID'] = itemID,
['isBound'] = isBound
}
end
end
end
local function GetContainerNumSlots2(bag, slot)
if(C_Container and C_Container.GetContainerNumSlots) then
return C_Container.GetContainerNumSlots(bag, slot)
end
return GetContainerNumSlots(bag, slot)
end
2021-04-02 12:05:20 +00:00
function child:scanBag(bag)
local slot = 1
local itemlist = {}
local empty = true
2023-01-22 11:50:18 +00:00
while(slot<=GetContainerNumSlots2(bag)) do
2021-04-02 12:05:20 +00:00
local item = Item:CreateFromBagAndSlot(bag, slot)
if(item) then
2023-01-22 11:50:18 +00:00
local itemInfo = GetContainerItemInfo2(bag, slot)
2021-04-02 12:05:20 +00:00
local id = item:GetItemID()
2022-11-21 02:41:01 +00:00
if(itemInfo and id) then
2021-04-02 12:05:20 +00:00
empty = false
itemlist[id] = itemlist[id] or {}
itemlist[id]['count'] = itemlist[id]['count'] or 0
2022-10-06 10:29:55 +00:00
itemlist[id]['count'] = itemlist[id]['count'] + itemInfo['stackCount']
2021-04-02 12:05:20 +00:00
child:getName(id)
end
end
slot = slot + 1
end
return empty and nil or itemlist
end
2023-01-22 11:50:18 +00:00
local startbag, endbag
if(Enum and Enum.BagIndex) then
startbag = Enum.BagIndex.Backpack
endbag = Enum.BagIndex.ReagentBag
else
startbag = BACKPACK_CONTAINER
endbag = NUM_BAG_SLOTS
end
2021-04-02 12:05:20 +00:00
local function scanAllBags(delayed)
if(not child:funcSync(scanAllBags, delayed)) then return end
local playerID = child.getPID()
if(playerID) then
local tab = modul['db'][playerID]
2023-01-22 11:50:18 +00:00
print()
for bag=startbag ,endbag do
2021-04-02 12:05:20 +00:00
tab[bag] = child:scanBag(bag) -- loop all bought bags
end
for k,v in pairs(modul['db'][playerID]) do
2023-01-22 11:50:18 +00:00
if(k < startbag or k > endbag) then
2021-04-02 12:05:20 +00:00
tab[k] = nil -- prevent bogus bags
end
end
end
end
local function bagLoop(id, res)
local units = child:GetNamespace('units')
2021-04-04 13:48:38 +00:00
local playerID = child.getPID()
2021-04-04 13:22:38 +00:00
for k, v in pairs(modul['db']) do
2021-04-02 12:05:20 +00:00
if(units[k]) then
if(playerID and units[k]['faction'] == units[playerID]['faction']) then
local unitname = units[k]['name']
2021-04-04 13:22:38 +00:00
for bag, list in pairs(v) do
for a, b in pairs(list) do
2021-04-02 12:05:20 +00:00
if(a == id) then
res[unitname] = res[unitname] or {
2021-04-04 13:22:38 +00:00
[desc] = 0
2021-04-02 12:05:20 +00:00
}
2021-04-04 13:22:38 +00:00
res[unitname][desc] = res[unitname][desc] or 0
res[unitname][desc] = res[unitname][desc] + b['count']
2021-04-02 12:05:20 +00:00
end
end
end
end
end
end
return res
end
function modul.Search(id, res)
local playerID = child.getPID()
if(playerID) then
modul['db'][playerID] = modul['db'][playerID] or {}
end
return playerID and bagLoop(id, res) or res
end
function modul.Output(input, sum, b)
2021-04-04 13:22:38 +00:00
if(b[desc] and b[desc] > 0) then
2021-04-02 12:05:20 +00:00
input[#input+1] = format("Bags %s",b[desc])
sum = sum + b[desc]
end
2021-04-04 13:22:38 +00:00
return input, sum
2021-04-02 12:05:20 +00:00
end
function events:ITEM_UNLOCKED(event,...)
scanAllBags(nil)
end
function events:BAG_UPDATE_DELAYED(event,...)
scanAllBags(nil)
end
local function OnEvent(self, event, ...)
local playerID = child.getPID()
-- print(modulname, event, ...)
if(playerID and type(events[event])=='function') then
modul['db'] = child:GetNamespace(modul.name)
modul['db'][playerID] = modul['db'][playerID] or {}
events[event](self, event, ...)
end
end
function modul:Delete(id, typ)
self['db'] = child:GetNamespace(modul.name)
if(typ == self['typ'] and id and id>0) then
self['db'][id] = nil
end
end
function modul:Enable()
self['status'] = true
local list = {}
for event,func in pairs(events) do
list[#list+1] = event
end
for i = 1, #list do
self['frame']:RegisterEvent(list[i])
end
self['frame']:SetScript("OnEvent", OnEvent)
end
function modul:Disable()
self['status'] = false
for event, func in pairs(events) do
self['frame']:UnregisterEvent(event)
2021-04-02 12:05:20 +00:00
end
end
local init = {
Setup = function(self)
db = child['db']
modul.db,modul.status = child:RegisterModul(modul, modulname)
if(modul.status) then
modul:Enable()
end
end
}
addon.RegisterCallback(init, format("Init%s", childName), 'Setup')