Commit 53e8037ecfe65008cdf1c093d842bb49caf23542

Authored by zhouhaihai
1 parent 0b9d9fba

任务

src/ProtocolCode.lua
@@ -29,6 +29,9 @@ actionCodes = { @@ -29,6 +29,9 @@ actionCodes = {
29 Role_storyBookRewardRpc = 114, 29 Role_storyBookRewardRpc = 114,
30 Role_unLockStoryBookRpc = 115, 30 Role_unLockStoryBookRpc = 115,
31 Role_openTimeBoxRpc = 116, 31 Role_openTimeBoxRpc = 116,
  32 + Role_taskRpc = 117,
  33 + Role_taskActiveRpc = 118,
  34 + Role_achiveRpc = 119,
32 35
33 Adv_startAdvRpc = 151, 36 Adv_startAdvRpc = 151,
34 Adv_startHangRpc = 152, 37 Adv_startHangRpc = 152,
@@ -73,8 +76,8 @@ actionCodes = { @@ -73,8 +76,8 @@ actionCodes = {
73 Hang_roleFormatRpc = 255, 76 Hang_roleFormatRpc = 255,
74 Hang_getRewardRpc = 256, 77 Hang_getRewardRpc = 256,
75 Hang_quickRpc = 257, 78 Hang_quickRpc = 257,
76 - Hang_getRewardItemRpc = 258,  
77 - Hang_getRewardCoinRpc = 259, 79 + -- Hang_getRewardItemRpc = 258,
  80 + -- Hang_getRewardCoinRpc = 259,
78 81
79 Diner_updateProperty = 300, 82 Diner_updateProperty = 300,
80 Diner_addSellRpc = 301, 83 Diner_addSellRpc = 301,
src/actions/AdvAction.lua
@@ -112,7 +112,7 @@ function _M.startAdvRpc( agent, data ) @@ -112,7 +112,7 @@ function _M.startAdvRpc( agent, data )
112 end 112 end
113 113
114 role:getAdvData():initByChapter(chapterId, layer) 114 role:getAdvData():initByChapter(chapterId, layer)
115 - 115 + role:checkTaskEnter("AdvStart", {id = chapterId})
116 SendPacket(actionCodes.Adv_startAdvRpc, '') 116 SendPacket(actionCodes.Adv_startAdvRpc, '')
117 return true 117 return true
118 end 118 end
@@ -161,7 +161,7 @@ function _M.startHangRpc(agent, data) @@ -161,7 +161,7 @@ function _M.startHangRpc(agent, data)
161 role:changeUpdates({{type = "advHang", field = chapterId, value = info}}) 161 role:changeUpdates({{type = "advHang", field = chapterId, value = info}})
162 162
163 role.dailyData:updateProperty({field = "advC", delta = 1}) 163 role.dailyData:updateProperty({field = "advC", delta = 1})
164 - 164 + role:checkTaskEnter("AdvStart", {id = chapterId})
165 SendPacket(actionCodes.Adv_startHangRpc, '') 165 SendPacket(actionCodes.Adv_startHangRpc, '')
166 return true 166 return true
167 end 167 end
@@ -247,6 +247,7 @@ function _M.finishTaskRpc(agent, data) @@ -247,6 +247,7 @@ function _M.finishTaskRpc(agent, data)
247 end 247 end
248 adv:updateTask() 248 adv:updateTask()
249 if not status then return end 249 if not status then return end
  250 + role:checkTaskEnter("AdvOverTask", {id = taskId})
250 SendPacket(actionCodes.Adv_finishTaskRpc, MsgPack.pack({reward = reward})) 251 SendPacket(actionCodes.Adv_finishTaskRpc, MsgPack.pack({reward = reward}))
251 return true 252 return true
252 end 253 end
src/actions/CarAction.lua
@@ -38,6 +38,7 @@ function _M.makePotionRpc( agent, data ) @@ -38,6 +38,7 @@ function _M.makePotionRpc( agent, data )
38 role:costItems(cost) 38 role:costItems(cost)
39 potionBag[potionId] = own + count 39 potionBag[potionId] = own + count
40 role:updateProperty({field = "potionBag", value = potionBag}) 40 role:updateProperty({field = "potionBag", value = potionBag})
  41 + role:checkTaskEnter("PotionMake", {count = count, id = potionId})
41 SendPacket(actionCodes.Car_makePotionRpc, MsgPack.pack({potionBag = potionBag})) 42 SendPacket(actionCodes.Car_makePotionRpc, MsgPack.pack({potionBag = potionBag}))
42 return true 43 return true
43 end 44 end
@@ -86,7 +87,7 @@ function _M.equipUpRpc( agent, data ) @@ -86,7 +87,7 @@ function _M.equipUpRpc( agent, data )
86 role:costItems(cost) 87 role:costItems(cost)
87 role:addEquip(typ, lv, -costCount) 88 role:addEquip(typ, lv, -costCount)
88 role:addEquip(typ, nextLv ,count) 89 role:addEquip(typ, nextLv ,count)
89 - 90 + role:checkTaskEnter("EquipUp", {})
90 SendPacket(actionCodes.Car_equipUpRpc, '') 91 SendPacket(actionCodes.Car_equipUpRpc, '')
91 return true 92 return true
92 end 93 end
@@ -118,6 +119,7 @@ function _M.runeUpRpc( agent, data ) @@ -118,6 +119,7 @@ function _M.runeUpRpc( agent, data )
118 119
119 role:costItems(cost) 120 role:costItems(cost)
120 ownRune:updateProperty({field = "level",value = level+1}) 121 ownRune:updateProperty({field = "level",value = level+1})
  122 + role:checkTaskEnter("RuneUp")
121 SendPacket(actionCodes.Car_runeUpRpc, '') 123 SendPacket(actionCodes.Car_runeUpRpc, '')
122 return true 124 return true
123 end 125 end
src/actions/DinerAction.lua
@@ -155,6 +155,9 @@ function _M.getSellRewardRpc( agent, data ) @@ -155,6 +155,9 @@ function _M.getSellRewardRpc( agent, data )
155 role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) 155 role.dinerData:updateProperty({field = "sells", value = json.encode(sells)})
156 for k, v in pairs(reward:toNumMap()) do 156 for k, v in pairs(reward:toNumMap()) do
157 role:addItem({itemId = k,count = v}) 157 role:addItem({itemId = k,count = v})
  158 + if k == ItemId.Gold then
  159 + role:checkTaskEnter("FoodSellGold", {count = v})
  160 + end
158 end 161 end
159 162
160 role.dinerData:popularAdd(popular) 163 role.dinerData:popularAdd(popular)
@@ -162,7 +165,6 @@ function _M.getSellRewardRpc( agent, data ) @@ -162,7 +165,6 @@ function _M.getSellRewardRpc( agent, data )
162 if dirty then 165 if dirty then
163 role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order")) 166 role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order"))
164 end 167 end
165 -  
166 SendPacket(actionCodes.Diner_getSellRewardRpc, MsgPack.pack({reward = reward})) 168 SendPacket(actionCodes.Diner_getSellRewardRpc, MsgPack.pack({reward = reward}))
167 return true 169 return true
168 end 170 end
@@ -226,6 +228,7 @@ function _M.expediteSellRpc( agent, data ) @@ -226,6 +228,7 @@ function _M.expediteSellRpc( agent, data )
226 if dirty then 228 if dirty then
227 role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order")) 229 role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order"))
228 end 230 end
  231 + role:checkTaskEnter("FoodSellQuick")
