AbsActBillboardLogic.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. -- 答题活动
  2. local Msg = require("core.Msg")
  3. local AbsActExcel = require("excel.absAct")
  4. local Grid = require("bag.Grid")
  5. local Broadcast = require("broadcast.Broadcast")
  6. local Lang = require("common.Lang")
  7. local AbsActLogic = require("absAct.AbsActLogic")
  8. local AbsActDefine = require("absAct.AbsActDefine")
  9. local BagLogic = require("bag.BagLogic")
  10. local HeroExcel = require("excel.hero").hero
  11. local MailManager = require("mail.MailManager")
  12. local MailExcel = require("excel.mail")
  13. local Util = require("common.Util")
  14. local ObjHuman = require("core.ObjHuman")
  15. local Config = require("Config")
  16. local RoleDefine = require("role.RoleDefine")
  17. local CombatDefine = require("combat.CombatDefine")
  18. local RoleLogic = require("role.RoleLogic")
  19. local InnerMsg = require("core.InnerMsg")
  20. local Lang = require("common.Lang")
  21. local Broadcast = require("broadcast.Broadcast")
  22. local YunYingLogic = require("yunying.YunYingLogic")
  23. local RoleDBLogic = require("role.RoleDBLogic")
  24. local Log = require("common.Log")
  25. ABS_BILLBOARD_TYPE_1 = 1 -- 高抽
  26. ABS_BILLBOARD_TYPE_2 = 2 -- 充值
  27. ABS_BILLBOARD_TYPE_3 = 3 -- 天命召唤
  28. ABS_BILLBOARD_TYPE_4 = 4 -- 钻石消耗
  29. function isOpen(human, YYInfo, funcConfig)
  30. local state, endTime, startTime = AbsActLogic.isStarted(human, funcConfig.funcID)
  31. if not state then return end
  32. local absAct = human.db.absAct[funcConfig.funcID]
  33. if absAct and absAct.dayCnt and absAct.dayCnt <= 0 and #absAct.item <= 0 then
  34. return false
  35. end
  36. return true, endTime, startTime
  37. end
  38. function isActive(human, YYInfo, funcConfig)
  39. return not isOpen(human, YYInfo, funcConfig)
  40. end
  41. function getConfigByRank(rank,mainId,actId)
  42. local config = AbsActExcel.billboard
  43. local len = #config
  44. for i = 1, len do
  45. if config[i].mainId == mainId and config[i].actId == actId then
  46. if config[i].maxRank <= rank and config[i].minRank >= rank then
  47. return config[i]
  48. end
  49. end
  50. end
  51. end
  52. function reRankDataByConfig(data,mainId,actId)
  53. local newTb = {}
  54. local listLen = data[0]
  55. local index = 1
  56. local config = AbsActExcel.billboard
  57. local len = #config
  58. local newTbIndex = 1
  59. local configNeedValue = {}
  60. local count = 0
  61. for i = 1,len do
  62. if config[i].mainId == mainId and config[i].actId == actId then
  63. count = count + 1
  64. configNeedValue[count] = configNeedValue[count] or {}
  65. configNeedValue[count].value = config[i].totalNeedValue
  66. configNeedValue[count].rankCnt = config[i].cnt
  67. end
  68. end
  69. local newRank = 1
  70. for i = 1,count do
  71. if index > listLen then
  72. break
  73. end
  74. while true do
  75. if data[index].param >= configNeedValue[i].value and configNeedValue[i].rankCnt > 0 then
  76. newTb[newRank] = data[index]
  77. newRank = newRank + 1
  78. index = index + 1
  79. configNeedValue[i].rankCnt = configNeedValue[i].rankCnt - 1
  80. else
  81. newRank = newRank + configNeedValue[i].rankCnt
  82. break
  83. end
  84. if index > listLen then
  85. break
  86. end
  87. end
  88. end
  89. return newTb
  90. end
  91. function getAndSendMsg(human, id)
  92. -- 判断活动是否开起
  93. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  94. if not state then return end
  95. local absConfig = AbsActExcel.absActivity[id]
  96. if not absConfig then return end
  97. local absAct = human.db.absAct[id]
  98. if not absAct then
  99. return
  100. end
  101. -- 请求中心服数据
  102. local msgRet = InnerMsg.lw.LW_ABS_ACT_BILLBOARD_QUERY
  103. msgRet.uuid = human.db._id
  104. msgRet.actId = absConfig.actId
  105. msgRet.mainId = id
  106. InnerMsg.sendMsg(0, msgRet)
  107. end
  108. -- 查询回馈 充值
  109. function middleQuery(fd, msg)
  110. local id = msg.mainId
  111. local newRankTb = reRankDataByConfig(msg.list,msg.mainId,msg.actId)
  112. local human = ObjHuman.onlineUuid[msg.uuid]
  113. if human == nil then
  114. return
  115. end
  116. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  117. if not state then return end
  118. local absConfig = AbsActExcel.absActivity[id]
  119. if not absConfig then return end
  120. local absAct = human.db.absAct[id]
  121. if not absAct then
  122. return
  123. end
  124. local config = AbsActExcel.billboard
  125. local msgRet = Msg.gc.GC_ABS_BILLBOARD_QUERY
  126. msgRet.id = id
  127. msgRet.myRank.rank = 0
  128. msgRet.myRank.maxRank = 0
  129. msgRet.myRank.minRank = 0
  130. msgRet.myRank.roleBase[0] = 1
  131. RoleLogic.getRoleBase(human, msgRet.myRank.roleBase[1])
  132. msgRet.myRank.desc = ""
  133. msgRet.myRank.item[0] = 0
  134. msgRet.myRank.param = 0
  135. local listLen = msg.list[0]
  136. local len = 0
  137. for k = 1,10 do
  138. local db = newRankTb[k]
  139. if k <= 10 then
  140. len = len + 1
  141. local net= msgRet.rankList[len]
  142. local cfg = getConfigByRank(k,id,absConfig.actId)
  143. net.rank = k
  144. net.maxRank = 0
  145. net.minRank = 0
  146. if db then
  147. net.roleBase[0] = 1
  148. RoleLogic.makeRoleBase(db.roleBase,net.roleBase[1])
  149. else
  150. net.roleBase[0] = 0
  151. end
  152. net.desc = Util.format(cfg.desc,cfg.totalNeedValue)
  153. local itemLen = #cfg.item
  154. for j = 1,itemLen do
  155. Grid.makeItem(net.item[j],cfg.item[j][1],cfg.item[j][2])
  156. end
  157. net.item[0] = itemLen
  158. net.param = db and db.param or 0
  159. end
  160. end
  161. msgRet.rankList[0] = len
  162. for k,db in pairs(newRankTb) do
  163. if db.roleBase.uuid == human.db._id then
  164. local cfg = getConfigByRank(k,id,absConfig.actId)
  165. msgRet.myRank.rank = k
  166. msgRet.myRank.maxRank = 0
  167. msgRet.myRank.minRank = 0
  168. msgRet.myRank.roleBase[0] = 1
  169. RoleLogic.makeRoleBase(db.roleBase,msgRet.myRank.roleBase[1])
  170. msgRet.myRank.desc = Util.format(cfg.desc,cfg.totalNeedValue)
  171. local itemLen = #cfg.item
  172. for j = 1,itemLen do
  173. Grid.makeItem(msgRet.myRank.item[j],cfg.item[j][1],cfg.item[j][2])
  174. end
  175. msgRet.myRank.item[0] = itemLen
  176. msgRet.myRank.param = db.param
  177. end
  178. end
  179. len = 0
  180. for k, v in ipairs(config) do
  181. if v.mainId == id and v.actId == absConfig.actId then
  182. len = len + 1
  183. local net= msgRet.rewardList[len]
  184. net.rank = 0
  185. net.maxRank = v.maxRank
  186. net.minRank = v.minRank
  187. net.roleBase[0] = 0
  188. net.desc = Util.format(v.desc,v.totalNeedValue)
  189. net.param = 0
  190. local itemLen = #v.item
  191. for j = 1,itemLen do
  192. Grid.makeItem(net.item[j],v.item[j][1],v.item[j][2])
  193. end
  194. net.item[0] = itemLen
  195. end
  196. end
  197. msgRet.rewardList[0] = len
  198. Msg.send(msgRet, human.fd)
  199. end
  200. -- 高抽
  201. function onDrawCard(human,funcID, parameter)
  202. onTouchBack(human,funcID,ABS_BILLBOARD_TYPE_1,parameter)
  203. end
  204. -- 天命
  205. function onTMDrawCard(human,funcID, parameter)
  206. onTouchBack(human,funcID,ABS_BILLBOARD_TYPE_3,parameter)
  207. end
  208. -- 充值
  209. function onCharge(human, parameter,funcID)
  210. onTouchBack(human,funcID,ABS_BILLBOARD_TYPE_2,parameter)
  211. end
  212. -- 消耗钻石
  213. function onDecZuanshi(human,funcID,parameter)
  214. onTouchBack(human,funcID,ABS_BILLBOARD_TYPE_4,parameter)
  215. end
  216. -- 回调
  217. function onTouchBack(human,id,type, param)
  218. local state, endTime, starTime = AbsActLogic.isStarted(human, id)
  219. if not state then return end
  220. local absConfig = AbsActExcel.absActivity[id]
  221. if not absConfig then return end
  222. if type ~= absConfig.param[1] then
  223. return
  224. end
  225. AbsActLogic.checkAbsActClean(human, id)
  226. local absAct = human.db.absAct[id]
  227. if not absAct then
  228. return
  229. end
  230. -- 提交充值金额
  231. absAct.param = absAct.param or 0
  232. absAct.param = absAct.param + param
  233. -- 更新充值榜
  234. local msgRet = InnerMsg.lw.LW_ABS_ACT_BILLBOARD_SET
  235. msgRet.roleBase = {}
  236. RoleLogic.makeRoleBase(human.db, msgRet.roleBase)
  237. msgRet.svrIndex = Config.SVR_INDEX
  238. msgRet.svrName = Config.SVR_NAME
  239. msgRet.op = {}
  240. msgRet.op.param = absAct.param
  241. msgRet.actId = absConfig.actId
  242. msgRet.mainId = id
  243. InnerMsg.sendMsg(0, msgRet)
  244. end
  245. function sendBillboardReward()
  246. if _G.is_middle == true then return end
  247. for k,v in pairs(AbsActExcel.absActivity) do
  248. if v.type == AbsActDefine.ABS_ACT_TYPE_73 then
  249. -- 活动开启期间不发奖励
  250. local state, endTime, starTime = AbsActLogic.isStarted(human, k)
  251. if state then return end
  252. print("csdasew")
  253. local msg = InnerMsg.lw.LW_ABS_ACT_BILLBOARD_DB
  254. msg.mainId = k
  255. msg.actId = v.turns[1]
  256. InnerMsg.sendMsg(0,msg)
  257. Log.write(Log.LOGID_DEBUG, "sendBillboardReward",msg.mainId,msg.actId)
  258. end
  259. end
  260. end
  261. function WL_ABS_ACT_BILLBOARD_DB_RETURN(fd,msg)
  262. Log.write(Log.LOGID_DEBUG, "WL_ABS_ACT_BILLBOARD_DB_RETURN true")
  263. local data = msg.rankDb
  264. local config = Util.copyTable(AbsActExcel.billboard)
  265. if not config then return end
  266. local boardLen = #data.rank2data
  267. local configLen = #config
  268. Log.write(Log.LOGID_DEBUG, "WL_ABS_ACT_BILLBOARD_DB_RETURN",boardLen)
  269. if boardLen > 0 then
  270. boardLen = math.min(boardLen, AbsActDefine.BILLBOARD_MAX_CNT)
  271. for i = 1, boardLen do
  272. local dbData = data.rank2data[i]
  273. local uuid = dbData and dbData.uuid
  274. local dcId = 0
  275. -- 选出所在档次
  276. for j = 1,configLen do
  277. if config[j].actId == msg.actId and config[j].mainId == msg.mainId then
  278. if dbData.value1 >= config[j].totalNeedValue and config[j].cnt > 0 then
  279. if dcId == 0 then
  280. dcId = j
  281. else
  282. dcId = dcId > j and j or dcId
  283. end
  284. end
  285. end
  286. end
  287. if dcId ~= 0 then
  288. config[dcId].cnt = config[dcId].cnt - 1
  289. local rank = config[dcId].minRank - config[dcId].cnt
  290. local charDb = RoleDBLogic.getDb(uuid)
  291. if charDb then
  292. local mailConfig = MailExcel.mail[config[dcId].mailId]
  293. local title = mailConfig.title
  294. local senderName = mailConfig.senderName
  295. local content = Util.format(mailConfig.content, rank)
  296. MailManager.add(MailManager.SYSTEM, uuid, title, content, config[dcId].item, senderName)
  297. Log.write(Log.LOGID_DEBUG, "sendMailSuccess",charDb.name)
  298. end
  299. else
  300. Log.write(Log.LOGID_DEBUG, "billboardReward: "..dcId.." uuid: "..uuid.." rank: "..i)
  301. end
  302. end
  303. Log.write(Log.LOGID_DEBUG, "billboardReward send reward success",boardLen)
  304. end
  305. end
  306. function cleanBillBoardDB()
  307. if _G.is_middle == true then return end
  308. for k,v in pairs(AbsActExcel.absActivity) do
  309. if v.type == AbsActDefine.ABS_ACT_TYPE_73 then
  310. -- 活动开启期间不发奖励
  311. local state, endTime, starTime = AbsActLogic.isStarted(human, k)
  312. if state then return end
  313. print("clean db success")
  314. local msg = InnerMsg.lw.LW_ABS_ACT_BILLBOARD_DB_CLEAN
  315. msg.mainId = k
  316. msg.actId = v.turns[1]
  317. InnerMsg.sendMsg(0,msg)
  318. Log.write(Log.LOGID_DEBUG, "cleanBillBoardDB",msg.mainId,msg.actId)
  319. end
  320. end
  321. end
  322. function getLeftTime(human, YInfo, funcConfig)
  323. local ret, endTime, startTime = AbsActLogic.isStarted(human, funcConfig.funcID)
  324. if ret == true then
  325. return endTime - os.time()
  326. else
  327. return 0
  328. end
  329. end