RoleStorageBox.lua 6.6 KB

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