MainTask.lua 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. local function subscribeEvents(human)
  90. local mainTaskData = getTaskData(human)
  91. local taskData = mainTaskData.taskData
  92. local nowTaskId = mainTaskData.nowTaskId
  93. local maxTaskId = #Config
  94. local maxTaskCfg = Config[maxTaskId]
  95. if nowTaskId == maxTaskId and taskData[maxTaskId] and taskData[maxTaskId].progress >= maxTaskCfg.condProgress then
  96. return
  97. end
  98. local registerTypeList = {}
  99. for taskId, taskCfg in ipairs(Config) do
  100. if not registerTypeList[taskCfg.eventType] and (not taskData[taskId] or taskData[taskId].progress < taskCfg.condProgress) then
  101. TriggerLogic.SubscribeEvent(taskCfg.eventType, human.db._id, EventCBFunc)
  102. registerTypeList[ taskCfg.eventType] = 1
  103. end
  104. end
  105. end
  106. function onLogin(human)
  107. calcTaskOldProgress(human)
  108. subscribeEvents(human)
  109. end
  110. --事件处理函数
  111. function EventCBFunc(eventType, uuid, nValue1, nValue2)
  112. local human = ObjHuman.onlineUuid[uuid]
  113. if not human then
  114. return
  115. end
  116. local isNowTask = false
  117. local mainTaskData = getTaskData(human)
  118. local taskData = mainTaskData.taskData
  119. local nowTaskId = mainTaskData.nowTaskId
  120. for taskId, taskCfg in ipairs(Config) do
  121. if taskCfg.eventType == eventType and (not taskData[taskId] or taskData[taskId].progress < taskCfg.condProgress) then
  122. if taskCfg.extraCond <= 0 or (nValue2 and nValue2 >= taskCfg.extraCond) then
  123. updateTaskProgress(human, taskId, nValue1, true)
  124. if taskId == nowTaskId then
  125. isNowTask = true
  126. end
  127. end
  128. end
  129. end
  130. --推数据给客户端更新
  131. if isNowTask then
  132. TaskQuery(human)
  133. end
  134. end
  135. --查询
  136. function TaskQuery(human)
  137. local mainTaskData = getTaskData(human)
  138. local taskData = mainTaskData.taskData
  139. local nowTaskId = mainTaskData.nowTaskId
  140. local maxTaskId = #Config
  141. local nowTaskCfg = Config[nowTaskId]
  142. local msgRet = Msg.gc.GC_MAINTASK_QUERY
  143. msgRet.nowTaskId = nowTaskId
  144. msgRet.nowProgess = taskData[nowTaskId] and taskData[nowTaskId].progress or 0
  145. msgRet.condProgess = nowTaskCfg.condProgress
  146. msgRet.taskDesc = nowTaskCfg.taskDesc
  147. msgRet.panelID = nowTaskCfg.panelID
  148. Grid.makeItem(msgRet.taskAward, nowTaskCfg.reward[1], nowTaskCfg.reward[2])
  149. msgRet.isNoTask = 0
  150. if nowTaskId == maxTaskId and taskData[nowTaskId] and taskData[nowTaskId].isGetReward then
  151. msgRet.isNoTask = 1
  152. end
  153. Msg.send(msgRet, human.fd)
  154. end
  155. --领奖
  156. function GetReward(human, taskId)
  157. local mainTaskData = getTaskData(human)
  158. local taskData = mainTaskData.taskData
  159. local nowTaskId = mainTaskData.nowTaskId
  160. local nowTaskCfg = Config[nowTaskId]
  161. if not taskData[nowTaskId] or taskData[nowTaskId].progress < nowTaskCfg.condProgress then
  162. return Broadcast.sendErr(human, Lang.UNION_TASK_NOT_COMPLETE)
  163. end
  164. if taskData[nowTaskId] and taskData[nowTaskId].isGetReward then
  165. return Broadcast.sendErr(human, Lang.FRIEND_HEART_GET_HAD)
  166. end
  167. updateTaskStatus(human, nowTaskId, true)
  168. local rewardCfg = nowTaskCfg.reward
  169. BagLogic.addItemList(human, { {rewardCfg[1], rewardCfg[2]} }, MAINTASKLOGTAG)
  170. nowTaskId = nowTaskId + 1
  171. if Config[nowTaskId] then
  172. updateNowTaskId(human, nowTaskId)
  173. end
  174. TaskQuery(human)
  175. end
  176. --GM 更新任务进度
  177. function GM_UpdateTaskProgress(human, taskId, progress)
  178. if not taskId or not progress then
  179. return
  180. end
  181. updateTaskProgress(human, taskId, progress)
  182. TaskQuery(human)
  183. end
  184. --GM 更新当前任务
  185. function GM_UpdateNowTask(human, newTaskId)
  186. if not Config[newTaskId] then
  187. return
  188. end
  189. updateNowTaskId(human, newTaskId)
  190. TaskQuery(human)
  191. end
  192. --GM 清除任务
  193. function GM_ClearTask(human, taskId)
  194. if not taskId then
  195. return
  196. end
  197. local mainTaskData = getTaskData(human)
  198. mainTaskData[taskId] = nil
  199. TaskQuery(human)
  200. end
  201. function GM_ClearAllTaskData(human)
  202. human.db.mainTaskData = nil
  203. calcTaskOldProgress(human)
  204. TaskQuery(human)
  205. end