MainTask.lua 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. --主线任务流
  2. --db
  3. --[=[
  4. human.db.mainTaskData = {
  5. taskData = {
  6. [taskId] = {
  7. progress = ni, --当前进度
  8. isGetReward = nil, --是否已领奖, isGetReward为真标识已领奖
  9. },
  10. },
  11. nowTaskId = nil, --当前任务
  12. }
  13. ]=]--
  14. local Msg = require("core.Msg")
  15. local Grid = require("bag.Grid")
  16. local BagLogic = require("bag.BagLogic")
  17. local Lang = require("common.Lang")
  18. local Broadcast = require("broadcast.Broadcast")
  19. local Config = require("excel.mainTask").mainTask
  20. local TriggerLogic = require("trigger.TriggerLogic")
  21. local TriggerDefine = require("trigger.TriggerDefine")
  22. local ObjHuman = require("core.ObjHuman")
  23. local EliteDefine = require("battle.EliteDefine")
  24. --日志标识
  25. local MAINTASKLOGTAG = "mainTask"
  26. local function initTaskData(human)
  27. human.db.mainTaskData = {nowTaskId = 1, taskData = {}}
  28. end
  29. local function getTaskData(human)
  30. return human.db.mainTaskData
  31. end
  32. local function updateTaskProgress(human, taskId, val, isAdd)
  33. local mainTaskData = getTaskData(human)
  34. local taskData = mainTaskData.taskData
  35. taskData[taskId] = taskData[taskId] or {}
  36. if isAdd then
  37. taskData[taskId].progress = (taskData[taskId].progress or 0) + val
  38. else
  39. taskData[taskId].progress = val
  40. end
  41. end
  42. local function updateTaskStatus(human, taskId, newStatus)
  43. local mainTaskData = getTaskData(human)
  44. local taskData = mainTaskData.taskData
  45. taskData[taskId].isGetReward = newStatus
  46. end
  47. local function updateNowTaskId(human, newTaskId)
  48. local mainTaskData = getTaskData(human)
  49. mainTaskData.nowTaskId = newTaskId
  50. end
  51. --获取某类任务在该活动之前就达成的进度
  52. local function getTaskOldProgress(human, eventType)
  53. local progress = 0
  54. if eventType == TriggerDefine.HUANJINGTOWER_PASS then
  55. local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
  56. progress = HuanJingTowerLogic.getTowerLevel(human)
  57. elseif eventType == TriggerDefine.LIANYU_PASS then
  58. local LianyuLogic = require("lianyu.LianyuLogic")
  59. progress = LianyuLogic.getMaxLv(human)
  60. elseif eventType == TriggerDefine.REALM_UPGRADE then
  61. local RoleRealmLogic = require("roleSystem.RoleRealmLogic")
  62. progress = RoleRealmLogic.GetNowRealmLv(human)
  63. elseif eventType == TriggerDefine.BATTLE_NORMAL_MODE_PASS then
  64. local BattleLogic = require("battle.BattleLogic")
  65. progress = BattleLogic.GetLevelByType(human, EliteDefine.COPY_ELITE_NORMAL)
  66. end
  67. return progress
  68. end
  69. -- 统计部分任务老的进度
  70. local function calcTaskOldProgress(human)
  71. local mainTaskData = getTaskData(human)
  72. if not mainTaskData then
  73. initTaskData(human)
  74. local type2Val = {}
  75. for taskId, taskCfg in ipairs(Config) do
  76. if taskCfg.isCalcOldVal > 0 then --一些任务需要统计老的进度数据
  77. local eventType = taskCfg.eventType
  78. if not type2Val[eventType] then
  79. type2Val[eventType] = getTaskOldProgress(human, eventType)
  80. end
  81. if type2Val[eventType] and type2Val[eventType] > 0 then
  82. updateTaskProgress(human, taskId, type2Val[eventType], false)
  83. end
  84. end
  85. end
  86. end
  87. end
  88. -- 异常处理函数
  89. -- 主线闯关, 恶魔之塔, 绝望深渊相关任务有时候出现统计不准确的情况, 暂未找到bug, 先做个异常处理
  90. local function abnormalDeclFunc(human)
  91. local mainTaskData = getTaskData(human)
  92. if not mainTaskData then
  93. return
  94. end
  95. local taskData = mainTaskData.taskData
  96. if not next(taskData) then
  97. return
  98. end
  99. local nowTaskId = mainTaskData.nowTaskId
  100. local maxTaskId = #Config
  101. if nowTaskId >= maxTaskId and (taskData[nowTaskId] and taskData[nowTaskId].progress >= Config[nowTaskId].condProgress) then
  102. return
  103. end
  104. local type2Val = {}
  105. for taskId, singleTaskData in pairs(taskData) do
  106. local taskCfg = Config[taskId]
  107. if taskCfg and singleTaskData.progress < taskCfg.condProgress and taskCfg.isCalcOldVal > 0 then
  108. local eventType = taskCfg.eventType
  109. if not type2Val[eventType] then
  110. type2Val[eventType] = getTaskOldProgress(human, eventType)
  111. end
  112. if type2Val[eventType] > 0 then
  113. updateTaskProgress(human, taskId, type2Val[eventType], false)
  114. end
  115. end
  116. end
  117. end
  118. --订阅事件
  119. local function subscribeEvents(human)
  120. local mainTaskData = getTaskData(human)
  121. local taskData = mainTaskData.taskData
  122. local nowTaskId = mainTaskData.nowTaskId
  123. local maxTaskId = #Config
  124. local maxTaskCfg = Config[maxTaskId]
  125. if nowTaskId == maxTaskId and taskData[maxTaskId] and taskData[maxTaskId].progress >= maxTaskCfg.condProgress then
  126. return
  127. end
  128. local registerTypeList = {}
  129. for taskId, taskCfg in ipairs(Config) do
  130. if not registerTypeList[taskCfg.eventType] and (not taskData[taskId] or taskData[taskId].progress < taskCfg.condProgress) then
  131. TriggerLogic.SubscribeEvent(taskCfg.eventType, human.db._id, EventCBFunc)
  132. registerTypeList[ taskCfg.eventType] = 1
  133. end
  134. end
  135. end
  136. function onLogin(human)
  137. calcTaskOldProgress(human)
  138. abnormalDeclFunc(human)
  139. subscribeEvents(human)
  140. end
  141. --事件处理函数
  142. function EventCBFunc(eventType, uuid, nValue1, nValue2)
  143. local human = ObjHuman.onlineUuid[uuid]
  144. if not human then
  145. return
  146. end
  147. local isNowTask = false
  148. local mainTaskData = getTaskData(human)
  149. local taskData = mainTaskData.taskData
  150. local nowTaskId = mainTaskData.nowTaskId
  151. for taskId, taskCfg in ipairs(Config) do
  152. if taskCfg.eventType == eventType and (not taskData[taskId] or taskData[taskId].progress < taskCfg.condProgress) then
  153. if taskCfg.extraCond <= 0 or (nValue2 and nValue2 >= taskCfg.extraCond) then
  154. updateTaskProgress(human, taskId, nValue1, true)
  155. if taskId == nowTaskId then
  156. isNowTask = true
  157. end
  158. end
  159. end
  160. end
  161. --推数据给客户端更新
  162. if isNowTask then
  163. TaskQuery(human)
  164. end
  165. end
  166. --查询
  167. function TaskQuery(human)
  168. local mainTaskData = getTaskData(human)
  169. local taskData = mainTaskData.taskData
  170. local nowTaskId = mainTaskData.nowTaskId
  171. local maxTaskId = #Config
  172. if nowTaskId > maxTaskId then
  173. nowTaskId = maxTaskId
  174. end
  175. local nowTaskCfg = Config[nowTaskId]
  176. local msgRet = Msg.gc.GC_MAINTASK_QUERY
  177. msgRet.nowTaskId = nowTaskId
  178. msgRet.nowProgess = taskData[nowTaskId] and taskData[nowTaskId].progress or 0
  179. msgRet.condProgess = nowTaskCfg.condProgress
  180. msgRet.taskDesc = nowTaskCfg.taskDesc
  181. msgRet.panelID = nowTaskCfg.panelID
  182. Grid.makeItem(msgRet.taskAward, nowTaskCfg.reward[1], nowTaskCfg.reward[2])
  183. msgRet.isNoTask = 0
  184. if nowTaskId == maxTaskId and taskData[nowTaskId] and taskData[nowTaskId].isGetReward then
  185. msgRet.isNoTask = 1
  186. end
  187. Msg.send(msgRet, human.fd)
  188. end
  189. --领奖
  190. function GetReward(human, taskId)
  191. local mainTaskData = getTaskData(human)
  192. local taskData = mainTaskData.taskData
  193. local nowTaskId = mainTaskData.nowTaskId
  194. local nowTaskCfg = Config[nowTaskId]
  195. if not taskData[nowTaskId] or taskData[nowTaskId].progress < nowTaskCfg.condProgress then
  196. return Broadcast.sendErr(human, Lang.UNION_TASK_NOT_COMPLETE)
  197. end
  198. if taskData[nowTaskId] and taskData[nowTaskId].isGetReward then
  199. return Broadcast.sendErr(human, Lang.FRIEND_HEART_GET_HAD)
  200. end
  201. updateTaskStatus(human, nowTaskId, true)
  202. local rewardCfg = nowTaskCfg.reward
  203. BagLogic.addItemList(human, { {rewardCfg[1], rewardCfg[2]} }, MAINTASKLOGTAG)
  204. nowTaskId = nowTaskId + 1
  205. --if Config[nowTaskId] then
  206. updateNowTaskId(human, nowTaskId)
  207. --end
  208. TaskQuery(human)
  209. end
  210. --GM 更新任务进度
  211. function GM_UpdateTaskProgress(human, taskId, progress)
  212. if not taskId or not progress then
  213. return
  214. end
  215. updateTaskProgress(human, taskId, progress)
  216. TaskQuery(human)
  217. end
  218. --GM 更新当前任务
  219. function GM_UpdateNowTask(human, newTaskId)
  220. if not Config[newTaskId] then
  221. return
  222. end
  223. updateNowTaskId(human, newTaskId)
  224. TaskQuery(human)
  225. end
  226. --GM 清除任务
  227. function GM_ClearTask(human, taskId)
  228. if not taskId then
  229. return
  230. end
  231. local mainTaskData = getTaskData(human)
  232. mainTaskData[taskId] = nil
  233. TaskQuery(human)
  234. end
  235. function GM_ClearAllTaskData(human)
  236. human.db.mainTaskData = nil
  237. calcTaskOldProgress(human)
  238. TaskQuery(human)
  239. end