AngelBenefit.lua 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. AngelBenefit = {}
  2. local this = {}
  3. AngelBenefit.Var = {
  4. ANGLE_TASK = "T$angletaskinfo",
  5. ANGLE_REWARD = "T$angletaskreward",
  6. ALL_SERVER_LIMIT_BUY = "R$allserverlimitbuy" --全服限量购买
  7. }
  8. ---任务状态
  9. AngelBenefit.TASK_STATUS = {
  10. ---已接取
  11. ACCEPT = 1,
  12. ---已完成
  13. FINISH = 2,
  14. ---已提交
  15. SUBMIT = 3,
  16. }
  17. ---任务状态
  18. AngelBenefit.TASK_TYPE = {
  19. --试炼达人
  20. BRAVE = 1,
  21. --怪物猎人
  22. MONSTER = 2,
  23. }
  24. --活动是否开启
  25. function AngelBenefit.isActivityOpen(actor)
  26. local config = ConfigDataManager.getTable("sub_mainActivity","id",2)
  27. if config == nil then
  28. return false
  29. end
  30. return ConditionManager.Check(actor, config[1].actualcondition)
  31. end
  32. --页签是否开启
  33. function AngelBenefit.tableOpen(actor)
  34. local config = ConfigDataManager.getTable("sub_mainActivity","id",2)
  35. if config == nil then
  36. return false
  37. end
  38. return ConditionManager.Check(actor, config[1].showcondition)
  39. end
  40. ---获取全服奖励信息和个人任务信息
  41. function AngelBenefit.getAllAngleBenefitInfo(actor)
  42. local result = {}
  43. --个人任务
  44. local taskInfo = getplaydef(actor, AngelBenefit.Var.ANGLE_TASK)
  45. if taskInfo == nil or taskInfo == "" then
  46. taskInfo = {}
  47. end
  48. local taskResult = {}
  49. for k,v in pairs(taskInfo) do
  50. local info = {}
  51. info.nowCount = v.nowCount
  52. info.status = v.status
  53. taskResult[v.taskId] = info
  54. end
  55. result.taskInfo = taskResult
  56. --个人奖励
  57. local rewardInfo = getplaydef(actor,AngelBenefit.Var.ANGLE_REWARD)
  58. if rewardInfo == nil or rewardInfo == "" then
  59. rewardInfo = {}
  60. end
  61. local info = {}
  62. for _,v in pairs(rewardInfo) do
  63. info[v] = 1
  64. end
  65. result.awards = info
  66. --全服限量购买
  67. local serverData = getsysvar(actor,AngelBenefit.Var.ALL_SERVER_LIMIT_BUY)
  68. if serverData == nil or serverData == "" then
  69. serverData = {}
  70. end
  71. local serverDataResult = {}
  72. for k,v in pairs(serverData) do
  73. serverDataResult[k] = table.count(v)
  74. end
  75. result.serverReward = serverDataResult
  76. --通知客户端
  77. sendluamsg(actor, LuaMessageIdToClient.RES_ANGLE_BENEFIT_INFO, table.valueConvertToString(result))
  78. end
  79. function AngelBenefit.login(actor)
  80. AngelBenefit.AcceptTask(actor)
  81. end
  82. ---接取任务
  83. function AngelBenefit.AcceptTask(actor)
  84. --活动是否开启
  85. if not AngelBenefit.isActivityOpen(actor) then
  86. return
  87. end
  88. local taskInfo = getplaydef(actor, AngelBenefit.Var.ANGLE_TASK)
  89. if taskInfo ~= nil then
  90. return
  91. end
  92. taskInfo = {}
  93. local config = ConfigDataManager.getTable("cfg_angleBenefitTask","taskRank",1)
  94. if not config then
  95. return
  96. end
  97. --接取任务
  98. for i = 1, #config,1 do
  99. local cfg = config[i]
  100. local targetId = cfg.tasktargetid
  101. local type = cfg.type
  102. local targetCfg = ConfigDataManager.getTable("cfg_task_target","id",targetId)
  103. local task = {}
  104. task.taskGoalId = targetCfg[1].taskgoalparam
  105. task.goalCount = targetCfg[1].goalcount
  106. task.nowCount = 0
  107. task.status = AngelBenefit.TASK_STATUS.ACCEPT
  108. task.taskRank = cfg.taskrank
  109. task.taskId = cfg.id
  110. taskInfo[type] = task
  111. end
  112. setplaydef(actor, AngelBenefit.Var.ANGLE_TASK, taskInfo)
  113. --通知客户端
  114. local result = {}
  115. for _,v in pairs(taskInfo) do
  116. local info = {}
  117. info.nowCount = v.nowCount
  118. info.status = v.status
  119. result[v.taskId] = info
  120. end
  121. sendluamsg(actor, LuaMessageIdToClient.RES_ANGLE_BENEFIT_TASK_CHANGE, table.valueConvertToString(result))
  122. end
  123. function AngelBenefit.UpdateTaskProgress(actor, type,param)
  124. local success, errorInfo = xpcall(this.UpdateTaskProgress, debug.traceback, actor, type,param)
  125. gameDebug.assertPrint(success, "大天使福利任务更新异常:", actor, type,param, errorInfo)
  126. end
  127. ---更新任务进度
  128. function this.UpdateTaskProgress(actor, type,param)
  129. if actor == nil then
  130. return
  131. end
  132. --活动是否开启
  133. if not AngelBenefit.isActivityOpen(actor) then
  134. return
  135. end
  136. local taskInfo = getplaydef(actor, AngelBenefit.Var.ANGLE_TASK)
  137. if not taskInfo then
  138. return
  139. end
  140. local task = taskInfo[tostring(type)]
  141. if not task then
  142. return
  143. end
  144. if task.status == AngelBenefit.TASK_STATUS.SUBMIT then
  145. return
  146. end
  147. --根据类型进行任务进度更新
  148. if tonumber(type)== AngelBenefit.TASK_TYPE.MONSTER then
  149. local monsterId = param
  150. if tonumber(task.taskGoalId) ~= tonumber(monsterId) then
  151. return
  152. else
  153. task.nowCount = tonumber(task.nowCount) + 1
  154. end
  155. end
  156. if tonumber(type)== AngelBenefit.TASK_TYPE.BRAVE then
  157. local floor = param--层数
  158. local oldF = task.nowCount
  159. if tonumber(oldF) < tonumber(floor) then
  160. task.nowCount = tonumber(floor)
  161. end
  162. end
  163. --更新任务状态
  164. if task.nowCount >= tonumber(task.goalCount) then
  165. task.status = AngelBenefit.TASK_STATUS.FINISH
  166. end
  167. taskInfo[tostring(type)] = task
  168. setplaydef(actor, AngelBenefit.Var.ANGLE_TASK, taskInfo)
  169. --通知客户端
  170. local result = {}
  171. for _,v in pairs(taskInfo) do
  172. local info = {}
  173. info.nowCount = v.nowCount
  174. info.status = v.status
  175. result[v.taskId] = info
  176. end
  177. sendluamsg(actor, LuaMessageIdToClient.RES_ANGLE_BENEFIT_TASK_CHANGE, table.valueConvertToString(result))
  178. end
  179. ---提交任务
  180. function AngelBenefit.submitTask(actor, msgData)
  181. local type = msgData.type
  182. local taskInfo = getplaydef(actor, AngelBenefit.Var.ANGLE_TASK)
  183. if not taskInfo then
  184. tipinfo(actor, "任务未接取")
  185. return
  186. end
  187. local task = taskInfo[tostring(type)]
  188. if not task then
  189. tipinfo(actor, "任务不存在")
  190. return
  191. end
  192. if task.status == AngelBenefit.TASK_STATUS.SUBMIT then
  193. tipinfo(actor, "任务不可重复提交")
  194. return
  195. end
  196. if task.status ~= AngelBenefit.TASK_STATUS.FINISH then
  197. tipinfo(actor, "任务未完成")
  198. return
  199. end
  200. --修改任务状态
  201. task.status = AngelBenefit.TASK_STATUS.SUBMIT
  202. taskInfo[tostring(type)] = task
  203. setplaydef(actor, AngelBenefit.Var.ANGLE_TASK, taskInfo)
  204. --发奖励
  205. local reward = AngelBenefit.GetTaskReward(type,task.taskRank)
  206. for itemCfgId, count in pairs(reward) do
  207. additemtobag(actor, itemCfgId, count, 0, 9999, '大天使福利')
  208. end
  209. --接取下一个任务
  210. local taskCfg = ConfigDataManager.getTable("cfg_angleBenefitTask","taskRank",tonumber(task.taskRank) + 1,"type",type)
  211. if taskCfg then
  212. local targetId = taskCfg[1].tasktargetid
  213. local targetCfg = ConfigDataManager.getTable("cfg_task_target","id",targetId)
  214. local newTask = {}
  215. newTask.taskGoalId = targetCfg[1].taskgoalparam
  216. newTask.goalCount = targetCfg[1].goalcount
  217. if tonumber(type) == AngelBenefit.TASK_TYPE.BRAVE then
  218. newTask.nowCount = task.nowCount
  219. newTask.status = tonumber(newTask.nowCount) >= tonumber(newTask.goalCount) and AngelBenefit.TASK_STATUS.FINISH or AngelBenefit.TASK_STATUS.ACCEPT
  220. else
  221. newTask.status = AngelBenefit.TASK_STATUS.ACCEPT
  222. newTask.nowCount = 0
  223. end
  224. newTask.taskRank = taskCfg[1].taskrank
  225. newTask.taskId = taskCfg[1].id
  226. taskInfo[tostring(type)] = newTask
  227. setplaydef(actor, AngelBenefit.Var.ANGLE_TASK, taskInfo)
  228. end
  229. --通知客户端
  230. local resultInfo = getplaydef(actor, AngelBenefit.Var.ANGLE_TASK)
  231. local result = {}
  232. local taskResult = resultInfo[tostring(type)]
  233. local info = {}
  234. info.nowCount = taskResult.nowCount
  235. info.status = taskResult.status
  236. result[tostring(taskResult.taskId)] = info
  237. sendluamsg(actor, LuaMessageIdToClient.RES_SUBMIT_ANGLE_BENEFIT_TASK, table.valueConvertToString(result))
  238. end
  239. ---获取任务奖励
  240. function AngelBenefit.GetTaskReward(type,order)
  241. local config = ConfigDataManager.getTable("cfg_angleBenefitTask","type",type,"taskRank",order)
  242. if not config then
  243. return {}
  244. end
  245. return string.putIntIntMap({},config[1].rewarditem,"#","|")
  246. end
  247. ---领取或购买积分奖励
  248. function AngelBenefit.receiveScoreReward(actor,msgData)
  249. --活动是否开启
  250. if not AngelBenefit.isActivityOpen(actor) then
  251. tipinfo(actor,"活动未开启!")
  252. return
  253. end
  254. local order = msgData.order
  255. local config = ConfigDataManager.getTable("cfg_angleBenefitReward","id",order)
  256. if not config then
  257. tipinfo(actor,"奖励不存在!")
  258. return
  259. end
  260. local rewardInfo = getplaydef(actor,AngelBenefit.Var.ANGLE_REWARD) or {}
  261. if table.contains(rewardInfo, tostring(config[1].id)) then
  262. tipinfo(actor, "请勿重复领取!")
  263. return
  264. end
  265. local cost = string.putIntIntMap({},config[1].rewardpoint,"#","|")
  266. for k , v in pairs(cost) do
  267. if not Bag.checkItem(actor, k, v) then
  268. tipinfo(actor, "积分不足")
  269. return
  270. end
  271. end
  272. local hasCost = false
  273. --判断开服天数
  274. local serverOpenDays = getbaseinfo(actor, "serveropendays")
  275. if tonumber(serverOpenDays) > tonumber(config[1].limittime) then
  276. local payConsume = splitbyshuxianandjinghao2(config[1].payconsume)
  277. for k,v in pairs(payConsume)do
  278. if not Bag.checkItem(actor, k, v) then
  279. tipinfo(actor,"材料不足,购买失败")
  280. return
  281. end
  282. end
  283. --扣材料
  284. for k, v in pairs(payConsume) do
  285. removeitemfrombag(actor, k, v, 0,9999,'大天使福利')
  286. end
  287. hasCost = true
  288. end
  289. --判断全服限购次数
  290. callonserial(actor,"all_server_reward_limit",config,hasCost)
  291. end
  292. function all_server_reward_limit(actor,config,hasCost)
  293. --判断全服限购次数
  294. local serverBuyInfo = getsysvar(actor,AngelBenefit.Var.ALL_SERVER_LIMIT_BUY)
  295. if serverBuyInfo == nil or serverBuyInfo == "" then
  296. serverBuyInfo = {}
  297. end
  298. local receiveList = serverBuyInfo[config[1].id] or {}
  299. if table.count(receiveList) >= tonumber(config[1].limitnum) and (not hasCost) then
  300. --花钱购买
  301. local payConsume = string.putIntIntMap({},config[1].payconsume,"#","|")
  302. for k,v in pairs(payConsume)do
  303. if not Bag.checkItem(actor, k, v) then
  304. tipinfo(actor,"材料不足,购买失败")
  305. return
  306. end
  307. end
  308. --扣材料
  309. for k, v in pairs(payConsume) do
  310. removeitemfrombag(actor, k, v,0,9999,'大天使福利')
  311. end
  312. else
  313. local playerBuyInfo = {}
  314. playerBuyInfo.receiveTime = getbaseinfo("now")
  315. playerBuyInfo.rid = getbaseinfo(actor,"rid")
  316. table.insert(receiveList,playerBuyInfo)
  317. serverBuyInfo[config[1].id] = receiveList
  318. setsysvar(AngelBenefit.Var.ALL_SERVER_LIMIT_BUY,serverBuyInfo)
  319. end
  320. --发奖励
  321. local career = getbaseinfo(actor,"getbasecareer")
  322. local reward = string.toIntIntMap4Career(career, config[1].reward, "#", "|")
  323. --local reward = string.putIntIntMap({},config[1].reward,"#","|")
  324. for itemCfgId, count in pairs(reward) do
  325. additemtobag(actor, itemCfgId, count,0,9999,'大天使福利')
  326. end
  327. --奖励弹框
  328. sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, reward)
  329. --记录已经领取的奖励
  330. table.insert(rewardInfo, config[1].id)
  331. setplaydef(actor,AngelBenefit.Var.ANGLE_REWARD,rewardInfo)
  332. --通知客户端
  333. local result = {}
  334. for _,index in pairs(rewardInfo)do
  335. result[index] = 1
  336. end
  337. sendluamsg(actor, LuaMessageIdToClient.RES_RECEIVE_ANGLE_BENEFIT_REWARD, table.valueConvertToString(result))
  338. end
  339. --页签关闭时邮件发送未领取奖励
  340. function AngelBenefit.OnCloseMail()
  341. local allRoleInfos = getallrolesummaryinfos()
  342. if allRoleInfos == nil or next(allRoleInfos) == nil then
  343. return
  344. end
  345. for _, roleInfo in pairs(allRoleInfos) do
  346. local reward = {}
  347. local actor = roleInfo["actor"]
  348. if AngelBenefit.tableOpen(actor) then
  349. return
  350. end
  351. local taskInfo = getplaydef(actor, AngelBenefit.Var.ANGLE_TASK)
  352. if taskInfo == nil or taskInfo == "" then
  353. taskInfo = {}
  354. end
  355. for k, v in pairs(taskInfo) do
  356. if v.status == AngelBenefit.TASK_STATUS.FINISH then
  357. local config = ConfigDataManager.getTable("cfg_angleBenefitTask", "type", k, "taskRank", v.taskRank)
  358. string.putIntIntMap(reward,config[1].rewarditem)
  359. end
  360. end
  361. setplaydef(actor, AngelBenefit.Var.ANGLE_TASK,nil)
  362. --发邮件
  363. if table.count(reward) > 0 then
  364. sendconfigmailbyrid(actor,getbaseinfo(actor,"rid"), MailConfig.END_TIME_ANGLE_REWARD, reward, "")
  365. end
  366. end
  367. setsysvar(AngelBenefit.Var.ALL_SERVER_LIMIT_BUY,nil)
  368. end