Commit 53e8037ecfe65008cdf1c093d842bb49caf23542

Authored by zhouhaihai
1 parent 0b9d9fba

任务

src/ProtocolCode.lua
... ... @@ -29,6 +29,9 @@ actionCodes = {
29 29 Role_storyBookRewardRpc = 114,
30 30 Role_unLockStoryBookRpc = 115,
31 31 Role_openTimeBoxRpc = 116,
  32 + Role_taskRpc = 117,
  33 + Role_taskActiveRpc = 118,
  34 + Role_achiveRpc = 119,
32 35  
33 36 Adv_startAdvRpc = 151,
34 37 Adv_startHangRpc = 152,
... ... @@ -73,8 +76,8 @@ actionCodes = {
73 76 Hang_roleFormatRpc = 255,
74 77 Hang_getRewardRpc = 256,
75 78 Hang_quickRpc = 257,
76   - Hang_getRewardItemRpc = 258,
77   - Hang_getRewardCoinRpc = 259,
  79 + -- Hang_getRewardItemRpc = 258,
  80 + -- Hang_getRewardCoinRpc = 259,
78 81  
79 82 Diner_updateProperty = 300,
80 83 Diner_addSellRpc = 301,
... ...
src/actions/AdvAction.lua
... ... @@ -112,7 +112,7 @@ function _M.startAdvRpc( agent, data )
112 112 end
113 113  
114 114 role:getAdvData():initByChapter(chapterId, layer)
115   -
  115 + role:checkTaskEnter("AdvStart", {id = chapterId})
116 116 SendPacket(actionCodes.Adv_startAdvRpc, '')
117 117 return true
118 118 end
... ... @@ -161,7 +161,7 @@ function _M.startHangRpc(agent, data)
161 161 role:changeUpdates({{type = "advHang", field = chapterId, value = info}})
162 162  
163 163 role.dailyData:updateProperty({field = "advC", delta = 1})
164   -
  164 + role:checkTaskEnter("AdvStart", {id = chapterId})
165 165 SendPacket(actionCodes.Adv_startHangRpc, '')
166 166 return true
167 167 end
... ... @@ -247,6 +247,7 @@ function _M.finishTaskRpc(agent, data)
247 247 end
248 248 adv:updateTask()
249 249 if not status then return end
  250 + role:checkTaskEnter("AdvOverTask", {id = taskId})
250 251 SendPacket(actionCodes.Adv_finishTaskRpc, MsgPack.pack({reward = reward}))
251 252 return true
252 253 end
... ...
src/actions/CarAction.lua
... ... @@ -38,6 +38,7 @@ function _M.makePotionRpc( agent, data )
38 38 role:costItems(cost)
39 39 potionBag[potionId] = own + count
40 40 role:updateProperty({field = "potionBag", value = potionBag})
  41 + role:checkTaskEnter("PotionMake", {count = count, id = potionId})
41 42 SendPacket(actionCodes.Car_makePotionRpc, MsgPack.pack({potionBag = potionBag}))
42 43 return true
43 44 end
... ... @@ -86,7 +87,7 @@ function _M.equipUpRpc( agent, data )
86 87 role:costItems(cost)
87 88 role:addEquip(typ, lv, -costCount)
88 89 role:addEquip(typ, nextLv ,count)
89   -
  90 + role:checkTaskEnter("EquipUp", {})
90 91 SendPacket(actionCodes.Car_equipUpRpc, '')
91 92 return true
92 93 end
... ... @@ -118,6 +119,7 @@ function _M.runeUpRpc( agent, data )
118 119  
119 120 role:costItems(cost)
120 121 ownRune:updateProperty({field = "level",value = level+1})
  122 + role:checkTaskEnter("RuneUp")
121 123 SendPacket(actionCodes.Car_runeUpRpc, '')
122 124 return true
123 125 end
... ...
src/actions/DinerAction.lua
... ... @@ -155,6 +155,9 @@ function _M.getSellRewardRpc( agent, data )
155 155 role.dinerData:updateProperty({field = "sells", value = json.encode(sells)})
156 156 for k, v in pairs(reward:toNumMap()) do
157 157 role:addItem({itemId = k,count = v})
  158 + if k == ItemId.Gold then
  159 + role:checkTaskEnter("FoodSellGold", {count = v})
  160 + end
158 161 end
159 162  
160 163 role.dinerData:popularAdd(popular)
... ... @@ -162,7 +165,6 @@ function _M.getSellRewardRpc( agent, data )
162 165 if dirty then
163 166 role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order"))
164 167 end
165   -
166 168 SendPacket(actionCodes.Diner_getSellRewardRpc, MsgPack.pack({reward = reward}))
167 169 return true
168 170 end
... ... @@ -226,6 +228,7 @@ function _M.expediteSellRpc( agent, data )
226 228 if dirty then
227 229 role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order"))
228 230 end
  231 + role:checkTaskEnter("FoodSellQuick")
229 232 SendPacket(actionCodes.Diner_expediteSellRpc, MsgPack.pack({reward = reward,popular = popular}))
230 233 return true
231 234 end
... ... @@ -263,7 +266,7 @@ function _M.levelUpRpc( agent, data )
263 266  
264 267 role:costItems(cost)
265 268 role.dinerData:updateProperty({field = "buildL", value = buildL:setv(index, curLevel + 1)})
266   -
  269 + role:checkTaskEnter("DinerLevelUp", {type = index, level = curLevel + 1})
267 270 SendPacket(actionCodes.Diner_levelUpRpc, '')
268 271 return true
269 272 end
... ... @@ -337,6 +340,8 @@ function _M.talentUpRpc( agent, data )
337 340 role:award(treePoint)
338 341 end
339 342  
  343 + role:checkTaskEnter("DinerTalentUp", {type = talentData.effect:toArray(true,"=")[1]})
  344 +
340 345 SendPacket(actionCodes.Diner_talentUpRpc, '')
341 346 return true
342 347 end
... ... @@ -431,6 +436,7 @@ function _M.updateTaskRpc( agent, data )
431 436 end
432 437 orders[index].status = 1
433 438 orders[index].lock = 1
  439 + role:checkTaskEnter("GetOderTask", {rarity = taskSet.rarity})
434 440 elseif cmd == 1 then
435 441 if order.status ~= 1 then
436 442 return 31
... ... @@ -448,6 +454,7 @@ function _M.updateTaskRpc( agent, data )
448 454 role:addItem({itemId = typ, count = count})
449 455 end
450 456 table.remove(orders,index)
  457 + role:checkTaskEnter("OverOderTask", {rarity = taskSet.rarity})
451 458 else
452 459 return 33
453 460 end
... ... @@ -593,7 +600,7 @@ function _M.getGreenhouseRpc( agent, data )
593 600 end
594 601 role.dinerData:updateProperty({field = "gfood", value = gfood})
595 602 local reward = role:award(reward)
596   -
  603 + role:checkTaskEnter("FoodMGet")
597 604 SendPacket(actionCodes.Diner_getGreenhouseRpc, MsgPack.pack({reward = reward}))
598 605 return true
599 606 end
... ...
src/actions/GmAction.lua
... ... @@ -22,7 +22,6 @@ end
22 22 local helpDes = {{"描述", "指令", "参数1", "参数2" ,"参数3"}}
23 23  
24 24 table.insert(helpDes, {"获得角色" , "hero", "角色类型"})
25   -
26 25 function _M.hero(role, pms)
27 26 local heroType = tonum(pms.pm1)
28 27 if not role:addHero({type = heroType}) then
... ...
src/actions/HangAction.lua
... ... @@ -139,6 +139,7 @@ function _M.startBattleRpc(agent, data)
139 139 hangInfo.key = key
140 140 local nowTime = skynet.timex()
141 141 role:updateProperty({field = "hangInfo", value = hangInfo})
  142 + role:checkTaskEnter("HangBattle", {id = carbonId})
142 143 SendPacket(actionCodes.Hang_startBattleRpc, MsgPack.pack({key = key}))
143 144 return true
144 145 end
... ... @@ -229,71 +230,73 @@ function _M.getRewardRpc(agent , data)
229 230 role:updateProperty({field = "hangBag", value = items})
230 231 role:updateProperty({field = "hangInfo", value = hangInfo})
231 232 role:checkTaskEnter("HangGet")
232   -
233   - SendPacket(actionCodes.Hang_getRewardRpc, MsgPack.pack({
234   - reward = reward
235   - }))
236   - return true
237   -end
238   -
239   -function _M.getRewardItemRpc(agent , data)
240   - local role = agent.role
241   - checkReward(role)
242   - local items = role:getProperty("hangBag")
243   - if not next(items) then return end
244   -
245   - local notNeed = {[ItemId.Gold] = 1, [ItemId.Exp] = 1, [ItemId.PlayerExp] = 1}
246   - local reward = {}
247   - for itemId , count in pairs(items) do
248   - if not notNeed[itemId] then
249   - reward[itemId] = count
250   - items[itemId] = nil
251   - end
  233 + if reward[ItemId.Gold] then
  234 + role:checkTaskEnter("HangGetGold", {count = reward[ItemId.Gold]})
252 235 end
253   - if not next(reward) then return end
254   - local reward = role:award(reward)
255   -
256   - local hangInfo = role:getProperty("hangInfo")
257   - local nowTime = skynet.timex()
258   - hangInfo.endItemTime = nowTime + globalCsv.idle_producetime_max
259   - hangInfo.itemTime = nowTime
260   - role:updateProperty({field = "hangBag", value = items})
261   - role:updateProperty({field = "hangInfo", value = hangInfo})
262   -
263   - SendPacket(actionCodes.Hang_getRewardItemRpc, MsgPack.pack({
  236 + SendPacket(actionCodes.Hang_getRewardRpc, MsgPack.pack({
264 237 reward = reward
265 238 }))
266 239 return true
267 240 end
268 241  
269   -function _M.getRewardCoinRpc(agent , data)
270   - local role = agent.role
271   - checkReward(role)
272   - local items = role:getProperty("hangBag")
273   - if not next(items) then return end
274   -
275   - local need = {[ItemId.Gold] = 1, [ItemId.Exp] = 1, [ItemId.PlayerExp] = 1}
276   - local reward = {}
277   - for itemId , count in pairs(items) do
278   - if need[itemId] then
279   - reward[itemId] = count
280   - items[itemId] = nil
281   - end
282   - end
283   - local reward = role:award(reward)
  242 +-- function _M.getRewardItemRpc(agent , data)
  243 +-- local role = agent.role
  244 +-- checkReward(role)
  245 +-- local items = role:getProperty("hangBag")
  246 +-- if not next(items) then return end
  247 +
  248 +-- local notNeed = {[ItemId.Gold] = 1, [ItemId.Exp] = 1, [ItemId.PlayerExp] = 1}
  249 +-- local reward = {}
  250 +-- for itemId , count in pairs(items) do
  251 +-- if not notNeed[itemId] then
  252 +-- reward[itemId] = count
  253 +-- items[itemId] = nil
  254 +-- end
  255 +-- end
  256 +-- if not next(reward) then return end
  257 +-- local reward = role:award(reward)
  258 +
  259 +-- local hangInfo = role:getProperty("hangInfo")
  260 +-- local nowTime = skynet.timex()
  261 +-- hangInfo.endItemTime = nowTime + globalCsv.idle_producetime_max
  262 +-- hangInfo.itemTime = nowTime
  263 +-- role:updateProperty({field = "hangBag", value = items})
  264 +-- role:updateProperty({field = "hangInfo", value = hangInfo})
  265 +
  266 +-- SendPacket(actionCodes.Hang_getRewardItemRpc, MsgPack.pack({
  267 +-- reward = reward
  268 +-- }))
  269 +-- return true
  270 +-- end
  271 +
  272 +-- function _M.getRewardCoinRpc(agent , data)
  273 +-- local role = agent.role
  274 +-- checkReward(role)
  275 +-- local items = role:getProperty("hangBag")
  276 +-- if not next(items) then return end
  277 +
  278 +-- local need = {[ItemId.Gold] = 1, [ItemId.Exp] = 1, [ItemId.PlayerExp] = 1}
  279 +-- local reward = {}
  280 +-- for itemId , count in pairs(items) do
  281 +-- if need[itemId] then
  282 +-- reward[itemId] = count
  283 +-- items[itemId] = nil
  284 +-- end
  285 +-- end
  286 +-- local reward = role:award(reward)
284 287  
285   - local hangInfo = role:getProperty("hangInfo")
286   - local nowTime = skynet.timex()
287   - hangInfo.endCoinTime = nowTime + globalCsv.idle_producetime_max
288   - hangInfo.coinTime = nowTime
289   - role:updateProperty({field = "hangBag", value = items})
290   - role:updateProperty({field = "hangInfo", value = hangInfo})
291   -
292   - SendPacket(actionCodes.Hang_getRewardCoinRpc, MsgPack.pack({
293   - reward = reward
294   - }))
295   - return true
296   -end
  288 +-- local hangInfo = role:getProperty("hangInfo")
  289 +-- local nowTime = skynet.timex()
  290 +-- hangInfo.endCoinTime = nowTime + globalCsv.idle_producetime_max
  291 +-- hangInfo.coinTime = nowTime
  292 +-- role:updateProperty({field = "hangBag", value = items})
  293 +-- role:updateProperty({field = "hangInfo", value = hangInfo})
  294 +
  295 +-- SendPacket(actionCodes.Hang_getRewardCoinRpc, MsgPack.pack({
  296 +-- reward = reward
  297 +-- }))
  298 +-- return true
  299 +-- end
297 300  
298 301 function _M.quickRpc(agent , data)
299 302 local role = agent.role
... ... @@ -330,7 +333,7 @@ function _M.quickRpc(agent , data)
330 333 end
331 334  
332 335 reward = role:award(reward)
333   -
  336 + role:checkTaskEnter("HangQuick")
334 337 SendPacket(actionCodes.Hang_quickRpc, MsgPack.pack({
335 338 reward = reward
336 339 }))
... ...
src/actions/HeroAction.lua
... ... @@ -30,6 +30,7 @@ function _M.levelUpRpc( agent, data )
30 30 role:costItems(cost)
31 31 hero:updateProperty({field = "level", delta = 1})
32 32  
  33 + role:checkTaskEnter("HeroLevelUp", {level = hero:getProperty("level")})
33 34 SendPacket(actionCodes.Hero_levelUpRpc, '')
34 35 return true
35 36 end
... ... @@ -87,8 +88,11 @@ function _M.wakeRpc(agent, data)
87 88 end
88 89 hero:updateProperty({field = "wakeL", delta = 1})
89 90  
90   - role:checkTaskEnter("Wake", {heroType = typ, wakeL = hero:getProperty("wakeL")})
91   -
  91 + local curLevel = hero:getProperty("wakeL")
  92 + if curLevel == 4 then -- 解锁cg
  93 + role:checkTaskEnter("WakeCG", {heroType = typ})
  94 + end
  95 +
92 96 SendPacket(actionCodes.Hero_wakeRpc, '')
93 97 return true
94 98 end
... ... @@ -154,6 +158,14 @@ function _M.talentRpc(agent, data)
154 158 end
155 159 end
156 160 hero:updateProperty({field = "talent", value = talent})
  161 + local aheadLevel = 0
  162 + for i = 1, talent:getv(0, 1) - 1 do
  163 + aheadLevel = aheadLevel + #csvdb["unit_talentCsv"][i]
  164 + end
  165 + aheadLevel = aheadLevel + talent:getv(index, 0)
  166 +
  167 + role:checkTaskEnter("HeroTalent", {heroType = hero:getProperty("type"), alv = aheadLevel})
  168 +
157 169 SendPacket(actionCodes.Hero_talentRpc, '')
158 170 return true
159 171 end
... ... @@ -766,6 +778,7 @@ function _M.drawHeroRpc(agent, data)
766 778  
767 779 role:costItems(cost)
768 780  
  781 + local ssrCount = 0
769 782 local reward = {}
770 783 for i = 1, drawCount[drawType] do
771 784  
... ... @@ -779,6 +792,11 @@ function _M.drawHeroRpc(agent, data)
779 792 local idx = math.randWeight(resultPool, 3)
780 793 local temp = resultPool[idx]
781 794 local itemData = csvdb["itemCsv"][temp[1]]
  795 +
  796 + if itemData.type == ItemType.Hero and itemData.quality == 4 then
  797 + ssrCount = ssrCount + 1
  798 + end
  799 +
782 800 if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then
783 801 local fragId = itemData.id - ItemStartId.Hero
784 802 local heroData = csvdb["unitCsv"][fragId]
... ... @@ -791,6 +809,10 @@ function _M.drawHeroRpc(agent, data)
791 809 end
792 810 end
793 811  
  812 + role:checkTaskEnter("DrawHero", {pool = pool, count = drawCount[drawType]})
  813 + if ssrCount > 0 then
  814 + role:checkTaskEnter("DrawSSR", {count = ssrCount})
  815 + end
794 816 SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组
795 817 return true
796 818 end
... ...
src/actions/RoleAction.lua
... ... @@ -284,17 +284,21 @@ function _M.saleItemRpc(agent, data)
284 284 if not backs then return end
285 285  
286 286 local reward = {}
  287 + local fragCount = 0
287 288 for itemId, count in pairs(backs) do
288 289 if math.illegalNum(count, 1, role:getItemCount(itemId)) then return end
289 290 local itemData = csvdb["itemCsv"][itemId]
290 291 if itemData.sell_effect == "" then return end
  292 + if itemData.type == ItemType.HeroFragment or itemData.type == ItemType.HeroFCommon then
  293 + fragCount = fragCount + count
  294 + end
291 295 local sellEffect = itemData.sell_effect:toArray(true, "=")
292 296 reward[sellEffect[1]] = (reward[sellEffect[1]] or 0) + sellEffect[2] * count
293 297 end
294 298  
295 299 role:costItems(backs)
296 300 local reward = role:award(reward)
297   -
  301 + role:checkTaskEnter("DecoFrag", {count = fragCount})
298 302 SendPacket(actionCodes.Role_saleItemRpc, MsgPack.pack({reward = reward}))
299 303 return true
300 304 end
... ... @@ -405,6 +409,7 @@ function _M.openTimeBoxRpc(agent, data)
405 409  
406 410 boxL[slot] = nil
407 411 reward = role:award(reward)
  412 + role:checkTaskEnter("OpenBox")
408 413 else
409 414 return
410 415 end
... ... @@ -459,5 +464,92 @@ function _M.unLockStoryBookRpc(agent, data)
459 464 return true
460 465 end
461 466  
  467 +function _M.taskRpc(agent, data)
  468 + local role = agent.role
  469 + local msg = MsgPack.unpack(data)
  470 + local taskType = msg.type -- 1 日常 2 周长
  471 + local taskId = msg.id --任务id
  472 + local roleField = {"dTask", "wTask"}
  473 + if not roleField[taskType] then return 1 end
  474 +
  475 + local taskData = csvdb["task_loopCsv"][taskType][taskId]
  476 + if not taskData then return 2 end
  477 +
  478 + local taskStatus = role:getProperty(roleField[taskType])
  479 + local tStatus = taskStatus["t"] or {}
  480 +
  481 + if (tStatus[taskId] or 0) < taskData.condition1 then
  482 + return 3
  483 + end
  484 +
  485 + local reward = role:award(taskData.reward)
  486 + local active = (taskStatus["a"] or 0) + taskData.active
  487 +
  488 + role:changeUpdates({
  489 + { type = roleField[taskType], field = {"t", taskId}, value = -1 },
  490 + { type = roleField[taskType], field = "a", value = active}
  491 + })
  492 +
  493 + SendPacket(actionCodes.Role_taskRpc, MsgPack.pack({reward = reward}))
  494 + return true
  495 +end
  496 +
  497 +function _M.taskActiveRpc(agent, data)
  498 + local role = agent.role
  499 + local msg = MsgPack.unpack(data)
  500 + local taskType = msg.type -- 1 日常 2 周长
  501 + local taskId = msg.id --任务id
  502 + local roleField = {"dTask", "wTask"}
  503 + if not roleField[taskType] then return end
  504 +
  505 + local taskData = csvdb["task_activeCsv"][taskType][taskId]
  506 + if not taskData then return end
  507 +
  508 + local taskStatus = role:getProperty(roleField[taskType])
  509 + local tStatus = taskStatus["at"] or {}
  510 +
  511 + if tStatus[taskId] == -1 or (taskStatus["a"] or 0) < taskData.active then
  512 + return
  513 + end
  514 +
  515 + local reward = role:award(taskData.reward)
  516 + role:changeUpdates({
  517 + { type = roleField[taskType], field = {"at", taskId}, value = -1 }
  518 + })
  519 +
  520 + SendPacket(actionCodes.Role_taskActiveRpc, MsgPack.pack({reward = reward}))
  521 + return true
  522 +end
  523 +
  524 +function _M.achiveRpc(agent, data)
  525 + local role = agent.role
  526 + local msg = MsgPack.unpack(data)
  527 + local taskId = msg.id --任务id
  528 +
  529 + local achiveTask = csvdb["achievementCsv"][taskId]
  530 + if not achiveTask then return end
  531 +
  532 + local achiveT = role:getProperty("achiveT")
  533 + local achiveV = role:getProperty("achiveV")
  534 +
  535 + if achiveV[taskId] == -1 then return end
  536 +
  537 + local curStatus = achiveT[achiveTask.type] or 0
  538 + local maxc = achiveTask.condition1
  539 +
  540 + if maxc > curStatus then
  541 + return
  542 + end
  543 +
  544 + local reward = role:award(achiveTask.reward)
  545 +
  546 + role:changeUpdates({
  547 + { type = "achiveV", field = taskId, value = -1 }
  548 + })
  549 +
  550 + SendPacket(actionCodes.Role_achiveRpc, MsgPack.pack({reward = reward}))
  551 + return true
  552 +end
  553 +
462 554  
463 555 return _M
464 556 \ No newline at end of file
... ...
src/actions/TowerAction.lua
... ... @@ -63,7 +63,7 @@ function _M.startBattleRpc(agent, data)
63 63 towerInfo.k = key
64 64  
65 65 role:updateProperty({field = "towerInfo", value = towerInfo})
66   -
  66 + role:checkTaskEnter("TowerBattle", {level = towerInfo.l})
67 67 SendPacket(actionCodes.Tower_startBattleRpc, '')
68 68 return true
69 69 end
... ... @@ -91,6 +91,7 @@ function _M.endBattleRpc(agent, data)
91 91  
92 92 towerInfo.l = towerInfo.l + 1
93 93 reward = role:award(curTower.reward)
  94 + role:checkTaskEnter("TowerPass", {level = towerInfo.l - 1})
94 95 end
95 96  
96 97 towerInfo.c = curCount
... ...
src/adv/Adv.lua
... ... @@ -162,24 +162,31 @@ end
162 162  
163 163  
164 164 --关卡通关,非层 score < 0 失败
165   -function Adv:over(success)
  165 +function Adv:over(success, isAllPass)
166 166 local score = self:getScore()
167 167 local scoreInfo = self.score
168 168 local reward
169 169 if success then
170 170 reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap())
171   - self.owner:checkTaskEnter("AdvPass", {id = self.chapterId})
  171 + self.owner:checkTaskEnter("AdvPass", {id = self.chapterId, level = self.level, score = score})
  172 + if isAllPass then
  173 + self.owner:checkTaskEnter("AdvAllPass", {id = self.chapterId})
  174 + end
172 175  
173 176 -- 冒险队等级升一下子
174 177 local advL = self.owner:getProperty("advL")
  178 + local oldL = advL[1]
175 179 advL[2] = (advL[2] or 0) + 1
176 180 for level = ((advL[1] or 0) + 1), #csvdb["adv_rankCsv"] do
177 181 local ldata = csvdb["adv_rankCsv"][level]
178   - if ldata.unlock >= advL[2] then
  182 + if ldata.unlock <= advL[2] then
179 183 advL[1] = level
180 184 self.owner:award(ldata.reward)
181 185 end
182 186 end
  187 + if advL[1] > oldL then
  188 + self.owner:checkTaskEnter("AdvLevel", {level = advL[1]})
  189 + end
183 190 self.owner:updateProperty("advL", advL)
184 191  
185 192 if self.owner:isFuncOpen(FuncOpenType.AdvWheelSurf) then
... ... @@ -434,7 +441,7 @@ local function clickOut(self, room, block, params)
434 441 self:checkAchievement(Adv.AchievType.OverWin, 1, self.level)
435 442 local levellimit = csvdb["adv_chapterCsv"][self.chapterId].limitlevel
436 443 if params.relay or (not AdvCommon.isEndless(self.chapterId) and (self.level >= levellimit or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1))) then --关卡结束
437   - self:over(true)
  444 + self:over(true, not AdvCommon.isEndless(self.chapterId) and self.level >= levellimit)
438 445 else
439 446 self:initByChapter(self.chapterId, self.level + 1, true, true)
440 447 self:backNext() --下一关
... ... @@ -485,9 +492,9 @@ local function chooseCommon(self, room, block, chooseData, choose)
485 492 end
486 493 return true
487 494 end,
488   - --制定属性 >
  495 + --制定属性
489 496 [4] = function()
490   - if (self.battle.player[AttsEnumEx[cond[2]]] or 0) > cond[3] then
  497 + if (self.battle.player[AttsEnumEx[cond[2]]] or 0) >= cond[3] then
491 498 return true
492 499 end
493 500 end,
... ... @@ -497,6 +504,12 @@ local function chooseCommon(self, room, block, chooseData, choose)
497 504 return true
498 505 end
499 506 end,
  507 + -- sp 到达指定值
  508 + [6] = function()
  509 + if self.battle.player.sp >= cond[2] then
  510 + return true
  511 + end
  512 + end,
500 513 }
501 514 assert(not cond[1] or checkCond[cond[1]], "error cond, event_[link]chooseCsv id :" .. block.event.id)
502 515  
... ... @@ -788,6 +801,7 @@ function Adv:usePotion(potionId, potionLevel, target)
788 801 end
789 802 self:afterRound()
790 803 self:saveDB()
  804 + self.owner:checkTaskEnter("AdvUsePotion")
791 805 return true
792 806 end
793 807  
... ...
src/adv/AdvBattle.lua
... ... @@ -197,6 +197,8 @@ function Battle:battleBegin(roomId, blockId, params)
197 197 if player.hp > 0 then
198 198 enemy:hurt(enemy.hp, self.player, {hurtType = 5})
199 199 self.player:effectBattleBuff()
  200 +
  201 + self.adv.owner:checkTaskEnter("AdvBattleWin", {id = self.adv.chapterId})
200 202 end
201 203 if player.hp > self.player.hp then
202 204 self.player:recover(player.hp - self.player.hp, player)
... ...
src/adv/AdvBlock.lua
... ... @@ -118,6 +118,7 @@ function Block:open()
118 118 randomFunc[self:getEventType()]()
119 119 end
120 120 end
  121 + adv.owner:checkTaskEnter("AdvOpenBlock")
121 122 self.isOpen = true
122 123 end
123 124  
... ...
src/adv/AdvBuff.lua
... ... @@ -20,6 +20,7 @@ Buff.HP_CHANGE_NOW = 16 -- 生命变化(每回合生效,立刻生效)
20 20 Buff.BATTLE_BUFF = 17 -- 切换为战斗中的buff
21 21 Buff.CHANGE_DROP = 18 -- 转换掉落
22 22 Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技
  23 +Buff.EXP_ADD = 20 -- 增加exp(每回合)
23 24  
24 25 --角色一些属性的变化
25 26 local function commonAttr(_Buff, attrName)
... ... @@ -59,7 +60,7 @@ local BuffFactory = {
59 60 if value > 0 then
60 61 self.owner:recover(value, self.release)
61 62 elseif value < 0 then
62   - self.owner:hurt(-value, self.release, {hurtType = 2, buffId = self.id})
  63 + self.owner:hurt(-value, self.release, {hurtType = self.buffData.effectValue5 == "1" and 6 or 2, buffId = self.id})
63 64 end
64 65 end
65 66 _Buff._effectValue = function(self)
... ... @@ -193,6 +194,7 @@ local BuffFactory = {
193 194 return self.buffData.effectValue2, self.buffData.effectValue1
194 195 end
195 196 end,
  197 +
196 198 [Buff.HP_CHANGE_NOW] = function(_Buff)
197 199 _Buff._init = function(self, data) --初始化变化值
198 200 self._changeV = 0
... ... @@ -215,7 +217,7 @@ local BuffFactory = {
215 217 if value > 0 then
216 218 self.owner:recover(value, self.release)
217 219 elseif value < 0 then
218   - self.owner:hurt(-value, self.release, {hurtType = 2, buffId = self.id})
  220 + self.owner:hurt(-value, self.release, {hurtType = self.buffData.effectValue5 == "1" and 6 or 2, buffId = self.id})
219 221 end
220 222 end
221 223 _Buff._effectValue = function(self)
... ... @@ -225,6 +227,17 @@ local BuffFactory = {
225 227 return {cv = self._changeV}
226 228 end
227 229 end,
  230 +
  231 + [Buff.EXP_ADD] = function(_Buff)
  232 + --cType 0 or nil 值 1 百分比
  233 + _Buff._afterRound = function(self)
  234 + local value = self:effect()
  235 + self.owner.battle.player:addExp(value)
  236 + end
  237 + _Buff._effectValue = function(self)
  238 + return self.buffData.effectValue1
  239 + end
  240 + end,
228 241 }
229 242  
230 243 function Buff:ctor(owner, id)
... ...
src/adv/AdvPlayer.lua
... ... @@ -224,7 +224,7 @@ function BaseObject:getInjuredValue(value)
224 224 end
225 225  
226 226 --最终伤害 = [ (敌方攻击 - 己方防御) * (1+伤害增加百分比-伤害减少百分比)*(1+受伤增加百分比-受伤减少百分比)+(伤害增加固定值-伤害增加固定值+受伤增加固定值-受伤增加固定值)]*(1+侍宠百分比)-侍宠固定值
227   --- params -- hurtType 1 普攻伤害 2 buff伤害 3 反弹伤害 4 真实伤害 5 客户端发回来的伤害 --直接作用
  227 +-- params -- hurtType 1 普攻伤害 2 buff伤害 3 反弹伤害 4 真实伤害 5 客户端发回来的伤害 --直接作用 6 buff伤害(真实)
228 228 --进入这个方法之前计算好释放者加成的伤害
229 229 function BaseObject:hurt(value, releaser, params)
230 230 params = params or {}
... ... @@ -245,7 +245,7 @@ function BaseObject:hurt(value, releaser, params)
245 245 team:triggerPassive(Passive.TEAM_HURT, {trigger = releaser})
246 246 end
247 247 end
248   - if params.hurtType ~= 5 then
  248 + if params.hurtType ~= 5 and params.hurtType ~= 6 then
249 249 if not params.hurtType or params.hurtType ~= 4 then
250 250 value = self:getInjuredValue(value) --减伤计算
251 251 end
... ... @@ -308,7 +308,7 @@ function BaseObject:hurt(value, releaser, params)
308 308 team:triggerPassive(Passive.TEAM_DEAD)
309 309 end
310 310  
311   - if params.hurtType == 2 and self ~= self.battle.player then
  311 + if (params.hurtType == 6 or params.hurtType == 2) and self ~= self.battle.player then
312 312 self.battle.adv:checkAchievement(self.battle.adv.AchievType.KillByBuff, 1, params.buffId)
313 313 end
314 314  
... ... @@ -350,7 +350,7 @@ function BaseObject:releaseSkill(skillId, target)
350 350 end
351 351  
352 352 --0 全部 1 我方 2 敌方
353   -function BaseObject:getTeam(nType, noSelf, mapIdx)
  353 +function BaseObject:getTeam(nType, noSelf, mapIdx, includeLock)
354 354 mapIdx = mapIdx or self.battle.adv:getCurMapIdx()
355 355 nType = nType or 0
356 356 local team = {}
... ... @@ -364,7 +364,7 @@ function BaseObject:getTeam(nType, noSelf, mapIdx)
364 364 local function addEnemy()
365 365 for _, enemy in pairs(self.battle.enemys[mapIdx]) do
366 366 if not noSelf or enemy ~= self then
367   - if not enemy.isDead and not enemy.lock then -- 已经翻开的
  367 + if not enemy.isDead and (includeLock or not enemy.lock) then -- 已经翻开的
368 368 table.insert(team, enemy)
369 369 end
370 370 end
... ...
src/models/Diner.lua
... ... @@ -178,6 +178,7 @@ function Diner:updateSell(slot, calOnly)
178 178 self:checkDinerTask(DinerTask.SellDish, deltaCount, sell.dish)
179 179 self:checkDinerTask(DinerTask.SellDishType, deltaCount, math.ceil(sell.dish / 100))
180 180 self:checkDinerTask(DinerTask.SellDishRare, deltaCount, dishData.rarity)
  181 + self.owner:checkTaskEnter("FoodSell", {count = deltaCount})
181 182 end
182 183 return {
183 184 deltaCount = deltaCount,
... ... @@ -250,6 +251,7 @@ function Diner:popularAdd(popular)
250 251 local roleId = self.owner:getProperty("id")
251 252 -- 更新排行榜
252 253 local curPopular = self:getProperty("popular")
  254 + self.owner:checkTaskEnter("DinerPopular", {count = curPopular})
253 255 redisproxy:pipelining(function (red)
254 256 red:zadd(dbKey, curPopular, roleId) --更新分数
255 257 red:hset(RANK_DINER_INFO, roleId, MsgPack.pack({
... ...
src/models/Role.lua
... ... @@ -75,7 +75,13 @@ Role.schema = {
75 75 towerInfo = {"table", {c = globalCsv.tower_count_limit, l = 1}}, -- 当天爬塔消耗的次数 -- {t = time, c = count, l = layer, k = battleKey}
76 76 towerF = {"table", {}}, -- 爬塔阵容
77 77  
78   - spTask = {"table", {}} -- 特殊任务 -- {id = status}
  78 + spTask = {"table", {}}, -- 特殊任务 -- {id = status}
  79 +
  80 + dTask = {"table", {}}, -- 每日任务 {t = {id = status}, a = 0, at = {id = status}} t 任务完成情况 a 获得的活跃数值 at 活跃任务完成情况
  81 + wTask = {"table", {}}, -- 每周任务 {t = {id = status}, a = 0, at = {id = status}} t 任务完成情况 a 获得的活跃数值 at 活跃任务完成情况
  82 +
  83 + achiveT = {"table", {}}, -- 成就计数统计 achivement_type {id = status}
  84 + achiveV = {"table", {}}, -- 成就领奖统计 achivement {id = status}
79 85 }
80 86  
81 87  
... ... @@ -213,7 +219,10 @@ function Role:data()
213 219 towerInfo = self:getProperty("towerInfo"),
214 220 towerF = self:getProperty("towerF"),
215 221 spTask = self:getProperty("spTask"),
216   -
  222 + dTask = self:getProperty("dTask"),
  223 + wTask = self:getProperty("wTask"),
  224 + achiveT = self:getProperty("achiveT"),
  225 + achiveV = self:getProperty("achiveV"),
217 226 }
218 227 end
219 228  
... ...
src/models/RolePlugin.lua
... ... @@ -27,15 +27,24 @@ function RolePlugin.bind(Role)
27 27  
28 28 self.dailyData:refreshDailyData(notify)
29 29 self.dinerData:refreshDailyData(notify)
  30 + self:setProperty("dTask", {})
  31 + response.dTask = {}
  32 +
  33 +
  34 + if isCrossWeek(ltime, now) then
  35 + self:setProperty("wTask", {})
  36 + response.wTask = {}
  37 + end
30 38  
31 39 if notify then
32 40 self:notifyUpdateProperties(response)
33 41 end
34   -
  42 +
35 43 if RESET_TIME == RESET_RANK_TIME then
36 44 self:onResetRank_raw(ltime, now, notify)
37 45 end
38 46 self:setProperty("ltime", now)
  47 +
39 48 return true
40 49 end
41 50 end
... ... @@ -114,12 +123,13 @@ function RolePlugin.bind(Role)
114 123 local typ = math.floor((itemId-7000)/100)
115 124 local lv = (itemId-7000)%100
116 125 self:addEquip(typ, lv, count ,pms)
117   - self:checkTaskEnter("AddEquip", {equipId = itemId}, pms.notNotify)
  126 + local equipCsv = (csvdb["equipCsv"][typ] or {})[lv]
  127 + self:checkTaskEnter("AddEquip", {equipId = itemId, rarity = equipCsv.rarity}, pms.notNotify)
118 128 end,
119 129 [ItemType.Rune] = function()
120 130 local typ = math.floor((itemId-2000)/100)
121 131 for _= 1, count do
122   - self:addRune({type = typ,id = itemId})
  132 + self:addRune({type = typ,id = itemId, pms.notNotify})
123 133 end
124 134 end,
125 135 [ItemType.AdvItem] = function() --冒险道具不会进入 玩家仓库
... ... @@ -323,7 +333,8 @@ function RolePlugin.bind(Role)
323 333 local roleId = self:getProperty("id")
324 334 local heroType = params.type
325 335 if self:isHaveHero(heroType) then return end
326   - if not csvdb["unitCsv"][heroType] then return false end
  336 + local unitData = csvdb["unitCsv"][heroType]
  337 + if not unitData then return false end
327 338  
328 339 local heroId = tonum(redisproxy:hincrby(string.format(R_INCR, roleId), "hero", 1))
329 340  
... ... @@ -341,7 +352,7 @@ function RolePlugin.bind(Role)
341 352 newHero.owner = self
342 353 newHero:saveBattleValue()
343 354 self.heros[heroId] = newHero
344   - self:checkTaskEnter("AddHero", {heroType = heroType, wakeL = newHero:getProperty("wakeL")}, params.notNotify)
  355 + self:checkTaskEnter("AddHero", {heroType = heroType, wakeL = newHero:getProperty("wakeL"), camp = unitData.camp, job = unitData.job}, params.notNotify)
345 356 if not params.notNotify then
346 357 local heroResponse = {}
347 358 table.insert(heroResponse, newHero:data())
... ... @@ -498,6 +509,7 @@ function RolePlugin.bind(Role)
498 509 table.insert(response, newRune:data())
499 510 SendPacket(actionCodes.Role_loadRunes, MsgPack.pack(response))
500 511 end
  512 + self:checkTaskEnter("AddRune", {id = params.id, type = params.type, rarity = set.rarity}, params.notNotify)
501 513 return 0
502 514 else
503 515 return 1
... ...
src/models/RoleTask.lua
... ... @@ -2,20 +2,79 @@
2 2  
3 3 -- 增加 checkTaskEnter 内的参数 记得增加注释
4 4 local TaskType = {
5   - HangPass = 1, -- 挂机通关 - id
6   - AdvPass = 2, -- 冒险通过关 - id
  5 + -- hero 相关
  6 + DrawHero = 1, -- 招募 - pool count
  7 + AddHero = 2, -- 增加角色 - heroType wakeL camp job
7 8 LoveBreak = 3, -- 好感度进阶 - heroType loveL
8 9 Wake = 4, -- 觉醒 - heroType wakeL
9   - AddHero = 5, -- 增加角色 - heroType wakeL
10   - AddEquip = 6, -- 获得装备 - equipId
11   - DecoRune = 7, -- 分解符文 - count
12   - SaleEquip = 8, -- 出售装备 - count
13   - MakeFood = 9, -- 制作料理 - id count
14   - HangGet = 10, -- 挂机收货
15   - FoodMGet = 11, -- 食材获取
16   -
17   - --todo
18   - PvpWin = 100, -- pvp胜利
  10 + HeroLevelUp = 5, -- 角色升级 - level
  11 + DecoFrag = 6, -- 碎片分解 - count
  12 + WakeCG = 7, -- 觉醒到解锁CG - heroType
  13 + HeroTalent = 8, -- 天赋升级 - heroType alv
  14 + DrawSSR = 9, -- 抽到SSR - count
  15 +
  16 + --装备相关
  17 + AddEquip = 101, -- 获得装备 - equipId rarity
  18 + SaleEquip = 102, -- 出售装备 - count
  19 + EquipUp = 103, -- 装备强化
  20 +
  21 + -- 符文(零件)相关
  22 + RuneUp = 201, -- 符文强化
  23 + DecoRune = 202, -- 分解符文 - count
  24 + AddRune = 203, -- 分解符文 - id type rarity
  25 +
  26 +
  27 + -- 挂机相关
  28 + HangPass = 301, -- 挂机通关 - id
  29 + HangGet = 302, -- 挂机收货
  30 + HangQuick = 303, -- 快速挂机
  31 + HangBattle = 304, -- 挂机战斗 - id
  32 + HangGetGold = 305, -- 挂机获得齿轮 - count
  33 +
  34 + -- 冒险相关
  35 + AdvPass = 401, -- 冒险通过关 - id level score
  36 + AdvStart = 402, -- 冒险开始(包括挂机) - id
  37 + AdvBattleWin = 403, -- 冒险内战斗胜利 - id
  38 + AdvAllPass = 404, -- 冒险章节通关 - id
  39 + AdvLevel = 405, -- 探险者协会升级 - level
  40 + AdvOverTask = 406, -- 完成任务 - id
  41 + AdvOpenBlock = 407, -- 打开地块 - id
  42 + AdvUsePotion = 408, -- 使用营养剂
  43 +
  44 + --爬塔相关
  45 + TowerPass = 501, -- 爬塔通关 - level
  46 + TowerBattle = 502, -- 爬塔战斗 - level
  47 +
  48 + -- 餐厅相关
  49 + FoodMGet = 601, -- 食材获取
  50 + MakeFood = 602, -- 制作料理 - id count
  51 + GetOderTask = 603, -- 接受餐厅订单 - rarity
  52 + OverOderTask = 604, -- 完成特别订单 - rarity
  53 + FoodSell = 605, -- 料理贩卖 - count
  54 + FoodSellQuick = 606, -- 料理快速贩卖
  55 + FoodSellGold = 607, -- 贩卖获得齿轮 - count
  56 + DinerPopular = 608, -- 人气值 - count
  57 + DinerLevelUp = 609, -- 餐厅升级 - level type
  58 + DinerTalentUp = 610, -- 天赋升级 - type
  59 +
  60 + -- 车厢相关
  61 + PotionMake = 701, -- 营养剂制作 - id count
  62 + OpenBox = 702, -- 拆解时间箱
  63 +
  64 +
  65 + --功能未实现 todo
  66 + PvpWin = 1000, -- pvp胜利 - score
  67 + PvpBattle = 1001, -- pvp挑战
  68 + AdvShop = 1002, -- 冒险商城
  69 + GiveFriendP = 1003, -- 赠送友情点
  70 + UnionBoss = 1004, -- 工会boss
  71 + UnionBattle = 1005, -- 工会战
  72 + AddUnion = 1006, -- 加入一个公会
  73 + AddFriend = 1007, -- 加入一个好友 - count
  74 + BindPhone = 1008, -- 绑定手机
  75 + WeChat = 1009, -- 关注微信
  76 + WeBlog = 1010, -- 关注微博
  77 + SignIn = 1011, -- 签到
19 78 }
20 79  
21 80 local function v(value)
... ... @@ -26,19 +85,95 @@ local function f(field)
26 85 return {type = "field", value = field}
27 86 end
28 87  
  88 +-- 剧情任务监听
29 89 local StoryListener = {
30 90 func = "checkStoryStatus",
31 91 listen = {
32   - [TaskType.HangPass] = {v(1), f("id")},
33   - [TaskType.AdvPass] = {v(4), f("id")},
34   - [TaskType.LoveBreak] = {v(2), f("heroType")},
35   - [TaskType.Wake] = {v(3), f("heroType"), f("wakeL")},
36   - [TaskType.AddHero] = {v(3), f("heroType"), f("wakeL")},
  92 + [TaskType.HangPass] = {{v(1), f("id")}},
  93 + [TaskType.AdvPass] = {{v(4), f("id")}},
  94 + [TaskType.LoveBreak] = {{v(2), f("heroType")}},
  95 + [TaskType.Wake] = {{v(3), f("heroType"), f("wakeL")}},
  96 + [TaskType.AddHero] = {{v(3), f("heroType"), f("wakeL")}},
  97 + }
  98 +}
  99 +
  100 +-- 通用任务监听
  101 +local CommonListener = {
  102 + func = "checkCommonTasks",
  103 + listen = {
  104 + [TaskType.HangGet] = {{v(1)}},
  105 + [TaskType.HangQuick] = {{v(2)}},
  106 + [TaskType.HangBattle] = {{v(3)}},
  107 + [TaskType.DrawHero] = {{v(4), f("count"), f("pool")}},
  108 + [TaskType.TowerBattle] = {{v(5)}},
  109 + [TaskType.PvpBattle] = {{v(6)}},
  110 + [TaskType.PvpWin] = {{v(7)}},
  111 + [TaskType.AdvStart] = {{v(8)}},
  112 + [TaskType.AdvBattleWin] = {{v(9)}},
  113 + [TaskType.AdvShop] = {{v(10)}},
  114 + [TaskType.GetOderTask] = {{v(11)}},
  115 + [TaskType.OverOderTask] = {{v(12)}},
  116 + [TaskType.MakeFood] = {{v(13), f("count")}},
  117 + [TaskType.FoodSell] = {{v(14), f("count")}},
  118 + [TaskType.FoodSellQuick] = {{v(15)}},
  119 + [TaskType.FoodMGet] = {{v(16)}},
  120 + [TaskType.HeroLevelUp] = {{v(17)}},
  121 + [TaskType.Wake] = {{v(18)}},
  122 + [TaskType.EquipUp] = {{v(19)}},
  123 + [TaskType.GiveFriendP] = {{v(20)}},
  124 + [TaskType.UnionBoss] = {{v(21)}},
  125 + }
  126 +}
  127 +
  128 +-- 成就监听
  129 +local AchievListener = {
  130 + func = "checkAchievTask",
  131 + listen = {
  132 + [TaskType.HangPass] = {{v(1), f("id")}},
  133 + [TaskType.UnionBattle] = {{v(2)}},
  134 + [TaskType.PvpWin] = {{v(3)}, {v(4), f("score")}},
  135 + [TaskType.AdvAllPass] = {{v(5), f("id")}},
  136 + [TaskType.AdvLevel] = {{v(6), f("level")}},
  137 + [TaskType.AdvPass] = {{v(7), f("score")}},
  138 + [TaskType.AdvBattleWin] = {{v(8)}},
  139 + [TaskType.AdvOverTask] = {{v(9)}},
  140 + [TaskType.AdvOpenBlock] = {{v(10)}},
  141 + [TaskType.AdvUsePotion] = {{v(11)}},
  142 + [TaskType.AdvStart] = {{v(12)}},
  143 + [TaskType.FoodSell] = {{v(13), f("count")}},
  144 + [TaskType.OverOderTask] = {{v(14)}},
  145 + [TaskType.FoodSellGold] = {{v(15), f("count")}},
  146 + [TaskType.DinerPopular] = {{v(16), f("count")}},
  147 + [TaskType.TowerPass] = {{v(17), f("level")}},
  148 + [TaskType.OpenBox] = {{v(18)}},
  149 + [TaskType.DinerLevelUp] = {{v(19), f("level"), f("type")}},
  150 + [TaskType.DinerTalentUp] = {{v(20), v(1), f("type")}},
  151 + [TaskType.HangGetGold] = {{v(21), f("count")}},
  152 + [TaskType.HeroLevelUp] = {{v(22), f("level")}},
  153 + [TaskType.Wake] = {{v(23), f("wakeL")}},
  154 + [TaskType.WakeCG] = {{v(24)}},
  155 + [TaskType.HeroTalent] = {{v(25), f("alv")}},
  156 + [TaskType.AddHero] = {{v(26), f("heroType")}, {v(27)}},
  157 + [TaskType.DrawSSR] = {{v(28), f("count")}},
  158 + [TaskType.DrawHero] = {{v(29), f("count"), f("pool")}},
  159 + [TaskType.AddEquip] = {{v(30), f("rarity")}, {v(34), 1, f("rarity")}},
  160 + [TaskType.AddRune] = {{v(31), f("rarity")}, {v(35), 1, f("rarity")}},
  161 + [TaskType.EquipUp] = {{v(32)}},
  162 + [TaskType.RuneUp] = {{v(33)}},
  163 + [TaskType.AddUnion] = {{v(36)}},
  164 + [TaskType.AddFriend] = {{v(37), f("count")}},
  165 + [TaskType.BindPhone] = {{v(38), 1}},
  166 + [TaskType.WeChat] = {{v(38), 2}},
  167 + [TaskType.WeBlog] = {{v(38), 3}},
  168 + [TaskType.SignIn] = {{v(39)}},
37 169 }
38 170 }
39 171  
  172 +
40 173 local TaskListeners = {
41 174 StoryListener,
  175 + CommonListener,
  176 + AchievListener,
42 177 }
43 178  
44 179 local RoleTask = {}
... ... @@ -54,33 +189,26 @@ function RoleTask.bind(Role)
54 189 for _, listener in ipairs(TaskListeners) do
55 190 if listener and listener.listen and listener.listen[taskType] and listener["func"] then
56 191 local pms = {}
57   - for _, v in ipairs(listener.listen[taskType]) do
58   - if type(v) == "table" and v.type then
59   - if v.type == "value" then
60   - table.insert(pms, v.value)
61   - elseif v.type == "field" then
62   - table.insert(pms, params[v.value])
  192 + for _, vs in ipairs(listener.listen[taskType]) do
  193 + for __, v in ipairs(vs) do
  194 + if type(v) == "table" and v.type then
  195 + if v.type == "value" then
  196 + table.insert(pms, v.value)
  197 + elseif v.type == "field" then
  198 + table.insert(pms, params[v.value])
  199 + else
  200 + table.insert(pms, v)
  201 + end
63 202 else
64 203 table.insert(pms, v)
65 204 end
66   - else
67   - table.insert(pms, v)
68 205 end
  206 + self[listener["func"]](self, notNotify, table.unpack(pms))
69 207 end
70   - self[listener["func"]](self, notNotify, table.unpack(pms))
71 208 end
72 209 end
73 210 end
74 211  
75   - function Role:checkDailyTask()
76   - end
77   -
78   - function Role:checkWeekTask()
79   - end
80   -
81   - function Role:checkAchievTask()
82   - end
83   -
84 212 --剧情相关----begin-------------
85 213 local function checkStoryStatusByHang(role, data, status, cond1) -- cond1 carbonId
86 214 if tonumber(data.unlockData) ~= cond1 then return end
... ... @@ -158,6 +286,147 @@ function RoleTask.bind(Role)
158 286 end
159 287  
160 288 --剧情相关----end-------------
  289 +
  290 + function Role:checkCommonTasks(notNotify, stype, count, cond1, cond2)
  291 + count = count or 1
  292 + self:checkLoopTask(notNotify, stype, count, cond1, cond2)
  293 + end
  294 +
  295 + function Role:checkLoopTask(notNotify, stype, count, cond1, cond2)
  296 + local tasks = {self:getProperty("dTask")["t"] or {}, self:getProperty("wTask")["t"] or {}}
  297 + local isChange = {false, false}
  298 + for key, status in ipairs(tasks) do
  299 + local taskDatas = csvdb["task_loopCsv"][key]
  300 + for taskId, data in pairs(taskDatas) do
  301 + if status[taskId] ~= -1 and data.type == stype and (data.condition2 == 0 or data.condition2 == cond1) then
  302 + status[taskId] = (status[taskId] or 0) + count
  303 + isChange[key] = 1
  304 + end
  305 + end
  306 + end
  307 + local change = {}
  308 + if isChange[1] then
  309 + table.insert(change, {type = "dTask", field = "t", value = tasks[1]})
  310 + end
  311 + if isChange[2] then
  312 + table.insert(change, {type = "wTask", field = "t", value = tasks[2]})
  313 + end
  314 + if next(change) then
  315 + self:changeUpdates(change, notNotify)
  316 + end
  317 + end
  318 +
  319 + function Role:checkAchievTask(notNotify, stype, v1, v2)
  320 + local change = {}
  321 + local achiveStatus = self:getProperty("achiveT")
  322 +
  323 + local IsFindMax = {
  324 + [4] = true,
  325 + [6] = true,
  326 + [7] = true,
  327 + [16] = true,
  328 + [17] = true,
  329 + [19] = true,
  330 + [22] = true,
  331 + [23] = true,
  332 + [25] = true,
  333 + }
  334 +
  335 + for tId , achiveData in ipairs(csvdb["achievement_typeCsv"]) do
  336 + local curStatus = achiveStatus[tId] or 0
  337 + if achiveData.type == stype then
  338 + if achiveData.type == 1 then --取出难度
  339 + v2 = math.floor(v1 / 10000)
  340 + end
  341 +
  342 + if achiveData.type == 26 then
  343 + local campS = {}
  344 + local jobS = {}
  345 + for _, hero in pairs(self.heros) do
  346 + local unitData = csvdb["unitCsv"][hero:getProperty("type")]
  347 + campS[unitData.camp] = (campS[unitData.camp] or 0) + 1
  348 + jobS[unitData.job] = (jobS[unitData.job] or 0) + 1
  349 + end
  350 + local nStatus = 0
  351 + if achiveData.condition2 == 1 then
  352 + for k , v in pairs(jobS) do
  353 + nStatus = math.max(nStatus, v)
  354 + end
  355 + elseif achiveData.condition2 == 2 then
  356 + for k , v in pairs(campS) do
  357 + nStatus = math.max(nStatus, v)
  358 + end
  359 + end
  360 + if nStatus > curStatus then
  361 + table.insert(change, {type = "achiveT", field = tId, value = nStatus})
  362 + end
  363 + elseif achiveData.type == 30 then --装备套装
  364 + if achiveData.condition2 == 0 or achiveData.condition2 == v1 then
  365 + local suitS = {}
  366 + for equipType, equips in pairs(self:getProperty("equips")) do
  367 + for lv, c in pairs(equips) do
  368 + local equipData = csvdb["equipCsv"][equipType][lv]
  369 + if achiveData.condition2 == 0 or achiveData.condition2 == equipData.rarity then
  370 + if equipData.suit ~= "" then
  371 + suitS[equipData.suit] = suitS[equipData.suit] or {}
  372 + suitS[equipData.suit][equipType] = 1
  373 + end
  374 + end
  375 + end
  376 + end
  377 + local nStatus = 0
  378 + for k , v in pairs(suitS) do
  379 + local n = 0
  380 + for _, __ in pairs(v) do
  381 + n = n + 1
  382 + end
  383 + nStatus = math.max(nStatus, n)
  384 + end
  385 + if nStatus > curStatus then
  386 + table.insert(change, {type = "achiveT", field = tId, value = nStatus})
  387 + end
  388 + end
  389 + elseif achiveData.type == 31 then -- 符文套装
  390 + if achiveData.condition2 == 0 or achiveData.condition2 == v1 then
  391 + local suitS = {}
  392 + for _, rune in pairs(self.runeBag) do
  393 + local runeData = csvdb["runeCsv"][rune:getProperty("type")][rune:getProperty("id")]
  394 + if achiveData.condition2 == 0 or achiveData.condition2 == equipData.rarity then
  395 + if runeData.suit ~= "" then
  396 + suitS[runeData.suit] = suitS[runeData.suit] or {}
  397 + suitS[runeData.suit][runeData.type] = 1
  398 + end
  399 + end
  400 + end
  401 + local nStatus = 0
  402 + for k , v in pairs(suitS) do
  403 + local n = 0
  404 + for _, __ in pairs(v) do
  405 + n = n + 1
  406 + end
  407 + nStatus = math.max(nStatus, n)
  408 + end
  409 + if nStatus > curStatus then
  410 + table.insert(change, {type = "achiveT", field = tId, value = nStatus})
  411 + end
  412 + end
  413 + elseif IsFindMax[achiveData.type] then -- 最大值
  414 + if achiveData.condition2 == 0 or achiveData.condition2 == v2 then
  415 + if (v1 or 0) > curStatus then
  416 + table.insert(change, {type = "achiveT", field = tId, value = v1})
  417 + end
  418 + end
  419 + else --通用增加
  420 + if achiveData.condition2 == 0 or achiveData.condition2 == v2 then
  421 + table.insert(change, {type = "achiveT", field = tId, value = curStatus + (v1 or 1)})
  422 + end
  423 + end
  424 + end
  425 + end
  426 + if next(change) then
  427 + self:changeUpdates(change, notNotify)
  428 + end
  429 + end
161 430 end
162 431  
163 432 return RoleTask
164 433 \ No newline at end of file
... ...