SummonDataMgr.lua 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. local SummonDataMgr = class('SummonDataMgr', require('DataBase'))
  2. local JSON = require('json')
  3. local CACHE_SUMMON_KEY_NAME = "Cache_Summon_Key"
  4. local REQ_SUMMON_CD = 1000
  5. function SummonDataMgr:ctor()
  6. self.lastSendMsgTimeMap = nil -- 发送消息的冷却时间,避免操作过快
  7. self.summonData = nil -- 召唤后的表现数据
  8. self.summonMap = nil -- 各种召唤记录的额外奖励次数
  9. self.cacheSummonData = nil -- 红点等本地缓存的数据
  10. end
  11. function SummonDataMgr:Clear()
  12. self.lastSendMsgTimeMap = nil
  13. self.summonData = nil
  14. self.summonMap = nil
  15. self.cacheSummonData = nil
  16. end
  17. function SummonDataMgr:Destroy()
  18. self.lastSendMsgTimeMap = nil
  19. self.summonData = nil
  20. self.summonMap = nil
  21. self.cacheSummonData = nil
  22. self:UnRegisterNetEvents()
  23. end
  24. function SummonDataMgr:RegisterNetEvents()
  25. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_DRAW_CARD_ACK, self.OnSummonAck, self)
  26. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_ACTIVITY_SUMMON_ACK, self.OnActivitySummonAck, self)
  27. end
  28. function SummonDataMgr:UnRegisterNetEvents()
  29. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_DRAW_CARD_ACK)
  30. end
  31. function SummonDataMgr:OnActivitySummonAck(data)
  32. if ManagerContainer.NetManager:IsErrorData(data) then
  33. return
  34. end
  35. if self.summonData then return end
  36. local summonCfg = ManagerContainer.CfgMgr:GetAllSummonCfg()
  37. local type = 0
  38. for k, v in pairs(summonCfg) do
  39. if data.activity_id == v.ActivitiesId then
  40. type = v.Id
  41. end
  42. end
  43. local summonType = type
  44. local summonNum = data.draw_count
  45. local summonAdd = data.add_point
  46. local summonTotal = data.draw_times
  47. self:SetSummonNum(summonType, summonTotal)
  48. local rewards = nil
  49. local extraRewards = nil
  50. local itemList = data.item_list
  51. local item, cfgId, num, isNew
  52. if itemList then
  53. rewards = {}
  54. for i = 1, #itemList do
  55. item = itemList[i]
  56. if item then
  57. cfgId = item.item_id
  58. num = item.item_num
  59. isNew = item.is_new
  60. local itemCfgData = ManagerContainer.CfgMgr:GetItemById(cfgId)
  61. if not itemCfgData then
  62. LogError("[Wboy] .. ".. tostring(cfgId) .. " 道具ID不存在")
  63. else
  64. rewards[#rewards + 1] = {cfgId = cfgId, num = num, isNew = isNew}
  65. end
  66. end
  67. end
  68. end
  69. local extraItemList = data.extra_item
  70. if extraItemList then
  71. extraRewards = {}
  72. for i = 1, #extraItemList do
  73. item = extraItemList[i]
  74. if item then
  75. cfgId = item.item_id
  76. num = item.item_num
  77. isNew = item.is_new
  78. local itemCfgData = ManagerContainer.CfgMgr:GetItemById(cfgId)
  79. if not itemCfgData then
  80. LogError("[Wboy] .. ".. tostring(cfgId) .. " 道具ID不存在")
  81. else
  82. extraRewards[#extraRewards + 1] = {cfgId = cfgId, num = num, isNew = isNew}
  83. end
  84. end
  85. end
  86. end
  87. if not rewards or #rewards <= 0 then
  88. self.summonData = nil
  89. return
  90. end
  91. local summonData = {
  92. summonType = summonType,
  93. summonNum = summonNum,
  94. summonAdd = summonAdd,
  95. summonTotal = summonTotal,
  96. rewards = rewards,
  97. extraRewards = extraRewards,
  98. }
  99. self.summonData = summonData
  100. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.SUMMON_DATA_CHANGED)
  101. end
  102. function SummonDataMgr:OnSummonAck(data)
  103. -- LogError('[wboy] OnSummonAck ' .. Inspect(data))
  104. if ManagerContainer.NetManager:IsErrorData(data) then
  105. return
  106. end
  107. if self.summonData then return end
  108. local summonType = data.draw_type
  109. local summonNum = data.draw_count
  110. local summonAdd = data.add_point
  111. local summonTotal = data.draw_times
  112. self:SetSummonNum(summonType, summonTotal)
  113. local rewards = nil
  114. local extraRewards = nil
  115. local itemList = data.item_list
  116. local item, cfgId, num, isNew
  117. if itemList then
  118. rewards = {}
  119. for i = 1, #itemList do
  120. item = itemList[i]
  121. if item then
  122. cfgId = item.item_id
  123. num = item.item_num
  124. isNew = item.is_new
  125. local itemCfgData = ManagerContainer.CfgMgr:GetItemById(cfgId)
  126. if not itemCfgData then
  127. LogError("[Wboy] .. ".. tostring(cfgId) .. " 道具ID不存在")
  128. else
  129. rewards[#rewards + 1] = {cfgId = cfgId, num = num, isNew = isNew}
  130. end
  131. end
  132. end
  133. end
  134. local extraItemList = data.extra_item
  135. if extraItemList then
  136. extraRewards = {}
  137. for i = 1, #extraItemList do
  138. item = extraItemList[i]
  139. if item then
  140. cfgId = item.item_id
  141. num = item.item_num
  142. isNew = item.is_new
  143. local itemCfgData = ManagerContainer.CfgMgr:GetItemById(cfgId)
  144. if not itemCfgData then
  145. LogError("[Wboy] .. ".. tostring(cfgId) .. " 道具ID不存在")
  146. else
  147. extraRewards[#extraRewards + 1] = {cfgId = cfgId, num = num, isNew = isNew}
  148. end
  149. end
  150. end
  151. end
  152. if not rewards or #rewards <= 0 then
  153. self.summonData = nil
  154. return
  155. end
  156. local summonData = {
  157. summonType = summonType,
  158. summonNum = summonNum,
  159. summonAdd = summonAdd,
  160. summonTotal = summonTotal,
  161. rewards = rewards,
  162. extraRewards = extraRewards,
  163. }
  164. self.summonData = summonData
  165. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.SUMMON_DATA_CHANGED)
  166. end
  167. ---@param summonType integer 召唤类型
  168. ---@param summonNum integer 召唤次数
  169. function SummonDataMgr:SendSummonReq(summonType, summonNum)
  170. if not self:IsCanSend(1) then return false end
  171. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_DRAW_CARD_REQ, {draw_type = summonType, draw_count = summonNum})
  172. return true
  173. end
  174. function SummonDataMgr:SendActivitySummonReq(summonType, summonNum)
  175. if not self:IsCanSend(1) then return false end
  176. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_ACTIVITY_SUMMON_REQ, {activity_id = summonType, summon_count = summonNum})
  177. return true
  178. end
  179. function SummonDataMgr:IsCanSend(key, cdTime)
  180. local curTime = ManagerContainer.LuaTimerMgr:CurLuaServerTime()
  181. if not self.lastSendMsgTimeMap then
  182. self.lastSendMsgTimeMap = {}
  183. self.lastSendMsgTimeMap[key] = curTime
  184. return true
  185. end
  186. local lastTime = self.lastSendMsgTimeMap[key]
  187. if lastTime then
  188. local cd = cdTime or REQ_SUMMON_CD
  189. if (curTime - lastTime) < cd then
  190. return false
  191. end
  192. end
  193. self.lastSendMsgTimeMap[key] = curTime
  194. return true
  195. end
  196. function SummonDataMgr:InitSummonMap(datas)
  197. if datas then
  198. local summonMap = self.summonMap
  199. if not summonMap then
  200. summonMap = {}
  201. self.summonMap = summonMap
  202. end
  203. local drawDatas = datas.draw_system
  204. if drawDatas and #drawDatas > 0 then
  205. local drawData, summonType, summonNum
  206. for i = 1, #drawDatas do
  207. drawData = drawDatas[i]
  208. if drawData then
  209. summonType = drawData.draw_type or 0
  210. summonNum = drawData.draw_times or 0
  211. summonMap[summonType] = summonNum
  212. end
  213. end
  214. end
  215. end
  216. self:CalcRedPoint(true)
  217. end
  218. function SummonDataMgr:GetSummonNum(summonType)
  219. if self.summonMap then
  220. return self.summonMap[summonType] or 0
  221. end
  222. return 0
  223. end
  224. function SummonDataMgr:SetSummonNum(summonType, summonNum)
  225. if not self.summonMap then
  226. self.summonMap = {}
  227. end
  228. self.summonMap[summonType] = summonNum
  229. end
  230. function SummonDataMgr:GetSummonData()
  231. return self.summonData
  232. end
  233. function SummonDataMgr:ClearSummonData()
  234. self.summonData = nil
  235. end
  236. function SummonDataMgr:GetSendSummonReqErrorCode(summonType, methodIdx)
  237. local cfg = ManagerContainer.CfgMgr:GetSummonCfgById(summonType)
  238. local method = cfg.Method
  239. if not method then
  240. return 2
  241. end
  242. local summonNum = method[methodIdx]
  243. if not summonNum then
  244. return 3
  245. end
  246. local costs = cfg.Cost
  247. if not costs then
  248. return 4
  249. end
  250. local costLength = #costs
  251. if costLength <= 0 then
  252. return 4
  253. end
  254. local vaildCosts = {}
  255. local remainSummonNum = summonNum
  256. local cost, costCfgId, costNum, costSummonNum, ownNum
  257. for i = 1, costLength do
  258. cost = costs[i]
  259. costCfgId = tonumber(cost[1])
  260. costNum = tonumber(cost[2])
  261. ownNum = CommonUtil.GetOwnResCountByItemId(costCfgId)
  262. costSummonNum = Mathf.Floor(ownNum / costNum)
  263. if costSummonNum >= remainSummonNum then
  264. vaildCosts[#vaildCosts + 1] = {costCfgId, ownNum, costNum, remainSummonNum}
  265. return 0, summonNum, 0, vaildCosts
  266. else
  267. remainSummonNum = remainSummonNum - costSummonNum
  268. vaildCosts[#vaildCosts + 1] = {costCfgId, ownNum, costNum, costSummonNum}
  269. end
  270. end
  271. return 1, summonNum, remainSummonNum, vaildCosts
  272. end
  273. function SummonDataMgr:IsRedPoint()
  274. local cfgSource = ManagerContainer.CfgMgr:GetAllSummonCfg()
  275. for id, cfg in pairs(cfgSource) do
  276. local method = cfg.Method
  277. if method then
  278. local summonNum = method[#method]
  279. local costs = cfg.Cost
  280. if costs then
  281. if #costs >= 1 then
  282. local cost = costs[1]
  283. local costCfgId = tonumber(cost[1])
  284. local costNum = tonumber(cost[2])
  285. local itemCfgData = ManagerContainer.CfgMgr:GetItemById(costCfgId)
  286. if itemCfgData and itemCfgData.ResType ~= Enum.ItemType.Diamond then
  287. if costNum * summonNum <= CommonUtil.GetOwnResCountByItemId(costCfgId) then
  288. return true
  289. end
  290. end
  291. end
  292. end
  293. end
  294. end
  295. return false
  296. end
  297. function SummonDataMgr:CalcRedPoint(forceSendMsg)
  298. if not self.cacheSummonData then
  299. self:ReadCacheSummonData()
  300. end
  301. local curTime = ManagerContainer.LuaTimerMgr:GetTimeSecond()
  302. if self.cacheSummonData then
  303. if self.cacheSummonData.rp then
  304. if forceSendMsg then
  305. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.Summon, false)
  306. end
  307. return
  308. end
  309. local lastTime = self.cacheSummonData.time
  310. if lastTime then
  311. if curTime < lastTime then
  312. if forceSendMsg then
  313. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.Summon, false)
  314. end
  315. return
  316. end
  317. end
  318. end
  319. local isRedPoint = self:IsRedPoint()
  320. if isRedPoint then
  321. if not self.cacheSummonData then
  322. self.cacheSummonData = {}
  323. end
  324. local curDate = os.date("*t", curTime)
  325. -- 以本地时区计算的结果,并非精确值, 如果后续功能需要精确值,需要服务器下发
  326. local nextTime = os.time({year = curDate.year, month = curDate.month, day = curDate.day, hour = 5})
  327. if curDate.hour >= 5 then
  328. nextTime = nextTime + 24 * 3600
  329. end
  330. self.cacheSummonData.rp = isRedPoint
  331. self.cacheSummonData.time = nextTime
  332. self:WriteCacheSummonData()
  333. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.Summon, true)
  334. end
  335. end
  336. function SummonDataMgr:ClearRedPoint()
  337. if self.cacheSummonData then
  338. if self.cacheSummonData.rp then
  339. self.cacheSummonData.rp = false
  340. self:WriteCacheSummonData()
  341. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.Summon, false)
  342. end
  343. end
  344. end
  345. function SummonDataMgr:ReadCacheSummonData()
  346. local cacheSummonDataStr = ManagerContainer.PlayerPrefsMgr:GetString(CACHE_SUMMON_KEY_NAME, '')
  347. local cacheSummonData = JSON:decode(cacheSummonDataStr)
  348. if not cacheSummonData then
  349. cacheSummonData = {}
  350. end
  351. self.cacheSummonData = cacheSummonData
  352. end
  353. function SummonDataMgr:WriteCacheSummonData()
  354. if self.cacheSummonData then
  355. local cacheSummonDataStr = JSON:encode(self.cacheSummonData)
  356. ManagerContainer.PlayerPrefsMgr:SetString(CACHE_SUMMON_KEY_NAME, cacheSummonDataStr)
  357. else
  358. ManagerContainer.PlayerPrefsMgr:SetString(CACHE_SUMMON_KEY_NAME, '')
  359. end
  360. end
  361. return SummonDataMgr