ZhuanpanLogic.lua 22 KB

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