ServerCommerceManager.lua 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996
  1. --------------------------------
  2. -- 文件名 : ServerCommerceActManger.lua
  3. -- 文件说明 : 跨服商业-活动模板管理
  4. -- 创建时间 : 2025/03/26
  5. -- 创建人 : FC
  6. --------------------------------
  7. local Util = require("common.Util")
  8. local Lang = require("common.Lang")
  9. local Broadcast = require("broadcast.Broadcast")
  10. local MailExcel = require("excel.mail")
  11. local Msg = require("core.Msg")
  12. local ObjHuman = require("core.ObjHuman")
  13. local CommonDB = require("common.CommonDB")
  14. local Log = require("common.Log")
  15. local YunYingLogic = require("yunying.YunYingLogic")
  16. local ServerCommerceCof = require("excel.ServerCommerce")
  17. local ServerCommerceActDefine = require("serverCommerce.ServerCommerceActDefine")
  18. local Timer = require("core.Timer")
  19. local BuyConf = require("excel.buy")
  20. local ServerCommerceMiddle = require("serverCommerce.ServerCommerceMiddle")
  21. local ServerCommerceActCharge = require("serverCommerce.ServerCommerceActCharge")
  22. local ServerCommerceActRank = require("serverCommerce.ServerCommerceActRank")
  23. local ServerCommerceTask = require("serverCommerce.ServerCommerceActTask")
  24. local Config = require("Config")
  25. local CombatPosLogic = require("combat.CombatPosLogic")
  26. local CombatDefine = require("combat.CombatDefine")
  27. -- 活动信息
  28. tCommerceActInfo = nil
  29. -- {
  30. -- nStartTime = nil, -- 开始时间
  31. -- nEendTime = nil, -- 结束时间
  32. -- isRun = nil, -- 是否在活动中
  33. -- nOpen = nil, -- 是否打开
  34. -- nBatchID = nil, -- 批次
  35. -- }
  36. -- 加载的模块
  37. tCommerceActModuel = {}
  38. -- 当前的操作类型
  39. local nQueryOperate = nil
  40. -- 起服请求活动状态重试控制(仅新服窗口)
  41. local nServerOpenRetryCnt = 0
  42. local bServerOpenRetryRunning = false
  43. local bServerOpenQueryDone = false
  44. ----------------------------------------- 内部处理开始 -------------------------------------
  45. -- 下发数据
  46. local function CommerceAct_SendData(tMsgData, fd)
  47. Msg.send(tMsgData, fd)
  48. end
  49. local function CommerceAct_CheckOpenDay()
  50. local nNowOpenDay = CommonDB.getServerOpenDay()
  51. return nNowOpenDay >= ServerCommerceActDefine.COMMERCEACT_SHOW_OPENDAY
  52. end
  53. -- 创建玩家DB数据
  54. function CommerceAct_CreateHumanDB(human)
  55. local nBatchID = 1
  56. local tCommonDBData = CommonDB.GetCommerceActInfo()
  57. if tCommonDBData and nil ~= _G.next(tCommonDBData) then
  58. nBatchID = tCommonDBData.nBatchID
  59. end
  60. human.db.ServerCommerce =
  61. {
  62. nPoint = 0, -- 当前玩家个人积分
  63. Task = {}, -- 任务信息
  64. Charge = {}, -- 连充豪礼
  65. Shop = {}, -- 战区钜惠
  66. nBatchID = nBatchID, -- 批次
  67. bSendPlayerMail = false, -- 是否发送个人邮件
  68. bSendServerMail = false, -- 是否发送全服邮件
  69. battleGround = {
  70. freeChallengeCnt = ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES,
  71. resetTime = os.time(),
  72. },
  73. }
  74. for nID, module in pairs(tCommerceActModuel) do
  75. if module and module.CreatDB then
  76. local bRet = module.CreatDB(human)
  77. if false == bRet then
  78. print("[CommerceAct_CreateHumanDB] nID 初始化DB 数据失败 nID = "..nID)
  79. end
  80. end
  81. end
  82. end
  83. -- 下发活动数据
  84. function CommerceAct_SendActInfo(human)
  85. if not human or not tCommerceActInfo then
  86. return
  87. end
  88. if false == CommerceAct_CheckOpenDay() then
  89. return
  90. end
  91. print("[CommerceAct_SendActInfo] 下发活动数据 开始 ")
  92. local tMsgData = Msg.gc.GC_SERVEERCOMMERCE_ACT_ALLINFO
  93. tMsgData.nStartTime = tCommerceActInfo.nStartTime
  94. tMsgData.nEendTime = tCommerceActInfo.nEendTime
  95. tMsgData.tActID[0] = #ServerCommerceCof.CommerceAct
  96. local nIndex = 1
  97. for id, v in pairs(ServerCommerceCof.CommerceAct) do
  98. local tActData = tMsgData.tActID[nIndex]
  99. nIndex = nIndex + 1
  100. tActData.ID = id
  101. tActData.name = v.name
  102. tActData.nSortID = v.sortID
  103. tActData.nIcon = v.icon
  104. tActData.nPanelID = v.panelID
  105. local bRed = false
  106. if tCommerceActModuel[id] and tCommerceActModuel[id].isRed then
  107. bRed = tCommerceActModuel[id].isRed(human)
  108. end
  109. print("[CommerceAct_SendActInfo] name = "..tActData.name)
  110. tActData.nRed = (bRed == true) and 1 or 0
  111. end
  112. YunYingLogic.sendBanner(human)
  113. CommerceAct_SendData(tMsgData, human.fd)
  114. print("[CommerceAct_SendActInfo] 下发活动数据 结束 ")
  115. end
  116. -- 各个子活动重置活动数据
  117. local function CommerceAct_ResetData(human)
  118. if not human then
  119. return
  120. end
  121. end
  122. -- 各个子活动处理结束数据
  123. local function CommerceAct_HandleEndData(human)
  124. if not human then
  125. return
  126. end
  127. end
  128. -- 所有活动初始化数据开始
  129. local function CommerceAct_BeginAllAct(human)
  130. if not human or not tCommerceActInfo then
  131. return
  132. end
  133. CommerceAct_CreateHumanDB(human)
  134. print("[CommerceAct_BeginAllAct] 所有活动初始化数据开始 ")
  135. end
  136. -- 结束所有活动
  137. local function CommerceAct_EndAllAct(human)
  138. -- 各个子活动处理数据
  139. CommerceAct_HandleEndData(human)
  140. end
  141. -- 活动开始
  142. local function CommerceAct_Begin()
  143. if not tCommerceActInfo then
  144. return
  145. end
  146. for nID, module in pairs(tCommerceActModuel) do
  147. if module and module.ClearCache then
  148. module.ClearCache()
  149. end
  150. end
  151. -- 遍历在线玩家
  152. for uuid, human in pairs(ObjHuman.onlineUuid) do
  153. CommerceAct_BeginAllAct(human)
  154. CommerceAct_SendActInfo(human)
  155. end
  156. end
  157. -- 活动结束
  158. function CommerceAct_End()
  159. -- 排行榜结束
  160. ServerCommerceMiddle.CommerceMiddle_QueryServerRank(ServerCommerceActDefine.COMMERCEACT_SENDSERVERMAIL)
  161. -- 处理巅峰战场活动
  162. local ServerCommerceActBattleGroundNS = require("serverCommerce.ServerCommerceActBattleGroundNS")
  163. ServerCommerceActBattleGroundNS.Act_End()
  164. end
  165. -- 延迟向中心服请求数据
  166. local function CommerceAct_LaterTimeQuery(nOperate)
  167. print("[CommerceAct_LaterTimeQuery] 延迟向中心服请求数据开始")
  168. Timer.addLater(ServerCommerceActDefine.COMMERCEACT_INITSERVERTIME, CommerceAct_GetActOpen, nOperate)
  169. end
  170. -- 是否允许起服重试(仅新服窗口)
  171. local function CommerceAct_CanRetryServerOpen()
  172. local nOpenDay = CommonDB.getServerOpenDay()
  173. if not nOpenDay then
  174. return false
  175. end
  176. return nOpenDay >= ServerCommerceActDefine.COMMERCEACT_SHOW_OPENDAY
  177. and nOpenDay <= ServerCommerceActDefine.COMMERCEACT_MAX_OPENDAY
  178. end
  179. local function CommerceAct_StopServerOpenRetry(szReason)
  180. bServerOpenRetryRunning = false
  181. if szReason then
  182. print("[CommerceAct_StopServerOpenRetry] "..szReason)
  183. end
  184. end
  185. local function CommerceAct_ServerOpenRetryTick()
  186. if true == bServerOpenQueryDone then
  187. CommerceAct_StopServerOpenRetry("活动时间已同步, 结束起服重试")
  188. return
  189. end
  190. if false == CommerceAct_CanRetryServerOpen() then
  191. CommerceAct_StopServerOpenRetry("当前不在新服窗口, 结束起服重试")
  192. return
  193. end
  194. if nServerOpenRetryCnt >= ServerCommerceActDefine.COMMERCEACT_SERVEROPEN_RETRY_MAX then
  195. CommerceAct_StopServerOpenRetry("达到最大重试次数, 结束起服重试")
  196. return
  197. end
  198. nServerOpenRetryCnt = nServerOpenRetryCnt + 1
  199. print("[CommerceAct_ServerOpenRetryTick] 起服重试请求活动状态 nRetry = "..nServerOpenRetryCnt)
  200. CommerceAct_GetActOpen(ServerCommerceActDefine.COMMERCEACT_SERVEROPEN)
  201. Timer.addLater(ServerCommerceActDefine.COMMERCEACT_SERVEROPEN_RETRY_INTERVAL, CommerceAct_ServerOpenRetryTick)
  202. end
  203. local function CommerceAct_StartServerOpenRetry()
  204. if true == bServerOpenRetryRunning or true == bServerOpenQueryDone then
  205. return
  206. end
  207. if false == CommerceAct_CanRetryServerOpen() then
  208. print("[CommerceAct_StartServerOpenRetry] 当前不在新服窗口, 不开启重试")
  209. return
  210. end
  211. bServerOpenRetryRunning = true
  212. nServerOpenRetryCnt = 0
  213. print("[CommerceAct_StartServerOpenRetry] 开启起服重试 interval = "..ServerCommerceActDefine.COMMERCEACT_SERVEROPEN_RETRY_INTERVAL
  214. .." max = "..ServerCommerceActDefine.COMMERCEACT_SERVEROPEN_RETRY_MAX)
  215. Timer.addLater(ServerCommerceActDefine.COMMERCEACT_SERVEROPEN_RETRY_INTERVAL, CommerceAct_ServerOpenRetryTick)
  216. end
  217. -- 延迟10分钟开始
  218. local function CommerceAct_LaterBeginAct()
  219. if not tCommerceActInfo then
  220. return
  221. end
  222. tCommerceActInfo.isRun = true
  223. CommerceAct_Begin()
  224. end
  225. -- 检查活动是否过期
  226. local function CommerceAct_CheckActIsOverTime()
  227. local tCommerceDBInfo = CommonDB.GetCommerceActInfo()
  228. if not tCommerceDBInfo or nil == _G.next(tCommerceDBInfo) then
  229. return true
  230. end
  231. local nEndTime = tCommerceDBInfo.nEndTime
  232. local nNowTime = os.time()
  233. return nNowTime >= nEndTime
  234. end
  235. -- 检查是否开启下一轮活动
  236. local function CommerceAct_CanOpenNext()
  237. local tCommerceDBInfo = CommonDB.GetCommerceActInfo()
  238. if not tCommerceDBInfo or nil == _G.next(tCommerceDBInfo) or not tCommerceDBInfo.nEndTime then
  239. print("[CommerceAct_CanOpenNext] 不存在对应的DB数据")
  240. return true
  241. end
  242. local nDiffDay = Util.diffDay(tCommerceDBInfo.nEndTime)
  243. if nDiffDay > ServerCommerceActDefine.COMMERCEACT_NEXTDAY then
  244. print("[CommerceAct_CanOpenNext] 间隔天数已经满足条件 nDiffDay = "..nDiffDay)
  245. return true
  246. end
  247. return false
  248. end
  249. -- 创建通用DB数据
  250. local function CommerceAct_CreateCommonDB()
  251. local nNowTime = os.time()
  252. local tCommerceInfo = CommonDB.GetCommerceActInfo()
  253. local nEndTime = nNowTime + (ServerCommerceActDefine.COMMERCEACT_LASTDAY - 1)* 86400
  254. local tEndDate = os.date("*t",nEndTime)
  255. tEndDate.hour = ServerCommerceActDefine.COMMERCEACT_ENDTIME
  256. tEndDate.min = 0
  257. tEndDate.sec = 0
  258. nEndTime = os.time(tEndDate)
  259. local tDBData = {
  260. nBeginTime = nNowTime,
  261. nEndTime = nEndTime,
  262. nPoint = 0,
  263. nSendRankMail = 0,
  264. }
  265. if not tCommerceInfo or nil == _G.next(tCommerceInfo) then
  266. print("[CommerceAct_CreateCommonDB] 不存在DB数据 批次为1")
  267. tDBData.nBatchID = 1
  268. else
  269. if tCommerceInfo.nBatchID then
  270. tDBData.nBatchID = tCommerceInfo.nBatchID + 1
  271. print("[CommerceAct_CreateCommonDB] 存在DB数据 批次为加1 nOldBatchID = "..tCommerceInfo.nBatchID.." nNewBatchID = "..tDBData.nBatchID)
  272. else
  273. tDBData.nBatchID = 1
  274. end
  275. end
  276. CommonDB.SetCommerceActInfo(tDBData)
  277. end
  278. -- 创建缓存数据
  279. local function CommerceAct_CreateCacheInfo(nOpen, bLater)
  280. local tCommerceInfo = CommonDB.GetCommerceActInfo()
  281. if not tCommerceInfo or nil == _G.next(tCommerceInfo) then
  282. print("[CommerceAct_CreateCacheInfo] 为什么会不存在数据\n")
  283. return
  284. end
  285. tCommerceActInfo = {}
  286. tCommerceActInfo.nStartTime = tCommerceInfo.nBeginTime
  287. tCommerceActInfo.nEendTime = tCommerceInfo.nEndTime
  288. tCommerceActInfo.isRun = true
  289. if true == bLater then
  290. tCommerceActInfo.isRun = false
  291. end
  292. tCommerceActInfo.nOpen = nOpen
  293. tCommerceActInfo.nBatchID = tCommerceInfo.nBatchID
  294. print("[CommerceAct_CreateCacheInfo] 创建缓存数据 nStartTime = "..tCommerceActInfo.nStartTime.." nEendTime = "..tCommerceActInfo.nEendTime
  295. .." nOpen = "..tCommerceActInfo.nOpen.." nBatchID = "
  296. ..tCommerceActInfo.nBatchID.." isRun = "..(tCommerceActInfo.isRun == true and 1 or 0))
  297. if bLater == true then
  298. Timer.addLater(ServerCommerceActDefine.COMMERCEACT_BEGINDELATTIME, CommerceAct_LaterBeginAct)
  299. else
  300. for uuid, human in pairs(ObjHuman.onlineUuid) do
  301. if not human.db.ServerCommerce then
  302. CommerceAct_CreateHumanDB(human)
  303. end
  304. ServerCommerceTask.CommerceActTask_HumanSubEvent(human)
  305. CommerceAct_SendActInfo(human)
  306. end
  307. end
  308. end
  309. -- 清理排行榜数据
  310. local function CommerceAct_ClearRankInfo()
  311. ServerCommerceMiddle.CommerceMiddle_ClearRank()
  312. end
  313. -- 请求中心服活动时间和批次数据
  314. local function CommerceAct_QueryActOpenTime()
  315. ServerCommerceMiddle.CommerceMiddle_QueryActOpenTime()
  316. end
  317. -- 起服初始化数据
  318. local function CommerceAct_ActCheckOpen_InitServer(nOpen, nOperate, nServerKey)
  319. if ServerCommerceActDefine.COMMERCEACT_NOOPEN ~= nOpen then
  320. nQueryOperate = nOperate
  321. ServerCommerceActRank.CommercerActRank_GetRankServerKey(nServerKey)
  322. -- 活动开启去请求时间数据
  323. CommerceAct_QueryActOpenTime()
  324. end
  325. end
  326. -- 获取玩家当前点数
  327. function CommerceAct_GetHumanPoint(human)
  328. return human.db.ServerCommerce.nPoint
  329. end
  330. -- 设置玩家当前点数
  331. local function CommerceAct_SetHumanPoint(human, nValue)
  332. human.db.ServerCommerce.nPoint = nValue
  333. end
  334. -- 获取开始时间
  335. function CommerceAct_GetOpenAndEndTime()
  336. if not tCommerceActInfo or not tCommerceActInfo.nStartTime or not tCommerceActInfo.nEendTime then
  337. return 0, 0
  338. end
  339. return tCommerceActInfo.nStartTime, tCommerceActInfo.nEendTime
  340. end
  341. ----------------------------------------- 外部调用开始 -------------------------------------
  342. function onZeroAll(funcID)
  343. local nNowTime = os.time()
  344. local tDate = os.date("*t",nNowTime)
  345. -- 活动未开启
  346. if tDate.hour == ServerCommerceActDefine.COMMERCEACT_BEGINTIME then
  347. -- 获取DB数据
  348. local tCommerceDBInfo = CommonDB.GetCommerceActInfo()
  349. if not tCommerceDBInfo or nil == _G.next(tCommerceDBInfo) then
  350. CommerceAct_LaterTimeQuery(ServerCommerceActDefine.COMMERCEACT_ZERO)
  351. return
  352. end
  353. -- 存在DB数据说明已经满足条件了
  354. if true == CommerceAct_CheckActIsOverTime() then
  355. local bOpenNext = CommerceAct_CanOpenNext()
  356. if false == bOpenNext then
  357. return
  358. end
  359. -- 开启下一轮
  360. if tCommerceDBInfo.nBatchID < ServerCommerceActDefine.COMMERCEACT_ENDBATCH then
  361. CommerveManager_WriteLog("[CommerveManager-onZeroAll] 当前条件满足开启下一轮活动 nOldBatchID = "..tCommerceDBInfo.nBatchID.." nNewBatchID = "..tCommerceDBInfo.nBatchID+1)
  362. -- 清理排行榜数据
  363. CommerceAct_ClearRankInfo()
  364. -- 重新请求活动时间数据
  365. CommerceAct_QueryActOpenTime()
  366. nQueryOperate = ServerCommerceActDefine.COMMERCEACT_ZERO
  367. -- CommerceAct_CreateCommonDB()
  368. -- -- 存在数据说明时间是满足的
  369. -- CommerceAct_CreateCacheInfo(ServerCommerceActDefine.COMMERCEACT_OPEN, true)
  370. -- -- 遍历在线玩家
  371. -- for uuid, human in pairs(ObjHuman.onlineUuid) do
  372. -- CommerceAct_BeginAllAct(human)
  373. -- end
  374. -- -- 重新请求排行榜数据
  375. -- ServerCommerceActRank.CommercerActRank_InitServerQueryRank()
  376. end
  377. end
  378. end
  379. end
  380. function onHour(hour)
  381. local nNowTime = os.time()
  382. local tDate = os.date("*t",nNowTime)
  383. print("[CommerceAct_onHour] 进入整点时间判断 hour = "..hour.." nNowTime = "..nNowTime)
  384. if tDate.hour == ServerCommerceActDefine.COMMERCEACT_ENDTIME then
  385. if not tCommerceActInfo then
  386. print("[CommerceAct_onHour] 不存在对应的数据 ")
  387. return
  388. end
  389. print("[CommerceAct_onHour] 进入结束时间判断 hour = "..hour.." nNowTime = "..nNowTime)
  390. local tCommerceDBInfo = CommonDB.GetCommerceActInfo()
  391. if not tCommerceDBInfo or nil == _G.next(tCommerceDBInfo) then
  392. print("[CommerceAct_onHour] 存在缓存数据, 但是获取不到DB数据")
  393. return
  394. end
  395. local nEndTime = tCommerceDBInfo.nEndTime
  396. print("[CommerceAct_onHour] nNowTime = "..nNowTime.." nEndTime = "..nEndTime)
  397. if nEndTime <= nNowTime then
  398. print("[CommerceAct_onHour] 活动结束 开始处理活动结束流程 ")
  399. local nDelayTime = math.random(5, 30)
  400. Timer.addLater(nDelayTime, CommerceAct_End)
  401. -- 活动结束处理
  402. tCommerceActInfo.nSendRankMail = true
  403. tCommerceActInfo.isRun = false
  404. -- 关闭活动入口
  405. for uuid, human in pairs(ObjHuman.onlineUuid) do
  406. YunYingLogic.sendBanner(human)
  407. end
  408. end
  409. end
  410. end
  411. -- 请求活动打开信息
  412. function CommerceAct_GetActOpen(nOperate)
  413. print("[CommerceAct_GetActOpen] 开始向中心服请求活动数据")
  414. if ServerCommerceActDefine.COMMERCEACT_SERVEROPEN == nOperate then
  415. CommerceAct_StartServerOpenRetry()
  416. end
  417. ServerCommerceMiddle.CommerceMiddle_IsActOpen(nOperate)
  418. end
  419. -- 中心服回复活动信息
  420. function CommerceAct_ActCheckOpen(nOpen, nOperate, nServerKey)
  421. print("[CommerceAct_ActCheckOpen] 收到活动信息开始处理 nOpen = "..nOpen.." nOperate ="..nOperate)
  422. CommerceAct_ActCheckOpen_InitServer(nOpen, nOperate, nServerKey)
  423. end
  424. -- 起服初始化
  425. function CommerceAct_Init()
  426. bServerOpenQueryDone = false
  427. bServerOpenRetryRunning = false
  428. nServerOpenRetryCnt = 0
  429. if _G.is_middle == true then
  430. -- 中心服起服获取信息
  431. print("[CommerceAct_Init] 中心服起服请求数据开始")
  432. ServerCommerceMiddle.CommerceMiddle_InitServer()
  433. return
  434. end
  435. local nNowTime = os.time()
  436. for nID, v in pairs(ServerCommerceCof.CommerceAct) do
  437. if v.moduleFn then
  438. local moduleFn = load("return require(\"" .. v.moduleFn .. "\")")()
  439. if moduleFn then
  440. tCommerceActModuel[nID] = moduleFn
  441. if moduleFn.Init then
  442. local bRet = moduleFn.Init()
  443. if false == bRet then
  444. print("[CommerceAct_Init] 初始化模块数据失败 nID ".. nID)
  445. end
  446. end
  447. print("[CommerceAct_Init] 加载模块成功 name = "..v.name)
  448. else
  449. print("[CommerceAct_Init] 加载模块失败 nID ".. nID)
  450. end
  451. else
  452. print("[CommerceAct_Init] 未配置 name = "..v.name)
  453. end
  454. end
  455. print("[CommerceAct_Init] 延迟进行请求数据操作")
  456. -- 延迟向中心服请求数据
  457. CommerceAct_LaterTimeQuery(ServerCommerceActDefine.COMMERCEACT_SERVEROPEN)
  458. end
  459. -- 是否还在活动期间
  460. function CommerceAct_IsRun()
  461. if not tCommerceActInfo then
  462. return false
  463. end
  464. if false == CommerceAct_CheckOpenDay() then
  465. print("[CommerceAct_IsRun] 开服时间不符合条件 nNowOpenDay = ", CommonDB.getServerOpenDay())
  466. return false
  467. end
  468. return tCommerceActInfo.isRun
  469. end
  470. -- 获取到中心服活动时间数据
  471. function CommerceAct_GetActTime(tData)
  472. local tOldDBData = CommonDB.GetCommerceActInfo()
  473. local tNewDBData = nil
  474. local szText = "[CommerceAct_GetActTime] 获取到对应的中心服时间数据 nBatchID = "..tData.nBatchID.." nBeginTime = "..tData.nBeginTime.." nEndTime = ".. tData.nEndTime
  475. print(szText)
  476. if tOldDBData and nil ~= _G.next(tOldDBData) then
  477. if tOldDBData.nBatchID ~= tData.nBatchID or tOldDBData.nBeginTime ~= tData.nBeginTime
  478. or tOldDBData.nEndTime ~= tOldDBData.nEndTime then
  479. -- szText = szText .."当前服务器数据和获取到的中心服数据不一致进行了重置 旧的DB数据 nOldBatchID = "..tOldDBData.nBatchID
  480. -- .." nOldBeginTime = "..tOldDBData.nBeginTime.." nOldEndTime = ".. tOldDBData.nEndTime
  481. -- print(szText)
  482. tNewDBData = {}
  483. tNewDBData.nBatchID = tData.nBatchID
  484. tNewDBData.nBeginTime = tData.nBeginTime
  485. tNewDBData.nEndTime = tData.nEndTime
  486. CommerveManager_WriteLog(szText)
  487. -- 存在旧数据,看看需要重置数据
  488. if tData.nBeginTime > tOldDBData.nEndTime then
  489. tNewDBData.nPoint = 0
  490. tNewDBData.nSendRankMail = 0
  491. CommerveManager_WriteLog("[CommerceAct_GetActTime] 存在旧的数据,当前批次开启时间大于上一次结束时间, 重置点数和发送邮件数据")
  492. else
  493. tNewDBData.nPoint = tOldDBData.nPoint
  494. tNewDBData.nSendRankMail = tOldDBData.nSendRankMail
  495. end
  496. else
  497. print("[CommerceAct_GetActTime] 当前时间相同")
  498. end
  499. else
  500. tNewDBData = {}
  501. tNewDBData.nBatchID = tData.nBatchID
  502. tNewDBData.nBeginTime = tData.nBeginTime
  503. tNewDBData.nEndTime = tData.nEndTime
  504. tNewDBData.nPoint = 0
  505. tNewDBData.nSendRankMail = 0
  506. szText = szText.." 当前服务器不存在数据直接创建"
  507. CommerveManager_WriteLog(szText)
  508. end
  509. if nil ~= tNewDBData then
  510. CommonDB.SetCommerceActInfo(tNewDBData)
  511. end
  512. local tCommerceInfo = CommonDB.GetCommerceActInfo()
  513. local nNowTime = os.time()
  514. if nNowTime < tCommerceInfo.nEndTime then
  515. local bLater = nQueryOperate == ServerCommerceActDefine.COMMERCEACT_ZERO and true or false
  516. CommerceAct_CreateCacheInfo(1, bLater)
  517. ServerCommerceActRank.CommercerActRank_InitServerQueryRank()
  518. else
  519. tCommerceActInfo = {}
  520. tCommerceActInfo.nStartTime = tCommerceInfo.nBeginTime
  521. tCommerceActInfo.nEendTime = tCommerceInfo.nEndTime
  522. tCommerceActInfo.isRun = false
  523. tCommerceActInfo.nOpen = 0
  524. tCommerceActInfo.nBatchID = tCommerceInfo.nBatchID
  525. print("[CommerceAct_ActCheckOpen_InitServer] 活动不在开放时间")
  526. end
  527. bServerOpenQueryDone = true
  528. if true == bServerOpenRetryRunning then
  529. CommerceAct_StopServerOpenRetry("收到中心服活动时间, 停止起服重试")
  530. end
  531. end
  532. -- 跨天
  533. function updateDaily(human, funcID)
  534. if not human then
  535. return
  536. end
  537. if true == CommerceAct_IsRun() then
  538. for _, module in pairs(tCommerceActModuel) do
  539. if module and module.updateDaily then
  540. module.updateDaily(human)
  541. end
  542. end
  543. end
  544. end
  545. -- 玩家登录
  546. function onLogin(human, funcID)
  547. if not human then
  548. return
  549. end
  550. -- 下发活动基础数据
  551. if true == CommerceAct_IsRun() then
  552. print("[CommerceManger_onLogin] 玩家进入进行注册")
  553. local tCommonDBData = CommonDB.GetCommerceActInfo()
  554. if not tCommonDBData or nil == _G.next(tCommonDBData) then
  555. print("[CommerceManger_onLogin] 玩家登录不存在对应的数据通用DB数据!!!!")
  556. return
  557. end
  558. -- 不存在数据直接创建
  559. if not human.db.ServerCommerce then
  560. CommerceAct_CreateHumanDB(human)
  561. else
  562. -- 用记在玩家身上的批次 和 CommonDB 中的数据比较
  563. local nOldBatchID = human.db.ServerCommerce.nBatchID
  564. local nNowBatchID = tCommonDBData.nBatchID
  565. if nNowBatchID ~= nOldBatchID then
  566. CommerveManager_WriteLog("[CommerceManger_onLogin] 玩家登录 记录的批次不一致 nOldBatchID = "..nOldBatchID.." nNowBatchID = "..nNowBatchID, human)
  567. print("[CommerceManger_onLogin] 玩家登录批次不一致, 重置玩家数据 name = "..human.db.name)
  568. CommerceAct_CreateHumanDB(human)
  569. -- 重置巅峰战场的阵容数据
  570. CombatPosLogic.ResetCombatData(human, CombatDefine.COMBAT_TYPE37)
  571. end
  572. end
  573. CommerceAct_SendActInfo(human)
  574. for _, module in pairs(tCommerceActModuel) do
  575. if module and module.onLogin then
  576. module.onLogin(human)
  577. end
  578. end
  579. else
  580. -- 不在活动中
  581. local tCommonDBData = CommonDB.GetCommerceActInfo()
  582. if not tCommonDBData or nil == _G.next(tCommonDBData) then
  583. print("[CommerceManger_onLogin] 玩家登录不存在对应的数据通用DB数据!!!!")
  584. return
  585. end
  586. if false == CommerceAct_CheckActIsOverTime() then
  587. print("[CommerceManger_onLogin] 当前还在活动时间内,返回")
  588. return
  589. end
  590. -- 不存在对应DB数据
  591. if not human.db.ServerCommerce then
  592. return
  593. end
  594. -- 未发送个人邮件都是未上榜的
  595. local bSendPlayerMail = CommerveManager_GetHumanSendPlayerMail(human)
  596. local nHumanPoint = CommerceAct_GetHumanPoint(human)
  597. if false == bSendPlayerMail and nHumanPoint >= 1 then
  598. print("[CommerceManger_onLogin] 发送个人奖励 name = "..human.db.name)
  599. CommerveManager_SetHumanSendPlayerMail(human, true)
  600. ServerCommerceActRank.CommercerActRank_SendHumanMailHumanLogin(human)
  601. else
  602. --CommerveManager_SetHumanSendPlayerMail(human, true)
  603. CommerveManager_WriteLog("[CommerceManger_onLogin] 玩家条件不满足发送个人奖励邮件 nSendServer = "..(bSendPlayerMail == true and 1 or 0).." nHumanPoint = "
  604. ..nHumanPoint, human)
  605. end
  606. -- 全服邮件
  607. local bSendServerMail = CommerveManager_GetHumanSendServerMail(human)
  608. local nSendServer = true == bSendServerMail and 1 or 0
  609. if false == bSendServerMail and 1 == tCommonDBData.nSendRankMail and CommerceAct_GetHumanPoint(human) >= 1 then
  610. print("[CommerceManger_onLogin] 全服邮件奖励开始发送 name = "..human.db.name)
  611. CommerveManager_SetHumanSendServerMail(human, true)
  612. ServerCommerceActRank.CommercerActRank_SendServerMailHumanLogin(human)
  613. else
  614. CommerveManager_WriteLog("[CommerceManger_onLogin] 玩家条件不满足 nSendServer = "..nSendServer.." nHumanPoint = "
  615. ..nHumanPoint.." tCommonDBData.nSendRankMail = "..tCommonDBData.nSendRankMail, human)
  616. --CommerveManager_SetHumanSendServerMail(human, true)
  617. print("[CommerceManger_onLogin] 全服邮件奖励 已经发送过了或积分不满足条件 name = "..human.db.name)
  618. end
  619. end
  620. end
  621. -- 是否开启
  622. function isOpen(human, YYInfo, funcConfig)
  623. local bRet = CommerceAct_IsRun()
  624. local nRet = bRet and 1 or 0
  625. print("CommerceAct_isOpen 结束 开启为1, 未开启为0 nRet = "..nRet)
  626. return bRet
  627. end
  628. --
  629. function isActive(human, YYInfo, funcConfig)
  630. return not isOpen(human, YYInfo, funcConfig)
  631. end
  632. function isRed(human, YYInfo, funcConfig)
  633. if false == CommerceAct_IsRun() then
  634. return
  635. end
  636. if false == CommerceAct_CheckOpenDay() then
  637. return
  638. end
  639. if not human.db.ServerCommerce then
  640. CommerceAct_CreateHumanDB(human)
  641. end
  642. local bRet
  643. for _, module in pairs(tCommerceActModuel) do
  644. if module and module.isRed then
  645. bRet = module.isRed(human)
  646. if true == bRet then
  647. break
  648. end
  649. end
  650. end
  651. return bRet
  652. end
  653. function onCharge(human, price, funcID, buyID)
  654. if not human then
  655. return
  656. end
  657. if false == CommerceAct_IsRun() then
  658. return
  659. end
  660. if not human.db.ServerCommerce then
  661. CommerceAct_CreateHumanDB(human)
  662. end
  663. print("[onCharge] 跨服商业活动 玩家充值回调开始 name = "..human.db.name.." price = "..price)
  664. for _, module in pairs(tCommerceActModuel) do
  665. if module and module.onCharge then
  666. module.onCharge(human, price, funcID, buyID)
  667. end
  668. end
  669. -- local tBuyCfg = BuyConf.buy[buyID]
  670. -- if tBuyCfg then
  671. -- local region = human.region or "CN"
  672. -- local nPoint = tBuyCfg[region]
  673. -- CommerveManager_AddServerPoint(nPoint)
  674. -- CommerveManager_AddHumanPint(human, nPoint)
  675. -- end
  676. CommerveManager_AddServerPoint(price)
  677. CommerveManager_AddHumanPint(human, price)
  678. end
  679. -- 增加整个服务器的点数
  680. function CommerveManager_AddServerPoint(nAddPoint)
  681. if false == CommerceAct_IsRun() then
  682. return
  683. end
  684. local tCommonDBData = CommonDB.GetCommerceActInfo()
  685. local nNewPoint = tCommonDBData.nPoint + nAddPoint
  686. CommonDB.SetCommerceActInfo_Point(nNewPoint)
  687. print("[CommerveManager_AddServerPoint] 增加整个服务器的点数 nAddPoint = "..nAddPoint.." nNewPoint = "..nNewPoint)
  688. for _, module in pairs(tCommerceActModuel) do
  689. if module and module.onAllPointChange then
  690. module.onAllPointChange()
  691. end
  692. end
  693. local szText = "[CommerveManager_AddServerPoint] 增加了整个服务器的积分 nAddPoint = "..nAddPoint.." nNewPoint = "..nNewPoint.." 寻宝"..Config.NEW_SVR_INDEX.."区"
  694. CommerveManager_WriteLog(szText)
  695. end
  696. -- 增加个人积分
  697. function CommerveManager_AddHumanPint(human, nPoint)
  698. if false == CommerceAct_IsRun() then
  699. return
  700. end
  701. local nNowPoint = CommerceAct_GetHumanPoint(human)
  702. local nNewPoint = nNowPoint + nPoint
  703. CommerceAct_SetHumanPoint(human ,nNewPoint)
  704. print("[CommerveManager_AddHumanPint] 增加个人积分 nAddPoint = "..nPoint.." nNewPoint = "..nNewPoint.." name = "..human.db.name)
  705. ServerCommerceActRank.CommercerActRank_HumanPointChange(human, nNewPoint)
  706. local szText = "[CommerveManager_AddHumanPint] 增加了个人积分 nAddPoint = "..nPoint.." nNewPoint = "..nNewPoint
  707. CommerveManager_WriteLog(szText, human)
  708. end
  709. -- 写日志
  710. function CommerveManager_WriteLog(szLogText, human)
  711. if human then
  712. szLogText = szLogText.." name = "..human.db.name.." id = "..human.db._id
  713. end
  714. Log.write(Log.LOGID_OSS_COMMON_ACT, szLogText)
  715. end
  716. -- 设置全服发送邮件奖励
  717. function CommerveManager_SetCommDBSendMail(nValue)
  718. local tCommonDBData = CommonDB.GetCommerceActInfo()
  719. if not tCommonDBData then
  720. print("[CommerveManager_SetCommDBSendMail] 居然不存在对应的数据")
  721. return
  722. end
  723. local tNewDBData =
  724. {
  725. nBeginTime = tCommonDBData.nBeginTime,
  726. nEndTime = tCommonDBData.nEndTime,
  727. nPoint = tCommonDBData.nPoint,
  728. nSendRankMail = nValue,
  729. nBatchID = tCommonDBData.nBatchID
  730. }
  731. CommonDB.SetCommerceActInfo(tNewDBData)
  732. print("[CommerveManager_SetCommDBSendMail] 设置全服邮件奖信息结束")
  733. -- table.print_lua_table(tNewDBData)
  734. end
  735. -- 获取全服发送邮件标识
  736. function CommerveManager_GetCommDBSendMail()
  737. return CommonDB.GetCommerceActInfo_SendServerMail()
  738. end
  739. -- 设置玩家已经获取了全服奖励邮件
  740. function CommerveManager_SetHumanSendServerMail(human, nValue)
  741. human.db.ServerCommerce.bSendServerMail = nValue
  742. end
  743. -- 获取玩家全服奖励邮件状态
  744. function CommerveManager_GetHumanSendServerMail(human)
  745. return human.db.ServerCommerce.bSendServerMail
  746. end
  747. -- 设置玩家已经获取了个人奖励邮件
  748. function CommerveManager_SetHumanSendPlayerMail(human, nValue)
  749. human.db.ServerCommerce.bSendPlayerMail = nValue
  750. end
  751. -- 获取玩家全服奖励邮件状态
  752. function CommerveManager_GetHumanSendPlayerMail(human)
  753. return human.db.ServerCommerce.bSendPlayerMail
  754. end
  755. -- GM 清理数据
  756. function CommerveManager_GMClear(human)
  757. human.db.ServerCommerce =
  758. {
  759. nPoint = 0, -- 当前玩家个人积分
  760. Task = {}, -- 任务信息
  761. Charge = {}, -- 连充豪礼
  762. Shop = {}, -- 战区钜惠
  763. nBatchID = 1, -- 批次
  764. bSendPlayerMail = false, -- 是否发送个人邮件
  765. bSendServerMail = false, -- 是否发送全服邮件
  766. battleGround = {
  767. freeChallengeCnt = ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES,
  768. resetTime = os.time(),
  769. },
  770. }
  771. for nID, module in pairs(tCommerceActModuel) do
  772. if module and module.CreatDB then
  773. local bRet = module.CreatDB(human)
  774. if false == bRet then
  775. print("[CommerceAct_CreateHumanDB] nID 初始化DB 数据失败 nID = "..nID)
  776. end
  777. end
  778. end
  779. -- table.print_lua_table(human.db.ServerCommerce)
  780. print("[CommerveManager_GMClear] 玩家重置数据完成 name = "..human.db.name)
  781. end
  782. -- GM 增加个人积分
  783. function CommerveManager_GMAddHumanPoint(human, nNum)
  784. CommerveManager_AddHumanPint(human, nNum)
  785. end
  786. -- GM 增加服务器积分
  787. function CommerveManager_GMAddServerPoint(nNum)
  788. CommerveManager_AddServerPoint(nNum)
  789. end
  790. -- GM 发送邮件
  791. function CommerveManager_SendMail()
  792. CommerveManager_SetCommDBSendMail(0)
  793. CommerceAct_End()
  794. end
  795. function CommerceMiddle_AddTaskPoint(human, nNum)
  796. ServerCommerceTask.CommerceTask_AddPoint(human, nNum)
  797. end
  798. function CommerveManager_GMRest(human)
  799. ServerCommerceMiddle.CommerceMiddle_GMClearMiddleMail()
  800. end
  801. function CommerveManager_GMRestCommonDB()
  802. local nNowTime = os.time()
  803. local tCommerceInfo = CommonDB.GetCommerceActInfo()
  804. local nEndTime = nNowTime + (ServerCommerceActDefine.COMMERCEACT_LASTDAY - 1)* 86400
  805. local tEndDate = os.date("*t",nEndTime)
  806. tEndDate.hour = ServerCommerceActDefine.COMMERCEACT_ENDTIME
  807. tEndDate.min = 0
  808. tEndDate.sec = 0
  809. nEndTime = os.time(tEndDate)
  810. local tDBData = {
  811. nBeginTime = nNowTime,
  812. nEndTime = nEndTime,
  813. nPoint = 0,
  814. nSendRankMail = 0,
  815. nBatchID = 1,
  816. }
  817. CommonDB.SetCommerceActInfo(tDBData)
  818. print("[CommerveManager_GMRestCommonDB] 重置通用DB数据完成")
  819. end
  820. function CommerveManager_GMClearMiddleMail()
  821. ServerCommerceMiddle.CommerceMiddle_GMClearMiddleMail()
  822. end
  823. function CommerveManager_GMSendHumanMail(human)
  824. ServerCommerceActRank.CommercerActRank_SendHumanMailHumanLogin(human)
  825. end
  826. -- function GetRemainNum(human, nBuyID)
  827. -- for _, module in pairs(tCommerceActModuel) do
  828. -- if module and module.onCharge then
  829. -- if module.IsHaveBuyID and module.IsHaveBuyID(nBuyID) then
  830. -- return module.GetRemainNum(human, nBuyID)
  831. -- end
  832. -- end
  833. -- end
  834. -- return 0
  835. -- end