229 SendPacket(actionCodes.Diner_expediteSellRpc, MsgPack.pack({reward = reward,popular = popular})) 232 SendPacket(actionCodes.Diner_expediteSellRpc, MsgPack.pack({reward = reward,popular = popular}))
230 return true 233 return true
231 end 234 end
@@ -263,7 +266,7 @@ function _M.levelUpRpc( agent, data ) @@ -263,7 +266,7 @@ function _M.levelUpRpc( agent, data )
263 266
264 role:costItems(cost) 267 role:costItems(cost)
265 role.dinerData:updateProperty({field = "buildL", value = buildL:setv(index, curLevel + 1)}) 268 role.dinerData:updateProperty({field = "buildL", value = buildL:setv(index, curLevel + 1)})
266 - 269 + role:checkTaskEnter("DinerLevelUp", {type = index, level = curLevel + 1})
267 SendPacket(actionCodes.Diner_levelUpRpc, '') 270 SendPacket(actionCodes.Diner_levelUpRpc, '')
268 return true 271 return true
269 end 272 end
@@ -337,6 +340,8 @@ function _M.talentUpRpc( agent, data ) @@ -337,6 +340,8 @@ function _M.talentUpRpc( agent, data )
337 role:award(treePoint) 340 role:award(treePoint)
338 end 341 end
339 342
  343 + role:checkTaskEnter("DinerTalentUp", {type = talentData.effect:toArray(true,"=")[1]})
  344 +
340 SendPacket(actionCodes.Diner_talentUpRpc, '') 345 SendPacket(actionCodes.Diner_talentUpRpc, '')
341 return true 346 return true
342 end 347 end
@@ -431,6 +436,7 @@ function _M.updateTaskRpc( agent, data ) @@ -431,6 +436,7 @@ function _M.updateTaskRpc( agent, data )
431 end 436 end
432 orders[index].status = 1 437 orders[index].status = 1
433 orders[index].lock = 1 438 orders[index].lock = 1
  439 + role:checkTaskEnter("GetOderTask", {rarity = taskSet.rarity})
434 elseif cmd == 1 then 440 elseif cmd == 1 then
435 if order.status ~= 1 then 441 if order.status ~= 1 then
436 return 31 442 return 31
@@ -448,6 +454,7 @@ function _M.updateTaskRpc( agent, data ) @@ -448,6 +454,7 @@ function _M.updateTaskRpc( agent, data )
448 role:addItem({itemId = typ, count = count}) 454 role:addItem({itemId = typ, count = count})
449 end 455 end
450 table.remove(orders,index) 456 table.remove(orders,index)
  457 + role:checkTaskEnter("OverOderTask", {rarity = taskSet.rarity})
