jjcNewLadderDB.lua 12 KB

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