BarTaskLogic.lua 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. local Lang = require("common.Lang")
  2. local Util = require("common.Util")
  3. local Msg = require("core.Msg")
  4. local ObjHuman = require("core.ObjHuman")
  5. local BarTaskExcel = require("excel.barTask")
  6. local ItemExcel = require("excel.item")
  7. local HeroExcel = require("excel.hero")
  8. local Grid = require("bag.Grid")
  9. local BagLogic = require("bag.BagLogic")
  10. local Broadcast = require("broadcast.Broadcast")
  11. local ItemDefine = require("bag.ItemDefine")
  12. local HeroDefine = require("hero.HeroDefine")
  13. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  14. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  15. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  16. local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
  17. local DailyTaskLogic = require("dailyTask.DailyTaskLogic")
  18. local RoleExcel = require("excel.role")
  19. local Util = require("common.Util")
  20. local MoshouLogic = require("moshou.MoshouLogic")
  21. local TequanShopLogic = require("present.TequanShopLogic")
  22. local GuideLogic = require("guide.GuideLogic")
  23. local HeroLogLogic = require("absAct.HeroLogLogic")
  24. local HeroGrowUp = require("absAct.HeroGrowUp")
  25. local MengxinLogic = require("present.MengxinLogic")
  26. local YunYingLogic = require("yunying.YunYingLogic")
  27. local TalismanLogic = require("talisman.TalismanLogic")
  28. DEFAULT_BASE_TASK_CNT = 6 -- 默认基本任务数
  29. DEFAULT_REFRESH_ZUANSHI_CNT = 30 -- 默认刷新所需钻石数量
  30. DEFAULT_MAX_TASK_CNT = 200 -- 最大的任务数
  31. DEFAULT_MAX_DOUBLE_CNT = 10 -- 双倍领取次数
  32. BARTASK_OP_1 = 1 -- 放弃任务
  33. BARTASK_OP_2 = 2 -- 刷新任务
  34. BARTASK_OP_3 = 3 -- 开始任务
  35. BARTASK_OP_4 = 4 -- 完成/加速任务
  36. BARTASK_DAY_FREE = 2 -- 玩家每日免费刷新次数
  37. BARTASK_QUICK_FINISH_TIME = 60 * 60 -- 玩家免费完成时间
  38. BARTASK_TASK_NEED_ISR = 2200 -- 接取任务所需要的情报
  39. GUIDE_DEFAUT_STAR = {[1] = 4}
  40. GUIDE_DEFAUT_ITEM = {[1]= {ItemDefine.ITEM_DRAWCARD_GAOCHOU_ID, 1}}
  41. function setBarTaskData(msgData, taskID, human, dbData, now)
  42. if type(taskID) ~= "number" then
  43. return
  44. end
  45. if now == nil then
  46. now = os.time()
  47. end
  48. msgData.taskID = taskID
  49. local heroConfig = HeroExcel.hero[dbData.nameID]
  50. local name = heroConfig.name
  51. local tempConfig = BarTaskExcel.taskName[dbData.star]
  52. local action = nil
  53. if dbData.star <= 3 then
  54. action = tempConfig.actionName[dbData.actionID]
  55. msgData.name = Util.format(Lang.BAR_NAME_FORMAT, action, name)
  56. else
  57. action = tempConfig.taskName[dbData.actionID]
  58. msgData.name = Util.format(Lang.BAR_NAME_FORMAT, name, action)
  59. end
  60. msgData.star = dbData.star
  61. -- 存储的时间是:领取任务时间 - 1
  62. if dbData.ts then
  63. msgData.leftTime = BarTaskExcel.barTask[dbData.star].useTime -(now - dbData.ts)
  64. if msgData.leftTime < 0 then
  65. msgData.leftTime = 0
  66. end
  67. else
  68. msgData.leftTime = BarTaskExcel.barTask[dbData.star].useTime
  69. end
  70. msgData.needTime = BarTaskExcel.barTask[dbData.star].useTime
  71. -- local itemID = dbData.itemID
  72. -- local itemCnt = dbData.itemCnt
  73. -- Grid.makeItem(msgData.item, itemID, itemCnt)
  74. local need = getQuickNeed(msgData.leftTime)
  75. msgData.zuanshiNeed = need
  76. -- BarTaskExcel.barTask[dbData.star].zuanshiNeed
  77. msgData.heroIndex[0] = 0
  78. if dbData.hero then
  79. msgData.heroIndex[0] = #dbData.hero
  80. for i = 1, #dbData.hero do
  81. msgData.heroIndex[i] = dbData.hero[i]
  82. end
  83. end
  84. end
  85. function rewardQuery(human, star)
  86. local barTaskConfig = BarTaskExcel.barTask[star]
  87. local msgRet = Msg.gc.GC_BARTASK_REWARD_QUERY
  88. msgRet.star = star
  89. for k, v in ipairs(barTaskConfig.reward) do
  90. Grid.makeItem(msgRet.item[k], v[1], v[2][1])
  91. end
  92. msgRet.item[0] = #barTaskConfig.reward
  93. Msg.send(msgRet, human.fd)
  94. end
  95. -- 查询酒馆任务
  96. function query(human)
  97. if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1104, true) then
  98. return
  99. end
  100. ObjHuman.updateDaily(human)
  101. initDB(human)
  102. guideBar(human)
  103. local needIsr = BARTASK_TASK_NEED_ISR
  104. local cjPrivilege = ChengjiuLogic.checkPrivilege(human, ChengjiuDefine.PRIVILEGE_TYPE_5)
  105. if cjPrivilege then
  106. local rate =(100 - cjPrivilege) / 100
  107. needIsr = needIsr * rate
  108. end
  109. local msgRet = Msg.gc.GC_BARTASK_QUERY
  110. local now = os.time()
  111. local ts1 = Util.getDayStartTime(now)
  112. local double = RoleSystemLogic.isDouble(human, RoleSystemDefine.ROLE_SYS_ID_1104)
  113. msgRet.refreshTime = 24 * 60 * 60 -(now - ts1)
  114. msgRet.refreshNeed = DEFAULT_REFRESH_ZUANSHI_CNT
  115. msgRet.qingbaoNeed = needIsr
  116. msgRet.nowQingBao = human.db.bar and human.db.bar.qingbao or 0
  117. msgRet.qingBaoMax = RoleExcel.exp[human.db.lv].qingBaoMax
  118. msgRet.tequan = human.db.bar and human.db.bar.vip or 0
  119. msgRet.tequanSuper = human.db.bar and human.db.bar.superVip or 0
  120. msgRet.freeCnt = BARTASK_DAY_FREE - human.db.bar.refresCnt
  121. msgRet.freeCnt = msgRet.freeCnt > 0 and msgRet.freeCnt or 0
  122. msgRet.doubleCnt = 0
  123. --秘宝对悬赏情报上限加成
  124. local qingBaoAdd = TalismanLogic.getTalismanAdd(human, TalismanLogic.OTHER_EFFECT_TBL.XUANSHANG_QB_MAX) or 0
  125. msgRet.qingBaoMax = msgRet.qingBaoMax + qingBaoAdd
  126. Grid.makeItem(msgRet.refresItem, ItemDefine.ITEM_BASE_JUANZHOU_ID, 1)
  127. if double and human.db.bar.doubleCnt <= DEFAULT_MAX_DOUBLE_CNT then
  128. msgRet.doubleCnt = DEFAULT_MAX_DOUBLE_CNT - human.db.bar.doubleCnt
  129. end
  130. local cnt = 0
  131. for key, value in pairs(human.db.bar) do
  132. if type(key) == "number" then
  133. cnt = cnt + 1
  134. setBarTaskData(msgRet.list[cnt], key, human, value, now)
  135. if cnt >= 200 then
  136. break
  137. end
  138. end
  139. end
  140. msgRet.list[0] = cnt
  141. -- Msg.trace(msgRet)
  142. Msg.send(msgRet, human.fd)
  143. end
  144. -- 刷新酒吧任务
  145. function refresh(human)
  146. ObjHuman.updateDaily(human)
  147. initDB(human)
  148. local allTaskCnt = getAllTaskCnt(human)
  149. if allTaskCnt >= DEFAULT_MAX_TASK_CNT then
  150. return Broadcast.sendErr(human, Lang.BAR_TASK_ALL_MAX_ERR)
  151. end
  152. local isFree = false
  153. if human.db.bar.refresCnt < BARTASK_DAY_FREE then
  154. isFree = true
  155. end
  156. -- 判断消耗
  157. if not isFree then
  158. -- 检测 是否拥有道具
  159. if BagLogic.getItemCnt(human, ItemDefine.ITEM_BASE_JUANZHOU_ID) > 0 then
  160. BagLogic.delItem(human, ItemDefine.ITEM_BASE_JUANZHOU_ID, 1, "bar_refresh")
  161. else
  162. local needZuanshi = DEFAULT_REFRESH_ZUANSHI_CNT
  163. if not ObjHuman.checkRMB(human, needZuanshi) then
  164. return
  165. end
  166. -- 扣消耗
  167. ObjHuman.decZuanshi(human, - needZuanshi, "bar_refresh")
  168. end
  169. end
  170. human.db.bar.refresCnt = human.db.bar.refresCnt + 1
  171. -- 改db
  172. for taskID, taskData in pairs(human.db.bar) do
  173. if type(taskID) == "number" then
  174. if taskData.isLock == nil then
  175. human.db.bar[taskID] = nil
  176. end
  177. end
  178. end
  179. addRandomTask(human, DEFAULT_BASE_TASK_CNT)
  180. query(human)
  181. end
  182. -- 查看具体任务信息
  183. function getQuery(human, taskID)
  184. ObjHuman.updateDaily(human)
  185. initDB(human)
  186. local taskData = human.db.bar[taskID]
  187. if taskData == nil then
  188. return
  189. end
  190. local msgRet = Msg.gc.GC_BARTASK_GET_QUERY
  191. local barTaskConfig = BarTaskExcel.barTask[taskData.star]
  192. msgRet.star = barTaskConfig.starNeed[1] or 0
  193. msgRet.camp[0] = taskData.camp and #taskData.camp or 0
  194. for i = 1, #taskData.camp do
  195. msgRet.camp[i] = taskData.camp[i]
  196. end
  197. -- Msg.trace(msgRet)
  198. Msg.send(msgRet, human.fd)
  199. end
  200. -- 新手引导下默认高抽
  201. function guideBar(human)
  202. if not human.db.bar or not human.db.bar[1] then return end
  203. local flag = GuideLogic.getGuideSkip(human, GuideLogic.SKIPTYPE_JUMP_BARTASK)
  204. if flag then return end
  205. human.db.bar[1].star = GUIDE_DEFAUT_STAR[1]
  206. -- human.db.bar[1].itemID = GUIDE_DEFAUT_ITEM[1][1]
  207. -- human.db.bar[1].itemCnt = GUIDE_DEFAUT_ITEM[1][2]
  208. GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_BARTASK)
  209. end
  210. -- 领取任务
  211. function getDo(human, taskID, heroIndexList, heroIDList)
  212. if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1104, true) then
  213. return
  214. end
  215. ObjHuman.updateDaily(human)
  216. initDB(human)
  217. guideBar(human)
  218. local taskData = human.db.bar[taskID]
  219. if taskData == nil then
  220. return
  221. end
  222. local barTaskConfig = BarTaskExcel.barTask[taskData.star]
  223. -- 判断数量
  224. if heroIDList[0] ~= heroIndexList[0] then
  225. return
  226. end
  227. local needIsr = BARTASK_TASK_NEED_ISR
  228. local cjPrivilege = ChengjiuLogic.checkPrivilege(human, ChengjiuDefine.PRIVILEGE_TYPE_5)
  229. if cjPrivilege then
  230. local rate =(100 - cjPrivilege) / 100
  231. needIsr = needIsr * rate
  232. end
  233. -- 判定情报值
  234. if human.db.bar.qingbao < needIsr then
  235. return Broadcast.sendErr(human, Lang.BAR_TASK_GET_ERR_ISR)
  236. end
  237. local needStar = barTaskConfig.starNeed[1]
  238. local needStarCnt = barTaskConfig.starNeed[2]
  239. local nowStarCnt = 0
  240. local camp2Cnt = { }
  241. -- 判断英雄
  242. local indexTable = { }
  243. for i = 1, heroIDList[0] do
  244. local tempIndex = heroIndexList[i]
  245. local heroGird = human.db.heroBag[tempIndex]
  246. if type(heroGird) ~= "table" then
  247. -- 没有这个英雄
  248. return
  249. end
  250. if heroGird.id ~= heroIDList[i] then
  251. -- 没对应上
  252. return
  253. end
  254. if indexTable[tempIndex] then
  255. -- 发了重复id
  256. return
  257. end
  258. if isSelectForBarTask(human, tempIndex) then
  259. -- 已经在其它悬赏中选择了
  260. return
  261. end
  262. indexTable[tempIndex] = true
  263. local heroConfig = HeroExcel.hero[heroGird.id]
  264. if heroGird.star >= needStar then
  265. nowStarCnt = nowStarCnt + 1
  266. end
  267. camp2Cnt[heroConfig.camp] =(camp2Cnt[heroConfig.camp] or 0) + 1
  268. end
  269. -- 判断条件
  270. if nowStarCnt < needStarCnt then
  271. return Broadcast.sendErr(human, Util.format(Lang.BAR_TASK_GET_ERR_STAR, needStar, needStarCnt))
  272. end
  273. local campLen = taskData.camp and #taskData.camp or 0
  274. for i = 1, campLen do
  275. local needCamp = taskData.camp[i]
  276. local nowCampCnt = camp2Cnt[needCamp] or 0
  277. if nowCampCnt < 1 then
  278. return Broadcast.sendErr(human, Lang.BAR_TASK_GET_ERR_CAMP)
  279. end
  280. camp2Cnt[needCamp] = nowCampCnt - 1
  281. end
  282. -- 扣除情报点
  283. human.db.bar.qingbao = human.db.bar.qingbao - needIsr
  284. -- 改db
  285. human.db.bar[taskID].isLock = true
  286. -- 因为:领取任务后,马上就去query查询,间隔太短
  287. -- 导致:时间间隔为0,此时剩下的时间和需要花费的时间相等,导致客户端无法判断
  288. -- 所以:领取时间要减去1秒,用来区分
  289. -- 链接至:query(human)查看
  290. human.db.bar[taskID].ts = os.time() -1
  291. human.db.bar[taskID].hero = { }
  292. for i = 1, heroIDList[0] do
  293. human.db.bar[taskID].hero[i] = heroIndexList[i]
  294. end
  295. -- 通知客户端
  296. sendBarTaskUpdate(human, taskID, BARTASK_OP_3)
  297. DailyTaskLogic.recordDailyTaskFinishCnt(human, DailyTaskLogic.DAILY_TASK_ID_9, 1)
  298. ChengjiuLogic.onCallback(human, ChengjiuDefine.CJ_TASK_TYPE_7, 1)
  299. MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_4,1)
  300. if taskData.star == 6 then
  301. ChengjiuLogic.onCallback(human, ChengjiuDefine.CJ_TASK_TYPE_18, 1)
  302. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE17, 1)
  303. end
  304. if taskData.star >= 5 then
  305. HeroLogLogic.finishTaskCB(human,HeroLogLogic.HERO_LOG_TYPE_4,1)
  306. end
  307. YunYingLogic.onCallBack(human, "onBarTaskgetDo",1)
  308. end
  309. function getQuickNeed(surTime)
  310. for k, config in ipairs(BarTaskExcel.accTime) do
  311. if surTime < config.maxTime then
  312. return config.zuanshiNeed
  313. end
  314. end
  315. return BarTaskExcel.accTime[#BarTaskExcel.accTime].zuanshiNeed
  316. end
  317. -- 加速完成任务
  318. function quickFinish(human, taskID)
  319. ObjHuman.updateDaily(human)
  320. initDB(human)
  321. local taskData = human.db.bar[taskID]
  322. if taskData == nil then
  323. return
  324. end
  325. -- 条件判断
  326. if taskData.isLock == nil or taskData.ts == nil then
  327. return
  328. end
  329. -- 消耗判断
  330. local barTaskConfig = BarTaskExcel.barTask[taskData.star]
  331. if not barTaskConfig then return end
  332. local surTime = barTaskConfig.useTime -(os.time() - taskData.ts)
  333. local needZuanshi = getQuickNeed(surTime)
  334. if needZuanshi > 0 then
  335. if not ObjHuman.checkRMB(human, needZuanshi) then
  336. return
  337. end
  338. -- 扣消耗
  339. ObjHuman.decZuanshi(human, - needZuanshi, "bar_quick_finish")
  340. end
  341. -- 改db
  342. human.db.bar[taskID].ts = 0
  343. finishTask(human, taskID)
  344. end
  345. function randomTak(human, taskID)
  346. local taskData = human.db.bar[taskID]
  347. if taskData.random then return end
  348. local barTaskConfig = BarTaskExcel.barTask[taskData.star]
  349. if not barTaskConfig then return end
  350. local totalWeight = 0
  351. for i = 1, #barTaskConfig.reward do
  352. totalWeight = totalWeight + barTaskConfig.reward[i][3]
  353. end
  354. local getList = {}
  355. local getRare = 0
  356. for i = 1 , 3 do
  357. local random = math.random(1, totalWeight - getRare)
  358. for k, v in pairs(barTaskConfig.reward) do
  359. if not getList[k] and random <= v[3] then
  360. getList[k] = i
  361. getRare = getRare + v[3]
  362. break
  363. elseif not getList[k] then
  364. -- 防止循环最后一个是 已经随机过的 导致 随机不出来
  365. random = random - v[3]
  366. end
  367. end
  368. end
  369. taskData.random = {}
  370. for k, v in pairs(getList) do
  371. local config = barTaskConfig.reward[k]
  372. taskData.random[v] = {}
  373. taskData.random[v].itemID = config[1]
  374. taskData.random[v].itemCnt = math.random(config[2][1], config[2][2] )
  375. end
  376. end
  377. -- 提交任务
  378. function finishTask(human, taskID)
  379. ObjHuman.updateDaily(human)
  380. initDB(human)
  381. local taskData = human.db.bar[taskID]
  382. if taskData == nil then
  383. return
  384. end
  385. -- 判断条件
  386. local star = taskData.star
  387. local needTime = BarTaskExcel.barTask[star].useTime
  388. local now = os.time()
  389. if now - taskData.ts < needTime then
  390. return
  391. end
  392. if not human.db.bar[taskID].random then
  393. randomTak(human, taskID)
  394. end
  395. -- 双倍参数
  396. --[[
  397. local itemID = taskData.itemID
  398. local itemCnt = taskData.itemCnt
  399. local double = RoleSystemLogic.isDouble(human, RoleSystemDefine.ROLE_SYS_ID_1104)
  400. local isDouble = false
  401. if star == 4 and double and human.db.bar.doubleCnt < DEFAULT_MAX_DOUBLE_CNT then
  402. itemCnt = itemCnt * 2
  403. human.db.bar.doubleCnt = human.db.bar.doubleCnt + 1
  404. isDouble = true
  405. end
  406. ]]
  407. -- 改db
  408. -- human.db.bar[taskID] = nil
  409. -- 给奖励
  410. -- BagLogic.addItem(human, itemID, itemCnt, "bar_reward")
  411. local double = RoleSystemLogic.isDouble(human, RoleSystemDefine.ROLE_SYS_ID_1104)
  412. local isDouble = false
  413. local beishu = 1
  414. if star == 4 and double and human.db.bar.doubleCnt < DEFAULT_MAX_DOUBLE_CNT then
  415. isDouble = true
  416. beishu = 2
  417. end
  418. -- 通知客户端
  419. local msgRet = Msg.gc.GC_BARTASK_FINISH_TASK
  420. msgRet.taskID = taskID
  421. msgRet.double = isDouble and 1 or 0
  422. for k, v in ipairs(human.db.bar[taskID].random) do
  423. Grid.makeItem(msgRet.item[k], v.itemID, v.itemCnt * beishu)
  424. end
  425. msgRet.item[0] = #human.db.bar[taskID].random
  426. Msg.send(msgRet, human.fd)
  427. -- MoshouLogic.onCallBack(human, MoshouLogic.MOSHOU_TASKTYPE_XUANSHANG, 1)
  428. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE15, 1)
  429. end
  430. function chooseReward(human, taskID, index)
  431. ObjHuman.updateDaily(human)
  432. initDB(human)
  433. local taskData = human.db.bar[taskID]
  434. if taskData == nil then
  435. return
  436. end
  437. if not human.db.bar[taskID].random or not human.db.bar[taskID].random[index] then
  438. return
  439. end
  440. local itemID = human.db.bar[taskID].random[index].itemID
  441. local itemCnt = human.db.bar[taskID].random[index].itemCnt
  442. local double = RoleSystemLogic.isDouble(human, RoleSystemDefine.ROLE_SYS_ID_1104)
  443. local isDouble = false
  444. if taskData.star == 4 and double and human.db.bar.doubleCnt < DEFAULT_MAX_DOUBLE_CNT then
  445. itemCnt = itemCnt * 2
  446. human.db.bar.doubleCnt = human.db.bar.doubleCnt + 1
  447. isDouble = true
  448. end
  449. -- 改db
  450. human.db.bar[taskID] = nil
  451. -- 给奖励
  452. BagLogic.addItem(human, itemID, itemCnt, "bar_reward")
  453. local msgRet = Msg.gc.GC_BARTASK_CHOOSE_REWARD
  454. msgRet.taskID = taskID
  455. msgRet.double = isDouble and 1 or 0
  456. Grid.makeItem(msgRet.item, itemID, itemCnt)
  457. Msg.send(msgRet, human.fd)
  458. end
  459. -- 一键领取
  460. function CG_BARTASK_FINISH_ALL(human)
  461. do return end
  462. if not human.db.bar then return end
  463. -- 双倍参数 -- 清空次数
  464. local double = RoleSystemLogic.isDouble(human, RoleSystemDefine.ROLE_SYS_ID_1104)
  465. local isDouble
  466. local msgRet = Msg.gc.GC_BARTASK_FINISH_ALL
  467. local list = nil
  468. local cnt = 0
  469. for taskID, taskData in pairs(human.db.bar) do
  470. if type(taskID) == "number" and taskData.ts then
  471. local star = taskData.star
  472. local needTime = BarTaskExcel.barTask[star].useTime
  473. local now = os.time()
  474. if now - taskData.ts >= needTime then
  475. local itemID = taskData.itemID
  476. local itemCnt = taskData.itemCnt
  477. -- 计算双倍
  478. if star == 4 and double and human.db.bar.doubleCnt < DEFAULT_MAX_DOUBLE_CNT then
  479. itemCnt = itemCnt * 2
  480. human.db.bar.doubleCnt = human.db.bar.doubleCnt + 1
  481. isDouble = true
  482. end
  483. list = list or { }
  484. list[itemID] =(list[itemID] or 0) + itemCnt
  485. human.db.bar[taskID] = nil
  486. cnt = cnt + 1
  487. BagLogic.addItem(human, itemID, itemCnt, "bar_reward")
  488. end
  489. end
  490. end
  491. if not list then return end
  492. msgRet.double = isDouble and 1 or 0
  493. msgRet.items[0] = 0
  494. for itemID, itemCnt in pairs(list) do
  495. msgRet.items[0] = msgRet.items[0] + 1
  496. if not msgRet.items[msgRet.items[0]] then
  497. msgRet.items[msgRet.items[0]] = Util.copyTable(msgRet.items[msgRet.items[0] -1])
  498. end
  499. Grid.makeItem(msgRet.items[msgRet.items[0]], itemID, itemCnt)
  500. end
  501. -- Msg.trace(msgRet)
  502. Msg.send(msgRet, human.fd)
  503. query(human)
  504. end
  505. function heroIndexByDelForPos(human, index)
  506. if not human.db.bar then return end
  507. for taskID, v in pairs(human.db.bar) do
  508. if type(taskID) == "number" then
  509. local heroLen = v.hero and #v.hero or 0
  510. for i = 1, heroLen do
  511. if v.hero[i] == index then
  512. table.remove(v.hero, i)
  513. break
  514. end
  515. end
  516. end
  517. end
  518. end
  519. -- 是否已上阵
  520. function isSelectForBarTask(human, index)
  521. if not human.db.bar then return end
  522. for taskID, v in pairs(human.db.bar) do
  523. if type(taskID) == "number" then
  524. local heroLen = v.hero and #v.hero or 0
  525. for i = 1, heroLen do
  526. if v.hero[i] == index then
  527. return true
  528. end
  529. end
  530. end
  531. end
  532. end
  533. -- 激活酒馆悬赏 特权
  534. function activateBarVip(human, type)
  535. initDB(human)
  536. if type == 1 then
  537. human.db.bar.vip = 1
  538. elseif type == 2 then
  539. human.db.bar.superVip = 1
  540. end
  541. end
  542. ------------------------------功能函数-------------------------------------------
  543. function getEmptyIndex(human)
  544. for index = 1, 1000 do
  545. if human.db.bar[index] == nil then
  546. return index
  547. end
  548. end
  549. end
  550. -- 初始化酒馆任务数据
  551. function initDB(human)
  552. if human.db.bar ~= nil then
  553. return
  554. end
  555. human.db.bar = { }
  556. human.db.bar.refresCnt = 0
  557. human.db.bar.qingbao = 0
  558. human.db.bar.doubleCnt = 0 -- 双倍次数
  559. local newAddCnt = getBaseTaskCnt(human)
  560. addRandomTask(human, newAddCnt, {4}, true)
  561. end
  562. -- 跨天刷新酒馆任务
  563. function refreshDailyTask(human)
  564. if human.db.bar == nil then
  565. return
  566. end
  567. human.db.bar.refresCnt = 0
  568. human.db.bar.doubleCnt = 0 -- 双倍次数
  569. end
  570. -- 获取现在的任务总数
  571. function getAllTaskCnt(human)
  572. if human.db.bar == nil then
  573. return 0
  574. end
  575. local allTaskCnt = 0
  576. for key, value in pairs(human.db.bar) do
  577. if value ~= nil then
  578. allTaskCnt = allTaskCnt + 1
  579. end
  580. end
  581. return allTaskCnt
  582. end
  583. -- 获取玩家基础任务数
  584. function getBaseTaskCnt(human)
  585. return DEFAULT_BASE_TASK_CNT
  586. end
  587. -- 随机 悬赏任务 starList[第几个] = 星级 itemList[第几个] = {itemID, itemCnt}
  588. function addRandomTask(human, cnt, starList, isInit)
  589. if cnt < 1 then return end
  590. -- 检查是否 已经达到上限
  591. local allTaskCnt = getAllTaskCnt(human)
  592. if allTaskCnt >= 200 then
  593. return
  594. end
  595. local star = nil
  596. local camp = nil
  597. local nameID = nil
  598. local actionID = nil
  599. local vipChange = 0
  600. if (human.db.bar.refresCnt == BARTASK_DAY_FREE + 1 and human.db.bar.vip) or(human.db.bar.refresCnt == BARTASK_DAY_FREE + 3 and human.db.bar.superVip) then
  601. vipChange = math.random(1, cnt)
  602. end
  603. for i = 1, cnt do
  604. star = getRandomStar(human)
  605. if vipChange > 0 and i == vipChange then
  606. if human.db.bar.refresCnt == BARTASK_DAY_FREE + 1 then
  607. star = 4
  608. else
  609. star = 5
  610. end
  611. end
  612. if starList and starList[i] then
  613. star = starList[i]
  614. end
  615. itemID, itemCnt = getRandomItem(human, star)
  616. nameID, actionID = getRandomName(human, star)
  617. camp = getRandomCond(star)
  618. if isInit then
  619. camp[1] = 1
  620. camp[2] = 2
  621. end
  622. local emptyIndex = getEmptyIndex(human)
  623. if emptyIndex then
  624. human.db.bar[emptyIndex] = { }
  625. human.db.bar[emptyIndex].star = star
  626. human.db.bar[emptyIndex].nameID = nameID
  627. human.db.bar[emptyIndex].actionID = actionID
  628. human.db.bar[emptyIndex].camp = camp
  629. human.db.bar[emptyIndex].isLock = nil
  630. human.db.bar[emptyIndex].ts = nil
  631. human.db.bar[emptyIndex].hero = nil
  632. end
  633. end
  634. end
  635. -- 添加情报值
  636. function addBarQingBao(human, cnt)
  637. initDB(human)
  638. if human.db.bar == nil then
  639. return
  640. end
  641. local max = RoleExcel.exp[human.db.lv].qingBaoMax
  642. local qingBaoAdd = TalismanLogic.getTalismanAdd(human, TalismanLogic.OTHER_EFFECT_TBL.XUANSHANG_QB_MAX) or 0
  643. max = max + qingBaoAdd
  644. if human.db.bar.qingbao + cnt < max then
  645. human.db.bar.qingbao = human.db.bar.qingbao + cnt
  646. else
  647. human.db.bar.qingbao = max
  648. end
  649. end
  650. function getRandomStar(human)
  651. local barTaskConfig = BarTaskExcel.barTask
  652. local totalWeight = 0
  653. for i = 1, #barTaskConfig do
  654. totalWeight = totalWeight + barTaskConfig[i].chance
  655. end
  656. local randNum = math.random(1, totalWeight)
  657. local star = 0
  658. for j = 1, #barTaskConfig do
  659. local tempWeight = barTaskConfig[j].chance
  660. if randNum <= tempWeight then
  661. star = j
  662. break
  663. end
  664. randNum = randNum - tempWeight
  665. end
  666. return star
  667. end
  668. function getRandomItem(human, star)
  669. local barTaskConfig = BarTaskExcel.barTask[star]
  670. if not barTaskConfig then return end
  671. local totalWeight = 0
  672. for i = 1, #barTaskConfig.reward do
  673. totalWeight = totalWeight + barTaskConfig.reward[i][3]
  674. end
  675. local randNum = math.random(1, totalWeight)
  676. local itemID = 0
  677. local itemCnt = 0
  678. for j = 1, #barTaskConfig.reward do
  679. local tempWeight = barTaskConfig.reward[j][3]
  680. if randNum <= tempWeight then
  681. itemID = barTaskConfig.reward[j][1]
  682. local minCnt = barTaskConfig.reward[j][2][1]
  683. local maxCnt = barTaskConfig.reward[j][2][2]
  684. itemCnt = math.random(minCnt, maxCnt)
  685. break
  686. end
  687. randNum = randNum - tempWeight
  688. end
  689. return itemID, itemCnt
  690. end
  691. function getRandomName(human, star)
  692. local barTaskConfig = BarTaskExcel.taskName[star]
  693. if not barTaskConfig then return end
  694. local randNum = math.random(1, #barTaskConfig.heroName)
  695. local nameID = barTaskConfig.heroName[randNum]
  696. local actionID = nil
  697. if star <= 3 then
  698. actionID = math.random(1, #barTaskConfig.actionName)
  699. else
  700. actionID = math.random(1, #barTaskConfig.taskName)
  701. end
  702. return nameID, actionID
  703. end
  704. function getRandomCond(star)
  705. local barTaskConfig = BarTaskExcel.barTask[star]
  706. if not barTaskConfig then return end
  707. local heroCnt = barTaskConfig.heroCnt
  708. local camp = { }
  709. local c = 0
  710. local j = 0
  711. for i = 1, 5 do camp[i] = i end
  712. for i = 1, heroCnt do
  713. c = c + 1
  714. local r = math.random(c, #camp)
  715. camp[c], camp[r] = camp[r], camp[c]
  716. end
  717. for i = #camp, c + 1, -1 do
  718. camp[i] = nil
  719. end
  720. return camp
  721. end
  722. -- 下发酒馆任务更新
  723. function sendBarTaskUpdate(human, taskID, op)
  724. local msgRet = Msg.gc.GC_BARTASK_UPDATE
  725. msgRet.op = op
  726. setBarTaskData(msgRet.task, taskID, human, human.db.bar[taskID])
  727. msgRet.nowQingBao = human.db.bar and human.db.bar.qingbao or 0
  728. Msg.send(msgRet, human.fd)
  729. end
  730. -- 是否有红点
  731. function isDot(human)
  732. if human.db.bar == nil then
  733. return false
  734. end
  735. local now = os.time()
  736. for k, v in pairs(human.db.bar) do
  737. if type(k) == "number" then
  738. if v.ts == nil then
  739. return false
  740. end
  741. if v.isLock and v.ts then
  742. local needTime = BarTaskExcel.barTask[v.star].useTime
  743. if now - v.ts > needTime then
  744. return true
  745. end
  746. end
  747. end
  748. end
  749. return false
  750. end