451 else 458 else
452 return 33 459 return 33
453 end 460 end
@@ -593,7 +600,7 @@ function _M.getGreenhouseRpc( agent, data ) @@ -593,7 +600,7 @@ function _M.getGreenhouseRpc( agent, data )
593 end 600 end
594 role.dinerData:updateProperty({field = "gfood", value = gfood}) 601 role.dinerData:updateProperty({field = "gfood", value = gfood})
595 local reward = role:award(reward) 602 local reward = role:award(reward)
596 - 603 + role:checkTaskEnter("FoodMGet")
597 SendPacket(actionCodes.Diner_getGreenhouseRpc, MsgPack.pack({reward = reward})) 604 SendPacket(actionCodes.Diner_getGreenhouseRpc, MsgPack.pack({reward = reward}))
598 return true 605 return true
599 end 606 end
src/actions/GmAction.lua
@@ -22,7 +22,6 @@ end @@ -22,7 +22,6 @@ end
22 local helpDes = {{"描述", "指令", "参数1", "参数2" ,"参数3"}} 22 local helpDes = {{"描述", "指令", "参数1", "参数2" ,"参数3"}}
23 23
24 table.insert(helpDes, {"获得角色" , "hero", "角色类型"}) 24 table.insert(helpDes, {"获得角色" , "hero", "角色类型"})
25 -  
26 function _M.hero(role, pms) 25 function _M.hero(role, pms)
27 local heroType = tonum(pms.pm1) 26 local heroType = tonum(pms.pm1)
28 if not role:addHero({type = heroType}) then 27 if not role:addHero({type = heroType}) then
src/actions/HangAction.lua
@@ -139,6 +139,7 @@ function _M.startBattleRpc(agent, data) @@ -139,6 +139,7 @@ function _M.startBattleRpc(agent, data)
139 hangInfo.key = key 139 hangInfo.key = key
140 local nowTime = skynet.timex() 140 local nowTime = skynet.timex()
141 role:updateProperty({field = "hangInfo", value = hangInfo}) 141 role:updateProperty({field = "hangInfo", value = hangInfo})
  142 + role:checkTaskEnter("HangBattle", {id = carbonId})
142 SendPacket(actionCodes.Hang_startBattleRpc, MsgPack.pack({key = key})) 143 SendPacket(actionCodes.Hang_startBattleRpc, MsgPack.pack({key = key}))
143 return true 144 return true
144 end 145 end
@@ -229,71 +230,73 @@ function _M.getRewardRpc(agent , data) @@ -229,71 +230,73 @@ function _M.getRewardRpc(agent , data)
229 role:updateProperty({field = "hangBag", value = items}) 230 role:updateProperty({field = "hangBag", value = items})
230 role:updateProperty({field = "hangInfo", value = hangInfo}) 231 role:updateProperty({field = "hangInfo", value = hangInfo})
231 role:checkTaskEnter("HangGet") 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 end 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 reward = reward 237 reward = reward
265 })) 238 }))
266 return true 239 return true
267 end 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 function _M.quickRpc(agent , data) 301 function _M.quickRpc(agent , data)
299 local role = agent.role 302 local role = agent.role
@@ -330,7 +333,7 @@ function _M.quickRpc(agent , data) @@ -330,7 +333,7 @@ function _M.quickRpc(agent , data)
330 end 333 end
331 334
332 reward = role:award(reward) 335 reward = role:award(reward)
333 - 336 + role:checkTaskEnter("HangQuick")
334 SendPacket(actionCodes.Hang_quickRpc, MsgPack.pack({ 337 SendPacket(actionCodes.Hang_quickRpc, MsgPack.pack({
335 reward = reward 338 reward = reward
336 })) 339 }))
src/actions/HeroAction.lua
@@ -30,6 +30,7 @@ function _M.levelUpRpc( agent, data ) @@ -30,6 +30,7 @@ function _M.levelUpRpc( agent, data )
30 role:costItems(cost) 30 role:costItems(cost)
31 hero:updateProperty({field = "level", delta = 1}) 31 hero:updateProperty({field = "level", delta = 1})
32 32
  33 + role:checkTaskEnter("HeroLevelUp", {level = hero:getProperty("level")})
33 SendPacket(actionCodes.Hero_levelUpRpc, '') 34 SendPacket(actionCodes.Hero_levelUpRpc, '')
34 return true 35 return true
35 end 36 end
@@ -87,8 +88,11 @@ function _M.wakeRpc(agent, data) @@ -87,8 +88,11 @@ function _M.wakeRpc(agent, data)
87 end 88 end
88 hero:updateProperty({field = "wakeL", delta = 1}) 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 SendPacket(actionCodes.Hero_wakeRpc, '') 96 SendPacket(actionCodes.Hero_wakeRpc, '')
93 return true 97 return true
94 end 98 end
@@ -154,6 +158,14 @@ function _M.talentRpc(agent, data) @@ -154,6 +158,14 @@ function _M.talentRpc(agent, data)
154 end 158 end
155 end 159 end
156 hero:updateProperty({field = "talent", value = talent}) 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 SendPacket(actionCodes.Hero_talentRpc, '') 169 SendPacket(actionCodes.Hero_talentRpc, '')
158 return true 170 return true
159 end 171 end
@@ -766,6 +778,7 @@ function _M.drawHeroRpc(agent, data) @@ -766,6 +778,7 @@ function _M.drawHeroRpc(agent, data)
766 778
767 role:costItems(cost) 779 role:costItems(cost)
768 780
  781 + local ssrCount = 0
