AbsReachRankDB.lua 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. local Msg = require("core.Msg")
  2. local Timer = require("core.Timer")
  3. local DB = require("common.DB")
  4. local CommonDB = require("common.CommonDB")
  5. local Log = require("common.Log")
  6. local LuaMongo = _G.lua_mongo
  7. local Util = require("common.Util")
  8. local Grid = require("bag.Grid")
  9. local AbsActLogic = require("absAct.AbsActLogic")
  10. local RoleDBLogic = require("role.RoleDBLogic")
  11. local YunYingLogic = require("yunying.YunYingLogic")
  12. local MailManager = require("mail.MailManager")
  13. local MailExcel = require("excel.mail")
  14. local AbsActExcel = require("excel.absAct")
  15. --[[
  16. abs公共排行类活动DB操作,封装了一些公共处理方法
  17. db字段只是缓存排名好的数据(只是内存数据)
  18. db = {
  19. [rankType] = { -- 排名类型
  20. rankType = xxx, -- 排名类型
  21. uuid2rank = { -- 根据UUID获取名次
  22. [uuid] = rank, -- 玩家uuid = 排行名次
  23. ...
  24. },
  25. sendUuid2rank = { -- 根据UUID获取发送名次
  26. [uuid] = rank, -- 玩家uuid = 真实发送的排行名次
  27. ...
  28. },
  29. rank2data = { -- 根据名次获取DATA
  30. [rank] = { -- 排行名次 = 玩家排名数据
  31. uuid = xxx, -- 玩家uuid
  32. rankType = xxx, -- 排名类型
  33. value = xxx, -- 排名值
  34. time = xxx, -- 排名值更新时间
  35. _id = xxx, -- db记录中的uuid
  36. },
  37. ...
  38. },
  39. sendRank2data = { -- 根据名次获取发送DATA
  40. [rank] = { -- 排行名次 = 真实发送玩家排名数据
  41. uuid = xxx, -- 玩家uuid
  42. rankType = xxx, -- 排名类型
  43. value = xxx, -- 排名值
  44. time = xxx, -- 排名值更新时间
  45. _id = xxx, -- db记录中的uuid
  46. },
  47. ...
  48. },
  49. funcID = xxx, -- 活动id
  50. funcRankType = xxx, -- 活动排名类型
  51. },
  52. ...
  53. }
  54. local:
  55. getActConfig() -- 得到指定排名类型的活动配置
  56. getMaxRank() -- 得到活动最多排名名次
  57. getRankType() -- 拼接排名类型
  58. resertBoard() -- 重置排行数据
  59. initBoard() -- 初始排行榜
  60. getBoard() -- 获取指定排名类型DB数据
  61. getRankInfo() -- 得到指定排行榜指定名次的配置信息
  62. getRewardInfo() -- 得到指定排行榜指定配置信息的奖励信息
  63. getRankNeedValue() -- 得到排行榜中名次对应需要达到的条件数
  64. getMailID() -- 获取发送奖励的邮件ID
  65. getRewardInfoByInfo() -- 得到指定排行榜指定配置信息的奖励信息
  66. getRank() -- 获取指定排名类型、指定用户的排名
  67. getSendRank() -- 获取指定排名类型、指定用户的发送排名
  68. cmpRank() -- 排名算法
  69. updateRank() -- 更新排名
  70. updateData() -- 更新数据
  71. loadBoard() -- 加载排行榜
  72. getDBData() -- 根据类型+uuid从db中取data
  73. billboardSet() -- 设置排名数据
  74. rewardSend() -- 奖励发送
  75. wrapRankRewardList -- 包装档位奖励详情数据
  76. public:
  77. getMaxSendRank() -- 得到最大发送排行名次数据
  78. getMinRankValue() -- 得到排行榜中最低上榜条件数
  79. wrapRankList() -- 包装档位名次数据
  80. wrapOwnerData() -- 包装自己名次数据
  81. rewardQuery() -- 发送奖励详情
  82. onValueAdd() -- 排行值增加回调
  83. onRewardSend() -- 奖励发送回调
  84. --]]
  85. FUNC_RANK_DAY_TYPE = 1 -- 同活动每日榜类型
  86. FUNC_RANK_TOTAL_TYPE = 2 -- 同活动累计榜类型
  87. FUNC_RANK_TYPE_INFOS = { -- 不同配置命名映射
  88. [FUNC_RANK_DAY_TYPE] = {
  89. rankValueName = "dayNeedValue",
  90. rewardName = "dayRewards",
  91. mailIDName = "dayMailID",
  92. minRankValueName = "dayMinRankValue",
  93. isDayReward = true,
  94. },
  95. [FUNC_RANK_TOTAL_TYPE] = {
  96. rankValueName = "totalNeedValue",
  97. rewardName = "totalRewards",
  98. mailIDName = "totalMailID",
  99. minRankValueName = "totalMinRankValue",
  100. }
  101. }
  102. MAX_SEND_RANK = 10 -- 最大发送排名数
  103. DEFAULT_MAX_RANK = 200
  104. db = db or {} -- [rankType] = board
  105. QueryForData = {rankType = 1, uuid = 1} -- 通过排名类型和玩家uuid查找DB数据
  106. QueryByUuid = {_id = 1} -- 通过DB的uuid更新DB数据
  107. QueryByRankType = {rankType = 1} -- 通过排名类型查找DB数据
  108. local funcConfigs
  109. local function getActConfig(funcID, actId)
  110. local funcConfig = AbsActExcel.absActivity[funcID]
  111. if not funcConfig then return end
  112. local tempConfig = AbsActExcel[funcConfig.param[1]]
  113. if not tempConfig then return end
  114. if not actId then
  115. actId = funcConfig.actId
  116. end
  117. if not actId or actId == 0 then return end
  118. funcConfigs = funcConfigs or {}
  119. funcConfigs[funcID] = funcConfigs[funcID] or {}
  120. if funcConfigs[funcID][actId] then return funcConfigs[funcID][actId] end
  121. funcConfigs[funcID][actId] = {configs={}}
  122. local actConfigs = funcConfigs[funcID][actId]
  123. local dayMinRankValue,totalMinRankValue,maxRank
  124. local len = 0
  125. for id,info in Util.pairsByKeys(tempConfig) do
  126. if actId == info.actId then
  127. len = len + 1
  128. info.id = id
  129. actConfigs.configs[len] = info -- 缓存abs活动指定期配置信息
  130. -- 缓存最低上榜需要达到的排行值
  131. if info.dayNeedValue then -- 活动有单日榜
  132. if not dayMinRankValue or dayMinRankValue > info.dayNeedValue then
  133. dayMinRankValue = info.dayNeedValue
  134. end
  135. elseif info.totalNeedValue then -- 活动有累计榜
  136. if not totalMinRankValue or totalMinRankValue > info.totalNeedValue then
  137. totalMinRankValue = info.totalNeedValue
  138. end
  139. end
  140. if not maxRank or maxRank <= info.ranks[2] then
  141. maxRank = info.ranks[2]
  142. end
  143. end
  144. end
  145. actConfigs.maxRank = maxRank
  146. actConfigs.dayMinRankValue = dayMinRankValue
  147. actConfigs.totalMinRankValue = totalMinRankValue
  148. return funcConfigs[funcID][actId]
  149. end
  150. local function getMaxRank(funcID)
  151. return DEFAULT_MAX_RANK
  152. end
  153. local function getRankType(funcID, funcRankType)
  154. return funcID .. "-" .. funcRankType
  155. end
  156. local function resertBoard(board)
  157. board.uuid2rank = {} -- 根据UUID获取名次
  158. board.sendUuid2rank = {} -- 根据UUID获取发送名次
  159. board.rank2data = {} -- 根据名次获取DATA
  160. board.sendRank2data = {} -- 根据名次获取发送DATA
  161. end
  162. local function initBoard(funcID, funcRankType)
  163. local rankType = getRankType(funcID, funcRankType)
  164. if db[rankType] then return end
  165. local board = {}
  166. resertBoard(board)
  167. board.rankType = rankType
  168. board.funcID = funcID
  169. board.funcRankType = funcRankType
  170. db[rankType] = board
  171. end
  172. local function getBoard(funcID, funcRankType)
  173. local rankType = getRankType(funcID, funcRankType)
  174. local board = db[rankType]
  175. if not board then
  176. initBoard(funcID, funcRankType)
  177. end
  178. return db[rankType]
  179. end
  180. local function getRankInfo(funcID, rank, actId)
  181. local actConfig = getActConfig(funcID, actId)
  182. if not actConfig then return end
  183. local rankInfo
  184. for _,info in ipairs(actConfig.configs) do
  185. if rank >= info.ranks[1] and rank <= info.ranks[2] then
  186. rankInfo = info
  187. break
  188. end
  189. end
  190. return rankInfo
  191. end
  192. local function getRewardInfo(funcID, rank, funcRankType)
  193. local rankInfo = getRankInfo(funcID, rank)
  194. if not rankInfo then return end
  195. local info = FUNC_RANK_TYPE_INFOS[funcRankType]
  196. return info and rankInfo[info.rewardName]
  197. end
  198. local function getRankNeedValue(funcID, funcRankType, rank)
  199. local rankInfo = getRankInfo(funcID, rank)
  200. if not rankInfo then return end
  201. local info = FUNC_RANK_TYPE_INFOS[funcRankType]
  202. return info and rankInfo[info.rankValueName]
  203. end
  204. local function getMailID(funcRankType, rankInfo)
  205. local info = FUNC_RANK_TYPE_INFOS[funcRankType]
  206. return info and rankInfo[info.mailIDName]
  207. end
  208. local function getRewardInfoByInfo(funcRankType, rankInfo)
  209. local info = FUNC_RANK_TYPE_INFOS[funcRankType]
  210. return info and rankInfo[info.rewardName]
  211. end
  212. local function getRank(funcID, funcRankType, uuid)
  213. local board = getBoard(funcID, funcRankType)
  214. return board.uuid2rank[uuid]
  215. end
  216. local function getSendRank(funcID, funcRankType, uuid)
  217. local board = getBoard(funcID, funcRankType)
  218. if not board then return end
  219. return board.sendUuid2rank[uuid]
  220. end
  221. local function cmpRank(data1, data2)
  222. if data1.value ~= data2.value then
  223. return data1.value > data2.value
  224. end
  225. return data1.time < data2.time
  226. end
  227. local function updateRank(board)
  228. if not board then return end
  229. -- 清空普通排名和发送排名玩家数据
  230. for uuid in pairs(board.uuid2rank) do
  231. board.uuid2rank[uuid] = nil
  232. board.sendUuid2rank[uuid] = nil
  233. end
  234. -- 设置普通排名
  235. for rank, data in ipairs(board.rank2data) do
  236. board.uuid2rank[data.uuid] = rank
  237. end
  238. -- 清空发送排名
  239. for rank in ipairs(board.sendRank2data) do
  240. board.sendRank2data[rank] = nil
  241. end
  242. if not getActConfig(board.funcID) then return end
  243. local minRankValue = getMinRankValue(board.funcID, board.funcRankType)-- 排名最小需要的排名值
  244. local aleadyRankCnt = 0 -- 已经排好的玩家数
  245. local maxRank = getMaxRank(board.funcID) -- 最多排名玩家数量
  246. for rank = 1, maxRank do
  247. local rankNeedValue = getRankNeedValue(board.funcID, board.funcRankType, rank) -- 取当前排名需要的排名值
  248. local rank2data = board.rank2data[aleadyRankCnt + 1] -- 当前排的玩家
  249. if rank2data then -- 还有玩家需要排
  250. if rank2data.value >= rankNeedValue then -- 达到排名值,可以排名
  251. board.sendUuid2rank[rank2data.uuid] = rank -- 设置玩家发送排名
  252. board.sendRank2data[rank] = rank2data -- 设置发送排名数据
  253. aleadyRankCnt = aleadyRankCnt + 1 -- 排名玩家数量+1
  254. elseif rankNeedValue <= minRankValue then -- 未达到排名值 且 当前排名值 小于等于 最小需要的排名值了,则后面的玩家都不需要排了
  255. break
  256. else -- 未到达最低排名值,当前名次未有玩家达到
  257. board.sendRank2data[rank] = -1
  258. end
  259. else -- 没玩家排了直接停止
  260. break
  261. end
  262. end
  263. end
  264. local function updateData(data)
  265. local board = getBoard(data.funcID, data.funcRankType)
  266. if not board then return end
  267. local uuid = data.uuid
  268. local oldRank = getRank(data.funcID, data.funcRankType, uuid) or (#board.rank2data + 1)
  269. board.rank2data[oldRank] = data
  270. -- 向后比较(data.value 减少时),往排名低方向->
  271. for i = oldRank + 1, #board.rank2data do
  272. local data1 = board.rank2data[i - 1]
  273. local data2 = board.rank2data[i]
  274. if cmpRank(data1, data2) then
  275. break
  276. end
  277. board.rank2data[i - 1] = data2
  278. board.rank2data[i] = data1
  279. end
  280. -- 向前比较(data.value 增加时),往排名高方向<-
  281. for i = oldRank - 1, 1, -1 do
  282. local data1 = board.rank2data[i]
  283. local data2 = board.rank2data[i + 1]
  284. if cmpRank(data1, data2) then
  285. break
  286. end
  287. board.rank2data[i] = data2
  288. board.rank2data[i + 1] = data1
  289. end
  290. local maxRank = getMaxRank(board.funcID)
  291. board.rank2data[maxRank + 1] = nil
  292. return true
  293. end
  294. function loadBoardData(absAct, funcID, uuid, now)
  295. local boardData = absAct.boardData
  296. if boardData == nil then
  297. --QueryForData.funcID = funcID
  298. --QueryForData.uuid = uuid
  299. else
  300. if absAct.endTime > now then
  301. for funcRankType, data in pairs(boardData) do
  302. local info = FUNC_RANK_TYPE_INFOS[funcRankType]
  303. if info.isDayReward then
  304. if data.time and Util.isSameDay(data.time) then
  305. initBoard(data.funcID, data.funcRankType)
  306. updateData(data)
  307. end
  308. else
  309. initBoard(data.funcID, data.funcRankType)
  310. updateData(data)
  311. end
  312. end
  313. end
  314. end
  315. end
  316. function loadBoardRank()
  317. for _, board in pairs(db) do
  318. updateRank(board)
  319. end
  320. end
  321. local function loadBoard()
  322. for _, board in pairs(db) do
  323. updateRank(board)
  324. end
  325. end
  326. local function getDBData(funcID, funcRankType, uuid)
  327. local boardDB = getBoard(funcID, funcRankType)
  328. local rank = boardDB.uuid2rank[uuid]
  329. local uidDB = boardDB.rank2data[rank]
  330. return uidDB
  331. end
  332. local function billboardSet(data)
  333. local board = getBoard(data.funcID, data.funcRankType)
  334. if not board then return end
  335. updateData(data)
  336. updateRank(board)
  337. end
  338. MAIL_SEND_CACHE = MAIL_SEND_CACHE or nil
  339. local function rewardSend(funcID, funcRankType, actId)
  340. local board = getBoard(funcID, funcRankType)
  341. if not board then return end
  342. local rankType = getRankType(funcID, funcRankType)
  343. MAIL_SEND_CACHE = MAIL_SEND_CACHE or {}
  344. MAIL_SEND_CACHE[rankType] = {}
  345. local mailID
  346. for rank, rankData in ipairs(board.sendRank2data) do
  347. if rankData and rankData ~= -1 then
  348. local rankInfo = getRankInfo(funcID, rank, actId)
  349. if rankInfo then
  350. MAIL_SEND_CACHE[rankType][rank] = rankData.uuid
  351. if not mailID then
  352. mailID = getMailID(funcRankType, rankInfo)
  353. end
  354. end
  355. end
  356. end
  357. resertBoard(board)
  358. Timer.addLater(10, boardReward, mailID, funcID, funcRankType, actId)
  359. -- 日志
  360. Log.write(Log.LOGID_DEBUG, "AbsReachRank", rankType)
  361. end
  362. local function wrapRankRewardList(funcID, funcRankType, net, info)
  363. net.minRank = info.ranks[1]
  364. net.maxRank = info.ranks[2]
  365. local typeInfo = FUNC_RANK_TYPE_INFOS[funcRankType]
  366. local rankInfo = getRankInfo(funcID, info.ranks[1])
  367. local rewardInfo = rankInfo[typeInfo.rewardName]
  368. local rankNeedValue = rankInfo[typeInfo.rankValueName]
  369. net.rankNeedValue = rankNeedValue
  370. local len = 0
  371. for index,itemInfo in ipairs(rewardInfo) do
  372. len = len + 1
  373. Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
  374. end
  375. net.items[0] = len
  376. end
  377. _init = false
  378. function init()
  379. if _G.is_middle == true then return end
  380. if not _init then
  381. _init = true
  382. --db = {}
  383. loadBoard()
  384. end
  385. end
  386. function getMaxSendRank(funcID, funcRankType)
  387. return MAX_SEND_RANK
  388. end
  389. function getMinRankValue(funcID, funcRankType)
  390. local actConfig = getActConfig(funcID)
  391. if not actConfig then return end
  392. local info = FUNC_RANK_TYPE_INFOS[funcRankType]
  393. return info and actConfig[info.minRankValueName]
  394. end
  395. function wrapRankList(funcID, funcRankType, net, rank)
  396. local board = getBoard(funcID, funcRankType)
  397. local sendRankData = board.sendRank2data[rank]
  398. net.rank = rank
  399. net.rankNeedValue = getRankNeedValue(funcID, funcRankType, rank)
  400. if sendRankData and sendRankData ~= -1 then
  401. local userDB = RoleDBLogic.getDb(sendRankData.uuid)
  402. net.uid = sendRankData.uuid
  403. net.name = userDB.name
  404. net.head = userDB.head
  405. net.rankValue = sendRankData.value
  406. net.headFrame = userDB.headFrame
  407. net.lv = userDB.lv
  408. else
  409. net.uid = "-1"
  410. net.name = ""
  411. net.head = -1
  412. net.rankValue = 0
  413. net.headFrame = -1
  414. net.lv = -1
  415. end
  416. local rewardInfo = getRewardInfo(funcID, rank, funcRankType)
  417. local len = 0
  418. if rewardInfo then
  419. for index,itemInfo in ipairs(rewardInfo) do
  420. len = len + 1
  421. Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
  422. end
  423. end
  424. net.items[0] = len
  425. end
  426. function wrapOwnerData(funcID, funcRankType, net, uuid)
  427. local actConfig = getActConfig(funcID)
  428. if not actConfig then return end
  429. local maxRank = actConfig.maxRank
  430. local sendRank = getSendRank(funcID, funcRankType, uuid)
  431. local board = getBoard(funcID, funcRankType)
  432. local rankData
  433. if sendRank then
  434. rankData = board.sendRank2data[sendRank]
  435. else
  436. local rank = getRank(funcID, funcRankType, uuid)
  437. rankData = rank and board.rank2data[rank]
  438. end
  439. net.rank = sendRank or -1
  440. net.rankValue = rankData and rankData.value or 0
  441. local len = 0
  442. if sendRank then
  443. local rewardInfo = getRewardInfo(funcID, sendRank, funcRankType)
  444. for index,itemInfo in ipairs(rewardInfo) do
  445. len = len + 1
  446. Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
  447. end
  448. end
  449. net.items[0] = len
  450. end
  451. function rewardQuery(human, funcID, funcRankType, msgRet)
  452. local actConfig = getActConfig(funcID)
  453. if not actConfig then return end
  454. msgRet.actId = funcID
  455. msgRet.funcRankType = funcRankType
  456. local len = 0
  457. for _,info in ipairs(actConfig.configs) do
  458. len = len + 1
  459. wrapRankRewardList(funcID, funcRankType, msgRet.list[len], info)
  460. end
  461. msgRet.list[0] = len
  462. Msg.send(msgRet, human.fd)
  463. end
  464. function onValueAdd(human, funcID, value)
  465. local actConfig = getActConfig(funcID)
  466. if not actConfig then return end
  467. AbsActLogic.checkAbsActClean(human, funcID)
  468. for funcRankType,info in ipairs(FUNC_RANK_TYPE_INFOS) do
  469. if getMinRankValue(funcID, funcRankType) then
  470. local rankType = getRankType(funcID, funcRankType)
  471. human.db.absAct[funcID].boardData = human.db.absAct[funcID].boardData or {}
  472. human.db.absAct[funcID].boardData[funcRankType] = human.db.absAct[funcID].boardData[funcRankType] or {
  473. rankType = rankType,
  474. uuid = human.db._id,
  475. funcID = funcID,
  476. funcRankType = funcRankType,
  477. }
  478. local dbData = human.db.absAct[funcID].boardData[funcRankType]
  479. dbData.value = (dbData.value or 0) + value
  480. dbData.time = os.time()
  481. billboardSet(dbData)
  482. end
  483. end
  484. end
  485. function onRewardSend(funcID)
  486. local funcConfig = AbsActExcel.absActivity[funcID]
  487. if not funcConfig then return end
  488. local actConfig = getActConfig(funcID)
  489. if not actConfig then return end
  490. local state = AbsActLogic.isStarted(human, funcID)
  491. local diffDay
  492. if not state then -- 活动结束
  493. diffDay = Util.diffDay(funcConfig.realEndTime)
  494. if diffDay ~= 1 then
  495. return
  496. end
  497. end
  498. for funcRankType,info in ipairs(FUNC_RANK_TYPE_INFOS) do
  499. if getMinRankValue(funcID, funcRankType) then -- 判断此活动是否有指定功能类型
  500. if info.isDayReward then -- 每天一结算
  501. rewardSend(funcID, funcRankType, funcConfig.actId)
  502. elseif diffDay == 1 then -- 活动结束时跨天结算
  503. rewardSend(funcID, funcRankType, funcConfig.actId)
  504. end
  505. end
  506. end
  507. end
  508. -- 定时器 邮件分开发,预防崩溃
  509. function boardReward(mailID, funcID, funcRankType, actId)
  510. local rankType = getRankType(funcID, funcRankType)
  511. if mailID and MAIL_SEND_CACHE and MAIL_SEND_CACHE[rankType] then
  512. local mailConfig = MailExcel.mail[mailID]
  513. local title = mailConfig.title
  514. local senderName = mailConfig.senderName
  515. local content = mailConfig.content
  516. local mailSends = MAIL_SEND_CACHE[rankType]
  517. for rank,uuid in pairs(mailSends) do
  518. local rankInfo = getRankInfo(funcID, rank, actId)
  519. if rankInfo then
  520. local rewardInfo = getRewardInfoByInfo(funcRankType, rankInfo)
  521. if rewardInfo then
  522. MailManager.add(MailManager.SYSTEM, uuid,
  523. title, Util.format(content, rank), rewardInfo, senderName)
  524. end
  525. end
  526. end
  527. MAIL_SEND_CACHE[rankType] = nil
  528. end
  529. end
  530. function updateDaily(human, funcID)
  531. local funcConfig = AbsActExcel.absActivity[funcID]
  532. if not funcConfig then return end
  533. if not human.db.absAct[funcID] or not human.db.absAct[funcID].boardData then return end
  534. for funcRankType,info in ipairs(FUNC_RANK_TYPE_INFOS) do
  535. if info.isDayReward and human.db.absAct[funcID].boardData[funcRankType] then -- 每天一结算
  536. human.db.absAct[funcID].boardData[funcRankType] = nil
  537. end
  538. end
  539. end
  540. --[[
  541. function gmSendReward()
  542. print("send reward start")
  543. local funcID = 40006
  544. local actID = 101
  545. local now = os.time()
  546. local cnt = 0
  547. LuaMongo.find(DB.db_char, nil, require("billboard.BillboardDB").fields)
  548. while true do
  549. local humanDb = {}
  550. if not LuaMongo.next(humanDb) then
  551. break
  552. end
  553. cnt = cnt + 1
  554. if cnt % 1000 == 0 then
  555. _G.collectgarbage("step", 100000)
  556. end
  557. local absAct = humanDb.absAct[funcID]
  558. if absAct and absAct.boardData then
  559. for funcRankType, data in pairs(absAct.boardData) do
  560. local info = FUNC_RANK_TYPE_INFOS[funcRankType]
  561. if info.isDayReward then
  562. if data.time and Util.isSameDay(data.time) then
  563. initBoard(data.funcID, data.funcRankType)
  564. updateData(data)
  565. end
  566. else
  567. initBoard(data.funcID, data.funcRankType)
  568. updateData(data)
  569. end
  570. end
  571. end
  572. end
  573. for _, board in pairs(db) do
  574. if board then
  575. -- 清空普通排名和发送排名玩家数据
  576. for uuid in pairs(board.uuid2rank) do
  577. board.uuid2rank[uuid] = nil
  578. board.sendUuid2rank[uuid] = nil
  579. end
  580. -- 设置普通排名
  581. for rank, data in ipairs(board.rank2data) do
  582. board.uuid2rank[data.uuid] = rank
  583. end
  584. -- 清空发送排名
  585. for rank in ipairs(board.sendRank2data) do
  586. board.sendRank2data[rank] = nil
  587. end
  588. if getActConfig(board.funcID, actID) then
  589. local minRankValue = 1 -- 排名最小需要的排名值
  590. local aleadyRankCnt = 0 -- 已经排好的玩家数
  591. local maxRank = getMaxRank(board.funcID) -- 最多排名玩家数量
  592. for rank = 1, maxRank do
  593. local rankNeedValue
  594. if rank >= 1 and rank <= 3 then
  595. rankNeedValue = 500
  596. elseif rank >= 4 and rank <= 20 then
  597. rankNeedValue = 100
  598. else
  599. rankNeedValue = 1
  600. end
  601. local rank2data = board.rank2data[aleadyRankCnt + 1] -- 当前排的玩家
  602. if rank2data then -- 还有玩家需要排
  603. if rank2data.value >= rankNeedValue then -- 达到排名值,可以排名
  604. board.sendUuid2rank[rank2data.uuid] = rank -- 设置玩家发送排名
  605. board.sendRank2data[rank] = rank2data -- 设置发送排名数据
  606. aleadyRankCnt = aleadyRankCnt + 1 -- 排名玩家数量+1
  607. elseif rankNeedValue <= minRankValue then -- 未达到排名值 且 当前排名值 小于等于 最小需要的排名值了,则后面的玩家都不需要排了
  608. break
  609. else -- 未到达最低排名值,当前名次未有玩家达到
  610. board.sendRank2data[rank] = -1
  611. end
  612. else -- 没玩家排了直接停止
  613. break
  614. end
  615. end
  616. end
  617. end
  618. end
  619. rewardSend(funcID, FUNC_RANK_TOTAL_TYPE, actID)
  620. print("send reward end")
  621. end
  622. --]]