-- 增加 checkTaskEnter 内的参数 记得增加注释 local TaskType = { -- hero 相关 DrawHero = 1, -- 招募 - pool count AddHero = 2, -- 增加角色 - heroType wakeL camp job LoveBreak = 3, -- 好感度进阶 - heroType loveL Wake = 4, -- 觉醒 - heroType wakeL HeroLevelUp = 5, -- 角色升级 - level DecoFrag = 6, -- 碎片分解 - count WakeCG = 7, -- 觉醒到解锁CG - heroType HeroTalent = 8, -- 天赋升级 - heroType alv DrawSSR = 9, -- 抽到SSR - count HeroLvlCollect = 10, -- 英雄等级收集进度 HeroQualityCollect = 11, -- 英雄品质收集进度 HeroStarCollect = 12, -- 英雄星级收集进度 DrawHeroNotFriend = 13, -- 非友情招募 -- count DrawHeroLimitPack = 14, -- 抽卡限时礼貌 -- count HeroStartSum = 15, -- 英雄星级总数 WakeCGSum = 16, -- 累计解锁xx张CG --装备相关 AddEquip = 101, -- 获得装备 - equipId rarity SaleEquip = 102, -- 出售装备 - count EquipUp = 103, -- 装备强化 - count -- 符文(零件)相关 RuneUp = 201, -- 符文强化 DecoRune = 202, -- 分解符文 - count AddRune = 203, -- 分解符文 - id type rarity -- 挂机相关 HangPass = 301, -- 挂机通关 - id HangGet = 302, -- 挂机收货 HangQuick = 303, -- 快速挂机 HangBattle = 304, -- 挂机战斗 - id HangGetGold = 305, -- 挂机获得齿轮 - count BonusPass = 306, -- 奖励副本通关 - id count BonusQuick = 307, -- 奖励关卡扫荡 -- id count -- 冒险相关 AdvPass = 401, -- 冒险通过关 - id level score AdvStart = 402, -- 冒险开始(包括挂机) - id AdvBattleWin = 403, -- 冒险内战斗胜利 - id AdvAllPass = 404, -- 冒险章节通关 - id AdvLevel = 405, -- 探险者协会升级 - level AdvOverTask = 406, -- 完成任务 - id AdvOpenBlock = 407, -- 打开地块 - id AdvUsePotion = 408, -- 使用营养剂 AdvStartSelf = 409, -- 手动冒险 - id AdvScore = 410, -- 冒险分数 - score AdvDraw = 411, -- 冒险资助 - count ptype AdvHang = 412, -- 代理拾荒次数 AdvMineKill = 413, -- 宝藏怪击杀 AdvMineLayer = 414, -- 宝藏洞激活 AdvKillBoss = 415, -- 拾荒击杀boss AdvHangHeroCnt = 416, -- 拾荒人数 AdvCostPower = 417, -- 消耗体力 AdvPassFirst = 418, -- 冒险首次通关 - id AdvUseItem = 419, -- 使用道具 - itemId count AdvBuild = 420, -- 建筑交互 - buildId AdvKill = 421, -- 拾荒击败敌人 AdvHangTime = 422, -- 代理拾荒时间 - count --爬塔相关 TowerPass = 501, -- 爬塔通关 - level TowerBattle = 502, -- 爬塔战斗 - level -- 餐厅相关 FoodMGet = 601, -- 食材获取 MakeFood = 602, -- 制作料理 - id count GetOderTask = 603, -- 接受餐厅订单 - rarity OverOderTask = 604, -- 完成特别订单 - rarity FoodSell = 605, -- 料理贩卖 - count FoodSellQuick = 606, -- 料理快速贩卖 FoodSellGold = 607, -- 贩卖获得齿轮 - count DinerPopular = 608, -- 人气值 - count DinerLevelUp = 609, -- 餐厅升级 - level type DinerTalentUp = 610, -- 天赋升级 - type level VillageApply = 611, -- 餐厅委托个数 -- 车厢相关 PotionMake = 701, -- 营养剂制作 - id count OpenBox = 702, -- 拆解时间箱 - id SupportSkill = 703, -- 后勤支援技升级 - id level -- pvp相关 PvpWin = 751, -- pvp胜利 - score PvpBattle = 752, -- pvp挑战 --好友相关 GiveFriendP = 801, -- 赠送友情点 - count AddFriend = 802, -- 加入一个好友 - count GetFriendP = 803, -- 获得友情点 - count -- 角色相关 RoleLevelUp = 851, -- 角色升级 - curlevel RuneQualityCollect = 852, -- 铭文品质收集进度 -- 其他相关 SignIn = 901, -- 签到 Pay = 902, -- 充值 ShopAll = 903, -- 在任意商店购买 DailyTask = 904, -- 完成每日活跃任务 RadioTaskStart = 905, -- 电台任务开始 FinishSpeTask = 906, -- 指定任务完成 AddItem = 907, -- 获得道具 Login = 908, -- 登入 CostDiamond = 909, -- 消耗钻石 WeekTask = 910, -- 完成每周活跃任务 ActBattlePass = 911, -- 活动关卡通关 -- chapterId Appoint = 912, -- 触发限时礼包,指定id Rename = 913, -- 重命名 CostJade = 914, -- 消耗虹光玉 BuyLimitPack = 915, -- 购买指定id礼包触发 --功能未实现 todo AdvShop = 1002, -- 冒险商城 UnionBoss = 1004, -- 工会boss UnionBattle = 1005, -- 工会战 AddUnion = 1006, -- 加入一个公会 BindPhone = 1008, -- 绑定手机 WeChat = 1009, -- 关注微信 WeBlog = 1010, -- 关注微博 } local function f(field, func) return {type = "field", value = field, func = func} end -- 剧情任务监听 local StoryListener = { func = "checkStoryStatus", listen = { [TaskType.HangPass] = {{1, f("id")}}, [TaskType.AdvPass] = {{4, f("id")}}, [TaskType.LoveBreak] = {{2, f("heroType")}}, [TaskType.Wake] = {{3, f("heroType"), f("wakeL")}}, [TaskType.AddHero] = {{3, f("heroType"), f("wakeL")}}, } } -- 通用任务监听 local CommonListener = { func = "checkCommonTasks", listen = { [TaskType.HangGet] = {{1}}, [TaskType.HangQuick] = {{2}}, [TaskType.HangBattle] = {{3}}, [TaskType.DrawHero] = {{4, f("count"), f("pool")}}, [TaskType.TowerBattle] = {{5}}, [TaskType.PvpBattle] = {{6}}, [TaskType.PvpWin] = {{7}}, [TaskType.AdvStart] = {{8}}, [TaskType.AdvBattleWin] = {{9}}, [TaskType.AdvShop] = {{10}}, [TaskType.GetOderTask] = {{11}}, [TaskType.OverOderTask] = {{12}}, [TaskType.MakeFood] = {{13, f("count")}}, [TaskType.FoodSell] = {{14, f("count")}}, [TaskType.FoodSellQuick] = {{15}}, [TaskType.FoodMGet] = {{16}}, [TaskType.HeroLevelUp] = {{17}}, [TaskType.Wake] = {{18}}, [TaskType.EquipUp] = {{19, f("count")}}, [TaskType.GiveFriendP] = {{20, f("count")}}, [TaskType.UnionBoss] = {{21}}, [TaskType.GetFriendP] = {{22, f("count")}}, [TaskType.BonusPass] = {{23, f("count")}}, [TaskType.AdvStartSelf] = {{24}}, [TaskType.ShopAll] = {{25, f("count")}}, [TaskType.RuneUp] = {{26}}, [TaskType.OpenBox] = {{27, f("count"), f("id")}}, [TaskType.AdvDraw] = {{28, f("count"), f("ptype")}}, [TaskType.PotionMake] = {{29, f("count"), f("id")}}, } } -- 成就监听 local AchievListener = { func = "checkAchievTask", listen = { [TaskType.HangPass] = {{1, f("id")}}, [TaskType.UnionBattle] = {{2}}, [TaskType.PvpWin] = {{3}, {4, f("score")}}, [TaskType.AdvAllPass] = {{5, 1, f("id")}}, [TaskType.AdvLevel] = {{6, f("level")}}, [TaskType.AdvScore] = {{7, f("score")}}, [TaskType.AdvBattleWin] = {{8}}, [TaskType.AdvOverTask] = {{9}}, [TaskType.AdvOpenBlock] = {{10}}, [TaskType.AdvUsePotion] = {{11}}, [TaskType.AdvStart] = {{12}}, [TaskType.FoodSell] = {{13, f("count")}}, [TaskType.OverOderTask] = {{14}}, [TaskType.FoodSellGold] = {{15, f("count")}}, [TaskType.DinerPopular] = {{16, f("count")}}, [TaskType.TowerPass] = {{17, f("level"), f("type")}}, [TaskType.OpenBox] = {{18, f("count")}}, [TaskType.DinerLevelUp] = {{19, f("level"), f("type")}}, [TaskType.DinerTalentUp] = {{20, 1, f("type")}}, [TaskType.HangGetGold] = {{21, f("count")}}, [TaskType.HeroLevelUp] = {{22, f("level")}}, [TaskType.Wake] = {{23, f("wakeL")}}, [TaskType.WakeCG] = {{24}}, [TaskType.HeroTalent] = {{25, f("alv")}}, [TaskType.AddHero] = {{26, f("heroType")}, {27}}, [TaskType.DrawSSR] = {{28, f("count")}}, [TaskType.DrawHero] = {{29, f("count"), f("pool")}}, [TaskType.AddEquip] = {{30, f("rarity")}, {34, 1, f("rarity")}}, [TaskType.AddRune] = {{31, f("rarity")}, {35, 1, f("rarity")}}, [TaskType.EquipUp] = {{32, f("count")}}, [TaskType.RuneUp] = {{33}}, [TaskType.AddUnion] = {{36}}, [TaskType.AddFriend] = {{37, f("count")}}, [TaskType.BindPhone] = {{38, 1}}, [TaskType.WeChat] = {{38, 2}}, [TaskType.WeBlog] = {{38, 3}}, [TaskType.SignIn] = {{39}}, } } local SudokuListener = { func = "checkSudokuTask", listen = { [TaskType.HangPass] = {{1, 1, f("id")}}, [TaskType.DrawHero] = {{4, f("count")}}, [TaskType.HeroLevelUp] = {{5, f("level")}}, [TaskType.Wake] = {{6, f("wakeL")}}, [TaskType.AddFriend] = {{7, f("count")}}, [TaskType.GetFriendP] = {{8, f("count")}}, [TaskType.AdvStart] = {{9, 1}}, [TaskType.AdvDraw] = {{10, f("count")}}, [TaskType.DinerLevelUp] = {{11, f("level"), f("type")}}, [TaskType.FoodSell] = {{12, f("count")}}, [TaskType.OpenBox] = {{13, f("count")}}, [TaskType.TowerPass] = {{14, f("level")}}, [TaskType.PvpWin] = {{15, 1}}, [TaskType.DinerTalentUp] = {{16, f("level"), f("type")}}, [TaskType.RuneUp] = {{17, 1}}, [TaskType.Rename] = {{20, 1}}, } } local Activity = require("models.Activity") local ActivityListener = { func = "checkActivityTask", listen = { [TaskType.DrawHero] = {{Activity.ActivityType.DrawHero, f("count"), f("pool")}}, [TaskType.FoodSell] = {{Activity.ActivityType.FoodSell, f("count")}}, [TaskType.AdvDraw] = {{Activity.ActivityType.AdvDraw, f("count")}}, [TaskType.OpenBox] = {{Activity.ActivityType.OpenBox, f("count")}}, [TaskType.Pay] = {{Activity.ActivityType.PayBack, f("twd")}}, [TaskType.AdvMineKill] = {{Activity.ActivityType.Crisis, 1}}, [TaskType.AdvMineLayer] = {{Activity.ActivityType.Crisis, 2}}, [TaskType.AdvCostPower] = {{Activity.ActivityType.Crisis, 3, f("count")}}, [TaskType.DailyTask] = {{Activity.ActivityType.CommonSignIn, f("pre"), f("cur")}}, [TaskType.AddItem] = {{Activity.ActivityType.BattleCommand, f("id"), f("count")}}, [TaskType.AdvHangTime] = {{Activity.ActivityType.Crisis, 4, f("count")}}, [TaskType.AdvKillBoss] = {{Activity.ActivityType.Crisis, 5}}, } } local StoreListener = { func = "checkStoreTask", listen = { [TaskType.HangPass] = {{TriggerEventType.HangPass, f("id")}}, [TaskType.RoleLevelUp] = {{TriggerEventType.LevelUp, f("level")}}, [TaskType.TowerPass] = {{TriggerEventType.TowerPass, f("level")}}, [TaskType.AdvPassFirst] = {{TriggerEventType.AdvPass, f("id")}}, [TaskType.AddHero] = {{TriggerEventType.AddNewHero, f("heroType")}, {TriggerEventType.SSRCount, f("ssrCount")}}, [TaskType.DrawHeroLimitPack] = {{TriggerEventType.DrawHeroCnt, f("count")}}, [TaskType.Appoint] = {{TriggerEventType.Appoint, f("id")}}, [TaskType.SignIn] = {{TriggerEventType.SignIn, 1}}, [TaskType.DrawHero] = {{TriggerEventType.DrawHero, f("count")}}, [TaskType.FoodSell]= {{TriggerEventType.FoodSell, f("count")}}, [TaskType.RuneUp] = {{TriggerEventType.RuneUp, 1}}, [TaskType.CostDiamond] = {{TriggerEventType.CostDiamond, f("count")}}, [TaskType.BuyLimitPack] = {{TriggerEventType.BuyLimitPack, f("id")}}, [TaskType.HeroTalent] = {{TriggerEventType.HeroTalent, f("count")}}, } } local CalendaTaskListener = { func = "checkCalendaTask", listen = { [TaskType.DrawHero] = {{1, 1, f("count")}}, [TaskType.BonusPass]= {{2, 1, f("count")}}, [TaskType.AdvStart]= {{3, 1}}, [TaskType.DinerLevelUp]= {{4, 2, f("level")}}, [TaskType.HeroLvlCollect]= {{5, 3}}, -- x名y级英雄 [TaskType.AdvHang]= {{6, 3, f("actid")}}, ---- [TaskType.HeroQualityCollect]= {{7, 3}}, [TaskType.OverOderTask]= {{8, 1}}, [TaskType.VillageApply]= {{9, 1}}, [TaskType.PvpWin]= {{10, 2, f("score")}}, [TaskType.DinerPopular]= {{11, 2, f("count")}}, [TaskType.RoleLevelUp]= {{12, 2, f("level")}}, [TaskType.TowerPass]= {{13, 3, f("level"), f("type")}}, [TaskType.HeroTalent]= {{14, 1}}, [TaskType.HangPass]= {{15, 3}}, [TaskType.HeroStarCollect]= {{16, 3}}, [TaskType.FoodSell]= {{17, 1, f("count")}}, [TaskType.HangGet]= {{18, 3, f("reward")}}, [TaskType.RuneQualityCollect]= {{19, 3}}, [TaskType.OpenBox]= {{20, 3, f("count"), f("quality")}}, [TaskType.RadioTaskStart] = {{21, 1}, {22, 3, f("heroCnt")}}, [TaskType.BonusQuick] = {{23, 1, f("count")}}, [TaskType.AdvHangHeroCnt] = {{24, 3, f("count")}}, [TaskType.AdvKillBoss] = {{25, 1}}, [TaskType.AdvMineKill] = {{26, 1}}, [TaskType.PvpBattle] = {{27, 1}}, [TaskType.FinishSpeTask] = {{28, 3, f("taskId"), f("actId")}}, [TaskType.Login] = {{29, 1}}, [TaskType.DailyTask] = {{30, 2, f("cur")}}, [TaskType.WeekTask] = {{31, 2, f("cur")}}, [TaskType.MakeFood] = {{32, 1, f("count")}}, [TaskType.AddItem] = {{33, 3, f("type"), f("count")}, {42, 3, f("id"), f("count")}}, [TaskType.CostDiamond] = {{34, 1, f("count")}}, [TaskType.DrawHeroNotFriend] = {{35, 1, f("count")}}, [TaskType.AdvCostPower] = {{36, 1, f("count")}}, [TaskType.AdvUseItem] = {{37, 3, f("itemId"), f("count")}}, [TaskType.AdvBuild] = {{38, 3, f("buildId")}}, [TaskType.AdvKill] = {{39, 1, f("chapterId")}}, [TaskType.ActBattlePass] = {{40, 3, f("chapterId")}}, [TaskType.AdvPass] = {{41, 3, f("id")}}, [TaskType.CostJade] = {{43, 1, f("count")}}, [TaskType.HeroStartSum] = {{44, 3}}, [TaskType.WakeCGSum] = {{45, 1, f("count")}}, } } local BattleCommandTaskListener = { func = "checkBattleCommandTask", listen = CalendaTaskListener["listen"] } local NewUserTaskListener = { func = "checkNewUserTask", listen = CalendaTaskListener["listen"] } local ReturnerTask = { func = "checkReturnerTask", listen = CalendaTaskListener["listen"] } local TaskListeners = { StoryListener, CommonListener, AchievListener, SudokuListener, ActivityListener, StoreListener, CalendaTaskListener, BattleCommandTaskListener, ReturnerTask, NewUserTaskListener, } local RoleTask = {} function RoleTask.bind(Role) -- 任务相关入口 function Role:checkTaskEnter(taskType, params, notNotify) params = params or {} if type(taskType) == "string" then taskType = TaskType[taskType] end for _, listener in ipairs(TaskListeners) do if listener and listener.listen and listener.listen[taskType] and listener["func"] then for _, vs in ipairs(listener.listen[taskType]) do local pms = {} for __, v in ipairs(vs) do if type(v) == "table" and v.type then if v.type == "field" then local value = params[v.value] if v.func then value = v.func(value) end table.insert(pms, value) else table.insert(pms, v) end else table.insert(pms, v) end end self[listener["func"]](self, notNotify, table.unpack(pms)) end end end end --剧情相关----begin------------- local function checkStoryStatusByHang(role, data, status, cond1) -- cond1 carbonId if tonumber(data.unlockData) ~= cond1 then return end status.s = 1 return true end local function checkStoryStatusByLove(role, data, status, cond1) -- cond1 heroType -- if data.sort ~= cond1 then return end -- local curL = role:getProperty("loveStatus"):getv(cond1, 0) -- if curL < tonumber(data.unlockData) then return end -- status.s = 1 -- return true end local function checkStoryStatusByMultStar(role, data, status, cond1, cond2) -- cond1 heroType, cond2 wakeL local heroType = cond1 local need = data.unlockData:toArray(true, "=") local had = false for _, v in pairs(need) do if v == heroType then had = true break end end if not had then return end if cond2 > (status["s" .. heroType] or 0) then status["s" .. heroType] = cond2 end local starC = 0 for _, v in pairs(need) do starC = starC + (status["s" .. v] or 0) end if starC >= tonumber(data.unlockData2) then table.clear(status) status.s = 1 end return true end local function checkStoryStatusByAdv(role, data, status, cond1) -- cond1 advId if tonumber(data.unlockData) ~= cond1 then return end status.s = 1 return true end local function checkStoryStatusByActBattle(role, data, status, cond1) -- cond1 carbonId local actid = data.sort if not role.activity:isOpenById(actid) then return end if cond1 and tonumber(data.unlockData) == cond1 then status.s = 1 return true end return end local checkstoryStatusFunc = { [1] = checkStoryStatusByHang, [2] = checkStoryStatusByLove, [3] = checkStoryStatusByMultStar, [4] = checkStoryStatusByAdv, [5] = checkStoryStatusByActBattle, } function Role:checkStoryStatus(notNotify, stype, cond1, cond2, cond3) local storyBookStatus = self:getProperty("storyB") local change = {} for id, data in pairs(csvdb["story_bookCsv"]) do if stype == data.unlockType and checkstoryStatusFunc[stype] then local curStatus = storyBookStatus[id] or {} if not curStatus.s then -- 存在状态就是已经完成 local isChange = checkstoryStatusFunc[stype](self, data, curStatus, cond1, cond2, cond3) if isChange then storyBookStatus[id] = curStatus table.insert(change, {type = "storyB", field = id, value = curStatus, isOnlyToC = true}) end end end end if next(change) then self:setProperty("storyB", storyBookStatus) -- 统一写入数据库 if not notNotify then self:changeUpdates(change) end end end --剧情相关----end------------- function Role:checkCommonTasks(notNotify, stype, count, cond1, cond2) count = count or 1 self:checkLoopTask(notNotify, stype, count, cond1, cond2) end function Role:checkLoopTask(notNotify, stype, count, cond1, cond2) local tasks = {self:getProperty("dTask")["t"] or {}, self:getProperty("wTask")["t"] or {}} local isChange = {false, false} for key, status in ipairs(tasks) do local taskDatas = csvdb["task_loopCsv"][key] for taskId, data in pairs(taskDatas) do if status[taskId] ~= -1 and data.type == stype and (data.condition2 == 0 or data.condition2 == cond1) then status[taskId] = (status[taskId] or 0) + count isChange[key] = 1 self:mylog("role_action", {desc = "onTask", int1 = taskId, int2 = status[taskId], short1 = key, cint1 = data.condition1}) end end end local change = {} if isChange[1] then table.insert(change, {type = "dTask", field = "t", value = tasks[1]}) end if isChange[2] then table.insert(change, {type = "wTask", field = "t", value = tasks[2]}) end if next(change) then self:changeUpdates(change, notNotify) end end function Role:checkAchievTask(notNotify, stype, v1, v2) local change = {} local achiveStatus = self:getProperty("achiveT") local IsFindMax = { [1] = true, [4] = true, [6] = true, [7] = true, [16] = true, [17] = true, [19] = true, [22] = true, [23] = true, [25] = true, [37] = true, } for tId , achiveData in pairs(csvdb["achievement_typeCsv"]) do local curStatus = achiveStatus[tId] or 0 if achiveData.type == stype then if achiveData.type == 1 then --取出难度 v2 = math.floor(v1 / 10000) end if achiveData.type == 26 then local campS = {} local jobS = {} for _, hero in pairs(self.heros) do local unitData = csvdb["unitCsv"][hero:getProperty("type")] campS[unitData.camp] = (campS[unitData.camp] or 0) + 1 jobS[unitData.job] = (jobS[unitData.job] or 0) + 1 end local nStatus = 0 if achiveData.condition2 == 1 then for k , v in pairs(campS) do nStatus = math.max(nStatus, v) end elseif achiveData.condition2 == 2 then for k , v in pairs(jobS) do nStatus = math.max(nStatus, v) end end if nStatus > curStatus then table.insert(change, {type = "achiveT", field = tId, value = nStatus}) end elseif achiveData.type == 30 then --装备套装 if achiveData.condition2 == 0 or achiveData.condition2 == v1 then local suitS = {} for equipType, equips in pairs(self:getProperty("equips")) do for lv, c in pairs(equips) do local equipData = csvdb["equipCsv"][equipType][lv] if achiveData.condition2 == 0 or achiveData.condition2 == equipData.rarity then if equipData.suit ~= "" then suitS[equipData.suit] = suitS[equipData.suit] or {} suitS[equipData.suit][equipType] = 1 end end end end local nStatus = 0 for k , v in pairs(suitS) do local n = 0 for _, __ in pairs(v) do n = n + 1 end nStatus = math.max(nStatus, n) end if nStatus > curStatus then table.insert(change, {type = "achiveT", field = tId, value = nStatus}) end end elseif achiveData.type == 31 then -- 符文套装 if achiveData.condition2 == 0 or achiveData.condition2 == v1 then local suitS = {} for _, rune in pairs(self.runeBag) do local runeData = csvdb["runeCsv"][rune:getProperty("type")][rune:getProperty("id")] if achiveData.condition2 == 0 or achiveData.condition2 == runeData.rarity then if runeData.suit ~= "" then suitS[runeData.suit] = suitS[runeData.suit] or {} suitS[runeData.suit][runeData.type] = 1 end end end local nStatus = 0 for k , v in pairs(suitS) do local n = 0 for _, __ in pairs(v) do n = n + 1 end nStatus = math.max(nStatus, n) end if nStatus > curStatus then table.insert(change, {type = "achiveT", field = tId, value = nStatus}) end end elseif IsFindMax[achiveData.type] then -- 最大值 if achiveData.condition2 == 0 or achiveData.condition2 == v2 then if (v1 or 0) > curStatus then table.insert(change, {type = "achiveT", field = tId, value = v1}) end end else --通用增加 if achiveData.condition2 == 0 or achiveData.condition2 == v2 then table.insert(change, {type = "achiveT", field = tId, value = curStatus + (v1 or 1)}) end end end end if next(change) then for _, info in ipairs(change) do self:mylog("role_action", {desc = "onTask", int1 = info.field, int2 = info.value, short1 = 3, cint1 = 0}) end self:changeUpdates(change, notNotify) end end -- 九宫格任务 function Role:checkSudokuTask(notNotify, stype, count, cond) local change = false local sudoku = self:getProperty("sudoku") local curPhase = sudoku[-1] or 1 if curPhase == -1 then return end local IsFindMax = { [5] = true, [6] = true, [7] = true, [11] = true, [14] = true, [16] = true, } sudoku.task = sudoku.task or {} for pause, guide_sudokuData in pairs(csvdb["guide_sudokuCsv"]) do if pause >= curPhase then sudoku.task[pause] = sudoku.task[pause] or {} for id , sudikuData in pairs(guide_sudokuData) do local curStatus = sudoku.task[pause][id] or 0 if curStatus ~= -1 and sudikuData.type == stype then if IsFindMax[sudikuData.type] then -- 最大值 if sudikuData.con2 == 0 or sudikuData.con2 == cond then if (count or 0) > curStatus then change = true sudoku.task[pause][id] = count end end else --通用增加 if sudikuData.con2 == 0 or sudikuData.con2 == cond then change = true sudoku.task[pause][id] = curStatus + (count or 1) end end end end end end if change then self:updateProperty({field = "sudoku", value = sudoku, notNotify = notNotify}) end end function Role:checkActivityTask(notNotify, activityType, ...) if not self.activity then return end self.activity:checkActivity(notNotify, activityType, ...) end function Role:checkStoreTask(notNotify, triggerType, param) if not self.storeData then return end self.storeData:OnTriggerLimitTimePack(triggerType, param) end function Role:checkActTask(notNotify, keyName, actData, mainType, subType, param1, param2) local calTask = self:getProperty(keyName) or {} param1 = param1 or 1 local cid = actData.condition for k, taskList in pairs(csvdb["activity_taskCsv"]) do if k == cid then for id, cfg in pairs(taskList) do if cfg.type == mainType then if subType == 1 then -- 增加数值 calTask[id] = (calTask[id] or 0) + param1 elseif subType == 2 then -- 直接赋值 calTask[id] = param1 elseif subType == 3 then -- 自定义类型 if cfg.type == 7 then -- 英雄品质收集进度 local count = 0 for _, hero in pairs(self.heros) do local unitData = csvdb["unitCsv"][hero:getProperty("type")] if unitData then if cfg.condition2 == unitData.rare then count = count + 1 end end end if (calTask[id] or 0) < count then calTask[id] = count end elseif cfg.type == 5 then -- 英雄等级收集进度 local count = 0 for _, hero in pairs(self.heros) do if cfg.condition2 <= hero:getProperty("level") then count = count + 1 end end if (calTask[id] or 0) < count then calTask[id] = count end elseif cfg.type == 16 then -- 英雄星级收集进度 local count = 0 for _, hero in pairs(self.heros) do if cfg.condition2 <= hero:getProperty("wakeL") then count = count + 1 end end if (calTask[id] or 0) < count then calTask[id] = count end elseif cfg.type == 18 then -- 挂机累计收获id,y个 for rid, v in pairs(param1) do if cfg.condition2 == rid then calTask[id] = (calTask[id] or 0) + v end end elseif cfg.type == 19 then -- x名英雄装备y品质以上符文套装 local count = 0 for _, hero in pairs(self.heros) do local rcount = 0 for _,uid in pairs(hero:getRunes()) do if uid > 0 then local runeData = self.runeBag[uid] if runeData then local csvData = csvdb["runeCsv"][runeData:getProperty("type")][runeData:getProperty("id")] if csvData and cfg.condition2 <= csvData.rarity then rcount = rcount + 1 end end end end if rcount == 6 then count = count + 1 end end calTask[id] = count elseif cfg.type == 20 then -- 开启x品质时钟箱子 if cfg.condition2 <= (param2 or 0) then calTask[id] = (calTask[id] or 0) + param1 end elseif cfg.type == 15 then -- 通关关卡 if (calTask[id] or 0) == 0 then if self:checkHangPass(cfg.condition2) then calTask[id] = 1 end --local hangPass = self:getProperty("hangPass") --local diff = math.floor(cfg.condition2 / 10000) --if (hangPass[diff] or 0) >= cfg.condition2 then -- calTask[id] = 1 --end end elseif cfg.type == 22 then -- 电台任务出勤人数 calTask[id] = (calTask[id] or 0) + (param1 or 0) elseif cfg.type == 24 then -- 代理拾荒出勤人数 calTask[id] = (calTask[id] or 0) + (param1 or 0) elseif cfg.type == 28 then -- 完成指定任务 --print(actId,param2, cfg.condition2, param1) if actData.id == param2 and cfg.condition2 == param1 then calTask[id] = (calTask[id] or 0) + 1 end elseif cfg.type == 33 then -- 获得指定类型道具多少个 if cfg.condition2 == param1 then calTask[id] = (calTask[id] or 0) + (param2 or 0) end elseif cfg.type == 42 then -- 获得指定id道具多少个 if cfg.condition2 == param1 then calTask[id] = (calTask[id] or 0) + (param2 or 0) end elseif cfg.type == 6 then -- 代理拾荒次数 if cfg.condition2 == 0 or (cfg.condition2 == 1 and param1) then calTask[id] = (calTask[id] or 0) + 1 end elseif cfg.type == 37 then -- 拾荒使用道具 if cfg.condition2 == param1 then calTask[id] = (calTask[id] or 0) + (param2 or 0) end elseif cfg.type == 38 then -- 和指定建筑交互 local condArr = cfg.condition3:toArray(true, "=") for i = 0, #condArr do if condArr[i] == param1 then calTask[id] = (calTask[id] or 0) + 1 break end end elseif cfg.type == 39 then -- 拾荒特定章节消灭敌人 local condArr = cfg.condition3:toArray(true, "=") for i = 0, #condArr do if condArr[i] == param1 then calTask[id] = (calTask[id] or 0) + 1 break end end elseif cfg.type == 40 then -- 指定活动关卡通关 if cfg.condition2 == param1 then calTask[id] = (calTask[id] or 0) + 1 end elseif cfg.type == 41 then -- 通关拾荒指定关卡 if cfg.condition2 == param1 then calTask[id] = (calTask[id] or 0) + 1 end elseif cfg.type == 13 then -- 挑战电波塔主塔 if cfg.condition2 <= param1 and param2 == 1 then calTask[id] = (calTask[id] or 0) + 1 end elseif cfg.type == 44 then --玩家拥有拾荒者总星级达到xxx local count = 0 for _, hero in pairs(self.heros) do count = count + hero:getProperty("wakeL") end if (calTask[id] or 0) < count then calTask[id] = count end end end end end end end self:updateProperty({field = keyName, value = calTask, notNotify = notNotify}) end function Role:checkCalendaTask(notNotify, mainType, subType, param1, param2) --print("check calenda task", mainType, subType, param1, param2) local actEnum = "CalendaTask" local keyName = "calTask" if not self.activity then return end local open, actId = self.activity:isOpen(actEnum) local actData = csvdb["activity_ctrlCsv"][actId] if not actData then return end if not open then return end self:checkActTask(notNotify, keyName, actData, mainType, subType, param1, param2) end function Role:checkBattleCommandTask(notNotify, mainType, subType, param1, param2) --print("check battle command task", mainType, subType, param1, param2) local actEnum = "BattleCommandTask" local keyName = "bcTask" if not self.activity then return end local open, actId = self.activity:isOpen(actEnum) local actData = csvdb["activity_ctrlCsv"][actId] if not actData then return end if not open then return end self:checkActTask(notNotify, keyName, actData, mainType, subType, param1, param2) end function Role:checkNewUserTask(notNotify, mainType, subType, param1, param2) --print("check new user task", mainType, subType, param1, param2) local actEnum = "NewUserTask" local keyName = "nbTask" if not self.activity then return end local open, actId = self.activity:isOpen(actEnum) local actData = csvdb["activity_ctrlCsv"][actId] if not actData then return end if not open then return end self:checkActTask(notNotify, keyName, actData, mainType, subType, param1, param2) end function Role:checkReturnerTask(notNotify, mainType, subType, param1, param2) -- print("check returner task", mainType, subType, param1, param2) local returner = self:getProperty("returner") or {} if not returner.time then return end local actData = csvdb["activity_ctrlCsv"][76] local keyName = "returner" self:checkActTask(notNotify, keyName, actData, mainType, subType, param1, param2) end end return RoleTask