769 local reward = {} 782 local reward = {}
770 for i = 1, drawCount[drawType] do 783 for i = 1, drawCount[drawType] do
771 784
@@ -779,6 +792,11 @@ function _M.drawHeroRpc(agent, data) @@ -779,6 +792,11 @@ function _M.drawHeroRpc(agent, data)
779 local idx = math.randWeight(resultPool, 3) 792 local idx = math.randWeight(resultPool, 3)
780 local temp = resultPool[idx] 793 local temp = resultPool[idx]
781 local itemData = csvdb["itemCsv"][temp[1]] 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 if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then 800 if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then
783 local fragId = itemData.id - ItemStartId.Hero 801 local fragId = itemData.id - ItemStartId.Hero
784 local heroData = csvdb["unitCsv"][fragId] 802 local heroData = csvdb["unitCsv"][fragId]
@@ -791,6 +809,10 @@ function _M.drawHeroRpc(agent, data) @@ -791,6 +809,10 @@ function _M.drawHeroRpc(agent, data)
791 end 809 end
792 end 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 SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组 816 SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组
795 return true 817 return true
796 end 818 end
src/actions/RoleAction.lua
@@ -284,17 +284,21 @@ function _M.saleItemRpc(agent, data) @@ -284,17 +284,21 @@ function _M.saleItemRpc(agent, data)
284 if not backs then return end 284 if not backs then return end
285 285
286 local reward = {} 286 local reward = {}
  287 + local fragCount = 0
287 for itemId, count in pairs(backs) do 288 for itemId, count in pairs(backs) do
288 if math.illegalNum(count, 1, role:getItemCount(itemId)) then return end 289 if math.illegalNum(count, 1, role:getItemCount(itemId)) then return end
289 local itemData = csvdb["itemCsv"][itemId] 290 local itemData = csvdb["itemCsv"][itemId]
290 if itemData.sell_effect == "" then return end 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 local sellEffect = itemData.sell_effect:toArray(true, "=") 295 local sellEffect = itemData.sell_effect:toArray(true, "=")
292 reward[sellEffect[1]] = (reward[sellEffect[1]] or 0) + sellEffect[2] * count 296 reward[sellEffect[1]] = (reward[sellEffect[1]] or 0) + sellEffect[2] * count
293 end 297 end
294 298
295 role:costItems(backs) 299 role:costItems(backs)
296 local reward = role:award(reward) 300 local reward = role:award(reward)
297 - 301 + role:checkTaskEnter("DecoFrag", {count = fragCount})
298 SendPacket(actionCodes.Role_saleItemRpc, MsgPack.pack({reward = reward})) 302 SendPacket(actionCodes.Role_saleItemRpc, MsgPack.pack({reward = reward}))
299 return true 303 return true
300 end 304 end
@@ -405,6 +409,7 @@ function _M.openTimeBoxRpc(agent, data) @@ -405,6 +409,7 @@ function _M.openTimeBoxRpc(agent, data)
405 409
406 boxL[slot] = nil 410 boxL[slot] = nil
407 reward = role:award(reward) 411 reward = role:award(reward)
  412 + role:checkTaskEnter("OpenBox")
408 else 413 else
409 return 414 return
410 end 415 end
@@ -459,5 +464,92 @@ function _M.unLockStoryBookRpc(agent, data) @@ -459,5 +464,92 @@ function _M.unLockStoryBookRpc(agent, data)
459 return true 464 return true
460 end 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 return _M 555 return _M
464 \ No newline at end of file 556 \ No newline at end of file
src/actions/TowerAction.lua
@@ -63,7 +63,7 @@ function _M.startBattleRpc(agent, data) @@ -63,7 +63,7 @@ function _M.startBattleRpc(agent, data)
63 towerInfo.k = key 63 towerInfo.k = key
64 64
65 role:updateProperty({field = "towerInfo", value = towerInfo}) 65 role:updateProperty({field = "towerInfo", value = towerInfo})
66 - 66 + role:checkTaskEnter("TowerBattle", {level = towerInfo.l})
67 SendPacket(actionCodes.Tower_startBattleRpc, '') 67 SendPacket(actionCodes.Tower_startBattleRpc, '')
68 return true 68 return true
69 end 69 end
@@ -91,6 +91,7 @@ function _M.endBattleRpc(agent, data) @@ -91,6 +91,7 @@ function _M.endBattleRpc(agent, data)
91 91
92 towerInfo.l = towerInfo.l + 1 92 towerInfo.l = towerInfo.l + 1
93 reward = role:award(curTower.reward) 93 reward = role:award(curTower.reward)
  94 + role:checkTaskEnter("TowerPass", {level = towerInfo.l - 1})
