ServerCommerceActTask.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. --------------------------------
  2. -- 文件名 : ServerCommerceActShop.lua
  3. -- 文件说明 : 跨服商业-任务
  4. -- 创建时间 : 2025/04/08
  5. -- 创建人 : FC
  6. --------------------------------
  7. local Util = require("common.Util")
  8. local Msg = require("core.Msg")
  9. local Grid = require("bag.Grid")
  10. local BagLogic = require("bag.BagLogic")
  11. local CommonDefine = require("common.CommonDefine")
  12. local ServerCommerceConf = require("excel.ServerCommerce")
  13. local ObjHuman = require("core.ObjHuman")
  14. local TriggerDefine = require("trigger.TriggerDefine")
  15. local TriggerLogic = require("trigger.TriggerLogic")
  16. local ServerCommerceManager = require("serverCommerce.ServerCommerceManager")
  17. ----------------------------------------- 内部处理开始 -------------------------------------
  18. -- 配置
  19. local function CommerceActTask_GetTaskCof()
  20. return ServerCommerceConf.CommerceTask
  21. end
  22. local function CommerceActTask_GetTaskPointCof()
  23. return ServerCommerceConf.CommerceTaskPoint
  24. end
  25. -- 订阅事件
  26. local function CommerceActTask_SubEvent(uuid, nEventType)
  27. TriggerLogic.SubscribeEvent(nEventType, uuid, CommerceActTask_EventCallBack)
  28. end
  29. -- 创建DB数据
  30. function CreatDB(human)
  31. if not human.db.ServerCommerce or not human.db.ServerCommerce.Task then
  32. print("[CommerceActTask_CreatDB] 初始化数据失败 name = "..human.db.name)
  33. return false
  34. end
  35. human.db.ServerCommerce.Task = {
  36. nTime = os.time(), -- 当前事件
  37. nTaskPoint = 0, -- 任务积分
  38. TaskPrize = {}, -- 任务数据
  39. TaskPointPrize = {}, -- 任务积分奖励
  40. }
  41. local tConf = CommerceActTask_GetTaskCof()
  42. local tEvnetType = {}
  43. local tDBTask = human.db.ServerCommerce.Task.TaskPrize
  44. for nID, v in ipairs(tConf) do
  45. if not tDBTask[v.nTaskType] then
  46. tDBTask[v.nTaskType] = {
  47. nFinishNum = 0, -- 完成次数
  48. taskStatus = {}, -- 任务状态
  49. }
  50. end
  51. tDBTask.taskStatus[nID] = CommonDefine.COMMON_PRIZE_STATE_NOGET
  52. if not tEvnetType[v.nTaskType] then
  53. CommerceActTask_SubEvent(human.db._id, v.nTaskType)
  54. tEvnetType[v.nTaskType] = 1
  55. end
  56. end
  57. tConf = CommerceActTask_GetTaskPointCof()
  58. local tDBTaskPointPrize = human.db.ServerCommerce.Task.TaskPointPrize
  59. for nID, v in pairs(tConf) do
  60. if not tDBTaskPointPrize[nID] then
  61. tDBTaskPointPrize[nID] = CommonDefine.COMMON_PRIZE_STATE_NOGET
  62. end
  63. end
  64. return true
  65. end
  66. -- 获取任务奖励DB数据
  67. local function CommerceActTask_GetTaskDB(human)
  68. return human.db.ServerCommerce.Task
  69. end
  70. local function CommerceActTask_GetOpenTime(human)
  71. return human.db.ServerCommerce.Task.nTime
  72. end
  73. -- 获取任务状态
  74. local function CommerceActTask_GetTaskStatus(human, nID, nTaskType)
  75. local tDBData = CommerceActTask_GetTaskDB(human)
  76. if not tDBData.TaskPrize[nTaskType] or not tDBData.TaskPrize[nTaskType].taskStatus[nID] then
  77. return CommonDefine.COMMON_PRIZE_STATE_NOGET
  78. end
  79. return tDBData.TaskPrize[nTaskType].taskStatus[nID]
  80. end
  81. -- 设置任务状态
  82. local function CommerceActTask_SetTaskStatus(human, nID, nTaskType, nValue)
  83. local tDBData = CommerceActTask_GetTaskDB(human)
  84. tDBData.TaskPrize[nTaskType].taskStatus[nID] = nValue
  85. end
  86. -- 获取任务完成次数
  87. local function CommerceActTask_GetTaskFinishNum(human, nTaskType)
  88. local tDBData = CommerceActTask_GetTaskDB(human)
  89. if not tDBData.TaskPrize[nTaskType] then
  90. return 0
  91. end
  92. return tDBData.TaskPrize[nTaskType].nFinishNum
  93. end
  94. -- 增加任务完成次数
  95. local function CommerceActTask_AddTaskFinishNum(human, nTaskType, nAddNum)
  96. local tDBData = CommerceActTask_GetTaskDB(human)
  97. if not tDBData.TaskPrize[nTaskType] then
  98. return
  99. end
  100. tDBData.TaskPrize[nTaskType].nFinishNum = tDBData.TaskPrize[nTaskType].nFinishNum + nAddNum
  101. end
  102. -- 获取任务积分
  103. local function CommerceActTask_GetTaskPoint(human)
  104. local tDBData = CommerceActTask_GetTaskDB(human)
  105. return tDBData.nTaskPoint
  106. end
  107. -- 增加任务积分
  108. local function CommerceActTask_AddTaskPoint(human, nPoint)
  109. local tDBData = CommerceActTask_GetTaskDB(human)
  110. tDBData.nTaskPoint = tDBData.nTaskPoint + nPoint
  111. end
  112. -- 获取任务积分奖励状态
  113. local function CommerceActTask_GetTaskPointPrizeStatus(human, nID)
  114. local tDBData = CommerceActTask_GetTaskDB(human)
  115. if not tDBData.TaskPointPrize or not tDBData.TaskPointPrize[nID] then
  116. return CommonDefine.COMMON_PRIZE_STATE_NOGET
  117. end
  118. return tDBData.TaskPointPrize[nID]
  119. end
  120. -- 设置 任务积分奖励状态
  121. local function CommerceActTask_SetTaskPointPrizeStatus(human, nID, nValue)
  122. local tDBData = CommerceActTask_GetTaskDB(human)
  123. tDBData.TaskPointPrize[nID] = nValue
  124. end
  125. -- 检查任务是否完成
  126. local function CommerceActTask_CheckTaskStatus(human, nTaskType)
  127. local tConf = CommerceActTask_GetTaskCof()
  128. local nNowFinishNum = CommerceActTask_GetTaskFinishNum(human, nTaskType)
  129. local nDay
  130. for nID, v in ipairs(tConf) do
  131. if v.nTaskType == nTaskType then
  132. if nNowFinishNum >= v.nValue then
  133. local nState = CommerceActTask_GetTaskStatus(human, nID, nTaskType)
  134. if CommonDefine.COMMON_PRIZE_STATE_NOGET == nState then
  135. CommerceActTask_SetTaskStatus(human, nID, v.nTaskType, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  136. if not nDay then
  137. nDay = v.nDay
  138. end
  139. end
  140. else
  141. break
  142. end
  143. end
  144. end
  145. -- if nil ~= nDay then
  146. -- local nOpenTime = CommerceActTask_GetOpenTime(human)
  147. -- local nDiffDay = Util.diffDay(nOpenTime)
  148. -- if nDiffDay == nDay then
  149. -- CommerceActTask_QueryTask(human, nDay)
  150. -- end
  151. -- end
  152. end
  153. -- 检查任务点数奖励状态
  154. local function CommerceActTask_CheckTaskPointStatus(human)
  155. local nNowPoint = CommerceActTask_GetTaskPoint()
  156. local tConf = CommerceActTask_GetTaskPointCof()
  157. local bSendClient = false
  158. for nID, v in ipairs(tConf) do
  159. if nNowPoint >= v.nPoint then
  160. local nState = CommerceActTask_GetTaskPointPrizeStatus(human, nID)
  161. if CommonDefine.COMMON_PRIZE_STATE_NOGET == nState then
  162. bSendClient = true
  163. CommerceActTask_SetTaskPointPrizeStatus(human, nID, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  164. end
  165. else
  166. break
  167. end
  168. end
  169. if true == bSendClient then
  170. CommerceActTask_QueryTaskPoint(human)
  171. end
  172. end
  173. ----------------------------------------回调处理---------------------------------------------------
  174. -- 事件回调通用处理
  175. local function CommerceActTask_EvnentCommon(nEventType, uuid, ...)
  176. local human = ObjHuman.onlineUuid[uuid]
  177. if not human then
  178. return
  179. end
  180. local nLen = #arg
  181. if nLen < 1 then
  182. print("[CommerceActTask_EvnentCommon] 当前可变参数居然小于1了!! 确定是通用处理吗? nEventType = "..nEventType)
  183. return
  184. end
  185. -- 次数作为参数
  186. local nValue = arg[1]
  187. -- 增加完成次数
  188. CommerceActTask_AddTaskFinishNum(human, nEventType, nValue)
  189. -- 检查任务状态
  190. CommerceActTask_CheckTaskStatus(human, nEventType)
  191. end
  192. -- 事件-获得英雄处理
  193. local function CommerceActTask_EvnentGetHero(nEventType, uuid, ...)
  194. local human = ObjHuman.onlineUuid[uuid]
  195. if not human then
  196. return
  197. end
  198. local nLen = #arg
  199. if nLen < 2 then
  200. print("[CommerceActTask_EvnentGetHero] 当前可变参数居然小于2了!! 确定是获得英雄处理吗? nEventType = "..nEventType)
  201. return
  202. end
  203. local nNum = arg[1]
  204. local nStar = arg[2]
  205. local bCheck = false
  206. local tConf = CommerceActTask_GetTaskCof()
  207. for nID, v in ipairs(tConf) do
  208. if v.nTaskType == nEventType then
  209. if not v.nTaskArgument then
  210. print("[CommerceActTask_EvnentGetHero] 获得英雄但是没有获取到对应的配置参数要求")
  211. else
  212. local tTaskArgument = Util.split(v.nTaskArgument , "|")
  213. if 2 ~= #tTaskArgument then
  214. print("[CommerceActTask_EvnentGetHero] 获取的任务 参数数量不正确")
  215. else
  216. if nNum >= tTaskArgument[1] and nStar >= tTaskArgument[2] then
  217. CommerceActTask_AddTaskFinishNum(human, nEventType, 1)
  218. bCheck = true
  219. end
  220. end
  221. end
  222. end
  223. end
  224. CommerceActTask_CheckTaskStatus(human, nEventType)
  225. end
  226. -- 事件处理
  227. local tEventHandler = nil
  228. -- 起服处理
  229. function Init()
  230. tEventHandler = {
  231. [TriggerDefine.EVENT_TYPE_SWEEP] = CommerceActTask_EvnentCommon,
  232. [TriggerDefine.CHAT_TIMES] = CommerceActTask_EvnentCommon,
  233. [TriggerDefine.FRIEND_COMBAT] = CommerceActTask_EvnentCommon,
  234. [TriggerDefine.EVENT_TYPE_FINDSTAR] = CommerceActTask_EvnentCommon,
  235. [TriggerDefine.EVENT_TYPE_FATESUMMON] = CommerceActTask_EvnentCommon,
  236. [TriggerDefine.EVENT_TYPE_OPENBOX] = CommerceActTask_EvnentCommon,
  237. [TriggerDefine.EVENT_TYPE_CHAMPIONSNUM] = CommerceActTask_EvnentCommon,
  238. [TriggerDefine.EVENT_TYPE_GETHERO] = CommerceActTask_EvnentGetHero,
  239. [TriggerDefine.EVENT_TYPE_SHOPBUY] = CommerceActTask_EvnentCommon,
  240. [TriggerDefine.EVENT_TYPE_UNIONSKILLUP] = CommerceActTask_EvnentCommon,
  241. }
  242. end
  243. ----------------------------------------- 外部调用开始 -------------------------------------
  244. function CommerceActTask_EventCallBack(nEventType, uuid, ...)
  245. if not tEventHandler or not tEventHandler[nEventType] then
  246. ServerCommerceManager.CommerveManager_WriteLog("[CommerceActTask_EventCallBack] 不存在对应的回调处理函数 nEventType = "..nEventType)
  247. return
  248. end
  249. print("[CommerceActTask_EventCallBack] 收到事件触发回调 nEventType = "..nEventType)
  250. tEventHandler[nEventType](nEventType, uuid, ...)
  251. end
  252. ----------------------------------------- 客户端请求 -------------------------------------
  253. -- 请求战区集结任务信息
  254. function CommerceActTask_QueryTask(human, nDay)
  255. local tConf = CommerceActTask_GetTaskCof()
  256. local tMsgData = Msg.gc.GC_SERVEERCOMMERCE_ACT_TASKQUERY
  257. tMsgData.nDay = nDay
  258. tMsgData.nNowPoint = CommerceActTask_GetTaskPoint(human)
  259. local tListData = tMsgData.list
  260. tListData[0] = 0
  261. for nID, v in ipairs(tConf) do
  262. if v.nDay == nDay then
  263. tListData[0] = tListData[0] + 1
  264. local tNode = tListData[tListData[0]]
  265. tNode.nID = nID
  266. tNode.nState = CommerceActTask_GetTaskStatus(human, nID, v.nTaskType)
  267. tNode.nDay = v.nDay
  268. tNode.nValue = v.nValue
  269. tNode.nPoint = v.nPoint
  270. tNode.Desc = v.szDes
  271. tNode.item[0] = #v.Prize
  272. for i, tItemData in ipairs(v.Prize) do
  273. Grid.makeItem(tNode.item[i], tItemData[1], tItemData[2])
  274. end
  275. end
  276. end
  277. Msg.send(tMsgData, human.fd)
  278. end
  279. -- 请求领取任务奖励
  280. function CG_SERVEERCOMMERCE_ACT_GETTASKPRIZE(human, nDay)
  281. local tConf = CommerceActTask_GetTaskCof()
  282. local tGoods = {}
  283. local nAddPoint = 0
  284. for nID, v in ipairs(tConf) do
  285. if v.nDay == nDay then
  286. local nState = CommerceActTask_GetTaskStatus(human, nID, v.nTaskType)
  287. if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
  288. for i, tItemData in ipairs(v.Prize) do
  289. if not tGoods[tItemData[1]] then
  290. tGoods[tItemData[1]] = 0
  291. end
  292. tGoods[tItemData[1]] = tGoods[tItemData[1]] + tItemData[2]
  293. end
  294. nAddPoint = nAddPoint + v.nPoint
  295. CommerceActTask_SetTaskStatus(human, nID, v.nTaskType, CommonDefine.COMMON_PRIZE_STATE_GET)
  296. end
  297. end
  298. end
  299. if nil ~= _G.next(tGoods) then
  300. local tItem = {}
  301. for nID, nNum in pairs(tGoods) do
  302. table.insert(tItem, {nID, nNum})
  303. end
  304. BagLogic.addItemList(human, tItem, "servercommerce")
  305. -- 增加积分
  306. CommerceActTask_AddTaskPoint(human, nAddPoint)
  307. -- 检查积分奖励状态
  308. CommerceActTask_CheckTaskPointStatus(human)
  309. -- 增加全服积分
  310. ServerCommerceManager.CommerveManager_AddServerPoint(nAddPoint)
  311. -- 增加个人积分
  312. ServerCommerceManager.CommerveManager_AddHumanPint(human, nAddPoint)
  313. CommerceActTask_QueryTask(human, nDay)
  314. end
  315. end
  316. -- 请求任务积分信息
  317. function CommerceActTask_QueryTaskPoint(human)
  318. local tConf = CommerceActTask_GetTaskPointCof()
  319. local tMsgData = Msg.gc.GC_SERVEERCOMMERCE_ACT_TASKPOINTQUERY
  320. tMsgData.nNowPoint = CommerceActTask_GetTaskPoint(human)
  321. local tListData = tMsgData.listPoint
  322. tListData[0] = 0
  323. for nID, v in ipairs(tConf) do
  324. tListData[0] = tListData[0] + 1
  325. local tNode = tListData[tListData[0]]
  326. tNode.nID = nID
  327. tNode.nNeedPoint = v.nPoint
  328. tNode.nState = CommerceActTask_GetTaskPointPrizeStatus(human, nID)
  329. tNode.item[0] = #v.Prize
  330. for i, tItemData in ipairs(v.Prize) do
  331. Grid.makeItem(tNode.item[i], tItemData[1], tItemData[2])
  332. end
  333. end
  334. Msg.send(tMsgData, human.fd)
  335. end
  336. -- 战区集结 - 领取任务积分奖励
  337. function CommerceActTask_GetTaskPointPrize(human)
  338. local tConf = CommerceActTask_GetTaskPointCof()
  339. local tGoods = {}
  340. for nID, v in ipairs(tConf) do
  341. local nState = CommerceActTask_GetTaskPointPrizeStatus(human, nID)
  342. if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
  343. for i, tItemData in ipairs(v.Prize) do
  344. if not tGoods[tItemData[1]] then
  345. tGoods[tItemData[1]] = 0
  346. end
  347. tGoods[tItemData[1]] = tGoods[tItemData[1]] + tItemData[2]
  348. end
  349. CommerceActTask_SetTaskPointPrizeStatus(human, nID, CommonDefine.COMMON_PRIZE_STATE_GET)
  350. end
  351. end
  352. if nil ~= _G.next(tGoods) then
  353. local tItem = {}
  354. for nID, nNum in pairs(tGoods) do
  355. table.insert(tItem, {nID, nNum})
  356. end
  357. BagLogic.addItemList(human, tItem, "servercommerce")
  358. CommerceActTask_QueryTaskPoint(human)
  359. end
  360. end
  361. function isRed(human)
  362. local tConf = CommerceActTask_GetTaskCof()
  363. local nOpenTime = CommerceActTask_GetOpenTime(human)
  364. local nDiffDay = Util.diffDay(nOpenTime)
  365. for nID, v in ipairs(tConf) do
  366. if v.nDay <= nDiffDay then
  367. local nState = CommerceActTask_GetTaskStatus(human, nID, v.nTaskType)
  368. if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
  369. return true
  370. end
  371. end
  372. end
  373. tConf = CommerceActTask_GetTaskPointCof()
  374. for nID, v in ipairs(tConf) do
  375. local nState = CommerceActTask_GetTaskPointPrizeStatus(human, nID)
  376. if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
  377. return true
  378. end
  379. end
  380. return false
  381. end
  382. function onLogin(human)
  383. local tConf = CommerceActTask_GetTaskCof()
  384. local tTaskType = {}
  385. for nID, v in ipairs(tConf) do
  386. if not tTaskType[v.nTaskType] then
  387. local nState = CommerceActTask_GetTaskStatus(human, nID, v.nTaskType)
  388. -- 没有完成才订阅
  389. if nState == CommonDefine.COMMON_PRIZE_STATE_NOGET then
  390. tTaskType[v.nTaskType] = 1
  391. end
  392. end
  393. end
  394. -- 订阅事件
  395. for nTaskType, v in pairs(tTaskType) do
  396. CommerceActTask_SubEvent(human.db._id, nTaskType)
  397. print("[onLogin] 玩家订阅了事件 nTaskType = "..nTaskType)
  398. end
  399. end