| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- local StorageVO = class( "StorageVO" )
- function StorageVO:ctor()
- self.posMark = {} --仓库位置 有序 k = pos
- self.posData = {} --仓库位置 k = makeindex
- self.storageVo = {} --仓库数据 k = maekindex
- self.itemCount = 0
- self.storageMax = GUIDefine.STORAGE_PER_PAGE_MAX or global.MMO.NPC_STORAGE_MAX_PAGE
- self.itemCountByIndex = {}
- self.isInited = false
- self:InitStoragePosMark()
- end
- function StorageVO:InitStoragePosMark()
- local storagePosData = self:GetPosMarkData()
- if not self.isInited or not storagePosData then
- for i = 1, self.storageMax do
- self.posMark[i] = 0
- end
- self:SetPosMarkData()
- else
- self.posMark = storagePosData
- end
- end
- function StorageVO:SetMaxStorage(maxStorage)
- self.storageMax = maxStorage
- end
- function StorageVO:GetMaxStorage()
- return self.storageMax or 0
- end
- function StorageVO:SetNewStoragePosMark()
- local newPosMark = {}
- for i = 1, self.storageMax do
- if not self.posMark[i] or self.posMark[i] == 0 then
- newPosMark[i] = 0
- else
- newPosMark[i] = self.posMark[i]
- end
- end
- self.posMark = newPosMark
- end
- function StorageVO:GetHistoryPos(MakeIndex)
- for k, v in pairs(self.posMark) do
- if v == MakeIndex then
- return k
- end
- end
- return nil
- end
- -- 从头开始 找到空位就返回pos
- function StorageVO:NewItemPos()
- for i = 1, self.storageMax do
- if self.posMark[i] and self.posMark[i] == 0 then
- return i
- end
- end
- return nil
- end
- -- 保存位置数据
- function StorageVO:SetItemPosData(MakeIndex, pos)
- self.posData[MakeIndex] = pos
- if pos then
- self.posMark[pos] = MakeIndex
- end
- end
- -- 增
- function StorageVO:AddItem(item, pos)
- local MakeIndex = item.MakeIndex
- if pos then
- self.storageVo[MakeIndex] = item
- self.itemCount = self.itemCount + 1
- self:ChangeItemCountByIndex(item.Index, item.OverLap)
- end
- end
- -- 删
- function StorageVO:SubItem(MakeIndex)
- if self.storageVo[MakeIndex] then
- local item = self.storageVo[MakeIndex]
- self:ChangeItemCountByIndex(item.Index,-item.OverLap)
- self.storageVo[MakeIndex] = nil
- self.itemCount = self.itemCount - 1
- end
- end
- -- 改
- function StorageVO:AmendHistoryPos(data)
- if not data then
- return
- end
- local newItems = {}
- local newPosMark = {}
- for i = 1, self.storageMax do
- newPosMark[i] = 0
- end
- for i, item in pairs(data) do
- local historyPos = self:GetHistoryPos(item.MakeIndex)
- if historyPos then
- newPosMark[historyPos] = item.MakeIndex
- else
- table.insert(newItems, item)
- end
- end
- for i = 1, #newPosMark do
- self.posMark[i] = newPosMark[i]
- end
-
- for i, v in ipairs(newItems) do
- local newPos = self:NewItemPos()
- if newPos then
- self.posMark[newPos] = v.MakeIndex
- self.posData[v.MakeIndex] = newPos
- end
- end
- end
- function StorageVO:ChangeItemCountByIndex(Index, diff)
- if not Index then
- return
- end
- if not self.itemCountByIndex then
- self.itemCountByIndex = {}
- end
- local diffCount = diff or 0
- local oldCount = self.itemCountByIndex[Index] or 0
- local newCount = oldCount + diffCount
- self.itemCountByIndex[Index] = newCount > 0 and newCount or 0
- end
- function StorageVO:CleanItemPosData(MakeIndex)
- local historyPos = self.posData[MakeIndex]
- if historyPos then
- self.posData[MakeIndex] = nil
- self.posMark[historyPos] = 0
- end
- local newPosMark = {}
- for i = 1, self.storageMax do
- newPosMark[i] = 0
- end
- local temp = {}
- for i = 1, self.storageMax do
- if self.posMark[i] > 0 then
- table.insert(temp, self.posMark[i])
- end
- end
- for i, makeindex in ipairs(temp) do
- newPosMark[i] = makeindex
- if self.posData[makeindex] then
- self.posData[makeindex] = i
- end
- end
- self.posMark = newPosMark
- end
- function StorageVO:CleanStoragePosData()
- self.posMark = {}
- self.posData = {}
- for i = 1, self.storageMax do
- self.posMark[i] = 0
- end
- end
- function StorageVO:ClearItemData()
- self.storageVo = {}
- self.itemCount = 0
- self.itemCountByIndex = {}
- end
- function StorageVO:GetStorageData()
- return self.storageVo
- end
- function StorageVO:GetStoragePosByMakeIndex(MakeIndex)
- return self.posData[MakeIndex]
- end
- -- 本地仓库位置信息
- function StorageVO:GetPosMarkData()
- local PosData = UserData:new("NPCStoragePosData")
- local proxy = global.Facade:retrieveProxy(global.ProxyTable.Login)
- local flag = proxy:GetSelectedRoleID() or "errorName"
- local inited = PosData:getBoolForKey("storage_inited"..flag)
- if not inited then
- self.isInited = false
- PosData:setBoolForKey( "storage_inited"..flag, true )
- else
- self.isInited = true
- end
- local clientData = PosData:getStringForKey( "storage"..flag )
- if not clientData or clientData == "" then
- return nil
- end
- local cjson = require( "cjson" )
- local lastJsonData = cjson.decode(clientData)
- return lastJsonData
- end
- function StorageVO:SetPosMarkData()
- local PosData = UserData:new("NPCStoragePosData")
- local proxy = global.Facade:retrieveProxy(global.ProxyTable.Login)
- local flag = proxy:GetSelectedRoleID() or "errorName"
- local cjson = require( "cjson" )
- local storagePosData = cjson.encode(self.posMark)
- local clientData = PosData:setStringForKey( "storage"..flag, storagePosData )
- end
- return StorageVO
|