PGRData/Script/matrix/xmanager/XDlcRoomManager.lua

878 lines
30 KiB
Lua
Raw Permalink Normal View History

2024-09-01 20:49:41 +00:00
local XDlcHuntRoom = require("XEntity/XDlcHunt/XDlcHuntRoom")
local XDlcHuntSettle = require("XEntity/XDlcHunt/XDlcHuntSettle")
local XDlcHuntFightBeginData = require("XEntity/XDlcHunt/XDlcHuntFightBeginData")
XDlcRoomManagerCreator = function()
---@class XDlcRoomManager
local XDlcRoomManager = {}
-- private
---@type XDlcHuntRoom
local _Room = XDlcHuntRoom.New()
---@type XDlcHuntFightBeginData
local _FightBeginData = XDlcHuntFightBeginData.New()
---@type XDlcHuntSettle
local _Settle = XDlcHuntSettle.New()
local OldFocusTypeDlcHunt = false
--region debug
local _IsDebug = false
if _IsDebug then
local XDlcHuntDebug = require("XEntity/XDlcHunt/XDlcHuntDebug")
XDlcHuntDebug.Hack()
end
--region debug
local RequestProto = {
JoinWorldRequest = "JoinWorldRequest",
DlcCreateRoomRequest = "DlcCreateRoomRequest", --创建房间
DlcMatchRoomRequest = "DlcMatchRoomRequest", --匹配
DlcCancelMatchRequest = "DlcCancelMatchRequest", --取消匹配
DlcQuitRoomRequest = "DlcQuitRoomRequest", --退出房间
DlcReadyRequest = "DlcReadyRequest", --准备
DlcCancelReadyRequest = "DlcCancelReadyRequest", --取消准备
DlcEnterWorldRequest = "DlcEnterWorldRequest", -- 进入大世界
DlcSelectRequest = "DlcSelectRequest",
DlcChangeLeaderRequest = "DlcChangeLeaderRequest", --切换房主
DlcKickOutRequest = "DlcKickOutRequest", --踢人
DlcAddLikeRequest = "DlcAddLikeRequest", -- 添加喜欢
--DlcUpdateLoadProcessRequest = "DlcUpdateLoadProcessRequest", -- 更新进度
DlcEnterTargetRoomRequest = "DlcEnterTargetRoomRequest", -- 进入目标房间
DlcBeginSelectRequest = "DlcBeginSelectRequest", -- 进入切换角色状态
DlcEndSelectRequest = "DlcEndSelectRequest", -- 退出切换角色状态
DlcSetAutoMatchRequest = "DlcSetAutoMatchRequest", --设置自动匹配是否开启
DlcSetAbilityLimitRequest = "DlcSetAbilityLimitRequest", --修改房间战力限制
DlcBackOnlineRequest = "DlcBackOnlineRequest" -- 重连dlc世界
}
function XDlcRoomManager.Init()
CS.XGameEventManager.Instance:RegisterEvent(CS.XEventId.EVENT_DLCFIGHT_NPC_LOAD_COMPLETE, function(eventName, params)
-- local uuid = params[0]
local isLocalPlayer = params[1]
if isLocalPlayer then
XDataCenter.FubenManager.CloseFightLoading()
end
-- 教学关需要退出房间,但是为了指引,不能在进战斗瞬间关闭房间界面
if _Room and _Room:IsTutorial() then
XDlcRoomManager.Quit()
end
end)
CS.XGameEventManager.Instance:RegisterEvent(CS.XEventId.EVENT_DLC_FIGHT_PRE_EXIT, function(eventName, params)
local worldData = CS.StatusSyncFight.XFightClient.FightInstance.WorldData
if not worldData then
return
end
if worldData.IsLocalDebug then
return
end
if worldData.IsTeaching then
return
end
if not worldData.Online then
return
end
if not XLuaUiManager.IsUiShow("UiDlcHuntSettlement")
and not XLuaUiManager.IsUiPushing("UiDlcHuntSettlement")
and not XLuaUiManager.IsUiShow("UiDlcHuntPowerSettleLose")
and not XLuaUiManager.IsUiPushing("UiDlcHuntPowerSettleLose")
and not XLuaUiManager.IsUiShow("UiDlcHuntSettleLose")
and not XLuaUiManager.IsUiPushing("UiDlcHuntSettleLose")
then
XLuaUiManager.Open("UiBiancaTheatreBlack")
end
end)
CS.XGameEventManager.Instance:RegisterEvent(CS.XEventId.EVENT_WORLD_EXIT, function(eventName, params, c, d)
if OldFocusTypeDlcHunt then
XDataCenter.SetManager.SetFocusTypeDlcHunt(OldFocusTypeDlcHunt)
OldFocusTypeDlcHunt = false
end
if not XFightUtil.IsDlcOnline() then
return
end
if not params then
XDlcRoomManager.ChallengeLose()
return
end
local settleResult = params[0]
XDlcRoomManager.CallFinishFight(settleResult)
end)
end
function XDlcRoomManager.IsMatching()
return _Room:IsMatching()
end
function XDlcRoomManager.IsCancelingMatch()
return _Room:IsCancelingMatch()
end
---@return XDlcHuntTeam
function XDlcRoomManager.GetTeam(teamId)
return _Room:GetTeam(teamId)
end
function XDlcRoomManager.GetRoomState()
return _Room:GetState()
end
function XDlcRoomManager.IsRoomAutoMatch()
return _Room:IsAutoMatch()
end
-- match
---@param world XDlcHuntWorld
function XDlcRoomManager.Match(world, needMatchCountCheck)
if XDlcRoomManager.IsMatching() or XDlcRoomManager.IsCancelingMatch() then
return
end
local req = {
WorldInfoId = world:GetWorldId(),
NeedMatchCountCheck = needMatchCountCheck ~= false
}
local replyFunc = function(res)
if res.Code == XCode.MatchInvalidToManyMatchPlayers then
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH_PLAYERS, res.Code)
return
end
if res.Code == XCode.MatchPlayerHaveNotCreateRoom then
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_MATCH_PLAYERS, res.Code)
return
end
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
_Room:SetMatching(true)
end
XNetwork.Call(RequestProto.DlcMatchRoomRequest, req, replyFunc)
end
-- cancel match with DialogTip
function XDlcRoomManager.CancelMatch(callback)
local title = XUiHelper.GetText("TipTitle")
local cancelMatchMsg = XUiHelper.GetText("OnlineInstanceCancelMatch")
XUiManager.DialogTip(title, cancelMatchMsg, XUiManager.DialogType.Normal, nil, function()
XDataCenter.DlcRoomManager.ReqCancelMatch(callback)
end)
end
-- request cancel match
function XDlcRoomManager.ReqCancelMatch(reqCallback)
if not XDlcRoomManager.IsMatching() or XDlcRoomManager.IsCancelingMatch() then
return false
end
_Room:SetCancelingMatch(true)
local replyFunc = function(res)
_Room:SetCancelingMatch(false)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
_Room:SetMatching(false)
if reqCallback then
reqCallback()
end
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH)
end
--region Debug
if _IsDebug then
XScheduleManager.ScheduleOnce(function()
replyFunc({ Code = XCode.Success })
end, 0)
return
end
--endregion Debug
XNetwork.Call(RequestProto.DlcCancelMatchRequest, {}, replyFunc)
end
function XDlcRoomManager.CreateRoomTutorial()
local req = {
WorldInfoId = XDlcHuntConfigs.TUTORIAL_WORLD.Id,
LevelId = XDlcHuntConfigs.TUTORIAL_WORLD.LevelId,
BornPointId = nil,
IsOnline = false,
AutoMatch = false,
}
local replyFunc = function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
OldFocusTypeDlcHunt = XDataCenter.SetManager.FocusTypeDlcHunt
XDataCenter.SetManager.SetFocusTypeDlcHunt(XSetConfigs.FocusTypeDlcHunt.Auto)
XDlcRoomManager.OnCreateRoom(res.RoomData, false, true)
_Room:SetLevel(req.LevelId)
end
XNetwork.Call(RequestProto.DlcCreateRoomRequest, req, replyFunc)
end
function XDlcRoomManager.IsInTutorialWorld()
return OldFocusTypeDlcHunt and true or false
end
-- create room
---@param world XDlcHuntWorld
function XDlcRoomManager.CreateRoom(world, bornPointId, IsMultiplayer, cb)
local req = {
WorldInfoId = world:GetWorldId(),
--LevelId = 13,
BornPointId = bornPointId,
IsOnline = IsMultiplayer,
AutoMatch = true,
}
local replyFunc = function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
_Room:SetMatching(false)
if IsMultiplayer then
XDlcRoomManager.OnCreateRoom(res.RoomData)
if cb then
cb()
end
else
XDlcRoomManager.Enter(cb)
end
end
XNetwork.Call(RequestProto.DlcCreateRoomRequest, req, replyFunc)
end
-- enter world
function XDlcRoomManager.Enter(cb, callbackOnFail)
if _Room:IsTutorial() then
--(int WorldId, int LevelId, int PlayerId, int NpcId)
local worldId = _Room:GetWorldId()
local levelId = _Room:GetLevel()
local playerId = 0--XPlayer.Id
local member = _Room:GetTeam():GetSelfMember()
if not member then
XLog.Error("[XDlcRoomManager] Tutorial Room, member is not found")
return
end
local npcId = member:GetNpcId()
XLuaUiManager.Open("UiLoading", LoadingType.Fight)
--CS.StatusSyncFight.XFightClient.EnterWorldTutorial(worldId, levelId, playerId, npcId)
local playerData = CS.XWorldPlayerData()
playerData.Master = true
playerData.Id = playerId
local worldNpcData = CS.XWorldNpcData()
worldNpcData.Id = npcId
playerData.NpcList:Add(worldNpcData)
local worldData = CS.XWorldData()
worldData.WorldId = worldId
worldData.LevelId = levelId
worldData.Online = false
worldData.IsTeaching = true
worldData.Players:Add(playerData)
CS.StatusSyncFight.XFightClient.ExitFight()
CS.StatusSyncFight.XFightClient.EnterFight(worldData, playerId)
return
end
XNetwork.Call(RequestProto.DlcEnterWorldRequest, {}, function(res)
--此请求发送之后服务器会解散房间
if res.Code ~= XCode.Success then
if res.Code ~= XCode.MatchRoomInFight then
XUiManager.TipCode(res.Code)
end
XLog.Debug("XDlcRoomManager.Enter error, " .. tostring(res.Code))
if callbackOnFail then
callbackOnFail()
end
return
end
if cb then
cb(res)
end
end)
end
-- 设置房间是否自动匹配
function XDlcRoomManager.ReqSetAutoMatch(autoMatch)
local req = { AutoMatch = autoMatch }
XNetwork.Call(RequestProto.DlcSetAutoMatchRequest, req, function()
end)
end
function XDlcRoomManager.AddLike(playerId)
local req = { PlayerId = playerId }
XNetwork.Send(RequestProto.DlcAddLikeRequest, req, function(res)
if res.Code ~= XCode.MatchRoomInFight then
XUiManager.TipCode(res.Code)
end
end)
end
function XDlcRoomManager.IsReconnectFail()
local rejoinWorldInfo = XDlcRoomManager.ReJoinWorldInfo
if not rejoinWorldInfo then
return false
end
local remainTime = XDlcRoomManager.GetRejoinRemainTime()
if remainTime <= 0 then
return true, XDlcHuntConfigs.RECONNECT_FAIL.TIME_OUT
end
if rejoinWorldInfo.Result > 0 then
return true, rejoinWorldInfo.Result
end
return false
end
function XDlcRoomManager.OnNewJoinWorldNotify(response, isRejoin)
if response.Clear then
XDlcRoomManager.ReJoinWorldInfo = false
return
end
if response.Result and response.Result > 0 then
XDlcRoomManager.ReJoinWorldInfo = false
return
end
XLog.Debug("XDlcRoomManager.OnNewJoinWorldNotify,IsReJoin:" .. tostring(isRejoin))
XLuaUiManager.Open("UiLoading", LoadingType.Fight)
_FightBeginData:SetRoomData(_Room:GetData())
local disconnectCb = function()
if CS.StatusSyncFight.XFightClient.FightInstance == nil then
return
end
CS.StatusSyncFight.XFightClient.OnExitFight(true)
-- XDataCenter.FubenManager.CloseFightLoading()
--XDlcRoomManager.DialogReconnect()
end
local cb = function(success)
XLog.Debug("XDlcRoomManager.OnNewJoinWorldNotify Cb " .. tostring(success))
if success then
if isRejoin then
CS.XFightNetwork.IsHandleReconnectionComplete = true
end
XFightNetwork.Call(RequestProto.JoinWorldRequest, { WorldNo = response.WorldNo, PlayerId = XPlayer.Id, Token = response.Token, IsRejoin = isRejoin }, function(res)
XDlcRoomManager.OnJoinWorldResponse(res, response.IpAddress)
end)
else
-- 网络错误
disconnectCb()
end
end
XFightNetwork.Connect(response.IpAddress, response.Port, cb, isRejoin, disconnectCb)
end
-- 创建房间
function XDlcRoomManager.OnCreateRoom(roomData, isReconnect, isTutorial)
if XDlcRoomManager.IsInRoom() then
XLog.Error("XDlcRoomManager.OnCreateRoom错误, RoomManager中RoomData已经有数据")
XDlcRoomManager.SetRoomData(roomData)
_Room:SetIsReconnect(isReconnect)
_Room:SetIsTutorial(isTutorial)
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_REFRESH, roomData)
else
XDlcRoomManager.SetRoomData(roomData)
_Room:SetIsReconnect(isReconnect)
_Room:SetMatching(false)
_Room:SetIsTutorial(isTutorial)
--如果是聊天跳转,需要先关闭聊天
if XLuaUiManager.IsUiShow("UiChatServeMain") then
XLuaUiManager.Close("UiChatServeMain")
end
XLuaUiManager.Open("UiDlcHuntPlayerRoom2", _Room)
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_ENTER_ROOM)
end
end
--退出房间
function XDlcRoomManager.Quit(cb)
local req = {}
local reply = function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
end
if XFightNetwork.IsConnected() then
-- 退出房间时如果已经连接战斗服,则断开连接
CS.XFightNetwork.Disconnect()
end
XDlcRoomManager.SetRoomData(false)
if cb then
cb()
else
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM)
end
XDlcRoomManager.ReJoinWorldInfo = false
end
if _IsDebug then
XScheduleManager.ScheduleOnce(function()
reply({
Code = XCode.Success
})
end, 0)
return
end
XNetwork.Call(RequestProto.DlcQuitRoomRequest, req, reply)
end
local _SelectType = false
function XDlcRoomManager.BeginSelectRequest(selectType, cb)
if _IsDebug then
return
end
if _Room and _Room:IsTutorial() and selectType == XDlcHuntConfigs.RoomSelect.Character then
return
end
if _SelectType then
return
end
_SelectType = selectType
XNetwork.Call(RequestProto.DlcBeginSelectRequest, {
SelectType = selectType
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb()
end
end)
end
local function EndSelectRequest(selectType)
XNetwork.Call(RequestProto.DlcEndSelectRequest, {
EndSelectType = selectType
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
end)
end
function XDlcRoomManager.GetSelectingType()
return _SelectType
end
function XDlcRoomManager.ClearSelectType()
_SelectType = false
end
-- bug同时发送的请求服务端却不保证接收顺序导致要改成在上一个response之后再请求
function XDlcRoomManager.EndSelectRequest()
if _IsDebug then
return
end
if not XDlcRoomManager.IsInRoom() then
return
end
if not _SelectType then
return
end
local selectType = _SelectType
_SelectType = false
if XDlcRoomManager.IsInRoom() and selectType == XDlcHuntConfigs.RoomSelect.Character then
local characterId = XDataCenter.DlcHuntCharacterManager.GetFightCharacterId()
XDlcRoomManager.ReqSelectCharacter(characterId, true)
return
end
EndSelectRequest(selectType)
end
function XDlcRoomManager.ReqSelectCharacter(characterId, justForUpdate)
if not XDlcRoomManager.IsInRoom() then
return
end
local req = { CharacterId = characterId }
XNetwork.Call(RequestProto.DlcSelectRequest, req, function(res)
if justForUpdate then
EndSelectRequest(XDlcHuntConfigs.RoomSelect.Character)
end
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if not justForUpdate then
XUiManager.TipText("OnlineFightSuccess", XUiManager.UiTipType.Success)
end
XDataCenter.DlcHuntCharacterManager.SetFightCharacter(characterId)
end)
end
function XDlcRoomManager.SetRoomData(roomData)
if not roomData then
XDataCenter.DlcHuntChipManager.ClearAssistantChip2Myself()
end
_Room:SetData(roomData)
end
function XDlcRoomManager.GetRoomData()
_Room:GetData()
end
function XDlcRoomManager._DebugGetRoom()
return _Room
end
function XDlcRoomManager.SetRoomState(state)
_Room:SetState(state)
end
function XDlcRoomManager.IsInRoom()
return _Room:IsInRoom()
end
function XDlcRoomManager.OnDlcMatchNotify(response)
if not _Room:IsMatching() then
return
end
if response.Code == XCode.Success then
XDlcRoomManager.OnCreateRoom(response.RoomData)
else
_Room:SetMatching(false)
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_CANCEL_MATCH)
end
end
function XDlcRoomManager.OnRoomInfoUpdate(response)
_Room:SetAutoMatching(response.AutoMatch)
end
function XDlcRoomManager.OnPlayerInfoUpdate(response)
_Room:UpdatePlayerInfo(response.PlayerInfoList)
end
function XDlcRoomManager.GetRoomName()
return _Room:GetName()
end
---@return XDlcHuntRoom
function XDlcRoomManager.GetRoom(roomId)
return _Room
end
--取消准备
function XDlcRoomManager.CancelReady(cb)
XNetwork.Send(RequestProto.DlcCancelReadyRequest, {})
end
-- 准备
function XDlcRoomManager.Ready(cb)
XNetwork.Call(RequestProto.DlcReadyRequest, {}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if cb then
cb()
end
end)
end
function XDlcRoomManager.OnPlayerEnterNotify(response)
_Room:JoinPlayer(response.PlayerData)
end
function XDlcRoomManager.OnPlayerLeaveNotify(response)
_Room:LeavePlayer(response.Players)
end
--region rejoin
function XDlcRoomManager.SetReJoinWorldInfo(worldInfo)
XDlcRoomManager.ReJoinWorldInfo = worldInfo
end
function XDlcRoomManager.IsCanReconnect()
if not XDlcRoomManager.ReJoinWorldInfo or not next(XDlcRoomManager.ReJoinWorldInfo) then
return false
end
if XDlcRoomManager.IsReconnectFail() then
return false
end
return true
end
function XDlcRoomManager.DoReJoinWorld()
if XDlcRoomManager.IsCanReconnect() then
XDataCenter.DlcRoomManager.OnNewJoinWorldNotify(XDlcRoomManager.ReJoinWorldInfo, true)
XDlcRoomManager.ReJoinWorldInfo = nil
end
end
-- 重连回房间
function XDlcRoomManager.ReconnectToRoom()
local confirm = function()
XNetwork.Call(RequestProto.DlcEnterTargetRoomRequest, {
RoomId = "",
IsRejoin = true,
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDlcRoomManager.OnCreateRoom(res.RoomData, true)
end)
end
local cancel = function()
XDlcRoomManager.Quit()
end
XLuaUiManager.Open("UiDlcHuntDialog", nil, XUiHelper.ReplaceTextNewLine(XUiHelper.GetText("DlcHuntReconnectToRoom")), confirm, cancel)
end
function XDlcRoomManager.DialogReconnect()
XLuaUiManager.Open("UiDlcHuntDialog", nil, nil, function()
local isFail, reason = XDlcRoomManager.IsReconnectFail()
if isFail then
if reason == XDlcHuntConfigs.RECONNECT_FAIL.TEAM_FAIL then
XUiManager.TipText("DlcHuntReconnectFail1")
elseif reason == XDlcHuntConfigs.RECONNECT_FAIL.TEAM_FAIL then
XUiManager.TipText("DlcHuntReconnectFail2")
elseif reason == XDlcHuntConfigs.RECONNECT_FAIL.TEAM_FAIL then
XUiManager.TipText("DlcHuntReconnectFail3")
end
return
end
XDataCenter.DlcRoomManager.DoReJoinWorld()
end, function()
XDlcRoomManager.ReconnectToRoom()
end)
end
function XDlcRoomManager.GetRejoinRemainTime()
local rejoinData = XDlcRoomManager.ReJoinWorldInfo
if not rejoinData then
return 0
end
local expireTime = rejoinData.ReJoinWorldExpireTime or 0
local time = XTime.GetServerNowTimestamp()
return math.max(0, expireTime - time)
end
--endregion rejoin
function XDlcRoomManager.OnJoinWorldResponse(response, ip)
XLog.Debug("XDlcRoomManager.OnJoinWorldResponse")
if response.Code ~= XCode.Success then
XLog.Error("XDlcRoomManager.OnJoinWorldResponse error, Code:" .. tostring(response.Code))
return
end
if not response.WorldData then
XLog.Error("XDlcRoomManager.OnJoinWorldResponse error, WorldData is nil")
CS.XFightNetwork.Disconnect()
return
end
-- 连接战斗成功后开始心跳
XFightNetwork.DoHeartbeat()
if not response.Port or not response.Conv then
XLog.Error("XDlcRoomManager.OnJoinWorldResponse error, port:" .. tostring(response.Port) .. " conv:" .. tostring(response.Conv))
-- 跳过kcp连接直接进入战斗
XDlcRoomManager.OnEnterWorld(response.WorldData)
return
end
local cb = function(success)
XLog.Debug("XDlcRoomManager.OnJoinWorldResponse Cb " .. tostring(success))
if not success then
XLog.Error("kcp disconnect! use tcp for fight")
end
XDlcRoomManager.OnEnterWorld(response.WorldData)
end
-- 连接kcp
XFightNetwork.ConnectKcp(ip, response.Port, response.Conv, cb)
end
function XDlcRoomManager.CallFinishFight(settleResult)
--通知战斗结束,关闭战斗设置页面
CS.XGameEventManager.Instance:Notify(XEventId.EVENT_FIGHT_FINISH)
end
function XDlcRoomManager.ChallengeLose()
--失败
XLuaUiManager.Open("UiDlcHuntSettleLose")
end
---@return XDlcHuntFightBeginData
function XDlcRoomManager.GetFightBeginData()
return _FightBeginData
end
function XDlcRoomManager.OnEnterWorld(worldData)
XLuaUiManager.Remove("UiDialog")
local playerData
for i = 1, #worldData.Players do
if worldData.Players[i].Id == XPlayer.Id then
playerData = worldData.Players[i]
break
end
end
if not playerData then
XLog.Error("XFubenManager.OnEnterWorld函数出错, 联机副本Players列表中没有找到自身数据")
return
end
CS.StatusSyncFight.XFightClient.EnterFight(worldData, XPlayer.Id)
_FightBeginData:SetWorldData(worldData)
end
function XDlcRoomManager.DialogTipQuitRoom(cb)
if not XDataCenter.DlcRoomManager.IsInRoom() then
if cb then
cb()
end
return
end
local title = CS.XTextManager.GetText("TipTitle")
local cancelMatchMsg = CS.XTextManager.GetText("OnlineInstanceQuitRoom")
XLuaUiManager.Open("UiDlcHuntDialog", title, cancelMatchMsg, function()
XDataCenter.DlcRoomManager.Quit(cb)
end)
end
-- 准备
function XDlcRoomManager.SetAbilityLimit(value)
XNetwork.Call(RequestProto.DlcSetAbilityLimitRequest, {
AbilityLimit = value,
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
_Room:SetAbilityLimit(value)
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_STAGE_ABILITY_LIMIT_CHANGE)
end)
end
function XDlcRoomManager.KickOut(playerId)
if not playerId then
return
end
playerId = tonumber(playerId)
XNetwork.Call(RequestProto.DlcKickOutRequest, {
PlayerId = playerId,
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
end)
end
function XDlcRoomManager.ChangeLeader(playerId)
XNetwork.Call(RequestProto.DlcChangeLeaderRequest, {
PlayerId = playerId,
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
end)
end
function XDlcRoomManager.ClickEnterRoomHref(roomId, worldId, createTime)
-- 检查玩法开启
if not XDataCenter.DlcHuntManager.IsOpen() then
return
end
-- 超时检查
if XTime.GetServerNowTimestamp() > createTime + CS.XGame.Config:GetInt("RoomHrefDisableTime") then
XUiManager.TipText("RoomHrefDisabled")
return
end
XNetwork.Call(RequestProto.DlcEnterTargetRoomRequest, {
RoomId = roomId,
IsRejoin = false,
WorldId = worldId,
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XDlcRoomManager.OnCreateRoom(res.RoomData, true)
end)
end
XDlcRoomManager.Init()
return XDlcRoomManager
end
--region ------------------------------------notify-------------------------------------
XRpc.DlcSelectRewardNotify = function(data)
XEventManager.DispatchEvent(XEventId.EVENT_ONLINEBOSS_DROPREWARD_NOTIFY, data)
end
--踢出房间
XRpc.DlcKickOutNotify = function(response)
XLog.Debug("============================> " .. response.Code)
if response.Code and response.Code ~= XCode.Success and response.Code ~= XCode.MatchPlayerOffline then
XUiManager.TipCode(response.Code)
end
if XFightNetwork.IsConnected() then
--现有规则下,进入战斗前会踢出房间,受网速影响会造成推送来的太慢导致进游戏前就断开连接----------------TODO张爽---------可能要改
-- 退出房间时如果已经连接战斗服,则断开连接
--CS.XFightNetwork.Disconnect()
end
XDataCenter.DlcRoomManager.SetRoomData(false)
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_LEAVE_ROOM)
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_KICKOUT)
end
--匹配通知
XRpc.DlcMatchNotify = function(response)
XDataCenter.DlcRoomManager.OnDlcMatchNotify(response)
end
XRpc.DlcPlayerSyncInfoNotify = function(response)
XDataCenter.DlcRoomManager.OnPlayerInfoUpdate(response)
end
XRpc.NewJoinWorldNotify = function(response)
XDataCenter.DlcRoomManager.OnNewJoinWorldNotify(response, false)
end
XRpc.DlcRoomInfoChangeNotify = function(response)
XDataCenter.DlcRoomManager.OnRoomInfoUpdate(response)
end
XRpc.DlcRoomStateNotify = function(response)
XDataCenter.DlcRoomManager.SetRoomState(response.State)
end
XRpc.DlcPlayerEnterNotify = function(response)
XDataCenter.DlcRoomManager.OnPlayerEnterNotify(response)
end
XRpc.DlcPlayerLeaveNotify = function(response)
XDataCenter.DlcRoomManager.OnPlayerLeaveNotify(response)
end
XRpc.DlcReportWorldResult = function(response)
end
XRpc.DlcAddLikeNotify = function(response)
XEventManager.DispatchEvent(XEventId.EVENT_ROOM_ADD_LIKE_NOTIFY, response)
end
--endregion