jjcNewLadderDB.lua 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. --------------------------------
  2. -- 文件名 : jjcNewLadderDB.lua
  3. -- 文件说明 : 天梯赛-DB数据
  4. -- 创建时间 : 2025/05/06
  5. -- 创建人 : FC
  6. --------------------------------
  7. local LuaMongo = _G.lua_mongo
  8. local Config = require("Config")
  9. local DB = require("common.DB")
  10. local Util = require("common.Util")
  11. local CommonDB = require("common.CommonDB")
  12. local CombatVideo = require("combat.CombatVideo")
  13. local CreateRole = require("role.CreateRole")
  14. local WarZoneConf = require("excel.WarZone")
  15. local JjcExcel = require("excel.jjc")
  16. local JjcNewLadderDefine = require("jjcnewladder.jjcNewLadderDefine")
  17. local Timer = require("core.Timer")
  18. local JjcNewLadderMiddle = require("jjcnewladder.jjcNewLadderMiddle")
  19. local ObjHuman = require("core.ObjHuman")
  20. local Log = require("common.Log")
  21. local nServerOffSet = 810538 -- 配置中服务器ID偏移量
  22. JJCNEWLADDERDB_PLAYER_RANK = {} -- 天梯赛真人对应排名
  23. JJCNEWLADDERDB_ROBOT_RANK = {} -- 机器人对应排名信息
  24. JJCNEWLADDERDB_ALL_RANK = {} -- 天梯赛排行榜信息
  25. UUID_2_RANK = {}
  26. local JJCLADDER_RANDNUM = 50 -- 随机次数,防止找到重复的
  27. local JJCLADDER_FINDRIVALNUM = 5 -- 匹配的对手
  28. local JJCLADDER_FINDBIGNUM = 4 -- 匹配大于当前排位人数
  29. local JJCLADDER_SPECIALRANK = 5 -- 特殊处理的前五名
  30. local Jjc_QueryByUuid = {uuid = nil} -- DB查询数据
  31. -------------------------------- 以下是战区归宿的第一个服操作 ---------------------------
  32. -- 写日志
  33. local function JjcNewLadderDB_WriteLog(szText)
  34. Log.write(Log.LOGID_OSS_JJCNEWLADDER, szText)
  35. end
  36. -- 获取战区服务器ID
  37. function JjcNewLadderDB_ConfServerID2TrueServerID(nServerIDConf)
  38. return nServerIDConf + nServerOffSet - 1
  39. end
  40. -- 获取战区配置服务器ID
  41. function JjcNewLadderDB_TrueServerID2ConfServerID(nServerID)
  42. return nServerID - nServerOffSet + 1
  43. end
  44. -- 判断是否是战区所属的第一个服
  45. local function JjcNewLadderDB_IsFirstServer(nServerID)
  46. local nServerIDConf = JjcNewLadderDB_TrueServerID2ConfServerID(nServerID)
  47. local bRet = false
  48. for _, v in ipairs(WarZoneConf.group) do
  49. if v.nMinServerID == nServerIDConf then
  50. bRet = true
  51. break
  52. end
  53. -- 大于了,没必要找直接返回
  54. if v.nMinServerID > nServerIDConf then
  55. break
  56. end
  57. end
  58. return bRet
  59. end
  60. -- 设置结束时间
  61. function JjcNewLadderDB_SetEndTime()
  62. local nNowTime = os.time()
  63. local tDate = os.date("*t",nNowTime)
  64. if tDate.wday >= JjcNewLadderDefine.JJC_NEWLADDER_OPENDAY and JjcNewLadderDefine.JJC_NEWLADDER_ENDDAY >= tDate.wday then
  65. local nDiffDay = JjcNewLadderDefine.JJC_NEWLADDER_ENDDAY - tDate.wday
  66. local nEndTime = nNowTime + nDiffDay * 86400
  67. local tEndDate = os.date("*t",nEndTime)
  68. tEndDate.hour = 23
  69. tEndDate.min = 0
  70. tEndDate.sec = 0
  71. nEndTime = os.time(tEndDate)
  72. CommonDB.SetJjcLadderEndTime(nEndTime)
  73. print("[JjcNewLadderDB_SetEndTime] 设置了活动结束时间 nEndTime = "..nEndTime)
  74. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_SetEndTime] 设置活动结束时间 nEndTime = "..nEndTime)
  75. end
  76. end
  77. -- 移除对应排名中的数据
  78. local function JjcNewLadderDB_RemoveCache(uuid)
  79. if 0 >= #JJCNEWLADDERDB_ALL_RANK then
  80. return
  81. end
  82. local nLen = #JJCNEWLADDERDB_ALL_RANK
  83. for i = nLen, 1, -1 do
  84. local tData = JJCNEWLADDERDB_ALL_RANK[i]
  85. if tData.uuid == uuid then
  86. print("[JjcNewLadderDB_RemoveCache] 移除缓存数据 uuid = "..uuid.." i = "..i)
  87. table.remove(JJCNEWLADDERDB_ALL_RANK, i)
  88. end
  89. end
  90. end
  91. -- 移除数据
  92. local function JjcNewLadderDB_RemoveDB(uuid)
  93. if not uuid then return end
  94. Jjc_QueryByUuid.uuid = tostring(uuid)
  95. LuaMongo.remove(DB.db_jjcLadder, Jjc_QueryByUuid)
  96. end
  97. -- 更新数据
  98. local function JjcNewLadderDB_UpdateData(tRankData)
  99. if not tRankData.uuid then return end
  100. Jjc_QueryByUuid.uuid = tRankData.uuid
  101. LuaMongo.update(DB.db_jjcLadder, Jjc_QueryByUuid, tRankData)
  102. end
  103. -- 插入数据
  104. local function JjcNewLadderDB_InsertData(tRankData)
  105. LuaMongo.insert(DB.db_jjcLadder, tRankData)
  106. end
  107. -- 判断是否是NPC
  108. local function JjcNewLadderDB_isNpc(tRankData)
  109. if tRankData.nPoint and tRankData.nMonsterOutID then
  110. return true
  111. end
  112. return false
  113. end
  114. local function JjcNewLadderDB_AddNpc(tNpcConfig, nID)
  115. local jjcData = {}
  116. local r = math.random(1, #tNpcConfig.monsterOutID)
  117. jjcData.monsterOutID = tNpcConfig.monsterOutID[r]
  118. jjcData.lv = 50
  119. jjcData.head = CreateRole.getRandomHead()
  120. jjcData.name = CreateRole.getRandomName()
  121. jjcData.body = CreateRole.getRandomBody()
  122. jjcData.identity = CreateRole.getFakeIdentityMax()
  123. jjcData.point = tNpcConfig.initPoint
  124. jjcData.zhandouli = math.random(tNpcConfig.zhandouli[1], tNpcConfig.zhandouli[2])
  125. jjcData.time = os.time()
  126. jjcData.uuid = tostring(nID)
  127. jjcData.nIsHuman = 0
  128. jjcData.nServerID = Config.SVR_INDEX
  129. jjcData.szServerName = Config.NEW_SVR_INDEX.."区"
  130. jjcData.nInFight = 0
  131. jjcData.nLastFightTime = 0
  132. jjcData.nRank = nID
  133. LuaMongo.insert(DB.db_jjcLadder, jjcData)
  134. JJCNEWLADDERDB_ALL_RANK[#JJCNEWLADDERDB_ALL_RANK + 1] = jjcData
  135. if #JJCNEWLADDERDB_ROBOT_RANK < JjcNewLadderDefine.JJC_NEWLADDER_ROBOT_NUM then
  136. JJCNEWLADDERDB_ROBOT_RANK[#JJCNEWLADDERDB_ROBOT_RANK + 1] = jjcData
  137. end
  138. print("[JjcNewLadderDB_AddNpc] 初始化机器人成功 nID = "..nID)
  139. end
  140. -- 初始化机器人数据
  141. local function JjcNewLadderDB_InitRobot()
  142. if false == JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  143. return
  144. end
  145. print("[JjcNewLadderDB_InitRobot] 初始化机器人数据开始")
  146. -- 生成NPC数据
  147. local nID = 1
  148. for _, npcConfig in ipairs(JjcExcel.skyladdernpc) do
  149. for i = 1, npcConfig.cnt do
  150. JjcNewLadderDB_AddNpc(npcConfig, nID)
  151. nID = nID + 1
  152. if nID > JjcNewLadderDefine.JJC_NEWLADDER_ROBOT_NUM then
  153. break
  154. end
  155. end
  156. end
  157. end
  158. local function JjcNewLadderDB_ownCmp(a, b)
  159. if a.nRank and b.nRank then
  160. return a.nRank < b.nRank
  161. end
  162. if a.point ~= b.point then
  163. return a.point > b.point
  164. end
  165. return a.time < b.time
  166. end
  167. -- 进行排序
  168. local function JjcNewLadderDB_SortRank()
  169. if #JJCNEWLADDERDB_ALL_RANK > 1 then
  170. print("[JjcNewLadderDB_SortRank] 进行排序")
  171. table.sort(JJCNEWLADDERDB_ALL_RANK, JjcNewLadderDB_ownCmp)
  172. end
  173. UUID_2_RANK = {}
  174. local nLen = 0
  175. for rank = 1, #JJCNEWLADDERDB_ALL_RANK do
  176. local uuid = JJCNEWLADDERDB_ALL_RANK[rank].uuid
  177. UUID_2_RANK[uuid] = rank
  178. end
  179. end
  180. -- 战区第一个服清理数据
  181. local function JjcNewLadderDB_FirstServerRest(nOperate)
  182. JJCNEWLADDERDB_PLAYER_RANK = {}
  183. JJCNEWLADDERDB_ROBOT_RANK = {}
  184. JJCNEWLADDERDB_ALL_RANK = {}
  185. UUID_2_RANK = {}
  186. LuaMongo.remove(DB.db_jjcLadder)
  187. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_FirstServerRest] 清理数据完成")
  188. -- for i = 1, nLen, 1 do
  189. -- local tRankData = JJCNEWLADDERDB_ALL_RANK[i]
  190. -- if false == JjcNewLadderDB_isNpc(tRankData) then
  191. -- JjcNewLadderDB_RemoveDB(tRankData.uuid)
  192. -- end
  193. -- JJCNEWLADDERDB_ALL_RANK[i] = nil
  194. -- end
  195. --
  196. -- 初始化机器人
  197. if true == nOperate then
  198. print("[JjcNewLadderDB_FirstServerRest] 初始化机器人数据")
  199. JjcNewLadderDB_InitRobot()
  200. end
  201. -- 进行排序和映射
  202. JjcNewLadderDB_SortRank()
  203. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_FirstServerRest] 生成机器人,重新排序完成")
  204. end
  205. -- 根据 uuid从db中取data
  206. local function JjcNewLadderDB_GetDBDataByUid(uuid)
  207. -- MiddleRankQueryForData = {nRankType = 1, nRankSubType = 1, nServerKey = 1 ,uuid = 1}
  208. Jjc_QueryByUuid.uuid = tostring(uuid)
  209. local data = {}
  210. LuaMongo.find(DB.db_jjcLadder, Jjc_QueryByUuid)
  211. return LuaMongo.next(data) and data
  212. end
  213. -- 更新DB数据
  214. local function JjcNewLadderDB_UpdateDBData(data)
  215. local oldData = JjcNewLadderDB_GetDBDataByUid(data.uuid)
  216. if oldData then
  217. print("[JjcNewLadderDB_UpdateDBData] 存在旧数据直接开始进行更新")
  218. Jjc_QueryByUuid.uuid = tostring(data.uuid)
  219. -- print("[JjcNewLadderDB_UpdateDBData] 更新DB数据\n")
  220. -- table.print_lua_table(Jjc_QueryByUuid)
  221. LuaMongo.update(DB.db_jjcLadder, Jjc_QueryByUuid, data)
  222. print("[JjcNewLadderDB_UpdateDBData] 存在旧数据进行更新完成")
  223. else
  224. print("[JjcNewLadderDB_UpdateDBData] 不存在旧数据直接开始进行插入")
  225. LuaMongo.insert(DB.db_jjcLadder, data)
  226. print("[JjcNewLadderDB_UpdateDBData] 不存在旧数据直接结束进行插入")
  227. end
  228. end
  229. -- 初始化数据
  230. function JjcNewLadderDB_Init()
  231. if true == JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  232. JjcNewLadderDB_FirstServerRest(true)
  233. end
  234. -- 清理录像
  235. CombatVideo.cleanJJCLadderVideo()
  236. end
  237. -- 判断是否为空
  238. local function JjcNewLadderDB_isEmpty()
  239. LuaMongo.find(DB.db_jjcLadder)
  240. local data = {}
  241. if not LuaMongo.next(data) then
  242. return true
  243. end
  244. return false
  245. end
  246. -- 加载数据
  247. local function JjcNewLadderDB_LoadData()
  248. LuaMongo.find(DB.db_jjcLadder)
  249. while true do
  250. local data = {}
  251. if not LuaMongo.next(data) then
  252. break
  253. end
  254. if data.point then
  255. JJCNEWLADDERDB_ALL_RANK[#JJCNEWLADDERDB_ALL_RANK + 1] = data
  256. else
  257. print("[JjcNewLadderDB_LoadData] 居然存在没有积分的 数据 uuid = "..data.uuid)
  258. end
  259. end
  260. print("[JjcNewLadderDB_LoadData] 加载数据完成,共加载 "..#JJCNEWLADDERDB_ALL_RANK)
  261. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_LoadData] 加载数据完成,共加载 "..#JJCNEWLADDERDB_ALL_RANK)
  262. -- 加载完排序
  263. JjcNewLadderDB_SortRank()
  264. print("[JjcNewLadderDB_LoadData] 排序完成")
  265. for i = 1, #JJCNEWLADDERDB_ALL_RANK do
  266. if #JJCNEWLADDERDB_ROBOT_RANK >= JjcNewLadderDefine.JJC_NEWLADDER_ROBOT_NUM then
  267. break
  268. end
  269. local tRankData = JJCNEWLADDERDB_ALL_RANK[i]
  270. if tRankData.nIsHuman == 1 then
  271. JJCNEWLADDERDB_ROBOT_RANK[#JJCNEWLADDERDB_ROBOT_RANK + 1] = tRankData
  272. end
  273. end
  274. end
  275. -- 起服操作
  276. function JjcNewLadderDB_initAfterStart()
  277. if _G.is_middle == true then
  278. return
  279. end
  280. -- 检查时间
  281. local bReset = JjcNewLadderDB_CheckIsReset()
  282. if true == bReset then
  283. print("[JjcNewLadderDB_initAfterStart] 需要重置时间, 进行重置时间操作")
  284. -- 重置时间
  285. JjcNewLadderDB_SetEndTime()
  286. -- 是首个服
  287. if true == JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  288. -- 直接重置
  289. JjcNewLadderDB_Init()
  290. print("[JjcNewLadderDB_initAfterStart] 重置DB数据结束")
  291. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_initAfterStart] 战区所属服 重置DB数据结束 ")
  292. else
  293. -- 清理录像
  294. CombatVideo.cleanJJCLadderVideo()
  295. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_initAfterStart] 战区 清理录像 ")
  296. end
  297. else
  298. local nNowTime = os.time()
  299. local nEndTime = CommonDB.GetJjcLadderEndTime()
  300. if nNowTime < nEndTime then
  301. if true == JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  302. if true == JjcNewLadderDB_isEmpty() then
  303. print("[JjcNewLadderDB_initAfterStart] 在活动时间内 DB数据为空进行初始化机器人数据")
  304. JjcNewLadderDB_Init()
  305. else
  306. print("[JjcNewLadderDB_initAfterStart] 在活动时间内 DB数据不为空进行加载DB数据")
  307. JjcNewLadderDB_LoadData()
  308. end
  309. end
  310. else
  311. if true == JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  312. if true == JjcNewLadderDB_isEmpty() then
  313. JjcNewLadderDB_Init()
  314. print("[JjcNewLadderDB_initAfterStart] 不在活动时间内 DB数据为空进行初始化机器人数据")
  315. else
  316. JjcNewLadderDB_LoadData()
  317. print("[JjcNewLadderDB_initAfterStart] 不在活动时间内,存在DB数据,只加载数据")
  318. end
  319. end
  320. end
  321. end
  322. end
  323. -- 定时操作
  324. function JjcNewLadderDB_OnHourOpen()
  325. JjcNewLadderDB_Init()
  326. end
  327. -------------------------------- 战区归宿的第一个服操作结束 ---------------------------
  328. -------------------------------- 内部调用函数 ---------------------------
  329. -- 加入匹配数据
  330. local function JjcNewLadderDB_AddRival(uuid, tChoseRankID)
  331. local nNowRank = UUID_2_RANK[uuid]
  332. local tRankData = JJCNEWLADDERDB_ALL_RANK[nNowRank]
  333. if not tRankData then
  334. return false
  335. end
  336. tRankData.tRival = {}
  337. for nRank, _ in pairs(tChoseRankID) do
  338. local tChoseRankData = JJCNEWLADDERDB_ALL_RANK[nRank]
  339. local uuidChose, nIsHuman = tChoseRankData.uuid, tChoseRankData.nIsHuman
  340. if not uuidChose or not nIsHuman then
  341. tRankData.tRival = {}
  342. return false
  343. end
  344. table.insert(tRankData.tRival, {uuid = uuidChose, nIsHuman = nIsHuman})
  345. end
  346. return true
  347. end
  348. function JjcNewLadderDB_CheckIsReset()
  349. local nNowTime = os.time()
  350. local nEndTime = CommonDB.GetJjcLadderEndTime()
  351. local tDate = os.date("*t",nNowTime)
  352. print("[JjcNewLadderDB_CheckIsReset] 进入重置检测 nNowTime = "..nNowTime.." nEndTime = "..nEndTime)
  353. if 0 >= nEndTime then
  354. if tDate.wday >= JjcNewLadderDefine.JJC_NEWLADDER_OPENDAY and JjcNewLadderDefine.JJC_NEWLADDER_ENDDAY >= tDate.wday then
  355. return true
  356. end
  357. return false
  358. else
  359. -- 在活动时间内
  360. if tDate.wday >= JjcNewLadderDefine.JJC_NEWLADDER_OPENDAY and JjcNewLadderDefine.JJC_NEWLADDER_ENDDAY >= tDate.wday then
  361. return nNowTime > nEndTime
  362. end
  363. -- 不在不处理
  364. return false
  365. end
  366. end
  367. -- 加入人物
  368. function JjcNewLadderDB_AddHuman(tData)
  369. local rank = JJCNEWLADDERDB_PLAYER_RANK[tData.uuid]
  370. if rank then
  371. return true
  372. end
  373. -- 存在久的数据
  374. local oldData = JjcNewLadderDB_GetDBDataByUid(tData.uuid)
  375. if oldData then
  376. print("[JjcNewLadderDB_AddHuman] 请求加入天梯赛, 存在该玩家旧的数据")
  377. JjcNewLadderDB_RemoveDB(tData.uuid)
  378. print("[JjcNewLadderDB_AddHuman] 请求加入天梯赛, 移除该玩家旧的数据完成")
  379. JjcNewLadderDB_RemoveCache(tData.uuid)
  380. end
  381. local nNowRank = #JJCNEWLADDERDB_ALL_RANK
  382. local nRank = nNowRank + 1
  383. local JjcDBData = {
  384. nIsHuman = 1, -- 是否是真人
  385. name = tData.name,
  386. uuid = tData.uuid,
  387. nServerID = tData.nSrcServerID,
  388. szServerName = tData.szServerName,
  389. headFrame = tData.headFrame,
  390. head = tData.head,
  391. time = os.time(),
  392. point = JjcNewLadderDefine.JJC_NEWLADDER_POINT,
  393. tRival = {},
  394. nInFight = 0,
  395. nLastFightTime = 0,
  396. zhandouli = tData.zhandouli,
  397. nRank = nRank
  398. }
  399. LuaMongo.insert(DB.db_jjcLadder, JjcDBData)
  400. JJCNEWLADDERDB_ALL_RANK[#JJCNEWLADDERDB_ALL_RANK + 1] = JjcDBData
  401. JjcNewLadderDB_SortRank()
  402. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_AddHuman] 玩家加入天梯赛活动 name = "..tData.name.." uuid = "..tData.uuid.." nServerID = "..tData.nSrcServerID)
  403. return true
  404. end
  405. -- 匹配对手
  406. function JjcNewLadderDB_MatchRival(uuid)
  407. local nNowRank = UUID_2_RANK[uuid]
  408. if not nNowRank then
  409. print("[JjcNewLadderDB_MatchRival] 匹配对手 不存在排行榜 重新匹配数据 uuid = "..uuid)
  410. nNowRank = 1000
  411. end
  412. local nMachRank = nNowRank
  413. if nNowRank > 1000 then
  414. nMachRank = 1000
  415. end
  416. local nMatchMinRank = math.max(nMachRank - 50, 1)
  417. local nMatchMaxRank = math.min(nMachRank + 10, 999)
  418. print("[JjcNewLadderDB_MatchRival] nMatchMinRank = "..nMatchMinRank.." nMatchMaxRank = "..nMatchMaxRank.." nMachRank = "..nMachRank)
  419. local tChoseID, nFindNum = {}, 0
  420. local bFindBig = true
  421. -- 前5特殊处理
  422. if nMachRank <= JJCLADDER_SPECIALRANK then
  423. bFindBig = false
  424. -- 不是第一名
  425. if nNowRank ~= 1 then
  426. for i = 1, JJCLADDER_SPECIALRANK, 1 do
  427. if i ~= nNowRank then
  428. tChoseID[i] = 1
  429. nFindNum = nFindNum + 1
  430. end
  431. end
  432. end
  433. end
  434. -- 找50次
  435. for i = 1, JJCLADDER_RANDNUM, 1 do
  436. local nFindRank = math.random(nMatchMinRank, nMatchMaxRank)
  437. if not tChoseID[nFindRank] and nFindRank ~= nNowRank then
  438. if bFindBig == true then
  439. if nFindRank < nMachRank then
  440. tChoseID[nFindRank] = 1
  441. nFindNum = nFindNum + 1
  442. end
  443. else
  444. tChoseID[nFindRank] = 1
  445. nFindNum = nFindNum + 1
  446. end
  447. end
  448. if nFindNum >= JJCLADDER_FINDBIGNUM then
  449. bFindBig = false
  450. end
  451. if nFindNum >= JJCLADDER_FINDRIVALNUM then
  452. break
  453. end
  454. end
  455. if nFindNum < 5 then
  456. print("[JjcNewLadderDB_MatchRival] 查找到的数量不足 5 \n")
  457. table.print_lua_table(tChoseID)
  458. return nil
  459. end
  460. local bAddRival = JjcNewLadderDB_AddRival(uuid, tChoseID)
  461. if false == bAddRival then
  462. print("[JjcNewLadderDB_MatchRival] 加入缓存中的对战列表失败")
  463. return nil
  464. end
  465. return tChoseID
  466. end
  467. -- 匹配一次对手
  468. function JjcNewLadderDB_MatchOneRival(uuid, tChoseRank)
  469. local nNowRank = UUID_2_RANK[uuid]
  470. local nMachRank = nNowRank
  471. if nNowRank < 1000 then
  472. nMachRank = 1000
  473. end
  474. local nMatchMinRank = math.max(nMachRank - 50, 1)
  475. local nMatchMaxRank = math.min(nMachRank + 10, 1000)
  476. for i = 1, JJCLADDER_RANDNUM, 1 do
  477. local nFindRank = math.random(nMatchMinRank, nMatchMaxRank)
  478. if not tChoseRank[nFindRank] then
  479. return nFindRank
  480. end
  481. end
  482. return -1
  483. end
  484. -- 通过uid获取对应的DB数据
  485. function JjcNewLadderDB_GetDBDataByuid(uuid)
  486. local nRank = UUID_2_RANK[uuid]
  487. if not nRank then
  488. return nil
  489. end
  490. return JJCNEWLADDERDB_ALL_RANK[nRank]
  491. end
  492. -- 通过排名获取对应的DB数据
  493. function JjcNewLadderDB_GetDBDataByRank(nRank)
  494. return JJCNEWLADDERDB_ALL_RANK[nRank]
  495. end
  496. function JjcNewLadderDB_GetRankByuid(uuid)
  497. return UUID_2_RANK[uuid]
  498. end
  499. function JjcNewLadderDB_GetPointByuid(uuid)
  500. local nRank = UUID_2_RANK[uuid]
  501. if not nRank then
  502. return 0
  503. end
  504. local tRankData = JJCNEWLADDERDB_ALL_RANK[nRank]
  505. if not tRankData then
  506. return 0
  507. end
  508. return tRankData.point
  509. end
  510. -- 增加积分点数
  511. function JjcNewLadderDB_AddPoint(uuid, nAddPointNum)
  512. local tRankData = JjcNewLadderDB_GetDBDataByuid(uuid)
  513. if tRankData then
  514. table.print_lua_table(tRankData)
  515. print("[JjcNewLadderDB_AddPoint] 增加积分 uuid = "..uuid.."\n")
  516. tRankData.point = tRankData.point + nAddPointNum
  517. table.print_lua_table(tRankData)
  518. print("[JjcNewLadderDB_AddPoint] 增加积分后 uuid = "..uuid.."\n")
  519. local tNewData = Util.copyTable(tRankData)
  520. tNewData._id = nil
  521. -- 更新DB数据
  522. JjcNewLadderDB_UpdateDBData(tNewData)
  523. JjcNewLadderDB_SortRank()
  524. end
  525. print("[JjcNewLadderDB_AddPoint] 排序结束打印新的数据 uuid = "..uuid.."\n")
  526. local tNewRankData = JjcNewLadderDB_GetDBDataByuid(uuid)
  527. if tNewRankData then
  528. table.print_lua_table(tNewRankData)
  529. print("[JjcNewLadderDB_AddPoint] 打印新的数据 uuid = "..uuid.."\n")
  530. end
  531. end
  532. -- 交换排名
  533. function JjcNewLadderDB_ExChangeRank(uuid, uuidEnemy)
  534. print("[JjcNewLadderDB_ExChangeRank] 进入交换排名")
  535. local tRankData = JjcNewLadderDB_GetDBDataByuid(uuid)
  536. local tRankEnemyData = JjcNewLadderDB_GetDBDataByuid(uuidEnemy)
  537. if not tRankData or not tRankEnemyData then
  538. print("[JjcNewLadderDB_ExChangeRank] 不存在对应的数据 uuid = "..uuid.." uuidEnemy = "..uuidEnemy)
  539. return
  540. end
  541. if tRankData.nRank > tRankEnemyData.nRank then
  542. print("[JjcNewLadderDB_ExChangeRank] 111 nRank = "..tRankData.nRank.." nRank2 = "..tRankEnemyData.nRank)
  543. local szText = "[JjcNewLadderDB_ExChangeRank] 开始交换排名 我方排名 nRank = "..tRankData.nRank.." 敌方排名 nEnemyRank = "..tRankEnemyData.nRank
  544. .. " name = "..tRankData.name.." nServerID = "..tRankData.nServerID
  545. if tRankEnemyData.nIsHuman == 1 then
  546. szText = szText.." 敌方为真人 name = "..tRankEnemyData.name.." nServerID = "..tRankEnemyData.nServerID
  547. end
  548. JjcNewLadderDB_WriteLog(szText)
  549. local nNewRank = tRankEnemyData.nRank
  550. tRankEnemyData.nRank = tRankData.nRank
  551. tRankData.nRank = nNewRank
  552. print("[JjcNewLadderDB_ExChangeRank] 222 nRank = "..tRankData.nRank.." nRank2 = "..tRankEnemyData.nRank)
  553. local tNewData = Util.copyTable(tRankData)
  554. tNewData._id = nil
  555. -- 更新DB数据
  556. print("[JjcNewLadderDB_ExChangeRank] 更新DB数据1 ")
  557. JjcNewLadderDB_UpdateDBData(tNewData)
  558. local tNewEnemyData = Util.copyTable(tRankEnemyData)
  559. tNewEnemyData._id = nil
  560. print("[JjcNewLadderDB_ExChangeRank] 更新DB数据2 ")
  561. -- 更新DB数据
  562. JjcNewLadderDB_UpdateDBData(tNewEnemyData)
  563. JjcNewLadderDB_SortRank()
  564. end
  565. end
  566. -- 发送对应的数据给奖励
  567. function JjcNewLadderDB_OnSendPlayerRank(uuid, nServerID, nRank)
  568. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_OnSendPlayerRank] 发送奖励 uuid = "..uuid.." nServerID = "..nServerID.." nRank = "..nRank)
  569. JjcNewLadderMiddle.JjcNewLadderMiddle_SendPrizeMail(uuid, nServerID, nRank)
  570. end
  571. -- 延迟时间 遍历排行榜 发送奖励
  572. function JjcNewLadderDB_OnTimeSendMail()
  573. -- 再排序一次
  574. JjcNewLadderDB_SortRank()
  575. print("[JjcNewLadderDB_OnTimeSendMail] 最终排序结束")
  576. local tLastRankInfo, tQueryWorShip = {}, {}
  577. for nRank = 1, JjcNewLadderDefine.JJC_NEWLADDER_SEND_RANKPRIZE_LEN, 1 do
  578. local tRankData = JJCNEWLADDERDB_ALL_RANK[nRank]
  579. if tRankData.nIsHuman == 1 then
  580. local nLaterTime = math.random(5, 10)
  581. local uuid, nServerID = tRankData.uuid, tRankData.nServerID
  582. Timer.addLater(nLaterTime, JjcNewLadderDB_OnSendPlayerRank, uuid, nServerID, nRank)
  583. print("[JjcNewLadderDB_OnTimeSendMail] 发送真人玩家邮件奖励数据 uuid = "..uuid.." nServerID = "..nServerID.." nRank = "..nRank.." nLaterTime = "..nLaterTime)
  584. -- 处理上一轮排名前三的玩家
  585. if JjcNewLadderDefine.JJCN_NEWLADDER_LASTRANK_INFO >= nRank then
  586. local tInfo =
  587. {
  588. head = tRankData.head,
  589. headFrame = tRankData.headFrame or 0,
  590. name = tRankData.name,
  591. szServerName = tRankData.szServerName,
  592. uuid = tRankData.uuid,
  593. nIsHuman = tRankData.nIsHuman,
  594. nServerID = tRankData.nServerID,
  595. worshipCnt = 0,
  596. }
  597. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_OnTimeSendMail] 插入前三排名是真人的玩家 name = "..tInfo.name.." uuid = "..tInfo.uuid.." nServerID = "..tInfo.nServerID)
  598. table.insert(tQueryWorShip, {uuid = tInfo.uuid, nServerID = tInfo.nServerID})
  599. table.insert(tLastRankInfo, tInfo)
  600. if JjcNewLadderDefine.JJCN_NEWLADDER_LASTRANK_INFO == nRank then
  601. CommonDB.SetJjcLadderLast3RankInfo(tLastRankInfo)
  602. JjcNewLadderDB_WriteLog("[JjcNewLadderDB_OnTimeSendMail] 插入前三数据完成")
  603. end
  604. end
  605. end
  606. end
  607. -- 请求对应的玩家的点赞数
  608. if nil ~= _G.next(tQueryWorShip) then
  609. JjcNewLadderMiddle.JjcNewLadderMiddle_QueryWorShip(tQueryWorShip)
  610. end
  611. end
  612. function JjcNewLadderDB_SendRankMail()
  613. if false == JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  614. return
  615. end
  616. local nLaterTime = math.random(10, 60)
  617. Timer.addLater(nLaterTime, JjcNewLadderDB_OnTimeSendMail)
  618. print("[JjcNewLadderDB_SendRankMail] 延迟 "..nLaterTime.." 秒发放排行榜奖励")
  619. end
  620. -------------------------------- 内部调用函数 ---------------------------