StorageVO.lua 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. local StorageVO = class( "StorageVO" )
  2. function StorageVO:ctor()
  3. self.posMark = {} --仓库位置 有序 k = pos
  4. self.posData = {} --仓库位置 k = makeindex
  5. self.storageVo = {} --仓库数据 k = maekindex
  6. self.itemCount = 0
  7. self.storageMax = GUIDefine.STORAGE_PER_PAGE_MAX or global.MMO.NPC_STORAGE_MAX_PAGE
  8. self.itemCountByIndex = {}
  9. self.isInited = false
  10. self:InitStoragePosMark()
  11. end
  12. function StorageVO:InitStoragePosMark()
  13. local storagePosData = self:GetPosMarkData()
  14. if not self.isInited or not storagePosData then
  15. for i = 1, self.storageMax do
  16. self.posMark[i] = 0
  17. end
  18. self:SetPosMarkData()
  19. else
  20. self.posMark = storagePosData
  21. end
  22. end
  23. function StorageVO:SetMaxStorage(maxStorage)
  24. self.storageMax = maxStorage
  25. end
  26. function StorageVO:GetMaxStorage()
  27. return self.storageMax or 0
  28. end
  29. function StorageVO:SetNewStoragePosMark()
  30. local newPosMark = {}
  31. for i = 1, self.storageMax do
  32. if not self.posMark[i] or self.posMark[i] == 0 then
  33. newPosMark[i] = 0
  34. else
  35. newPosMark[i] = self.posMark[i]
  36. end
  37. end
  38. self.posMark = newPosMark
  39. end
  40. function StorageVO:GetHistoryPos(MakeIndex)
  41. for k, v in pairs(self.posMark) do
  42. if v == MakeIndex then
  43. return k
  44. end
  45. end
  46. return nil
  47. end
  48. -- 从头开始 找到空位就返回pos
  49. function StorageVO:NewItemPos()
  50. for i = 1, self.storageMax do
  51. if self.posMark[i] and self.posMark[i] == 0 then
  52. return i
  53. end
  54. end
  55. return nil
  56. end
  57. -- 保存位置数据
  58. function StorageVO:SetItemPosData(MakeIndex, pos)
  59. self.posData[MakeIndex] = pos
  60. if pos then
  61. self.posMark[pos] = MakeIndex
  62. end
  63. end
  64. -- 增
  65. function StorageVO:AddItem(item, pos)
  66. local MakeIndex = item.MakeIndex
  67. if pos then
  68. self.storageVo[MakeIndex] = item
  69. self.itemCount = self.itemCount + 1
  70. self:ChangeItemCountByIndex(item.Index, item.OverLap)
  71. end
  72. end
  73. -- 删
  74. function StorageVO:SubItem(MakeIndex)
  75. if self.storageVo[MakeIndex] then
  76. local item = self.storageVo[MakeIndex]
  77. self:ChangeItemCountByIndex(item.Index,-item.OverLap)
  78. self.storageVo[MakeIndex] = nil
  79. self.itemCount = self.itemCount - 1
  80. end
  81. end
  82. -- 改
  83. function StorageVO:AmendHistoryPos(data)
  84. if not data then
  85. return
  86. end
  87. local newItems = {}
  88. local newPosMark = {}
  89. for i = 1, self.storageMax do
  90. newPosMark[i] = 0
  91. end
  92. for i, item in pairs(data) do
  93. local historyPos = self:GetHistoryPos(item.MakeIndex)
  94. if historyPos then
  95. newPosMark[historyPos] = item.MakeIndex
  96. else
  97. table.insert(newItems, item)
  98. end
  99. end
  100. for i = 1, #newPosMark do
  101. self.posMark[i] = newPosMark[i]
  102. end
  103. for i, v in ipairs(newItems) do
  104. local newPos = self:NewItemPos()
  105. if newPos then
  106. self.posMark[newPos] = v.MakeIndex
  107. self.posData[v.MakeIndex] = newPos
  108. end
  109. end
  110. end
  111. function StorageVO:ChangeItemCountByIndex(Index, diff)
  112. if not Index then
  113. return
  114. end
  115. if not self.itemCountByIndex then
  116. self.itemCountByIndex = {}
  117. end
  118. local diffCount = diff or 0
  119. local oldCount = self.itemCountByIndex[Index] or 0
  120. local newCount = oldCount + diffCount
  121. self.itemCountByIndex[Index] = newCount > 0 and newCount or 0
  122. end
  123. function StorageVO:CleanItemPosData(MakeIndex)
  124. local historyPos = self.posData[MakeIndex]
  125. if historyPos then
  126. self.posData[MakeIndex] = nil
  127. self.posMark[historyPos] = 0
  128. end
  129. local newPosMark = {}
  130. for i = 1, self.storageMax do
  131. newPosMark[i] = 0
  132. end
  133. local temp = {}
  134. for i = 1, self.storageMax do
  135. if self.posMark[i] > 0 then
  136. table.insert(temp, self.posMark[i])
  137. end
  138. end
  139. for i, makeindex in ipairs(temp) do
  140. newPosMark[i] = makeindex
  141. if self.posData[makeindex] then
  142. self.posData[makeindex] = i
  143. end
  144. end
  145. self.posMark = newPosMark
  146. end
  147. function StorageVO:CleanStoragePosData()
  148. self.posMark = {}
  149. self.posData = {}
  150. for i = 1, self.storageMax do
  151. self.posMark[i] = 0
  152. end
  153. end
  154. function StorageVO:ClearItemData()
  155. self.storageVo = {}
  156. self.itemCount = 0
  157. self.itemCountByIndex = {}
  158. end
  159. function StorageVO:GetStorageData()
  160. return self.storageVo
  161. end
  162. function StorageVO:GetStoragePosByMakeIndex(MakeIndex)
  163. return self.posData[MakeIndex]
  164. end
  165. -- 本地仓库位置信息
  166. function StorageVO:GetPosMarkData()
  167. local PosData = UserData:new("NPCStoragePosData")
  168. local proxy = global.Facade:retrieveProxy(global.ProxyTable.Login)
  169. local flag = proxy:GetSelectedRoleID() or "errorName"
  170. local inited = PosData:getBoolForKey("storage_inited"..flag)
  171. if not inited then
  172. self.isInited = false
  173. PosData:setBoolForKey( "storage_inited"..flag, true )
  174. else
  175. self.isInited = true
  176. end
  177. local clientData = PosData:getStringForKey( "storage"..flag )
  178. if not clientData or clientData == "" then
  179. return nil
  180. end
  181. local cjson = require( "cjson" )
  182. local lastJsonData = cjson.decode(clientData)
  183. return lastJsonData
  184. end
  185. function StorageVO:SetPosMarkData()
  186. local PosData = UserData:new("NPCStoragePosData")
  187. local proxy = global.Facade:retrieveProxy(global.ProxyTable.Login)
  188. local flag = proxy:GetSelectedRoleID() or "errorName"
  189. local cjson = require( "cjson" )
  190. local storagePosData = cjson.encode(self.posMark)
  191. local clientData = PosData:setStringForKey( "storage"..flag, storagePosData )
  192. end
  193. return StorageVO