ZhuanpanLogic.lua 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. local Lang = require("common.Lang")
  2. local Msg = require("core.Msg")
  3. local ObjHuman = require("core.ObjHuman")
  4. local ZhuanpanExcel = require("excel.zhuanpan")
  5. local ItemDefine = require("bag.ItemDefine")
  6. local BagLogic = require("bag.BagLogic")
  7. local Grid = require("bag.Grid")
  8. local Broadcast = require("broadcast.Broadcast")
  9. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  10. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  11. local ItemExcel = require("excel.item").item
  12. local Util = require("common.Util")
  13. local HeroExcel = require("excel.hero").hero
  14. local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
  15. local VipLogic = require("vip.VipLogic")
  16. local EquipLogic = require("equip.EquipLogic")
  17. local YunYingLogic = require("yunying.YunYingLogic")
  18. local TriggerDefine = require("trigger.TriggerDefine")
  19. local TriggerLogic = require("trigger.TriggerLogic")
  20. DEFAULT_ZHUANPAN_TYPE_NORMAL = 1 -- 基础转盘
  21. DEFAULT_ZHUANPAN_TYPE_GAOJI = 2 -- 高级转盘
  22. DEFAULT_BUY_ZHUANPAN_CNT = 50 -- 购买许愿珠所需钻石
  23. DEFAULT_FREE_REFRESH_TIME = 10800 -- 免费刷新的时间
  24. ZHUAN_PAN_ITEM_KIND_CNT = 8 -- 转盘种类数量
  25. DEFAULT_MAX_LUCK = 1000
  26. REWARD_RECORD = { index={}, order={} }
  27. REWARD_RECORD_CNT = 15
  28. function getLuckConfig(mainType)
  29. local config = nil
  30. if mainType == DEFAULT_ZHUANPAN_TYPE_NORMAL then
  31. config = ZhuanpanExcel.luck1
  32. elseif mainType == DEFAULT_ZHUANPAN_TYPE_GAOJI then
  33. config = ZhuanpanExcel.luck2
  34. end
  35. return config
  36. end
  37. function red(human, type)
  38. if not human.db.zhuanpan then return end
  39. local zhuanpan = human.db.zhuanpan[type]
  40. local config = getLuckConfig(type)
  41. if zhuanpan then
  42. local luck = zhuanpan.luck or 0
  43. local luckStatus = zhuanpan.luckStatus
  44. for k, v in pairs(config) do
  45. if luck >= k then
  46. if luckStatus[k] == 1 then
  47. return true
  48. end
  49. end
  50. end
  51. end
  52. if zhuanpan.free == 1 then
  53. return true
  54. end
  55. end
  56. -- 转盘查询
  57. function query(human, mainType)
  58. local zhuanpanConfig = ZhuanpanExcel[mainType]
  59. if not zhuanpanConfig then return end
  60. -- 高级转盘判断等级
  61. local roleConfig = nil
  62. local flag, roleConfig = RoleSystemLogic.isOpen(human,RoleSystemDefine.ROLE_SYS_ID_501)
  63. if mainType == DEFAULT_ZHUANPAN_TYPE_GAOJI then
  64. if flag ~= true then
  65. return Broadcast.sendErr(human, Lang.ZHUANPAN_GAIJI_NEED_LV)
  66. end
  67. end
  68. local oldCnt = getCntByType(human, mainType)
  69. local oldLuck
  70. local tOldStatus = nil
  71. if human.db.zhuanpan and human.db.zhuanpan[mainType] then
  72. oldLuck = human.db.zhuanpan[mainType].luck
  73. if human.db.zhuanpan[mainType].luckStatus then
  74. tOldStatus = Util.copyTable(human.db.zhuanpan[mainType].luckStatus)
  75. end
  76. end
  77. -- 更新
  78. update(human, mainType)
  79. -- 初始化
  80. initDB(human, mainType, oldCnt,oldLuck, tOldStatus)
  81. local zuanpan = human.db.zhuanpan[mainType]
  82. local config = ZhuanpanExcel.define[mainType]
  83. local msgRet = Msg.gc.GC_ZHUANPAN_QUERY
  84. msgRet.type = mainType
  85. msgRet.isFirst = zuanpan.free == 1 and 1 or 0
  86. local now = os.time()
  87. local ts1 = now - zuanpan.ts1
  88. msgRet.refreshTime = 24 * 60 * 60 - ts1
  89. msgRet.freeRefreshTime = DEFAULT_FREE_REFRESH_TIME - (now - zuanpan.ts2)
  90. if msgRet.freeRefreshTime < 0 then
  91. msgRet.freeRefreshTime = 0
  92. end
  93. Grid.makeItem(msgRet.itemID, config.useItemID , 1)
  94. msgRet.itemCnt[0] = 2
  95. msgRet.itemCnt[1] = config.useItemCnt1
  96. msgRet.itemCnt[2] = config.useItemCnt2
  97. msgRet.drawCnt = config.drawCnt2
  98. Grid.makeItem(msgRet.zuanshiNeed, config.refreshCost[1][1], config.refreshCost[1][2])
  99. msgRet.needLv = config and config.lv or 0
  100. if mainType == DEFAULT_ZHUANPAN_TYPE_NORMAL then
  101. msgRet.needLv = ZhuanpanExcel.define[DEFAULT_ZHUANPAN_TYPE_GAOJI].lv
  102. elseif mainType == DEFAULT_ZHUANPAN_TYPE_GAOJI then
  103. msgRet.needLv = ZhuanpanExcel.define[DEFAULT_ZHUANPAN_TYPE_NORMAL].lv
  104. end
  105. msgRet.needVipLv = VipLogic.getPowerNeedLv(VipLogic.VIP_POWER15)
  106. for i = 1, ZHUAN_PAN_ITEM_KIND_CNT do
  107. local data = zuanpan[i]
  108. local dataID = data.id
  109. local tempConfig = zhuanpanConfig[dataID]
  110. Grid.makeItem(msgRet.list[i].item, data.itemID, data.itemCnt)
  111. msgRet.list[i].id = dataID
  112. msgRet.list[i].chance = tempConfig.chance
  113. msgRet.list[i].maxCnt = tempConfig.getCnt
  114. msgRet.list[i].getCnt = 0
  115. if data.getCnt then
  116. msgRet.list[i].getCnt = data.getCnt
  117. end
  118. end
  119. local luckConfig = getLuckConfig(mainType)
  120. msgRet.luck = zuanpan.luck or 0
  121. local len = 0
  122. for k, v in pairs(luckConfig) do
  123. len = len + 1
  124. local net = msgRet.luckList[len]
  125. net.id = k
  126. net.status = zuanpan.luckStatus[k] or 0
  127. Grid.makeItem(net.item, v.reward[1] , v.reward[2])
  128. end
  129. msgRet.luckList[0] = len
  130. len = 0
  131. if REWARD_RECORD[mainType] then
  132. for k, v in ipairs(REWARD_RECORD[mainType]) do
  133. len = len + 1
  134. local net = msgRet.record[len]
  135. net.id = k
  136. net.tips = v.tips
  137. net.timer = v.timer
  138. net.order = v.order
  139. end
  140. end
  141. msgRet.record[0] = len
  142. msgRet.list[0] = ZHUAN_PAN_ITEM_KIND_CNT
  143. len = 0
  144. local totalWeight = 0
  145. local chanceList = {}
  146. for k, v in pairs(zhuanpanConfig) do
  147. totalWeight = totalWeight + v.chance
  148. chanceList[k] = chanceList[k] or {}
  149. local rewardWeight = 0
  150. for a, b in ipairs(v.rewardID) do
  151. rewardWeight = rewardWeight + b[3]
  152. end
  153. chanceList[k].totalWeight = rewardWeight
  154. end
  155. -- 大全重占比
  156. local temp = {}
  157. for k, v in pairs(zhuanpanConfig) do
  158. local chance = chanceList[k]
  159. local scale = v.chance / totalWeight
  160. for a, b in ipairs(v.rewardID) do
  161. local itemID = b[1]
  162. if not temp[itemID] then
  163. local weight = b[3] / chance.totalWeight
  164. len = len + 1
  165. local net = msgRet.chanceList[len]
  166. local itemConfig = ItemDefine.getConfig(itemID)
  167. if not itemConfig then
  168. print(itemID)
  169. end
  170. net.tips = itemConfig and itemConfig.name or ""
  171. net.chance = weight * scale * 100
  172. temp[itemID] = 1
  173. end
  174. end
  175. end
  176. msgRet.chanceList[0] = len
  177. local red1 = red(human, DEFAULT_ZHUANPAN_TYPE_NORMAL)
  178. msgRet.red1 = red1 == true and 1 or 0
  179. local red2 = red(human, DEFAULT_ZHUANPAN_TYPE_GAOJI)
  180. msgRet.red2 = red2 == true and 1 or 0
  181. Msg.send(msgRet, human.fd)
  182. end
  183. function refresh(human, mainType, needTime, bRefreshLuck)
  184. if not ZhuanpanExcel[mainType] then
  185. return
  186. end
  187. local oldCnt = getCntByType(human, mainType)
  188. local oldLuck
  189. local tOldStatus = nil
  190. if human.db.zhuanpan and human.db.zhuanpan[mainType] then
  191. oldLuck = human.db.zhuanpan[mainType].luck
  192. if human.db.zhuanpan[mainType].luckStatus and not bRefreshLuck then
  193. tOldStatus = Util.copyTable(human.db.zhuanpan[mainType].luckStatus)
  194. end
  195. end
  196. -- 更新
  197. update(human, mainType)
  198. -- 初始化
  199. initDB(human, mainType, oldCnt,oldLuck,tOldStatus)
  200. -- 判断是否免费
  201. if needTime then
  202. local config = ZhuanpanExcel.define[mainType]
  203. local needCost = 0
  204. local now = os.time()
  205. local ts2 = now - human.db.zhuanpan[mainType].ts2
  206. local leftTime = DEFAULT_FREE_REFRESH_TIME - ts2
  207. if leftTime > 0 then
  208. needCost = config.refreshCost[1][2]
  209. end
  210. -- 判断消耗
  211. local cnt = BagLogic.getItemCnt(human, config.refreshCost[1][1])
  212. if cnt < needCost then
  213. return
  214. end
  215. -- 扣消耗
  216. if needCost > 0 then
  217. BagLogic.delItem(human, config.refreshCost[1][1], needCost, "zhuanpan_refresh")
  218. end
  219. -- 改db
  220. local dayStartTime = Util.getDayStartTime(now)
  221. human.db.zhuanpan[mainType].ts2 = now
  222. human.db.zhuanpan[mainType].ts1 = dayStartTime
  223. end
  224. addRandomReward(human, mainType)
  225. -- 通知客户端
  226. if needTime then
  227. query(human, mainType)
  228. end
  229. end
  230. -- 刷新数据
  231. function updateDaily(human)
  232. refresh(human, DEFAULT_ZHUANPAN_TYPE_NORMAL)
  233. refresh(human, DEFAULT_ZHUANPAN_TYPE_GAOJI)
  234. human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].free = 1
  235. human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].freeCnt = 0
  236. end
  237. -- 抽奖
  238. function getReward(human, mainType, cnt)
  239. local config = ZhuanpanExcel.define[mainType]
  240. if not ZhuanpanExcel[mainType] then
  241. return
  242. end
  243. local needItemID = config.useItemID
  244. local needItemCnt = nil
  245. if cnt == 1 then
  246. needItemCnt = config.useItemCnt1
  247. elseif cnt == config.drawCnt2 then
  248. needItemCnt = config.useItemCnt2
  249. -- 多次抽奖需要达到指定vip等级
  250. --[[local needVipLv = VipLogic.getPowerNeedLv(VipLogic.VIP_POWER15)
  251. if VipLogic.getVipLv(human) < needVipLv then
  252. return Broadcast.sendErr(human, Util.format(Lang.ROLE_VIP_ERROR2, needVipLv))
  253. end]]
  254. end
  255. if needItemCnt == nil then
  256. return
  257. end
  258. local oldCnt = getCntByType(human, mainType)
  259. local oldLuck
  260. local tOldStatus = nil
  261. if human.db.zhuanpan and human.db.zhuanpan[mainType] then
  262. oldLuck = human.db.zhuanpan[mainType].luck
  263. if human.db.zhuanpan[mainType].luckStatus then
  264. tOldStatus = Util.copyTable(human.db.zhuanpan[mainType].luckStatus)
  265. end
  266. end
  267. -- 更新
  268. update(human, mainType)
  269. -- 初始化
  270. initDB(human, mainType, oldCnt,oldLuck, tOldStatus)
  271. local zhuanpan = human.db.zhuanpan[mainType]
  272. if not BagLogic.checkItemCnt(human, needItemID, needItemCnt) then
  273. return
  274. end
  275. -- 扣消耗
  276. BagLogic.delItem(human, needItemID, needItemCnt, "zhuanpan_get")
  277. local msgRet = Msg.gc.GC_ZHUANPAN_GET_REWARD
  278. msgRet.type = mainType
  279. msgRet.list[0] = cnt
  280. local len = 0
  281. for i = 1, cnt do
  282. local result = getLuckDrawSingle(human, mainType)
  283. if result == nil then
  284. assert(nil)
  285. end
  286. -- 改db
  287. local data = zhuanpan[result]
  288. local zhuanpanConfig = ZhuanpanExcel[mainType]
  289. local tempConfig = zhuanpanConfig[data.id]
  290. local nowGetCnt = data.getCnt or 0
  291. local maxGetCnt = tempConfig.getCnt
  292. if maxGetCnt ~= 0 then
  293. data.getCnt = nowGetCnt + 1
  294. end
  295. -- 加道具
  296. local itemID = data.itemID
  297. local itemCnt = data.itemCnt
  298. BagLogic.addItem(human, itemID, itemCnt, "zhuanpan_get")
  299. local itemConfig = ItemExcel[itemID]
  300. local heroConfig = HeroExcel[itemID]
  301. -- 存在部分 英雄配表里面的id 和装备配表重合了
  302. if itemConfig and itemConfig.subType == ItemDefine.ITEM_SUBTYPE_SUIPIAN and heroConfig and heroConfig.star == 5 then
  303. if mainType == DEFAULT_ZHUANPAN_TYPE_GAOJI then
  304. ChatPaoMaLogic.broadcast(human, ChatPaoMaLogic.PAOMA_TYPE_BROAD_TYPE11, tempConfig.grade, itemID)
  305. else
  306. ChatPaoMaLogic.broadcast(human, ChatPaoMaLogic.PAOMA_TYPE_BROAD_TYPE10, tempConfig.grade, itemID)
  307. end
  308. end
  309. if tempConfig.getCnt > 0 then
  310. if not REWARD_RECORD[mainType] then
  311. REWARD_RECORD[mainType] = {}
  312. end
  313. local record = REWARD_RECORD[mainType]
  314. local index = REWARD_RECORD.index[mainType] or 1
  315. local order = REWARD_RECORD.order[mainType] or 1
  316. record[index] = record[index] or {}
  317. record[index].tips = Util.format(Lang.ZHUANPAN_RECORD_TWO, human.db.name, ItemDefine.getValue(itemID,"name"), itemCnt)
  318. record[index].timer = os.time()
  319. record[index].order = order
  320. index = index + 1
  321. if index > REWARD_RECORD_CNT then
  322. index = 1
  323. end
  324. REWARD_RECORD.order[mainType] = order + 1
  325. REWARD_RECORD.index[mainType] = index
  326. end
  327. msgRet.list[i] = data.id
  328. len = len + 1
  329. if not ItemDefine.isEquip(itemID) then
  330. Grid.makeItem(msgRet.item[len], itemID, itemCnt)
  331. else
  332. EquipLogic.makeEquipItemOne(human, msgRet.item[len])
  333. end
  334. end
  335. msgRet.item[0] = len
  336. -- 增加积分
  337. local itemID = ItemDefine.ITEM_LUCK_ID
  338. local itemCnt = cnt * 10
  339. BagLogic.addItem(human, itemID, itemCnt, "zhuanpan_back")
  340. msgRet.luckItem[0] = 1
  341. Grid.makeItem(msgRet.luckItem[1], itemID, itemCnt)
  342. zhuanpan.cnt = zhuanpan.cnt or 0
  343. zhuanpan.cnt = zhuanpan.cnt + cnt
  344. zhuanpan.luck = zhuanpan.luck or 0
  345. zhuanpan.luck = zhuanpan.luck + cnt * 10
  346. zhuanpan.luckStatus = zhuanpan.luckStatus or {}
  347. local luckConfig = getLuckConfig(mainType)
  348. -- 集火幸运值 奖励
  349. local luckStatus = zhuanpan.luckStatus
  350. for k, v in pairs(luckConfig) do
  351. if zhuanpan.luck >= k then
  352. if luckStatus[k] == nil then
  353. luckStatus[k] = 1
  354. end
  355. end
  356. end
  357. Msg.send(msgRet, human.fd)
  358. query(human, mainType)
  359. YunYingLogic.onCallBack(human, "onFindStar", cnt)
  360. TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_FINDSTAR, human.db._id, cnt)
  361. end
  362. -- 购买许愿珠
  363. function buyCnt(human, mainType, cnt)
  364. if cnt < 1 then return end
  365. if mainType ~= DEFAULT_ZHUANPAN_TYPE_NORMAL then
  366. return
  367. end
  368. local needZuanshi = 50 * cnt
  369. -- 判断消耗
  370. if not ObjHuman.checkRMB(human, needZuanshi) then
  371. return
  372. end
  373. -- 扣消耗
  374. ObjHuman.decZuanshi(human, -needZuanshi, "zhuanpan_buy_cnt", ItemDefine.ITEM_BASE_QIYUANZHU_ID, cnt)
  375. -- 增加物品
  376. BagLogic.addItem(human, ItemDefine.ITEM_BASE_QIYUANZHU_ID, cnt, "zhuanpan_buy_cnt")
  377. -- 通知客户端
  378. local msgRet = Msg.gc.GC_BUY_ZHUANPAN_CNT
  379. Msg.send(msgRet, human.fd)
  380. end
  381. ------------------------------功能函数--------------------------------------
  382. function addRandomReward(human, mainType)
  383. local zhuanpanConfig = ZhuanpanExcel[mainType]
  384. if not zhuanpanConfig then return end
  385. local nowLv = human.db.lv
  386. local itemID = nil
  387. local itemCnt = nil
  388. local cntIndex = 0
  389. for i = 1, #zhuanpanConfig do
  390. local tempConfig = zhuanpanConfig[i]
  391. if not tempConfig then return end
  392. if mainType == DEFAULT_ZHUANPAN_TYPE_NORMAL then
  393. if nowLv >= tempConfig.minLv and nowLv <= tempConfig.maxLv then
  394. itemID, itemCnt = getRandomItem(human, tempConfig)
  395. if itemID and itemCnt then
  396. cntIndex = cntIndex + 1
  397. human.db.zhuanpan[mainType][cntIndex] = {}
  398. human.db.zhuanpan[mainType][cntIndex].id = i
  399. human.db.zhuanpan[mainType][cntIndex].itemID = itemID
  400. human.db.zhuanpan[mainType][cntIndex].itemCnt = itemCnt
  401. end
  402. end
  403. elseif mainType == DEFAULT_ZHUANPAN_TYPE_GAOJI then
  404. itemID, itemCnt = getRandomItem(human, tempConfig)
  405. if itemID and itemCnt then
  406. cntIndex = cntIndex + 1
  407. human.db.zhuanpan[mainType][cntIndex] = {}
  408. human.db.zhuanpan[mainType][cntIndex].id = i
  409. human.db.zhuanpan[mainType][cntIndex].itemID = itemID
  410. human.db.zhuanpan[mainType][cntIndex].itemCnt = itemCnt
  411. end
  412. end
  413. end
  414. end
  415. function getLuckDrawSingle(human, mainType)
  416. local zhuanpanConfig = ZhuanpanExcel[mainType]
  417. if not zhuanpanConfig then return end
  418. local totalWeight = 0
  419. local recordData = nil
  420. for i = 1, ZHUAN_PAN_ITEM_KIND_CNT do
  421. local data = human.db.zhuanpan[mainType][i]
  422. local drawID = data.id
  423. local tempConfig = zhuanpanConfig[drawID]
  424. local nowGetCnt = data.getCnt or 0
  425. local maxGetCnt = tempConfig.getCnt
  426. if maxGetCnt == 0 or maxGetCnt > nowGetCnt then
  427. totalWeight = totalWeight + tempConfig.chance
  428. end
  429. end
  430. local randNum = math.random(1,totalWeight)
  431. for i = 1, ZHUAN_PAN_ITEM_KIND_CNT do
  432. local data = human.db.zhuanpan[mainType][i]
  433. local drawID = data.id
  434. local tempConfig = zhuanpanConfig[drawID]
  435. local nowGetCnt = data.getCnt or 0
  436. local maxGetCnt = tempConfig.getCnt
  437. if maxGetCnt == 0 or maxGetCnt > nowGetCnt then
  438. local tempWeight = tempConfig.chance
  439. if randNum <= tempWeight then
  440. return i
  441. end
  442. randNum = randNum - tempWeight
  443. end
  444. end
  445. end
  446. function initDB(human, mainType, cnt, oldluck, tOldStatus)
  447. if human.db.zhuanpan ~= nil and
  448. human.db.zhuanpan[mainType] ~= nil then
  449. return
  450. end
  451. local now = os.time()
  452. human.db.zhuanpan = human.db.zhuanpan or {}
  453. human.db.zhuanpan[mainType] = {}
  454. local dayStartTime = Util.getDayStartTime(now)
  455. human.db.zhuanpan[mainType].ts1 = dayStartTime
  456. human.db.zhuanpan[mainType].ts2 = now - DEFAULT_FREE_REFRESH_TIME
  457. human.db.zhuanpan[mainType].cnt = cnt
  458. human.db.zhuanpan[mainType].luck = oldluck
  459. human.db.zhuanpan[mainType].free = 1
  460. if tOldStatus then
  461. human.db.zhuanpan[mainType].luckStatus = tOldStatus
  462. else
  463. human.db.zhuanpan[mainType].luckStatus = {}
  464. end
  465. addRandomReward(human, mainType)
  466. end
  467. function update(human, mainType)
  468. if human.db.zhuanpan == nil or human.db.zhuanpan[mainType] == nil then
  469. return
  470. end
  471. if human.db.zhuanpan[mainType].ts1 then
  472. -- 防止前端 在结束倒计时结束 发送查询 , 这边还没有结束 返回一样的数据
  473. local now = os.time() + 1
  474. local ts1 = now - human.db.zhuanpan[mainType].ts1
  475. local leftTime = 24 * 60 * 60 - ts1
  476. if leftTime <= 0 then
  477. human.db.zhuanpan[mainType] = nil
  478. end
  479. end
  480. end
  481. function getRandomItem(human, tempConfig)
  482. local totalWeight = 0
  483. for k, v in ipairs(tempConfig.rewardID) do
  484. totalWeight = totalWeight + v[3]
  485. end
  486. local random = math.random(1, totalWeight)
  487. for k, v in ipairs(tempConfig.rewardID) do
  488. local weight = v[3]
  489. local itemID = v[1]
  490. local itemCnt = v[2]
  491. if random <= weight then
  492. return itemID, itemCnt
  493. end
  494. random = random - weight
  495. end
  496. end
  497. function zhuanpanByGm(human,mainType,val)
  498. if not mainType and not val then
  499. return
  500. end
  501. if mainType == 0 or mainType > 2 or val < 5 then
  502. return
  503. end
  504. if human.db.zhuanpan[mainType] then
  505. local now = os.time()
  506. human.db.zhuanpan[mainType].ts1 = now - 24 * 60 * 60 + val
  507. end
  508. end
  509. function getCntByType(human, mainType)
  510. local num = 0
  511. if human.db.zhuanpan and human.db.zhuanpan[mainType] then
  512. human.db.zhuanpan[mainType].cnt = human.db.zhuanpan[mainType].cnt or 0
  513. num = human.db.zhuanpan[mainType].cnt
  514. end
  515. return num
  516. end
  517. function getLuck(human, msg)
  518. local mainType = msg.type
  519. local config = getLuckConfig(mainType)
  520. if not config then
  521. return
  522. end
  523. local zhuanpan = human.db.zhuanpan[mainType]
  524. if zhuanpan == nil then
  525. return
  526. end
  527. if zhuanpan.luck <= 0 then
  528. return
  529. end
  530. local luckStatus = zhuanpan.luckStatus
  531. if luckStatus == nil or luckStatus[msg.id] ~= 1 then
  532. return
  533. end
  534. luckStatus[msg.id] = 2
  535. BagLogic.addItem(human, config[msg.id].reward[1], config[msg.id].reward[2], "zhuanpan_back")
  536. local itemList = {[1] = {config[msg.id].reward[1],config[msg.id].reward[2]}}
  537. BagLogic.sendItemGetList(human,itemList, "zhuanpan_back")
  538. --计算是否需要重新扣除幸运值 重新激活奖励
  539. local luck = zhuanpan.luck
  540. local calc = true
  541. for k, v in pairs(config) do
  542. if luckStatus[k] == nil or luckStatus[k] ~= 2 then
  543. calc = false
  544. end
  545. end
  546. if calc == true then
  547. zhuanpan.luckStatus = {}
  548. luck = luck - DEFAULT_MAX_LUCK
  549. luck = luck < 0 and 0 or luck
  550. zhuanpan.luck = luck
  551. -- 集火幸运值 奖励
  552. local luckStatus = zhuanpan.luckStatus
  553. for k, v in pairs(config) do
  554. if zhuanpan.luck >= k then
  555. if luckStatus[k] == nil then
  556. luckStatus[k] = 1
  557. end
  558. end
  559. end
  560. end
  561. query(human, msg.type)
  562. end
  563. function isDot(human)
  564. local red1 = red(human, DEFAULT_ZHUANPAN_TYPE_NORMAL)
  565. if red1 then return true end
  566. --local red2 = red(human, DEFAULT_ZHUANPAN_TYPE_GAOJI)
  567. --if red2 then return true end
  568. return false
  569. end
  570. function getFree(human)
  571. local oldLuck
  572. local tOldStatus = nil
  573. if human.db.zhuanpan and human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL] then
  574. oldLuck = human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].luck
  575. if human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].luckStatus then
  576. tOldStatus = Util.copyTable(human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].luckStatus)
  577. end
  578. end
  579. initDB(human,DEFAULT_ZHUANPAN_TYPE_NORMAL,nil, oldLuck,tOldStatus)
  580. if human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].free ~= 1 then
  581. return
  582. end
  583. human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].free = 0
  584. local zhuanpanConfig = ZhuanpanExcel.define[DEFAULT_ZHUANPAN_TYPE_NORMAL]
  585. local len = #zhuanpanConfig.freeCnt
  586. local totalWeight = 0
  587. for i = 1,len do
  588. totalWeight = totalWeight + zhuanpanConfig.freeCnt[i][2]
  589. end
  590. local itemCnt = nil
  591. local randomWeight = math.random(1,totalWeight)
  592. for i = 1,len do
  593. if randomWeight < zhuanpanConfig.freeCnt[i][2] then
  594. itemCnt = zhuanpanConfig.freeCnt[i][1]
  595. break
  596. else
  597. randomWeight = randomWeight - zhuanpanConfig.freeCnt[i][2]
  598. end
  599. end
  600. if itemCnt then
  601. local item = {}
  602. item[1] = {zhuanpanConfig.useItemID,itemCnt}
  603. item[2] = zhuanpanConfig.freeitem[1]
  604. BagLogic.addItemList(human, item, "zhuanpan_get")
  605. else
  606. assert()
  607. end
  608. end