local SyncTeamPVP_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') local TotalNum = DataSheetManager.ConstData:GetDataByID("SoloFightSeasonRewardNeedMatch").IntValue local KillEffect = { [1] = {ID = 1, min=3 ,max = 4, IDSPath = "IDS_Fair3v3_KillNumLevel1", ImgPath = "3v3jsbx_msz_clfm.png", state = 0}, [2] = {ID = 2, min=5 ,max = 7, IDSPath = "IDS_Fair3v3_KillNumLevel2", ImgPath = "3v3jsbx_msz_dssf.png", state = 1} , [3] = {ID = 3, min=8 ,max = 9999, IDSPath = "IDS_Fair3v3_KillNumLevel3",ImgPath = "3v3jsbx_msz_txws.png", state = 2}, } local MVPIDSPath = "IDS_Fair3v3_MVP" local MVPImgPath = "3v3jsbx_msz_mvp.png" local MVPImgBg = ConstAssetPathConfig.MVPImgBg local EnterSyncTeamPVPCount = "EnterSyncTeamPVPCount" local _isEnter3V3VoiceRoom = false --是否加入了3V3 实时语音房间 local ScenePathTL = { ["C-3V3_SwampArena"] = {ConstAssetPathConfig.ThreeVSThree_Victory_TLAssetPath1, ConstAssetPathConfig.ThreeVSThree_Defeat_TLAssetPath1}, ["C-3v3_SiShui_Daba"] = {ConstAssetPathConfig.ThreeVSThree_Victory_TLAssetPath2, ConstAssetPathConfig.ThreeVSThree_Defeat_TLAssetPath2} } function SyncTeamPVP_Controller.OnStartup() EventSystem.Regist(EventID.New_Day_Refresh,private.NewDayRefresh) EventSystem.Regist(EventID.UI_SyncTeamPVP_ShowKillTitleInfo,private.ShowKillTitleInfo) --EventSystem.Regist(EventID.UI_SyncTeamPVP_SetReslut,private.SetResult) EventSystem.Regist(EventID.UI_SyncTeamPVP_OpenCountDownPanel, private.OpenCountDownPanel) EventSystem.Regist(EventID.UI_FairPlay_RefreshPVPRankInfo, private.RefreshRedPoint) EventSystem.Regist(EventID.UI_FairPlay_TVTSeasonInfoUpdate, private.RefreshRedPoint) EventSystem.Regist(EventID.UI_FairPlay_WinRewardRefresh, private.RefreshRedPoint) EventSystem.Regist(EventID.Level_InitLevel, private.OnInitLevel) EventSystem.Regist(EventID.VoiceRoom_OnServerRoomInitStateResp, private.OnServerRoomInitStateResp) end --每日五点定时刷新 function private.NewDayRefresh() private.RefreshRedPoint() EventSystem.Dispatch(EventID.UI_SyncTeamPVP_RefreshDailyRewardUI) --EventSystem.Dispatch(EventID.UI_FairPlay_RefreshWeeklyRewardUI) 以后可能需要加周任务的事件,先占坑 end function private.OnInitLevel() if BattleDataGetter.IsSyncTeamPVP() and not BattleDataGetter.IsReplayBattle() and not BattleDataGetter.IsInLevelWatchBattle() then UIManager.OpenView(Const_UI_Lua.UIEnum.UIBattleShortcutMsg) end end function SyncTeamPVP_Controller.GetNextTime() local endTime = MDL.SyncTeamPVP.GetTVTSeasonInfo().nextTime return os.difftime(endTime, UTL.Time.GetServerTimestamp()) end function SyncTeamPVP_Controller.IsSeasonOpen() return MDL.SyncTeamPVP.GetTVTSeasonInfo().seasonState == MDL.FairPlay.SeasonState.SeasonOpening end function SyncTeamPVP_Controller.GetSeasonId() return MDL.SyncTeamPVP.GetTVTSeasonInfo().seasonId end function SyncTeamPVP_Controller.GetLevelRank() local score = MDL.SyncTeamPVP.GetEloScore() local rank = MDL.SyncTeamPVP.GetPVPRank() local level = DataSheetManager.ThreeBattleLevelData:GetDataByLevelID(1).LevelID for i, v in DataSheetManager.ThreeBattleLevelData:GetEnumerator() do if score < v.LevelScore then break end local levelRank = SyncTeamPVP_Controller.GetLevelRankByData(v) if levelRank ~= 0 and rank > levelRank then break end level = v.LevelID end return level end function SyncTeamPVP_Controller.GetLevelRankName(rankLv) local levelRank = rankLv or SyncTeamPVP_Controller.GetLevelRank() local name = DataSheetManager.ThreeBattleLevelData:GetDataByLevelID(levelRank).LevelName return UIUtils.GetLocalizedTxt(Const_IDS[name]) end function SyncTeamPVP_Controller.GetLevelRankDesc() local rank = MDL.SyncTeamPVP.GetPVPRank() local level = SyncTeamPVP_Controller.GetLevelRank() local nextLevel = level + 1 --下一等级可能为空,因此使用try local __, data = DataSheetManager.ThreeBattleLevelData:TryGetDataByLevelID(nextLevel) if data then local levelRank = SyncTeamPVP_Controller.GetLevelRankByData(data) if levelRank and levelRank > 0 then if rank > levelRank then rank = UTL.Color.FormatRedColor(rank) end return string.FormatByIdsKey("IDS_1v1Sync_PromotionCondition_ScoreAndRank", data.LevelScore, rank, levelRank) else return string.FormatByIdsKey("IDS_RankOptimization_ScoreTips") end else local threeData = DataSheetManager.ThreeBattleLevelData:GetDataByLevelID(level) return string.FormatByIdsKey("IDS_RankOptimization_RankTips", rank, SyncTeamPVP_Controller.GetLevelRankByData(threeData)) end end function private.SetResult(my, other) private._myProgress = my private._otherProgess = other end function private.OpenCountDownPanel() local viewName = Const_UI_Lua.UIEnum.UIBattleCountDownCasualPanel if not UIManager.IsViewOpened(viewName) then UIManager.OpenView(viewName) end end function private.OnDeleteConfirm(buttonID) if (buttonID == ID_BUTTON.ID_OK) then MDL.Level.SendRoleLeaveFuben() end end local t = { diffValue = 24, ourFighterRecords = { playerId= 2, serId= 1, killNum= 4, deadNum= 0, fightingTime= 139, fighterName= "svs0011", score= 900, mainHero= 6, } } local curKillStyle = nil function SyncTeamPVP_Controller.PlayTimeline(msg) EventSystem.Regist(EventID.UI_SyncTeamPVP_SummaryAfterReward, private.OpenBattleResultPanel) if LevelManager._levelLogicData.LogicLoadingStep == LuaConst.Enum_LoadingStep.FastPlay or BattleDataGetter.CheckCurLevelType(LuaConst.LevelType.SyncTeamFairChampionship) then private.CheckRewardsShow(msg) --skip timeline else local levelInfoData = DataSheetManager.LevelInfoData:GetDataByLevelID(LevelManager.GetCurLevelID()) local path = private.GetThreeVSThreeTL(msg.isWin, levelInfoData.ScenePath) if path then SystemManager.PlayTimeline(path, true, -1, function (id,level,isReward) private.CheckRewardsShow(msg) end, LuaConst.ETimelinePlayReqSourceFlag.TEAMPVPFINISH, nil, true) end end end function private.GetThreeVSThreeTL(isWin, ScenePath) local tlResource = ScenePathTL[ScenePath] return isWin and tlResource[1] or tlResource[2] end function private.CheckRewardsShow(msg) private.cacheBattleSummary = msg if #msg.Rewards > 0 then --奖励做成了通用机制,有就弹,比如天下会武3v3 UIManager.OpenView( Const_UI_Lua.UIEnum.UIRewardGainPanel, { tipsIDS = "IDS_HeroMatch3v3_RewardTips", topContentIDS = "IDS_HeroMatch3v3_JoinReward", duration = 3, itemList = msg.Rewards } ) else private.OpenBattleResultPanel() end end function private.OpenBattleResultPanel() EventSystem.UnRegist(EventID.UI_SyncTeamPVP_SummaryAfterReward, private.OpenBattleResultPanel) local msg = private.cacheBattleSummary if BattleDataGetter.CheckCurLevelType(LuaConst.LevelType.SyncTeamFairChampionship) then --直接打开结算界面 UIManager.OpenView(Const_UI_Lua.UIEnum.UISyncTeamPVPBattleOverPanel) EventSystem.Dispatch(EventID.UI_SyncTeamPVPBattleOver_ShowResult, msg.ourCaptureProgress, msg.enemyCaptureProgress) else private.SetResult(msg.ourCaptureProgress, msg.enemyCaptureProgress) private.CheckStypeShow(msg) --播放MVP等击杀风格ui end end function private.CheckStypeShow(msg) local playerID = BattleDataGetter.GetCurPlayerID() local killNum = 0 for i,v in ipairs(msg.ourFighterRecords) do if v.playerId == playerID then killNum = v.killNum end end local killStyle = nil for i,v in ipairs(KillEffect) do if v.min <= killNum and v.max >= killNum then if i == #KillEffect then CTL.Sound.PlayGameSound("UI_unique") end killStyle = v end end if playerID == msg.ourBestFighter then curKillStyle = killStyle UIManager.OpenView(Const_UI_Lua.UIEnum.UISyncTeamPVPSummary,{mvp = true, IDSPath = MVPIDSPath, ImgPath = MVPImgPath, ImgBg = MVPImgBg}) elseif killStyle then UIManager.OpenView(Const_UI_Lua.UIEnum.UISyncTeamPVPSummary,killStyle) else UIManager.OpenView(Const_UI_Lua.UIEnum.UISyncTeamPVPBattleOverPanel) EventSystem.Dispatch(EventID.UI_SyncTeamPVPBattleOver_ShowResult, private._myProgress, private._otherProgess) end end function SyncTeamPVP_Controller.OnClosePvpSummary() if curKillStyle then UIManager.OpenView(Const_UI_Lua.UIEnum.UISyncTeamPVPSummary,curKillStyle) curKillStyle = nil else UIManager.OpenView(Const_UI_Lua.UIEnum.UISyncTeamPVPBattleOverPanel) EventSystem.Dispatch(EventID.UI_SyncTeamPVPBattleOver_ShowResult, private._myProgress, private._otherProgess) end end function SyncTeamPVP_Controller.ReOpenSelectHeroPanel() if MDL.SyncTeamPVP.GetReopenSelectHero() == true then UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UISyncTeamPVPSelectHeroPanel) MDL.SyncTeamPVP.SetReopenSelectHero(false) end end --杀敌显示UI function private.ShowKillTitleInfo(name_left, heroId_left, name_right, heroId_right, isKillerEnemy, leftAwaken, rightAwaken) local killInfo = { name_left = name_left, heroId_left = heroId_left, name_right = name_right, heroId_right = heroId_right, isKillerEnemy = isKillerEnemy, leftAwaken = leftAwaken, rightAwaken = rightAwaken, } if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIBattleKillTitle) then UIManager.OpenView(Const_UI_Lua.UIEnum.UIBattleKillTitle, killInfo) else EventSystem.Dispatch(EventID.UIBattle_KillTitle_StartShow, killInfo) end end function SyncTeamPVP_Controller.OpenHelpPanel() local v = PersistentData.PlayerData:Get(EnterSyncTeamPVPCount,0) if v < 2 then --前两次显示介绍界面 UIManager.OpenView(Const_UI_Lua.UIEnum.UISyncTeamPVPIntro) v = v + 1 PersistentData.PlayerData:Set(EnterSyncTeamPVPCount, v, true) end end function SyncTeamPVP_Controller.CanNotGetReward() return MDL.SyncTeamPVP.GetSyncTeamPVPCurNum() < TotalNum or MDL.SyncTeamPVP.GetSyncTeamPVPRewardDan() == MDL.SyncTeamPVP.GetSyncTeamPVPHistoryDan() end function SyncTeamPVP_Controller.HasSyncTVTWinReward() local winInfo = MDL.SyncTeamPVP.GetSyncTVTWinInfo() for i, v in DataSheetManager.ThreeBattleSeasonWin:GetEnumerator() do if winInfo.winNum >= v.ID and winInfo.maxReceivedRewardID < v.ID then return true end end return false end --是否有每日奖励 function private.IsHasDailyReward() local state = MDL.SyncTeamPVP.GetFirstWinOfEveryDayState() return state == MDL.SyncSolo.RewardState.NotGet end function private.RefreshRedPoint() if not SyncTeamPVP_Controller.CanNotGetReward() then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.FairPlay_SyncTeamPVP_Reward_DanReward) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.FairPlay_SyncTeamPVP_Reward_DanReward) end -- 胜场奖励 if SyncTeamPVP_Controller.HasSyncTVTWinReward() then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.FairPlay_SyncTeamPVP_Reward_WinCountReward) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.FairPlay_SyncTeamPVP_Reward_WinCountReward) end --每日奖励红点 if private.IsHasDailyReward() then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.FairPlay_SyncTeamPVP_DailyReward) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.FairPlay_SyncTeamPVP_DailyReward) end end function SyncTeamPVP_Controller.GetEloDesc() --+1的模式可能取到空值,因此使用try local __, data = DataSheetManager.ThreeBattleLevelData:TryGetDataByLevelID(MDL.SyncTeamPVP.GetCurDan() + 1) local forward = MDL.SyncTeamPVP.GetEloScore() if data then return forward .. "/" .. data.LevelScore else return forward end end --region 每日首胜 --获取每日首胜的固定奖励 function SyncTeamPVP_Controller.GetRewardOfEveryDay() local id = 1 --固定读取id为1的 local result = {} local data = DataSheetManager.ThreeBattleDailyWin:GetDataByID(id) if data then --固定奖励 local fixedReward = DataSheetManager.ThreeBattleDailyWinReward:GetDataByAttrRepeatID(data.StaticRewardID) if fixedReward == nil then return nil end result.FixedReward = fixedReward.Item_Table --随机奖励道具种类 result.RandomNum = data.RandomNum --随机奖励 local randomReward = DataSheetManager.RewardClientShow:GetDataByClientShowID(data.RandomRewardShowID) if randomReward == nil then return nil end result.RandomReward = DataSheetUtil.GetRewardClientShowItemTable(randomReward) return result end return nil end --endregion 每日首胜 -- 请不要直接使用数据中LevelRank这个字段, 使用一下方法来获取这个值 function SyncTeamPVP_Controller.GetLevelRankByData(teamData) local state = MDL.SyncTeamPVP.GetSyncSoloFairPlayState() -- 这里需要根据战区来判断一下 local levelRank = -1 if state == MDL.FairPlay.FairPlayState.AllSid then levelRank = teamData.LevelRank elseif state == MDL.FairPlay.FairPlayState.Local then levelRank = teamData.LevelRankSingle elseif state == MDL.FairPlay.FairPlayState.WarZone then levelRank = teamData.LevelRankWarZone else logging.error(LTAG.ERROR, "公平竞技状态 : SyncTeamPVP 当前状态不存在 state = ", state, ",请检查下发数据") end return levelRank end function SyncTeamPVP_Controller.IsWarZoneStyle() return MDL.SyncTeamPVP.GetSyncSoloFairPlayState() == MDL.FairPlay.FairPlayState.WarZone end --region 语音相关 --是否已经加入3V3实时语音房间 function SyncTeamPVP_Controller.IsEnter3V3VoiceRoom() logging.log(LTAG.LOG,"IsEnter3V3VoiceRoom",tostring(_isEnter3V3VoiceRoom)) return _isEnter3V3VoiceRoom end --设置加入3V3 实时语音状态 function SyncTeamPVP_Controller.SetEnter3V3VoiceRoom(state) logging.log(LTAG.LOG,"SetEnter3V3VoiceRoom",tostring(state)) _isEnter3V3VoiceRoom = state end local startVoiceTimer = nil --设置语音状态 call 麦状态,listen 收听状态 function SyncTeamPVP_Controller.VoiceCallSetState(call,listen,changeVoiceState) if GameAppInfo.IsJapanesePackage() then return end local roomId = MDL.SyncTeamPVP.GetBattleChatChannel() CTL.VoiceRoom.EnterVoiceRoom(MDL.VoiceRoom.VoiceRoomType.Room_3V3, roomId, listen, call) end --对实时语音音量和背景音进行处理 function SyncTeamPVP_Controller.SetVolume() if GameAppInfo.IsJapanesePackage() then return end local listen = CTL.VoiceRoom.IsEnabledListener() if not listen then return end if not private._hasSetVolume then --压低背景音 CTL.Sound.SetRTPCValue("Voice_Bus", 0) --放大实时语音音量 SDKUtil.SetChatVolume(130,130) private._hasSetVolume=true end end function SyncTeamPVP_Controller.ResetVolume() if GameAppInfo.IsJapanesePackage() then return end local listen = CTL.VoiceRoom.IsEnabledListener() if not listen then return end --设置过声音,且CD时间到了 if private._hasSetVolume then --恢复背景音 CTL.Sound.SetRTPCValue("Voice_Bus", 100) private._hasSetVolume=false end end function SyncTeamPVP_Controller.OnShutDown() SyncTeamPVP_Controller.ResetVolume() end function private.OnServerRoomInitStateResp(roomType) if roomType == MDL.VoiceRoom.VoiceRoomType.Room_3V3 then local listenerState, microState = MDL.VoiceRoom.GetVoiceRoomInitState(roomType) CTL.SyncTeamPVP.VoiceCallSetState(microState, listenerState, MDL.SyncTeamPVP.ChangeVoiceState.ChangeAll) end end --endregion return SyncTeamPVP_Controller