94 end 95 end
95 96
96 towerInfo.c = curCount 97 towerInfo.c = curCount
@@ -162,24 +162,31 @@ end @@ -162,24 +162,31 @@ end
162 162
163 163
164 --关卡通关,非层 score < 0 失败 164 --关卡通关,非层 score < 0 失败
165 -function Adv:over(success) 165 +function Adv:over(success, isAllPass)
166 local score = self:getScore() 166 local score = self:getScore()
167 local scoreInfo = self.score 167 local scoreInfo = self.score
168 local reward 168 local reward
169 if success then 169 if success then
170 reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap()) 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 local advL = self.owner:getProperty("advL") 177 local advL = self.owner:getProperty("advL")
  178 + local oldL = advL[1]
175 advL[2] = (advL[2] or 0) + 1 179 advL[2] = (advL[2] or 0) + 1
176 for level = ((advL[1] or 0) + 1), #csvdb["adv_rankCsv"] do 180 for level = ((advL[1] or 0) + 1), #csvdb["adv_rankCsv"] do
177 local ldata = csvdb["adv_rankCsv"][level] 181 local ldata = csvdb["adv_rankCsv"][level]
178 - if ldata.unlock >= advL[2] then 182 + if ldata.unlock <= advL[2] then
179 advL[1] = level 183 advL[1] = level
180 self.owner:award(ldata.reward) 184 self.owner:award(ldata.reward)
181 end 185 end
182 end 186 end
  187 + if advL[1] > oldL then
  188 + self.owner:checkTaskEnter("AdvLevel", {level = advL[1]})
  189 + end
183 self.owner:updateProperty("advL", advL) 190 self.owner:updateProperty("advL", advL)
184 191
185 if self.owner:isFuncOpen(FuncOpenType.AdvWheelSurf) then 192 if self.owner:isFuncOpen(FuncOpenType.AdvWheelSurf) then
@@ -434,7 +441,7 @@ local function clickOut(self, room, block, params) @@ -434,7 +441,7 @@ local function clickOut(self, room, block, params)
434 self:checkAchievement(Adv.AchievType.OverWin, 1, self.level) 441 self:checkAchievement(Adv.AchievType.OverWin, 1, self.level)
435 local levellimit = csvdb["adv_chapterCsv"][self.chapterId].limitlevel 442 local levellimit = csvdb["adv_chapterCsv"][self.chapterId].limitlevel
436 if params.relay or (not AdvCommon.isEndless(self.chapterId) and (self.level >= levellimit or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1))) then --关卡结束 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 else 445 else
439 self:initByChapter(self.chapterId, self.level + 1, true, true) 446 self:initByChapter(self.chapterId, self.level + 1, true, true)
440 self:backNext() --下一关 447 self:backNext() --下一关
@@ -485,9 +492,9 @@ local function chooseCommon(self, room, block, chooseData, choose) @@ -485,9 +492,9 @@ local function chooseCommon(self, room, block, chooseData, choose)
485 end 492 end
486 return true 493 return true
487 end, 494 end,
488 - --制定属性 > 495 + --制定属性
489 [4] = function() 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 return true 498 return true
492 end 499 end
493 end, 500 end,
@@ -497,6 +504,12 @@ local function chooseCommon(self, room, block, chooseData, choose) @@ -497,6 +504,12 @@ local function chooseCommon(self, room, block, chooseData, choose)
497 return true 504 return true
498 end 505 end
499 end, 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 assert(not cond[1] or checkCond[cond[1]], "error cond, event_[link]chooseCsv id :" .. block.event.id) 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,6 +801,7 @@ function Adv:usePotion(potionId, potionLevel, target)
788 end 801 end
789 self:afterRound() 802 self:afterRound()
790 self:saveDB() 803 self:saveDB()
  804 + self.owner:checkTaskEnter("AdvUsePotion")
791 return true 805 return true
792 end 806 end
793 807
src/adv/AdvBattle.lua
@@ -197,6 +197,8 @@ function Battle:battleBegin(roomId, blockId, params) @@ -197,6 +197,8 @@ function Battle:battleBegin(roomId, blockId, params)
197 if player.hp > 0 then 197 if player.hp > 0 then
198 enemy:hurt(enemy.hp, self.player, {hurtType = 5}) 198 enemy:hurt(enemy.hp, self.player, {hurtType = 5})
199 self.player:effectBattleBuff() 199 self.player:effectBattleBuff()
  200 +
  201 + self.adv.owner:checkTaskEnter("AdvBattleWin", {id = self.adv.chapterId})
200 end 202 end
201 if player.hp > self.player.hp then 203 if player.hp > self.player.hp then
202 self.player:recover(player.hp - self.player.hp, player) 204 self.player:recover(player.hp - self.player.hp, player)
src/adv/AdvBlock.lua
@@ -118,6 +118,7 @@ function Block:open() @@ -118,6 +118,7 @@ function Block:open()
118 randomFunc[self:getEventType()]() 118 randomFunc[self:getEventType()]()
119 end 119 end
120 end 120 end
  121 + adv.owner:checkTaskEnter("AdvOpenBlock")
