OpenServerCompetition.lua 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  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. local data = getsysvar("R$全服恶魔经验") or {}
  385. local lastExp = data[actor:toString()] or 0
  386. data[actor:toString()] = lastExp + exp
  387. setsysvar("R$全服恶魔经验", data)
  388. -- OpenServerCompetition.print("全服恶魔经验更新",data)
  389. end
  390. function OpenServerCompetition.expEffeciencyCal()
  391. local competitionType = CompetitionType.DEVIL_SQUARE
  392. if OpenServerCompetition.isTerminate(competitionType) then
  393. return
  394. end
  395. local globalCompetitionData = GlobalCompetitionData.get()
  396. local effectData = globalCompetitionData:getActInfoByType(competitionType)
  397. local data = getsysvar("R$全服恶魔经验") or {}
  398. local updateTime = getbaseinfo("now")
  399. local update = false
  400. for rid, exp in pairs(data) do
  401. local info = effectData[rid] or {}
  402. local old = info.num or 0
  403. if exp > old then
  404. if not effectData[rid] then
  405. local actor = getactor(rid)
  406. info.rid = rid
  407. info.job = getbaseinfo(actor, "getbasecareer")
  408. info.name = getbaseinfo(actor, "rolename")
  409. end
  410. info.num = exp
  411. info.updateTime = updateTime
  412. effectData[rid] = info
  413. OpenServerCompetition.print("开服竞技 竞技排行 恶魔经验效率更新 类型", competitionType, "名字", info.name, "当前经验", exp)
  414. update = true
  415. end
  416. :: continue ::
  417. end
  418. if next(data) ~= nil then
  419. setsysvar("R$全服恶魔经验", {})
  420. end
  421. if update then
  422. globalCompetitionData:save()
  423. -- OpenServerCompetition.print("全服恶魔经验效率更新",effectData)
  424. end
  425. end
  426. --- 升级触发
  427. function OpenServerCompetition.levelUp(actor, level)
  428. OpenServerCompetition.updateRankData(actor, CompetitionType.LEVEL, level)
  429. end
  430. --- 增加活跃值
  431. function OpenServerCompetition.addActivityValue(actor, act_value)
  432. local value = tonumber(act_value)
  433. if value < 0 then
  434. OpenServerCompetition.print("开服竞技 活跃值活跃值小于0")
  435. return
  436. end
  437. local competitionType = CompetitionType.ACTIVE
  438. local oldNum = this.getMyNum(actor, competitionType)
  439. local number = oldNum + value
  440. OpenServerCompetition.updateRankData(actor, competitionType, number)
  441. end
  442. --- 更新套装阶数
  443. function OpenServerCompetition.updateSuitStageNum(actor)
  444. local equips = getputonequipinfo(actor)
  445. if next(equips) == nil then
  446. return
  447. end
  448. OpenServerCompetition.print("更新套装阶数 开始", equips)
  449. local suitStage = 0
  450. for _, equip in pairs(equips) do
  451. local id = equip.id
  452. local score = equip.score
  453. if score ~= 350 then
  454. goto continue
  455. end
  456. local wearBar = tonumber(gameequip.wearBar(equip.equipindex))
  457. OpenServerCompetition.print("更新套装阶数 穿戴拦", wearBar)
  458. if wearBar ~= 1 and wearBar ~= 2 then
  459. OpenServerCompetition.print("更新套装阶数 穿戴拦 从这里跑了")
  460. goto continue
  461. end
  462. local rank = tonumber(ConfigDataManager.getTableValue("cfg_item", "rank", "id", equip.cfgid))
  463. suitStage = suitStage + rank
  464. OpenServerCompetition.print("更新套装阶数 是套装装备", equip, equip.cfgid, rank, suitStage)
  465. :: continue ::
  466. end
  467. local competitionType = CompetitionType.SUIT
  468. local number = this.getMyNum(actor, competitionType)
  469. OpenServerCompetition.print("更新套装阶数 中", number, suitStage)
  470. if suitStage <= number then
  471. return
  472. end
  473. OpenServerCompetition.updateRankData(actor, competitionType, suitStage)
  474. end
  475. --- 更新排行数据
  476. function OpenServerCompetition.updateRankData(actor, competitionType, number)
  477. if OpenServerCompetition.isTerminate(competitionType) then
  478. return
  479. end
  480. --if not OpenServerCompetition.isOpen(actor, competitionType) then
  481. -- OpenServerCompetition.print("开服竞技 竞技排行 更新排行数据 关闭", competitionType)
  482. -- return
  483. --end
  484. if competitionType == CompetitionType.ANGEL or competitionType == CompetitionType.CARDSCORE then
  485. local result = this.checkUpdata(actor, competitionType, number)
  486. if not result then
  487. -- 低于历史最,不更新
  488. return
  489. end
  490. this.saveAngelOrCard(actor, competitionType, number)
  491. end
  492. local now = getbaseinfo(actor, "now")
  493. local globalCompetitionData = GlobalCompetitionData.get()
  494. local actInfo = globalCompetitionData:getActInfoByType(competitionType)
  495. local rid = actor:toString()
  496. local activityInfo = actInfo[rid] or {}
  497. if not actInfo[rid] then
  498. activityInfo.rid = rid
  499. activityInfo.job = getbaseinfo(actor, "getbasecareer")
  500. activityInfo.name = getbaseinfo(actor, "rolename")
  501. end
  502. activityInfo.num = number
  503. activityInfo.updateTime = now
  504. actInfo[rid] = activityInfo
  505. info(actor, "玩家", actor, "开服竞技 竞技排行 更新排行数据", competitionType, activityInfo.name, number)
  506. globalCompetitionData:save()
  507. local playerCompetitionData = PlayerCompetitionData.get(actor)
  508. local getAwardInfo = playerCompetitionData:getAwardInfo(competitionType)
  509. this.sendOpenServerCompetitionInfo(actor, competitionType, getAwardInfo, tonumber(number))
  510. end
  511. function OpenServerCompetition.combineglobalvar(varName, varData)
  512. GlobalCompetitionData.save({})
  513. GlobalRankCompetitionData.save({})
  514. setsysvar("R$全服恶魔经验", {})
  515. end
  516. PlayerCompetitionData = {}
  517. PlayerCompetitionData.__index = PlayerCompetitionData
  518. local function _playerCompetitionDbKey()
  519. return "T$OPEN_SERVER_COMPETITION"
  520. end
  521. function PlayerCompetitionData.get(actor)
  522. local obj = getplaydef(actor, _playerCompetitionDbKey())
  523. return setmetatable(obj or {}, PlayerCompetitionData)
  524. end
  525. function PlayerCompetitionData:save(actor)
  526. setplaydef(actor, _playerCompetitionDbKey(), self);
  527. end
  528. function PlayerCompetitionData:getDataByType(competitionType)
  529. if not self[competitionType] then
  530. self[competitionType] = {}
  531. end
  532. return self[competitionType]
  533. end
  534. function PlayerCompetitionData:getAwardInfo(competitionType)
  535. local data = self:getDataByType(competitionType)
  536. if not data.getAwardInfo then
  537. data.getAwardInfo = {}
  538. end
  539. return data.getAwardInfo
  540. end
  541. GlobalCompetitionData = {}
  542. GlobalCompetitionData.__index = GlobalCompetitionData
  543. local function _globalCompetitionDbKey()
  544. return "R$OPEN_SERVER_COMPETITION"
  545. end
  546. function GlobalCompetitionData.getKey()
  547. return _globalCompetitionDbKey()
  548. end
  549. function GlobalCompetitionData.get()
  550. local obj = getsysvar(_globalCompetitionDbKey())
  551. return setmetatable(obj or {}, GlobalCompetitionData)
  552. end
  553. function GlobalCompetitionData:save()
  554. setsysvar(_globalCompetitionDbKey(), self)
  555. end
  556. function GlobalCompetitionData:getDataByType(competitionType)
  557. if not self[competitionType] then
  558. self[competitionType] = {}
  559. end
  560. return self[competitionType]
  561. end
  562. function GlobalCompetitionData:getActInfoByType(competitionType)
  563. local data = self:getDataByType(competitionType)
  564. if not data.actInfo then
  565. data.actInfo = {}
  566. end
  567. return data.actInfo
  568. end
  569. function GlobalCompetitionData:isSettlement(competitionType)
  570. local data = self:getDataByType(competitionType)
  571. return data.isSettlement or false
  572. end
  573. function GlobalCompetitionData:setSettlement(competitionType, isSettlement)
  574. local data = self:getDataByType(competitionType)
  575. data.isSettlement = isSettlement
  576. end
  577. GlobalRankCompetitionData = {}
  578. GlobalRankCompetitionData.__index = GlobalRankCompetitionData
  579. local function _globalRankCompetitionDbKey()
  580. return "R$OPEN_SERVER_COMPETITION_RANK"
  581. end
  582. function GlobalRankCompetitionData.get()
  583. local obj = getsysvar(_globalRankCompetitionDbKey())
  584. return setmetatable(obj or {}, GlobalRankCompetitionData)
  585. end
  586. function GlobalRankCompetitionData:save()
  587. setsysvar(_globalRankCompetitionDbKey(), self)
  588. end
  589. function this.checkUpdata(actor, competitionType, num)
  590. local value = this.getAngelOrCard(actor, competitionType)
  591. if num > value then
  592. return true
  593. end
  594. return false
  595. end
  596. function this.saveAngelOrCard(actor, competitionType, num)
  597. local data = getplaydef(actor, "T$angelOrCard") or {}
  598. data[competitionType] = num
  599. setplaydef(actor, "T$angelOrCard", data)
  600. end
  601. function this.getAngelOrCard(actor, competitionType)
  602. local data = getplaydef(actor, "T$angelOrCard") or {}
  603. return data[competitionType] or 0
  604. end
  605. --- 打印日志
  606. local isPrintLog = true
  607. function OpenServerCompetition.print(...)
  608. if isPrintLog then
  609. return
  610. end
  611. gameDebug.print(...)
  612. end
  613. function openservercompetitiontest(actor, id, competitionType)
  614. OpenServerCompetition.print(actor, "开服竞技测试", id, type(competitionType))
  615. local severOpenDays = getbaseinfo("serveropendays")
  616. local updateTime = getbaseinfo("now")
  617. OpenServerCompetition.print("开服天数", severOpenDays, "当前时间", updateTime)
  618. --this.updateRankInfo(competitionType)
  619. --OpenServerCompetition.sendCompetitionRankInfo(actor, {type= competitionType })
  620. local globalCompetitionData = GlobalCompetitionData.get()
  621. OpenServerCompetition.print(actor, "开服竞技测试结束", globalCompetitionData)
  622. end
  623. function testpersonalreward(actor)
  624. this.personalChallengeSettle()
  625. end
  626. -- 注册登录事件
  627. LoginEventListerTable:eventLister("0", "开服竞技排行", OpenServerCompetition.login)
  628. -- 注册等级提升事件
  629. LevelUpEventListerTable:eventLister("0", "开服竞技排行", OpenServerCompetition.levelUp)