ChengjiuLogic.lua 16 KB

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