OpenServerActivity.lua 45 KB

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