RoleStorageBox.lua 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. -- 月光宝盒
  2. -- 创角时根据服务器开服天数获得一定道具,当玩家从其他特定玩法获得这些道具时,会额外获得一份道具,
  3. -- 额外道具数量 = math.min(其他玩法获得道具数量, 宝盒中道具剩余数量), 并从宝盒中扣除额外道具数量
  4. -- db
  5. --[=[
  6. human.db.storageBoxData = {
  7. [itemID] = itemCnt,
  8. }
  9. ]=]--
  10. local Msg = require("core.Msg")
  11. local Grid = require("bag.Grid")
  12. local Log = require("common.Log")
  13. local CommonDB = require("common.CommonDB")
  14. local LogDefine = require("common.LogDefine")
  15. local ItemDefine = require("bag.ItemDefine")
  16. local BagLogic = require("bag.BagLogic")
  17. local ITEM_LOG_TYPE = "storageBox" --本模块的道具日志标识
  18. local GET_EXTEA_REWARD_RATE = 50 -- 额外获得一份奖励的几率
  19. -- 月光宝盒道具列表
  20. -- key 为道具ID, value为基础数量
  21. local ITEM_LIST = {
  22. [ItemDefine.ITEM_JINBI_ID] = 1000000,
  23. [ItemDefine.ITEM_GREEN_EXP_ID] = 500000,
  24. [ItemDefine.ITEM_DRAWCARD_GAOCHOU_ID] = 20,
  25. [ItemDefine.ITEM_HERO_UPGRADE_BOOK] = 2,
  26. [ItemDefine.ITEM_BASE_QIYUANZHU_ID] = 2,
  27. [ItemDefine.ITEM_XIANZHI_BAOZHU_ID] = 1,
  28. [ItemDefine.ITEM_FUWEN_JINGHUA] = 500,
  29. [ItemDefine.ITEM_LONGHUNSHI_ID] = 50,
  30. [ItemDefine.ITEM_ZUANSHI_ID] = 500,
  31. [ItemDefine.ITEM_HERO_UPGRADE_ID] = 1000,
  32. }
  33. -- 可获得额外道具的来源列表
  34. local SOURECE_LIST = {
  35. -- 主线闯关相关
  36. [LogDefine.DEFINE.battle] = '1',
  37. [LogDefine.DEFINE.battle_win] = '1',
  38. [LogDefine.DEFINE.tongguan] = '1',
  39. [LogDefine.DEFINE.chapterReward] = '1',
  40. -- 恶魔之塔
  41. [LogDefine.DEFINE.tower_win_reward] = '1',
  42. [LogDefine.DEFINE.tower_king_unlock] = '1',
  43. [LogDefine.DEFINE.tower_reward] = '1',
  44. [LogDefine.DEFINE.tower_king_reward] = '1',
  45. -- 公会首领
  46. [LogDefine.DEFINE.unionBoss] = '1',
  47. -- 绝望深渊
  48. [LogDefine.DEFINE.lianyu_firstReward] = '1',
  49. [LogDefine.DEFINE.lianyu_win_reward] = '1',
  50. -- 女巫森林
  51. [LogDefine.DEFINE.copy_win] = '1',
  52. -- 勇者试炼
  53. [LogDefine.DEFINE.drill] = '1',
  54. -- 种族试炼
  55. [LogDefine.DEFINE.racialTrial] = '1',
  56. -- 冰龙巢穴
  57. [LogDefine.DEFINE.dragonCopy] = '1',
  58. -- 遗迹探险
  59. [LogDefine.DEFINE.yj_treasure] = '1',
  60. [LogDefine.DEFINE.yj_treasure_kaowen] = '1',
  61. -- 失落神庙
  62. [LogDefine.DEFINE.lostTemple] = '1',
  63. -- 次元魔珠/魔王梼杌
  64. [LogDefine.DEFINE.ciYuanMozhu] = '1',
  65. -- 冠军联赛
  66. [LogDefine.DEFINE.jjc_season_box] = '1',
  67. [LogDefine.DEFINE.jjc_worship] = '1',
  68. [LogDefine.DEFINE.jjc_fight] = '1',
  69. -- 幽暗禁地
  70. -- [LogDefine.DEFINE.darkforarea] = '1',
  71. }
  72. -- 不能获得额外奖励的来源列表
  73. local EXLUDE_SOURECE_LIST = {
  74. -- 英雄重生
  75. [LogDefine.DEFINE.hero_chongsheng] = '1',
  76. -- 英雄回退
  77. [LogDefine.DEFINE.hero_huitui] = '1',
  78. }
  79. local function initData(human)
  80. human.db.storageBoxData = {}
  81. end
  82. local function getData(human)
  83. return human.db.storageBoxData
  84. end
  85. local function updateData(human, itemId, itemCnt, isAdd)
  86. local storageBoxData = getData(human)
  87. if isAdd then
  88. storageBoxData[itemId] = itemCnt
  89. else
  90. local num = storageBoxData[itemId] - itemCnt
  91. storageBoxData[itemId] = math.max(num, 0)
  92. end
  93. end
  94. local function writeLog(human, sourceType, itemId, itemSubCnt, randRate)
  95. local logStr = string.format("角色: [%s] 通过: %s 扣除月光宝盒中道具, 道具ID: %d, 道具数量: %d, 随机值: %d",
  96. human.db._id, sourceType, itemId, itemSubCnt, randRate)
  97. Log.write(Log.LOGID_OSS_STORAGEBOx, logStr)
  98. end
  99. -- 创角时给角色的月光宝盒中添加一定数量道具
  100. function FillStorageBox(human)
  101. local openSvrDay = CommonDB.getServerOpenDay()
  102. if not openSvrDay or openSvrDay <= 1 then
  103. return
  104. end
  105. openSvrDay = openSvrDay - 1
  106. local storageBoxData = getData(human)
  107. if storageBoxData then
  108. return
  109. end
  110. -- 新修改: 需要获得一个道具
  111. BagLogic.addItem(human, 1038, 1, ITEM_LOG_TYPE)
  112. initData(human)
  113. storageBoxData = getData(human)
  114. for itemId, itemBaseCnt in pairs(ITEM_LIST) do
  115. updateData(human, itemId, itemBaseCnt * openSvrDay , true)
  116. end
  117. end
  118. -- 从月光宝盒中额外获取一份道具
  119. function GetExtraItem(human, itemId, itemCnt, sourceType)
  120. local sourceId = LogDefine.DEFINE[sourceType]
  121. -- 新修改, 不需要特定来源
  122. -- if not SOURECE_LIST[sourceId] then
  123. -- return
  124. -- end
  125. if EXLUDE_SOURECE_LIST[sourceId] then
  126. return
  127. end
  128. local randRate = math.random(1, 100)
  129. if randRate > GET_EXTEA_REWARD_RATE then
  130. return
  131. end
  132. if not ITEM_LIST[itemId] then
  133. return
  134. end
  135. local storageBoxData = getData(human)
  136. if not storageBoxData then
  137. return
  138. end
  139. local itemSubCnt = storageBoxData[itemId]
  140. if itemSubCnt <= 0 then
  141. return
  142. end
  143. if itemSubCnt >= itemCnt then
  144. itemSubCnt = itemCnt
  145. end
  146. -- 减少月光宝盒中该道具的数量
  147. updateData(human, itemId, itemSubCnt)
  148. writeLog(human, sourceType, itemId, itemSubCnt, randRate)
  149. -- Query(human)
  150. local itemTbl = {itemId, itemSubCnt}
  151. -- 增加道具的来源标识
  152. itemTbl[4] = 1
  153. return itemTbl
  154. end
  155. -- 查询
  156. function Query(human)
  157. local storageBoxData = getData(human)
  158. if not storageBoxData then
  159. return
  160. end
  161. local msgRet = Msg.gc.GC_ROLESTORAGEBOX_QUERY
  162. local itemList = msgRet.itemList
  163. local len = 0
  164. for itemId, itemCnt in pairs(storageBoxData) do
  165. len = len + 1
  166. Grid.makeItem(itemList[len], itemId, itemCnt)
  167. end
  168. itemList[0] = len
  169. Msg.send(msgRet, human.fd)
  170. end