ChengjiuLogic.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. local Msg = require("core.Msg")
  2. local BagLogic = require("bag.BagLogic")
  3. local Grid = require("bag.Grid")
  4. local ChengjiuExcel = require("excel.chengjiu").chengjiu
  5. local GroupExcel = require("excel.chengjiu").group
  6. local HeroLogic = require("hero.HeroLogic")
  7. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  8. local RoleDBLogic = require("role.RoleDBLogic")
  9. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  10. local ObjHuman = require("core.ObjHuman")
  11. local CombatObj = require("combat.CombatObj")
  12. local CombatDefine = require("combat.CombatDefine")
  13. local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
  14. local CombatPosLogic = require("combat.CombatPosLogic")
  15. local RoleAttr = require("role.RoleAttr")
  16. local GuideLogic = require("guide.GuideLogic")
  17. local DB = require("common.DB")
  18. local Util = require("common.Util")
  19. local LuaMongo = _G.lua_mongo
  20. local RoleDefine = require("role.RoleDefine")
  21. local GiftLogic
  22. --[[
  23. human.db.chengjiu = {}
  24. human.db.chengjiu.task = {}
  25. human.db.chengjiu.group = {}
  26. human.db.chengjiu.task[taskID] = state -- 单个任务对应完成状态
  27. human.db.chengjiu.type[taskType] = cnt -- 任务类型对应完成次数
  28. human.db.chengjiu.group[groupID] = state -- 任务组对应完成状态
  29. human.db.chengjiu.privilege[privilege] = value -- 玩家已获取奖励累积
  30. human.db.chengjiu.attr[key] = value -- 玩家已获取属性奖励累计
  31. ]]
  32. local CJ_TASK_STATE_0 = 0 -- 任务状态 未达成
  33. local CJ_TASK_STATE_1 = 1 -- 任务状态 可解封
  34. local CJ_TASK_STATE_2 = 2 -- 任务状态 已解封
  35. local CJ_GROUP_STATE_0 = 0 -- 任务组状态 未开放
  36. local CJ_GROUP_STATE_1 = 1 -- 任务组状态 已开放
  37. local CJ_GROUP_STATE_2 = 2 -- 任务组状态 已达成
  38. local CJ_PARAM_TYPE = {}
  39. function initAfterHot()
  40. for k,v in pairs(ChengjiuExcel) do
  41. CJ_PARAM_TYPE[v.type] = v.paramType
  42. end
  43. end
  44. local function makePrivilegeNet(data,net,type)
  45. if type then
  46. local lenth = #data
  47. for i = 1,lenth do
  48. net[0] = net[0] + 1
  49. net[net[0]].key = data[i][1]
  50. net[net[0]].value = data[i][2]
  51. end
  52. else
  53. if data.privilege then
  54. for k,v in pairs(data.privilege) do
  55. net[0] = net[0] + 1
  56. net[net[0]].key = k
  57. net[net[0]].value = v
  58. end
  59. end
  60. if data.attrs then
  61. for k,v in pairs(data.attrs) do
  62. net[0] = net[0] + 1
  63. net[net[0]].key = k
  64. net[net[0]].value = v
  65. end
  66. end
  67. end
  68. end
  69. local function makeChengjiuNet(human,config,net,id)
  70. net.groupID = config.group
  71. net.taskID = id
  72. net.desc = config.desc
  73. net.curCnt = 0
  74. net.state = CJ_TASK_STATE_0
  75. if human.db.chengjiu.type and human.db.chengjiu.type[config.type] then
  76. net.curCnt = human.db.chengjiu.type[config.type]
  77. end
  78. if human.db.chengjiu.task and human.db.chengjiu.task[id] then
  79. net.state = human.db.chengjiu.task[id]
  80. end
  81. net.maxCnt = config.param
  82. net.goDot = 0
  83. net.privilege[0] = 0
  84. makePrivilegeNet(config.privilege,net.privilege,1)
  85. makePrivilegeNet(config.attr,net.privilege,1)
  86. net.panelID = config.panelID
  87. local len = #config.items
  88. for i = 1,len do
  89. Grid.makeItem(net.items[i],config.items[i][1],config.items[i][2])
  90. end
  91. net.items[0] = len
  92. local groupConfig = GroupExcel[config.group]
  93. if config.group <= 4 and human.chengJiuGo and human.chengJiuGo[config.group] and human.chengJiuGo[config.group][id] then
  94. elseif config.group <= 4 and net.state == CJ_TASK_STATE_0 and human.db.lv >= groupConfig.lv then
  95. if net.state == CJ_TASK_STATE_0 then
  96. net.goDot = 0
  97. else
  98. net.goDot = 1
  99. end
  100. end
  101. end
  102. local function makeChengjiuList(human,config,net,id)
  103. net.groupID = id
  104. net.lv = config.lv
  105. net.state = CJ_GROUP_STATE_1
  106. if human.db.chengjiu.group and human.db.chengjiu.group[id] then
  107. net.state = human.db.chengjiu.group[id]
  108. end
  109. if config.lv > human.db.lv then
  110. net.state = CJ_GROUP_STATE_0
  111. end
  112. net.dot = 0
  113. for _,taskId in pairs(config.member) do
  114. if human.db.chengjiu.task and human.db.chengjiu.task[taskId] == 1 then
  115. net.dot = 1
  116. break
  117. end
  118. end
  119. local state = CJ_TASK_STATE_0
  120. if id <= 4 and net.dot == 0 and net.state == CJ_GROUP_STATE_1 then
  121. for _,taskId in pairs(config.member) do
  122. if human.chengJiuGo and human.chengJiuGo[id] and human.chengJiuGo[id][taskId] then
  123. else
  124. state = CJ_TASK_STATE_0
  125. if human.db.chengjiu and human.db.chengjiu.task and human.db.chengjiu.task[taskId] then
  126. state = human.db.chengjiu.task[taskId]
  127. end
  128. if state == CJ_TASK_STATE_0 then
  129. --宝具任务未达成不在红点提示
  130. net.dot = 0
  131. break
  132. end
  133. end
  134. end
  135. end
  136. end
  137. function chenJiuGo(human, groupID, taskID)
  138. human.chengJiuGo = human.chengJiuGo or {}
  139. human.chengJiuGo[groupID] = human.chengJiuGo[groupID] or {}
  140. human.chengJiuGo[groupID][taskID] = 1
  141. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2001)
  142. end
  143. function query(human,groupID,type)
  144. if groupID == 0 then
  145. groupID = 1
  146. for k,v in pairs(GroupExcel) do
  147. if human.db.chengjiu.group and human.db.chengjiu.group[k] == nil then
  148. groupID = k
  149. break
  150. end
  151. end
  152. end
  153. local msgRet = Msg.gc.GC_CHENGJIU_QUERY
  154. msgRet.groupID = groupID
  155. msgRet.type = type
  156. local taskLen = 0
  157. for k,v in pairs(ChengjiuExcel) do
  158. if groupID == v.group then
  159. taskLen = taskLen + 1
  160. makeChengjiuNet(human,v,msgRet.task[taskLen],k)
  161. end
  162. end
  163. msgRet.task[0] = taskLen
  164. local listLen = 0
  165. for k,v in pairs(GroupExcel) do
  166. listLen = listLen + 1
  167. makeChengjiuList(human,v,msgRet.list[listLen],k)
  168. end
  169. msgRet.list[0] = listLen
  170. msgRet.tips[0] = 0
  171. makePrivilegeNet(human.db.chengjiu,msgRet.tips)
  172. Msg.send(msgRet,human.fd)
  173. end
  174. function isFinish(human,taskID)
  175. local config = ChengjiuExcel[taskID]
  176. if not config then return end
  177. local groupConfig = GroupExcel[config.group]
  178. if not groupConfig then return end
  179. -- 任务校验错误
  180. if human.db.chengjiu.task == nil or
  181. human.db.chengjiu.task[taskID] == nil or
  182. config == nil or
  183. groupConfig.lv > human.db.lv then
  184. return
  185. end
  186. -- 当前任务类型达成次数不足
  187. if human.db.chengjiu.type == nil or
  188. human.db.chengjiu.type[config.type] == nil then
  189. return
  190. end
  191. -- 当前领取任务状态不为可领取
  192. if human.db.chengjiu.task[taskID] ~= CJ_TASK_STATE_1 then
  193. return
  194. end
  195. return true
  196. end
  197. function getReward(human,taskID)
  198. local config = ChengjiuExcel[taskID]
  199. if not config then return end
  200. local groupConfig = GroupExcel[config.group]
  201. if not groupConfig then return end
  202. -- 任务校验错误
  203. if human.db.chengjiu.task == nil or
  204. human.db.chengjiu.task[taskID] == nil or
  205. config == nil or
  206. groupConfig.lv > human.db.lv then
  207. return
  208. end
  209. -- 当前任务类型达成次数不足
  210. if human.db.chengjiu.type == nil or
  211. human.db.chengjiu.type[config.type] == nil then
  212. return
  213. end
  214. -- 当前领取任务状态不为可领取
  215. if human.db.chengjiu.task[taskID] ~= CJ_TASK_STATE_1 then
  216. return
  217. end
  218. human.db.chengjiu.task[taskID] = CJ_TASK_STATE_2
  219. local isOver = 1
  220. for k,v in pairs(ChengjiuExcel) do
  221. if v.group == config.group then
  222. -- 同组任务没有完成
  223. if human.db.chengjiu.task[k] == nil or
  224. human.db.chengjiu.task[k] ~= CJ_TASK_STATE_2 then
  225. isOver = 0
  226. break
  227. end
  228. end
  229. end
  230. if isOver == 1 then
  231. human.db.chengjiu.group = human.db.chengjiu.group or {}
  232. human.db.chengjiu.group[config.group] = CJ_GROUP_STATE_2
  233. end
  234. -- 给道具奖励
  235. for i = 1,#config.items do
  236. BagLogic.addItem(human, config.items[i][1],config.items[i][2], "chengjiu")
  237. end
  238. -- 给特权奖励
  239. for _,v in pairs(config.privilege) do
  240. human.db.chengjiu.privilege = human.db.chengjiu.privilege or {}
  241. human.db.chengjiu.privilege[v[1]] = human.db.chengjiu.privilege[v[1]] or 0
  242. human.db.chengjiu.privilege[v[1]] = human.db.chengjiu.privilege[v[1]] + v[2]
  243. addPrivilegeDo(human,v[1])
  244. end
  245. -- 给属性奖励
  246. for k,v in pairs(config.attr) do
  247. human.db.chengjiu.attrs = human.db.chengjiu.attrs or {}
  248. human.db.chengjiu.attrs[v[1]] = human.db.chengjiu.attrs[v[1]] or 0
  249. human.db.chengjiu.attrs[v[1]] = human.db.chengjiu.attrs[v[1]] + v[2]
  250. RoleAttr.cleanHeroAttrCache(human)
  251. end
  252. local msgRet = Msg.gc.GC_CHENGJIU_GET
  253. msgRet.taskID = taskID
  254. Msg.send(msgRet,human.fd)
  255. --query(human,config.group)
  256. RoleAttr.doCalc(human)
  257. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  258. GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_JIEFENG_BAOJU)
  259. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2001)
  260. local giftType
  261. GiftLogic = GiftLogic or require("topup.GiftLogic")
  262. if taskID == 404 then
  263. giftType = GiftLogic.GIFT_TALISMAN_OPEN
  264. elseif taskID == 405 then
  265. giftType = GiftLogic.GIFT_WINNERRELIC_OPEN
  266. elseif taskID == 406 then
  267. giftType = GiftLogic.GIFT_ELF_OPEN
  268. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031)
  269. end
  270. if giftType then
  271. GiftLogic.trigger(human, giftType, nil, GiftLogic.GIFT_SEC_TYPE2)
  272. end
  273. -- if taskID == 406 then
  274. -- RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031)
  275. -- end
  276. end
  277. -- 回调
  278. function onCallback(human,taskType,cnt)
  279. if CJ_PARAM_TYPE[taskType] == 1 then
  280. human.db.chengjiu = human.db.chengjiu or {}
  281. human.db.chengjiu.type = human.db.chengjiu.type or {}
  282. human.db.chengjiu.type[taskType] = human.db.chengjiu.type[taskType] or 0
  283. human.db.chengjiu.type[taskType] = human.db.chengjiu.type[taskType] + cnt
  284. else
  285. human.db.chengjiu = human.db.chengjiu or {}
  286. human.db.chengjiu.type = human.db.chengjiu.type or {}
  287. human.db.chengjiu.type[taskType] = cnt
  288. end
  289. local touchCnt = human.db.chengjiu.type[taskType]
  290. for k,v in pairs(ChengjiuExcel) do
  291. local config = GroupExcel[v.group]
  292. if v.type == taskType and
  293. human.db.lv >= config.lv and
  294. touchCnt >= v.param and
  295. (human.db.chengjiu.task == nil or
  296. human.db.chengjiu.task[k] == CJ_TASK_STATE_0 or
  297. human.db.chengjiu.task[k] == nil) then
  298. human.db.chengjiu.task = human.db.chengjiu.task or {}
  299. human.db.chengjiu.task[k] = CJ_TASK_STATE_1
  300. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2001, true)
  301. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2002, true)
  302. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2006, true)
  303. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2021, true)
  304. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031, true)
  305. local msgRet = Msg.gc.GC_CHENGJIU_SET
  306. msgRet.taskID = k
  307. msgRet.groupID = v.group
  308. msgRet.desc = v.desc
  309. Msg.send(msgRet,human.fd)
  310. end
  311. end
  312. end
  313. -- 检查任务
  314. function checkTaskState(human)
  315. for k,v in pairs(ChengjiuExcel) do
  316. local config = GroupExcel[v.group]
  317. local touchCnt = 0
  318. if human.db.chengjiu.type and human.db.chengjiu.type[v.type] then
  319. touchCnt = human.db.chengjiu.type[v.type]
  320. end
  321. if human.db.lv >= config.lv and
  322. touchCnt >= v.param and
  323. (human.db.chengjiu.task == nil or
  324. human.db.chengjiu.task[k] ~= CJ_TASK_STATE_2) then
  325. human.db.chengjiu.task = human.db.chengjiu.task or {}
  326. human.db.chengjiu.task[k] = CJ_TASK_STATE_1
  327. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2001)
  328. -- 同时刷新秘宝/圣遗物/精灵入口的红点(强制发送,确保可解封时客户端能看到提示)
  329. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2002,true)
  330. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2006, true)
  331. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2021, true)
  332. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031, true)
  333. local msgRet = Msg.gc.GC_DAILYSHARE_SET
  334. msgRet.type = 2
  335. msgRet.desc = v.desc
  336. Msg.send(msgRet,human.fd)
  337. end
  338. end
  339. end
  340. -- 回调
  341. function onLvUp(human)
  342. checkTaskState(human)
  343. end
  344. function isDot(human)
  345. if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_2001) then
  346. return
  347. end
  348. for i = 1, 4 do
  349. local needLv = GroupExcel[i].lv
  350. if needLv <= human.db.lv then
  351. for k, id in ipairs( GroupExcel[i].member) do
  352. if human.chengJiuGo and human.chengJiuGo[i] and human.chengJiuGo[i][id] then
  353. else
  354. if (human.db.chengjiu.task and human.db.chengjiu.task[id] and human.db.chengjiu.task[id] ~= CJ_TASK_STATE_0) or
  355. (human.db.chengjiu.task and human.db.chengjiu.task[id] and human.db.chengjiu.task[id] == CJ_TASK_STATE_0) then
  356. else
  357. if human.db.chengjiu.task and human.db.chengjiu.task[id] and (human.db.chengjiu.task[id] == CJ_TASK_STATE_2 or
  358. human.db.chengjiu.task[id] == CJ_TASK_STATE_1 ) then
  359. return true
  360. end
  361. end
  362. end
  363. end
  364. end
  365. end
  366. if human.db.chengjiu.task == nil then
  367. return
  368. end
  369. for k,v in pairs(human.db.chengjiu.task) do
  370. if ChengjiuExcel[k] then
  371. local groupID = ChengjiuExcel[k].group
  372. local needLv = GroupExcel[groupID].lv
  373. if v == CJ_TASK_STATE_1 and human.db.lv >= needLv then
  374. return true
  375. end
  376. end
  377. end
  378. return
  379. end
  380. function onCallbackByUuid(uuid,taskType,cnt)
  381. local target = ObjHuman.onlineUuid[uuid]
  382. if target and target.fd then
  383. onCallback(target,taskType,cnt)
  384. else
  385. local fakeDB = RoleDBLogic.getDb(uuid)
  386. if fakeDB then
  387. local fakeHuman = {}
  388. fakeHuman.db = fakeDB
  389. if onCallback(fakeHuman,taskType,cnt) then
  390. ObjHuman.save(fakeHuman)
  391. end
  392. end
  393. end
  394. end
  395. -- 计算特权
  396. function addPrivilegeDo(human,privilege)
  397. -- 解锁援军
  398. if privilege == ChengjiuDefine.PRIVILEGE_TYPE_6 then
  399. CombatPosLogic.activeBackup(human)
  400. -- 解锁守护之龙
  401. elseif privilege == ChengjiuDefine.PRIVILEGE_TYPE_8 then
  402. RoleAttr.cleanHeroAttrCache(human)
  403. -- 增加栏位
  404. elseif privilege == ChengjiuDefine.PRIVILEGE_TYPE_1 then
  405. HeroLogic.sendHeroBagCap(human)
  406. end
  407. end
  408. -- 计算属性
  409. function doCalcHero(human, attrs)
  410. if human and human.db and human.db.chengjiu and human.db.chengjiu.attrs then
  411. for k, v in pairs(human.db.chengjiu.attrs) do
  412. if v > 0 then
  413. RoleAttr.updateValue(k, v, attrs)
  414. end
  415. end
  416. end
  417. end
  418. -- 检查特权是否激活
  419. function checkPrivilege(human,priType)
  420. if not human or not human.db or not human.db.chengjiu then return end
  421. if human.db.chengjiu.privilege == nil or human.db.chengjiu.privilege[priType] == nil or human.db.chengjiu.privilege[priType] == 0 then
  422. return
  423. end
  424. return human.db.chengjiu.privilege[priType]
  425. end
  426. --
  427. function initAfterHotTemp()
  428. local taskID = 402
  429. local config = ChengjiuExcel[taskID]
  430. LuaMongo.find(DB.db_char)
  431. local DBUpdate = {}
  432. while true do
  433. local data = {}
  434. if not LuaMongo.next(DB.db_char, data) then
  435. break
  436. end
  437. DBUpdate._id = data._id
  438. if data.chengjiu and data.chengjiu.task and
  439. data.chengjiu.task[taskID] and
  440. data.chengjiu.task[taskID] == CJ_TASK_STATE_2 and
  441. config then
  442. -- 给特权奖励
  443. for _,v in pairs(config.privilege) do
  444. data.chengjiu.privilege = data.chengjiu.privilege or {}
  445. data.chengjiu.privilege[v[1]] = v[2]
  446. local human = ObjHuman.onlineUuid[data._id]
  447. if human then
  448. human.db.chengjiu.privilege[v[1]] = v[2]
  449. else
  450. data._id = nil
  451. local updateDb = {}
  452. updateDb["$set"] = data
  453. LuaMongo.update(DB.db_char, DBUpdate, updateDb)
  454. end
  455. end
  456. end
  457. end
  458. end
  459. --GM, 重置所有数据
  460. function GM_ClearAllData(human)
  461. human.db.chengjiu = {}
  462. end
  463. function GetTaskState(human, taskId)
  464. if not human.db.chengjiu or not human.db.chengjiu.task then
  465. return CJ_TASK_STATE_0
  466. end
  467. return human.db.chengjiu.task[taskId] or CJ_TASK_STATE_0
  468. end