BRoleLogic.lua 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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.fields)
  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. return (fininID > 0) and fininID
  57. elseif boardType == BillboardDefine.TYPE_TOWER then
  58. if db.tower and (db.tower.lv or 0) > 0 then
  59. return db.tower.lv, db.tower.usetime
  60. end
  61. elseif boardType == BillboardDefine.TYPE_ZHANDOULI then
  62. local fakeHuman = {db = db}
  63. return CombatPosLogic.getCombatHeroZDL(fakeHuman, CombatDefine.COMBAT_TYPE1)
  64. elseif boardType == BillboardDefine.TYPE_LV then
  65. return db.lv
  66. elseif boardType == BillboardDefine.TYPE_UNION then
  67. return db.zhandouli, db.lv
  68. elseif boardType == BillboardDefine.TYPE_LIANYU then
  69. if db.lianyu and db.lianyu.maxLv then
  70. return db.lianyu.maxLv
  71. end
  72. elseif boardType == BillboardDefine.TYPE_DRAGON then
  73. if db.dragonCopy and db.dragonCopy.time and db.dragonCopy.dayHurt then
  74. if Util.isSameDay(db.dragonCopy.time) and db.dragonCopy.dayHurt > 0 then
  75. return db.dragonCopy.dayHurt
  76. end
  77. end
  78. end
  79. end
  80. -- 比较
  81. function cmpValues(boardType, data1, data2)
  82. if data1.value1 ~= data2.value1 then
  83. return data1.value1 > data2.value1
  84. end
  85. if data1.value2 ~= data2.value2 then
  86. if boardType == BillboardDefine.TYPE_TOWER then
  87. return data1.value2 < data2.value2
  88. else
  89. return data1.value2 > data2.value2
  90. end
  91. end
  92. if (data1.time or 0) ~=(data2.time or 0) then
  93. return(data1.time or 0) <(data2.time or 0)
  94. end
  95. return true
  96. end
  97. -- 设置值
  98. local function setValues(boardType, data, db, value1, value2)
  99. data.uuid = db._id
  100. data.value1 = value1
  101. data.value2 = value2 or 0
  102. data.time = BillboardDB.getTime(boardType, db)
  103. end
  104. --
  105. local TempData = nil
  106. function getCacheData(boardType, db, value1, value2)
  107. TempData = TempData or BillboardDB.initRankData()
  108. setValues(boardType, TempData, db, value1, value2)
  109. return TempData
  110. end
  111. function updateData(boardType, db, isInit)
  112. local board = BillboardDB.getBoard(boardType, isInit)
  113. if not board then return end
  114. local value1, value2 = getValues(boardType, db)
  115. if not value1 then return end
  116. local dbrank = board.uuid2rank[db._id]
  117. local dbdata = dbrank and board.rank2data[dbrank]
  118. if dbdata then
  119. if dbdata.value1 == value1 and dbdata.value2 == (value2 or 0) then
  120. return -- 优化,原来值跟新值一样
  121. end
  122. table.remove(board.rank2data, dbrank)
  123. end
  124. if not isInit then -- 刷新上榜时间
  125. BillboardDB.refreshTime(boardType, db)
  126. BillboardAim.onCallback(boardType, db, value1)
  127. end
  128. local maxRank = #board.rank2data
  129. local rank = maxRank + 1
  130. local tempData = getCacheData(boardType, db, value1, value2)
  131. for i = maxRank, 1, -1 do
  132. local tdata = board.rank2data[i]
  133. if cmpValues(boardType, tdata, tempData) then
  134. break
  135. end
  136. board.rank2data[i + 1] = tdata
  137. rank = i
  138. end
  139. if rank > BillboardDefine.MAX_CNT then return end
  140. local data = nil
  141. if maxRank < BillboardDefine.MAX_CNT then
  142. data = BillboardDB.initRankData()
  143. else
  144. data = board.rank2data[BillboardDefine.MAX_CNT + 1]
  145. end
  146. setValues(boardType, data, db, value1, value2)
  147. board.rank2data[rank] = data
  148. board.rank2data[BillboardDefine.MAX_CNT + 1] = nil
  149. if rank ~= dbrank then
  150. board.dirty = true
  151. end
  152. return true
  153. end