jjcNewLadderDB.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  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 nServerOffSet = 810538 -- 配置中服务器ID偏移量
  20. JJCNEWLADDERDB_PLAYER_RANK = {} -- 天梯赛真人对应排名
  21. JJCNEWLADDERDB_ROBOT_RANK = {} -- 机器人对应排名信息
  22. JJCNEWLADDERDB_ALL_RANK = {} -- 天梯赛排行榜信息
  23. UUID_2_RANK = {}
  24. local nRandNum = 50 -- 随机次数,防止找到重复的
  25. local nFindRivalNum = 5 -- 匹配的对手
  26. local Jjc_QueryByUuid = {uuid = nil} -- DB查询数据
  27. -------------------------------- 以下是战区归宿的第一个服操作 ---------------------------
  28. -- 获取战区服务器ID
  29. function JjcNewLadderDB_ConfServerID2TrueServerID(nServerIDConf)
  30. return nServerIDConf + nServerOffSet - 1
  31. end
  32. -- 获取战区配置服务器ID
  33. function JjcNewLadderDB_TrueServerID2ConfServerID(nServerID)
  34. return nServerID - nServerOffSet + 1
  35. end
  36. -- 判断是否是战区所属的第一个服
  37. local function JjcNewLadderDB_IsFirstServer(nServerID)
  38. local nServerIDConf = JjcNewLadderDB_TrueServerID2ConfServerID(nServerID)
  39. print("[JjcNewLadderDB_IsFirstServer] nServerIDConf = "..nServerIDConf)
  40. local bRet = false
  41. for _, v in ipairs(WarZoneConf.group) do
  42. print("[JjcNewLadderDB_IsFirstServer] nMinServerID = "..v.nMinServerID)
  43. if v.nMinServerID == nServerIDConf then
  44. bRet = true
  45. break
  46. end
  47. -- 大于了,没必要找直接返回
  48. if v.nMinServerID > nServerIDConf then
  49. break
  50. end
  51. end
  52. return bRet
  53. end
  54. -- 移除数据
  55. local function JjcNewLadderDB_RemoveDB(uuid)
  56. if not uuid then return end
  57. Jjc_QueryByUuid.uuid = uuid
  58. LuaMongo.remove(DB.db_jjcLadder, QueryByUuid)
  59. end
  60. -- 更新数据
  61. local function JjcNewLadderDB_UpdateData(tRankData)
  62. if not tRankData.uuid then return end
  63. QueryByUuid.uuid = tRankData.uuid
  64. LuaMongo.update(DB.db_jjcLadder, QueryByUuid, tRankData)
  65. end
  66. -- 插入数据
  67. local function JjcNewLadderDB_InsertData(tRankData)
  68. LuaMongo.insert(DB.db_jjcLadder, tRankData)
  69. end
  70. -- 判断是否是NPC
  71. local function JjcNewLadderDB_isNpc(tRankData)
  72. if tRankData.nPoint and tRankData.nMonsterOutID then
  73. return true
  74. end
  75. return false
  76. end
  77. local function JjcNewLadderDB_AddNpc(tNpcConfig, nID)
  78. local jjcData = {}
  79. local r = math.random(1, #tNpcConfig.monsterOutID)
  80. jjcData.monsterOutID = tNpcConfig.monsterOutID[r]
  81. jjcData.lv = 50
  82. jjcData.head = CreateRole.getRandomHead()
  83. jjcData.name = CreateRole.getRandomName()
  84. jjcData.body = CreateRole.getRandomBody()
  85. jjcData.identity = CreateRole.getFakeIdentityMax()
  86. jjcData.point = tNpcConfig.initPoint
  87. jjcData.zhandouli = math.random(tNpcConfig.zhandouli[1], tNpcConfig.zhandouli[2])
  88. jjcData.time = os.time()
  89. jjcData.uuid = nID
  90. jjcData.nIsHuman = 0
  91. jjcData.nServerID = Config.SVR_INDEX
  92. jjcData.ServerName = "寻宝"..Config.NEW_SVR_INDEX.."区"
  93. jjcData.nInFight = 0
  94. jjcData.nLastFightTime = 0
  95. LuaMongo.insert(DB.db_jjcLadder, jjcData)
  96. JJCNEWLADDERDB_ALL_RANK[#JJCNEWLADDERDB_ALL_RANK + 1] = jjcData
  97. if #JJCNEWLADDERDB_ROBOT_RANK < JjcNewLadderDefine.JJC_NEWLADDER_ROBOT_NUM then
  98. JJCNEWLADDERDB_ROBOT_RANK[#JJCNEWLADDERDB_ROBOT_RANK + 1] = jjcData
  99. end
  100. print("[JjcNewLadderDB_AddNpc] 初始化机器人成功 nID = "..nID)
  101. end
  102. -- 初始化机器人数据
  103. local function JjcNewLadderDB_InitRobot()
  104. if false == JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  105. return
  106. end
  107. print("[JjcNewLadderDB_InitRobot] 初始化机器人数据开始")
  108. -- 生成NPC数据
  109. local nID = 1
  110. for _, npcConfig in ipairs(JjcExcel.skyladdernpc) do
  111. for i = 1, npcConfig.cnt do
  112. JjcNewLadderDB_AddNpc(npcConfig, nID)
  113. nID = nID + 1
  114. end
  115. end
  116. end
  117. local function JjcNewLadderDB_ownCmp(a, b)
  118. if a.point ~= b.point then
  119. return a.point > b.point
  120. end
  121. return a.time < b.time
  122. end
  123. -- 进行排序
  124. local function JjcNewLadderDB_SortRank()
  125. if #JJCNEWLADDERDB_ALL_RANK > 1 then
  126. table.sort(JJCNEWLADDERDB_ALL_RANK, JjcNewLadderDB_ownCmp)
  127. end
  128. print("[JjcNewLadderDB_SortRank] 排序结束")
  129. for rank = 1, #JJCNEWLADDERDB_ALL_RANK do
  130. local uuid = JJCNEWLADDERDB_ALL_RANK[rank].uuid
  131. UUID_2_RANK[uuid] = rank
  132. end
  133. end
  134. -- 战区第一个服清理数据
  135. local function JjcNewLadderDB_FirstServerRest(nOperate)
  136. JJCNEWLADDERDB_PLAYER_RANK = {}
  137. JJCNEWLADDERDB_ROBOT_RANK = {}
  138. JJCNEWLADDERDB_ALL_RANK = {}
  139. UUID_2_RANK = {}
  140. LuaMongo.remove(DB.db_jjcLadder)
  141. -- for i = 1, nLen, 1 do
  142. -- local tRankData = JJCNEWLADDERDB_ALL_RANK[i]
  143. -- if false == JjcNewLadderDB_isNpc(tRankData) then
  144. -- JjcNewLadderDB_RemoveDB(tRankData.uuid)
  145. -- end
  146. -- JJCNEWLADDERDB_ALL_RANK[i] = nil
  147. -- end
  148. --
  149. -- 初始化机器人
  150. if true == nOperate then
  151. print("[JjcNewLadderDB_FirstServerRest] 初始化机器人数据")
  152. JjcNewLadderDB_InitRobot()
  153. end
  154. -- 进行排序和映射
  155. JjcNewLadderDB_SortRank()
  156. end
  157. -- 根据 uuid从db中取data
  158. local function JjcNewLadderDB_GetDBDataByUid(uuid)
  159. -- MiddleRankQueryForData = {nRankType = 1, nRankSubType = 1, nServerKey = 1 ,uuid = 1}
  160. Jjc_QueryByUuid.uuid = uuid
  161. local data = {}
  162. LuaMongo.find(DB.db_jjcLadder, Jjc_QueryByUuid)
  163. return LuaMongo.next(data) and data
  164. end
  165. -- 更新DB数据
  166. local function JjcNewLadderDB_UpdateDBData(data)
  167. local oldData = JjcNewLadderDB_GetDBDataByUid(data.uuid)
  168. if oldData then
  169. Jjc_QueryByUuid.uuid = data.uuid
  170. LuaMongo.update(DB.db_jjcLadder, Jjc_QueryByUuid, data)
  171. print("[JjcNewLadderDB_UpdateDBData] 存在旧数据进行更新")
  172. else
  173. LuaMongo.insert(DB.db_jjcLadder, data)
  174. print("[JjcNewLadderDB_UpdateDBData] 不存在旧数据直接进行插入")
  175. end
  176. end
  177. -- 初始化数据
  178. function JjcNewLadderDB_Init()
  179. if JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  180. JjcNewLadderDB_FirstServerRest(true)
  181. end
  182. -- 清理录像
  183. CombatVideo.cleanJJCLadderVideo()
  184. end
  185. -- 判断是否为空
  186. local function JjcNewLadderDB_isEmpty()
  187. LuaMongo.find(DB.db_jjcLadder)
  188. local data = {}
  189. if not LuaMongo.next(data) then
  190. return true
  191. end
  192. return false
  193. end
  194. -- 加载数据
  195. local function JjcNewLadderDB_LoadData()
  196. LuaMongo.find(DB.db_jjcLadder)
  197. while true do
  198. local data = {}
  199. if not LuaMongo.next(data) then
  200. break
  201. end
  202. if data.point then
  203. JJCNEWLADDERDB_ALL_RANK[#JJCNEWLADDERDB_ALL_RANK + 1] = data
  204. else
  205. print("[JjcNewLadderDB_LoadData] 居然存在没有积分的 数据 uuid = "..data.uuid)
  206. end
  207. end
  208. print("[JjcNewLadderDB_LoadData] 加载数据完成,共加载 "..#JJCNEWLADDERDB_ALL_RANK)
  209. -- 加载完排序
  210. JjcNewLadderDB_SortRank()
  211. print("[JjcNewLadderDB_LoadData] 排序完成")
  212. for i = 1, #JJCNEWLADDERDB_ALL_RANK do
  213. if #JJCNEWLADDERDB_ROBOT_RANK >= JjcNewLadderDefine.JJC_NEWLADDER_ROBOT_NUM then
  214. break
  215. end
  216. local tRankData = JJCNEWLADDERDB_ALL_RANK[i]
  217. if tRankData.nIsHuman == 1 then
  218. JJCNEWLADDERDB_ROBOT_RANK[#JJCNEWLADDERDB_ROBOT_RANK + 1] = tRankData
  219. end
  220. end
  221. end
  222. -- 起服操作
  223. function JjcNewLadderDB_initAfterStart()
  224. if _G.is_middle == true then
  225. return
  226. end
  227. print("[JjcNewLadderDB_initAfterStart] DB数据开始初始化")
  228. if true == JjcNewLadderDB_IsFirstServer(Config.SVR_INDEX) then
  229. print("[JjcNewLadderDB_initAfterStart] 是首个服进行DB数据操作")
  230. if true == JjcNewLadderDB_isEmpty() then
  231. print("[JjcNewLadderDB_initAfterStart] DB数据为空进行初始化机器人数据")
  232. JjcNewLadderDB_Init()
  233. else
  234. print("[JjcNewLadderDB_initAfterStart] DB数据不为空进行加载DB数据")
  235. JjcNewLadderDB_LoadData()
  236. end
  237. else
  238. print("[JjcNewLadderDB_initAfterStart] 不是首个服返回")
  239. end
  240. end
  241. -- 定时操作
  242. function JjcNewLadderDB_OnHourOpen()
  243. JjcNewLadderDB_Init()
  244. end
  245. -------------------------------- 战区归宿的第一个服操作结束 ---------------------------
  246. -------------------------------- 内部调用函数 ---------------------------
  247. -- 加入匹配数据
  248. local function JjcNewLadderDB_AddRival(uuid, tChoseRankID)
  249. local nNowRank = UUID_2_RANK[uuid]
  250. local tRankData = JJCNEWLADDERDB_ALL_RANK[nNowRank]
  251. if not tRankData then
  252. return false
  253. end
  254. tRankData.tRival = {}
  255. for nRank, _ in pairs(tChoseRankID) do
  256. local tChoseRankData = JJCNEWLADDERDB_ALL_RANK[nRank]
  257. local uuidChose, nIsHuman = tChoseRankData.uuid, tChoseRankData.nIsHuman
  258. if not uuidChose or not nIsHuman then
  259. tRankData.tRival = {}
  260. return false
  261. end
  262. table.insert(tRankData.tRival, {uuid = uuidChose, nIsHuman = nIsHuman})
  263. end
  264. return true
  265. end
  266. function JjcNewLadderDB_CheckIsReset()
  267. local nNowTime = os.time()
  268. local nEndTime = CommonDB.GetJjcLadderEndTime()
  269. if 0 >= nEndTime then
  270. local tDate = os.date("*t",nNowTime)
  271. if tDate.wday >= JjcNewLadderDefine.JJC_NEWLADDER_OPENDAY and JjcNewLadderDefine.JJC_NEWLADDER_OPENDAY <= tDate.wday then
  272. return true
  273. end
  274. return false
  275. else
  276. return nNowTime > nEndTime
  277. end
  278. end
  279. -- 加入人物
  280. function JjcNewLadderDB_AddHuman(tData)
  281. local rank = JJCNEWLADDERDB_PLAYER_RANK[tData.uuid]
  282. if rank then
  283. return true
  284. end
  285. local JjcDBData = {
  286. nIsHuman = 1, -- 是否是真人
  287. name = tData.name,
  288. uuid = tData.uuid,
  289. nServerID = tData.nSrcServerID,
  290. szServerName = tData.szServerName,
  291. headFrame = tData.headFrame,
  292. head = tData.head,
  293. time = os.time(),
  294. point = JjcNewLadderDefine.JJC_NEWLADDER_POINT,
  295. tRival = {},
  296. nInFight = 0,
  297. nLastFightTime = 0
  298. -- zhandouli = tData.zhandouli
  299. }
  300. LuaMongo.insert(DB.db_jjc, JjcDBData)
  301. JJCNEWLADDERDB_ALL_RANK[#JJCNEWLADDERDB_ALL_RANK + 1] = JjcDBData
  302. JjcNewLadderDB_SortRank()
  303. return true
  304. end
  305. -- 匹配对手
  306. function JjcNewLadderDB_MatchRival(uuid)
  307. local nNowRank = UUID_2_RANK[uuid]
  308. local nMachRank = nNowRank
  309. if nNowRank < 1000 then
  310. nMachRank = 1000
  311. end
  312. local nMatchMinRank = math.max(nMachRank - 50, 1)
  313. local nMatchMaxRank = math.min(nMachRank + 10, 1000)
  314. local tChoseID, nFindNum = {}, 0
  315. -- 找50次
  316. for i = 1, nRandNum, 1 do
  317. local nFindRank = math.random(nMatchMinRank, nMatchMaxRank)
  318. if not tChoseID[nFindRank] then
  319. tChoseID[nFindRank] = 1
  320. nFindNum = nFindNum + 1
  321. end
  322. if nFindNum >= nFindRivalNum then
  323. break
  324. end
  325. end
  326. if nFindNum < 5 then
  327. return nil
  328. end
  329. local bAddRival = JjcNewLadderDB_AddRival(uuid, tChoseID)
  330. if false == bAddRival then
  331. return nil
  332. end
  333. return tChoseID
  334. end
  335. -- 匹配一次对手
  336. function JjcNewLadderDB_MatchOneRival(uuid, tChoseRank)
  337. local nNowRank = UUID_2_RANK[uuid]
  338. local nMachRank = nNowRank
  339. if nNowRank < 1000 then
  340. nMachRank = 1000
  341. end
  342. local nMatchMinRank = math.max(nMachRank - 50, 1)
  343. local nMatchMaxRank = math.min(nMachRank + 10, 1000)
  344. for i = 1, nRandNum, 1 do
  345. local nFindRank = math.random(nMatchMinRank, nMatchMaxRank)
  346. if not tChoseRank[nFindRank] then
  347. return nFindRank
  348. end
  349. end
  350. return -1
  351. end
  352. -- 通过uid获取对应的DB数据
  353. function JjcNewLadderDB_GetDBDataByuid(uuid)
  354. local nRank = UUID_2_RANK[uuid]
  355. if not nRank then
  356. return nil
  357. end
  358. return JJCNEWLADDERDB_ALL_RANK[nRank]
  359. end
  360. -- 通过排名获取对应的DB数据
  361. function JjcNewLadderDB_GetDBDataByRank(nRank)
  362. return JJCNEWLADDERDB_ALL_RANK[nRank]
  363. end
  364. function JjcNewLadderDB_GetRankByuid(uuid)
  365. return UUID_2_RANK[uuid]
  366. end
  367. -- 增加积分点数
  368. function JjcNewLadderDB_AddPoint(uuid, nAddPointNum)
  369. local tRankData = JjcNewLadderDB_GetDBDataByuid(uuid)
  370. if tRankData then
  371. tRankData.point = tRankData.point + nAddPointNum
  372. -- 更新DB数据
  373. JjcNewLadderDB_UpdateDBData(tRankData)
  374. JjcNewLadderDB_SortRank()
  375. end
  376. end
  377. -- 发送对应的数据给奖励
  378. function JjcNewLadderDB_OnSendPlayerRank(uuid, nServerID, nRank)
  379. JjcNewLadderMiddle.JjcNewLadderMiddle_SendPrizeMail(uuid, nServerID, nRank)
  380. end
  381. -- 延迟时间 遍历排行榜 发送奖励
  382. function JjcNewLadderDB_OnTimeSendMail()
  383. -- 再排序一次
  384. JjcNewLadderDB_SortRank()
  385. for nRank = 1, JjcNewLadderDefine.JJC_NEWLADDER_SEND_RANKPRIZE_LEN, 1 do
  386. local tRankData = JJCNEWLADDERDB_ALL_RANK[nRank]
  387. if tRankData.nIsHuman == 1 then
  388. local nLaterTime = math.random(5, 10)
  389. local uuid, nServerID = tRankData.uuid, tRankData.nServerID
  390. Timer.addLater(nLaterTime, JjcNewLadderDB_OnSendPlayerRank, uuid, nServerID, nRank)
  391. end
  392. end
  393. end
  394. function JjcNewLadderDB_SendRankMail()
  395. local nLaterTime = math.random(10, 60)
  396. Timer.addLater(nLaterTime, JjcNewLadderDB_OnTimeSendMail)
  397. end
  398. -------------------------------- 内部调用函数 ---------------------------