LevelGift.lua 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. -- 送万元充值活动
  2. -- 每个挡位礼包数量有限,全区共享
  3. --db
  4. --[=[
  5. human.db.levelGift = {
  6. record = nil, -- 领取记录, key为配置中的id
  7. }
  8. ]=]--
  9. local Msg = require("core.Msg")
  10. local Grid = require("bag.Grid")
  11. local BagLogic = require("bag.BagLogic")
  12. local Broadcast = require("broadcast.Broadcast")
  13. local Lang = require("common.Lang")
  14. local LevelGiftCfg = require("excel.WanYuanReward").Sheet1
  15. local YunYingLogic = require("yunying.YunYingLogic")
  16. local CommonDB = require("common.CommonDB")
  17. local CommonDefine = require("common.CommonDefine")
  18. local YunYingExcel = require("excel.yunying")
  19. local LOGTYPE = "LevelGift"
  20. local ENTRANCE_ACT_ID = 36
  21. local ACT_ID = 7601
  22. local MAXNUM = 10000 --总额度
  23. local function initData(human)
  24. human.db.levelGift = {}
  25. human.db.levelGift.record = {}
  26. end
  27. local function getData(human)
  28. return human.db.levelGift
  29. end
  30. local function updateData(human, idx)
  31. local levelGiftData = getData(human)
  32. if not levelGiftData then
  33. initData(human)
  34. levelGiftData = getData(human)
  35. end
  36. levelGiftData.record[idx] = true
  37. end
  38. -- 获取本服所有道具的领取记录
  39. local function getItemSrvRecord()
  40. local recordList = CommonDB.getValueByKey(CommonDB.KEY_LEVELGIFT_GETRECORD)
  41. return recordList
  42. end
  43. -- 获取本服某个道具已经领取数量
  44. local function getItmGetNum(idx)
  45. local num = 0
  46. local recordList = getItemSrvRecord()
  47. if recordList and recordList[idx] then
  48. num = recordList[idx]
  49. end
  50. return num
  51. end
  52. -- 更新本服某个道具的领取数量
  53. local function updateItemRemaindeNum(idx)
  54. local recordList = getItemSrvRecord()
  55. recordList = recordList or {}
  56. recordList[idx] = (recordList[idx] or 0) + 1
  57. CommonDB.updateValue(CommonDB.KEY_LEVELGIFT_GETRECORD, recordList)
  58. end
  59. -- 更新本服多个道具的领取数量
  60. local function updateItemsRemaindeNum(newRecordList)
  61. CommonDB.updateValue(CommonDB.KEY_LEVELGIFT_GETRECORD, newRecordList)
  62. end
  63. -- 计算已经领取的额度
  64. local function calcGetWeight(human)
  65. local weight = 0
  66. local levelGiftData = getData(human)
  67. local recordData = levelGiftData and levelGiftData.record
  68. for idx in pairs(recordData or {}) do
  69. local cfg = LevelGiftCfg[idx]
  70. if cfg then
  71. weight = weight + cfg.count
  72. end
  73. end
  74. return weight
  75. end
  76. -- 获取道具状态
  77. local function getAwardState(human, idx, giftCfg)
  78. local levelGiftData = getData(human)
  79. local recordData = levelGiftData and levelGiftData.record
  80. local state = CommonDefine.COMMON_PRIZE_STATE_NOGET
  81. if recordData and recordData[idx] then
  82. state = CommonDefine.COMMON_PRIZE_STATE_GET
  83. else
  84. if human.db.lv >= giftCfg.lv then
  85. -- local num = getItmGetNum(idx)
  86. local num = calcGetWeight(human)
  87. if giftCfg.count + num <= MAXNUM then
  88. state = CommonDefine.COMMON_PRIZE_STATE_CANGET
  89. end
  90. end
  91. end
  92. return state
  93. end
  94. -- 获取所有奖励的剩余份数
  95. local function getItemsSubNum()
  96. local getNum, totalNum = 0,0
  97. for idx, v in ipairs(LevelGiftCfg) do
  98. getNum = getNum + getItmGetNum(idx)
  99. totalNum = totalNum + v.count
  100. end
  101. return math.max(totalNum-getNum, 0)
  102. end
  103. -- 填充协议
  104. local function populateGiftMsg(human, net, idx, giftCfg)
  105. net.itemArr[0] = 0
  106. net.state = 0
  107. net.levelCond = 0
  108. -- net.remaindeNum = 0
  109. net.itemArr[0] = #giftCfg.reward
  110. for i, itemInfo in ipairs(giftCfg.reward) do
  111. Grid.makeItem(net.itemArr[i], itemInfo[1], itemInfo[2])
  112. end
  113. net.levelCond = giftCfg.lv
  114. net.state = getAwardState(human, idx, giftCfg)
  115. -- local num = getItmGetNum(idx)
  116. -- net.remaindeNum = math.max(giftCfg.count - num, 0)
  117. end
  118. -- 是否显示入口。没有能领取的奖励后关闭,如果奖励没领完且奖励份数>=1则不关闭
  119. -- 新修改: 额度不足则关闭
  120. local function isShowEntrance(human)
  121. local levelGiftData = getData(human)
  122. local recordData = levelGiftData and levelGiftData.record or {}
  123. local getWeight = calcGetWeight(human)
  124. if getWeight >= MAXNUM then
  125. return false
  126. end
  127. for idx, v in ipairs(LevelGiftCfg) do
  128. local state = getAwardState(human, idx, v)
  129. if state == CommonDefine.COMMON_PRIZE_STATE_CANGET then
  130. return true
  131. end
  132. if not recordData[idx] then
  133. -- local num = getItmGetNum(idx)
  134. -- if num < v.count then
  135. -- return true
  136. -- end
  137. if v.count + getWeight <= MAXNUM then
  138. return true
  139. end
  140. end
  141. end
  142. return false
  143. end
  144. -- 是否有可领取奖励
  145. local function isCanGet(human)
  146. for idx, v in ipairs(LevelGiftCfg) do
  147. local state = getAwardState(human, idx, v)
  148. if state == CommonDefine.COMMON_PRIZE_STATE_CANGET then
  149. return true
  150. end
  151. end
  152. return false
  153. end
  154. -- 主动刷新一次红点
  155. local function updateRedDot(human)
  156. local config = YunYingExcel.func[ACT_ID]
  157. YunYingLogic.sendGroupUpdate(YYInfo[ACT_ID], human, config.panelID)
  158. -- YunYingLogic.sendIconUpdate(ENTRANCE_ACT_ID, human)
  159. YunYingLogic.updateIcon(YYInfo[ACT_ID], human, true)
  160. end
  161. -- 升级
  162. function onLevelUp(human, oldLv, newLv, funcID)
  163. updateRedDot(human)
  164. end
  165. function isOpen(human, YYInfo, funcConfig)
  166. return isShowEntrance(human)
  167. end
  168. function isRed(human)
  169. if not isOpen(human) then
  170. return false
  171. end
  172. return isCanGet(human)
  173. end
  174. -- 查询
  175. function LevelGift_Query(human)
  176. local msgRet = Msg.gc.GC_LEVELGIFT_QUERY
  177. msgRet.list[0] = 0
  178. msgRet.levelNow = human.db.lv
  179. msgRet.isStart = 1
  180. msgRet.isEnd = 0
  181. msgRet.remaindeNum = 0
  182. local getWeight = calcGetWeight(human)
  183. msgRet.remaindeNum = math.max(MAXNUM - getWeight, 0)
  184. local len = 0
  185. local msgOnceLen = 10
  186. local cfgNum = #LevelGiftCfg
  187. for idx, v in ipairs(LevelGiftCfg) do
  188. len = len + 1
  189. msgRet.list[0] = len
  190. populateGiftMsg(human, msgRet.list[len], idx, v)
  191. if len >= msgOnceLen then
  192. cfgNum = cfgNum - len
  193. if cfgNum <= 0 then
  194. msgRet.isEnd = 1
  195. return Msg.send(msgRet, human.fd)
  196. end
  197. Msg.send(msgRet, human.fd)
  198. len = 0
  199. msgRet.isStart = 0
  200. end
  201. end
  202. if len > 0 then
  203. msgRet.isEnd = 1
  204. Msg.send(msgRet, human.fd)
  205. end
  206. end
  207. -- 领奖
  208. function LevelGift_GetReward(human)
  209. local itemList = {}
  210. -- local recordList = getItemSrvRecord()
  211. for idx, v in ipairs(LevelGiftCfg) do
  212. local state = getAwardState(human, idx, v)
  213. if state == CommonDefine.COMMON_PRIZE_STATE_CANGET then
  214. -- recordList = recordList or {}
  215. -- recordList[idx] = (recordList[idx] or 0) + 1
  216. updateData(human, idx)
  217. for _, itemInfo in ipairs(v.reward) do
  218. local itemId, itemNum = itemInfo[1], itemInfo[2]
  219. itemList[itemId] = (itemList[itemId] or 0) + itemNum
  220. end
  221. end
  222. end
  223. if not next(itemList) then
  224. return Broadcast.sendErr(human, Lang.HO_NO_CAN_GET)
  225. end
  226. -- updateItemsRemaindeNum(recordList)
  227. -- 发放道具
  228. BagLogic.addItemList(human, itemList, LOGTYPE)
  229. LevelGift_Query(human)
  230. updateRedDot(human)
  231. end