jjcNewLadderDB.lua 25 KB

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