MergeServerCharge.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. --------------------------------
  2. -- 文件名 : MergeServerCharge.lua
  3. -- 文件说明 : 合服活动-充值
  4. -- 创建时间 : 2025/07/30
  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 MergeConfig = require("excel.MergeServerActivity")
  13. local CommonDB = require("common.CommonDB")
  14. local YunYingLogic = require("yunying.YunYingLogic")
  15. local MergeServerLogin = require("present.MergeServerLogin")
  16. -- 金额映射红点下标
  17. local tChargeMoney2Index =
  18. {
  19. [6] = 1,
  20. [98] = 2,
  21. [198] = 3,
  22. [1] = 1,
  23. [17] = 2,
  24. [33] = 3,
  25. [0.99] = 1,
  26. [14.99] = 2,
  27. [27.99] = 3,
  28. }
  29. local tIndex2Money = {
  30. -- [1] = 6,
  31. -- [2] = 98,
  32. -- [3] = 198,
  33. -- [1] = 1,
  34. -- [2] = 17,
  35. -- [3] = 33,
  36. [1] = 0.99,
  37. [2] = 14.99,
  38. [3] = 27.99,
  39. }
  40. -- 与配置中的 awardType 一致
  41. -- 修改: 不再使用金额作为key存储到数据库中, 改为使用 awardType 作为key, 部分函数的形参nMoney实则为type
  42. local tIndex2Type = {
  43. [1] = 1,
  44. [2] = 2,
  45. [3] = 3,
  46. }
  47. local MERGESERVERCHARGE_MAXDAY = 10
  48. ----------------------------------------- 内部处理开始 -------------------------------------
  49. local function MergeServerCharge_IsOpen()
  50. local nBeginTime = CommonDB.getMergeServerTime()
  51. if 0 >= nBeginTime then
  52. return false
  53. end
  54. local nEndTime = nBeginTime + (CommonDefine.MERGERSERVER_ACTIVITY_DAY - 1) * 24 * 60 * 60
  55. local tEndDate = os.date("*t",nEndTime)
  56. tEndDate.hour = 23
  57. tEndDate.min = 59
  58. tEndDate.sec = 59
  59. nEndTime = os.time(tEndDate)
  60. local nNowTime = os.time()
  61. return nEndTime > nNowTime
  62. end
  63. -- 获取配置
  64. local function MergeServerCharge_GetCof()
  65. return MergeConfig.Charge
  66. end
  67. -- 初始化DB数据
  68. local function MergeServerCharge_CreatDB(human)
  69. human.db.MergeCharge =
  70. {
  71. nBeginTime = CommonDB.getMergeServerTime(),
  72. bDispose = false,
  73. tChargeData = {},
  74. tPrizeData = {}
  75. }
  76. local tPrizeData = human.db.MergeCharge.tPrizeData
  77. local tConf = MergeServerCharge_GetCof()
  78. for _, v in ipairs(tConf) do
  79. if not tPrizeData[v.nDay] then
  80. tPrizeData[v.nDay] = {
  81. tMoney = {}
  82. }
  83. end
  84. -- if not human.db.MergeCharge.tChargeData[v.nMoney] then
  85. -- human.db.MergeCharge.tChargeData[v.nMoney] = {
  86. -- nBuyTime = 0,
  87. -- nBuyDay = 0
  88. -- }
  89. -- end
  90. -- 使用 awardType 作为key
  91. if not human.db.MergeCharge.tChargeData[v.awardType] then
  92. human.db.MergeCharge.tChargeData[v.awardType] = {
  93. nBuyTime = 0,
  94. nBuyDay = 0
  95. }
  96. end
  97. local tNodeData = tPrizeData[v.nDay].tMoney
  98. -- if not tNodeData[v.nMoney] then
  99. -- tNodeData[v.nMoney] =
  100. -- {
  101. -- nStatus = CommonDefine.COMMON_PRIZE_STATE_NOGET,
  102. -- nMoney = 0
  103. -- }
  104. -- else
  105. -- print("[MergeServerCharge_CreateDB] 配置了重复的数据")
  106. -- end
  107. -- 使用 awardType 作为key
  108. if not tNodeData[v.awardType] then
  109. tNodeData[v.awardType] =
  110. {
  111. nStatus = CommonDefine.COMMON_PRIZE_STATE_NOGET,
  112. nMoney = 0
  113. }
  114. else
  115. print("[MergeServerCharge_CreateDB] 配置了重复的数据")
  116. end
  117. end
  118. -- print("[MergeServerCharge_CreatDB] 初始化数据完成 name = "..human.db.name)
  119. return true
  120. end
  121. local function MergeServerCharge_CheckDB(human)
  122. if not human.db.MergeCharge then
  123. MergeServerCharge_CreatDB(human)
  124. else
  125. if human.db.MergeCharge.nBeginTime then
  126. local nNowBeginTime = CommonDB.getMergeServerTime()
  127. if nNowBeginTime ~= human.db.MergeCharge.nBeginTime then
  128. MergeServerCharge_CreatDB(human)
  129. end
  130. end
  131. end
  132. end
  133. -- 获取是否处理合服前的充值
  134. local function MergeServerCharge_GetDispose(human)
  135. return human.db.MergeCharge.bDispose
  136. end
  137. -- 设置处理合服前的充值
  138. local function MergeServerCharge_SetDispose(human, nValue)
  139. human.db.MergeCharge.bDispose = nValue
  140. end
  141. -- 获取第一次充值的时间
  142. local function MergeServerCharge_GetChargeTime(human, nMoney)
  143. return human.db.MergeCharge.tChargeData[nMoney].nBuyTime
  144. end
  145. -- 设置充值时间
  146. local function MergeServerCharge_SetChargeTime(human, nMoney, nValue)
  147. human.db.MergeCharge.tChargeData[nMoney].nBuyTime = nValue
  148. end
  149. local function MergeServerCharge_GetBuyDay(human, nMoney)
  150. return human.db.MergeCharge.tChargeData[nMoney].nBuyDay
  151. end
  152. local function MergeServerCharge_SetBuyDay(human, nMoney,nDay)
  153. human.db.MergeCharge.tChargeData[nMoney].nBuyDay = nDay
  154. end
  155. -- 获取DB奖励数据
  156. local function MergeServerCharge_GetDBPrizeData(human)
  157. return human.db.MergeCharge.tPrizeData
  158. end
  159. -- 获取DB奖励状态
  160. local function MergeServerCharge_GetDBPrizeStatus(human, nDay, nMoney)
  161. local tPrizeData = MergeServerCharge_GetDBPrizeData(human)
  162. if not tPrizeData[nDay] or not tPrizeData[nDay].tMoney[nMoney] then
  163. return CommonDefine.COMMON_PRIZE_STATE_NOGET
  164. end
  165. return tPrizeData[nDay].tMoney[nMoney].nStatus
  166. end
  167. -- 设置DB奖励状态
  168. local function MergeServerCharge_SetDBPrizeStatus(human, nDay, nMoney, nStatus)
  169. -- print("[MergeServerCharge_SetDBPrizeStatus] 设置DB奖励状态 nDay = "..nDay.." nMoney = "..nMoney.." nStatus = "..nStatus)
  170. local tPrizeData = MergeServerCharge_GetDBPrizeData(human)
  171. tPrizeData[nDay].tMoney[nMoney].nStatus = nStatus
  172. end
  173. -- 获取DB天数充值金额
  174. local function MergeServerCharge_GetDBDayCharge(human, nDay, nMoney)
  175. local tPrizeData = MergeServerCharge_GetDBPrizeData(human)
  176. if not tPrizeData[nDay] then
  177. return 0
  178. end
  179. return tPrizeData[nDay].tMoney[nMoney].nMoney
  180. end
  181. -- 设置DB天数充值金额
  182. local function MergeServerCharge_SetDBDayCharge(human, nDay, nMoney, nAddMoney)
  183. local tPrizeData = MergeServerCharge_GetDBPrizeData(human)
  184. tPrizeData[nDay].tMoney[nMoney].nMoney = tPrizeData[nDay].tMoney[nMoney].nMoney + nAddMoney
  185. if tPrizeData[nDay].tMoney[nMoney].nMoney < 0 then
  186. tPrizeData[nDay].tMoney[nMoney].nMoney = 0
  187. end
  188. end
  189. local function MergeServerCharge_GetDayAllMoney(human, nDay)
  190. local nAllMoney = 0
  191. for _, v in ipairs(tIndex2Money) do
  192. local nMoney = MergeServerCharge_GetDBDayCharge(human, nDay, v)
  193. nAllMoney = nAllMoney + nMoney
  194. end
  195. return nAllMoney
  196. end
  197. -----------------------------------客户端请求-----------------------------
  198. -- 请求数据
  199. function MergeServerCharge_Query(human, nIndex)
  200. if false == MergeServerCharge_IsOpen() then
  201. return
  202. end
  203. MergeServerCharge_CheckDB(human)
  204. -- local nMoney = tIndex2Money[nIndex]
  205. -- if not nMoney then
  206. -- return
  207. -- end
  208. local awardType = tIndex2Type[nIndex]
  209. if not awardType then
  210. return
  211. end
  212. local tConf = MergeServerCharge_GetCof()
  213. local tMsgData = Msg.gc.GC_MERGESERVER_CHARGE_QUERY
  214. tMsgData.tList[0] = 0
  215. local nLen = 0
  216. for nID, v in ipairs(tConf) do
  217. if v.awardType == awardType then
  218. nLen = nLen + 1
  219. tMsgData.tList[0] = nLen
  220. local tPrizeData = tMsgData.tList[nLen]
  221. tPrizeData.nID = nID
  222. tPrizeData.nState = MergeServerCharge_GetDBPrizeStatus(human, v.nDay, awardType)
  223. tPrizeData.nDay = v.nDay
  224. tPrizeData.nAllMoney = MergeServerCharge_GetDBDayCharge(human, v.nDay, awardType)
  225. tPrizeData.nMoney = v.nMoney
  226. tPrizeData.item[0] = #v.tPrize
  227. for i, tItem in ipairs(v.tPrize) do
  228. local nGoodsID = tItem[1]
  229. local nGoodsNum = tItem[2]
  230. Grid.makeItem(tPrizeData.item[i], nGoodsID, nGoodsNum)
  231. end
  232. end
  233. end
  234. Msg.send(tMsgData, human.fd)
  235. end
  236. -- 请求领取奖励
  237. function MergeServerCharge_Get(human, nIndex)
  238. if false == MergeServerCharge_IsOpen() then
  239. return
  240. end
  241. -- local nMoney = tIndex2Money[nIndex]
  242. -- if not nMoney then
  243. -- return
  244. -- end
  245. local awardType = tIndex2Type[nIndex]
  246. if not awardType then
  247. return
  248. end
  249. local tConf = MergeServerCharge_GetCof()
  250. local tItem = {}
  251. for nID, v in ipairs(tConf) do
  252. if v.awardType == awardType then
  253. local nState = MergeServerCharge_GetDBPrizeStatus(human, v.nDay, v.awardType)
  254. if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
  255. MergeServerCharge_SetDBPrizeStatus(human, v.nDay, awardType, CommonDefine.COMMON_PRIZE_STATE_GET)
  256. for _, tPrize in ipairs(v.tPrize) do
  257. if not tItem[tPrize[1]] then
  258. tItem[tPrize[1]] = 0
  259. end
  260. tItem[tPrize[1]] = tItem[tPrize[1]] + tPrize[2]
  261. end
  262. end
  263. end
  264. end
  265. if nil ~= _G.next(tItem) then
  266. local tPrize = {}
  267. for nID, nNum in pairs(tItem) do
  268. table.insert(tPrize, {nID, nNum})
  269. end
  270. BagLogic.addItemList(human, tPrize, "MergeCharge")
  271. MergeServerCharge_Query(human, nIndex)
  272. YunYingLogic.sendBanner(human)
  273. MergeServerLogin.MergeServerLogin_SendRed(human)
  274. end
  275. end
  276. ----------------------------------------- 外部调用 -------------------------------------
  277. function isRed(human)
  278. if false == MergeServerCharge_IsOpen() then
  279. return false
  280. end
  281. MergeServerCharge_CheckDB(human)
  282. if not human.db.MergeCharge then
  283. return false
  284. end
  285. local tConf = MergeServerCharge_GetCof()
  286. for _, v in ipairs(tConf) do
  287. local nState = MergeServerCharge_GetDBPrizeStatus(human, v.nDay, v.awardType)
  288. if nState == CommonDefine.COMMON_PRIZE_STATE_CANGET then
  289. return true
  290. end
  291. end
  292. return false
  293. end
  294. function onCharge(human, price, funcID, buyID)
  295. if false == MergeServerCharge_IsOpen() then
  296. return
  297. end
  298. local tConf = MergeServerCharge_GetCof()
  299. local bQuery = false
  300. for _, awardType in ipairs(tIndex2Type) do
  301. local nBuyTime = MergeServerCharge_GetChargeTime(human, awardType)
  302. local nBuyDay = MergeServerCharge_GetBuyDay(human, awardType)
  303. if 0 == nBuyTime then
  304. nBuyTime = os.time()
  305. MergeServerCharge_SetChargeTime(human, awardType, nBuyTime)
  306. end
  307. if 0 == nBuyDay then
  308. nBuyDay = nBuyDay + 1
  309. MergeServerCharge_SetBuyDay(human, awardType, nBuyDay)
  310. else
  311. -- 跨天了
  312. if nil == Util.isSameDay(nBuyTime) then
  313. nBuyDay = nBuyDay + 1
  314. if nBuyDay <= MERGESERVERCHARGE_MAXDAY then
  315. MergeServerCharge_SetBuyDay(human, awardType, nBuyDay)
  316. end
  317. nBuyTime = os.time()
  318. MergeServerCharge_SetChargeTime(human, awardType, nBuyTime)
  319. end
  320. end
  321. nBuyDay = (nBuyDay > MERGESERVERCHARGE_MAXDAY) and MERGESERVERCHARGE_MAXDAY or nBuyDay
  322. -- print("[MergeServerCharge_onCharge] 111 玩家充值增加对应的总充值金额 天数 nBuyDay = "..nBuyDay
  323. -- .." 对应金额 nMoney = "..nMoney.." 增加的钱 price = "..price)
  324. MergeServerCharge_SetDBDayCharge(human, nBuyDay, awardType, price)
  325. local nNewChareNum = MergeServerCharge_GetDBDayCharge(human, nBuyDay, awardType)
  326. -- print("[MergeServerCharge_onCharge] 玩家充值增加对应的总充值金额 天数 nBuyDay = "..nBuyDay
  327. -- .." 对应金额 nMoney = "..nMoney.." 增加的钱 price = "..price.." 总金额 nNewChareNum = "..nNewChareNum)
  328. for _, v in ipairs(tConf) do
  329. if v.nDay == nBuyDay and v.awardType == awardType then
  330. local nStatus = MergeServerCharge_GetDBPrizeStatus(human, v.nDay, v.awardType)
  331. if nStatus == CommonDefine.COMMON_PRIZE_STATE_NOGET and nNewChareNum >= v.awardType then
  332. MergeServerCharge_SetDBPrizeStatus(human, v.nDay, v.awardType, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  333. bQuery = true
  334. end
  335. end
  336. end
  337. end
  338. if true == bQuery then
  339. MergeServerLogin.MergeServerLogin_SendRed(human)
  340. -- MergeServerCharge_Query(human, price)
  341. end
  342. end
  343. function isOpen(human, YYInfo, funcConfig)
  344. return MergeServerCharge_IsOpen()
  345. end
  346. function isActive(human, YYInfo, funcConfig)
  347. return not isOpen(human, YYInfo, funcConfig)
  348. end
  349. function onLogin(human)
  350. if false == MergeServerCharge_IsOpen() then
  351. return
  352. end
  353. MergeServerCharge_CheckDB(human)
  354. local bDispose = MergeServerCharge_GetDispose(human)
  355. if false == bDispose then
  356. MergeServerCharge_SetDispose(human, true)
  357. local nNowCharge = human.db.topupAcountDaily
  358. if nNowCharge and 0 < nNowCharge then
  359. onCharge(human, nNowCharge)
  360. end
  361. end
  362. local nNowTime = os.time()
  363. for _, nMoney in ipairs(tIndex2Type) do
  364. local nBuyTime = MergeServerCharge_GetChargeTime(human, nMoney)
  365. local nBuyDay = MergeServerCharge_GetBuyDay(human, nMoney)
  366. if true ~= Util.isSameDayByTimes(nNowTime, nBuyTime) and nBuyDay ~= 0 then
  367. local nAllMoney = MergeServerCharge_GetDBDayCharge(human, nBuyDay, nMoney)
  368. if nAllMoney < nMoney and 0 < nAllMoney then
  369. MergeServerCharge_SetDBDayCharge(human, nBuyDay, nMoney, -nAllMoney)
  370. MergeServerCharge_SetChargeTime(human, nMoney, 0)
  371. -- print("[MergeServerCharge_onLogin] 玩家登录 重置对应不达标数据 nBuyDay = "..nBuyDay.." 对应金额 nMoney = "..nMoney.." 充值数 nAllMoney = "..nAllMoney)
  372. end
  373. end
  374. end
  375. end
  376. function onZero(human, funcID)
  377. if false == MergeServerCharge_IsOpen() then
  378. return
  379. end
  380. MergeServerCharge_CheckDB(human)
  381. for _, nMoney in ipairs(tIndex2Type) do
  382. -- local nBuyTime = MergeServerCharge_GetChargeTime(human, nMoney)
  383. local nBuyDay = MergeServerCharge_GetBuyDay(human, nMoney)
  384. local nAllMoney = MergeServerCharge_GetDBDayCharge(human, nBuyDay, nMoney)
  385. if nAllMoney < nMoney and 0 < nAllMoney then
  386. MergeServerCharge_SetDBDayCharge(human, nBuyDay, nMoney, -nAllMoney)
  387. MergeServerCharge_SetChargeTime(human, nMoney, 0)
  388. -- print("[MergeServerCharge_onZero] 零点刷新 重置对应不达标数据 nBuyDay = "..nBuyDay.." 对应金额 nMoney = "..nMoney.." 充值数 nAllMoney = "..nAllMoney)
  389. end
  390. end
  391. end
  392. function MergeServerCharge_GMReset(human, nDay)
  393. for _, v in ipairs(tIndex2Type) do
  394. human.db.MergeCharge.tPrizeData[nDay].tMoney[v]=
  395. {
  396. nStatus = CommonDefine.COMMON_PRIZE_STATE_NOGET,
  397. nMoney = 0,
  398. }
  399. end
  400. end