OpenServerCompetition.lua 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. ---
  2. --- Created by zhouzhipeng.
  3. --- DateTime: 2024/11/11 上午11:13
  4. --- Desc:开服竞技
  5. ---
  6. OpenServerCompetition = {}
  7. local this = {}
  8. ---实时排行榜缓存
  9. local REAL_TIME_RANK = {}
  10. -- 上次刷新时间
  11. local LAST_REFRESH_TIME = 0
  12. local ROLE_DATA_REPAIR = "T$competition_data_repair"
  13. --- 刷新开服竞技排行
  14. function OpenServerCompetition.flushSortRank()
  15. local now = getbaseinfo("now")
  16. local cfgTime = tonumber(ConfigDataManager.getTableValue("cfg_global", "value", "id", 23001))
  17. if LAST_REFRESH_TIME ~= 0 and now - LAST_REFRESH_TIME < (cfgTime * 60 * 1000) then
  18. return
  19. end
  20. LAST_REFRESH_TIME = now
  21. local severOpenDays = getbaseinfo("serveropendays")
  22. for _, type in pairs(CompetitionType) do
  23. this.updateRankInfo(type, severOpenDays)
  24. end
  25. --local globalRankData = GlobalRankCompetitionData.get()
  26. --OpenServerCompetition.print("更新开服竞技排行", globalRankData)
  27. end
  28. --- 更新排行榜
  29. function this.updateRankInfo(type, severOpenDays)
  30. if OpenServerCompetition.checkCompetitionRank(type, severOpenDays) then
  31. return
  32. end
  33. local globalCompetitionData = GlobalCompetitionData.get()
  34. local actInfo = globalCompetitionData:getActInfoByType(type)
  35. --OpenServerCompetition.print("更新开服竞技排行 类型", type, "记录的数据", actInfo)
  36. if table.isNullOrEmpty(actInfo) then
  37. return
  38. end
  39. local sortRank = {}
  40. local rankLimitData = tonumber(ConfigDataManager.getTableValue("cfg_openSerCompetition", "ranklimitdata", "type",
  41. type))
  42. for _, info in pairs(actInfo) do
  43. if info.num < rankLimitData then
  44. goto continue
  45. end
  46. table.insert(sortRank, info)
  47. :: continue ::
  48. end
  49. table.sort(sortRank, function(a, b)
  50. if a.num == b.num then
  51. return a.updateTime < b.updateTime
  52. end
  53. return a.num > b.num
  54. end)
  55. local rankNumber = tonumber(ConfigDataManager.getTableValue("cfg_openSerCompetition", "ranknumber", "type", type))
  56. local rankInfo = {}
  57. local rankCount = table.count(sortRank)
  58. local rankSize = math.min(rankCount, rankNumber)
  59. local newRank = table.getTopN(rankSize, sortRank)
  60. local rank = 1
  61. for _, info in ipairs(newRank) do
  62. info.rank = rank
  63. rank = rank + 1
  64. table.insert(rankInfo, info)
  65. end
  66. local globalRankData = GlobalRankCompetitionData.get()
  67. globalRankData[type] = rankInfo
  68. globalRankData:save()
  69. --REAL_TIME_RANK[type] = rankInfo
  70. --OpenServerCompetition.print("更新开服竞技排行 类型", type, "满足上榜数量", rankCount, "配置排行榜数量", rankNumber, "上榜数量与配置排行数量 取最小", rankSize
  71. --, "存的排行缓存数据", rankInfo, "排行数据", sortRank)
  72. end
  73. function OpenServerCompetition.checkCompetitionRank(type, severOpenDays)
  74. local settleTime = ConfigDataManager.getTableValue("cfg_openSerCompetition", "ranksettlementtime",
  75. "type", type)
  76. if settleTime == nil or settleTime == "" then
  77. settleTime = 0
  78. end
  79. local rankSettlementTime = tonumber(settleTime)
  80. if severOpenDays >= rankSettlementTime then
  81. return true
  82. end
  83. return false
  84. end
  85. --- 发送开服竞技排行信息
  86. function OpenServerCompetition.sendCompetitionRankInfo(actor, msgData)
  87. local competitionType = tostring(msgData["type"])
  88. local rankInfo = this.getRankInfoByType(competitionType)
  89. local myInfo = this.buildMyInfo(actor, rankInfo, competitionType)
  90. sendluamsg(actor, LuaMessageIdToClient.RES_COMPETITION_RANK_INFO, {
  91. type = competitionType,
  92. myInfo = myInfo,
  93. rankInfo = rankInfo
  94. })
  95. OpenServerCompetition.print("发送开服竞技排行信息", type(competitionType), competitionType, "我的信息", myInfo, "排行信息", rankInfo)
  96. end
  97. function this.buildMyInfo(actor, rankInfo, type)
  98. local rank = 0
  99. for _, info in pairs(rankInfo) do
  100. if info.rid == actor:toString() then
  101. rank = info.rank
  102. end
  103. end
  104. local num = this.getMyNum(actor, type)
  105. return { myNum = num, rank = rank }
  106. end
  107. function this.getMyNum(actor, type)
  108. local competitionData = GlobalCompetitionData.get()
  109. local actInfo = competitionData:getActInfoByType(type)
  110. local info = actInfo[actor:toString()] or {}
  111. if type == CompetitionType.LEVEL then
  112. return info.num or 1
  113. end
  114. return info.num or 0
  115. end
  116. function this.getRankInfoByType(type)
  117. local globalRankData = GlobalRankCompetitionData.get()
  118. return globalRankData[type] or {}
  119. --[[ if table.isNullOrEmpty(REAL_TIME_RANK[type]) then
  120. OpenServerCompetition.print("测试测试11 获取的时候刷新了 刷新前:", REAL_TIME_RANK[type],"内容结束", type)
  121. this.updateRankInfo(type)
  122. OpenServerCompetition.print("测试测试11 获取的时候刷新了 刷新后", REAL_TIME_RANK[type],"内容结束", type)
  123. end
  124. return REAL_TIME_RANK[type] or {}]]
  125. end
  126. --- 登录触发
  127. function OpenServerCompetition.login(actor)
  128. RepairRoleData.action(actor, ROLE_DATA_REPAIR, 202412111423, OpenServerCompetition.repairCompetition, actor)
  129. OpenServerCompetition.sendAllCompetitionRankInfo(actor)
  130. end
  131. --- 修复竞技数据
  132. function OpenServerCompetition.repairCompetition(actor)
  133. local competitionType = CompetitionType.BRAVE_CHALLENGE
  134. local num = this.getMyNum(actor, competitionType)
  135. local lv = BraveTest.getBraveTestLv(actor)
  136. if num > 0 and lv ~= num then
  137. OpenServerCompetition.updateRankData(actor, competitionType, lv)
  138. info(actor, "玩家", actor, "开服竞技 修复数据 竞技排行 更新排行数据", competitionType, num, lv)
  139. end
  140. info(actor, "玩家", actor, "开服竞技 数据已修复", competitionType, num, lv)
  141. end
  142. --- 发送所有开服竞技排行信息
  143. function OpenServerCompetition.sendAllCompetitionRankInfo(actor)
  144. for _, type in pairs(CompetitionType) do
  145. if not OpenServerCompetition.isTerminate(type) then
  146. OpenServerCompetition.sendCompetitionRankInfo(actor, { type = type })
  147. OpenServerCompetition.sendAllSingleChallengeInfo(actor, type)
  148. end
  149. end
  150. end
  151. function OpenServerCompetition.sendAllSingleChallengeInfo(actor, type)
  152. -- 已领取的个人挑战记录
  153. local playerCompetitionData = PlayerCompetitionData.get(actor)
  154. local getAwardInfo = playerCompetitionData:getAwardInfo(type)
  155. local num = this.getMyNum(actor, type)
  156. this.sendOpenServerCompetitionInfo(actor, type, getAwardInfo, num)
  157. end
  158. --- 请求开服竞技个人挑战领取信息
  159. function OpenServerCompetition.reqSingleChallengeInfo(actor, msgData)
  160. local competitionType = tostring(msgData["type"])
  161. local playerCompetitionData = PlayerCompetitionData.get(actor)
  162. local getAwardInfo = playerCompetitionData:getAwardInfo(competitionType)
  163. local num = this.getMyNum(actor, competitionType)
  164. this.sendOpenServerCompetitionInfo(actor, competitionType, getAwardInfo, num)
  165. end
  166. --- 请求领取开服竞技个人挑战奖励
  167. function OpenServerCompetition.reqSingleChallengeAward(actor, msgData)
  168. local id = msgData["id"]
  169. local challengeCfg = ConfigDataManager.getById("cfg_openSerCompetition_challenge", id)
  170. if not challengeCfg then
  171. tipinfo(actor, "个人挑战配置不存在:" .. id)
  172. return
  173. end
  174. local competitionType = challengeCfg.challengegroup
  175. if OpenServerCompetition.isTerminate(competitionType) then
  176. tipinfo(actor, "活动未开启")
  177. return
  178. end
  179. local playerCompetitionData = PlayerCompetitionData.get(actor)
  180. local getAwardInfo = playerCompetitionData:getAwardInfo(competitionType)
  181. if table.hasKey(getAwardInfo, id) then
  182. tipinfo(actor, "个人挑战该奖励已领取")
  183. return
  184. end
  185. local num = this.getMyNum(actor, competitionType)
  186. if num < tonumber(challengeCfg.typedemandvalue) then
  187. tipinfo(actor, "个人挑战目标不满足")
  188. return
  189. end
  190. local reward_item = string.toIntIntMap(challengeCfg.challengereward, "#", "|")
  191. local severOpenDays = getbaseinfo("serveropendays")
  192. local challengeLimitTime = tonumber(ConfigDataManager.getTableValue("cfg_openSerCompetition", "challengelimittime",
  193. "type", competitionType))
  194. local isGet = false
  195. if severOpenDays < challengeLimitTime then
  196. local career = getbaseinfo(actor, "getbasecareer")
  197. string.putIntIntMap4Career(reward_item, career, challengeCfg.limittimereward, "#", "|")
  198. isGet = true
  199. OpenServerCompetition.print("开服竞技 获得限时奖励", reward_item)
  200. end
  201. getAwardInfo[id] = isGet
  202. playerCompetitionData:save(actor)
  203. --奖励进入背包
  204. additemmaptobag(actor, reward_item, 0, 9999, '开服竞技')
  205. GameTips.sendGetRewardMsg(actor, reward_item)
  206. info(actor, "玩家", actor, "开服竞技 领取个人挑战奖励 领取id:", id)
  207. this.sendOpenServerCompetitionInfo(actor, competitionType, getAwardInfo, num)
  208. end
  209. --- 请求购买开服竞技特惠礼包
  210. function OpenServerCompetition.reqBuyDiscountsGift(actor, msgData)
  211. local id = msgData["id"]
  212. local giftCfg = ConfigDataManager.getById("cfg_openSerCompetition_gift", id)
  213. if not giftCfg then
  214. tipinfo(actor, "特惠礼包配置不存在:" .. id)
  215. return
  216. end
  217. if not OpenServerCompetition.checkCount(actor, giftCfg.count) then
  218. tipinfo(actor, "礼包次数已上限")
  219. return
  220. end
  221. local costMap = string.toIntIntMap(giftCfg.buyconsume, "#", "|")
  222. if not Bag.checkCostMapBind(actor, costMap) then
  223. --背包道具不足
  224. noticeTip.noticeinfo(actor, StringIdConst.TEXT346)
  225. return
  226. end
  227. CountManager.count(actor, giftCfg.count, 1)
  228. Bag.costMapBind(actor, costMap)
  229. local reward_item = string.toIntIntMap(giftCfg.reward, "#", "|")
  230. --奖励进入背包
  231. additemmaptobag(actor, reward_item, 0, 9999, '开服竞技')
  232. info(actor, "玩家", actor, "开服竞技 购买开服竞技特惠礼包 购买id:", id)
  233. GameTips.sendGetRewardMsg(actor, reward_item)
  234. end
  235. function OpenServerCompetition.checkCount(actor, key)
  236. local c = CountManager.getCount(actor, key)
  237. if c and c:canAdd(1) then
  238. return true
  239. end
  240. info(actor, "玩家", actor, "购买次数已上限", "rechargeId", "countKey", key)
  241. return false
  242. end
  243. --- 响应开服竞技信息
  244. function this.sendOpenServerCompetitionInfo(actor, type, data, num)
  245. sendluamsg(actor, LuaMessageIdToClient.RES_SINGLE_CHALLENGE_INFO, {
  246. type = type,
  247. num = num,
  248. challengeAwardInfo = data
  249. })
  250. end
  251. --- 活动是否开启 false:未开启 true:开启
  252. function OpenServerCompetition.isOpen(actor, competitionType)
  253. local activityCondition = ConfigDataManager.getTableValue("cfg_openSerCompetition", "activitycondition", "type",
  254. competitionType)
  255. -- 校验活动是否开启
  256. return ConditionManager.Check(actor, activityCondition)
  257. end
  258. --- 是否结束 false:未结束 true:已结束
  259. function OpenServerCompetition.isTerminate(competitionType)
  260. local severOpenDays = getbaseinfo("serveropendays")
  261. local supplementReward = ConfigDataManager.getTableValue("cfg_openSerCompetition", "supplementreward", "type",
  262. competitionType)
  263. if string.isNullOrEmpty(supplementReward) then
  264. -- 配置错误 活动未开启 已结束
  265. info("开服竞技 cfg_openSerCompetition表supplementreward配置为空 类型:", competitionType, "当前开服天数:", severOpenDays)
  266. return true
  267. end
  268. -- 校验活动是否结束
  269. if severOpenDays < tonumber(supplementReward) then
  270. return false
  271. end
  272. return true
  273. end
  274. --- 竞技结算
  275. function OpenServerCompetition.competitionSettlement()
  276. this.competitionRankSettlement()
  277. this.personalChallengeSettle()
  278. end
  279. -- 竞技排行榜结算
  280. function this.competitionRankSettlement()
  281. local severOpenDays = getbaseinfo("serveropendays")
  282. local globalCompetitionData = GlobalCompetitionData.get()
  283. local update = false
  284. OpenServerCompetition.print("测试测试结算 触发0点开服竞技排行结算")
  285. for _, type in pairs(CompetitionType) do
  286. if globalCompetitionData:isSettlement(type) then
  287. OpenServerCompetition.print("测试测试结算 已结算排行结算")
  288. goto continue
  289. end
  290. local rankSettlementTime = tonumber(ConfigDataManager.getTableValue("cfg_openSerCompetition",
  291. "ranksettlementtime", "type", type))
  292. if rankSettlementTime ~= severOpenDays then
  293. OpenServerCompetition.print("测试测试结算 不等于结算当天 类型", type, "当前开服天数", severOpenDays, "配置结束天数", rankSettlementTime)
  294. goto continue
  295. end
  296. info("开服竞技排行结算 结算类型:", type, "当前开服天数:", severOpenDays, "配置结算天数:",rankSettlementTime)
  297. local name = ConfigDataManager.getTableValue("cfg_openSerCompetition", "name", "type", type)
  298. -- 根据缓存的排行发奖励
  299. local rankInfos = this.getRankInfoByType(type)
  300. for _, rankInfo in ipairs(rankInfos) do
  301. local success, result = xpcall(this.sendMailReward, debug.traceback, type, name, rankInfo)
  302. gameDebug.assertPrint(success, "开服竞技排行 发送邮件奖励异常!", result, "参数", type, name, rankInfo)
  303. end
  304. globalCompetitionData:setSettlement(type, true)
  305. update = true
  306. :: continue ::
  307. end
  308. --OpenServerCompetition.print("测试测试结算 结算成功")
  309. if update then
  310. globalCompetitionData:save()
  311. end
  312. end
  313. function this.sendMailReward(competitionType, name, rankInfo)
  314. local actor = getactor(rankInfo.rid)
  315. local rank = rankInfo.rank
  316. local rankReward = ConfigDataManager.getTableValue("cfg_openSerCompetition_rank", "rankreward", "rankgroup",
  317. competitionType, "rank", rank)
  318. local career = getbaseinfo(actor, "getbasecareer")
  319. local reward_item = string.toIntIntMap4Career(career, rankReward, "#", "|")
  320. sendconfigmailbyrid(actor, rankInfo.rid, MailConfig.COMPETITION_RANK_REWARD, reward_item, name .. "#" .. rank)
  321. info(actor,"玩家", actor, "开服竞技 竞技排行结算 发送奖励 类型:", competitionType, "排名", rank, "名字:", rankInfo.name)
  322. end
  323. -- 竞技个人挑战结算
  324. function this.personalChallengeSettle()
  325. local severOpenDays = getbaseinfo("serveropendays")
  326. local globalCompetitionData = GlobalCompetitionData.get()
  327. for _, type in pairs(CompetitionType) do
  328. OpenServerCompetition.print("type:", type)
  329. local supplementReward = tonumber(ConfigDataManager.getTableValue("cfg_openSerCompetition", "supplementreward",
  330. "type", type))
  331. OpenServerCompetition.print("supplementReward:", supplementReward)
  332. local name = ConfigDataManager.getTableValue("cfg_openSerCompetition", "name", "type", type)
  333. if supplementReward ~= severOpenDays then
  334. goto continue
  335. end
  336. local challengeCfgs = ConfigDataManager.getTable("cfg_openSerCompetition_challenge", "challengegroup", type)
  337. if table.isNullOrEmpty(challengeCfgs) then
  338. goto continue
  339. end
  340. local challengeLimitTime = tonumber(ConfigDataManager.getTableValue("cfg_openSerCompetition",
  341. "challengelimittime", "type", type))
  342. OpenServerCompetition.print("challengeLimitTime:", challengeLimitTime)
  343. local rankInfo = globalCompetitionData:getActInfoByType(type)
  344. OpenServerCompetition.print("rankInfo:", rankInfo)
  345. for rid, info in pairs(rankInfo) do
  346. local actor = getactor(info.rid)
  347. local career = getbaseinfo(actor, "getbasecareer")
  348. OpenServerCompetition.print("info:", info)
  349. local playerCompetitionData = PlayerCompetitionData.get(actor)
  350. OpenServerCompetition.print("playerCompetitionData:", playerCompetitionData)
  351. local getAwardInfo = playerCompetitionData:getAwardInfo(type)
  352. local num = this.getMyNum(actor, type)
  353. OpenServerCompetition.print("num:", num)
  354. local reward_item = {}
  355. for _, challengeCfg in ipairs(challengeCfgs) do
  356. local cfgId = tonumber(challengeCfg.id)
  357. local typeDemandValue = tonumber(challengeCfg.typedemandvalue)
  358. OpenServerCompetition.print("typeDemandValue:", typeDemandValue)
  359. local isGet = false -- 标记限时商品的领取情况
  360. if num >= typeDemandValue and not table.hasKey(getAwardInfo, cfgId) then
  361. -- 未领取过的个人奖励
  362. local comm_reward = string.toIntIntMap(challengeCfg.challengereward, "#", "|")
  363. if severOpenDays < challengeLimitTime then
  364. isGet = true
  365. string.putIntIntMap4Career(comm_reward, career, challengeCfg.limittimereward, "#", "|")
  366. end
  367. table.mergeTable(reward_item, comm_reward)
  368. getAwardInfo[cfgId] = isGet
  369. end
  370. end
  371. if not table.isNullOrEmpty(reward_item) then
  372. OpenServerCompetition.print("reward_item:", reward_item)
  373. playerCompetitionData:save(actor)
  374. sendconfigmailbyrid(actor, info.rid, MailConfig.COMPETITION_PERSONAL_REWARD, reward_item, name)
  375. end
  376. end
  377. :: continue ::
  378. end
  379. end
  380. function OpenServerCompetition.expCal(actor, exp)
  381. if OpenServerCompetition.isTerminate(CompetitionType.DEVIL_SQUARE) then
  382. return
  383. end
  384. callonserial(actor, "exp_cal", exp)
  385. end
  386. function exp_cal(actor, exp)
  387. local data = getsysvar("R$全服恶魔经验") or {}
  388. local lastExp = data[actor:toString()] or 0
  389. data[actor:toString()] = lastExp + exp
  390. setsysvar("R$全服恶魔经验", data)
  391. -- OpenServerCompetition.print("全服恶魔经验更新",data)
  392. end
  393. function OpenServerCompetition.expEffeciencyCal()
  394. local competitionType = CompetitionType.DEVIL_SQUARE
  395. if OpenServerCompetition.isTerminate(competitionType) then
  396. return
  397. end
  398. -- 服务器分钟心跳,没有线程问题
  399. local globalCompetitionData = GlobalCompetitionData.get()
  400. local effectData = globalCompetitionData:getActInfoByType(competitionType)
  401. local data = getsysvar("R$全服恶魔经验") or {}
  402. local updateTime = getbaseinfo("now")
  403. local update = false
  404. for rid, exp in pairs(data) do
  405. local info = effectData[rid] or {}
  406. local old = info.num or 0
  407. if exp > old then
  408. if not effectData[rid] then
  409. local actor = getactor(rid)
  410. info.rid = rid
  411. info.job = getbaseinfo(actor, "getbasecareer")
  412. info.name = getbaseinfo(actor, "rolename")
  413. end
  414. info.num = exp
  415. info.updateTime = updateTime
  416. effectData[rid] = info
  417. OpenServerCompetition.print("开服竞技 竞技排行 恶魔经验效率更新 类型", competitionType, "名字", info.name, "当前经验", exp)
  418. update = true
  419. end
  420. :: continue ::
  421. end
  422. if next(data) ~= nil then
  423. setsysvar("R$全服恶魔经验", {})
  424. end
  425. if update then
  426. globalCompetitionData:save()
  427. -- OpenServerCompetition.print("全服恶魔经验效率更新",effectData)
  428. end
  429. end
  430. --- 升级触发
  431. function OpenServerCompetition.levelUp(actor, level)
  432. OpenServerCompetition.updateRankData(actor, CompetitionType.LEVEL, level)
  433. end
  434. --- 增加活跃值
  435. function OpenServerCompetition.addActivityValue(actor, act_value)
  436. local value = tonumber(act_value)
  437. if value < 0 then
  438. OpenServerCompetition.print("开服竞技 活跃值活跃值小于0")
  439. return
  440. end
  441. local competitionType = CompetitionType.ACTIVE
  442. local oldNum = this.getMyNum(actor, competitionType)
  443. local number = oldNum + value
  444. OpenServerCompetition.updateRankData(actor, competitionType, number)
  445. end
  446. --- 更新套装阶数
  447. function OpenServerCompetition.updateSuitStageNum(actor)
  448. local equips = getputonequipinfo(actor)
  449. if next(equips) == nil then
  450. return
  451. end
  452. OpenServerCompetition.print("更新套装阶数 开始", equips)
  453. local suitStage = 0
  454. for _, equip in pairs(equips) do
  455. local id = equip.id
  456. local score = equip.score
  457. if score ~= 350 then
  458. goto continue
  459. end
  460. local wearBar = tonumber(gameequip.wearBar(equip.equipindex))
  461. OpenServerCompetition.print("更新套装阶数 穿戴拦", wearBar)
  462. if wearBar ~= 1 and wearBar ~= 2 then
  463. OpenServerCompetition.print("更新套装阶数 穿戴拦 从这里跑了")
  464. goto continue
  465. end
  466. local rank = tonumber(ConfigDataManager.getTableValue("cfg_item", "rank", "id", equip.cfgid))
  467. suitStage = suitStage + rank
  468. OpenServerCompetition.print("更新套装阶数 是套装装备", equip, equip.cfgid, rank, suitStage)
  469. :: continue ::
  470. end
  471. local competitionType = CompetitionType.SUIT
  472. local number = this.getMyNum(actor, competitionType)
  473. OpenServerCompetition.print("更新套装阶数 中", number, suitStage)
  474. if suitStage <= number then
  475. return
  476. end
  477. OpenServerCompetition.updateRankData(actor, competitionType, suitStage)
  478. end
  479. --- 更新排行数据
  480. function OpenServerCompetition.updateRankData(actor, competitionType, number)
  481. if OpenServerCompetition.isTerminate(competitionType) then
  482. return
  483. end
  484. --if not OpenServerCompetition.isOpen(actor, competitionType) then
  485. -- OpenServerCompetition.print("开服竞技 竞技排行 更新排行数据 关闭", competitionType)
  486. -- return
  487. --end
  488. if competitionType == CompetitionType.ANGEL or competitionType == CompetitionType.CARDSCORE then
  489. local result = this.checkUpdata(actor, competitionType, number)
  490. if not result then
  491. -- 低于历史最,不更新
  492. return
  493. end
  494. this.saveAngelOrCard(actor, competitionType, number)
  495. end
  496. callonserial(actor, "update_rank_data", competitionType, number)
  497. local playerCompetitionData = PlayerCompetitionData.get(actor)
  498. local getAwardInfo = playerCompetitionData:getAwardInfo(competitionType)
  499. this.sendOpenServerCompetitionInfo(actor, competitionType, getAwardInfo, tonumber(number))
  500. end
  501. function update_rank_data(actor, competitionType, number)
  502. local now = getbaseinfo(actor, "now")
  503. local globalCompetitionData = GlobalCompetitionData.get()
  504. local actInfo = globalCompetitionData:getActInfoByType(competitionType)
  505. local rid = actor:toString()
  506. local activityInfo = actInfo[rid] or {}
  507. if not actInfo[rid] then
  508. activityInfo.rid = rid
  509. activityInfo.job = getbaseinfo(actor, "getbasecareer")
  510. activityInfo.name = getbaseinfo(actor, "rolename")
  511. end
  512. activityInfo.num = number
  513. activityInfo.updateTime = now
  514. actInfo[rid] = activityInfo
  515. info(actor, "玩家", actor, "开服竞技 竞技排行 更新排行数据", competitionType, activityInfo.name, number)
  516. globalCompetitionData:save()
  517. end
  518. function OpenServerCompetition.combineglobalvar(varName, varData)
  519. GlobalCompetitionData.save({})
  520. GlobalRankCompetitionData.save({})
  521. setsysvar("R$全服恶魔经验", {})
  522. end
  523. PlayerCompetitionData = {}
  524. PlayerCompetitionData.__index = PlayerCompetitionData
  525. local function _playerCompetitionDbKey()
  526. return "T$OPEN_SERVER_COMPETITION"
  527. end
  528. function PlayerCompetitionData.get(actor)
  529. local obj = getplaydef(actor, _playerCompetitionDbKey())
  530. return setmetatable(obj or {}, PlayerCompetitionData)
  531. end
  532. function PlayerCompetitionData:save(actor)
  533. setplaydef(actor, _playerCompetitionDbKey(), self);
  534. end
  535. function PlayerCompetitionData:getDataByType(competitionType)
  536. if not self[competitionType] then
  537. self[competitionType] = {}
  538. end
  539. return self[competitionType]
  540. end
  541. function PlayerCompetitionData:getAwardInfo(competitionType)
  542. local data = self:getDataByType(competitionType)
  543. if not data.getAwardInfo then
  544. data.getAwardInfo = {}
  545. end
  546. return data.getAwardInfo
  547. end
  548. GlobalCompetitionData = {}
  549. GlobalCompetitionData.__index = GlobalCompetitionData
  550. local function _globalCompetitionDbKey()
  551. return "R$OPEN_SERVER_COMPETITION"
  552. end
  553. function GlobalCompetitionData.getKey()
  554. return _globalCompetitionDbKey()
  555. end
  556. function GlobalCompetitionData.get()
  557. local obj = getsysvar(_globalCompetitionDbKey())
  558. return setmetatable(obj or {}, GlobalCompetitionData)
  559. end
  560. function GlobalCompetitionData:save()
  561. setsysvar(_globalCompetitionDbKey(), self)
  562. end
  563. function GlobalCompetitionData:getDataByType(competitionType)
  564. if not self[competitionType] then
  565. self[competitionType] = {}
  566. end
  567. return self[competitionType]
  568. end
  569. function GlobalCompetitionData:getActInfoByType(competitionType)
  570. local data = self:getDataByType(competitionType)
  571. if not data.actInfo then
  572. data.actInfo = {}
  573. end
  574. return data.actInfo
  575. end
  576. function GlobalCompetitionData:isSettlement(competitionType)
  577. local data = self:getDataByType(competitionType)
  578. return data.isSettlement or false
  579. end
  580. function GlobalCompetitionData:setSettlement(competitionType, isSettlement)
  581. local data = self:getDataByType(competitionType)
  582. data.isSettlement = isSettlement
  583. end
  584. GlobalRankCompetitionData = {}
  585. GlobalRankCompetitionData.__index = GlobalRankCompetitionData
  586. local function _globalRankCompetitionDbKey()
  587. return "R$OPEN_SERVER_COMPETITION_RANK"
  588. end
  589. function GlobalRankCompetitionData.get()
  590. local obj = getsysvar(_globalRankCompetitionDbKey())
  591. return setmetatable(obj or {}, GlobalRankCompetitionData)
  592. end
  593. function GlobalRankCompetitionData:save()
  594. setsysvar(_globalRankCompetitionDbKey(), self)
  595. end
  596. function this.checkUpdata(actor, competitionType, num)
  597. local value = this.getAngelOrCard(actor, competitionType)
  598. if num > value then
  599. return true
  600. end
  601. return false
  602. end
  603. function this.saveAngelOrCard(actor, competitionType, num)
  604. local data = getplaydef(actor, "T$angelOrCard") or {}
  605. data[competitionType] = num
  606. setplaydef(actor, "T$angelOrCard", data)
  607. end
  608. function this.getAngelOrCard(actor, competitionType)
  609. local data = getplaydef(actor, "T$angelOrCard") or {}
  610. return data[competitionType] or 0
  611. end
  612. --- 打印日志
  613. local isPrintLog = true
  614. function OpenServerCompetition.print(...)
  615. if isPrintLog then
  616. return
  617. end
  618. gameDebug.print(...)
  619. end
  620. function openservercompetitiontest(actor, id, competitionType)
  621. OpenServerCompetition.print(actor, "开服竞技测试", id, type(competitionType))
  622. local severOpenDays = getbaseinfo("serveropendays")
  623. local updateTime = getbaseinfo("now")
  624. OpenServerCompetition.print("开服天数", severOpenDays, "当前时间", updateTime)
  625. --this.updateRankInfo(competitionType)
  626. --OpenServerCompetition.sendCompetitionRankInfo(actor, {type= competitionType })
  627. local globalCompetitionData = GlobalCompetitionData.get()
  628. OpenServerCompetition.print(actor, "开服竞技测试结束", globalCompetitionData)
  629. end
  630. function testpersonalreward(actor)
  631. this.personalChallengeSettle()
  632. end
  633. -- 注册登录事件
  634. LoginEventListerTable:eventLister("0", "开服竞技排行", OpenServerCompetition.login)
  635. -- 注册等级提升事件
  636. LevelUpEventListerTable:eventLister("0", "开服竞技排行", OpenServerCompetition.levelUp)