BusOneActivityTask.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  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("[BusOneTask_SubEvent] 进入荣新商业活动-任务 订阅事件 注册 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. print("[BusOneTask_GetHero] 获取了英雄 nEventType = "..nEventType.." uuid = "..uuid.." nNum = "..nNum.." nStar = "..nStar)
  154. local tAllDBData = BusOneTask_GetAllTask(human)
  155. local bSend = false
  156. for nID, v in pairs(tAllDBData) do
  157. local tConfig = tTaskConf[nID]
  158. if tConfig and tConfig.nType == nEventType and tConfig.ExtraParameter then
  159. if v.nStatus == CommonDefine.COMMON_PRIZE_STATE_NOGET then
  160. local tTaskArgument = Util.split(tConfig.ExtraParameter , "|")
  161. if nNum >= tonumber(tTaskArgument[1]) and nStar == tonumber(tTaskArgument[2]) then
  162. v.nFinish = v.nFinish + 1
  163. if v.nFinish >= tConfig.nNeedFinish then
  164. v.nStatus = CommonDefine.COMMON_PRIZE_STATE_CANGET
  165. bSend = true
  166. end
  167. end
  168. end
  169. end
  170. end
  171. if true == bSend then
  172. YunYingLogic.sendBanner(human)
  173. BusOneTask_SendRed(human)
  174. end
  175. end
  176. local function BusOneTask_Common(nEventType, uuid, nValue, nArgumentType)
  177. local human = ObjHuman.onlineUuid[uuid]
  178. if not human then
  179. print("[BusOneTask_Common] 玩家不在线了? nEventType = "..nEventType)
  180. return
  181. end
  182. print("[BusOneTask_Common] 通用回调开始 nEventType = "..nEventType.." uuid = "..uuid)
  183. local tAllDBData = BusOneTask_GetAllTask(human)
  184. local bSend = false
  185. for nID, v in pairs(tAllDBData) do
  186. local tConfig = tTaskConf[nID]
  187. if tConfig and tConfig.nType == nEventType then
  188. if v.nStatus == CommonDefine.COMMON_PRIZE_STATE_NOGET then
  189. v.nFinish = v.nFinish + nValue
  190. if v.nFinish >= tConfig.nNeedFinish then
  191. v.nStatus = CommonDefine.COMMON_PRIZE_STATE_CANGET
  192. bSend = true
  193. end
  194. break
  195. end
  196. end
  197. end
  198. if true == bSend then
  199. YunYingLogic.sendBanner(human)
  200. BusOneTask_SendRed(human)
  201. end
  202. end
  203. -----------------------------------客户端请求-----------------------------
  204. function BusOneTask_Query(human)
  205. BusOneTask_CheckDB(human)
  206. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_TASK_QUERY
  207. tMsgData.tTaskList[0] = 0
  208. local tTaskDB = BusOneTask_GetAllTask(human)
  209. print("[BusOneTask_Query] 开始打印任务数据")
  210. table.print_lua_table(tTaskDB)
  211. print("[BusOneTask_Query] 结束打印任务数据")
  212. for nID, v in pairs(tTaskDB) do
  213. local tConfig = tTaskConf[nID]
  214. if tConfig then
  215. tMsgData.tTaskList[0] = tMsgData.tTaskList[0] + 1
  216. local tData = tMsgData.tTaskList[tMsgData.tTaskList[0]]
  217. tData.nID = nID
  218. tData.szDes = tConfig.szDes
  219. tData.nStatus = v.nStatus
  220. tData.nNowFinishNum = v.nFinish
  221. tData.nNeedFinishNum = tConfig.nNeedFinish
  222. tData.tPrize[0] = #tConfig.tPrize
  223. for i, tItem in ipairs(tConfig.tPrize) do
  224. local nGoodsID = tItem[1]
  225. local nGoodsNum = tItem[2]
  226. Grid.makeItem(tData.tPrize[i], nGoodsID, nGoodsNum)
  227. end
  228. else
  229. print("[BusOneTask_Query] 不存在对应的任务ID配置 nID = "..nID)
  230. end
  231. end
  232. Msg.send(tMsgData, human.fd)
  233. end
  234. function BusOneTask_Get(human)
  235. local tTaskDB = BusOneTask_GetAllTask(human)
  236. local tItem = {}
  237. for nID, v in pairs(tTaskDB) do
  238. local tConfig = tTaskConf[nID]
  239. if tConfig and v.nStatus == CommonDefine.COMMON_PRIZE_STATE_CANGET then
  240. v.nStatus = CommonDefine.COMMON_PRIZE_STATE_GET
  241. for _, tGoods in ipairs(tConfig.tPrize) do
  242. local nGoodsID = tGoods[1]
  243. local nGoodsNum = tGoods[2]
  244. if not tItem[nGoodsID] then
  245. tItem[nGoodsID] = 0
  246. end
  247. tItem[nGoodsID] = tItem[nGoodsID] + nGoodsNum
  248. end
  249. end
  250. end
  251. if nil ~= _G.next(tItem) then
  252. local tGoods = {}
  253. for nID, nNum in pairs(tItem) do
  254. table.insert(tGoods, {nID, nNum})
  255. end
  256. BagLogic.addItemList(human, tGoods, "BusOneTask")
  257. BusOneTask_Query(human)
  258. YunYingLogic.sendBanner(human)
  259. BusOneTask_SendRed(human)
  260. end
  261. end
  262. -----------------------------------外部调用-----------------------------
  263. function isOpen(human, YYInfo, funcConfig)
  264. print("[BusOneActivityTask_isOpen] 进入判断")
  265. local state, endTime, startTime = AbsActLogic.isStarted(human, funcConfig and funcConfig.funcID or BUSONETASKABSID)
  266. if not state then
  267. print("[BusOneActivityTask_isOpen] 当前活动未开启")
  268. return
  269. end
  270. print("[BusOneActivityTask_isOpen] 进入判断 endTime = "..endTime.." startTime = "..startTime)
  271. return true, endTime, startTime
  272. end
  273. function isActive(human, YYInfo, funcConfig)
  274. return not isOpen(human, YYInfo, funcConfig)
  275. end
  276. function isRed(human, YYInfo, absActConfig)
  277. BusOneTask_CheckDB(human)
  278. local tDBData = BusOneTask_GetAllTask(human)
  279. for nID, v in pairs(tDBData) do
  280. if CommonDefine.COMMON_PRIZE_STATE_CANGET == v.nStatus then
  281. return true
  282. end
  283. end
  284. return false
  285. end
  286. function onLogin(human)
  287. if false == isOpen(human) then
  288. return
  289. end
  290. print("[BusOneTask_onLogin] 玩家登录进行处理")
  291. BusOneTask_CheckDB(human)
  292. BusOneTask_CheckAndResetTask(human)
  293. BusOneTask_BeginSubEvent(human)
  294. end
  295. function onZeroAll()
  296. -- 遍历在线玩家
  297. for uuid, human in pairs(ObjHuman.onlineUuid) do
  298. onLogin(human)
  299. end
  300. end
  301. local function BusOneTask_Init()
  302. print("[BusOneTask_Init] 初始化回调函数开始")
  303. tEventHandler = {
  304. [TriggerDefine.EVENT_TYPE_GETHERO] = BusOneTask_GetHero, -- 获得英雄
  305. [TriggerDefine.EVENT_TYPE_FATESUMMON] = BusOneTask_Common, -- 天命召唤
  306. [TriggerDefine.EVENT_TYPE_FINDSTAR] = BusOneTask_Common, -- 寻星
  307. [TriggerDefine.DRAWCALL_SERNIOR_CNT] = BusOneTask_Common, -- 高抽
  308. [TriggerDefine.EQUIP_REFINEMENT] = BusOneTask_Common, -- 装备洗练
  309. [TriggerDefine.JINBI_DEL] = BusOneTask_Common, -- 消耗金币
  310. [TriggerDefine.GUYU_DEL] = BusOneTask_Common, -- 消耗古玉
  311. [TriggerDefine.JINGYAN_DEL] = BusOneTask_Common, -- 消耗经验
  312. }
  313. print("[BusOneTask_Init] 初始化回调函数完成")
  314. end
  315. function BusOneTask_EventCallBack(nEventType, uuid, nValue1, nValue2)
  316. print("[BusOneTask_EventCallBack] 进入回调函数 11111 nEventType = "..nEventType)
  317. if not tEventHandler then
  318. print("[BusOneTask_EventCallBack] 进入初始化 回调数据 ")
  319. BusOneTask_Init()
  320. end
  321. print("[BusOneTask_EventCallBack] 进入回调函数 22222 nEventType = "..nEventType)
  322. if not tEventHandler or not tEventHandler[nEventType] then
  323. print("[BusOneTask_EventCallBack] 不存在对应的处理函数 当前已经返回",nEventType)
  324. return
  325. end
  326. print("[BusOneTask_EventCallBack] 商业活动回调开始 nEventType = "..nEventType.." uuid = "..uuid)
  327. pcall(tEventHandler[nEventType], nEventType, uuid, nValue1, nValue2)
  328. end
  329. function BusOneTask_SendRed(human)
  330. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_SEND_RED
  331. tMsgData.tListRed[0] = 4
  332. tMsgData.tListRed[1] = isRed(human) == true and 1 or 0
  333. tMsgData.tListRed[2] = BusOneActivityBuy.isRed(human) == true and 1 or 0
  334. tMsgData.tListRed[3] = BusOneActivityYuanZheng.isRed(human) == true and 1 or 0
  335. tMsgData.tListRed[4] = BusOneActivityHero.isRed(human) == true and 1 or 0
  336. Msg.send(tMsgData, human.fd)
  337. end