201 lines
4.9 KiB
Lua
201 lines
4.9 KiB
Lua
local name, addon = ...
|
|
local modulname = 'bank'
|
|
local events = {}
|
|
local modul = {
|
|
['name'] = modulname
|
|
}
|
|
local BankIsOpen = false
|
|
function modul.Guess(id)
|
|
local dbcount = modul.Get(id)
|
|
local count = GetItemCount(id,true)
|
|
local playerID = addon.getPID()
|
|
local tt = false
|
|
if(playerID and dbcount > count) then
|
|
local dif = dbcount - count
|
|
modul['db'][playerID] = modul['db'][playerID] or {}
|
|
local tab = modul['db'][playerID]
|
|
for bag=5,GetNumBankSlots()+4 do
|
|
local btab = tab[bag]
|
|
if(btab and btab[id] and btab[id]['count']>0) then
|
|
while(dif>0 and btab[id]['count']>0) do
|
|
tt = true
|
|
dif = dif - 1
|
|
btab[id]['count'] = btab[id]['count'] - 1
|
|
if(btab[id]['count'] == 0) then
|
|
btab[id] = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if(tt) then
|
|
addon:updateTT()
|
|
end
|
|
end
|
|
local function guess(bag)
|
|
if(bag) then
|
|
for id, v in pairs(bag) do
|
|
local _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, isCraftingReagent = GetItemInfo(id)
|
|
if(isCraftingReagent) then
|
|
modul.Guess(id)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local function scanAllBankBags(delayed)
|
|
if(not addon:funcSync(scanAllBankBags,delayed)) then return end
|
|
local playerID = addon.getPID()
|
|
if(playerID) then
|
|
modul['db'][playerID] = modul['db'][playerID] or {}
|
|
local tab = modul['db'][playerID]
|
|
for bag=5,GetNumBankSlots()+4 do
|
|
local btab = tab[bag]
|
|
if(BankIsOpen) then
|
|
btab = addon:scanBag(bag) -- loop all bought bankbags
|
|
else
|
|
guess(tab)
|
|
end
|
|
end
|
|
if(BankIsOpen) then
|
|
tab[-1] = addon:scanBag(-1) -- Main bankbag
|
|
else
|
|
guess(tab[-1])
|
|
end
|
|
tab[-3] = addon:scanBag(-3) -- Main reagentbag
|
|
for k,v in pairs(modul['db'][playerID]) do
|
|
if(not(k==-1) and not(k==-3) and not(k>4 and k<=GetNumBankSlots()+4)) then
|
|
tab[k] = nil -- prevent bogus bankbags
|
|
end
|
|
end
|
|
addon:updateTT()
|
|
end
|
|
end
|
|
local function bagLoop(id,res)
|
|
local cName = modulname.."Count"
|
|
local dName = cName
|
|
for k,v in pairs(modul['db']) do
|
|
local units = addon:getUnits()
|
|
if(units[k]) then
|
|
local playerID = addon.getPID()
|
|
if(playerID and units[k]['faction']==units[playerID]['faction']) then
|
|
local unitname = units[k]['name']
|
|
for bag,list in pairs(v) do
|
|
if(bag == -3) then
|
|
dName = 'reagentCount'
|
|
else
|
|
dName = cName
|
|
end
|
|
for a,b in pairs(list) do
|
|
if(a == id) then
|
|
res[unitname] = res[unitname] or {
|
|
[dName] = 0
|
|
}
|
|
res[unitname][dName] = res[unitname][dName] or 0
|
|
res[unitname][dName] = res[unitname][dName] + b['count']
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return res
|
|
end
|
|
function modul.Get(id)
|
|
local cName = modulname.."Count"
|
|
local dName = cName
|
|
local res = 0
|
|
local playerID = addon.getPID()
|
|
for k,v in pairs(modul['db']) do
|
|
if(playerID and k==playerID) then
|
|
for bag,list in pairs(v) do
|
|
for a,b in pairs(list) do
|
|
if(a == id) then
|
|
res = res + b['count']
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return res
|
|
end
|
|
|
|
function modul.Search(id,res)
|
|
local playerID = addon.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)
|
|
local desc = modulname..'Count'
|
|
if(b[desc] and b[desc]>0) then
|
|
input[#input+1] = format("Bank %s",b[desc])
|
|
sum = sum + b[desc]
|
|
end
|
|
desc = 'reagentCount'
|
|
if(b[desc] and b[desc]>0) then
|
|
input[#input+1] = format("Reagents %s",b[desc])
|
|
sum = sum + b[desc]
|
|
end
|
|
return input,sum
|
|
end
|
|
function events:BANKFRAME_OPENED(event,...)
|
|
BankIsOpen = true
|
|
scanAllBankBags(nil)
|
|
end
|
|
function events:BANKFRAME_CLOSED(event,...)
|
|
BankIsOpen = false
|
|
end
|
|
function events:PLAYERBANKBAGSLOTS_CHANGED(event,...)
|
|
scanAllBankBags(nil)
|
|
end
|
|
function events:PLAYERBANKSLOTS_CHANGED(event,...)
|
|
scanAllBankBags(nil)
|
|
end
|
|
function events:PLAYERREAGENTBANKSLOTS_CHANGED(event,...)
|
|
scanAllBankBags(nil)
|
|
end
|
|
function events:ITEM_UNLOCKED(event,...)
|
|
scanAllBankBags(nil)
|
|
end
|
|
local function OnEvent(self,event,...)
|
|
local playerID = addon.getPID()
|
|
if(playerID and type(events[event])=='function') then
|
|
modul['db'] = addon:GetNamespace(modul.name)
|
|
modul['db'][playerID] = modul['db'][playerID] or {}
|
|
events[event](self, event, ...)
|
|
end
|
|
end
|
|
function modul:Delete(id, typ)
|
|
self['db'] = addon:GetNamespace(modul.name)
|
|
if(typ == self['typ'] and id and id>0) then
|
|
self['db'][id] = nil
|
|
end
|
|
end
|
|
local skipClassic = {
|
|
['PLAYERREAGENTBANKSLOTS_CHANGED'] = true
|
|
}
|
|
function modul:Enable()
|
|
self.status = true
|
|
local list = {}
|
|
for event,func in pairs(events) do
|
|
if(not addon:IsClassic() or (addon:IsClassic() and not skipClassic[event])) then
|
|
list[#list+1] = event
|
|
end
|
|
end
|
|
self.frame = addon:RegisterFunc(list,"OnEvent",OnEvent)
|
|
end
|
|
function modul:Disable()
|
|
self.status = false
|
|
for event,func in pairs(events) do
|
|
if(not addon:IsClassic() or (addon:IsClassic() and not skipClassic[event])) then
|
|
self.frame:UnregisterEvent(event)
|
|
end
|
|
end
|
|
end
|
|
addon['inits'][#addon['inits']+1] = function()
|
|
modul.db,modul.status = addon:RegisterModul(modul, modulname)
|
|
if(modul.status) then
|
|
modul:Enable()
|
|
end
|
|
end |