XRoomManagerCreator = function() ---@class XRoomManager local XRoomManager = { IsOpen = false, UiRoom = nil, UiOnlineInstance = nil, Matching = false, MatchStageId = nil, RoomData = nil, StageInfo = nil, --关卡 } XRoomManager.PlayerState = { Normal = 0, Ready = 1, Select = 2, Clump = 3, Fight = 4, Settle = 5, } XRoomManager.IndexType = { Left = 1, Center = 2, Right = 3, Max = 3 } XRoomManager.RoomState = { Normal = 0, Fight = 1, Settle = 2, Close = 3, } local RequestProto = { -- gateServer JoinFightRequest = "JoinFightRequest", --请求进入战斗服(gate) -- 普通联机 CreateRoomRequest = "CreateRoomRequest", --创建房间 MatchRoomRequest = "MatchRoomRequest", --匹配 CancelMatchRequest = "CancelMatchRequest", --取消匹配 QuitRoomRequest = "QuitRoomRequest", --退出房间 ReadyRequest = "ReadyRequest", --准备 CancelReadyRequest = "CancelReadyRequest", --取消准备 EnterFightRequest = "EnterFightRequest", -- 进入战斗 SelectRequest = "SelectRequest", --抽卡 ChangeLeaderRequest = "ChangeLeaderRequest", --切换房主 KickOutRequest = "KickOutRequest", --踢人 AddLikeRequest = "AddLikeRequest", -- 添加喜欢 UpdateLoadProcessRequest = "UpdateLoadProcessRequest", -- 更新进度 EnterTargetRoomRequest = "EnterTargetRoomRequest", -- 进入目标房间 SelectRewardRequest = "SelectRewardRequest", -- 选择奖励 BeginSelectRequest = "BeginSelectRequest", -- 进入切换角色状态 EndSelectRequest = "EndSelectRequest", -- 退出切换角色状态 SetStageLevelRequest = "SetStageLevelRequest", -- 请求设置副本难度 SetAutoMatchRequest = "SetAutoMatchRequest", --设置自动匹配是否开启 SetAbilityLimitRequest = "SetAbilityLimitRequest", --修改房间战力限制 SetStageIdRequest = "SetStageIdRequest", --修改关卡id MatchRoomByStageTypeRequest = "MatchRoomByStageTypeRequest", --根据关卡类型进行匹配 -- 区域联机相关 ArenaOnlineCreateRoomRequest = "ArenaOnlineCreateRoomRequest", --创建房间 ArenaOnlineStartMatchReqeust = "ArenaOnlineStartMatchReqeust", --匹配 ArenaOnlineCancelMatchRequest = "ArenaOnlineCancelMatchRequest", --取消匹配 ArenaOnlineQuitRoomRequest = "ArenaOnlineQuitRoomRequest", --退出房间 ArenaOnlineReadyRequest = "ArenaOnlineReadyRequest", --准备 ArenaOnlineCancelReadyRequest = "ArenaOnlineCancelReadyRequest", --取消准备 ArenaOnlineEnterFightRequest = "ArenaOnlineEnterFightRequest", -- 进入战斗 ArenaOnlineSelectRequest = "ArenaOnlineSelectRequest", --抽卡 ArenaOnlineChangeLeaderRequest = "ArenaOnlineChangeLeaderRequest", --切换房主 ArenaOnlineKickOutRequest = "ArenaOnlineKickOutRequest", --踢人 ArenaOnlineAddLikeRequest = "ArenaOnlineAddLikeRequest", -- 添加喜欢 ArenaOnlineUpLoadProcessRequest = "ArenaOnlineUpLoadProcessRequest", -- 更新进度 ArenaOnlineEnterRoomRequest = "ArenaOnlineEnterRoomRequest", -- 进入目标房间 ArenaOnlineSelectRewardRequest = "ArenaOnlineSelectRewardRequest", -- 选择奖励 ArenaOnlineBeginSelectRequest = "ArenaOnlineBeginSelectRequest", -- 进入切换角色状态 ArenaOnlineEndSelectRequest = "ArenaOnlineEndSelectRequest", -- 退出切换角色状态 ArenaOnlineSetLevelRequest = "ArenaOnlineSetLevelRequest", -- 请求设置副本难度 ArenaOnlineSetAutoMatchRequest = "ArenaOnlineSetAutoMatchRequest", --设置自动匹配是否开启 ArenaOnlineSetAbilityLimitRequest = "ArenaOnlineSetAbilityLimitRequest", --修改房间战力限制 ArenaOnlineSetStageIdRequest = "ArenaOnlineSetStageIdRequest", --修改关卡 -- 夏活拍照关联机相关 FubenPhotoCreateRoomRequest = "FubenPhotoCreateRoomRequest", --创建房间 FubenPhotoMatchRoomRequest = "FubenPhotoMatchRoomRequest", --匹配 FubenPhotoCancelMatchRequest = "FubenPhotoCancelMatchRequest", --取消匹配 FubenPhotoQuitRoomRequest = "FubenPhotoQuitRoomRequest", --退出房间 FubenPhotoReadyRequest = "FubenPhotoReadyRequest", --准备 FubenPhotoCancelReadyRequest = "FubenPhotoCancelReadyRequest", --取消准备 FubenPhotoEnterFightRequest = "FubenPhotoEnterFightRequest", -- 进入战斗 FubenPhotoChangeLeaderRequest = "FubenPhotoChangeLeaderRequest", --切换房主 FubenPhotoKickOutRequest = "FubenPhotoKickOutRequest", --踢人 FubenPhotoAddLikeRequest = "FubenPhotoAddLikeRequest", -- 添加喜欢 FubenPhotoUpdateLoadProcessRequest = "FubenPhotoUpdateLoadProcessRequest", -- 更新进度 FubenPhotoEnterTargetRoomRequest = "FubenPhotoEnterTargetRoomRequest", -- 进入目标房间 FubenPhotoBeginSelectRequest = "FubenPhotoBeginSelectRequest", -- 进入切换角色状态 FubenPhotoEndSelectRequest = "FubenPhotoEndSelectRequest", -- 退出切换角色状态 FubenPhotoSetAutoMatchRequest = "FubenPhotoSetAutoMatchRequest", --设置自动匹配是否开启 FubenPhotoChangeMapRequest = "FubenPhotoChangeMapRequest", --修改关卡 FubenPhotoSelectRequest = "FubenPhotoSelectRequest", --选择角色 } function XRoomManager.SetRoomData(roomData) XRoomManager.RoomData = roomData if roomData and roomData.RecommendClass then XDataCenter.MultiDimManager.RefreshMatchCareer() end if not roomData then XRoomManager.RemoveHidingRoom("UiMultiplayerRoom") XRoomManager.RemoveHidingRoom("UiMultiplayerRoomCute") end end --获取默认角色 function XRoomManager.GetDefaultChar() local list = XDataCenter.CharacterManager.GetOwnCharacterList() local char for _, v in pairs(list) do if not char or v.Ability > char.Ability then char = v end end return char end function XRoomManager.CheckPlayerStagePass() if not XRoomManager.RoomData then return false end for _, v in pairs(XRoomManager.RoomData.PlayerDataList) do if v.Id == XPlayer.Id and v.HaveFirstPass then return true end end return false end --创建房间 function XRoomManager.CreateRoom(stageId, cb) local req = { StageId = stageId, StageLevel = 1, AutoMatch = true, } XNetwork.Call(RequestProto.CreateRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.Matching = false XRoomManager.MatchStageId = nil XRoomManager.OnCreateRoom(res.RoomData) if cb then cb() end end) end --夏活照相关创建房间 function XRoomManager.PhotoCreateRoom(stageId, cb) local req = { StageId = stageId, StageLevel = 1, AutoMatch = true, } XNetwork.Call(RequestProto.FubenPhotoCreateRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.Matching = false XRoomManager.MatchStageId = nil XRoomManager.OnCreateRoom(res.RoomData) if cb then cb() end end) end -- 区域联机创建房间 function XRoomManager.ArenaOnlineCreateRoom(stageId, cb) local req = { ChallengeId = stageId, ChallengeLevel = 1, AutoMatch = true, } XNetwork.Call(RequestProto.ArenaOnlineCreateRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.Matching = false XRoomManager.MatchStageId = nil XRoomManager.OnCreateRoom(res.Room, XDataCenter.FubenManager.StageType.ArenaOnline) if cb then cb() end end) end function XRoomManager.OnCreateRoom(roomData, stageType) local stageId = roomData.StageId stageType = stageType or XFubenConfigs.GetStageType(stageId) -- 创建房间 if XDataCenter.RoomManager.RoomData then XLog.Error("XRoomManager.OnCreateRoom错误, RoomManager中RoomData已经有数据") XRoomManager.SetRoomData(roomData) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_REFRESH, roomData) else XRoomManager.SetRoomData(roomData) XRoomManager.Matching = false XRoomManager.MatchStageId = nil --如果是聊天跳转,需要先关闭聊天 if XLuaUiManager.IsUiShow("UiChatServeMain") then XUiHelper.CloseUiChatServeMain() end if XDataCenter.FubenSpecialTrainManager.IsStageCute(stageId) then XLuaUiManager.Open("UiMultiplayerRoomCute") else XLuaUiManager.Open("UiMultiplayerRoom") end local challengeId = roomData.ChallengeId local stageInfo if XDataCenter.FubenManager.StageType.ArenaOnline == stageType then stageInfo = XDataCenter.ArenaOnlineManager.GetStageInfo(challengeId) else stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) end XDataCenter.RoomManager.StageInfo = stageInfo XEventManager.DispatchEvent(XEventId.EVENT_ROOM_ENTER_ROOM) end end function XRoomManager.BeginSelectRequest(cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineBeginSelectRequest(cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoBeginSelectRequest(cb) else XRoomManager.NormalBeginSelectRequest(cb) end end function XRoomManager.NormalBeginSelectRequest(cb) XNetwork.Call(RequestProto.BeginSelectRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end function XRoomManager.PhotoBeginSelectRequest(cb) XNetwork.Call(RequestProto.FubenPhotoBeginSelectRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end function XRoomManager.ArenaOnlineBeginSelectRequest(cb) XNetwork.Call(RequestProto.ArenaOnlineBeginSelectRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local roomData = XRoomManager.RoomData for _, playerData in pairs(roomData.PlayerDataList) do if XPlayer.Id == playerData.Id then playerData.State = XDataCenter.RoomManager.PlayerState.Select XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_STAGE_REFRESH, playerData) break end end if cb then cb() end end) end function XRoomManager.EndSelectRequest(cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineEndSelectRequest(cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoEndSelectRequest(cb) else XRoomManager.NormalEndSelectRequest(cb) end end function XRoomManager.NormalEndSelectRequest(cb) XNetwork.Call(RequestProto.EndSelectRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end function XRoomManager.PhotoEndSelectRequest(cb) XNetwork.Call(RequestProto.FubenPhotoEndSelectRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end function XRoomManager.ArenaOnlineEndSelectRequest(cb) XNetwork.Call(RequestProto.ArenaOnlineEndSelectRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local roomData = XRoomManager.RoomData for _, playerData in pairs(roomData.PlayerDataList) do if XPlayer.Id == playerData.Id then playerData.State = XDataCenter.RoomManager.PlayerState.STOP XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_STAGE_REFRESH, playerData) break end end if cb then cb() end end) end --匹配 function XRoomManager.Match(stageId, cb, needMatchCountCheck) local req = { StageId = stageId, NeedMatchCountCheck = needMatchCountCheck } XNetwork.Call(RequestProto.MatchRoomRequest, req, function(res) if res.Code ~= XCode.Success then if res.Code == XCode.MatchInvalidToManyMatchPlayers then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH_PLAYERS) else XUiManager.TipCode(res.Code) end return end XRoomManager.Matching = true XRoomManager.MatchStageId = stageId if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH) end) end --匹配 function XRoomManager.MultiMatch(stageIds, cb, needMatchCountCheck) local req = { StageIds = stageIds, NeedMatchCountCheck = needMatchCountCheck } XNetwork.Call(RequestProto.MatchRoomRequest, req, function(res) if res.Code ~= XCode.Success then if res.Code == XCode.MatchInvalidToManyMatchPlayers then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH_PLAYERS, res.RecommendStageId) else XUiManager.TipCode(res.Code) end return end XRoomManager.Matching = true --根据StageIds匹配房间 无具体StageId 故填0 XRoomManager.MatchStageId = 0 if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH) end) end --匹配 function XRoomManager.PhotoMatch(stageIds, cb, needMatchCountCheck) local req = { StageIds = stageIds, NeedMatchCountCheck = needMatchCountCheck } XRoomManager.MatchType = XDataCenter.FubenManager.StageType.FubenPhoto XNetwork.Call(RequestProto.FubenPhotoMatchRoomRequest, req, function(res) if res.Code ~= XCode.Success then if res.Code == XCode.MatchInvalidToManyMatchPlayers then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH_PLAYERS, res.RecommendStageId) else XUiManager.TipCode(res.Code) end return end XRoomManager.Matching = true --根据StageIds匹配房间 无具体StageId 故填0 XRoomManager.MatchStageId = 0 if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH) end) end -- 区域联机匹配 function XRoomManager.AreanaOnlineMatch(stageId, cb) local req = { ChallengeId = stageId } XRoomManager.MatchType = XDataCenter.FubenManager.StageType.ArenaOnline XNetwork.Call(RequestProto.ArenaOnlineStartMatchReqeust, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.Matching = true XRoomManager.MatchStageId = stageId if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH) end) end --取消匹配 function XRoomManager.CancelMatch(cb) if XRoomManager.MatchType == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.CancelArenaOnlineMatch(cb) elseif XRoomManager.MatchType == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.CancelPhotoMatch(cb) else XRoomManager.CancelNormalMatch(cb) end end --取消正常匹配 function XRoomManager.CancelNormalMatch(cb) if XRoomManager.DoingCancel or not XRoomManager.Matching then return end XRoomManager.DoingCancel = true local req = { StageId = XRoomManager.MatchStageId } XNetwork.Call(RequestProto.CancelMatchRequest, req, function(res) XRoomManager.DoingCancel = false if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.Matching = false XRoomManager.MatchStageId = nil if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH) end) end --取消夏活照相关匹配 function XRoomManager.CancelPhotoMatch(cb) if XRoomManager.DoingCancel or not XRoomManager.Matching then return end XRoomManager.DoingCancel = true local req = { StageId = XRoomManager.MatchStageId } XNetwork.Call(RequestProto.FubenPhotoCancelMatchRequest, req, function(res) XRoomManager.DoingCancel = false if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.Matching = false XRoomManager.MatchStageId = nil if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH) end) end -- 区域联机取消匹配 function XRoomManager.CancelArenaOnlineMatch(cb) XRoomManager.MatchType = nil if XRoomManager.DoingCancel or not XRoomManager.Matching then return end XRoomManager.DoingCancel = true local req = { } XNetwork.Call(RequestProto.ArenaOnlineCancelMatchRequest, req, function(res) XRoomManager.DoingCancel = false if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.Matching = false XRoomManager.MatchStageId = nil if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH) end) end --退出房间 function XRoomManager.Quit(cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineQuit(cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoQuit(cb) else XRoomManager.NormalQuit(cb) end end --普通退出房间 function XRoomManager.NormalQuit(cb) local req = {} XNetwork.Call(RequestProto.QuitRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) end if CS.XFightNetwork.IsConnected then -- 退出房间时如果已经连接战斗服,则断开连接 CS.XFightNetwork.Disconnect() end XRoomManager.SetRoomData(nil) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) if cb then cb() end end) end --夏活照相关退出房间 function XRoomManager.PhotoQuit(cb) local req = {} XNetwork.Call(RequestProto.FubenPhotoQuitRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) end if CS.XFightNetwork.IsConnected then -- 退出房间时如果已经连接战斗服,则断开连接 CS.XFightNetwork.Disconnect() end XRoomManager.SetRoomData(nil) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) if cb then cb() end end) end --区域联机退出房间 function XRoomManager.ArenaOnlineQuit(cb) local req = {} XNetwork.Call(RequestProto.ArenaOnlineQuitRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) end if CS.XFightNetwork.IsConnected then -- 退出房间时如果已经连接战斗服,则断开连接 CS.XFightNetwork.Disconnect() end XRoomManager.RoomData = nil XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) if cb then cb() end end) end -- 准备 function XRoomManager.Ready(cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineReady(cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoReady(cb) else XRoomManager.NormalReady(cb) end end --普通准备 function XRoomManager.NormalReady(cb) XNetwork.Call(RequestProto.ReadyRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end --夏活照相关准备 function XRoomManager.PhotoReady(cb) XNetwork.Call(RequestProto.FubenPhotoReadyRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end --区域联机准备 function XRoomManager.ArenaOnlineReady(cb) XNetwork.Call(RequestProto.ArenaOnlineReadyRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, v in pairs(roomData.PlayerDataList) do if v.Id == XPlayer.Id then v.State = XRoomManager.PlayerState.Ready XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_STAGE_REFRESH, v) return end end end if cb then cb() end end) end --取消准备 function XRoomManager.CancelReady(cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.CancelAreanOnlineReady(cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.CancelPhotoReady() else XRoomManager.CancelNormalReady() end end --普通取消准备 function XRoomManager.CancelNormalReady() XNetwork.Send(RequestProto.CancelReadyRequest, {}) end --夏活照相关取消准备 function XRoomManager.CancelPhotoReady() XNetwork.Send(RequestProto.FubenPhotoCancelReadyRequest, {}) end --区域联机取消准备 function XRoomManager.CancelAreanOnlineReady(cb) XNetwork.Call(RequestProto.ArenaOnlineCancelReadyRequest, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, v in pairs(roomData.PlayerDataList) do if v.Id == XPlayer.Id then v.State = XRoomManager.PlayerState.Normal XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_STAGE_REFRESH, v) return end end end if cb then cb() end end) end --进入战斗 function XRoomManager.Enter(cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineEnter(cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoEnter(cb) else XRoomManager.NormalEnter(cb) end end --普通进入战斗 function XRoomManager.NormalEnter(cb) if not XRoomManager.RoomData then return end local stageInfo = XDataCenter.FubenManager.GetStageInfo(XRoomManager.RoomData.StageId) if stageInfo.Type == XDataCenter.FubenManager.StageType.BossOnline and XDataCenter.FubenBossOnlineManager.CheckOnlineBossTimeOut() then XUiManager.TipMsg(CS.XTextManager.GetText("OnlineBossTimeOut")) return end XNetwork.Call(RequestProto.EnterFightRequest, {}, function(res) if res.Code ~= XCode.Success then if res.Code ~= XCode.MatchRoomInFight then XUiManager.TipCode(res.Code) end XLog.Debug("XRoomManager.NormalEnter error, " .. tostring(res.Code)) return end if cb then cb(res) end end) end --夏活照相关进入战斗 function XRoomManager.PhotoEnter(cb) if not XRoomManager.RoomData then return end XNetwork.Call(RequestProto.FubenPhotoEnterFightRequest, {}, function(res) if res.Code ~= XCode.Success then if res.Code ~= XCode.MatchRoomInFight then XUiManager.TipCode(res.Code) end XLog.Debug("XRoomManager.PhotoEnter error, " .. tostring(res.Code)) return end if cb then cb(res) end end) end --区域联机进入战斗 function XRoomManager.ArenaOnlineEnter(cb) if not XRoomManager.RoomData then return end XNetwork.Call(RequestProto.ArenaOnlineEnterFightRequest, {}, function(res) if res.Code ~= XCode.Success then if res.Code ~= XCode.MatchRoomInFight then XUiManager.TipCode(res.Code) end XLog.Debug("XRoomManager.ArenaOnlineEnter error, " .. tostring(res.Code)) return end if cb then cb(res) end end) end function XRoomManager.Select(charId, cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineSelect(charId, cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoSelect(charId,cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.SpecialTrainMusic or XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.SpecialTrainRhythmRank or XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.SpecialTrainBreakthrough or XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.SpecialTrainSnow then XRoomManager.RobotSelect(charId, cb) else XRoomManager.NormalSelect(charId, cb) end end function XRoomManager.NormalSelect(charId, cb) local req = { CharacterId = charId,IsRobot = false } XNetwork.Call(RequestProto.SelectRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb(res.Code) end end) end function XRoomManager.RobotSelect(charId, cb) local req = { CharacterId = charId,IsRobot = true } XNetwork.Call(RequestProto.SelectRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb(res.Code) end end) end function XRoomManager.PhotoSelect(charId, cb) local req = { CharacterId = charId, IsRobot = true } XNetwork.Call(RequestProto.FubenPhotoSelectRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb(res.Code) end end) end function XRoomManager.ArenaOnlineSelect(charId, cb) local req = { CharacterId = charId } XNetwork.Call(RequestProto.ArenaOnlineSelectRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb(res.Code) end end) end --切换房主 function XRoomManager.ChangeLeader(playerId, cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineChangeLeader(playerId, cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoChangeLeader(playerId, cb) else XRoomManager.NormalChangeLeader(playerId, cb) end end --普通切换房主 function XRoomManager.NormalChangeLeader(playerId, cb) local req = { PlayerId = playerId } XNetwork.Call(RequestProto.ChangeLeaderRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end --夏活照相关切换房主 function XRoomManager.PhotoChangeLeader(playerId, cb) local req = { PlayerId = playerId } XNetwork.Call(RequestProto.FubenPhotoChangeLeaderRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end --区域联机切换房主 function XRoomManager.ArenaOnlineChangeLeader(playerId, cb) local req = { PlayerId = playerId } XNetwork.Call(RequestProto.ArenaOnlineChangeLeaderRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, v in pairs(roomData.PlayerDataList) do if v.Id == playerId then v.Leader = true else v.Leader = false end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_NPC_REFRESH, v) end end if cb then cb() end end) end --踢出房间 function XRoomManager.KickOut(playerId, cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineKickOut(playerId, cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoKickOut(playerId, cb) else XRoomManager.NormalKickOut(playerId, cb) end end --普通踢出房间 function XRoomManager.NormalKickOut(playerId, cb) local req = { PlayerId = playerId } XNetwork.Call(RequestProto.KickOutRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end --普通踢出房间 function XRoomManager.PhotoKickOut(playerId, cb) local req = { PlayerId = playerId } XNetwork.Call(RequestProto.FubenPhotoKickOutRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end --踢出房间 function XRoomManager.ArenaOnlineKickOut(playerId, cb) local req = { PlayerId = playerId } XNetwork.Call(RequestProto.ArenaOnlineKickOutRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 设置房间等级难度 function XRoomManager.SetStageLevel(level, cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.AreanOnlineSetStageLevel(level, cb) else XRoomManager.NormalSetStageLevel(level, cb) end end -- 普通设置房间等级难度 function XRoomManager.NormalSetStageLevel(level, cb) local req = { Level = level } XNetwork.Call(RequestProto.SetStageLevelRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 区域联机设置房间等级难度 function XRoomManager.AreanOnlineSetStageLevel(level, cb) local data = XDataCenter.RoomManager.RoomData local req = { ChallengeId = data.ChallengeId,ChallengeLevel = level } XNetwork.Call(RequestProto.ArenaOnlineSetStageIdRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 夏活照相关设置关卡 function XRoomManager.PhotoChangeMapRequest(stageId, cb) local req = {StageId = stageId} XNetwork.Call(RequestProto.FubenPhotoChangeMapRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.RoomData.StageId = stageId XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CHANGE_STAGE) if cb then cb(stageId) end end) end -- 设置房间是否自动匹配 function XRoomManager.SetAutoMatch(autoMatch, cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineSetAutoMatch(autoMatch, cb) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoSetAutoMatch(autoMatch, cb) else XRoomManager.NormalSetAutoMatch(autoMatch, cb) end end -- 普通设置房间是否自动匹配 function XRoomManager.NormalSetAutoMatch(autoMatch, cb) local req = { AutoMatch = autoMatch } XNetwork.Call(RequestProto.SetAutoMatchRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 夏活照相关设置房间是否自动匹配 function XRoomManager.PhotoSetAutoMatch(autoMatch, cb) local req = { AutoMatch = autoMatch } XNetwork.Call(RequestProto.FubenPhotoSetAutoMatchRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 区域联机设置房间是否自动匹配 function XRoomManager.ArenaOnlineSetAutoMatch(autoMatch, cb) local req = { AutoMatch = autoMatch } XNetwork.Call(RequestProto.ArenaOnlineSetAutoMatchRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 设置房间战力限制 function XRoomManager.SetAbilityLimit(abilityLimit, cb) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineSetAbilityLimit(abilityLimit, cb) else XRoomManager.NormalSetAbilityLimit(abilityLimit, cb) end end -- 普通设置房间战力限制 function XRoomManager.NormalSetAbilityLimit(abilityLimit, cb) local req = { AbilityLimit = abilityLimit } XNetwork.Call(RequestProto.SetAbilityLimitRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 区域联机设置房间战力限制 function XRoomManager.ArenaOnlineSetAbilityLimit(abilityLimit, cb) local req = { AbilityLimit = abilityLimit } XNetwork.Call(RequestProto.ArenaOnlineSetAbilityLimitRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 区域联机设置关卡 function XRoomManager.ArenaOnlineSetStageId(stageId, cb) local data = XDataCenter.RoomManager.RoomData local req = { ChallengeId = stageId,ChallengeLevel = data.ChallengeLevel } XNetwork.Call(RequestProto.ArenaOnlineSetStageIdRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- function XRoomManager.AddLike(playerId) if XRoomManager.StageInfo then if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.AddArenaOnlineLike(playerId) return elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.AddPhotoLike(playerId) return end end XRoomManager.AddNormalLike(playerId) end function XRoomManager.AddNormalLike(playerId) local req = { PlayerId = playerId } XNetwork.Send(RequestProto.AddLikeRequest, req) end function XRoomManager.AddArenaOnlineLike(playerId) local req = { PlayerId = playerId } XNetwork.Send(RequestProto.ArenaOnlineAddLikeRequest, req) end --夏活拍照关喜欢 function XRoomManager.AddPhotoLike(playerId) local req = { PlayerId = playerId } XNetwork.Send(RequestProto.FubenPhotoAddLikeRequest, req) end function XRoomManager.UpdateLoadProcess(progress) if not XRoomManager.RoomData then return end --战斗计算进度时会出现除零,导致progress无限小,服务端报错。Lua临时处理。 if progress < 0 then return end --更新进度 local req = { Process = progress } if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XNetwork.Send(RequestProto.ArenaOnlineUpLoadProcessRequest, req) elseif XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XNetwork.Send(RequestProto.FubenPhotoUpdateLoadProcessRequest, req) else XNetwork.Send(RequestProto.UpdateLoadProcessRequest, req) end end function XRoomManager.ClickEnterRoomHref(param, createTime) -- 前置自定义按键冲突检测 if XDataCenter.FubenManager.CheckCustomUiConflict() then return end if not param then return end local result = string.Split(param, '|') local roomId = result[1] local stageId = tonumber(result[2]) local roomType = tonumber(result[3]) -- 处理开房链接,狙击战走这里,其他走通用 local unionFightData = XDataCenter.FubenUnionKillRoomManager.GetUnionRoomData() if unionFightData and unionFightData.Id then XUiManager.TipCode(XCode.MatchPlayerAlreadyInRoom) return end if MultipleRoomType.UnionKill == roomType then XDataCenter.FubenUnionKillRoomManager.ClickEnterRoomHref(roomId, createTime) return end local tempStageId = stageId if MultipleRoomType.ArenaOnline == roomType then local level = tonumber(result[4]) tempStageId = XDataCenter.ArenaOnlineManager.GetStageIdByIdAndLevel(stageId, level) end if MultipleRoomType.DlcHunt == roomType then XDataCenter.DlcRoomManager.ClickEnterRoomHref(roomId, stageId, createTime) return end local stageInfo = XDataCenter.FubenManager.GetStageInfo(tempStageId) if not stageInfo then return end local fubenName = "" if stageInfo.Type == XDataCenter.FubenManager.StageType.BossOnline then fubenName = XFunctionManager.FunctionName.FubenActivity elseif stageInfo.Type == XDataCenter.FubenManager.StageType.Daily then local challengeCfg = XDataCenter.FubenDailyManager.GetDailyCfgBySectionId(stageInfo.DailySectionId) if challengeCfg and challengeCfg.Type == XDataCenter.FubenManager.ChapterType.EMEX then fubenName = XFunctionManager.FunctionName.FubenDailyEMEX end elseif stageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then fubenName = XFunctionManager.FunctionName.ArenaOnline elseif stageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then fubenName = XFunctionManager.FunctionName.SpecialTrain end if not XFunctionManager.DetectionFunction(fubenName) then return end --超链接点击 if stageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then --XRoomManager.ArenaOnlineEnterTargetRoom(roomId, stageId, createTime) XUiManager.TipText("ActivityAlreadyClose") elseif stageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then XRoomManager.PhotoEnterTargetRoom(roomId, stageId, createTime) else XRoomManager.NormalEnterTargetRoom(roomId, stageId, createTime) end end function XRoomManager.NormalEnterTargetRoom(roomId, stageId, createTime) --进入房间 if XRoomManager.RoomData then XUiManager.TipCode(XCode.MatchPlayerAlreadyInRoom) return end if XTime.GetServerNowTimestamp() > createTime + CS.XGame.Config:GetInt("RoomHrefDisableTime") then XUiManager.TipText("RoomHrefDisabled") return end local req = { RoomId = roomId, StageId = stageId } XNetwork.Call(RequestProto.EnterTargetRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.OnCreateRoom(res.RoomData) XUiManager.TipText("OnlineInstanceEnterRoom", XUiManager.UiTipType.Success) end) end function XRoomManager.PhotoEnterTargetRoom(roomId, stageId, createTime) --进入房间 if XRoomManager.RoomData then XUiManager.TipCode(XCode.MatchPlayerAlreadyInRoom) return end if XTime.GetServerNowTimestamp() > createTime + CS.XGame.Config:GetInt("RoomHrefDisableTime") then XUiManager.TipText("RoomHrefDisabled") return end local req = { RoomId = roomId, StageId = stageId } XNetwork.Call(RequestProto.FubenPhotoEnterTargetRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XRoomManager.OnCreateRoom(res.RoomData) XUiManager.TipText("OnlineInstanceEnterRoom", XUiManager.UiTipType.Success) end) end function XRoomManager.ArenaOnlineEnterTargetRoom(roomId, stageId, createTime) --进入房间 if XRoomManager.RoomData then XUiManager.TipCode(XCode.MatchPlayerAlreadyInRoom) return end if XTime.GetServerNowTimestamp() > createTime + CS.XGame.Config:GetInt("RoomHrefDisableTime") then XUiManager.TipText("RoomHrefDisabled") return end local req = { RoomId = roomId, StageId = stageId} XNetwork.Call(RequestProto.ArenaOnlineEnterRoomRequest, req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XDataCenter.ArenaOnlineManager.SetCurChapterId() XRoomManager.OnCreateRoom(res.Room) XUiManager.TipText("OnlineInstanceEnterRoom", XUiManager.UiTipType.Success) end) end function XRoomManager.SelectReward(pos) if XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then XRoomManager.ArenaOnlineSelectReward(pos) else XRoomManager.NormalSelectReward(pos) end end function XRoomManager.NormalSelectReward(pos) local req = { Pos = pos } XNetwork.Send(RequestProto.SelectRewardRequest, req) end function XRoomManager.ArenaOnlineSelectReward(pos) local req = { Pos = pos } XNetwork.Send(RequestProto.ArenaOnlineSelectRewardRequest, req) end function XRoomManager.OnJoinFightNotify(response) local roomData = XDataCenter.RoomManager.RoomData if not roomData then XLog.Error("XRoomManager.OnJoinFightNotify错误, RoomManager中RoomData没有数据,说明初始化数据失败或者还没有创建房间") return end XRoomManager.ChallengeId = XRoomManager.RoomData.ChallengeId XNetwork.Call(RequestProto.JoinFightRequest, { NodeId = response.NodeId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end -- 进入战斗前关闭所有弹出框 XDataCenter.FubenManager.OnEnterFight(res.FightData) end) end function XRoomManager.OnNewJoinFightNotify(response) XLog.Debug("XRoomManager.OnNewJoinFightNotify") XLog.Debug(response) local roomData = XDataCenter.RoomManager.RoomData if not roomData then XLog.Error("XRoomManager.OnNewJoinFightNotify error, roomData is nil") return end local cb = function(success) XLog.Debug("XRoomManager.OnNewJoinFightNotify Cb " .. tostring(success)) if success then XFightNetwork.Call("JoinFightRequest", {FightId = response.FightId, PlayerId = XPlayer.Id, Token = response.Token}, function(res) XRoomManager.OnJoinFightResponse(res, response.IpAddress) end) elseif not CS.XFight.IsOutFight then -- 网络错误,如果战斗已经启动,则退出战斗 CS.XFight.Instance:ExitOnOnlineDisconnect() end end CS.XFightNetwork.Connect(response.IpAddress, response.Port, cb) end function XRoomManager.OnJoinFightResponse(response, ip) XLog.Debug("XRoomManager.OnJoinFightResponse") if response.Code ~= XCode.Success then XLog.Error("XRoomManager.OnJoinFightResponse error, Code:" .. tostring(response.Code)) return end if not response.FightData then XLog.Error("XRoomManager.OnJoinFightResponse error, fightData is nil") CS.XFightNetwork.Disconnect() return end local roomData = XDataCenter.RoomManager.RoomData if not roomData then XLog.Error("XRoomManager.OnJoinFightResponse error, roomData is nil") CS.XFightNetwork.Disconnect() return end -- 连接战斗成功后开始心跳 CS.XFightNetwork.DoHeartbeat() if not response.Port or not response.Conv then XLog.Error("XRoomManager.OnJoinFightResponse error, port:" .. tostring(response.Port) .. " conv:" .. tostring(response.Conv)) -- 跳过kcp连接,直接进入战斗 XDataCenter.FubenManager.OnEnterFight(response.FightData) return end local cb = function(success) XLog.Debug("XRoomManager.OnJoinFightResponse Cb " .. tostring(success)) if not success then XLog.Error("kcp disconnect! use tcp for fight") end local roomData = XDataCenter.RoomManager.RoomData if not roomData then XLog.Error("XRoomManager.OnJoinFightResponse Cb error, roomData is nil") CS.XFightNetwork.Disconnect() return end XDataCenter.FubenManager.OnEnterFight(response.FightData) end -- 连接kcp CS.XFightNetwork.ConnectKcp(ip, response.Port, response.Conv, cb) end function XRoomManager.IsLeader(playerId) for _, v in pairs(XRoomManager.RoomData.PlayerDataList) do if v.Id == playerId and v.Leader then return true end end return false end function XRoomManager.SetStageIdRequest(stageId, cb) local req = { Id = stageId } XNetwork.Call(RequestProto.SetStageIdRequest,req,function(res) if res.Code ~= XCode.Success then XLog.Error("XRoomManager.SetStageIdRequest error, Code:" .. tostring(res.Code)) return end XRoomManager.RoomData.StageId = stageId XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CHANGE_STAGE) if cb then cb(stageId) end end) end function XRoomManager.MatchRoomByStageTypeRequest(stageType, cb, needMatchCountCheck) local req = { StageType = stageType, NeedMatchCountCheck = needMatchCountCheck } XNetwork.Call(RequestProto.MatchRoomByStageTypeRequest,req,function(res) if res.Code ~= XCode.Success then if res.Code == XCode.MatchInvalidToManyMatchPlayers then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH_PLAYERS) else XLog.Error("XRoomManager.MatchRoomByStageTypeRequest, Code:".. tostring(res.Code)) end return end XRoomManager.Matching = true --根据关卡类型匹配房间 无具体StageId 故填0 XRoomManager.MatchStageId = 0 if cb then cb() end end) end function XRoomManager.OnDisconnect() -- -- 区域联机重连不做任何处理 -- if XRoomManager.StageInfo and XRoomManager.StageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then -- return -- end -- if XRoomManager.Matching then -- XRoomManager.Matching = false -- XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH) -- end -- if XRoomManager.RoomData then -- -- 关战斗 -- if CS.XFight.Instance and CS.XFight.Instance.Online then -- XLuaUiManager.Close("UiLoading") -- XLuaUiManager.Close("UiOnLineLoading") -- CS.XFight.ClearFight() -- end -- if XLuaUiManager.IsUiShow("UiChatServeMain") then -- XLuaUiManager.Close("UiChatServeMain") -- end -- if XLuaUiManager.IsUiShow("UiDialog") then -- XLuaUiManager.Close("UiDialog") -- end -- -- 关房间 -- if XLuaUiManager.IsUiShow("UiMultiplayerRoom") then -- XLuaUiManager.Close("UiMultiplayerRoom") -- else -- XLuaUiManager.Remove("UiMultiplayerRoom") -- end -- XLuaUiManager.ShowTopUi() -- -- 提示&清数据 -- XUiManager.TipText("OnlineRoomOnDisconnet") -- XRoomManager.RoomData = nil -- XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) -- end end XRoomManager.CloseMultiPlayerRoom = function() XLuaUiManager.Close("UiMultiplayerRoom") if XLuaUiManager.IsUiLoad("UiMultiplayerRoomCute") then XLuaUiManager.Close("UiMultiplayerRoomCute") end end XRoomManager.RemoveMultiPlayerRoom = function() XLuaUiManager.Remove("UiMultiplayerRoom") if XLuaUiManager.IsUiLoad("UiMultiplayerRoomCute") then XLuaUiManager.Remove("UiMultiplayerRoomCute") end end XRoomManager.RemoveHidingRoom = function(uiName) if not XLuaUiManager.IsUiShow(uiName) then XLuaUiManager.Remove(uiName) end end -- 监听断网 XEventManager.AddEventListener(XEventId.EVENT_NETWORK_DISCONNECT, XRoomManager.OnDisconnect, XRoomManager) return XRoomManager end XRpc.SelectRewardNotify = function(data) XEventManager.DispatchEvent(XEventId.EVENT_ONLINEBOSS_DROPREWARD_NOTIFY, data) end XRpc.NotifyArenaOnlineSelectReward = function(data) XEventManager.DispatchEvent(XEventId.EVENT_ONLINEBOSS_DROPREWARD_NOTIFY, data) end --踢出房间 XRpc.KickOutNotify = function(response) if response.Code and response.Code ~= XCode.Success and response.Code ~= XCode.MatchPlayerOffline then XUiManager.TipCode(response.Code) end if CS.XFightNetwork.IsConnected then -- 退出房间时如果已经连接战斗服,则断开连接 CS.XFightNetwork.Disconnect() end XDataCenter.RoomManager.SetRoomData(nil) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_KICKOUT) end --踢出房间 XRpc.FubenPhotoKickOutNotify = function(response) if response.Code and response.Code ~= XCode.Success and response.Code ~= XCode.MatchPlayerOffline then XUiManager.TipCode(response.Code) end if CS.XFightNetwork.IsConnected then -- 退出房间时如果已经连接战斗服,则断开连接 CS.XFightNetwork.Disconnect() end XDataCenter.RoomManager.SetRoomData(nil) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_KICKOUT) end --更新进度条 XRpc.RefreshLoadProcessNotify = function(response) XEventManager.DispatchEvent(XEventId.EVENT_FIGHT_PROGRESS, response.PlayerId, response.Process) end --更新进度条 XRpc.FubenPhotoRefreshLoadProcessNotify = function(response) XEventManager.DispatchEvent(XEventId.EVENT_FIGHT_PROGRESS, response.PlayerId, response.Process) end XRpc.FightPlayerListNotify = function(response) XDataCenter.RoomManager.FightPlayerList = response.PlayerIdList end --踢人倒计时 XRpc.OnCountDownNotify = function(response) if response.TimeCount == 0 then XDataCenter.RoomManager.CountDowning = false else XDataCenter.RoomManager.CountDowning = true end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_COUNT_DOWN, response.TimeCount) end --匹配通知 XRpc.MatchNotify = function(response) if not XDataCenter.RoomManager.Matching then return end if response.Code == XCode.Success then XDataCenter.RoomManager.OnCreateRoom(response.RoomData) elseif response.Code == XCode.MatchServiceMatchTimeout then XDataCenter.RoomManager.Matching = false XDataCenter.RoomManager.MatchStageId = nil XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH_TIMEOUT) else XDataCenter.RoomManager.Matching = false XDataCenter.RoomManager.MatchStageId = nil XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH) end end --匹配通知 XRpc.FubenPhotoMatchNotify = function(response) if not XDataCenter.RoomManager.Matching then return end if response.Code == XCode.Success then XDataCenter.RoomManager.OnCreateRoom(response.RoomData) else XDataCenter.RoomManager.Matching = false XDataCenter.RoomManager.MatchStageId = nil XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH) end end --联机匹配成功通知 XRpc.NotifyArenaOnlineMatchFinish = function(response) if not XDataCenter.RoomManager.Matching then return end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH) XDataCenter.RoomManager.OnCreateRoom(response.Room) end --联机匹配失败通知 XRpc.NotifyArenaOnlineMatchFail = function() if not XDataCenter.RoomManager.Matching then return end XDataCenter.RoomManager.Matching = false XDataCenter.RoomManager.MatchStageId = nil XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH) end XRpc.PlayerSyncInfoNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, playerInfo in pairs(response.PlayerInfoList) do for _, v in pairs(roomData.PlayerDataList) do if v.Id == playerInfo.Id then if playerInfo.State ~= nil then v.State = playerInfo.State end if playerInfo.Leader ~= nil then v.Leader = playerInfo.Leader end if playerInfo.FightNpcData ~= nil then v.FightNpcData = playerInfo.FightNpcData end if XTool.IsNumberValid(playerInfo.RankScore) then v.RankScore = playerInfo.RankScore end break end end end -- 先赋值再通知事件 for _, playerInfo in pairs(response.PlayerInfoList) do for _, v in pairs(roomData.PlayerDataList) do if v.Id == playerInfo.Id then if playerInfo.FightNpcData then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_NPC_REFRESH, v) else XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_STAGE_REFRESH, v) end break end end end end end XRpc.FubenPhotoPlayerSyncInfoNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, playerInfo in pairs(response.PlayerInfoList) do for _, v in pairs(roomData.PlayerDataList) do if v.Id == playerInfo.Id then v.State = playerInfo.State v.Leader = playerInfo.Leader if playerInfo.FightNpcData then v.FightNpcData = playerInfo.FightNpcData end break end end end -- 先赋值再通知事件 for _, playerInfo in pairs(response.PlayerInfoList) do for _, v in pairs(roomData.PlayerDataList) do if v.Id == playerInfo.Id then if playerInfo.FightNpcData then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_NPC_REFRESH, v) else XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_STAGE_REFRESH, v) end break end end end end end XRpc.NotifyArenaOnlineFightNpcData = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, v in pairs(roomData.PlayerDataList) do if v.Id == response.PlayerId then if response.FightNpcData then v.FightNpcData = response.FightNpcData XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_NPC_REFRESH, v) return end end end end end XRpc.NotifyArenaOnlineLeaderChange = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, v in pairs(roomData.PlayerDataList) do if v.Id == response.LeaderId then v.Leader = true else v.Leader = false end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_NPC_REFRESH, v) end end end XRpc.NotifyArenaOnlinePlayerState = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, state in pairs(response.PlayerStateList) do for _, playerData in pairs(roomData.PlayerDataList) do if state.PlayerId == playerData.Id then playerData.State = state.PlayerState XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_STAGE_REFRESH, playerData) break end end end end end XRpc.PlayerEnterNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then table.insert(roomData.PlayerDataList, response.PlayerData) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_ENTER, response.PlayerData) if roomData.RecommendClass then XDataCenter.MultiDimManager.RefreshMatchCareer() XEventManager.DispatchEvent(XEventId.EVENT_ROOM_REFRESH) end end end XRpc.FubenPhotoPlayerEnterNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then table.insert(roomData.PlayerDataList, response.PlayerData) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_ENTER, response.PlayerData) end end XRpc.NotifyArenaOnlinePlayerEnter = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then table.insert(roomData.PlayerDataList, response.Player) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_ENTER, response.Player) end end XRpc.PlayerLeaveNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, targetId in pairs(response.Players) do for k, v in pairs(roomData.PlayerDataList) do if v.Id == targetId then table.remove(roomData.PlayerDataList, k) if roomData and roomData.RecommendClass then XDataCenter.MultiDimManager.RefreshMatchCareer() XEventManager.DispatchEvent(XEventId.EVENT_ROOM_REFRESH) end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_LEAVE, targetId) break end end end end end XRpc.FubenPhotoPlayerLeaveNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, targetId in pairs(response.Players) do for k, v in pairs(roomData.PlayerDataList) do if v.Id == targetId then table.remove(roomData.PlayerDataList, k) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_LEAVE, targetId) break end end end end end XRpc.NotifyArenaOnlinePlayerLeave = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for k, v in pairs(roomData.PlayerDataList) do if v.Id == response.PlayerId then table.remove(roomData.PlayerDataList, k) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_LEAVE, response.PlayerId) break end end end if response.NewLeaderId <= 0 then return end if not roomData then return end for _, v in pairs(roomData.PlayerDataList) do if v.Id == response.NewLeaderId then v.Leader = true else v.Leader = false end XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_NPC_REFRESH, v) end end XRpc.NotifyArenaOnlineForceBanish = function(response) local roomData = XDataCenter.RoomManager.RoomData if not roomData then return end if response.PlayerId == XPlayer.Id then if XDataCenter.RoomManager.IsLeader(response.PlayerId) then XUiManager.TipCode(XCode.MatchStartTimeout) else XUiManager.TipCode(XCode.MatchRoomLeaderForceLeave) end if CS.XFightNetwork.IsConnected then -- 退出房间时如果已经连接战斗服,则断开连接 CS.XFightNetwork.Disconnect() end XDataCenter.RoomManager.SetRoomData(nil) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_KICKOUT) else for k, v in pairs(roomData.PlayerDataList) do if v.Id == response.PlayerId then table.remove(roomData.PlayerDataList, k) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_LEAVE, response.PlayerId) break end end end end XRpc.JoinFightNotify = function(response) if not XDataCenter.RoomManager.RoomData then return end XDataCenter.RoomManager.OnJoinFightNotify(response) end XRpc.NewJoinFightNotify = function(response) if not XDataCenter.RoomManager.RoomData then XLog.Error("XRpc.NewJoinFightNotify, RoomManager中RoomData没有数据,说明初始化数据失败或者还没有创建房间") return end XDataCenter.RoomManager.OnNewJoinFightNotify(response) end XRpc.RoomInfoChangeNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData local lastAutoMatch = roomData.AutoMatch local lastStageLevel = roomData.StageLevel local lastAbilityLimit = roomData.AbilityLimit local lastStageId = roomData.StageId roomData.AutoMatch = response.AutoMatch roomData.StageLevel = response.StageLevel roomData.AbilityLimit = response.AbilityLimit roomData.StageId = response.StageId roomData.RecommendClass = response.RecommendClass if roomData.RecommendClass then XDataCenter.MultiDimManager.RefreshMatchCareer() XEventManager.DispatchEvent(XEventId.EVENT_ROOM_REFRESH) end -- 先全部赋值再发事件 if lastAutoMatch ~= roomData.AutoMatch then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_AUTO_MATCH_CHANGE, roomData.AutoMatch) end if lastStageLevel ~= roomData.StageLevel then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_LEVEL_CHANGE, lastStageLevel, roomData.StageLevel) end if lastAbilityLimit ~= roomData.AbilityLimit then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_ABILITY_LIMIT_CHANGE, lastAbilityLimit, roomData.AbilityLimit) end if lastStageId ~= roomData.StageId then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CHANGE_STAGE) end end XRpc.FubenPhotoRoomInfoChangeNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData local lastAutoMatch = roomData.AutoMatch local lastStageLevel = roomData.StageLevel local lastAbilityLimit = roomData.AbilityLimit roomData.AutoMatch = response.AutoMatch roomData.StageLevel = response.StageLevel roomData.AbilityLimit = response.AbilityLimit -- 先全部赋值再发事件 if lastAutoMatch ~= roomData.AutoMatch then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_AUTO_MATCH_CHANGE, roomData.AutoMatch) end if lastStageLevel ~= roomData.StageLevel then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_LEVEL_CHANGE, lastStageLevel, roomData.StageLevel) end if lastAbilityLimit ~= roomData.AbilityLimit then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_ABILITY_LIMIT_CHANGE, lastAbilityLimit, roomData.AbilityLimit) end end -- 区域联机战力变化 XRpc.NotifyArenaOnlineAbilityLimit = function(response) local roomData = XDataCenter.RoomManager.RoomData local lastAbilityLimit = roomData.AbilityLimit roomData.AbilityLimit = response.AbilityLimit if lastAbilityLimit ~= roomData.AbilityLimit then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_ABILITY_LIMIT_CHANGE, lastAbilityLimit, roomData.AbilityLimit) end end -- 区域联机难度变化 --XRpc.NotifyArenaOnlineStageLevel = function(response) --local roomData = XDataCenter.RoomManager.RoomData --local lastStageLevel = roomData.StageLevel --roomData.StageLevel = response.StageLevel --if lastStageLevel ~= roomData.StageLevel then --XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_LEVEL_CHANGE, lastStageLevel, roomData.StageLevel) --end --end -- 区域联机快速匹配变化 XRpc.NotifyArenaOnlineAutoMatch = function(response) local roomData = XDataCenter.RoomManager.RoomData local lastAutoMatch = roomData.AutoMatch roomData.AutoMatch = response.AutoMatch if lastAutoMatch ~= roomData.AutoMatch then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_AUTO_MATCH_CHANGE, roomData.AutoMatch) end end XRpc.RoomStateNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData roomData.State = response.State XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_CHANGE, response.State) end XRpc.FubenPhotoRoomStateNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData roomData.State = response.State XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_CHANGE, response.State) end XRpc.NotifyArenaOnlineRoomState = function(response) local roomData = XDataCenter.RoomManager.RoomData if not roomData then return end if response.RoomState == XDataCenter.RoomManager.RoomState.Close then XUiManager.TipMsg(CS.XTextManager.GetText("OnlineRoomClose")) if CS.XFightNetwork.IsConnected then -- 退出房间时如果已经连接战斗服,则断开连接 CS.XFightNetwork.Disconnect() end XDataCenter.RoomManager.SetRoomData(nil) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_KICKOUT) else roomData.State = response.RoomState XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_CHANGE, response.RoomState) end end -- 切换关卡通知 XRpc.NotifyArenaOnlineStageId = function(response) local roomData = XDataCenter.RoomManager.RoomData local oldLevel = roomData.ChallengeLevel local oldChallengeId = roomData.ChallengeId roomData.ChallengeId = response.ChallengeId roomData.ChallengeLevel = response.ChallengeLevel roomData.StageId = response.StageId roomData.StageLevel = response.StageLevel local showChange = oldChallengeId == response.ChallengeId if showChange then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_LEVEL_CHANGE, oldLevel, roomData.StageLevel) else XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CHANGE_STAGE) end end -- 战斗结束玩家信息推送 XRpc.NotifyArenaOnlinePlayerInfoChange = function(response) local roomData = XDataCenter.RoomManager.RoomData if roomData then for _, v in pairs(roomData.PlayerDataList) do if v.Id == response.PlayerId then v.AssistCount = response.AssistCount v.HaveFirstPass = response.HaveFirstPass XEventManager.DispatchEvent(XEventId.EVENT_ROOM_PLAYER_NPC_REFRESH, v) break end end end end XRpc.NotifyArenaOnlineTimeout = function() XUiManager.TipText("ArenaOnlineRoomConnectTimeOut") if CS.XFightNetwork.IsConnected then -- 退出房间时如果已经连接战斗服,则断开连接 CS.XFightNetwork.Disconnect() end XDataCenter.RoomManager.SetRoomData(nil) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_KICKOUT) end XRpc.FubenPhotoChangeMapNotify = function(response) local roomData = XDataCenter.RoomManager.RoomData local lastStageId = roomData.StageId if roomData then roomData.StageId = response.StageId XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CHANGE_STAGE_SUMMER_EPISODE) end if lastStageId ~= roomData.StageId then XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CHANGE_STAGE) end end XRpc.AddLikeNotify = function(data) XEventManager.DispatchEvent(XEventId.EVENT_ROOM_ADD_LIKE_NOTIFY,data) end