TaskHandler.lua 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. ---
  2. --- Generated by EmmyLua(https://github.com/EmmyLua)
  3. --- Created by zhangkai.
  4. --- DateTime: 2024/8/29 下午2:08
  5. ---
  6. TaskHandler = {}
  7. local this = {}
  8. ---任务状态
  9. TaskHandler.Status = {
  10. ---已接取
  11. ACCEPT = 1,
  12. ---已完成
  13. FINISH = 2,
  14. ---已提交
  15. SUBMIT = 3,
  16. }
  17. ---任务记录
  18. function this.GetNewTaskRecord()
  19. local TaskRecord = {
  20. ---任务id
  21. task_id = 0,
  22. ---任务目标id
  23. target_id = 0,
  24. ---任务目标类型
  25. task_goal = 0,
  26. ---任务当前进度
  27. goal_count = 0,
  28. ---任务目标数量
  29. max_count = 0,
  30. ---任务状态
  31. state = TaskHandler.Status.ACCEPT,
  32. }
  33. return TaskRecord
  34. end
  35. ---@alias TaskGoalHandler table 外置任务类型目标
  36. TaskGoalHandler = {
  37. ---@see 通关副本次数
  38. [TaskTargetType.FINISH_DUPLICATE] = ActivityTaskGoal.FlushFinishDupCount,
  39. ---@see 通关指定副本次数
  40. [TaskTargetType.FINISH_GOAL_DUP] = ActivityTaskGoal.FlushFinishGoalDupCount,
  41. ---@see 合成次数
  42. [TaskTargetType.SYNTHESIS] = EquipTaskGoal.FlushSynthesisCount,
  43. ---@see 回收次数
  44. [TaskTargetType.RECOVERY] = EquipTaskGoal.FlushRecoveryCount,
  45. ---@see 指定部位强化到达指定等级
  46. [TaskTargetType.PARTS_STRENGTHEN_LV] = EquipTaskGoal.FlushPartsStrengthenLv,
  47. ---@see 完成勇士任务
  48. [TaskTargetType.FINISH_GOLD_TASK] = ActivityTaskGoal.FlushFinishGoldTaskCount,
  49. ---@see 在指定地图对怪造成伤害
  50. [TaskTargetType.HURT_MAP_MONSTER] = MonsterTaskGoal.FlushHurtMapMonster,
  51. ---@see 首饰升级
  52. [TaskTargetType.JEWELRY_LV_UP] = EquipTaskGoal.FlushJewelryLvUp,
  53. ---@see 通关秘境副本
  54. [TaskTargetType.FINISH_SECRET_REALM_DUPLICATE] = ActivityTaskGoal.FlushSecretRealmFinishTimes,
  55. ---@see 开启三倍收益
  56. [TaskTargetType.OPEN_TRIPLE_INCOME] = PlayerTaskGoal.FlushTripleIncome,
  57. ---@see 指定部位追加到达指定等级
  58. [TaskTargetType.EQUIP_APPEND] = EquipTaskGoal.FlushPartsAppendLv,
  59. ---@see 击杀指定类型怪物
  60. [TaskTargetType.KILL_TYPE_MONSTER] = MonsterTaskGoal.FlushKillTypeMonster,
  61. ---@see 交易行上架商品
  62. [TaskTargetType.TRADE_LINE_UP_GOODS] = TradeTaskGoal.FlushTradeLineUpGoods,
  63. ---@see 商城购买商品
  64. [TaskTargetType.MALL_BUY_GOODS] = TradeTaskGoal.FlushMallBuyGoods,
  65. ---@see 装备叠加
  66. [TaskTargetType.EQUIP_SUPERPOSITION] = EquipTaskGoal.FlushEquipSuperposition,
  67. ---@see 卓越词条
  68. [TaskTargetType.EXCELLENCE_ATTR] = EquipTaskGoal.FlushExcellenceAttr,
  69. ---@see 镶嵌萤石
  70. [TaskTargetType.INLAID_GEMSTONES] = EquipTaskGoal.FlushInlaidGemstones,
  71. ---@see 装备卓越词条数量
  72. [TaskTargetType.EQUIP_EXCELLENCE_ATTR_COUNT] = EquipTaskGoal.FlushExcellenceAttrCount,
  73. ---@see 加点
  74. [TaskTargetType.DEPLOY_ATTR_POINT] = PlayerTaskGoal.FlushDeployAttrPoint,
  75. ---@see 重新获取一个指定道具
  76. [TaskTargetType.RE_GET_ITEM] = EquipTaskGoal.FlushReGetItem,
  77. ---@see 从NPC商店购买指定道具
  78. [TaskTargetType.NPC_MALL_BUY_GOODS] = TradeTaskGoal.FlushNpcMallBuyGoods,
  79. ---@see 回收获得指定道具
  80. [TaskTargetType.RECOVERY_GET_APPOINT_ITEM] = EquipTaskGoal.FlushRecoveryGetAppointItem,
  81. ---@see 完成一次BOSS悬赏
  82. [TaskTargetType.BOSS_BOUNTY] = ActivityTaskGoal.FlushBossRewardBounty,
  83. ---@see 激活连击技能
  84. [TaskTargetType.ACTIVATE_COMBO_SKILL] = PlayerTaskGoal.FlushActivateComboSkill,
  85. ---@see 激活白银特权
  86. [TaskTargetType.ACTIVATE_SILVER_PRIVILEGE] = PlayerTaskGoal.ActivateSilverPrivilege,
  87. ---@see 完成第X章首饰任务
  88. [TaskTargetType.JEWELRY_TASK_CHAPTER] = ActivityTaskGoal.JewelryTaskChapter,
  89. ---@see 穿戴装备累计强化x次数
  90. [TaskTargetType.EQUIP_STRENGTHEN_TIMES] = EquipTaskGoal.EquipStrengthenTimes,
  91. ---@see 击杀x次指定等级以上怪物
  92. [TaskTargetType.KILL_LEVEL_MONSTER] = MonsterTaskGoal.KillLevelMonster,
  93. ---@see 使用果实
  94. [TaskTargetType.USE_FRUIT_ITEM] = PlayerTaskGoal.UseFruitItem,
  95. ---@see 穿戴装备的总追加达到x级
  96. [TaskTargetType.EQUIP_APPEND_TOTAL_LV] = EquipTaskGoal.EquipAppendTotalLv,
  97. ---@see 穿戴指定装备
  98. [TaskTargetType.SPECIFIC_STAGE_EQUIP] = EquipTaskGoal.SpecificStageEquip,
  99. ---@see 尾刀击杀怪物
  100. [TaskTargetType.LAST_KILL_MONSTER] = MonsterTaskGoal.LastKillMonster,
  101. ---@see 镶嵌卡牌
  102. [TaskTargetType.INLAID_TRANSFORMATION_CARD] = EquipTaskGoal.InlaidTransformationCard,
  103. ---@see 完成勇气试炼X层
  104. [TaskTargetType.FLUSH_BRAVE_TEST_LV] = ActivityTaskGoal.FlushBraveTestLv,
  105. ---@see 进入地图分线
  106. [TaskTargetType.ENTER_MAP_LINE] = PlayerTaskGoal.EnterMapLine,
  107. ---@see 首刀击杀怪物
  108. [TaskTargetType.FIRST_ATTACK_MONSTER] = MonsterTaskGoal.FirstAttackMonster,
  109. ---@see 合成卡牌
  110. [TaskTargetType.SYNTHESIS_CARD] = EquipTaskGoal.FlushSynthesisCard,
  111. ---@see 装备指定数量圣杯
  112. [TaskTargetType.TAKE_ON_GRAIL_COUNT] = EquipTaskGoal.FlushTakeOnGrailCount,
  113. ---@see 强化圣杯 达到强化到指定等级的圣杯数量
  114. [TaskTargetType.STRENGTHEN_GRAIL] = EquipTaskGoal.FlushStrengthenGrail,
  115. }
  116. ---@description 触发任务刷新
  117. ---@param actor table 玩家对象
  118. ---@param taskTargetType number 任务目标类型
  119. ---@param param any 自定义刷新参数
  120. function TaskHandler.TriggerTaskGoal(actor, taskTargetType, param)
  121. local success, errorInfo = xpcall(this.TriggerTaskGoal, debug.traceback, actor, taskTargetType, param)
  122. if not success then
  123. gameDebug.assertPrint(success, "任务目标更新异常:", errorInfo, "参数", actor, taskTargetType, param)
  124. end
  125. end
  126. function this.TriggerTaskGoal(actor, taskTargetType, param)
  127. local ok = TaskGoal.IsTaskTargetType(taskTargetType)
  128. if not ok then
  129. return
  130. end
  131. ---触发内置任务系统系统刷新
  132. if TaskGoal.isLuaGoalType(taskTargetType) then
  133. taskgoalflush(actor, taskTargetType, param)
  134. end
  135. -- 任意任务类型刷新触发
  136. DailyActivity.taskGoalFlush(actor, taskTargetType, param)
  137. -- 刷新王者之路任务
  138. KingRoad.FlushKingRoadTask(actor, taskTargetType, param)
  139. -- 翅膀任务刷新
  140. Wings.FlushWingsTask(actor, taskTargetType, param)
  141. end
  142. ---构建任务记录
  143. ---@param actor table 玩家对象
  144. ---@param taskId number 任务id
  145. ---@param targetId number 任务目标配置id
  146. function TaskHandler.BuildTaskRecord(actor, taskId, targetId)
  147. local success, taskRecord = xpcall(this.BuildTaskRecord, debug.traceback, actor, taskId, targetId)
  148. if not success then
  149. gameDebug.assertPrint(success, "构建任务记录异常:", taskRecord, "参数", actor, taskId, targetId)
  150. return nil
  151. end
  152. return taskRecord
  153. end
  154. function this.BuildTaskRecord(actor, taskId, targetId)
  155. local targetList = ConfigDataManager.getTable("cfg_task_target", "id", targetId)
  156. if table.isNullOrEmpty(targetList) or #targetList < 1 then
  157. return nil
  158. end
  159. local targetConfig = targetList[1]
  160. local taskGoalType = tonumber(targetConfig["taskgoaltype"])
  161. local ok = TaskGoal.IsTaskTargetType(taskGoalType)
  162. if not ok then
  163. return nil
  164. end
  165. local maxCount = tonumber(targetConfig["goalcount"])
  166. if maxCount == nil then
  167. maxCount = 1
  168. end
  169. local taskRecord = this.GetNewTaskRecord()
  170. taskRecord.task_id = taskId
  171. taskRecord.target_id = targetId
  172. taskRecord.task_goal = taskGoalType
  173. taskRecord.max_count = maxCount
  174. local count = TaskGoal.FlushTaskCount(actor, taskGoalType, targetId, 0, nil)
  175. if count > 0 then
  176. taskRecord.goal_count = math.min(count, maxCount)
  177. if count >= maxCount then
  178. taskRecord.state = TaskHandler.Status.FINISH
  179. end
  180. end
  181. return taskRecord
  182. end
  183. function TaskHandler.onTaskChange(actor, taskId, state)
  184. TaskHandler.saveTaskChange(actor, taskId, state)
  185. TaskHandler.sendTaskState(actor)
  186. end
  187. function TaskHandler.saveTaskChange(actor, taskId, state)
  188. local taskStates = getplaydef(actor, "T$taskStates") or {}
  189. taskStates[taskId] = state
  190. setplaydef(actor, "T$taskStates", taskStates)
  191. end
  192. function TaskHandler.sendTaskState(actor)
  193. local taskStates = getplaydef(actor, "T$taskStates") or {}
  194. sendluamsg(actor, LuaMessageIdToClient.RES_TASK_STATES_TO_FUNC_ON, taskStates)
  195. end