OpenServerActivity.lua 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425
  1. OpenServerAct = {}
  2. local this = {}
  3. ---全服首杀数据
  4. local GLOBAL_FIRST_KILL = "R$global_first_kill_info"
  5. ---开服活动排行数据(未排序)
  6. local OPEN_SERVER_ACT_RANK = "R$open_server_act_rank_info"
  7. -----玩家最大装备强化等级
  8. --OpenServerAct.MAX_STRENGTHEN_LV = "T$max_strengthen_level"
  9. -----玩家最大装备追加等级
  10. --OpenServerAct.MAX_APPEND_LV = "T$max_append_level"
  11. --玩家个人首杀数据
  12. local PERSONAL_FIRST_KILL = "T$personal_first_kill_info"
  13. ----开服活动排行数据(已排序)
  14. --local OPEN_SERVER_SORT_RANK = "R$open_server_sort_rank"
  15. --个人挑战奖励
  16. local NEW_AREA_PERSONAL_REWARD = "T$new_area_personal_reward"
  17. ---全服奖励邮件是否发放(0点清空)
  18. local GLOBAL_RANK_AWARD_EMAIL = "Q$global_rank_award_email"
  19. ---开服活动常量
  20. local Const = {
  21. ---奖励状态
  22. AwardStatus = {
  23. ---默认(无奖励)
  24. DEFAULT = 0,
  25. ---未领取
  26. NOT_RECEIVE = 1,
  27. ---已领取
  28. RECEIVED = 2
  29. },
  30. AwardType = {
  31. ---击杀奖励
  32. KILL = 1,
  33. ---伤害第一奖励
  34. HURT = 2
  35. },
  36. RankAward = {
  37. ---一键领取
  38. default = 0,
  39. ---排行奖励
  40. rank = 1,
  41. ---个人奖励
  42. personal = 2
  43. }
  44. }
  45. ---首杀活动
  46. OpenServerAct.FirstKill = {
  47. ---boss首杀
  48. BOSS = 10001,
  49. ---黄金怪
  50. GOLD_MONSTER = 10002
  51. }
  52. ---阶段排行类型
  53. OpenServerAct.StageRank = {
  54. ---装备强化(全身强化到达指定等级或以上)
  55. EQUIP_MAX_STRENGTHEN_LV = 20001,
  56. ---装备追加(全身追加到达指定等级或以上)
  57. EQUIP_MAX_APPEND_LV = 20002,
  58. ---装备首爆(从掉落中获得指定道具ITEM)
  59. EQUIP_FIRST_DROP = 20003
  60. }
  61. ---实时排行类型
  62. OpenServerAct.RealTimeRank = {
  63. ---等级竞技(角色等级达到指定等级或以上)
  64. ROLE_LEVEL = 20004,
  65. ---卓越竞技( 装备卓越词条达到指定数量)
  66. SUPERIOR_ENTRY_COUNT = 20005,
  67. ---首饰竞技(全身装备首饰等级)
  68. JEWELRY_LEVEL = 20006
  69. }
  70. ---活动道具绑定配置
  71. local BIND_CFG = 13
  72. ---实时排行榜缓存
  73. local REAL_TIME_RANK = {}
  74. ---排行刷新间隔(5分钟的秒时长)
  75. local REFRESH_INTERVAL = 60 * 5
  76. ---排行榜上次刷新时间
  77. local LAST_FLUSH_TIME = 0
  78. ---每日结算时间点
  79. local SETTLEMENT_HOUR = 22
  80. function this.GetNewRankValue(rid, roleName, newValue, nowTime)
  81. ---排行值
  82. local rankValue = {
  83. rid = rid,
  84. name = roleName,
  85. value = newValue,
  86. time = nowTime
  87. }
  88. return rankValue
  89. end
  90. function this.GetNewSortRankData(rankValue)
  91. local sortRankData = {
  92. rid = rankValue.rid,
  93. name = rankValue.name,
  94. value = rankValue.value,
  95. time = rankValue.time,
  96. status = Const.AwardStatus.NOT_RECEIVE
  97. }
  98. return sortRankData
  99. end
  100. function OpenServerAct.IsDataKey(varName)
  101. if string.equalsIgnoreCase(varName, GLOBAL_FIRST_KILL) or string.equalsIgnoreCase(varName, OPEN_SERVER_ACT_RANK) then
  102. return true
  103. else
  104. return false
  105. end
  106. end
  107. ---合服事件触发
  108. function OpenServerAct.Combine(varName)
  109. --清空全服数据
  110. this.SaveGlobalFirstKill(nil)
  111. this.SaveGlobalRankInfo(nil)
  112. end
  113. --活动是否结束
  114. function this.IsEnd(index)
  115. --local condition = ConfigDataManager.getTableValue("cfg_newarea_ranking","condition","id",index)
  116. --if not string.isNullOrEmpty(condition) then
  117. -- local ret = tonumber(checkcondition(actor, condition))
  118. -- if tonumber(ret) ~= 1 then
  119. -- return true;
  120. -- end
  121. --end
  122. local openDay = tonumber(getserveropendays(actor))
  123. local startTime = tonumber(ConfigDataManager.getTableValue("cfg_newarea_ranking", "starttime", "id", index))
  124. local endTime = tonumber(ConfigDataManager.getTableValue("cfg_newarea_ranking", "endtime", "id", index))
  125. if endTime == nil then
  126. return false
  127. end
  128. if openDay < endTime then
  129. if startTime == nil or openDay >= startTime then
  130. return false
  131. end
  132. end
  133. return true
  134. end
  135. ---活动页面是否关闭
  136. function this.IsClose(index)
  137. local openDay = tonumber(getserveropendays(actor))
  138. local closeTime = tonumber(ConfigDataManager.getTableValue("cfg_newarea_ranking", "uitime", "id", index))
  139. return openDay >= closeTime
  140. end
  141. ---获取全局排行数量限制
  142. function this.GetGlobalRankLimit()
  143. local rankCfg = ConfigDataManager.getTableValue("cfg_global", "value", "id", GlobalConfigId.OPEN_SERVER_ACT_RANK)
  144. if string.isNullOrEmpty(rankCfg) then
  145. return nil
  146. end
  147. local rankArray = string.split(rankCfg, "#")
  148. return tonumber(rankArray[2])
  149. end
  150. ---获取全局排行奖励邮件时间
  151. function this.GetGlobalRankAwardEmailTime()
  152. local rankCfg = ConfigDataManager.getTableValue("cfg_global", "value", "id", GlobalConfigId.OPEN_SERVER_ACT_RANK)
  153. if string.isNullOrEmpty(rankCfg) then
  154. return nil
  155. end
  156. local rankArray = string.split(rankCfg, "#")
  157. return tonumber(rankArray[1])
  158. end
  159. ---获取全局首杀数据
  160. function this.GetGlobalFirstKill()
  161. local globalFirstInfo = getsysvar(GLOBAL_FIRST_KILL)
  162. if globalFirstInfo == nil then
  163. globalFirstInfo = {}
  164. end
  165. return globalFirstInfo
  166. end
  167. ---保存全局首杀数据
  168. function this.SaveGlobalFirstKill(globalFirstInfo)
  169. setsysvar(GLOBAL_FIRST_KILL, globalFirstInfo)
  170. end
  171. ---获取个人首杀数据
  172. function this.GetPersonalFirstKill(actor)
  173. local personalFirstKillInfo = getplaydef(actor, PERSONAL_FIRST_KILL)
  174. if personalFirstKillInfo == nil then
  175. personalFirstKillInfo = {}
  176. end
  177. return personalFirstKillInfo
  178. end
  179. ---保存个人首杀数据
  180. function this.SavePersonalFirstKill(actor, personalFirstKillInfo)
  181. setplaydef(actor, PERSONAL_FIRST_KILL, personalFirstKillInfo)
  182. end
  183. ---获取全局排行榜数据
  184. function this.GetGlobalRankInfo()
  185. local globalRankInfo = getsysvar(OPEN_SERVER_ACT_RANK)
  186. if globalRankInfo == nil then
  187. globalRankInfo = {
  188. ---奖励排行数据
  189. award_rank = {},
  190. ---实时排行数据
  191. sort_rank = {},
  192. ---玩家冲榜记录(计算个人奖励名次)
  193. personal_rank_record = {}
  194. }
  195. end
  196. return globalRankInfo
  197. end
  198. ---保存全局排行榜数据
  199. function this.SaveGlobalRankInfo(globalRankInfo)
  200. setsysvar(OPEN_SERVER_ACT_RANK, globalRankInfo)
  201. end
  202. ---获取个人奖励及排名数据
  203. function this.GetNewAreaPersonalReward(actor)
  204. local personalRewardInfo = getplaydef(actor, NEW_AREA_PERSONAL_REWARD)
  205. if personalRewardInfo == nil then
  206. personalRewardInfo = {}
  207. end
  208. return personalRewardInfo
  209. end
  210. ---保存个人奖励数据
  211. function this.SaveNewAreaPersonalReward(actor, personalReward)
  212. setplaydef(actor, NEW_AREA_PERSONAL_REWARD, personalReward)
  213. end
  214. function this.GetRankAwardMailStatus()
  215. local status = getsysvar(GLOBAL_RANK_AWARD_EMAIL)
  216. if status == nil then
  217. return Const.AwardStatus.NOT_RECEIVE
  218. end
  219. return status
  220. end
  221. function this.SaveRankAwardMailStatus(status)
  222. setsysvar(GLOBAL_RANK_AWARD_EMAIL, status)
  223. end
  224. ---获取排行榜奖励名次限制
  225. function this.GetRankRewardLimit(group, goalValue)
  226. local cfgList = {}
  227. if goalValue == nil then
  228. cfgList = ConfigDataManager.getTable("cfg_newarea_rankingreward", "group", group)
  229. else
  230. cfgList = ConfigDataManager.getTable("cfg_newarea_rankingreward", "group", group, "tasktype", goalValue)
  231. end
  232. if table.isNullOrEmpty(cfgList) then
  233. return 0
  234. end
  235. return table.count(cfgList)
  236. end
  237. ---获取玩家各活动数据
  238. function this.GetSubRankValue(actor, rankType)
  239. if rankType == OpenServerAct.StageRank.EQUIP_MAX_STRENGTHEN_LV then
  240. return EquipAndAppear.GetEquipInfoRecordeValue(actor, EquipAndAppear.RecordeType.MAX_STRENGTH_LEVEL)
  241. elseif rankType == OpenServerAct.StageRank.EQUIP_MAX_APPEND_LV then
  242. return EquipAndAppear.GetEquipInfoRecordeValue(actor, EquipAndAppear.RecordeType.MAX_APPEND_LEVEL)
  243. elseif rankType == OpenServerAct.StageRank.EQUIP_FIRST_DROP then
  244. return 0
  245. elseif rankType == OpenServerAct.RealTimeRank.ROLE_LEVEL then
  246. local playerLevel = tonumber(getbaseinfo(actor, "level"))
  247. return playerLevel
  248. elseif rankType == OpenServerAct.RealTimeRank.SUPERIOR_ENTRY_COUNT then
  249. return EquipAndAppear.GetEquipInfoRecordeValue(actor, EquipAndAppear.RecordeType.MAX_ENTRY_COUNT)
  250. elseif rankType == OpenServerAct.RealTimeRank.JEWELRY_LEVEL then
  251. return EquipAndAppear.GetEquipInfoRecordeValue(actor, EquipAndAppear.RecordeType.MAX_JEWELRY_LEVEL)
  252. end
  253. return 0
  254. end
  255. ---全服首杀变化包
  256. function this.GlobalFirstKillChange(actor, group, monsterCfgId, killInfo)
  257. local changeInfo = {
  258. group = group,
  259. monsterCfgId = monsterCfgId,
  260. killInfo = killInfo
  261. }
  262. sendluamsg(actor, LuaMessageIdToClient.RES_GLOBAL_FIRST_KILL_CHANGE, changeInfo)
  263. end
  264. ---个人首杀变化包
  265. function this.PersonalFirstKillChange(actor, group, monsterCfgId, status)
  266. local changeInfo = {
  267. group = group,
  268. monsterCfgId = monsterCfgId,
  269. status = status
  270. }
  271. sendluamsg(actor, LuaMessageIdToClient.RES_PERSONAL_FIRST_KILL_CHANGE, changeInfo)
  272. end
  273. ---排行数据变化包
  274. function this.RankValueChange(actor, rankType, changeGoal)
  275. local change = {
  276. rankType = rankType,
  277. goalChange = changeGoal
  278. }
  279. sendluamsg(actor, LuaMessageIdToClient.OPEN_SERVER_ACT_RANK_CHANGE, change)
  280. end
  281. ---玩家排名奖励变化包
  282. function this.RankRewardChange(actor, rankType, goalValue, awardData)
  283. local change = {
  284. rankType = rankType,
  285. goalValue = goalValue,
  286. awardData = awardData
  287. }
  288. sendluamsg(actor, LuaMessageIdToClient.OPEN_SERVER_ACT_REWARD_CHANGE, change)
  289. end
  290. ---登录触发
  291. function OpenServerAct.Login(actor)
  292. --this.CheckPlayerReward(actor)
  293. end
  294. --function getfirstkillinfotest(actor)
  295. -- OpenServerAct.SendFirstKillInfo(actor)
  296. --end
  297. ---发送首杀数据
  298. function OpenServerAct.SendFirstKillInfo(actor)
  299. --全服首杀
  300. local globalFirstKillInfo = this.GetGlobalFirstKill()
  301. --个人首杀
  302. local personalFirstKillInfo = this.GetPersonalFirstKill(actor)
  303. local firstKillInfo = {
  304. global = globalFirstKillInfo,
  305. personal = personalFirstKillInfo
  306. }
  307. --jprint("getfirstkillinfotest:",firstKillInfo)
  308. sendluamsg(actor, LuaMessageIdToClient.RES_OPEN_SERVER_FIRST_KILL_INFO, firstKillInfo)
  309. end
  310. function OpenServerAct.UpdateFirstKill(killerActor, maxHurtRid, maxHate, monsterCfgId)
  311. local success, errorInfo =
  312. xpcall(this.UpdateFirstKill, debug.traceback, killerActor, maxHurtRid, maxHate, monsterCfgId)
  313. gameDebug.assertPrint(success, "怪物死亡开服活动更新异常:", killerActor, maxHurtRid, maxHate, monsterCfgId, errorInfo)
  314. end
  315. ---更新首杀数据
  316. function this.UpdateFirstKill(killerActor, maxHurtRid, maxHate, monsterCfgId)
  317. if killerActor == nil then
  318. return
  319. end
  320. local firstKillGroup = OpenServerAct.FirstKill
  321. for _, group in pairs(firstKillGroup) do
  322. this.UpdateFirstKillInfo(killerActor, group, monsterCfgId, maxHurtRid, maxHate)
  323. end
  324. end
  325. function this.UpdateFirstKillInfo(actor, group, configId, hurt, hate)
  326. local index =
  327. ConfigDataManager.getTableValue("cfg_newarea_rankingboss", "index", "group", group, "rankingboss", configId)
  328. if string.isNullOrEmpty(index) or tonumber(index) <= 0 then
  329. return
  330. end
  331. local actEnd = this.IsEnd(group)
  332. if actEnd then
  333. return
  334. end
  335. ---刷新全服数据
  336. this.UpdateGlobalFirstKill(actor, group, configId, hurt, hate)
  337. end
  338. ---更新首杀数据
  339. function this.UpdateGlobalFirstKill(actor, group, configId, hurt, hate)
  340. local globalFirstKill = this.GetGlobalFirstKill()
  341. local firstKillGroup = globalFirstKill[group]
  342. if table.isNullOrEmpty(firstKillGroup) then
  343. firstKillGroup = {}
  344. end
  345. local firstKillData = firstKillGroup[configId]
  346. local globalChange = false
  347. if table.isNullOrEmpty(firstKillData) then
  348. firstKillData = this.BuildFirstKillInfo(actor, hurt, hate)
  349. globalChange = true
  350. end
  351. --刷新玩家个人数据
  352. local personalLimit =
  353. ConfigDataManager.getTableValue(
  354. "cfg_newarea_rankingboss",
  355. "personalcondition",
  356. "group",
  357. group,
  358. "rankingboss",
  359. configId
  360. )
  361. local personalCount = firstKillData.personal_count
  362. if personalLimit ~= nil and personalCount <= tonumber(personalLimit) then
  363. local ok = this.UpdatePersonalFirstKill(actor, group, configId)
  364. if ok then
  365. firstKillData.personal_count = personalCount + 1
  366. globalChange = true
  367. end
  368. end
  369. if globalChange then
  370. firstKillGroup[configId] = firstKillData
  371. globalFirstKill[group] = firstKillGroup
  372. --jprint("更新全服首杀记录",firstKillData)
  373. --保存数据
  374. this.SaveGlobalFirstKill(globalFirstKill)
  375. --刷新数据
  376. this.GlobalFirstKillChange(actor, group, configId, firstKillData)
  377. end
  378. end
  379. ---构建首杀数据
  380. function this.BuildFirstKillInfo(killer, hurt, hate)
  381. local kill = getbaseinfo(killer, "rid")
  382. local killName = getbaseinfo(killer, "rolename")
  383. local hurtName = ""
  384. local hurtRole = getrolesummaryinfobyrid(hurt)
  385. if not table.isNullOrEmpty(hurtRole) then
  386. hurtName = hurtRole.name
  387. end
  388. ---首杀数据
  389. local firstKillData = {
  390. ---伤害第一
  391. hurt = {
  392. rid = hurt,
  393. name = hurtName,
  394. status = Const.AwardStatus.NOT_RECEIVE
  395. },
  396. ---击杀者
  397. kill = {
  398. rid = kill,
  399. name = killName,
  400. status = Const.AwardStatus.NOT_RECEIVE
  401. },
  402. ---个人首杀人数
  403. personal_count = 0
  404. -----仇恨第一
  405. --hate = {
  406. -- rid = hate,
  407. -- status = Const.AwardStatus.NOT_RECEIVE,
  408. --},
  409. }
  410. jprint("构建首杀数据", firstKillData)
  411. return firstKillData
  412. end
  413. ---领取全服首杀奖励
  414. function OpenServerAct.ReceiveGlobalFirstKill(actor, msgData)
  415. jprint("领取全服首杀奖励", msgData)
  416. local group = tonumber(msgData["group"])
  417. local configId = tonumber(msgData["configId"])
  418. local awardType = tonumber(msgData["type"])
  419. local globalFirstKill = this.GetGlobalFirstKill()
  420. local firstKillGroup = globalFirstKill[group]
  421. if table.isNullOrEmpty(firstKillGroup) then
  422. noticeTip.noticeinfo(actor, StringIdConst.TEXT362)
  423. return
  424. end
  425. local firstKillData = firstKillGroup[configId]
  426. if table.isNullOrEmpty(firstKillData) then
  427. noticeTip.noticeinfo(actor, StringIdConst.TEXT362)
  428. return
  429. end
  430. local success = this.CulFirstKillAward(actor, firstKillData, group, configId, awardType)
  431. if not success then
  432. return
  433. end
  434. firstKillGroup[configId] = firstKillData
  435. globalFirstKill[group] = firstKillGroup
  436. this.SaveGlobalFirstKill(globalFirstKill)
  437. ---响应
  438. this.GlobalFirstKillChange(actor, group, configId, firstKillData)
  439. --jprint("领取全服首杀记录",firstKillData)
  440. end
  441. ---计算全服首杀奖励
  442. function this.CulFirstKillAward(actor, firstKillData, group, configId, awardType)
  443. local rid = tonumber(getbaseinfo(actor, "rid"))
  444. local result = {}
  445. if awardType == Const.AwardType.KILL then
  446. if firstKillData.kill.rid ~= rid then
  447. noticeTip.noticeinfo(actor, StringIdConst.TEXT363)
  448. return false
  449. end
  450. if firstKillData.kill.status == Const.AwardStatus.RECEIVED then
  451. noticeTip.noticeinfo(actor, StringIdConst.TEXT364)
  452. return false
  453. end
  454. local rewardCfg =
  455. ConfigDataManager.getTableValue(
  456. "cfg_newarea_rankingboss",
  457. "lastreward",
  458. "group",
  459. group,
  460. "rankingboss",
  461. configId
  462. )
  463. this.SendReward(actor, rewardCfg, result, true)
  464. firstKillData.kill.status = Const.AwardStatus.RECEIVED
  465. end
  466. if awardType == Const.AwardType.HURT then
  467. if firstKillData.hurt.rid ~= rid then
  468. noticeTip.noticeinfo(actor, StringIdConst.TEXT363)
  469. return false
  470. end
  471. if firstKillData.hurt.status == Const.AwardStatus.RECEIVED then
  472. noticeTip.noticeinfo(actor, StringIdConst.TEXT364)
  473. return false
  474. end
  475. local rewardCfg =
  476. ConfigDataManager.getTableValue(
  477. "cfg_newarea_rankingboss",
  478. "mostreward",
  479. "group",
  480. group,
  481. "rankingboss",
  482. configId
  483. )
  484. --jprint("个人首杀奖励配置",rewardCfg)
  485. this.SendReward(actor, rewardCfg, result, true)
  486. firstKillData.hurt.status = Const.AwardStatus.RECEIVED
  487. end
  488. --if firstKillData.hate.rid == rid and firstKillData.hate.status == Const.AwardStatus.NOT_RECEIVE then
  489. -- local rewardCfg = ConfigDataManager.getTableValue("cfg_newarea_rankingboss","killreward","group",type,"rankingboss",configId)
  490. -- this.SendReward(actor,rewardCfg,result)
  491. -- firstKillData.hate.status = Const.AwardStatus.RECEIVE
  492. --end
  493. if table.isNullOrEmpty(result) then
  494. noticeTip.noticeinfo(actor, StringIdConst.TEXT365)
  495. return false
  496. end
  497. --奖励弹框
  498. sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, result)
  499. return true
  500. end
  501. ---更新个人首杀数据
  502. function this.UpdatePersonalFirstKill(actor, group, configId)
  503. local firstKillInfo = this.GetPersonalFirstKill(actor)
  504. local personalRewardCfg =
  505. ConfigDataManager.getTableValue(
  506. "cfg_newarea_rankingboss",
  507. "personalreward",
  508. "group",
  509. group,
  510. "rankingboss",
  511. configId
  512. )
  513. if string.isNullOrEmpty(personalRewardCfg) then
  514. return false
  515. end
  516. local firstKillGroup = firstKillInfo[group]
  517. if table.isNullOrEmpty(firstKillGroup) then
  518. firstKillGroup = {}
  519. end
  520. local firstKillStatus = firstKillGroup[configId]
  521. if firstKillStatus ~= nil then
  522. return false
  523. end
  524. firstKillGroup[configId] = Const.AwardStatus.NOT_RECEIVE
  525. firstKillInfo[group] = firstKillGroup
  526. --保存个人数据
  527. this.SavePersonalFirstKill(actor, firstKillInfo)
  528. --jprint("更新个人首杀数据",firstKillInfo)
  529. this.PersonalFirstKillChange(actor, group, configId, Const.AwardStatus.NOT_RECEIVE)
  530. return true
  531. end
  532. ---领取个人首杀奖励
  533. function OpenServerAct.ReceivePersonalFirstKill(actor, msgData)
  534. jprint("领取个人首杀奖励", msgData)
  535. local group = tonumber(msgData["group"])
  536. local configId = tonumber(msgData["configId"])
  537. local personalRewardCfg =
  538. ConfigDataManager.getTableValue(
  539. "cfg_newarea_rankingboss",
  540. "personalreward",
  541. "group",
  542. group,
  543. "rankingboss",
  544. configId
  545. )
  546. if string.isNullOrEmpty(personalRewardCfg) then
  547. noticeTip.noticeinfo(actor, StringIdConst.TEXT366)
  548. return
  549. end
  550. local firstKillInfo = this.GetPersonalFirstKill(actor)
  551. local firstKillGroup = firstKillInfo[group]
  552. if table.isNullOrEmpty(firstKillGroup) then
  553. noticeTip.noticeinfo(actor, StringIdConst.TEXT362)
  554. return
  555. end
  556. local firstKillStatus = firstKillGroup[configId]
  557. if firstKillStatus == nil then
  558. noticeTip.noticeinfo(actor, StringIdConst.TEXT362)
  559. return
  560. end
  561. if firstKillStatus == Const.AwardStatus.RECEIVED then
  562. noticeTip.noticeinfo(actor, StringIdConst.TEXT364)
  563. return
  564. end
  565. --发奖励
  566. local result = {}
  567. this.SendReward(actor, personalRewardCfg, result, true)
  568. firstKillGroup[configId] = Const.AwardStatus.RECEIVED
  569. firstKillInfo[group] = firstKillGroup
  570. --保存个人数据
  571. this.SavePersonalFirstKill(actor, firstKillInfo)
  572. --弹窗
  573. sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, result)
  574. this.PersonalFirstKillChange(actor, group, configId, Const.AwardStatus.RECEIVED)
  575. end
  576. ---更新装备首爆数据
  577. function OpenServerAct.UpdateEquipFirstDropRank(actor, itemCfgId)
  578. OpenServerAct.UpdateRankValue(actor, OpenServerAct.StageRank.EQUIP_FIRST_DROP, itemCfgId)
  579. end
  580. ---更新排行数据
  581. function OpenServerAct.UpdateRankValue(actor, rankType, newValue)
  582. --local success, errorInfo = xpcall(this.UpdateRankValue, debug.traceback, actor, rankType, newValue)
  583. --gameDebug.assertPrint(success, "开服活动排行刷新异常:", actor, rankType, newValue, errorInfo)
  584. end
  585. function this.UpdateRankValue(actor, rankType, newValue)
  586. if newValue < 1 then
  587. return
  588. end
  589. local rankCfgList = ConfigDataManager.getTable("cfg_newarea_rankingreward", "group", rankType)
  590. if table.isNullOrEmpty(rankCfgList) then
  591. return
  592. end
  593. --校验排行是否结束
  594. local actEnd = this.IsEnd(rankType)
  595. if actEnd then
  596. return
  597. end
  598. local change = this.GetNewRankChange()
  599. local globalRankInfo = this.GetGlobalRankInfo()
  600. --记录奖励排行
  601. local update1 =
  602. this.RecordAwardRank(actor, rankType, newValue, rankCfgList, globalRankInfo.award_rank, change.award_rank)
  603. --记录实时排行数据
  604. update3 = this.RecordSortRank(actor, rankType, newValue, globalRankInfo.sort_rank)
  605. --记录玩家个人数据
  606. local update3 =
  607. this.UpdateRankPersonalReward(
  608. actor,
  609. rankType,
  610. newValue,
  611. globalRankInfo.personal_rank_record,
  612. change.personal_rank_record
  613. )
  614. if not update1 and not update3 and not update3 then
  615. return
  616. end
  617. this.SaveGlobalRankInfo(globalRankInfo)
  618. this.RankValueChange(actor, rankType, change)
  619. ---刷新
  620. jprint("更新排行数据", update1, update2, update3, actor, rankType, change)
  621. end
  622. function this.GetNewRankChange()
  623. local change = {
  624. award_rank = {},
  625. --sort_rank = {},
  626. personal_rank_record = {}
  627. }
  628. return change
  629. end
  630. ---记录奖励排行数据
  631. function this.RecordAwardRank(actor, rankType, newValue, rankCfgList, awardRank, change)
  632. local realTimeRank = OpenServerAct.RealTimeRank
  633. if table.contains(realTimeRank, rankType) then
  634. return false
  635. end
  636. local rankList = awardRank[rankType]
  637. if rankList == nil then
  638. rankList = {}
  639. end
  640. local rid = getbaseinfo(actor, "rid")
  641. local update = false
  642. for _, rankCfg in pairs(rankCfgList) do
  643. local goalValue = tonumber(rankCfg["tasktype"])
  644. local rankData = this.BuildRankAward(actor, rid, rankType, goalValue, newValue, rankList)
  645. if rankData ~= nil then
  646. change[goalValue] = rankData
  647. update = true
  648. end
  649. end
  650. awardRank[rankType] = rankList
  651. return update
  652. end
  653. ---构建排行奖励记录
  654. function this.BuildRankAward(actor, rid, rankType, goalValue, newValue, rankList)
  655. local goalRank = rankList[goalValue]
  656. if goalRank == nil then
  657. goalRank = {}
  658. end
  659. local rankSize = table.count(goalRank)
  660. local rankLimit = this.GetRankRewardLimit(rankType, goalValue)
  661. if rankSize >= rankLimit then
  662. return nil
  663. end
  664. local rankData = this.GetAwardRankData(rid, goalRank)
  665. if rankData ~= nil then
  666. return nil
  667. end
  668. ---装备首曝特殊处理
  669. if rankType == OpenServerAct.StageRank.EQUIP_FIRST_DROP and newValue ~= goalValue then
  670. return nil
  671. end
  672. if rankType ~= OpenServerAct.StageRank.EQUIP_FIRST_DROP and newValue < goalValue then
  673. return nil
  674. end
  675. local roleName = getbaseinfo(actor, "rolename")
  676. rankData = {
  677. rid = rid,
  678. rank_no = rankSize + 1,
  679. name = roleName,
  680. status = Const.AwardStatus.NOT_RECEIVE
  681. }
  682. table.insert(goalRank, rankData)
  683. rankList[goalValue] = goalRank
  684. return rankData
  685. end
  686. function this.GetAwardRankData(rid, goalRank)
  687. if table.isNullOrEmpty(goalRank) then
  688. return nil
  689. end
  690. for _, rankData in pairs(goalRank) do
  691. if rankData.rid == rid then
  692. return rankData
  693. end
  694. end
  695. return nil
  696. end
  697. ---记录实时排行数据
  698. function this.RecordSortRank(actor, rankType, newValue, sortRankData)
  699. local realTimeRank = OpenServerAct.RealTimeRank
  700. if not table.contains(realTimeRank, rankType) then
  701. return false
  702. end
  703. local rankList = sortRankData[rankType]
  704. if rankList == nil then
  705. rankList = {}
  706. end
  707. local rid = getbaseinfo(actor, "rid")
  708. local rankData = rankList[rid]
  709. if rankData ~= nil and newValue <= rankData.value then
  710. return false
  711. end
  712. local nowTime = tonumber((getbaseinfo("nowsec")))
  713. local roleName = getbaseinfo(actor, "rolename")
  714. rankData = {
  715. rid = rid,
  716. value = newValue,
  717. name = roleName,
  718. time = nowTime
  719. }
  720. rankList[rid] = rankData
  721. sortRankData[rankType] = rankList
  722. --local sortRank = this.FlushRankRealTimeRank(rankType, rankList)
  723. --jprint("记录实时排行数据",actor,rankType,sortRank)
  724. return true
  725. end
  726. ---记录个人排名
  727. function this.UpdateRankPersonalReward(actor, rankType, newValue, personalRankData, change)
  728. local rankCfgList = ConfigDataManager.getTable("cfg_newarea_personalreward", "group", rankType)
  729. if table.isNullOrEmpty(rankCfgList) then
  730. return false
  731. end
  732. local rankList = personalRankData[rankType]
  733. if rankList == nil then
  734. rankList = {}
  735. end
  736. local rid = getbaseinfo(actor, "rid")
  737. local update = false
  738. for _, rankCfg in pairs(rankCfgList) do
  739. local limitArray = string.split(rankCfg["tasktype"], "#")
  740. local goalValue = tonumber(limitArray[1])
  741. local rankLimit = tonumber(limitArray[2])
  742. local goalRank = rankList[goalValue]
  743. if goalRank == nil then
  744. goalRank = {}
  745. end
  746. local rankSize = table.count(goalRank)
  747. local ok = this.CanRecordPersonalRank(rid, goalRank, rankType, newValue, goalValue, rankSize, rankLimit)
  748. if ok then
  749. table.insert(goalRank, rid)
  750. rankList[goalValue] = goalRank
  751. --记录玩家个人数据
  752. local goalInfo = this.RecordePersonalRankReward(actor, rankType, goalValue, rankSize + 1)
  753. change[goalValue] = {
  754. rid = rid,
  755. goal_info = goalInfo,
  756. rank_size = rankSize + 1
  757. }
  758. update = true
  759. end
  760. end
  761. if update then
  762. personalRankData[rankType] = rankList
  763. end
  764. return update
  765. end
  766. function this.CanRecordPersonalRank(rid, goalRank, rankType, newValue, goalValue, rankSize, rankLimit)
  767. if table.contains(goalRank, rid) then
  768. return false
  769. end
  770. if rankType == OpenServerAct.StageRank.EQUIP_FIRST_DROP and newValue ~= goalValue then
  771. return false
  772. end
  773. if rankType ~= OpenServerAct.StageRank.EQUIP_FIRST_DROP and newValue < goalValue then
  774. return false
  775. end
  776. if rankSize >= rankLimit then
  777. return false
  778. end
  779. return true
  780. end
  781. ---记录玩家个人奖励
  782. function this.RecordePersonalRankReward(actor, rankType, goalValue, rankNo)
  783. ---玩家记录
  784. local rankPersonalReward = this.GetNewAreaPersonalReward(actor)
  785. local subRankReward = rankPersonalReward[rankType]
  786. if subRankReward == nil then
  787. subRankReward = {}
  788. end
  789. local goalInfo = subRankReward[goalValue]
  790. if not table.isNullOrEmpty(goalInfo) then
  791. return nil
  792. end
  793. ---排行目标信息
  794. goalInfo = {
  795. ---排名
  796. rank = rankNo,
  797. ---个人奖励状态
  798. status = Const.AwardStatus.NOT_RECEIVE
  799. }
  800. subRankReward[goalValue] = goalInfo
  801. rankPersonalReward[rankType] = subRankReward
  802. this.SaveNewAreaPersonalReward(actor, rankPersonalReward)
  803. --jprint("更新个人排名",actor,rankType,subRankReward)
  804. return goalInfo
  805. end
  806. function OpenServerAct.FlushSortRank()
  807. local nowTime = tonumber((getbaseinfo("nowsec")))
  808. if nowTime - LAST_FLUSH_TIME < REFRESH_INTERVAL then
  809. return
  810. end
  811. this.FlushSortRank()
  812. end
  813. function this.FlushSortRank()
  814. local globalRankInfo = this.GetGlobalRankInfo()
  815. if table.isNullOrEmpty(globalRankInfo) then
  816. return
  817. end
  818. local sortRankList = globalRankInfo.sort_rank
  819. if table.isNullOrEmpty(sortRankList) then
  820. return
  821. end
  822. local realTimeRank = OpenServerAct.RealTimeRank
  823. for rankType, rankList in pairs(sortRankList) do
  824. local actEnd = this.IsEnd(rankType)
  825. if not actEnd then
  826. if table.contains(realTimeRank, rankType) then
  827. this.FlushRankRealTimeRank(rankType, rankList)
  828. end
  829. end
  830. end
  831. end
  832. ---刷新实时排行
  833. function this.FlushRankRealTimeRank(rankType, rankList)
  834. local sortRank = {}
  835. if table.isNullOrEmpty(rankList) then
  836. return sortRank
  837. end
  838. for _, rankData in pairs(rankList) do
  839. table.insert(sortRank, rankData)
  840. end
  841. table.sort(sortRank, this.SortRule)
  842. local rankLimit = this.GetGlobalRankLimit()
  843. local rankCount = table.count(sortRank)
  844. local rankSize = math.min(rankCount, rankLimit)
  845. local newRank = {}
  846. newRank = table.getTopN(rankSize, sortRank)
  847. REAL_TIME_RANK[rankType] = sortRank
  848. return sortRank
  849. end
  850. ---排序规则
  851. function this.SortRule(objA, objB)
  852. if objA.value == objB.value then
  853. return objA.time < objB.time -- 如果value相同,则按time升序
  854. else
  855. return objA.value > objB.value -- 否则按value降序
  856. end
  857. end
  858. ---仅按时间排序
  859. function this.TimeSort(objA, objB)
  860. return objA.time < objB.time
  861. end
  862. function openserveracttest(actor, msgData)
  863. OpenServerAct.SendSubRankInfo(actor, tonumber(msgData))
  864. end
  865. ---发送排行榜信息
  866. function OpenServerAct.SendSubRankInfo(actor, msgData)
  867. --jprint("请求排行数据",msgData)
  868. this.SendSubRankInfo(actor, tonumber(msgData))
  869. end
  870. function this.SendSubRankInfo(actor, rankType)
  871. local globalRankInfo = this.GetGlobalRankInfo()
  872. local myValue = this.GetSubRankValue(actor, rankType)
  873. ---回包结构
  874. local subRankRes = {
  875. rank_type = rankType,
  876. my_value = myValue,
  877. rank_list = {}
  878. }
  879. --封装排行数据
  880. local rankListRes = this.BuildRankListRes(actor, rankType, globalRankInfo)
  881. subRankRes.rank_list = rankListRes
  882. ---通知客户端
  883. jprint("发送排行数据", subRankRes)
  884. sendluamsg(actor, LuaMessageIdToClient.OPEN_SERVER_ACT_TYPE_RANK_INFO, subRankRes)
  885. end
  886. ---构建排行数据回包
  887. function this.BuildRankListRes(actor, rankType, globalRankInfo)
  888. local sortRank, myRank = this.GetShowSortRank(actor, rankType)
  889. local rankListRes = {
  890. ---奖励排行数据
  891. award_rank = globalRankInfo.award_rank[rankType],
  892. ---实时排行数据
  893. sort_rank = sortRank,
  894. ---个人冲榜奖励数据
  895. personal_rank = {},
  896. ---我的排名
  897. my_rank = myRank
  898. }
  899. local personalRankRecord = globalRankInfo.personal_rank_record[rankType]
  900. --玩家个人奖励信息
  901. local personalRewardInfo = this.GetNewAreaPersonalReward(actor)
  902. local rankRewardInfo = personalRewardInfo[rankType]
  903. if rankRewardInfo == nil then
  904. rankRewardInfo = {}
  905. end
  906. local personalRank = {}
  907. if not table.isNullOrEmpty(personalRankRecord) then
  908. for goalValue, goalRank in pairs(personalRankRecord) do
  909. local myInfo = rankRewardInfo[goalValue]
  910. personalRank[goalValue] = {
  911. rank_size = table.count(goalRank),
  912. my_info = myInfo
  913. }
  914. end
  915. end
  916. rankListRes.personal_rank = personalRank
  917. return rankListRes
  918. end
  919. function this.GetShowSortRank(actor, rankType)
  920. local rid = tonumber(getbaseinfo(actor, "rid"))
  921. local sortRank = this.GetSortRankInfo(rankType)
  922. local newRank = {}
  923. local myRank = 0
  924. if not table.isNullOrEmpty(sortRank) then
  925. local rankLimit = this.GetRankRewardLimit(rankType)
  926. local rankCount = table.count(sortRank)
  927. local rankSize = math.min(rankCount, rankLimit)
  928. newRank = table.getTopN(rankSize, sortRank)
  929. for rankNo, rankData in pairs(sortRank) do
  930. if rankData.rid == rid then
  931. myRank = rankNo
  932. end
  933. end
  934. end
  935. return newRank, myRank
  936. end
  937. function this.GetSortRankInfo(rankType)
  938. local sortRank = REAL_TIME_RANK[rankType]
  939. if table.isNullOrEmpty(sortRank) then
  940. local globalRankInfo = this.GetGlobalRankInfo()
  941. if not table.isNullOrEmpty(globalRankInfo.sort_rank) then
  942. local rankList = globalRankInfo.sort_rank[rankType]
  943. sortRank = this.FlushRankRealTimeRank(rankType, rankList)
  944. end
  945. end
  946. return sortRank
  947. end
  948. function OpenServerAct.SettlementRank()
  949. local nowHour = tonumber((getbaseinfo("hour")))
  950. local settlementHour = this.GetGlobalRankAwardEmailTime()
  951. if nowHour ~= settlementHour then
  952. return
  953. end
  954. local status = this.GetRankAwardMailStatus()
  955. if status == Const.AwardStatus.RECEIVED then
  956. return
  957. end
  958. this.SettlementRank()
  959. end
  960. ---结算排行
  961. function this.SettlementRank()
  962. local update = false
  963. local realTimeRank = OpenServerAct.RealTimeRank
  964. for _, rankType in pairs(realTimeRank) do
  965. local actClose = this.IsClose(rankType)
  966. if not actClose then
  967. local sortRank = this.GetSortRankInfo(rankType)
  968. if not table.isNullOrEmpty(sortRank) then
  969. local newRank = {}
  970. local rankLimit = this.GetRankRewardLimit(rankType)
  971. local rankCount = table.count(sortRank)
  972. local rankSize = math.min(rankCount, rankLimit)
  973. newRank = table.getTopN(rankSize, sortRank)
  974. for rankNo, rankData in pairs(newRank) do
  975. this.SendSettlementEmail(rankNo, rankType, rankData)
  976. end
  977. update = true
  978. end
  979. end
  980. end
  981. if update then
  982. this.SaveRankAwardMailStatus(Const.AwardStatus.RECEIVED)
  983. end
  984. end
  985. function this.SendSettlementEmail(rankNo, rankType, rankData)
  986. local rid = rankData.rid
  987. local rewardRet = {}
  988. this.GetSubRankAward(nil, rankType, rankNo, rewardRet)
  989. if table.isNullOrEmpty(rewardRet) then
  990. return
  991. end
  992. local actName = ConfigDataManager.getTableValue("cfg_newarea_ranking", "name", "id", rankType)
  993. jprint("发送开服冲榜奖励邮件", rankType, rankData, actName, rewardRet)
  994. --sendconfigmailbyrid(rid, mail_id, rewardRet, actNames)
  995. local title = "开服活动"
  996. local content = "恭喜您在" .. actName .. "活动中排名第" .. rankNo
  997. sendmail(rid, title, content, rewardRet)
  998. end
  999. ---领奖gm测试
  1000. function receivesubrankrewardtest(actor, rankType, goalValue)
  1001. local msgData = {
  1002. rankType = rankType,
  1003. goalValue = goalValue
  1004. }
  1005. this.ReceiveRankAward(actor, msgData, 0)
  1006. end
  1007. ---一键领取
  1008. function OpenServerAct.ReceivePlayerRankReward(actor, msgData)
  1009. this.ReceiveRankAward(actor, msgData, Const.RankAward.default)
  1010. end
  1011. ---领取排行奖励
  1012. function OpenServerAct.ReceiveGlobalRankReward(actor, msgData)
  1013. --this.ReceiveRankAward(actor, msgData,Const.RankAward.rank)
  1014. end
  1015. ---领取个人奖励
  1016. function OpenServerAct.ReceiveNewAreaPersonalReward(actor, msgData)
  1017. this.ReceiveRankAward(actor, msgData, Const.RankAward.personal)
  1018. end
  1019. ---领取奖励
  1020. function this.ReceiveRankAward(actor, msgData, receiveType)
  1021. jprint("玩家请求领取开服冲榜奖励", actor, msgData, receiveType)
  1022. local rankType = tonumber(msgData["rankType"])
  1023. local goalValue = tonumber(msgData["goalValue"])
  1024. local actClose = this.IsClose(rankType)
  1025. if actClose then
  1026. noticeTip.noticeinfo(actor, StringIdConst.TEXT367)
  1027. return
  1028. end
  1029. local rewardRet = {}
  1030. local retData = {}
  1031. --一键领取
  1032. if receiveType == Const.RankAward.default then
  1033. retData = this.OneKeyReceiveRankReward(actor, rankType, goalValue, rewardRet)
  1034. end
  1035. --排行奖励
  1036. --if receiveType == Const.RankAward.rank then
  1037. -- retData = this.ReceiveGlobalRankReward(actor, rankType, goalValue,rewardRet)
  1038. --end
  1039. --个人奖励
  1040. if receiveType == Const.RankAward.personal then
  1041. retData = this.ReceiveNewAreaPersonalReward(actor, rankType, goalValue, rewardRet)
  1042. end
  1043. if table.isNullOrEmpty(retData) then
  1044. tipinfo(actor, "无奖励可领取")
  1045. return
  1046. end
  1047. local change = {
  1048. award_type = receiveType,
  1049. data = retData
  1050. }
  1051. --弹窗
  1052. sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, rewardRet)
  1053. this.RankRewardChange(actor, rankType, goalValue, change)
  1054. jprint("玩家领取冲榜奖励", actor, rankType, goalValue, change)
  1055. end
  1056. --一键领取
  1057. function this.OneKeyReceiveRankReward(actor, rankType, goalValue, rewardRet)
  1058. --全服排行奖励
  1059. --local rankRet = this.ReceiveGlobalRankReward(actor, rankType, goalValue, rewardRet)
  1060. --领取个人排行奖励
  1061. local personalRet = this.ReceiveNewAreaPersonalReward(actor, rankType, goalValue, rewardRet)
  1062. if table.isNullOrEmpty(personalRet) then
  1063. return nil
  1064. end
  1065. local retData = {
  1066. personal = personalRet
  1067. }
  1068. return retData
  1069. end
  1070. --function this.ReceiveGlobalRankReward(actor, rankType, goalValue,rewardRet)
  1071. -- local globalRankInfo = this.GetGlobalRankInfo()
  1072. -- local awardRank = globalRankInfo.award_rank
  1073. -- if table.isNullOrEmpty(awardRank) then
  1074. -- return nil
  1075. -- end
  1076. -- local subRank = awardRank[rankType]
  1077. -- if table.isNullOrEmpty(subRank) then
  1078. -- return nil
  1079. -- end
  1080. -- local goalRank= subRank[goalValue]
  1081. -- if table.isNullOrEmpty(goalRank) then
  1082. -- return nil
  1083. -- end
  1084. -- local rid = getbaseinfo(actor,"rid")
  1085. -- local rankData = this.GetAwardRankData(rid, goalRank)
  1086. -- if table.isNullOrEmpty(rankData) then
  1087. -- return nil
  1088. -- end
  1089. -- if rankData.status == Const.AwardStatus.RECEIVED then
  1090. -- return nil
  1091. -- end
  1092. -- local ok = this.GetSubRankAward(actor, rankType, rankData.rank_no, goalValue,rewardRet)
  1093. -- if not ok then
  1094. -- return nil
  1095. -- end
  1096. -- rankData.status = Const.AwardStatus.RECEIVED
  1097. -- goalRank[rankData.rank_no] = rankData
  1098. -- subRank[goalValue] = goalRank
  1099. -- awardRank[rankType] = subRank
  1100. -- globalRankInfo.award_rank = awardRank
  1101. -- this.SaveGlobalRankInfo(globalRankInfo)
  1102. -- return rankData
  1103. --end
  1104. ---获取排行奖励
  1105. function this.GetSubRankAward(actor, rankType, rankNo, rewardRet)
  1106. local rankCfgList = ConfigDataManager.getTable("cfg_newarea_rankingreward", "group", rankType)
  1107. if table.isNullOrEmpty(rankCfgList) then
  1108. return
  1109. end
  1110. for _, rankCfg in pairs(rankCfgList) do
  1111. --local limitValue = rankCfg["tasktype"]
  1112. --if not string.isNullOrEmpty(limitValue) and tonumber(limitValue) == goalValue then
  1113. local rankLimit = rankCfg["ranking"]
  1114. local limitArray = string.split(rankLimit, "#")
  1115. if rankNo >= tonumber(limitArray[1]) and rankNo <= tonumber(limitArray[2]) then
  1116. --发奖励
  1117. local rewardCfg = rankCfg["taskreward"]
  1118. this.SendReward(actor, rewardCfg, rewardRet, false)
  1119. break
  1120. end
  1121. --end
  1122. end
  1123. end
  1124. ----领取个人挑战奖励
  1125. function this.ReceiveNewAreaPersonalReward(actor, rankType, goalValue, rewardRet)
  1126. local cfgList = ConfigDataManager.getTable("cfg_newarea_personalreward", "group", rankType)
  1127. if table.isNullOrEmpty(cfgList) then
  1128. return nil
  1129. end
  1130. local personalRewardInfo = this.GetNewAreaPersonalReward(actor)
  1131. local subRank = personalRewardInfo[rankType]
  1132. if table.isNullOrEmpty(subRank) then
  1133. return nil
  1134. end
  1135. local rankData = subRank[goalValue]
  1136. if table.isNullOrEmpty(rankData) then
  1137. return nil
  1138. end
  1139. if rankData.status == Const.AwardStatus.RECEIVED then
  1140. return nil
  1141. end
  1142. local success = false
  1143. for _, config in pairs(cfgList) do
  1144. local limitArray = string.split(config["tasktype"], "#")
  1145. local goal = tonumber(limitArray[1])
  1146. local rankLimit = tonumber(limitArray[2])
  1147. if rankData.rank <= rankLimit and goal == goalValue then
  1148. local rewardCfg = config["taskreward"]
  1149. this.SendReward(actor, rewardCfg, rewardRet, true)
  1150. rankData.status = Const.AwardStatus.RECEIVED
  1151. success = true
  1152. break
  1153. end
  1154. end
  1155. if not success then
  1156. return nil
  1157. end
  1158. subRank[goalValue] = rankData
  1159. personalRewardInfo[rankType] = subRank
  1160. this.SaveNewAreaPersonalReward(actor, personalRewardInfo)
  1161. return rankData
  1162. end
  1163. function this.SendReward(actor, rewardCfg, awardMap, intoBag)
  1164. if string.isNullOrEmpty(rewardCfg) then
  1165. return
  1166. end
  1167. local bind = ConfigDataManager.getTableValue("cfg_bind", "bind", "id", BIND_CFG)
  1168. local itemArray = string.split(rewardCfg, "|")
  1169. for _, param in pairs(itemArray) do
  1170. local cfgArray = string.split(param, "#")
  1171. local itemId = tonumber(cfgArray[1])
  1172. local itemNum = tonumber(cfgArray[2])
  1173. if intoBag == true then
  1174. Bag.addItemToBag(actor, itemId, itemNum, bind, 9999, "开服活动")
  1175. end
  1176. --奖励入包
  1177. --记录
  1178. local oldCount = awardMap[itemId]
  1179. if oldCount == nil then
  1180. oldCount = 0
  1181. end
  1182. awardMap[itemId] = oldCount + itemNum
  1183. end
  1184. end
  1185. function checkplayeropenserverrewardtest(actor)
  1186. this.CheckPlayerReward(actor)
  1187. end
  1188. ---检测玩家未领取的奖励
  1189. function this.CheckPlayerReward(actor)
  1190. local resultGroup = {}
  1191. --检测怪物首杀
  1192. this.CheckFirstKillAward(actor, resultGroup)
  1193. --检测排行奖励
  1194. this.CheckRankReward(actor, resultGroup)
  1195. if table.isNullOrEmpty(resultGroup) then
  1196. return
  1197. end
  1198. jprint("检测到未领取奖励", resultGroup)
  1199. local actNames = ""
  1200. for _, name in pairs(resultGroup) do
  1201. actNames = actNames .. name .. ","
  1202. end
  1203. --发提示邮件
  1204. --sendconfigmailbyrid(rid, mail_id, nil, actNames)
  1205. end
  1206. function this.RecordGroup(resultGroup, group)
  1207. local actName = resultGroup[group]
  1208. if not string.isNullOrEmpty(actName) then
  1209. return
  1210. end
  1211. actName = ConfigDataManager.getTableValue("cfg_newarea_ranking", "name", "id", group)
  1212. resultGroup[group] = actName
  1213. end
  1214. ---检测怪物首杀
  1215. function this.CheckFirstKillAward(actor, resultGroup)
  1216. local personalFirstKill = this.GetPersonalFirstKill(actor)
  1217. if table.isNullOrEmpty(personalFirstKill) then
  1218. return
  1219. end
  1220. local globalFirstKill = this.GetGlobalFirstKill()
  1221. local firstKillGroup = OpenServerAct.FirstKill
  1222. for _, group in pairs(firstKillGroup) do
  1223. local actClose = this.IsClose(group)
  1224. if not actClose then
  1225. --检测全服首杀
  1226. local ok = this.CheckGlobalFirstKillReward(group, globalFirstKill)
  1227. if not ok then
  1228. ok = this.CheckPersonalFirstKill(group, personalFirstKill)
  1229. end
  1230. if ok then
  1231. this.RecordGroup(resultGroup, group)
  1232. end
  1233. end
  1234. end
  1235. end
  1236. ---检测玩家个人首杀奖励
  1237. function this.CheckPersonalFirstKill(group, personalFirstKill)
  1238. if table.isNullOrEmpty(personalFirstKill) then
  1239. return false
  1240. end
  1241. local groupInfo = personalFirstKill[group]
  1242. if table.isNullOrEmpty(groupInfo) then
  1243. return false
  1244. end
  1245. for _, status in pairs(groupInfo) do
  1246. if status == Const.AwardStatus.NOT_RECEIVE then
  1247. return true
  1248. end
  1249. end
  1250. return false
  1251. end
  1252. ---检测玩家全服首杀奖励
  1253. function this.CheckGlobalFirstKillReward(group, globalFirstKill)
  1254. local groupInfo = globalFirstKill[group]
  1255. if table.isNullOrEmpty(groupInfo) then
  1256. return false
  1257. end
  1258. for _, firstKillData in pairs(groupInfo) do
  1259. if firstKillData.hurt.rid == rid and firstKillData.hurt.status == Const.AwardStatus.NOT_RECEIVE then
  1260. return true
  1261. end
  1262. if firstKillData.kill.rid == rid and firstKillData.kill.status == Const.AwardStatus.NOT_RECEIVE then
  1263. return true
  1264. end
  1265. end
  1266. return false
  1267. end
  1268. ---检测玩家排行榜奖励
  1269. function this.CheckRankReward(actor, resultGroup)
  1270. --个人奖励
  1271. local personalReward = this.GetNewAreaPersonalReward(actor)
  1272. if table.isNullOrEmpty(personalReward) then
  1273. return
  1274. end
  1275. local globalRankInfo = this.GetGlobalRankInfo()
  1276. local rid = getbaseinfo(actor, "rid")
  1277. local stageRank = OpenServerAct.StageRank
  1278. local realTimeRank = OpenServerAct.RealTimeRank
  1279. for _, rankType in pairs(stageRank) do
  1280. local actClose = this.IsClose(rankType)
  1281. if not actClose then
  1282. local ok = this.CheckPersonalReward(rankType, personalReward)
  1283. if not ok then
  1284. ok = this.CheckGlobalRank(rid, rankType, globalRankInfo)
  1285. end
  1286. if ok then
  1287. this.RecordGroup(resultGroup, rankType)
  1288. end
  1289. end
  1290. end
  1291. for _, rankType in pairs(realTimeRank) do
  1292. local actClose = this.IsClose(rankType)
  1293. if not actClose then
  1294. local ok = this.CheckPersonalReward(rankType, personalReward)
  1295. if not ok then
  1296. ok = this.CheckGlobalRank(rid, rankType, globalRankInfo)
  1297. end
  1298. if ok then
  1299. this.RecordGroup(resultGroup, rankType)
  1300. end
  1301. end
  1302. end
  1303. end
  1304. ---检测玩家个人排行奖励
  1305. function this.CheckPersonalReward(rankType, personalReward)
  1306. local subRankInfo = personalReward[rankType]
  1307. if table.isNullOrEmpty(subRankInfo) then
  1308. return false
  1309. end
  1310. for goalValue, goalData in pairs(subRankInfo) do
  1311. if goalData.status == Const.AwardStatus.NOT_RECEIVE then
  1312. return true
  1313. end
  1314. end
  1315. return false
  1316. end
  1317. ---检测玩家全服排行奖励
  1318. function this.CheckGlobalRank(rid, rankType, globalRankInfo)
  1319. local awardRankInfo = globalRankInfo.award_rank
  1320. if table.isNullOrEmpty(awardRankInfo) then
  1321. return false
  1322. end
  1323. local subRankInfo = awardRankInfo[rankType]
  1324. if table.isNullOrEmpty(subRankInfo) then
  1325. return false
  1326. end
  1327. for goalValue, goalRank in pairs(subRankInfo) do
  1328. for _, rankData in pairs(goalRank) do
  1329. if rankData.rid == rid and rankData.status == Const.AwardStatus.NOT_RECEIVE then
  1330. return true
  1331. end
  1332. end
  1333. end
  1334. return false
  1335. end
  1336. function gettasktypenumtest(actor)
  1337. local count = this.GetRankRewardLimit(20004, 3)
  1338. jprint("排行配置数量", count)
  1339. end
  1340. function getserveropentimetest(actor)
  1341. local openTime = getbaseinfo(actor, "serveropentime")
  1342. local formatTime = os.date("%Y-%m-%d %X", openTime / 1000)
  1343. tipinfo(actor, "开服时间:" .. formatTime)
  1344. end