local TeamDungeon_Controller = {} local EventSystem = require 'Event/EventSystem' local dig_treasure_pb = require 'Proto/dig_treasure_pb' local private = {} local digTreasureCount = 0 local DigTreasureItemID = 51 function TeamDungeon_Controller.OnStartup() EventSystem.Regist(EventID.TeamDungeon_ContinueFindTeamPVENPC, private.ContinueFindOnce) EventSystem.Regist(EventID.TeamPVEShowVictoryPose, CTL.HomeMain.CloseBasicView) EventSystem.Regist(EventID.DigTreasure_RewardBoxBorn, private.DigTreasureRewardBoxBorn) -- 单人挖宝相关 :副本内的宝箱出现了 EventSystem.Regist(EventID.DigTreasure_OpenBoxOver, private.DigTreasureOpenedRewardBox) -- 单人挖宝相关 :打开了副本内的宝箱 EventSystem.Regist(EventID.DigTreasure_AutoOpenBoxCountdownSecond, private.OnAutoOpenBoxCountdownSecond) --单人挖宝 : 自动选箱子倒数整秒时 EventSystem.Regist(EventID.DigTreasure_AutoOpenBox, private.OnDigTreasureAutoOpenRewardBox) -- 单人挖宝相关 :自动选择副本内的宝箱 EventSystem.Regist(EventID.DigTreasure_SendResult, private.SendDigTreasureResult)-- 挖宝相关 :发送结算 EventSystem.Regist(EventID.DigTreasure_OpenedMulOwnerBox, private.DigTreasureOpenedMulOwnerBox) -- 挖宝相关 :打开了副本内的宝箱 EventSystem.Regist(EventID.DigTreasure_EnterOrExitDoorway, private.OnDoorwayTrigger) --挖宝相关,进入传送门 EventSystem.Regist(EventID.DigTreasure_AllInDoorway, private.OnAllInDoorway) --挖宝相关,所有人都进入传送门 EventSystem.Regist(EventID.DigTreasure_GotoNextLevel, private.OnGotoNextLevel) --挖宝相关,传送到下一层时 EventSystem.Regist(EventID.DigTreasure_StopTask, TeamDungeon_Controller.StopTreasure) EventSystem.Regist(EventID.UI_Guide_VirtualJoystick_PointerUp, TeamDungeon_Controller.StopTreasure) EventSystem.Regist(EventID.BagItemFastApply_ClickClose, private.OnClickCloseUseItem) private.uiActivityId = nil private.sortedTeamDungeonReward = DataSheetUtil.CreateSortedDataSheet("TeamDungeonReward") end function TeamDungeon_Controller.GetUIActivityId() return private.uiActivityId end function TeamDungeon_Controller.SetUIActivityId(activityId) private.uiActivityId = activityId end function TeamDungeon_Controller.ClearUIActivityId() private.uiActivityId = nil end function TeamDungeon_Controller.GetDungeonDataByActivityID(activityID) local dungeonData = nil for i, v in DataSheetManager.TeamDungeonData:GetEnumerator() do if v.ActivityID == activityID then dungeonData = v break end end return dungeonData end function TeamDungeon_Controller.FindTeamPVENPC(activityId) if not MDL.Team.IsFollowing() then NotSyncBattleSetter.StopAutoFightPathInTown() --停止现在的寻路(主要是为了清空其他寻路的缓存,比如TeamDungeon) local activityData = DataSheetManager.ActivityData:GetDataByID(activityId) local __, levelCfgReplaceData = DataSheetManager.LevelCfgReplace:TryGetDataByReplaceID_ReplaceType(activityData.NPCItemID, LuaConst.LevelCfgReplaceType.Npc) if levelCfgReplaceData and MDL.Unlock.IsComplete(levelCfgReplaceData.Condition, levelCfgReplaceData.ConditionParam) then private.FindingNpcItemID = levelCfgReplaceData.ReplaceTarget else private.FindingNpcItemID = activityData.NPCItemID end NotSyncBattleSetter.FindPathByNPCIDAndRide(private.FindingNpcItemID) else CTL.Tips.AddTipsMsg(Const_IDS["IDS_Team_FollowCanNotDoThis"]) end end function private.ContinueFindOnce() if private.FindingNpcItemID then NotSyncBattleSetter.FindPathByNPCIDAndRide(private.FindingNpcItemID) private.FindingNpcItemID = nil end end function TeamDungeon_Controller.OnStopFindPath() private.FindingNpcItemID = nil end function TeamDungeon_Controller.OpenMainPanelByLevelID(levelID) local dungeonData = nil for i, v in DataSheetManager.TeamDungeonData:GetEnumerator() do if v.LevelInfo == levelID then dungeonData = v break end end if dungeonData then UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UITeamPVE, dungeonData) end end function TeamDungeon_Controller.OpenMainPanel(activityID) local isUnlock, content = CTL.Activities.IsOpen(activityID) if isUnlock == false then CTL.Tips.AddTipsMsg(content) return end local dungeonData = TeamDungeon_Controller.GetDungeonDataByActivityID(activityID) if dungeonData then UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UITeamPVE, dungeonData) end end function TeamDungeon_Controller.OpenRewardPreviewPanel(dungeonID) local dungeonData = DataSheetManager.TeamDungeonData:GetDataByID(dungeonID) if dungeonData then --先判断是否打开 local curIndex = 0 local previewNum = 0 local curLev = MDL.Player.GetRoleInfo() local reward = dungeonData.Reward for _, id in ipairs(reward) do for i, v in ipairs(private.sortedTeamDungeonReward) do if id == v.ID and curLev >= v.LevelMin and curLev <= v.LevelMax then curIndex = i previewNum = v.PreviewNum break end end end local rewardTab = nil for i = curIndex + 1, curIndex + previewNum do local data = private.sortedTeamDungeonReward[i] if data then if rewardTab == nil then rewardTab = {} end table.insert(rewardTab, data) end end if rewardTab and #rewardTab > 0 then UIManager.OpenView(Const_UI_Lua.UIEnum.UITeamPVEReward, rewardTab) else CTL.Tips.AddTipsMsg(Const_IDS.IDS_TeamDungeon1_MaxRewardStage) end end end function TeamDungeon_Controller.ShowBattleSummary(msgResp) --当匹配确认的时候玩家断网,重连回来如果正好结算,就会卡在该页面,这个时候如果收到这个协议就关闭,防止卡死 if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UITeamMatchPanel) then UIManager.CloseView(Const_UI_Lua.UIEnum.UITeamMatchPanel) CTL.Tips.AddTipsMsg(Const_IDS.IDS_OnlineTips_TryAgain) end CTL.HomeMain.CloseBasicView() UIManager.OpenView(Const_UI_Lua.UIEnum.UITeamPVESummary, msgResp) end function TeamDungeon_Controller.DealWithTeamPVEMatch(activityID, state) if state then if CTL.Team.IsTeamFull() and not CTL.Team.IsAllMemberFollowing() then UTL.MessageBox.ShowOKCancelBox(UIUtils.GetLocalizedTxt(Const_IDS["IDS_TeamIn_NeedAllFollow_Title"]), UIUtils.GetLocalizedTxt(Const_IDS["IDS_TeamIn_NeedAllFollow"]), function() MDL.Team.TeamCallMemberReq() end) return end end MDL.TeamMatch.PlayerMatchOperateReq(activityID, state) end --超时取消匹配 function private.SendCancelMatch() if private.MatchingDungeonData then local dungeonId = private.MatchingDungeonData.ID CTL.Tips.AddTipsMsg(Const_IDS.IDS_TeamDungeon1_MaxMatchTime) TeamDungeon_Controller.OnTeamDungeonMatch(false, dungeonId) EventSystem.Dispatch(EventID.UI_TeamMatch_MatchTime, false) MDL.TeamMatch.PlayerMatchOperateReq(private.MatchingDungeonData.ActivityID, false) end end --匹配表现 function TeamDungeon_Controller.OnTeamDungeonMatch(state, dungeonId) local dungeonData if dungeonId then dungeonData = DataSheetManager.TeamDungeonData:GetDataByID(dungeonId) end if state and private.MatchingDungeonData and private.MatchingDungeonData.ID == dungeonId then return end if state then private.MatchingDungeonData = dungeonData else private.MatchingDungeonData = nil end end function private.SendDigTreasureResult(msg) NetManager.SendMessage(MessageEnums.MessageC2GUploadDigTreasureResult, msg) end function private.DigTreasureRewardBoxBorn() local msg = dig_treasure_pb.C2GDigTreasureGather() msg.stage = 0 NetManager.SendMessage(MessageEnums.MessageC2GDigTreasureGather, msg) end function private.OnDigTreasureAutoOpenRewardBox(selectId) private.DigTreasureOpenedRewardBox(selectId) end function private.DigTreasureOpenedRewardBox(selectId) local msg = dig_treasure_pb.C2GDigTreasureGather() msg.stage = 1 msg.selectId = selectId NetManager.SendMessage(MessageEnums.MessageC2GDigTreasureGather, msg) end function private.OnAutoOpenBoxCountdownSecond(countDownframeEla, autoOpenRewardBoxIndex) local boxName = nil if autoOpenRewardBoxIndex == 1 then boxName = UIUtils.GetLocalizedTxt(Const_IDS.IDS_MonsterName_ShuiZhiBaoXiang) elseif autoOpenRewardBoxIndex == 2 then boxName = UIUtils.GetLocalizedTxt(Const_IDS.IDS_MonsterName_TuZhiBaoXiang) elseif autoOpenRewardBoxIndex == 3 then boxName = UIUtils.GetLocalizedTxt(Const_IDS.IDS_MonsterName_MuTouBaoXiang) end CTL.Tips.AddTipsMsg(Const_IDS["IDS_DigForTreasure_CDTips"], math.floor(countDownframeEla / 20 + 0.1), boxName) end function private.DigTreasureOpenedMulOwnerBox(playerID,buff) if playerID == LevelPlayerManager.MyPlayerIDInRoom then local msg = dig_treasure_pb.C2GDigTreasureGather() msg.stage = 1 NetManager.SendMessage(MessageEnums.MessageC2GDigTreasureGather, msg) if buff then -- 系统自动拾取的不要tips了 --CTL.Tips.AddTipsMsg(Const_IDS.IDS_DigTreasure_GetBoxAuto) else CTL.Tips.AddTipsMsg(Const_IDS.IDS_DigTreasure_GetBox) end end end function private.OnDoorwayTrigger(triggerEntity, entity, isEnter) if isEnter and not BattleDataGetter.IsInReconnectFastPlay() and triggerEntity._logicInitData.IsPlayerSelf then local roleName = MDL.ChannelChat.CreatChatTemplateParam(MDL.ChannelChat.TemplateParamType.RoleName) roleName.param.name = triggerEntity._logicInitData.Name local idsOrStr = MDL.ChannelChat.CreatChatTemplateParam(MDL.ChannelChat.TemplateParamType.IdsOrStr) idsOrStr.param.idsOrStr = entity.components.base.CurCharacterData.MonsterNameIDS local recruitChannelID = MDL.ChannelChat.GetChannelIdByCfgID(MDL.ChannelChat.ChannelCfgId.Team) --日服 无组队的挖宝 不发 请求 if GameAppInfo.IsJapanesePackage() and not CTL.Team.IsInTeam() then return end MDL.ChannelChat.SendChannelSystemMsg(recruitChannelID, "IDS_DigTreasure_Door_ChooseDoorName", roleName, idsOrStr) end end function private.OnAllInDoorway(time) if time > 0 then CTL.Level.StartCommonProgressBar(nil, UIUtils.GetLocalizedTxt(Const_IDS.IDS_Map_Transmitting),time) else UIManager.CloseView(Const_UI_Lua.UIEnum.UICommonProgressBar) end end --这里 function private.OnGotoNextLevel(doorNameStr, hasNextLevel, curFloor) local myTeamID = BattleDataGetter.GetMyTeamID() local playerIDList = LevelPlayerManager.GetPlayerIDListOfTeam(myTeamID) --只需要发一遍,playerID最小的那个客户端发送这个消息 local minPlayerID for i, v in ipairs(playerIDList) do if BattleDataGetter.PlayerIsOnline(v) then if minPlayerID == nil or v > minPlayerID then minPlayerID = v end end end if minPlayerID then local entity = BattleDataGetter.GetPlayerActiveEntity(minPlayerID) if BattleDataGetter.IsCurEntity(entity) then local recruitChannelID = MDL.ChannelChat.GetChannelIdByCfgID(MDL.ChannelChat.ChannelCfgId.Team) --日服 无组队的挖宝 不发 请求 if GameAppInfo.IsJapanesePackage() and not CTL.Team.IsInTeam() then return end if hasNextLevel then if curFloor == 5 then -- 5进6 MDL.ChannelChat.SendChannelSystemMsg(recruitChannelID, "IDS_DigTreasure_FinishLayer_5to6") else MDL.ChannelChat.SendChannelSystemMsg(recruitChannelID, "IDS_DigTreasure_NextLayer") end else if curFloor == 5 then MDL.ChannelChat.SendChannelSystemMsg(recruitChannelID, "IDS_DigTreasure_FinishLayer_5") elseif curFloor > 5 then MDL.ChannelChat.SendChannelSystemMsg(recruitChannelID, "IDS_DigTreasure_FinishLayer_6") else MDL.ChannelChat.SendChannelSystemMsg(recruitChannelID, "IDS_DigTreasure_FinishLayer") end end end end end function TeamDungeon_Controller.ShowDigTreasureSummary(msg) logging.log(LTAG.LOG," ShowDigTreasureSummary ",msg) local data = {digTreasureInfo = msg.digTreasureInfo, isWin = msg.isWin, passTime = msg.passTime, hasReward = msg.isWin} CTL.HomeMain.CloseBasicView() UIManager.OpenView(Const_UI_Lua.UIEnum.UIDigTreasureBattelResult,data) end function TeamDungeon_Controller.StartTreasure() local rewardCount = MDL.TeamDungeon.GetDigRewardCount() digTreasureCount = rewardCount + 1 EventSystem.Dispatch(EventID.DigTreasure_StartTask, false) end function TeamDungeon_Controller.StopTreasure() if digTreasureCount > 0 and BattleDataGetter.IsTownLevel() then if CTL.Bag.HasQuickUseItem(DigTreasureItemID) == nil then local count = digTreasureCount local list = MDL.Task.GetTaskList(MDL.Task.Enum_TaskType.NormalTreasure) if list and next(list) then count = count - 1 end UIManager.OpenView(Const_UI_Lua.UIEnum.UIDigForTreasurePanel, {digTreasureCount = count, stop = true}) digTreasureCount = 0 CTL.Task.OnStopAutoTask() end end end function TeamDungeon_Controller.GetDigTreasureCount() return digTreasureCount end function TeamDungeon_Controller.SetAutoOpenRewardBox(id) MDL.Setting.PrepareSetSettingState(LuaConst.BattleSettingEnum.AutoOpenRewardBoxWater, false) MDL.Setting.PrepareSetSettingState(LuaConst.BattleSettingEnum.AutoOpenRewardBoxDirt, false) MDL.Setting.PrepareSetSettingState(LuaConst.BattleSettingEnum.AutoOpenRewardBoxWood, false) MDL.Setting.PrepareSetSettingState(id, true) MDL.Setting.SendPlayerSetting() end function private.OnClickCloseUseItem(itemId) if itemId == DigTreasureItemID then if digTreasureCount > 0 and BattleDataGetter.IsTownLevel() then local count = digTreasureCount local list = MDL.Task.GetTaskList(MDL.Task.Enum_TaskType.NormalTreasure) if list and next(list) then count = count - 1 end UIManager.OpenView(Const_UI_Lua.UIEnum.UIDigForTreasurePanel, {digTreasureCount = count, stop = true}) digTreasureCount = 0 end end end function TeamDungeon_Controller.OnDigTreasureShowReward() local hasItemCount = CTL.Bag.GetHasCountByItemCfgID(DigTreasureItemID) if hasItemCount == 0 then TeamDungeon_Controller.StopTreasure() end end return TeamDungeon_Controller