BRoleLogic.lua 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. ------------------------------------------------------------------
  2. -- 角色相关排行榜
  3. -- 排序规则
  4. -- 征战:征战进度
  5. -- 通天塔:层数 通关时间
  6. -- 战力:战力
  7. -- 等级:等级
  8. ------------------------------------------------------------------
  9. local LuaMongo = _G.lua_mongo
  10. local DB = require("common.DB")
  11. local BillboardDefine = require("billboard.BillboardDefine")
  12. local BillboardDB = require("billboard.BillboardDB")
  13. local BillboardAim = require("billboard.BillboardAim")
  14. local GlobalWorld = require("core.GlobalWorld")
  15. local CombatPosLogic = require("combat.CombatPosLogic")
  16. local CombatDefine = require("combat.CombatDefine")
  17. local Util = require("common.Util")
  18. local AbsActLogic = require("absAct.AbsActLogic")
  19. -- 加载角色排行
  20. function loadBoard()
  21. -- 角色
  22. local cnt = 0
  23. LuaMongo.find(DB.db_char, nil, BillboardDB.newFiles)
  24. while true do
  25. local data = {}
  26. if not LuaMongo.next(data) then
  27. break
  28. end
  29. cnt = cnt + 1
  30. if cnt % 1000 == 0 then
  31. _G.collectgarbage("step", 100000)
  32. end
  33. -- 征战
  34. updateData(BillboardDefine.TYPE_BATTLE, data, true)
  35. -- 通天塔
  36. updateData(BillboardDefine.TYPE_TOWER, data, true)
  37. -- 战力
  38. updateData(BillboardDefine.TYPE_ZHANDOULI, data, true)
  39. -- 等级
  40. updateData(BillboardDefine.TYPE_LV, data, true)
  41. -- 无尽之路
  42. updateData(BillboardDefine.TYPE_LIANYU, data, true)
  43. -- 冰龙巢穴
  44. updateData(BillboardDefine.TYPE_DRAGON, data, true)
  45. -- ABS活动
  46. AbsActLogic.updateBillBoard(data)
  47. end
  48. AbsActLogic.updateBillBoardRank()
  49. --计算世界等级
  50. GlobalWorld.doCalcWorldLv()
  51. end
  52. -- 排名值
  53. function getValues(boardType, db)
  54. if boardType == BillboardDefine.TYPE_BATTLE then
  55. local fininID = db.guajiID
  56. local passTimes = db.maxBattleTime or 0
  57. return (fininID > 0) and fininID, passTimes
  58. elseif boardType == BillboardDefine.TYPE_TOWER then
  59. if db.tower and (db.tower.lv or 0) > 0 then
  60. return db.tower.lv, db.tower.usetime
  61. end
  62. elseif boardType == BillboardDefine.TYPE_ZHANDOULI then
  63. local fakeHuman = {db = db}
  64. return CombatPosLogic.getCombatHeroZDL(fakeHuman, CombatDefine.COMBAT_TYPE1)
  65. elseif boardType == BillboardDefine.TYPE_LV then
  66. return db.lv
  67. elseif boardType == BillboardDefine.TYPE_UNION then
  68. return db.zhandouli, db.lv
  69. elseif boardType == BillboardDefine.TYPE_LIANYU then
  70. if db.lianyu and db.lianyu.maxLv then
  71. return db.lianyu.maxLv
  72. end
  73. elseif boardType == BillboardDefine.TYPE_DRAGON then
  74. if db.dragonCopy and db.dragonCopy.time and db.dragonCopy.dayHurt then
  75. if Util.isSameDay(db.dragonCopy.time) and db.dragonCopy.dayHurt > 0 then
  76. return db.dragonCopy.dayHurt
  77. end
  78. end
  79. end
  80. end
  81. -- 比较
  82. function cmpValues(boardType, data1, data2)
  83. if data1.value1 ~= data2.value1 then
  84. return data1.value1 > data2.value1
  85. end
  86. if data1.value2 ~= data2.value2 then
  87. if boardType == BillboardDefine.TYPE_TOWER or boardType == BillboardDefine.TYPE_BATTLE then
  88. return data1.value2 < data2.value2
  89. else
  90. return data1.value2 > data2.value2
  91. end
  92. end
  93. if (data1.time or 0) ~=(data2.time or 0) then
  94. return(data1.time or 0) <(data2.time or 0)
  95. end
  96. return true
  97. end
  98. -- 设置值
  99. local function setValues(boardType, data, db, value1, value2)
  100. data.uuid = db._id
  101. data.value1 = value1
  102. data.value2 = value2 or 0
  103. data.time = BillboardDB.getTime(boardType, db)
  104. end
  105. --
  106. local TempData = nil
  107. function getCacheData(boardType, db, value1, value2)
  108. TempData = TempData or BillboardDB.initRankData()
  109. setValues(boardType, TempData, db, value1, value2)
  110. return TempData
  111. end
  112. function updateData(boardType, db, isInit)
  113. local board = BillboardDB.getBoard(boardType, isInit)
  114. if not board then return end
  115. local value1, value2 = getValues(boardType, db)
  116. if not value1 then return end
  117. local dbrank = board.uuid2rank[db._id]
  118. local dbdata = dbrank and board.rank2data[dbrank]
  119. if dbdata then
  120. if dbdata.value1 == value1 and dbdata.value2 == (value2 or 0) then
  121. return -- 优化,原来值跟新值一样
  122. end
  123. table.remove(board.rank2data, dbrank)
  124. end
  125. if not isInit then -- 刷新上榜时间
  126. BillboardDB.refreshTime(boardType, db)
  127. BillboardAim.onCallback(boardType, db, value1)
  128. end
  129. local maxRank = #board.rank2data
  130. local rank = maxRank + 1
  131. local tempData = getCacheData(boardType, db, value1, value2)
  132. for i = maxRank, 1, -1 do
  133. local tdata = board.rank2data[i]
  134. if cmpValues(boardType, tdata, tempData) then
  135. break
  136. end
  137. board.rank2data[i + 1] = tdata
  138. rank = i
  139. end
  140. if rank > BillboardDefine.MAX_CNT then return end
  141. local data = nil
  142. if maxRank < BillboardDefine.MAX_CNT then
  143. data = BillboardDB.initRankData()
  144. else
  145. data = board.rank2data[BillboardDefine.MAX_CNT + 1]
  146. end
  147. setValues(boardType, data, db, value1, value2)
  148. board.rank2data[rank] = data
  149. board.rank2data[BillboardDefine.MAX_CNT + 1] = nil
  150. if rank ~= dbrank then
  151. board.dirty = true
  152. end
  153. return true
  154. end