BagData.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. local BagData = class("BagData", require("DataBase"))
  2. local petStampRPItems
  3. function BagData:ctor()
  4. self.data = {}
  5. end
  6. function BagData:InitBagData(data)
  7. local items = {}
  8. local itemsCfgs = {}
  9. local bagCount = 0
  10. local cfgMgr = ManagerContainer.CfgMgr
  11. for i = 1, #data.item_list do
  12. local itemData = data.item_list[i]
  13. if itemData and itemData.num > 0 then
  14. local item = self:ProtocalDataToItemData(itemData)
  15. local cfgId = item.cfgId
  16. local itemCfgData = cfgMgr:GetItemById(cfgId)
  17. if not itemCfgData then
  18. LogError("[Wboy] .. ".. tostring(cfgId) .. " 道具ID不存在")
  19. else
  20. items[item.id] = item
  21. if itemsCfgs[cfgId] then
  22. itemsCfgs[cfgId].num = itemsCfgs[cfgId].num + item.num
  23. else
  24. itemsCfgs[cfgId] = {cfgId = cfgId, num = item.num}
  25. end
  26. end
  27. end
  28. end
  29. bagCount = data.bag_count
  30. self.data.items = items
  31. self.data.itemCfgMap = itemsCfgs
  32. self.data.bagCount = bagCount
  33. local needRP = false
  34. for k,v in pairs(items) do
  35. local cfgData = ManagerContainer.CfgMgr:GetItemById(v.cfgId)
  36. local result = self:RefreshItemRPState(v, cfgData)
  37. if result then
  38. needRP = true
  39. end
  40. end
  41. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.BagItem, needRP)
  42. end
  43. function BagData:StartLimitTimeItemDelete()
  44. if self.timerId then
  45. ManagerContainer.LuaTimerMgr:RemoveTimer(self.timerId)
  46. self.timerId = nil
  47. end
  48. self.timerId = ManagerContainer.LuaTimerMgr:AddTimer(10000, -1, self, self.LimitTimeItemDelete, nil)
  49. end
  50. function BagData:LimitTimeItemDelete()
  51. local nextItemCfgId,nextItemId
  52. local minTime, minIdx = 0,0
  53. for k,v in pairs(self.data.items) do
  54. if minTime == 0 and v.timeStamp > 0 then
  55. minTime = v.timeStamp
  56. end
  57. if v.timeStamp > 0 and v.timeStamp <= minTime then
  58. minTime = v.timeStamp
  59. minIdx = k
  60. nextItemCfgId = v.cfgId
  61. nextItemId = v.id
  62. end
  63. end
  64. if minIdx == 0 or nextItemCfgId == nil or nextItemId == nil then
  65. return
  66. end
  67. local cfgData = ManagerContainer.CfgMgr:GetItemById(nextItemCfgId)
  68. if cfgData and cfgData.ItemTime == 7 then
  69. return
  70. end
  71. local curTime = ManagerContainer.LuaTimerMgr:GetTimeSecond()
  72. if curTime < minTime then
  73. return
  74. end
  75. self.data.items[minIdx] = nil
  76. self.data.itemCfgMap[nextItemCfgId] = nil
  77. ManagerContainer.DataMgr.BagData:DelAllTimeLimitItems({nextItemId})
  78. end
  79. function BagData:GetItemById(id)
  80. return self.data.items[id]
  81. end
  82. function BagData:GetItemDataByCfgId(cfgId)
  83. for _,v in pairs(self.data.items) do
  84. if v. cfgId == cfgId then
  85. return v
  86. end
  87. end
  88. return nil
  89. end
  90. function BagData:SendWishBoxReq(data)
  91. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_WISH_BOX_USE_REQ, {
  92. item_id = data.id,
  93. select_item = data.cfgId,
  94. })
  95. end
  96. function BagData:GetItemByCfgId(cfgId)
  97. return self.data.itemCfgMap[cfgId]
  98. end
  99. function BagData:GetItemCountByCfgId(cfgId)
  100. local data = self.data.itemCfgMap[cfgId]
  101. if data ~= nil then
  102. return data.num
  103. end
  104. return 0
  105. end
  106. function BagData:GetAllItemDatas()
  107. local list = {}
  108. local curTime = ManagerContainer.LuaTimerMgr:GetTimeSecond()
  109. for k,v in pairs(self.data.items) do
  110. if v.timeStamp > 0 then
  111. if curTime > v.timeStamp then
  112. local cfgData = ManagerContainer.CfgMgr:GetItemById(v.cfgId)
  113. if cfgData and cfgData.ItemTime ~= 7 then
  114. list[#list + 1] = v.id
  115. self.data.items[k] = nil
  116. self.data.itemCfgMap[v.cfgId] = nil
  117. end
  118. end
  119. end
  120. end
  121. if #list > 0 then
  122. self:DelAllTimeLimitItems(list)
  123. end
  124. return self.data.items
  125. end
  126. function BagData:DelAllTimeLimitItems(list)
  127. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_DEL_ITEM_REQ, {item_id_list = list})
  128. end
  129. function BagData:RefreshData(item_list, ignore)
  130. -- 是否为新增道具, 默认为新增
  131. local cfgMgr = ManagerContainer.CfgMgr
  132. ignore = ignore and ignore or false
  133. local items = self.data.items
  134. local itemCfgs = self.data.itemCfgMap
  135. local addItemMap = {}
  136. local changedIds = {}
  137. for _,itemData in ipairs(item_list) do
  138. local id = itemData.id
  139. local num = itemData.num
  140. local cfgId = itemData.config_id or id
  141. local itemCfgData = cfgMgr:GetItemById(cfgId)
  142. if not itemCfgData then
  143. LogError("[Wboy] .. ".. cfgId .. " 道具ID不存在")
  144. else
  145. local item = items[id]
  146. local itemCfg = itemCfgs[cfgId]
  147. local lastNum = item and item.num or 0
  148. if num <= 0 then
  149. -- 删除道具
  150. items[id] = nil
  151. if itemCfg then
  152. itemCfg.num = itemCfg.num - lastNum
  153. if itemCfg.num <= 0 then
  154. itemCfgs[cfgId] = nil
  155. end
  156. end
  157. changedIds[cfgId] = 0
  158. else
  159. -- 更新道具数量
  160. local newItem = self:ProtocalDataToItemData(itemData)
  161. items[id] = newItem
  162. local addNum = newItem.num - lastNum
  163. if itemCfg then
  164. itemCfg.num = itemCfg.num + addNum
  165. else
  166. itemCfg = {cfgId = cfgId, num = newItem.num}
  167. itemCfgs[cfgId] = itemCfg
  168. end
  169. changedIds[cfgId] = itemCfg.num
  170. -- 当前增加的道具
  171. if addNum > 0 then
  172. self:NewItemRefreshRP(cfgId, itemCfgData)
  173. if addItemMap[cfgId] then
  174. addItemMap[cfgId] = addItemMap[cfgId] + addNum
  175. else
  176. addItemMap[cfgId] = addNum
  177. end
  178. end
  179. end
  180. end
  181. end
  182. local needRP = false
  183. for k,v in pairs(items) do
  184. local cfgData = ManagerContainer.CfgMgr:GetItemById(v.cfgId)
  185. local result = self:RefreshItemRPState(v, cfgData)
  186. if result then
  187. needRP = true
  188. end
  189. end
  190. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.BagItem, needRP)
  191. if not CommonUtil.TableIsEmpty(addItemMap) then
  192. ManagerContainer.DataMgr.SummonDataMgr:CalcRedPoint()
  193. end
  194. if not ignore then
  195. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_EQUIP_AND_ITEM_ADD, addItemMap)
  196. end
  197. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.ITEM_CHANGE, changedIds)
  198. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerItemChangeRPNotify()
  199. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.ROLE_UI_REDPOINT_CHANGE)
  200. end
  201. function BagData:NewItemRefreshRP(cfgId, itemCfgData)
  202. if not petStampRPItems then
  203. local val = GlobalConfig.Instance:GetConfigStrValue(321)
  204. if val ~= "" and val ~= nil then
  205. petStampRPItems = CommonUtil.DeserializeGlobalStrToTable(val)
  206. end
  207. end
  208. if cfgId == Enum.ItemIds.Recruit then
  209. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerRecruitNotify()
  210. elseif cfgId == Enum.ItemIds.QiyueItem then
  211. ManagerContainer.RedPointMgr.PetRPCtr:RefreshTotalQiyueRPState()
  212. elseif itemCfgData.ItemTime == Enum.ActivitiesItemType.HolidayCollectionWord then
  213. ManagerContainer.DataMgr.ActsDataMgr:RefreshRedPointState(Enum.ActivityType.ACTIVITY_TYPE_FESTIVAL_REWARD)
  214. elseif CommonUtil.EleInTable(tostring(cfgId), petStampRPItems) then
  215. ManagerContainer.RedPointMgr.PetRPCtr:RefreshPetStampRPState()
  216. end
  217. end
  218. function BagData:RegisterNetEvents()
  219. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_ITEM_CHANGE_NTF, function(data)
  220. self:RefreshData(data.item_list, data.ignore)
  221. end)
  222. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_UPDATE_WISH_SLOT_NTF, function(data)
  223. self:RefreshWishSlotData(data)
  224. end)
  225. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DEL_ITEM_ACK, function(data)
  226. if data.error == Enum.NetErrorCode.ERROR_OK then
  227. local list = {}
  228. for _,v in pairs(data.del_cfg_id_list) do
  229. if not CommonUtil.EleInTable(v, list) then
  230. local cfgData = ManagerContainer.CfgMgr:GetItemById(v)
  231. list[#list + 1] = I18N.T(cfgData.Name)
  232. end
  233. end
  234. self:NoticeDelTimeLimitItems(list)
  235. end
  236. end)
  237. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DEL_ITEM_ACK, function(data)
  238. if data.error == Enum.NetErrorCode.ERROR_OK then
  239. local list = {}
  240. for _,v in pairs(data.del_cfg_id_list) do
  241. if not CommonUtil.EleInTable(v, list) then
  242. local cfgData = ManagerContainer.CfgMgr:GetItemById(v)
  243. list[#list + 1] = I18N.T(cfgData.Name)
  244. end
  245. end
  246. self:NoticeDelTimeLimitItems(list)
  247. end
  248. end)
  249. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_WISH_UNLOCK_SLOT_ACK, function(data) --解锁请求
  250. if data.error == 0 then
  251. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay("WishunlockTips1")
  252. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.WISHBOX_SLOT_CHANGE)
  253. end
  254. end)
  255. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_WISH_SLOT_REQ_ACK, function(data) --加速领奖返回
  256. if data.error == 0 then
  257. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.WISHBOX_SLOT_CHANGE)
  258. local rewards = {}
  259. if data.award_item then
  260. table.insert(rewards,{cfgId = data.award_item.key,num = data.award_item.value,lucky = false})
  261. end
  262. if data.lucky_item then
  263. table.insert(rewards,{cfgId = data.lucky_item.key,num = data.lucky_item.value,lucky = true})
  264. end
  265. if #rewards > 0 then
  266. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIWishPOPGot,rewards)
  267. end
  268. end
  269. end)
  270. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_WISH_BOX_USE_ACK, function(data)
  271. if data.error == 0 then
  272. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.WISHBOX_SLOT_SHOWANIMATION,data.index)
  273. end
  274. end)
  275. end
  276. function BagData:RefreshWishSlotData(data)
  277. local wishSlot = data.slots
  278. if wishSlot and #wishSlot > 0 then
  279. if not self.wishSlotData then
  280. self.wishSlotData = {}
  281. local wishSlotNum = GlobalConfig.Instance:GetConfigIntValue(348)
  282. for i = 1, wishSlotNum do
  283. table.insert(self.wishSlotData, {end_time = 0,isOpen = false})
  284. end
  285. end
  286. for i = 1, #wishSlot do
  287. self.wishSlotData[i] = wishSlot[i]
  288. end
  289. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.WISHBOX_SLOT_CHANGE)
  290. local items = self.data.items
  291. local wishRP = self:GetWishRedPointState()
  292. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.WishSlotItem, wishRP)
  293. end
  294. end
  295. function BagData:SendWishSlotUnlockReq()
  296. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_WISH_UNLOCK_SLOT_REQ)
  297. end
  298. function BagData:SendWishAccelerateReq(idx)
  299. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_WISH_SLOT_REQ,{index = idx})
  300. end
  301. function BagData:GetWishSlotData()
  302. if not self.wishSlotData then
  303. self.wishSlotData = {}
  304. local wishSlotNum = GlobalConfig.Instance:GetConfigIntValue(348)
  305. for i = 1, wishSlotNum do
  306. table.insert(self.wishSlotData, {end_time = 0,isOpen = false})
  307. end
  308. end
  309. return self.wishSlotData
  310. end
  311. function BagData:GetWishRedPointState()
  312. if self.wishSlotData then
  313. for i = 1, #self.wishSlotData do
  314. local slotData = self.wishSlotData[i]
  315. if slotData.isOpen and slotData.item ~= nil and slotData.end_time == 0 then
  316. return true
  317. end
  318. end
  319. end
  320. return false
  321. end
  322. function BagData:NoticeDelTimeLimitItems(list)
  323. local datas = {}
  324. for _,v in pairs(list) do
  325. local data = {}
  326. data.type = Enum.ChatSystemType.TimeLimitDel
  327. data.nick_name = v
  328. data.send_time = ManagerContainer.LuaTimerMgr:CurLuaServerTime()
  329. datas[#datas + 1] = data
  330. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay(I18N.SetLanguageValue("CompetitionTip2", v))
  331. end
  332. ManagerContainer.DataMgr.ChatData:AddNewSystemData(datas)
  333. end
  334. function BagData:Clear()
  335. if self.timerId then
  336. ManagerContainer.LuaTimerMgr:RemoveTimer(self.timerId)
  337. self.timerId = nil
  338. end
  339. self.wishSlotData = nil
  340. self.data = {}
  341. end
  342. function BagData:Destroy()
  343. if self.Clear then
  344. self:Clear()
  345. end
  346. self:UnRegisterNetEvents()
  347. end
  348. function BagData:UnRegisterNetEvents()
  349. end
  350. function BagData:ProtocalDataToItemData(protocalData)
  351. local itemData = {}
  352. itemData.id = protocalData.id
  353. itemData.cfgId = protocalData.config_id
  354. itemData.num = protocalData.num
  355. itemData.timeStamp = protocalData.time_stamp
  356. itemData.redpointState = false
  357. return itemData
  358. end
  359. function BagData:RefreshItemRPState(itemData, cfgData)
  360. local unLockLv = cfgData.NeedLevel
  361. local curLv = ManagerContainer.DataMgr.UserData:GetRoleLv()
  362. if curLv < unLockLv then
  363. return
  364. end
  365. if cfgData.ResType == Enum.ItemType.Gift then
  366. local costId = cfgData.Costitem and cfgData.Costitem[1][1] or 0
  367. local costCount = cfgData.Costitem and cfgData.Costitem[1][2] or 0
  368. if costId == 0 then
  369. itemData.redpointState = itemData.num > 0 and cfgData.NeedRP
  370. else
  371. --考虑是否需要钥匙打开礼包
  372. local ownedCost = CommonUtil.GetOwnResCountByItemId(costId)
  373. itemData.redpointState = itemData.num > 0 and ownedCost >= costCount and cfgData.NeedRP
  374. end
  375. elseif cfgData.ResType == Enum.ItemType.HeadFrame then
  376. itemData.redpointState = cfgData.NeedRP
  377. elseif cfgData.ResType == Enum.ItemType.Compose then
  378. local costId = cfgData.Costitem and cfgData.Costitem[1][1] or 0
  379. local costCount = cfgData.Costitem and cfgData.Costitem[1][2] or 0
  380. if costId == 0 then
  381. itemData.redpointState = false
  382. else
  383. if costId ~= itemData.cfgId then
  384. itemData.redpointState = false
  385. else
  386. itemData.redpointState = itemData.num >= costCount and cfgData.NeedRP
  387. end
  388. end
  389. elseif cfgData.ResType == Enum.ItemType.OptionalGift then
  390. itemData.redpointState = cfgData.NeedRP
  391. end
  392. return itemData.redpointState
  393. end
  394. return BagData