MiddleCommonRank.lua 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  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. -- 设置处理的战区个人邮件
  78. local function MiddleCommonRank_SetSendHumanMail(nServerKey, nValue)
  79. MIDDLE_SENDSERVER_MAIL[nServerKey] = nValue
  80. end
  81. -- 获取处理的战区个人邮件
  82. local function MiddleCommonRank_GetSendHumanMail(nServerKey)
  83. if not MIDDLE_SENDSERVER_MAIL[nServerKey] then
  84. MIDDLE_SENDSERVER_MAIL[nServerKey] = 0
  85. end
  86. return MIDDLE_SENDSERVER_MAIL[nServerKey]
  87. end
  88. local function MiddleCommonRank_GetMinValue(nRankType, nRankSubType)
  89. local tRankConf = MiddleCommonRank_GetConfByType(nRankType)
  90. if not tRankConf then
  91. print("[MiddleCommonRank_GetMinValue] 获取不到配置 nRankType = "..nRankType.." nRankSubType = "..nRankSubType)
  92. return nil
  93. end
  94. print("[MiddleCommonRank_GetMinValue] nRankType = "..nRankType.." nRankSubType = "..nRankSubType)
  95. local nMinRankValue
  96. if CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE == nRankType then
  97. for _, v in pairs(tRankConf) do
  98. if v.nRankType == nRankSubType then
  99. if not nMinRankValue then
  100. nMinRankValue = v.nPoint
  101. else
  102. nMinRankValue = math.min(v.nPoint, nMinRankValue)
  103. end
  104. print("[MiddleCommonRank_GetMinValue] v.nPoint = "..v.nPoint.." nMinRankValue = "..nMinRankValue)
  105. end
  106. end
  107. end
  108. if nMinRankValue then
  109. print("[MiddleCommonRank_GetMinValue] nMinRankValue = "..nMinRankValue)
  110. end
  111. return nMinRankValue
  112. end
  113. -- 获取最小上榜条件
  114. local function MiddleCommonRank_GetMinRankValue(nRankType, nRankSubType)
  115. if MIDDLE_COMMON_MIN_RANK and MIDDLE_COMMON_MIN_RANK[nRankType] and MIDDLE_COMMON_MIN_RANK[nRankType][nRankSubType] then
  116. print("[MiddleCommonRank_GetMinRankValue] 存在缓存直接返回")
  117. return MIDDLE_COMMON_MIN_RANK[nRankType][nRankSubType]
  118. end
  119. local nMinValue = MiddleCommonRank_GetMinValue(nRankType, nRankSubType)
  120. if nil == nMinValue then
  121. print("[MiddleCommonRank_GetMinRankValue] 根据配置获取不到最小上榜条件值")
  122. return nil
  123. end
  124. print("[MiddleCommonRank_GetMinRankValue] 获取到的 nMinValue = "..nMinValue)
  125. if not MIDDLE_COMMON_MIN_RANK then
  126. MIDDLE_COMMON_MIN_RANK = {}
  127. end
  128. if not MIDDLE_COMMON_MIN_RANK[nRankType] then
  129. MIDDLE_COMMON_MIN_RANK[nRankType] = {}
  130. end
  131. MIDDLE_COMMON_MIN_RANK[nRankType][nRankSubType] = nMinValue
  132. return nMinValue
  133. end
  134. -- 获取最大排行榜长度
  135. local function MiddleCommonRank_GetMaxRankLen()
  136. return CommonDefine.COMMONRANK_SAVE_DB_LEN
  137. end
  138. -- 获取对应名次上榜所需要求值
  139. local function MiddleCommonRank_GetRankNeedValue(nRankType, nRankSubType, nRank)
  140. MIDDLE_RANK_NEED_VALUES = MIDDLE_RANK_NEED_VALUES or {}
  141. local minRankValue = MiddleCommonRank_GetMinRankValue(nRankType, nRankSubType)
  142. if nil == minRankValue then
  143. print("[MiddleCommonRank_GetRankNeedValue] 获取最小上排行榜值失败 nRankType = "..nRankType.." nRankSubType = "..nRankSubType)
  144. return
  145. end
  146. print("[MiddleCommonRank_GetRankNeedValue] 获取到的最小上榜值 minRankValue = "..minRankValue.." nRank = "..nRank)
  147. if MIDDLE_RANK_NEED_VALUES[nRankType] and MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] then
  148. local nValue = nil
  149. for _, tData in ipairs(MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType]) do
  150. if tData.nMinRank <= nRank and tData.nMaxRank >= nRank then
  151. nValue = tData.nValue
  152. break
  153. end
  154. end
  155. if nValue then
  156. print("[MiddleCommonRank_GetRankNeedValue] 获取到的最小上榜值 minRankValue = "..minRankValue.." nValue = "..nValue)
  157. end
  158. return nValue or minRankValue
  159. end
  160. local tRankConfig = MiddleCommonRank_GetConfByType(nRankType)
  161. if not tRankConfig then
  162. print("[MiddleCommonRank_GetRankNeedValue] 获取不到对应的配置")
  163. return minRankValue
  164. end
  165. if not MIDDLE_RANK_NEED_VALUES[nRankType] then
  166. MIDDLE_RANK_NEED_VALUES[nRankType] = {}
  167. end
  168. if not MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] then
  169. MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] = {}
  170. end
  171. local nValue = nil
  172. for _, v in pairs(tRankConfig) do
  173. if v.nRankType == nRankSubType then
  174. local nMinRank = v.nOrder[1]
  175. local nMaxRank = v.nOrder[2]
  176. table.insert(MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType], {nMinRank = nMinRank, nMaxRank = nMaxRank, nValue = v.nPoint})
  177. if not nValue then
  178. nValue = v.nPoint
  179. else
  180. if nMinRank <= nRank and nMaxRank >= nRank then
  181. nValue = v.nPoint
  182. end
  183. end
  184. end
  185. end
  186. if nValue then
  187. print("[MiddleCommonRank_GetRankNeedValue] 获取到的最小上榜值 minRankValue = "..minRankValue.." nValue = "..nValue)
  188. else
  189. print("[MiddleCommonRank_GetRankNeedValue] 获取不到对应排名所需的值 nRank = "..nRank)
  190. end
  191. return nValue or minRankValue
  192. end
  193. -- 获取指定排名类型缓存数据
  194. local function MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  195. if not MIDDLE_COMMON_RANK or not MIDDLE_COMMON_RANK[nRankType] or
  196. not MIDDLE_COMMON_RANK[nRankType][nRankSubType] or not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
  197. return nil
  198. end
  199. return MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey]
  200. end
  201. -- -- 获取指定排名类型、指定用户的排名
  202. local function MiddleCommonRank_GetRankDataByUid(nRankType, nRankSubType, nServerKey, uuid)
  203. local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  204. if not tRankCacheData then
  205. return
  206. end
  207. return tRankCacheData.uuid2rank[uuid]
  208. end
  209. -- 获取指定排名类型、指定用户的发送排名
  210. local function MiddleCommonRank_GetSendRank(nRankType, nRankSubType, nServerKey, uuid)
  211. local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  212. if not tRankCacheData then
  213. return
  214. end
  215. return tRankCacheData.sendUuid2rank[uuid]
  216. end
  217. -- 排序
  218. local function MiddleCommonRank_CmpRank(data1, data2)
  219. if data1.nValue ~= data2.nValue then
  220. return data1.nValue > data2.nValue
  221. end
  222. return data1.nTime < data2.nTime
  223. end
  224. -- 更新排名
  225. local function MiddleCommonRank_UpdateRank(tRankData)
  226. if not tRankData then
  227. return
  228. end
  229. -- 清空普通排名和发送排名玩家数据
  230. for uuid in pairs(tRankData.uuid2rank) do
  231. tRankData.uuid2rank[uuid] = nil
  232. tRankData.sendUuid2rank[uuid] = nil
  233. end
  234. -- 设置普通排名
  235. for rank, data in ipairs(tRankData.rank2data) do
  236. tRankData.uuid2rank[data.uuid] = rank
  237. end
  238. -- 清空发送排名
  239. for rank in ipairs(tRankData.sendRank2data) do
  240. tRankData.sendRank2data[rank] = nil
  241. end
  242. local minRankValue = MiddleCommonRank_GetMinRankValue(tRankData.nRankType, tRankData.nRankSubType) -- 排名最小需要的排名值
  243. local aleadyRankCnt = 0 -- 已经排好的玩家数
  244. local maxRank = MiddleCommonRank_GetMaxRankLen() -- 最多排名玩家数量
  245. for rank = 1, maxRank do
  246. -- 取当前排名需要的排名值
  247. local rankNeedValue = MiddleCommonRank_GetRankNeedValue(tRankData.nRankType, tRankData.nRankSubType, rank)
  248. if rankNeedValue then
  249. print("[MiddleCommonRank_UpdateRank] rankNeedValue = "..rankNeedValue)
  250. end
  251. local rank2data = tRankData.rank2data[aleadyRankCnt + 1] -- 当前排的玩家
  252. if rank2data then -- 还有玩家需要排
  253. if rank2data.nValue >= rankNeedValue then -- 达到排名值,可以排名
  254. tRankData.sendUuid2rank[rank2data.uuid] = rank -- 设置玩家发送排名
  255. tRankData.sendRank2data[rank] = rank2data -- 设置发送排名数据
  256. aleadyRankCnt = aleadyRankCnt + 1 -- 排名玩家数量+1
  257. -- if "table" == type(rank2data) then
  258. -- Log.write(Log.LOGID_OSS_COMMON_ACT, "当前的排名情况 rank = "..rank.." nRankType = "..rank2data.nRankType.." nRankSubType = "..rank2data.nRankSubType.." name = "..rank2data.name)
  259. -- end
  260. elseif rankNeedValue <= minRankValue then -- 未达到排名值 且 当前排名值 小于等于 最小需要的排名值了,则后面的玩家都不需要排了
  261. break
  262. else -- 未到达最低排名值,当前名次未有玩家达到
  263. tRankData.sendRank2data[rank] = -1
  264. end
  265. else -- 没玩家排了直接停止
  266. break
  267. end
  268. end
  269. end
  270. -- 更新数据
  271. local function MiddleCommonRank_UpdateData(nRankType, nRankSubType, nServerKey, data)
  272. local tRankData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  273. if not tRankData then
  274. return
  275. end
  276. local uuid = data.uuid
  277. local oldRank = MiddleCommonRank_GetRankDataByUid(nRankType, nRankSubType, nServerKey, uuid) or (#tRankData.rank2data + 1)
  278. tRankData.rank2data[oldRank] = data
  279. -- 向后比较(data.value 减少时),往排名低方向->
  280. for i = oldRank + 1, #tRankData.rank2data do
  281. local data1 = tRankData.rank2data[i - 1]
  282. local data2 = tRankData.rank2data[i]
  283. if MiddleCommonRank_CmpRank(data1, data2) then
  284. break
  285. end
  286. tRankData.rank2data[i - 1] = data2
  287. tRankData.rank2data[i] = data1
  288. end
  289. -- 向前比较(data.value 增加时),往排名高方向<-
  290. for i = oldRank - 1, 1, -1 do
  291. local data1 = tRankData.rank2data[i]
  292. local data2 = tRankData.rank2data[i + 1]
  293. if MiddleCommonRank_CmpRank(data1, data2) then
  294. break
  295. end
  296. tRankData.rank2data[i] = data2
  297. tRankData.rank2data[i + 1] = data1
  298. end
  299. local maxRank = MiddleCommonRank_GetMaxRankLen()
  300. tRankData.rank2data[maxRank + 1] = nil
  301. return true
  302. end
  303. -- 起服将数据插入排行榜
  304. local function MiddleCommonRank_InsertCacheData(data)
  305. local tRankData = MiddleCommonRank_GetRankDataByType(data.nRankType, data.nRankSubType, data.nServerKey)
  306. if not tRankData then
  307. print("[MiddleCommonRank_InsertCacheData] 不存在对应的排行榜数据")
  308. return
  309. end
  310. table.insert(tRankData.rank2data, data)
  311. end
  312. -- 对整个排行榜进行排序
  313. local function MiddleCommonRank_SortAllRank(nRankType, nRankSubType, nServerKey)
  314. local tRankData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  315. if not tRankData then
  316. print("[MiddleCommonRank_SortAllRank] 不存在对应的排行榜数据")
  317. return false
  318. end
  319. table.sort(tRankData.rank2data, MiddleCommonRank_CmpRank)
  320. local maxRank = MiddleCommonRank_GetMaxRankLen()
  321. local nNowLen = #tRankData.rank2data
  322. -- 大于了排行榜最大缓存数据
  323. if maxRank < nNowLen then
  324. for i = maxRank + 1, nNowLen, 1 do
  325. tRankData.rank2data[i] = nil
  326. end
  327. end
  328. return true
  329. end
  330. -- 重置排行数据
  331. local function MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
  332. if not MIDDLE_COMMON_RANK[nRankType] then
  333. MIDDLE_COMMON_RANK[nRankType] = {}
  334. end
  335. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
  336. MIDDLE_COMMON_RANK[nRankType][nRankSubType] = {}
  337. end
  338. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
  339. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] = {}
  340. end
  341. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nRankType = nRankType
  342. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nRankSubType = nRankSubType
  343. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nServerKey = nServerKey
  344. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].uuid2rank = {} -- 根据UUID获取名次
  345. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].sendUuid2rank = {} -- 根据UUID获取发送名次
  346. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].rank2data = {} -- 根据名次获取DATA
  347. MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].sendRank2data = {} -- 根据名次获取发送DATA
  348. end
  349. -- 初始排行榜
  350. local function MiddleCommonRank_InitCacheData(nRankType, nRankSubType)
  351. if not MIDDLE_COMMON_RANK[nRankType] then
  352. MIDDLE_COMMON_RANK[nRankType] = {}
  353. end
  354. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
  355. MIDDLE_COMMON_RANK[nRankType][nRankSubType] = {}
  356. end
  357. end
  358. -- 加载排行榜
  359. local function MiddleCommonRank_LoadDBData()
  360. local cnt = 0
  361. LuaMongo.find(DB.db_middle_rank, nil)
  362. local tNeedSortRank = {}
  363. while true do
  364. local data = {}
  365. if not LuaMongo.next(data) then
  366. break
  367. end
  368. cnt = cnt + 1
  369. if cnt % 1000 == 0 then
  370. _G.collectgarbage("step", 100000)
  371. end
  372. if not tNeedSortRank[data.nRankType] then
  373. tNeedSortRank[data.nRankType] = {}
  374. end
  375. if not tNeedSortRank[data.nRankType][data.nRankSubType] then
  376. tNeedSortRank[data.nRankType][data.nRankSubType] = {}
  377. end
  378. if not tNeedSortRank[data.nRankType][data.nRankSubType][data.nServerKey] then
  379. tNeedSortRank[data.nRankType][data.nRankSubType][data.nServerKey] = 1
  380. MiddleCommonRank_ResertCacheData(data.nRankType, data.nRankSubType, data.nServerKey)
  381. end
  382. print("[MiddleCommonRank_LoadDBData] 获取到数据")
  383. table.print_lua_table(data)
  384. -- 先插入数据, 后排序
  385. MiddleCommonRank_InsertCacheData(data)
  386. end
  387. for nRankType, v1 in pairs(tNeedSortRank) do
  388. for nRankSubType, v2 in pairs(v1) do
  389. for nServerKey, _ in pairs(v2) do
  390. local bRet = MiddleCommonRank_SortAllRank(nRankType, nRankSubType, nServerKey)
  391. if true == bRet then
  392. print("[MiddleCommonRank_LoadDBData] 排序成功 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  393. else
  394. print("[MiddleCommonRank_LoadDBData] 排序失败 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  395. end
  396. end
  397. end
  398. end
  399. for nRankType, v1 in pairs(MIDDLE_COMMON_RANK) do
  400. for nRankSubType, v2 in pairs(v1) do
  401. for nServerKey, tData in pairs(v2) do
  402. MiddleCommonRank_UpdateRank(tData)
  403. end
  404. end
  405. end
  406. end
  407. -- 根据类型+uuid从db中取data
  408. local function MiddleCommonRank_GetDBDataByUid(nRankType, nRankSubType, nServerKey, uuid)
  409. -- MiddleRankQueryForData = {nRankType = 1, nRankSubType = 1, nServerKey = 1 ,uuid = 1}
  410. MiddleRankQueryForData.nRankType = nRankType
  411. MiddleRankQueryForData.nRankSubType = nRankSubType
  412. MiddleRankQueryForData.nServerKey = nServerKey
  413. MiddleRankQueryForData.uuid = uuid
  414. local data = {}
  415. LuaMongo.find(DB.db_middle_rank, MiddleRankQueryForData)
  416. return LuaMongo.next(data) and data
  417. end
  418. -- 更新DB数据
  419. local function MiddleCommonRank_UpdateDBData(data)
  420. local oldData = MiddleCommonRank_GetDBDataByUid(data.nRankType, data.nRankSubType, data.nServerKey, data.uuid)
  421. if oldData then
  422. MiddleRankQueryForData.nRankType = data.nRankType
  423. MiddleRankQueryForData.nRankSubType = data.nRankSubType
  424. MiddleRankQueryForData.nServerKey = data.nServerKey
  425. MiddleRankQueryForData.uuid = data.uuid
  426. LuaMongo.update(DB.db_middle_rank, MiddleRankQueryForData, data)
  427. print("[MiddleCommonRank_UpdateDBData] 存在久数据进行更新")
  428. else
  429. LuaMongo.insert(DB.db_middle_rank, data)
  430. print("[MiddleCommonRank_UpdateDBData] 不存在久数据直接进行插入")
  431. end
  432. end
  433. -- 设置排名数据
  434. local function MiddleCommonRank_SetRankInfo(data)
  435. local tRankData = MiddleCommonRank_GetRankDataByType(data.nRankType, data.nRankSubType, data.nServerKey)
  436. if not tRankData then
  437. print("[MiddleCommonRank_SetRankInfo] 获取不到缓存的排行数据")
  438. return
  439. end
  440. MiddleCommonRank_UpdateData(data.nRankType, data.nRankSubType, data.nServerKey, data)
  441. MiddleCommonRank_UpdateRank(tRankData)
  442. MiddleCommonRank_UpdateDBData(data)
  443. end
  444. -- 检查缓存
  445. local function MiddleCommonRank_CheckHaveCache(nRankType, nRankSubType, nServerKey)
  446. if not MIDDLE_COMMON_RANK[nRankType] then
  447. MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
  448. print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nRankType 缓存,重新创建 nRankType = "
  449. ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  450. return
  451. end
  452. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
  453. MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
  454. print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nRankSubType 缓存,重新创建 nRankType = "
  455. ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  456. return
  457. end
  458. if not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
  459. MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
  460. print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nServerKey 缓存,重新创建 nRankType = "
  461. ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  462. return
  463. end
  464. end
  465. -------------------------------------------------- 外部调用 -----------------------------------------
  466. -- 启动就初始化
  467. function MiddleCommonRank_InitAfterStart()
  468. -- 不是中心服不用处理
  469. if _G.is_middle ~= true then
  470. return
  471. end
  472. -- 先初始化一下
  473. MiddleCommonRank_InitCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER)
  474. MiddleCommonRank_InitCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN)
  475. -- 加载DB数据
  476. print("[MiddleCommonRank_InitAfterStart] 开始加载DB数据")
  477. MiddleCommonRank_LoadDBData()
  478. end
  479. -- 获取到跨服数据
  480. function MiddleCommonRank_ReceiveRankData(tMsgData)
  481. if _G.is_middle ~= true then
  482. return
  483. end
  484. local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(tMsgData.nSrcServerID)
  485. local nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
  486. local tDBData = MiddleCommonRank_GetDBDataByUid(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey, tMsgData.uuid)
  487. if not tDBData then
  488. tDBData = {}
  489. end
  490. -- 检查缓存, 主要是 nConfServerID 这个对应的排行数据可能需要建立
  491. MiddleCommonRank_CheckHaveCache(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey)
  492. tDBData.uuid = tMsgData.uuid
  493. tDBData.name = tMsgData.name
  494. tDBData.head = tMsgData.head
  495. tDBData.headFrame = tMsgData.headFrame
  496. tDBData.nSrcServerID = tMsgData.nSrcServerID
  497. tDBData.nRankType = tMsgData.nRankType
  498. tDBData.nRankSubType = tMsgData.nRankSubType
  499. tDBData.nServerKey = nServerKey
  500. tDBData.servername = tMsgData.servername
  501. -- 已经存在数据的用之前上榜的时间
  502. tDBData.nTime = tDBData.nTime or os.time()
  503. -- 排行的value值需要判断
  504. tDBData.nValue = tDBData.nValue or 0
  505. print("[MiddleCommonRank_ReceiveRankData] 获取到数据 name = "..tDBData.name.." nDBValue = "..tDBData.nValue.." nValue = "..tMsgData.nValue)
  506. local nMinValue = MiddleCommonRank_GetMinValue(tMsgData.nRankType, tMsgData.nRankSubType)
  507. if not nMinValue then
  508. print("[MiddleCommonRank_ReceiveRankData] 获取不到对应的最小上榜条件")
  509. return
  510. end
  511. local bUpRank = false
  512. if CommonDefine.COMMONRANK_VALUE_REPLACE == tMsgData.nOperate then
  513. -- 直接替换,对应nValue在普通服有存储,发上来都是最终的值,不满足条件可以不存
  514. tDBData.nValue = tMsgData.nValue
  515. if tDBData.nValue >= nMinValue then
  516. bUpRank = true
  517. end
  518. elseif CommonDefine.COMMONRANK_VALUE_ADD == tMsgData.nOperate then
  519. -- 直接增加的操作需要存库
  520. tDBData.nValue = tDBData.nValue + tMsgData.nValue
  521. bUpRank = true
  522. end
  523. if true == bUpRank then
  524. MiddleCommonRank_SetRankInfo(tDBData)
  525. print("[MiddleCommonRank_ReceiveRankData] 玩家上榜进行成功")
  526. end
  527. end
  528. function MiddleCommonRank_QueryRankInfo(tMsgData)
  529. if _G.is_middle ~= true then
  530. return
  531. end
  532. local nRankType = tMsgData.nRankType
  533. local nRankSubType = tMsgData.nRankSubType
  534. local nServerKey = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(tMsgData.nSrcServerID)
  535. nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nServerKey)
  536. local nSrcFD = MiddleManager.getFDBySvrIndex(tMsgData.nSrcServerID)
  537. if not nSrcFD then
  538. print("[MiddleCommonRank_QueryRankInfo] 获取不到对应的 服务器的 fd nSrcServerID = "..tMsgData.nSrcServerID)
  539. return
  540. end
  541. -- 检查缓存, 主要是 nServerKey 这个对应的排行数据可能需要建立
  542. MiddleCommonRank_CheckHaveCache(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey)
  543. local tSendMsgData = InnerMsg.wl.WL_COMMERCE_QUERY_RANK_INFO
  544. tSendMsgData.nRankType = nRankType
  545. tSendMsgData.nRankSubType = nRankSubType
  546. tSendMsgData.nServerKey = nServerKey
  547. tSendMsgData.nBegin = 1
  548. tSendMsgData.nEnd = 0
  549. tSendMsgData.tRankData = {}
  550. tSendMsgData.tRankData[0] = 0
  551. local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  552. if not tRankCacheData or nil == _G.next(tRankCacheData) then
  553. tSendMsgData.nEnd = 1
  554. else
  555. for nRank, v in pairs(tRankCacheData.sendRank2data) do
  556. tSendMsgData.tRankData[0] = tSendMsgData.tRankData[0] + 1
  557. tSendMsgData.tRankData[tSendMsgData.tRankData[0]] = {
  558. nRank = nRank,
  559. tRankData = v,
  560. }
  561. if tSendMsgData.tRankData[0] >= CommonDefine.COMMONRANK_ONE_SEND_LEN then
  562. InnerMsg.sendMsg(nSrcFD, tSendMsgData)
  563. tSendMsgData.tRankData[0] = 0
  564. tSendMsgData.nBegin = 0
  565. end
  566. end
  567. tSendMsgData.nEnd = 1
  568. end
  569. InnerMsg.sendMsg(nSrcFD, tSendMsgData)
  570. print("[MiddleCommonRank_QueryRankInfo] 向普通服发送排行榜数据完成")
  571. end
  572. -- 请求服务器排行榜对应服务器排名
  573. function MiddleCommonRank_QueryServerRank(msg)
  574. local nSrcFD = MiddleManager.getFDBySvrIndex(msg.nSrcServerID)
  575. if not nSrcFD then
  576. print("[MiddleCommonRank_QueryServerRank] 获取不到对应的 服务器的 fd nSrcServerID = "..msg.nSrcServerID)
  577. return
  578. end
  579. print("[MiddleCommonRank_QueryServerRank] 请求服务器排行榜对应服务器排名 nOperate = "..msg.nOperate.." nServerUuid = "..msg.nServerUuid)
  580. local tMsgData = InnerMsg.wl.WL_COMMERCE_GET_SERVERRANK_PRIZE
  581. tMsgData.nOperate = msg.nOperate
  582. local nServerKey = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
  583. nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nServerKey)
  584. print("[MiddleCommonRank_QueryServerRank] 请求服务器排行榜对应服务器排名 nServerKey = "..nServerKey)
  585. local tRankCacheData = MiddleCommonRank_GetRankDataByType(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE,
  586. CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER, nServerKey)
  587. local nNowRank = -1
  588. if not tRankCacheData then
  589. print("[MiddleCommonRank_QueryServerRank] 不存在缓存数据")
  590. nNowRank = MiddleCommonRank_GetMaxRankLen() + 1
  591. else
  592. print("[MiddleCommonRank_QueryServerRank] 存在缓存数据")
  593. for nRank, v in pairs(tRankCacheData.sendRank2data) do
  594. print("[MiddleCommonRank_QueryServerRank] nRank = "..nRank)
  595. if "table"== type(v) then
  596. print("[MiddleCommonRank_QueryServerRank] nRank = "..nRank.." uuid = "..v.uuid.." type1 = "..type(v.uuid).." type2 = "..type(msg.nServerUuid))
  597. end
  598. if "table"== type(v) and v.uuid == msg.nServerUuid then
  599. print("[MiddleCommonRank_QueryServerRank] nRank = "..nRank.." uuid = "..v.uuid.." nServerUuid = "..msg.nServerUuid)
  600. nNowRank = nRank
  601. break
  602. end
  603. end
  604. end
  605. if -1 >= nNowRank then
  606. nNowRank = MiddleCommonRank_GetMaxRankLen() + 1
  607. end
  608. tMsgData.nRank = nNowRank
  609. print("[MiddleCommonRank_QueryServerRank] 获取到rank = "..nNowRank.." nSrcServerID = "..msg.nSrcServerID.." nServerKey = "..nServerKey)
  610. InnerMsg.sendMsg(nSrcFD, tMsgData)
  611. end
  612. -- 延迟发送个人奖励
  613. function MiddleCommonRank_SendHumanRankPrize(nRankType, nRankSubType, nServerKey)
  614. print("[MiddleCommonRank_SendHumanRankPrize] 开始处理对应的个人排行榜奖励 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  615. Log.write(Log.LOGID_OSS_COMMON_ACT, "[MiddleCommonRank_SendHumanRankPrize] 开始处理对应的个人排行榜奖励 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  616. local tRankData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
  617. if tRankData then
  618. local tMsgData = InnerMsg.wl.WL_COMMERCE_SEND_HUMAN_PRIZE
  619. for nRank, v in ipairs(tRankData.sendRank2data) do
  620. if v and type(v) == "table" then
  621. tMsgData.nRank = nRank
  622. tMsgData.uuid = v.uuid
  623. local nSrcFD = MiddleManager.getFDBySvrIndex(v.nSrcServerID)
  624. if nSrcFD then
  625. print("[MiddleCommonRank_SendHumanRankPrize] nRank = "..nRank.." uuid = "..v.uuid.." nSrcServerID = "..v.nSrcServerID)
  626. Log.write(Log.LOGID_OSS_COMMON_ACT, "[MiddleCommonRank_SendHumanRankPrize] nRank = "..nRank.." uuid = "..v.uuid.." nSrcServerID = "..v.nSrcServerID)
  627. InnerMsg.sendMsg(nSrcFD, tMsgData)
  628. else
  629. print("[MiddleCommonRank_SendHumanRankPrize] 获取不到对应服务器的FD nSrcServerID = "..v.nSrcServerID)
  630. Log.write(Log.LOGID_OSS_COMMON_ACT, "[MiddleCommonRank_SendHumanRankPrize] 获取不到对应服务器的FD nSrcServerID = "..v.nSrcServerID)
  631. end
  632. end
  633. end
  634. else
  635. print("[MiddleCommonRank_SendHumanRankPrize] 不存在对应的个人排行榜数据 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
  636. end
  637. print("[MiddleCommonRank_SendHumanRankPrize] 开始处理对应的个人排行榜奖励完成")
  638. Log.write(Log.LOGID_OSS_COMMON_ACT, "[MiddleCommonRank_SendHumanRankPrize] 处理对应的个人排行榜奖励完成")
  639. end
  640. -- 服务器发送全服邮件结束
  641. function MiddleCommonRank_ServerMailOk(msg)
  642. -- 先获取对应配置ID,再获取最小的ID
  643. local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
  644. local nServerKey, nMaxServerID = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
  645. Log.write(Log.LOGID_OSS_COMMON_ACT, "[MiddleCommonRank_ServerMailOk] 处理全服邮件结束 nSrcServerID = "..msg.nSrcServerID)
  646. if 0 == MiddleCommonRank_GetSendHumanMail(nServerKey) then
  647. MiddleCommonRank_SetSendHumanMail(nServerKey, 1)
  648. print("[MiddleCommonRank_ServerMailOk] 直接发送个人邮件奖励开始 nServerKey = "..nServerKey)
  649. Log.write(Log.LOGID_OSS_COMMON_ACT, "[MiddleCommonRank_ServerMailOk] 发送个人邮件奖励开始 nSrcServerID = "..msg.nSrcServerID)
  650. -- 延迟处理对应个人排行榜奖励
  651. MiddleCommonRank_SendHumanRankPrize(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN, nServerKey)
  652. end
  653. end
  654. function MiddleCommonRank_ClearRank(msg)
  655. local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
  656. local nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
  657. MiddleCommonRank_ResertCacheData(msg.nRankType, msg.nRankSubType, nServerKey)
  658. print("[MiddleCommonRank_ClearRank] 清理排行榜开始 nRankType = "..msg.nRankType.." nRankSubType = "..msg.nRankSubType.." nServerKey = "..nServerKey)
  659. MiddleRankQueryByRankType.nRankType = msg.nRankType
  660. MiddleRankQueryByRankType.nRankSubType = msg.nRankSubType
  661. MiddleRankQueryByRankType.nServerKey = nServerKey
  662. MiddleCommonRank_SetSendHumanMail(nServerKey, 0)
  663. LuaMongo.find(DB.db_middle_rank, MiddleRankQueryByRankType)
  664. local tData = {}
  665. if not LuaMongo.next(tData) then
  666. print("[MiddleCommonRank_ClearRank] 不存在对应的数据")
  667. return
  668. end
  669. LuaMongo.remove(DB.db_middle_rank, MiddleRankQueryByRankType)
  670. print("[MiddleCommonRank_ClearRank] 清理排行榜数据完成")
  671. end
  672. function MiddleCommonRank_GMClearMail(msg)
  673. local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
  674. local nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
  675. MiddleCommonRank_SetSendHumanMail(nServerKey, 0)
  676. print("[MiddleCommonRank_GMClearMail] GM清理命令结束 nNowValue = "..MIDDLE_SENDSERVER_MAIL[nServerKey])
  677. end