local MultiplayerDungeon_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local multiplayer_dungeon_pb = require 'Proto.multiplayer_dungeon_pb' MultiplayerDungeon_Model.SubActivityId = { LuaConst.ActivityType.MultiplayerDungeon1, LuaConst.ActivityType.MultiplayerDungeon2, LuaConst.ActivityType.MultiplayerDungeon3, } private.SubActivityIdToUnlockFunctionType = { [LuaConst.ActivityType.MultiplayerDungeon1] = MDL.Unlock.FunctionType.MultiplayerDungeon1, [LuaConst.ActivityType.MultiplayerDungeon2] = MDL.Unlock.FunctionType.MultiplayerDungeon2, [LuaConst.ActivityType.MultiplayerDungeon3] = MDL.Unlock.FunctionType.MultiplayerDungeon3, } function MultiplayerDungeon_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageMultiPlayerDungeonInfo, private.MultiplayerDungeonInfoResponse) NetManager.RegisterMsgCB(MessageEnums.MessageEnterMultiPlayerDungeon, private.EnterMultiplayerDungeonResponse) NetManager.RegisterMsgCB(MessageEnums.MessageMultiPlayerDungeonSpecialDifficultInfo, private.MultiplayerDungeonSpecialDifficultInfoResponse) NetManager.RegisterMsgCB(MessageEnums.MessageG2COrderBossInfo, private.SyncMultiplayerDungeonOrderBossInfo) EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, private.RefreshRedPoint) EventSystem.Regist(EventID.TeamLevelUpdate, private.RefreshRedPoint) private.ActivitiesLevelList = {} -- 根据活动ID拆分关卡表 private.LevelStrategyList = {} -- 根据关卡ID拆分攻略表 private.ActivitiesTeamInfoList = {} -- 活动通关队伍信息 private.RotationOrder = {} -- 轮换顺序,第一个是当前正在开启的,后面存储的是下次开启时间 -- 已经解锁的关卡 private.unlockedLevelId = 0 private.RewardCountLeft = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.MultiplayerDungeon).DailyRefreshTimes -- 剩余奖励次数 private.PayRewardCount = 0 -- 剩余购买次数 private.SplitConfig() end function MultiplayerDungeon_Model.GetMultiplayerDungeonSubDataById(activityId) local data = {} local list = private.GetUnlockedLevelList(activityId) for i, v in ipairs(list) do local activityData = DataSheetManager.ActivityData:GetDataByID(activityId) local difficult = string.FormatByIdsId(Const_IDS["IDS_ActivityName_Difficulty"], UIUtils.GetLocalizedTxt(Const_IDS["IDS_Number_Written_"..v.Difficulty])) local name = string.Concat(UIUtils.GetLocalizedTxt(Const_IDS[activityData.Activity]), difficult) table.insert(data, {SubTitle = name, ID = activityId, Menu = CTL.Rank.MenuLevel.Double, subId = v.Difficulty}) end return data end function private.SortFunction(a,b) return a.ID < b.ID end --按照类型拆分多人副本 function private.SplitConfig() --按照类型拆分多人副本 for _,v in DataSheetManager.MultiplayerDungeon:GetEnumerator() do if private.ActivitiesLevelList[v.Type] == nil then private.ActivitiesLevelList[v.Type] = {} end table.insert(private.ActivitiesLevelList[v.Type], v) end for _,levelData in ipairs(private.ActivitiesLevelList) do table.sort(levelData, private.SortFunction) end -- 根据关卡ID拆分攻略表 for _,v in DataSheetManager.MultiplayerDungeonStrategy:GetEnumerator() do if private.LevelStrategyList[v.LevelID] == nil then private.LevelStrategyList[v.LevelID] = {} end table.insert(private.LevelStrategyList[v.LevelID], v) end for _,levelData in ipairs(private.LevelStrategyList) do table.sort(levelData, private.SortFunction) end end function MultiplayerDungeon_Model.GetMultiplayerDungeonDataByType_Difficult(type, difficult) for _,v in DataSheetManager.MultiplayerDungeon:GetEnumerator() do if v.Type == type and v.Difficulty == difficult then return v end end end --region ************** 协议 ***************** -- 登录和战斗胜利,挑战次数变更同步数据 function MultiplayerDungeon_Model.SyncMultiplayerDungeonInfo(msgResp) logging.log(LTAG.LOG, "G2CPushMultiplayerDungeonInfo", msgResp) private.RewardCountLeft = msgResp.rewardCountLeft for _,AcInfo in ipairs(msgResp.mpBossInfo) do private.ActivitiesTeamInfoList[AcInfo.activeId] = AcInfo end for index, activeId in ipairs(msgResp.rotationOrder) do private.RotationOrder[activeId] = (index - 1) * UTL.Time.TotalSecondsOneWeek + msgResp.refreshTime end private.RefreshRedPoint() -- 通知界面刷新 EventSystem.Dispatch(EventID.UI_UpdateMultiplayerDungeonRewardTimes) end -- 当全服出现了有人首通上一个副本的条件难度时,收到该数据(刷新红点、界面) function private.SyncMultiplayerDungeonOrderBossInfo(msg) for index, activeId in ipairs(msg.rotationOrder) do private.RotationOrder[activeId] = (index - 1) * UTL.Time.TotalSecondsOneWeek + msg.refreshTime end private.RefreshRedPoint() -- 通知界面刷新 EventSystem.Dispatch(EventID.UI_UpdateMultiplayerDungeonRewardTimes) end private.openLevelID = 0 -- 打开界面请求通关详细信息 function MultiplayerDungeon_Model.MultiplayerDungeonInfoRequest(activitiesID, levelID) local msg = multiplayer_dungeon_pb.MultiPlayerDungeonInfoReq() msg.activeId = activitiesID private.openLevelID = levelID NetManager.SendMessage(MessageEnums.MessageMultiPlayerDungeonInfo, msg) end function private.MultiplayerDungeonInfoResponse(msgResp) logging.log(LTAG.LOG, "MultiplayerDungeonInfoResp", msgResp) if msgResp.bossInfo then private.ActivitiesTeamInfoList[msgResp.activeId] = msgResp.bossInfo end CTL.MultiplayerDungeon.OpenSubPanel(msgResp.activeId, private.openLevelID) end private.reqActiveID = 0 private.reqDifficultyID = 0 private.cellIndex = 0 -- 切难度页签请求通关详细信息 function MultiplayerDungeon_Model.MultiplayerDungeonSpecialDifficultInfoRequest(activeId, difficultyId, cellIndex) local msg = multiplayer_dungeon_pb.MultiPlayerDungeonSpecialDifficultInfoReq() msg.activeId = activeId msg.difficultId = difficultyId private.reqActiveID = activeId private.reqDifficultyID = difficultyId private.cellIndex = cellIndex NetManager.SendMessage(MessageEnums.MessageMultiPlayerDungeonSpecialDifficultInfo, msg) end function private.MultiplayerDungeonSpecialDifficultInfoResponse(msgResp) logging.log(LTAG.LOG, "MultiplayerDungeonSpecialDifficultInfoResp", msgResp) if msgResp.info then for index, difficultyInfo in ipairs(private.ActivitiesTeamInfoList[private.reqActiveID].difficultyInfo) do if difficultyInfo.difficultyId == msgResp.info.difficultyId then private.ActivitiesTeamInfoList[private.reqActiveID].difficultyInfo[index] = msgResp.info break end end end EventSystem.Dispatch(EventID.UI_UpdateMultiplayerDungeonDifficultInfo, private.cellIndex) end -- 进入战斗协议 function MultiplayerDungeon_Model.EnterMultiplayerDungeonRequest(activeId, difficultId) if not CTL.TeamMatch.IsCanGoOtherScene(LuaConst.LevelType.SyncTeamDifficultLevel) then return end local activityData = DataSheetManager.ActivityData:GetDataByID(activeId) logging.log(LTAG.LOG, "EnterMultiplayerDungeonResp", activeId, difficultId) local msg = multiplayer_dungeon_pb.EnterMultiPlayerDungeonReq() msg.activeId = activeId msg.difficultId = difficultId NetManager.SendMessage(MessageEnums.MessageEnterMultiPlayerDungeon, msg) end function private.EnterMultiplayerDungeonResponse(msgResp) logging.log(LTAG.LOG, "EnterMultiplayerDungeonResp", msgResp) end --endregion ************** 协议 ***************** -- 获取活动红点信息 function MultiplayerDungeon_Model.GetRedPointState(activitiesID) local redPoint = false local serverTime = UTL.Time.GetServerTimestamp() local rotationTime = MultiplayerDungeon_Model.GetRotationOrder(activitiesID) if (not rotationTime) or rotationTime > serverTime then -- 如果活动没有进入轮换 or 当前活动不是开启中活动,红点直接返回false return redPoint end local config = MultiplayerDungeon_Model.GetConfigByActivitiesID(activitiesID) local teamLevel = MDL.Player.GetRoleLevel() local passID = MultiplayerDungeon_Model.GetPassFarthestIDByActivitiesID(activitiesID) local functionUnlockData = DataSheetManager.FuctionUnlock:GetDataByFucID(MultiplayerDungeon_Model.UnlockFunctionTypeByActivityId(activitiesID)) local nextData = config[1] for index, data in ipairs(config) do if passID == 0 then nextData = config[index] break end if data.ID == passID then if index >= #config then return false else nextData = config[index + 1] end break end end for index, data in ipairs(config) do if CTL.Unlock.JudgeIfSatisfiedUnlockTable(data.Unlock_Table) and data.ID == nextData.ID then redPoint = true break end end return redPoint end function private.RefreshRedPoint() local isUnlock = CTL.Unlock.JudgeIfSatisfiedUnlockTable(DataSheetManager.FuctionUnlock:GetDataByFucID(MDL.Unlock.FunctionType.MultiplayerDungeon).Unlock_Table) if isUnlock then local isCanChallenge = false for k,v in pairs(private.ActivitiesLevelList) do if MultiplayerDungeon_Model.GetRedPointState(k) then isCanChallenge = true break end end EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.MultiplayerDungeon, private.RewardCountLeft > 0 or isCanChallenge) end end --region ***************** 获取信息 ****************** -- 用活动ID取关卡信息 function MultiplayerDungeon_Model.GetConfigByActivitiesID(activitiesID) return private.ActivitiesLevelList[activitiesID] end -- 用关卡ID取攻略信息 function MultiplayerDungeon_Model.GetConfigByLevelID(levelID) return private.LevelStrategyList[levelID] end -- 用活动ID取通关队伍信息 function MultiplayerDungeon_Model.GetTeamInfoByActivitiesID(activitiesID, difficultyId) local activeTeamData = private.ActivitiesTeamInfoList[activitiesID] if activeTeamData and activeTeamData.difficultyInfo then for k,difficultyInfo in ipairs(activeTeamData.difficultyInfo) do if difficultyInfo.difficultyId == difficultyId then return difficultyInfo end end end return nil end -- 获取已通关最远关卡ID function MultiplayerDungeon_Model.GetPassFarthestIDByActivitiesID(activitiesID) local teamData = private.ActivitiesTeamInfoList[activitiesID] if teamData then return teamData.myPassDifficultyId else return 0 end end -- 已经解锁的关卡 function private.GetUnlockedLevelList(activitiesID) local unlockedTable, nextData = { }, nil local teamLevel = MDL.Player.GetRoleLevel() local passFarthestId = MultiplayerDungeon_Model.GetPassFarthestIDByActivitiesID(activitiesID) local levelData = MultiplayerDungeon_Model.GetConfigByActivitiesID(activitiesID) local functionUnlockData = DataSheetManager.FuctionUnlock:GetDataByFucID(MultiplayerDungeon_Model.UnlockFunctionTypeByActivityId(activitiesID)) -- 先取到最远ID的下一关Data for index, data in ipairs(levelData) do if passFarthestId == 0 or (data.ID == passFarthestId and index == #levelData) then nextData = levelData[index] break end if data.ID == passFarthestId then if index < #levelData then nextData = levelData[index + 1] break end end end -- 判断是否解锁 for index, data in ipairs(levelData) do if nextData then if data.ID > nextData.ID then break elseif data.ID == nextData.ID then if not CTL.Unlock.JudgeIfSatisfiedUnlockTable(nextData.Unlock_Table) then break end table.insert(unlockedTable, nextData) else table.insert(unlockedTable, data) end end end return unlockedTable end -- 剩余奖励次数 function MultiplayerDungeon_Model.GetRewardCountLeft() local info = { curCount = private.RewardCountLeft, sumCount = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.MultiplayerDungeon).DailyRefreshTimes } return info end -- 获取当前轮换状态 function MultiplayerDungeon_Model.GetRotationOrder(activitiesID) return private.RotationOrder[activitiesID] -- 如果返回的是空值,则表示当前未达到状态。不参与轮换 end -- 根据活动ID获取解锁功能ID function MultiplayerDungeon_Model.UnlockFunctionTypeByActivityId(activitiesID) return private.SubActivityIdToUnlockFunctionType[activitiesID] end --endregion ***************** 获取信息 ****************** return MultiplayerDungeon_Model