ChengjiuLogic.lua 15 KB

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