MiddleCommonRank.lua 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. --------------------------------
  2. -- 文件名 : MiddleCommonRank.lua
  3. -- 文件说明 : 跨服相关-跨服排行榜
  4. -- 创建时间 : 2025/04/02
  5. -- 创建人 : FC
  6. --------------------------------
  7. local Msg = require("core.Msg")
  8. local Timer = require("core.Timer")
  9. local DB = require("common.DB")
  10. local CommonDB = require("common.CommonDB")
  11. local CommonDefine = require("common.CommonDefine")
  12. local Log = require("common.Log")
  13. local LuaMongo = _G.lua_mongo
  14. local Util = require("common.Util")
  15. local Grid = require("bag.Grid")
  16. local MiddleConnect = require("middle.MiddleConnect")
  17. local InnerMsg = require("core.InnerMsg")
  18. local MiddleManager = require("middle.MiddleManager")
  19. local ServerCommerceRankConf = require("excel.ServerCommerce").CommerceRank
  20. -- 缓存的排行榜数据
  21. local MIDDLE_COMMON_RANK = {
  22. --[[
  23. [nRankType] =
  24. {
  25. [nRankSubType] =
  26. {
  27. [nServerKey] = {
  28. nRankType = xx,
  29. nRankSubType = xx,
  30. nServerKey = xx,
  31. -- 根据UUID获取名次
  32. uuid2rank = {
  33. [uuid] = rank, -- 玩家uuid = 排行名次
  34. },
  35. -- 根据UUID获取发送名次
  36. sendUuid2rank = {
  37. [uuid] = rank, -- 玩家uuid = 真实发送的排行名次
  38. },
  39. -- 根据名次获取DATA (DB存储的数据相同)
  40. rank2data = {
  41. [nRank] = {
  42. uuid, -- 玩家UID
  43. name, -- 玩家name
  44. head, -- 玩家头像
  45. headFrame, -- 玩家头像框
  46. nSrcServerID, -- 玩家所属服务器
  47. nValue, -- 玩家排行值
  48. nTime, -- 更新时间
  49. }
  50. }
  51. }
  52. }
  53. }
  54. ]]
  55. }
  56. -- 缓存战区已经处理完的全服邮件服务器
  57. local MIDDLE_SENDSERVER_MAIL =
  58. {
  59. }
  60. -- 上榜的最小条件
  61. local MIDDLE_COMMON_MIN_RANK = nil
  62. -- 对应排名需要上榜条件
  63. local MIDDLE_RANK_NEED_VALUES = nil
  64. -- 通过 排行榜类型,排行榜子类型,所属战区服务器key(WarZone中的nMinServerID),uuid查找DB数据
  65. MiddleRankQueryForData = {nRankType = 1, nRankSubType = 1, nServerKey = 1 ,uuid = 1}
  66. -- 通过排行榜类型,排行榜子类型,所属战区服务器key(WarZone中的nMinServerID),DB的uuid更新DB数据
  67. MiddleRankQueryByUuid = {nRankType = 1, nRankSubType = 1, nServerKey = 1, _id = 1}
  68. -- 通过排行榜类型,排行榜子类型,所属战区服务器key(WarZone中的nMinServerID)
  69. MiddleRankQueryByRankType = {nRankType = 1, nRankSubType = 1, nServerKey = 1}
  70. -- 获取配置
  71. local function MiddleCommonRank_GetConfByType(nRankType)
  72. if CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE == nRankType then
  73. return ServerCommerceRankConf
  74. end
  75. return nil
  76. end
  77. local function MiddleCommonRank_GetMinValue(nRankType, nRankSubType)
  78. local tRankConf = MiddleCommonRank_GetConfByType(nRankType)
  79. if not tRankConf then
  80. return nil
  81. end
  82. local nMinRankValue
  83. if CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE == nRankType then
  84. for _, v in pairs(tRankConf) do
  85. if v.nRankType == nRankSubType then
  86. if not nMinRankValue or v.nPoint < nMinRankValue then
  87. nMinRankValue = v.nPoint
  88. end
  89. end
  90. end
  91. end
  92. return nMinRankValue
  93. end
  94. -- 获取最小上榜条件
  95. local function MiddleCommonRank_GetMinRankValue(nRankType, nRankSubType)
  96. if MIDDLE_COMMON_MIN_RANK and MIDDLE_COMMON_MIN_RANK[nRankType] then
  97. return MIDDLE_COMMON_MIN_RANK[nRankType][nRankSubType]
  98. end
  99. local nMinValue = MiddleCommonRank_GetMinValue(nRankType, nRankSubType)
  100. if nil == nMinValue then
  101. return nil
  102. end
  103. if not MIDDLE_COMMON_MIN_RANK then
  104. MIDDLE_COMMON_MIN_RANK = {}
  105. end
  106. if not MIDDLE_COMMON_MIN_RANK[nRankType] then
  107. MIDDLE_COMMON_MIN_RANK[nRankType] = {}
  108. end
  109. MIDDLE_COMMON_MIN_RANK[nRankType][nRankSubType] = nMinValue
  110. return nMinValue
  111. end
  112. -- 获取最大排行榜长度
  113. local function MiddleCommonRank_GetMaxRankLen()
  114. return CommonDefine.COMMONRANK_SAVE_DB_LEN
  115. end
  116. -- 获取对应名次上榜所需要求值
  117. local function MiddleCommonRank_GetRankNeedValue(nRankType, nRankSubType, nRank)
  118. MIDDLE_RANK_NEED_VALUES = MIDDLE_RANK_NEED_VALUES or {}
  119. local minRankValue = MiddleCommonRank_GetMinRankValue(nRankType, nRankSubType)
  120. if nil == minRankValue then
  121. print("[MiddleCommonRank_GetRankNeedValue] 获取最小上排行榜值失败")
  122. return
  123. end
  124. if MIDDLE_RANK_NEED_VALUES[nRankType] and MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] then
  125. local nValue = nil
  126. for _, tData in ipairs(MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType]) do
  127. if tData.nMinRank <= rank and tData.nMaxRank >= rank then
  128. nValue = tData.nValue
  129. break
  130. end
  131. end
  132. return nValue or minRankValue
  133. end
  134. local tRankConfig = MiddleCommonRank_GetConfByType(nRankType)
  135. if not tRankConfig then
  136. return
  137. end
  138. if not MIDDLE_RANK_NEED_VALUES[nRankType] then
  139. MIDDLE_RANK_NEED_VALUES[nRankType] = {}
  140. end
  141. if not MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] then
  142. MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] = {}
  143. end
  144. local nValue = nil
  145. for _, v in pairs(tRankConfig) do
  146. if v.nRankType == nRankSubType then
  147. local nMinRank = v.nOrder[1]
  148. local nMaxRank = v.nOrder[2]
  149. table.insert(MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType], {nMinRank = nMinRank, nMaxRank = nMaxRank, nValue = v.nPoint})
  150. if nMinRank <= rank and nMaxRank >= rank then
  151. nValue = v.nPoint
  152. end
  153. end
  154. end
  155. return nValue or minRankValue
  156. end
  157. -- 获取指定排名类型缓存数据
  158. local function MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  159. if not MIDDLE_COMMON_RANK or not MIDDLE_COMMON_RANK[nRankType] or
  160. not MIDDLE_COMMON_RANK[nRankType][nRankSubType] or not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
  161. return nil
  162. end
  163. return MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey]
  164. end
  165. -- -- 获取指定排名类型、指定用户的排名
  166. local function MiddleCommonRank_GetRankDataByUid(nRankType, nRankSubType, nServerKey, uuid)
  167. local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  168. if not tRankCacheData then
  169. return
  170. end
  171. return tRankCacheData.uuid2rank[uuid]
  172. end
  173. -- 获取指定排名类型、指定用户的发送排名
  174. local function MiddleCommonRank_GetSendRank(nRankType, nRankSubType, nServerKey, uuid)
  175. local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  176. if not tRankCacheData then
  177. return
  178. end
  179. return board.sendUuid2rank[uuid]
  180. end
  181. -- 排序
  182. local function MiddleCommonRank_CmpRank(data1, data2)
  183. if data1.nValue ~= data2.nValue then
  184. return data1.nValue > data2.nValue
  185. end
  186. return data1.nTime < data2.nTime
  187. end
  188. -- 更新排名
  189. local function MiddleCommonRank_UpdateRank(tRankData)
  190. if not tRankData then
  191. return
  192. end
  193. -- 清空普通排名和发送排名玩家数据
  194. for uuid in pairs(tRankData.uuid2rank) do
  195. tRankData.uuid2rank[uuid] = nil
  196. tRankData.sendUuid2rank[uuid] = nil
  197. end
  198. -- 设置普通排名
  199. for rank, data in ipairs(tRankData.rank2data) do
  200. board.uuid2rank[data.uuid] = rank
  201. end
  202. -- 清空发送排名
  203. for rank in ipairs(tRankData.sendRank2data) do
  204. board.sendRank2data[rank] = nil
  205. end
  206. local minRankValue = MiddleCommonRank_GetMinRankValue(tRankData.nRankType, tRankData.nRankSubType) -- 排名最小需要的排名值
  207. local aleadyRankCnt = 0 -- 已经排好的玩家数
  208. local maxRank = MiddleCommonRank_GetMaxRankLen(tRankData.nRankType) -- 最多排名玩家数量
  209. for rank = 1, maxRank do
  210. -- 取当前排名需要的排名值
  211. local rankNeedValue = MiddleCommonRank_GetRankNeedValue(tRankData.nRankType, tRankData.nRankSubType, rank)
  212. local rank2data = tRankData.rank2data[aleadyRankCnt + 1] -- 当前排的玩家
  213. if rank2data then -- 还有玩家需要排
  214. if rank2data.value >= rankNeedValue then -- 达到排名值,可以排名
  215. board.sendUuid2rank[rank2data.uuid] = rank -- 设置玩家发送排名
  216. board.sendRank2data[rank] = rank2data -- 设置发送排名数据
  217. aleadyRankCnt = aleadyRankCnt + 1 -- 排名玩家数量+1
  218. elseif rankNeedValue <= minRankValue then -- 未达到排名值 且 当前排名值 小于等于 最小需要的排名值了,则后面的玩家都不需要排了
  219. break
  220. else -- 未到达最低排名值,当前名次未有玩家达到
  221. board.sendRank2data[rank] = -1
  222. end
  223. else -- 没玩家排了直接停止
  224. break
  225. end
  226. end
  227. end
  228. -- 更新数据
  229. local function MiddleCommonRank_UpdateData(nRankType, nRankSubType, nServerKey, data)
  230. local tRankData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  231. if not tRankData then
  232. return
  233. end
  234. local uuid = data.uuid
  235. local oldRank = MiddleCommonRank_GetRankDataByUid(nRankType, nRankSubType, nServerKey, uuid) or (#tRankData.rank2data + 1)
  236. board.rank2data[oldRank] = data
  237. -- 向后比较(data.value 减少时),往排名低方向->
  238. for i = oldRank + 1, #tRankData.rank2data do
  239. local data1 = tRankData.rank2data[i - 1]
  240. local data2 = tRankData.rank2data[i]
  241. if MiddleCommonRank_CmpRank(data1, data2) then
  242. break
  243. end
  244. board.rank2data[i - 1] = data2
  245. board.rank2data[i] = data1
  246. end
  247. -- 向前比较(data.value 增加时),往排名高方向<-
  248. for i = oldRank - 1, 1, -1 do
  249. local data1 = tRankData.rank2data[i]
  250. local data2 = tRankData.rank2data[i + 1]
  251. if MiddleCommonRank_CmpRank(data1, data2) then
  252. break
  253. end
  254. tRankData.rank2data[i] = data2
  255. tRankData.rank2data[i + 1] = data1
  256. end
  257. local maxRank = MiddleCommonRank_GetMaxRankLen()
  258. tRankData.rank2data[maxRank + 1] = nil
  259. return true
  260. end
  261. -- 起服将数据插入排行榜
  262. local function MiddleCommonRank_InsertCacheData(data)
  263. local tRankData = MiddleCommonRank_GetRankDataByType(data.nRankType, data.nRankSubType, data.nServerKey)
  264. if not tRankData then
  265. print("[MiddleCommonRank_InsertCacheData] 不存在对应的排行榜数据")
  266. return
  267. end
  268. table.insert(tRankData.rank2data, data)
  269. end
  270. -- 对整个排行榜进行排序
  271. local function MiddleCommonRank_SortAllRank(nRankType, nRankSubType, nServerKey)
  272. local tRankData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  273. if not tRankData then
  274. print("[MiddleCommonRank_SortAllRank] 不存在对应的排行榜数据")
  275. return false
  276. end
  277. table.sort(tRankData.rank2data, MiddleCommonRank_CmpRank)
  278. local maxRank = MiddleCommonRank_GetMaxRankLen(nRankType)
  279. local nNowLen = #tRankData.rank2data
  280. -- 大于了排行榜最大缓存数据
  281. if maxRank < nNowLen then
  282. for i = maxRank + 1, nNowLen, 1 do
  283. tRankData.rank2data[i] = nil
  284. end
  285. end
  286. return true
  287. end
  288. -- 重置排行数据
  289. local function MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
  290. if not MIDDLE_COMMON_RANK[nRankType] then
  291. MIDDLE_COMMON_RANK[nRankType] = {}
  292. end
  293. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
  294. MIDDLE_COMMON_RANK[nRankType][nRankSubType] = {}
  295. end
  296. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
  297. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] = {}
  298. end
  299. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nRankType = nRankType
  300. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nRankSubType = nRankSubType
  301. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nServerKey = nServerKey
  302. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].uuid2rank = {} -- 根据UUID获取名次
  303. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].sendUuid2rank = {} -- 根据UUID获取发送名次
  304. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].rank2data = {} -- 根据名次获取DATA
  305. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].sendRank2data = {} -- 根据名次获取发送DATA
  306. end
  307. -- 初始排行榜
  308. local function MiddleCommonRank_InitCacheData(nRankType, nRankSubType)
  309. if not MIDDLE_COMMON_RANK[nRankType] then
  310. MIDDLE_COMMON_RANK[nRankType] = {}
  311. end
  312. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
  313. MIDDLE_COMMON_RANK[nRankType][nRankSubType] = {}
  314. end
  315. end
  316. -- 加载排行榜
  317. local function MiddleCommonRank_LoadDBData()
  318. local cnt = 0
  319. LuaMongo.find(DB.db_middle_rank, nil)
  320. local tNeedSortRank = {}
  321. while true do
  322. local data = {}
  323. if not LuaMongo.next(data) then
  324. break
  325. end
  326. cnt = cnt + 1
  327. if cnt % 1000 == 0 then
  328. _G.collectgarbage("step", 100000)
  329. end
  330. if not tNeedSortRank[data.nRankType] then
  331. tNeedSortRank[data.nRankType] = {}
  332. end
  333. if not tNeedSortRank[data.nRankType][data.nRankSubType] then
  334. tNeedSortRank[data.nRankType][data.nRankSubType] = {}
  335. end
  336. if not tNeedSortRank[data.nRankType][data.nRankSubType][data.nServerKey] then
  337. tNeedSortRank[data.nRankType][data.nRankSubType][data.nServerKey] = 1
  338. MiddleCommonRank_ResertCacheData(data.nRankType, data.nRankSubType, data.nServerKey)
  339. end
  340. -- 先插入数据, 后排序
  341. MiddleCommonRank_InsertCacheData(data)
  342. end
  343. for nRankType, v1 in pairs(tNeedSortRank) do
  344. for nRankSubType, v2 in pairs(v1) do
  345. for nServerKey, _ in pairs(v2) do
  346. local bRet = MiddleCommonRank_SortAllRank(nRankType, nRankSubType, nServerKey)
  347. if true == bRet then
  348. print("[MiddleCommonRank_LoadDBData] 排序成功 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  349. else
  350. print("[MiddleCommonRank_LoadDBData] 排序失败 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  351. end
  352. end
  353. end
  354. end
  355. for nRankType, v1 in pairs(MIDDLE_COMMON_RANK) do
  356. for nRankSubType, v2 in pairs(v1) do
  357. for nServerKey, tData in pairs(v2) do
  358. MiddleCommonRank_UpdateRank(tData)
  359. end
  360. end
  361. end
  362. end
  363. -- 根据类型+uuid从db中取data
  364. local function MiddleCommonRank_GetDBDataByUid(nRankType, nRankSubType, nServerKey, uuid)
  365. -- MiddleRankQueryForData = {nRankType = 1, nRankSubType = 1, nServerKey = 1 ,uuid = 1}
  366. MiddleRankQueryForData.nRankType = nRankType
  367. MiddleRankQueryForData.nRankSubType = nRankSubType
  368. MiddleRankQueryForData.nServerKey = nServerKey
  369. MiddleRankQueryForData.uuid = uuid
  370. local data = {}
  371. LuaMongo.find(DB.db_middle_rank, CoomonQueryForData)
  372. return LuaMongo.next(data) and data
  373. end
  374. -- 更新DB数据
  375. local function MiddleCommonRank_UpdateDBData(data)
  376. local oldData = MiddleCommonRank_GetDBDataByUid(data.nRankType, data.nRankSubType, data.nServerKey, data.uuid)
  377. if oldData then
  378. MiddleRankQueryForData.nRankType = data.nRankType
  379. MiddleRankQueryForData.nRankSubType = data.nRankSubType
  380. MiddleRankQueryForData.nServerKey = data.nServerKey
  381. MiddleRankQueryForData.uuid = data.uuid
  382. LuaMongo.update(DB.db_middle_rank, MiddleRankQueryForData, data)
  383. else
  384. LuaMongo.insert(DB.db_middle_rank, data)
  385. end
  386. end
  387. -- 设置排名数据
  388. local function MiddleCommonRank_SetRankInfo(data)
  389. local tRankData = MiddleCommonRank_GetRankDataByType(data.nRankType, data.nRankSubType, data.nServerKey)
  390. if not tRankData then
  391. print("[MiddleCommonRank_SetRankInfo] 获取不到缓存的排行数据")
  392. return
  393. end
  394. MiddleCommonRank_UpdateData(data.nRankType, data.nRankSubType, data.nServerKey, data)
  395. MiddleCommonRank_UpdateRank(tRankData)
  396. MiddleCommonRank_UpdateDBData(data)
  397. end
  398. -- 检查缓存
  399. local function MiddleCommonRank_CheckHaveCache(nRankType, nRankSubType, nServerKey)
  400. if not MIDDLE_COMMON_RANK[nRankType] then
  401. MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
  402. print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nRankType 缓存,重新创建 nRankType = "
  403. ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  404. return
  405. end
  406. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
  407. MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
  408. print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nRankSubType 缓存,重新创建 nRankType = "
  409. ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  410. return
  411. end
  412. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
  413. MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
  414. print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nServerKey 缓存,重新创建 nRankType = "
  415. ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  416. return
  417. end
  418. end
  419. -------------------------------------------------- 外部调用 -----------------------------------------
  420. -- 启动就初始化
  421. function MiddleCommonRank_InitAfterStart()
  422. -- 不是中心服不用处理
  423. if _G.is_middle ~= true then
  424. return
  425. end
  426. -- 先初始化一下
  427. MiddleCommonRank_InitCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER)
  428. MiddleCommonRank_InitCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN)
  429. -- 加载DB数据
  430. MiddleCommonRank_LoadDBData()
  431. end
  432. -- 获取到跨服数据
  433. function MiddleCommonRank_ReceiveRankData(tMsgData)
  434. if _G.is_middle ~= true then
  435. return
  436. end
  437. local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(tMsgData.nSrcServerID)
  438. local nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
  439. local tDBData = MiddleCommonRank_GetDBDataByUid(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey, tMsgData.uuid)
  440. if not tDBData then
  441. tDBData = {}
  442. end
  443. -- 检查缓存, 主要是 nConfServerID 这个对应的排行数据可能需要建立
  444. MiddleCommonRank_CheckHaveCache(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey)
  445. tDBData.uuid = tMsgData.uuid
  446. tDBData.name = tMsgData.name
  447. tDBData.head = tMsgData.head
  448. tDBData.headFrame = tMsgData.headFrame
  449. tDBData.nSrcServerID = tMsgData.nSrcServerID
  450. tDBData.nRankType = tMsgData.nRankType
  451. tDBData.nRankSubType = tMsgData.nRankSubType
  452. tDBData.nServerKey = nServerKey
  453. -- 已经存在数据的用之前上榜的时间
  454. tDBData.nTime = tDBData.nTime or os.time()
  455. -- 排行的value值需要判断
  456. tDBData.nValue = tDBData.nValue or 0
  457. local nMinValue = MiddleCommonRank_GetMinValue(tMsgData.nRankType, tMsgData.nRankSubType)
  458. if not nMinValue then
  459. print("[MiddleCommonRank_ReceiveRankData] 获取不到对应的最小上榜条件")
  460. return
  461. end
  462. local bUpRank = false
  463. if CommonDefine.COMMONRANK_VALUE_REPLACE == tMsgData.nOperate then
  464. -- 直接替换,对应nValue在普通服有存储,发上来都是最终的值,不满足条件可以不存
  465. tDBData.nValue = tMsgData.nValue
  466. if tDBData.nValue >= nMinValue then
  467. bUpRank = true
  468. end
  469. elseif CommonDefine.COMMONRANK_VALUE_ADD == tMsgData.nOperate then
  470. -- 直接增加的操作需要存库
  471. tDBData.nValue = tDBData.nValue + tMsgData.nValue
  472. bUpRank = true
  473. end
  474. if true == bUpRank then
  475. MiddleCommonRank_SetRankInfo(tDBData)
  476. print("[MiddleCommonRank_ReceiveRankData] 玩家上榜进行成功")
  477. end
  478. end
  479. function MiddleCommonRank_QueryRankInfo(tMsgData)
  480. if _G.is_middle ~= true then
  481. return
  482. end
  483. local nRankType = tMsgData.nRankType
  484. local nRankSubType = tMsgData.nRankSubType
  485. local nServerKey = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(tMsgData.nSrcServerID)
  486. nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nServerKey)
  487. local nSrcFD = MiddleManager.getFDBySvrIndex(tMsgData.nSrcServerID)
  488. if not nSrcFD then
  489. print("[MiddleCommonRank_QueryRankInfo] 获取不到对应的 服务器的 fd nSrcServerID = "..tMsgData.nSrcServerID)
  490. return
  491. end
  492. -- 检查缓存, 主要是 nServerKey 这个对应的排行数据可能需要建立
  493. MiddleCommonRank_CheckHaveCache(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey)
  494. local tSendMsgData = InnerMsg.wl.WL_COMMERCE_QUERY_RANK_INFO
  495. tSendMsgData.nRankType = nRankType
  496. tSendMsgData.nRankSubType = nRankSubType
  497. tSendMsgData.nServerKey = nServerKey
  498. tSendMsgData.nBegin = 1
  499. tSendMsgData.nEnd = 0
  500. tSendMsgData.tRankData = {}
  501. tSendMsgData.tRankData[0] = 0
  502. local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  503. if not tRankCacheData or nil == _G.next(tRankCacheData) then
  504. tSendMsgData.nEnd = 1
  505. else
  506. for nRank, v in ipairs(tRankCacheData.sendRank2data) do
  507. tSendMsgData.tRankData[0] = tSendMsgData.tRankData[0] + 1
  508. tSendMsgData.tRankData[tSendMsgData.tRankData[0]] = {
  509. nRank = nRank,
  510. tRankData = v,
  511. }
  512. if tSendMsgData.tRankData[0] >= CommonDefine.COMMONRANK_ONE_SEND_LEN then
  513. InnerMsg.send(nSrcFD, tSendMsgData)
  514. tSendMsgData.tRankData[0] = 0
  515. tSendMsgData.nBegin = 0
  516. end
  517. end
  518. if tSendMsgData.tRankData[0] > 0 then
  519. tSendMsgData.nEnd = 1
  520. InnerMsg.send(nSrcFD, tSendMsgData)
  521. end
  522. end
  523. end
  524. -- 请求服务器排行榜对应服务器排名
  525. function MiddleCommonRank_QueryServerRank(msg)
  526. local nSrcFD = MiddleManager.getFDBySvrIndex(msg.nSrcServerID)
  527. if not nSrcFD then
  528. print("[MiddleCommonRank_QueryServerRank] 获取不到对应的 服务器的 fd nSrcServerID = "..msg.nSrcServerID)
  529. return
  530. end
  531. local tMsgData = InnerMsg.wl.WL_COMMERCE_GET_SERVERRANK_PRIZE
  532. tMsgData.nOperate = msg.nOperate
  533. local nServerKey = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
  534. nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nServerKey)
  535. local tRankCacheData = MiddleCommonRank_GetRankDataByType(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE,
  536. CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER, nServerKey)
  537. if not tRankCacheData then
  538. tMsgData.nRank = MiddleCommonRank_GetMaxRankLen() + 1
  539. else
  540. for nRank, v in ipairs(tRankCacheData) do
  541. if v.uuid == msg.nServerUuid then
  542. tMsgData.nRank = nRank
  543. break
  544. end
  545. end
  546. end
  547. if not tMsgData.nRank then
  548. tMsgData.nRank = MiddleCommonRank_GetMaxRankLen() + 1
  549. end
  550. InnerMsg.send(nSrcFD, tMsgData)
  551. end
  552. -- 服务器发送全服邮件结束
  553. function MiddleCommonRank_ServerMailOk(msg)
  554. -- 先获取对应配置ID,再获取最小的ID
  555. local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
  556. local nServerKey, nMaxServerID = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
  557. if not MIDDLE_SENDSERVER_MAIL[nServerKey] then
  558. MIDDLE_SENDSERVER_MAIL[nServerKey] = {}
  559. end
  560. MIDDLE_SENDSERVER_MAIL[nServerKey][nConfServerID] = 1
  561. local bOK = true
  562. for i = nServerKey, nMaxServerID, 1 do
  563. if not MIDDLE_SENDSERVER_MAIL[nServerKey][i] then
  564. bOK = false
  565. break
  566. end
  567. end
  568. -- 发送全服个人奖励
  569. if true == bOK then
  570. local tRankData = MiddleCommonRank_GetRankDataByType(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE,
  571. CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN, nServerKey)
  572. if tRankData then
  573. local tMsgData = InnerMsg.wl.WL_COMMERCE_SEND_HUMAN_PRIZE
  574. for nRank, v in ipairs(tRankData) do
  575. tMsgData.nRank = nRank
  576. tMsgData.uuid = v.uuid
  577. local nSrcFD = MiddleManager.getFDBySvrIndex(v.nSrcServerID)
  578. if nSrcFD then
  579. InnerMsg.send(nSrcFD, tMsgData)
  580. else
  581. print("[MiddleCommonRank_ServerMailOk] 获取不到对应服务器的FD nSrcServerID = "..v.nSrcServerID)
  582. end
  583. end
  584. end
  585. end
  586. end
  587. function MiddleCommonRank_ClearRank(msg)
  588. local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
  589. local nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
  590. MiddleCommonRank_ResertCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER, nServerKey)
  591. MiddleCommonRank_ResertCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN, nServerKey)
  592. MiddleRankQueryForData.nRankType = CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE
  593. MiddleRankQueryForData.nRankSubType = CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER
  594. MiddleRankQueryForData.nServerKey = nServerKey
  595. LuaMongo.find(DB.db_middle_rank, MiddleRankQueryForData)
  596. local tData = {}
  597. if not LuaMongo.next(tData) then
  598. return
  599. end
  600. LuaMongo.remove(DB.db_middle_rank, MiddleRankQueryForData)
  601. end