BarTaskLogic.lua 27 KB

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