121 self.isOpen = true 122 self.isOpen = true
122 end 123 end
123 124
src/adv/AdvBuff.lua
@@ -20,6 +20,7 @@ Buff.HP_CHANGE_NOW = 16 -- 生命变化(每回合生效,立刻生效) @@ -20,6 +20,7 @@ Buff.HP_CHANGE_NOW = 16 -- 生命变化(每回合生效,立刻生效)
20 Buff.BATTLE_BUFF = 17 -- 切换为战斗中的buff 20 Buff.BATTLE_BUFF = 17 -- 切换为战斗中的buff
21 Buff.CHANGE_DROP = 18 -- 转换掉落 21 Buff.CHANGE_DROP = 18 -- 转换掉落
22 Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技 22 Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技
  23 +Buff.EXP_ADD = 20 -- 增加exp(每回合)
23 24
24 --角色一些属性的变化 25 --角色一些属性的变化
25 local function commonAttr(_Buff, attrName) 26 local function commonAttr(_Buff, attrName)
@@ -59,7 +60,7 @@ local BuffFactory = { @@ -59,7 +60,7 @@ local BuffFactory = {
59 if value > 0 then 60 if value > 0 then
60 self.owner:recover(value, self.release) 61 self.owner:recover(value, self.release)
61 elseif value < 0 then 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 end 64 end
64 end 65 end
65 _Buff._effectValue = function(self) 66 _Buff._effectValue = function(self)
@@ -193,6 +194,7 @@ local BuffFactory = { @@ -193,6 +194,7 @@ local BuffFactory = {
193 return self.buffData.effectValue2, self.buffData.effectValue1 194 return self.buffData.effectValue2, self.buffData.effectValue1
194 end 195 end
195 end, 196 end,
  197 +
196 [Buff.HP_CHANGE_NOW] = function(_Buff) 198 [Buff.HP_CHANGE_NOW] = function(_Buff)
197 _Buff._init = function(self, data) --初始化变化值 199 _Buff._init = function(self, data) --初始化变化值
198 self._changeV = 0 200 self._changeV = 0
@@ -215,7 +217,7 @@ local BuffFactory = { @@ -215,7 +217,7 @@ local BuffFactory = {
215 if value > 0 then 217 if value > 0 then
216 self.owner:recover(value, self.release) 218 self.owner:recover(value, self.release)
217 elseif value < 0 then 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 end 221 end
220 end 222 end
221 _Buff._effectValue = function(self) 223 _Buff._effectValue = function(self)
@@ -225,6 +227,17 @@ local BuffFactory = { @@ -225,6 +227,17 @@ local BuffFactory = {
225 return {cv = self._changeV} 227 return {cv = self._changeV}
226 end 228 end
227 end, 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 function Buff:ctor(owner, id) 243 function Buff:ctor(owner, id)
src/adv/AdvPlayer.lua
@@ -224,7 +224,7 @@ function BaseObject:getInjuredValue(value) @@ -224,7 +224,7 @@ function BaseObject:getInjuredValue(value)
224 end 224 end
225 225
226 --最终伤害 = [ (敌方攻击 - 己方防御) * (1+伤害增加百分比-伤害减少百分比)*(1+受伤增加百分比-受伤减少百分比)+(伤害增加固定值-伤害增加固定值+受伤增加固定值-受伤增加固定值)]*(1+侍宠百分比)-侍宠固定值 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 function BaseObject:hurt(value, releaser, params) 229 function BaseObject:hurt(value, releaser, params)
230 params = params or {} 230 params = params or {}
@@ -245,7 +245,7 @@ function BaseObject:hurt(value, releaser, params) @@ -245,7 +245,7 @@ function BaseObject:hurt(value, releaser, params)
245 team:triggerPassive(Passive.TEAM_HURT, {trigger = releaser}) 245 team:triggerPassive(Passive.TEAM_HURT, {trigger = releaser})
246 end 246 end
247 end 247 end
248 - if params.hurtType ~= 5 then 248 + if params.hurtType ~= 5 and params.hurtType ~= 6 then
249 if not params.hurtType or params.hurtType ~= 4 then 249 if not params.hurtType or params.hurtType ~= 4 then
250 value = self:getInjuredValue(value) --减伤计算 250 value = self:getInjuredValue(value) --减伤计算
251 end 251 end
@@ -308,7 +308,7 @@ function BaseObject:hurt(value, releaser, params) @@ -308,7 +308,7 @@ function BaseObject:hurt(value, releaser, params)
308 team:triggerPassive(Passive.TEAM_DEAD) 308 team:triggerPassive(Passive.TEAM_DEAD)
309 end 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 self.battle.adv:checkAchievement(self.battle.adv.AchievType.KillByBuff, 1, params.buffId) 312 self.battle.adv:checkAchievement(self.battle.adv.AchievType.KillByBuff, 1, params.buffId)
313 end 313 end
314 314
@@ -350,7 +350,7 @@ function BaseObject:releaseSkill(skillId, target) @@ -350,7 +350,7 @@ function BaseObject:releaseSkill(skillId, target)
350 end 350 end
351 351
352 --0 全部 1 我方 2 敌方 352 --0 全部 1 我方 2 敌方
353 -function BaseObject:getTeam(nType, noSelf, mapIdx) 353 +function BaseObject:getTeam(nType, noSelf, mapIdx, includeLock)
354 mapIdx = mapIdx or self.battle.adv:getCurMapIdx() 354 mapIdx = mapIdx or self.battle.adv:getCurMapIdx()
355 nType = nType or 0 355 nType = nType or 0
356 local team = {} 356 local team = {}
@@ -364,7 +364,7 @@ function BaseObject:getTeam(nType, noSelf, mapIdx) @@ -364,7 +364,7 @@ function BaseObject:getTeam(nType, noSelf, mapIdx)
364 local function addEnemy() 364 local function addEnemy()
365 for _, enemy in pairs(self.battle.enemys[mapIdx]) do 365 for _, enemy in pairs(self.battle.enemys[mapIdx]) do
366 if not noSelf or enemy ~= self then 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 table.insert(team, enemy) 368 table.insert(team, enemy)
369 end 369 end
370 end 370 end
src/models/Diner.lua
@@ -178,6 +178,7 @@ function Diner:updateSell(slot, calOnly) @@ -178,6 +178,7 @@ function Diner:updateSell(slot, calOnly)
178 self:checkDinerTask(DinerTask.SellDish, deltaCount, sell.dish) 178 self:checkDinerTask(DinerTask.SellDish, deltaCount, sell.dish)
179 self:checkDinerTask(DinerTask.SellDishType, deltaCount, math.ceil(sell.dish / 100)) 179 self:checkDinerTask(DinerTask.SellDishType, deltaCount, math.ceil(sell.dish / 100))
180 self:checkDinerTask(DinerTask.SellDishRare, deltaCount, dishData.rarity) 180 self:checkDinerTask(DinerTask.SellDishRare, deltaCount, dishData.rarity)
  181 + self.owner:checkTaskEnter("FoodSell", {count = deltaCount})
181 end 182 end
182 return { 183 return {
183 deltaCount = deltaCount, 184 deltaCount = deltaCount,
@@ -250,6 +251,7 @@ function Diner:popularAdd(popular) @@ -250,6 +251,7 @@ function Diner:popularAdd(popular)
250 local roleId = self.owner:getProperty("id") 251 local roleId = self.owner:getProperty("id")
251 -- 更新排行榜 252 -- 更新排行榜
252 local curPopular = self:getProperty("popular") 253 local curPopular = self:getProperty("popular")
  254 + self.owner:checkTaskEnter("DinerPopular", {count = curPopular})
253 redisproxy:pipelining(function (red) 255 redisproxy:pipelining(function (red)
254 red:zadd(dbKey, curPopular, roleId) --更新分数 256 red:zadd(dbKey, curPopular, roleId) --更新分数
255 red:hset(RANK_DINER_INFO, roleId, MsgPack.pack({ 257 red:hset(RANK_DINER_INFO, roleId, MsgPack.pack({
src/models/Role.lua
@@ -75,7 +75,13 @@ Role.schema = { @@ -75,7 +75,13 @@ Role.schema = {
75 towerInfo = {"table", {c = globalCsv.tower_count_limit, l = 1}}, -- 当天爬塔消耗的次数 -- {t = time, c = count, l = layer, k = battleKey} 75 towerInfo = {"table", {c = globalCsv.tower_count_limit, l = 1}}, -- 当天爬塔消耗的次数 -- {t = time, c = count, l = layer, k = battleKey}
76 towerF = {"table", {}}, -- 爬塔阵容 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,7 +219,10 @@ function Role:data()
213 towerInfo = self:getProperty("towerInfo"), 219 towerInfo = self:getProperty("towerInfo"),
214 towerF = self:getProperty("towerF"), 220 towerF = self:getProperty("towerF"),
215 spTask = self:getProperty("spTask"), 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 end 227 end
219 228
src/models/RolePlugin.lua
@@ -27,15 +27,24 @@ function RolePlugin.bind(Role) @@ -27,15 +27,24 @@ function RolePlugin.bind(Role)
27 27
28 self.dailyData:refreshDailyData(notify) 28 self.dailyData:refreshDailyData(notify)
29 self.dinerData:refreshDailyData(notify) 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 if notify then 39 if notify then
32 self:notifyUpdateProperties(response) 40 self:notifyUpdateProperties(response)
33 end 41 end
34 - 42 +
35 if RESET_TIME == RESET_RANK_TIME then 43 if RESET_TIME == RESET_RANK_TIME then
36 self:onResetRank_raw(ltime, now, notify) 44 self:onResetRank_raw(ltime, now, notify)
37 end 45 end
38 self:setProperty("ltime", now) 46 self:setProperty("ltime", now)
  47 +
39 return true 48 return true
40 end 49 end
41 end 50 end
@@ -114,12 +123,13 @@ function RolePlugin.bind(Role) @@ -114,12 +123,13 @@ function RolePlugin.bind(Role)
114 local typ = math.floor((itemId-7000)/100) 123 local typ = math.floor((itemId-7000)/100)
115 local lv = (itemId-7000)%100 124 local lv = (itemId-7000)%100
116 self:addEquip(typ, lv, count ,pms) 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 end, 128 end,
119 [ItemType.Rune] = function() 129 [ItemType.Rune] = function()
120 local typ = math.floor((itemId-2000)/100) 130 local typ = math.floor((itemId-2000)/100)
121 for _= 1, count do 131 for _= 1, count do
122 - self:addRune({type = typ,id = itemId}) 132 + self:addRune({type = typ,id = itemId, pms.notNotify})
123 end 133 end
124 end, 134 end,
125 [ItemType.AdvItem] = function() --冒险道具不会进入 玩家仓库 135 [ItemType.AdvItem] = function() --冒险道具不会进入 玩家仓库
@@ -323,7 +333,8 @@ function RolePlugin.bind(Role) @@ -323,7 +333,8 @@ function RolePlugin.bind(Role)
323 local roleId = self:getProperty("id") 333 local roleId = self:getProperty("id")
324 local heroType = params.type 334 local heroType = params.type
325 if self:isHaveHero(heroType) then return end 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 local heroId = tonum(redisproxy:hincrby(string.format(R_INCR, roleId), "hero", 1)) 339 local heroId = tonum(redisproxy:hincrby(string.format(R_INCR, roleId), "hero", 1))
329 340
@@ -341,7 +352,7 @@ function RolePlugin.bind(Role) @@ -341,7 +352,7 @@ function RolePlugin.bind(Role)
341 newHero.owner = self 352 newHero.owner = self
342 newHero:saveBattleValue() 353 newHero:saveBattleValue()
343 self.heros[heroId] = newHero 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 if not params.notNotify then 356 if not params.notNotify then
346 local heroResponse = {} 357 local heroResponse = {}
347 table.insert(heroResponse, newHero:data()) 358 table.insert(heroResponse, newHero:data())
@@ -498,6 +509,7 @@ function RolePlugin.bind(Role) @@ -498,6 +509,7 @@ function RolePlugin.bind(Role)
498 table.insert(response, newRune:data()) 509 table.insert(response, newRune:data())
499 SendPacket(actionCodes.Role_loadRunes, MsgPack.pack(response)) 510 SendPacket(actionCodes.Role_loadRunes, MsgPack.pack(response))
500 end 511 end
  512 + self:checkTaskEnter("AddRune", {id = params.id, type = params.type, rarity = set.rarity}, params.notNotify)
501 return 0 513 return 0
502 else 514 else
503 return 1 515 return 1
src/models/RoleTask.lua
@@ -2,20 +2,79 @@ @@ -2,20 +2,79 @@
2 2
3 -- 增加 checkTaskEnter 内的参数 记得增加注释 3 -- 增加 checkTaskEnter 内的参数 记得增加注释
4 local TaskType = { 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 LoveBreak = 3, -- 好感度进阶 - heroType loveL 8 LoveBreak = 3, -- 好感度进阶 - heroType loveL
8 Wake = 4, -- 觉醒 - heroType wakeL 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 local function v(value) 80 local function v(value)
@@ -26,19 +85,95 @@ local function f(field) @@ -26,19 +85,95 @@ local function f(field)
26 return {type = "field", value = field} 85 return {type = "field", value = field}
27 end 86 end
28 87
  88 +-- 剧情任务监听
29 local StoryListener = { 89 local StoryListener = {
30 func = "checkStoryStatus", 90 func = "checkStoryStatus",
31 listen = { 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 local TaskListeners = { 173 local TaskListeners = {
41 StoryListener, 174 StoryListener,
  175 + CommonListener,
  176 + AchievListener,
42 } 177 }
43 178
44 local RoleTask = {} 179 local RoleTask = {}
@@ -54,33 +189,26 @@ function RoleTask.bind(Role) @@ -54,33 +189,26 @@ function RoleTask.bind(Role)
54 for _, listener in ipairs(TaskListeners) do 189 for _, listener in ipairs(TaskListeners) do
55 if listener and listener.listen and listener.listen[taskType] and listener["func"] then 190 if listener and listener.listen and listener.listen[taskType] and listener["func"] then
56 local pms = {} 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 else 202 else
64 table.insert(pms, v) 203 table.insert(pms, v)
65 end 204 end
66 - else  
67 - table.insert(pms, v)  
68 end 205 end
  206 + self[listener["func"]](self, notNotify, table.unpack(pms))
69 end 207 end
70 - self[listener["func"]](self, notNotify, table.unpack(pms))  
71 end 208 end
72 end 209 end
73 end 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 --剧情相关----begin------------- 212 --剧情相关----begin-------------
85 local function checkStoryStatusByHang(role, data, status, cond1) -- cond1 carbonId 213 local function checkStoryStatusByHang(role, data, status, cond1) -- cond1 carbonId
86 if tonumber(data.unlockData) ~= cond1 then return end 214 if tonumber(data.unlockData) ~= cond1 then return end
@@ -158,6 +286,147 @@ function RoleTask.bind(Role) @@ -158,6 +286,147 @@ function RoleTask.bind(Role)
158 end 286 end
159 287
160 --剧情相关----end------------- 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 end 430 end
162 431
163 return RoleTask 432 return RoleTask
164 \ No newline at end of file 433 \ No newline at end of file