BusOneActivityTask.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. --------------------------------
  2. -- 文件名 : BusOneActivityTask.lua
  3. -- 文件说明 : 新商业活动-任务
  4. -- 创建时间 : 2025/08/05
  5. -- 创建人 : FC
  6. --------------------------------
  7. local tTaskConf = require("excel.BusoneActivity").Task
  8. local Util = require("common.Util")
  9. local Msg = require("core.Msg")
  10. local Grid = require("bag.Grid")
  11. local BagLogic = require("bag.BagLogic")
  12. local CommonDefine = require("common.CommonDefine")
  13. local AbsActLogic = require("absAct.AbsActLogic")
  14. local YunYingLogic = require("yunying.YunYingLogic")
  15. local TriggerLogic = require("trigger.TriggerLogic")
  16. local TriggerDefine = require("trigger.TriggerDefine")
  17. local ObjHuman = require("core.ObjHuman")
  18. local BusOneActivityBuy = require("absAct.BusOneActivityBuy")
  19. local BusOneActivityYuanZheng = require("absAct.BusOneActivityYuanZheng")
  20. local BusOneActivityHero = require("absAct.BusOneActivityHeroYuanZheng")
  21. local BUSONETASKABSID = 7201 -- 对应ABS活动ID
  22. local BUSONECHOSETASKNUM = 5 -- 选择任务数量
  23. -- 事件处理
  24. local tEventHandler = nil
  25. ----------------------------------------- 内部处理开始 -------------------------------------
  26. -- 获取任务DB数据
  27. local function BusOneTask_GetAllTask(human)
  28. return human.db.absAct[BUSONETASKABSID].tTaskInfo.tChoseTask
  29. end
  30. local function BusOneTask_SubEvent(uuid, nEventType)
  31. print("当前进入荣耀历程订阅事件 注册 nEventType = "..nEventType)
  32. TriggerLogic.SubscribeEvent(nEventType, uuid, BusOneTask_EventCallBack)
  33. end
  34. -- 订阅任务
  35. local function BusOneTask_BeginSubEvent(human)
  36. local uuid = human.db._id
  37. local tTaskDBData = BusOneTask_GetAllTask(human)
  38. for nID, v in pairs(tTaskDBData) do
  39. local tConfig = tTaskConf[nID]
  40. if tConfig then
  41. BusOneTask_SubEvent(uuid, tConfig.nType)
  42. end
  43. end
  44. end
  45. -- 清空任务数据
  46. local function BusOneTask_ClearTask(human)
  47. human.db.absAct[BUSONETASKABSID].tTaskInfo.tChoseTask = {}
  48. end
  49. -- 选择任务操作
  50. local function BusOneTask_ChoseTask(human)
  51. BusOneTask_ClearTask(human)
  52. local tType, tTypeTaskNum = {}, {}
  53. for nID, v in ipairs(tTaskConf) do
  54. if not tType[v.nType] then
  55. tType[v.nType] = 1
  56. end
  57. if not tTypeTaskNum[v.nType] then
  58. tTypeTaskNum[v.nType] = {}
  59. end
  60. table.insert(tTypeTaskNum[v.nType], nID)
  61. end
  62. local tChoseType, tChoseNum = {}, 0
  63. for i = 1, 100, 1 do
  64. if tChoseNum == BUSONECHOSETASKNUM then
  65. break
  66. end
  67. for nType, value in pairs(tType) do
  68. local nRandNum = math.random(1, 100)
  69. if 0 == nRandNum % 2 then
  70. if not tChoseType[nType] then
  71. tChoseType[nType] = 1
  72. tChoseNum = tChoseNum + 1
  73. break
  74. end
  75. end
  76. end
  77. end
  78. if tChoseNum ~= BUSONECHOSETASKNUM then
  79. print("[BusOneTask_ChoseTask] 没有正确的选择出任务类型的个数")
  80. return
  81. end
  82. for nType, _ in pairs(tChoseType) do
  83. local nLen = #tTypeTaskNum[nType]
  84. local nIndex = math.random(1, nLen)
  85. local nChoseID = tTypeTaskNum[nType][nIndex]
  86. human.db.absAct[BUSONETASKABSID].tTaskInfo.tChoseTask[nChoseID] = {
  87. nStatus = CommonDefine.COMMON_PRIZE_STATE_NOGET,
  88. nFinish = 0,
  89. }
  90. end
  91. end
  92. -- 创建DB数据
  93. local function BusOneTask_CreateDB(human)
  94. if not human.db.absAct[BUSONETASKABSID] then
  95. human.db.absAct[BUSONETASKABSID] = {}
  96. end
  97. human.db.absAct[BUSONETASKABSID].tTaskInfo = {
  98. nRefresh = os.time(),
  99. tChoseTask = {},
  100. }
  101. BusOneTask_ChoseTask(human)
  102. BusOneTask_BeginSubEvent(human)
  103. end
  104. -- 检测DB数据
  105. local function BusOneTask_CheckDB(human)
  106. if not human.db.absAct[BUSONETASKABSID] or nil == _G.next(human.db.absAct[BUSONETASKABSID])
  107. or not human.db.absAct[BUSONETASKABSID].tTaskInfo then
  108. BusOneTask_CreateDB(human)
  109. end
  110. end
  111. -- 获取任务状态
  112. local function BusOneTask_GetTaskStatus(human, nID)
  113. return human.db.absAct[BUSONETASKABSID].tTaskInfo.tChoseTask[nID].nStatus
  114. end
  115. -- 设置任务状态
  116. local function BusOneTask_SetTaskStatus(human, nID, nStatus)
  117. human.db.absAct[BUSONETASKABSID].tTaskInfo.tChoseTask[nID].nStatus = nStatus
  118. end
  119. -- 获取任务完成次数
  120. local function BusOneTask_GetTaskFinishNum(human, nID)
  121. return human.db.absAct[BUSONETASKABSID].tTaskInfo.tChoseTask[nID].nFinish
  122. end
  123. -- 设置任务状态
  124. local function BusOneTask_AddTaskFinishNum(human, nID, nAddNum)
  125. human.db.absAct[BUSONETASKABSID].tTaskInfo.tChoseTask[nID].nFinish = human.db.absAct[BUSONETASKABSID].tTaskInfo.tChoseTask[nID].nFinish + nAddNum
  126. end
  127. -- 获取任务刷新时间
  128. local function BusOneTask_GetTaskTime(human)
  129. return human.db.absAct[BUSONETASKABSID].tTaskInfo.nRefresh
  130. end
  131. -- 设置任务刷新时间
  132. local function BusOneTask_SetTaskTime(human, nValue)
  133. human.db.absAct[BUSONETASKABSID].tTaskInfo.nRefresh = nValue
  134. end
  135. -- 检测和重置任务数据
  136. local function BusOneTask_CheckAndResetTask(human)
  137. local nLastTime = BusOneTask_GetTaskTime(human)
  138. if nil == Util.isSameDay(nLastTime) then
  139. BusOneTask_SetTaskTime(human, os.time())
  140. BusOneTask_ChoseTask(human)
  141. BusOneTask_BeginSubEvent(human)
  142. end
  143. end
  144. -- 获得英雄
  145. local function BusOneTask_GetHero(nEventType, uuid, nValue1, nValue2)
  146. local human = ObjHuman.onlineUuid[uuid]
  147. if not human then
  148. print("[BusOneTask_GetHero] 玩家不在线了? nEventType = "..nEventType)
  149. return
  150. end
  151. local nNum = nValue1
  152. local nStar = nValue2
  153. local tAllDBData = BusOneTask_GetAllTask(human)
  154. local bSend = false
  155. for nID, v in pairs(tAllDBData) do
  156. local tConfig = tTaskConf[nID]
  157. if tConfig and tConfig.nType == nEventType and tConfig.ExtraParameter then
  158. if v.nStatus == CommonDefine.COMMON_PRIZE_STATE_NOGET then
  159. local tTaskArgument = Util.split(v.taskArgument , "|")
  160. if nNum >= tonumber(tTaskArgument[1]) and nStar == tonumber(tTaskArgument[2]) then
  161. v.nFinish = v.nFinish + 1
  162. if v.nFinish >= tConfig.nNeedFinish then
  163. v.nStatus = CommonDefine.COMMON_PRIZE_STATE_CANGET
  164. bSend = true
  165. end
  166. break
  167. end
  168. end
  169. end
  170. end
  171. end
  172. local function BusOneTask_Common(nEventType, uuid, nValue, nArgumentType)
  173. local human = ObjHuman.onlineUuid[uuid]
  174. if not human then
  175. print("[BusOneTask_Common] 玩家不在线了? nEventType = "..nEventType)
  176. return
  177. end
  178. local tAllDBData = BusOneTask_GetAllTask(human)
  179. local bSend = false
  180. for nID, v in pairs(tAllDBData) do
  181. local tConfig = tTaskConf[nID]
  182. if tConfig and tConfig.nType == nEventType then
  183. if v.nStatus == CommonDefine.COMMON_PRIZE_STATE_NOGET then
  184. v.nFinish = v.nFinish + nValue
  185. if v.nFinish >= tConfig.nNeedFinish then
  186. v.nStatus = CommonDefine.COMMON_PRIZE_STATE_CANGET
  187. bSend = true
  188. end
  189. break
  190. end
  191. end
  192. end
  193. end
  194. -----------------------------------客户端请求-----------------------------
  195. function BusOneTask_Query(human)
  196. BusOneTask_CheckDB(human)
  197. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_TASK_QUERY
  198. tMsgData.tTaskList[0] = 0
  199. local tTaskDB = BusOneTask_GetAllTask(human)
  200. print("[BusOneTask_Query] 开始打印任务数据")
  201. table.print_lua_table(tTaskDB)
  202. print("[BusOneTask_Query] 结束打印任务数据")
  203. for nID, v in pairs(tTaskDB) do
  204. local tConfig = tTaskConf[nID]
  205. if tConfig then
  206. tMsgData.tTaskList[0] = tMsgData.tTaskList[0] + 1
  207. local tData = tMsgData.tTaskList[tMsgData.tTaskList[0]]
  208. tData.nID = nID
  209. tData.szDes = tConfig.szDes
  210. tData.nStatus = v.nStatus
  211. tData.nNowFinishNum = v.nFinish
  212. tData.nNeedFinishNum = tConfig.nNeedFinish
  213. tData.tPrize[0] = #tConfig.tPrize
  214. for i, tItem in ipairs(tConfig.tPrize) do
  215. local nGoodsID = tItem[1]
  216. local nGoodsNum = tItem[2]
  217. Grid.makeItem(tData.tPrize[i], nGoodsID, nGoodsNum)
  218. end
  219. else
  220. print("[BusOneTask_Query] 不存在对应的任务ID配置 nID = "..nID)
  221. end
  222. end
  223. Msg.send(tMsgData, human.fd)
  224. end
  225. function BusOneTask_Get(human)
  226. local tTaskDB = BusOneTask_GetAllTask(human)
  227. local tItem = {}
  228. for nID, v in pairs(tTaskDB) do
  229. local tConfig = tTaskConf[nID]
  230. if tConfig and v.nStatus == CommonDefine.COMMON_PRIZE_STATE_CANGET then
  231. v.nStatus = CommonDefine.COMMON_PRIZE_STATE_GET
  232. for _, tGoods in ipairs(tConfig.tPrize) do
  233. local nGoodsID = tGoods[1]
  234. local nGoodsNum = tGoods[2]
  235. if not tItem[nGoodsID] then
  236. tItem[nGoodsID] = 0
  237. end
  238. tItem[nGoodsID] = tItem[nGoodsID] + nGoodsNum
  239. end
  240. end
  241. end
  242. if nil ~= _G.next(tItem) then
  243. local tGoods = {}
  244. for nID, nNum in pairs(tItem) do
  245. table.insert(tGoods, {nID, nNum})
  246. end
  247. BagLogic.addItemList(human, tGoods, "BusOneTask")
  248. BusOneTask_Query(human)
  249. end
  250. end
  251. -----------------------------------外部调用-----------------------------
  252. function isOpen(human, YYInfo, funcConfig)
  253. print("[BusOneActivityTask_isOpen] 进入判断")
  254. local state, endTime, startTime = AbsActLogic.isStarted(human, funcConfig and funcConfig.funcID or BUSONETASKABSID)
  255. if not state then
  256. print("[BusOneActivityTask_isOpen] 当前活动未开启")
  257. return
  258. end
  259. print("[BusOneActivityTask_isOpen] 进入判断 endTime = "..endTime.." startTime = "..startTime)
  260. return true, endTime, startTime
  261. end
  262. function isActive(human, YYInfo, funcConfig)
  263. return not isOpen(human, YYInfo, funcConfig)
  264. end
  265. function isRed(human, YYInfo, absActConfig)
  266. BusOneTask_CheckDB(human)
  267. local tDBData = BusOneTask_GetAllTask(human)
  268. for nID, v in pairs(tDBData) do
  269. if CommonDefine.COMMON_PRIZE_STATE_CANGET == v.nStatus then
  270. return true
  271. end
  272. end
  273. return false
  274. end
  275. function onLogin(human)
  276. if false == isOpen(human) then
  277. return
  278. end
  279. print("[BusOneTask_onLogin] 玩家登录进行处理")
  280. BusOneTask_CheckDB(human)
  281. BusOneTask_CheckAndResetTask(human)
  282. end
  283. function onZeroAll()
  284. -- 遍历在线玩家
  285. for uuid, human in pairs(ObjHuman.onlineUuid) do
  286. onLogin(human)
  287. end
  288. end
  289. function Init()
  290. tEventHandler = {
  291. [TriggerDefine.EVENT_TYPE_GETHERO] = BusOneTask_GetHero, -- 获得英雄
  292. [TriggerDefine.EVENT_TYPE_FATESUMMON] = BusOneTask_Common, -- 天命召唤
  293. [TriggerDefine.EVENT_TYPE_FINDSTAR] = BusOneTask_Common, -- 寻星
  294. [TriggerDefine.DRAWCALL_SERNIOR_CNT] = BusOneTask_Common, -- 高抽
  295. [TriggerDefine.EQUIP_REFINEMENT] = BusOneTask_Common, -- 装备洗练
  296. [TriggerDefine.JINBI_DEL] = BusOneTask_Common, -- 消耗金币
  297. [TriggerDefine.GUYU_DEL] = BusOneTask_Common, -- 消耗古玉
  298. [TriggerDefine.JINGYAN_DEL] = BusOneTask_Common, -- 消耗经验
  299. }
  300. end
  301. function BusOneTask_EventCallBack(nEventType, uuid, nValue1, nValue2)
  302. if not tEventHandler then
  303. Init()
  304. end
  305. if not tEventHandler or not tEventHandler[nEventType] then
  306. print("[BusOneTask_EventCallBack] 不存在对应的处理函数 当前已经返回",nEventType)
  307. return
  308. end
  309. pcall(tEventHandler[nEventType], nEventType, uuid, nValue1, nValue2)
  310. end
  311. function BusOneTask_SendRed(human)
  312. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_SEND_RED
  313. tMsgData.tListRed[0] = 4
  314. tMsgData.tListRed[1] = isRed(human) == true and 1 or 0
  315. tMsgData.tListRed[2] = BusOneActivityBuy.isRed(human) == true and 1 or 0
  316. tMsgData.tListRed[3] = BusOneActivityYuanZheng.isRed(human) == true and 1 or 0
  317. tMsgData.tListRed[4] = BusOneActivityHero.isRed(human) == true and 1 or 0
  318. Msg.send(tMsgData, human.fd)
  319. end