local CrossServer_Controller = {} local EventSystem = require('Event/EventSystem') local private = {} local enter_world_pb = require 'Proto/enter_world_pb' local SAME_SERVER_FORMAT = " S.%s" local DIF_SERVER_FORMAT = " S.%s" local SERVER_FORMAT = " S.%s" --哪些场景被视作是跨服的 private.CrossServerMapList = { LuaConst.LevelType.CrossEscortTown, LuaConst.LevelType.CrossServerTown, } function CrossServer_Controller.OnStartup() EventSystem.Regist(EventID.UI_CrossServerUpdate, private.SyncUpdatedServerList) private.serverId = tonumber(MDL.Login.GetRealServerId()) private.updatedServerList = {} -- 跨服开启后拉取新开的服务器信息 end --获取展示服务器字符串,同服是蓝色,不同服是白色,不传则只是拼接字符串 function CrossServer_Controller.GetServerShowStr(serId, isSame) if serId and serId > 0 then if isSame == true then return string.format(SAME_SERVER_FORMAT, serId) elseif isSame == false then return string.format(DIF_SERVER_FORMAT, serId) else return string.format(SERVER_FORMAT, serId) end end return "" end --返回格式如:S1-霸业之始 function CrossServer_Controller.GetFormatServerShow(id) local _, name = CrossServer_Controller.GetServerIDAndServerNameByServerID(id) return string.format("S%s-%s", id, name) end --- 获取服务器名称 --- @param id int --- @return serverID,ServerName function CrossServer_Controller.GetServerIDAndServerNameByServerID(id) local realServerId = GameAppInfo.Global_ProductId * 10000 + id local serverInfo = MDL.Login.GetServerInfoByID(tostring(realServerId)) if serverInfo then return MDL.Login.GetFirstName(serverInfo), MDL.Login.GetServerNameByInfo(serverInfo) end return id, private.updatedServerList[realServerId] end -- 更新补充登录未拉取到的新开服务器跨服显示名称使用 -- updatedServerList {110004 = "服务器名称"} function private.SyncUpdatedServerList(serverList) if IsServerDataNotNil(serverList) then if serverList.zoneType == MDL.CrossServer.CrossServerZoneGroupType[LuaConst.ActivityType.HeroMatch3v3] or serverList.zoneType == MDL.CrossServer.CrossServerZoneGroupType[LuaConst.ActivityType.HeroMatch1v1] then for _, v in ipairs(serverList.serverInfo) do local realServerId = GameAppInfo.Global_ProductId * 10000 + v.serverId if not MDL.Login.GetServerInfoByID(tostring(realServerId)) and not private.updatedServerList[realServerId] then private.updatedServerList[realServerId] = v.serverName end end else for _, v in ipairs(serverList.zoneGroup) do local realServerId = GameAppInfo.Global_ProductId * 10000 + v.serverId if not MDL.Login.GetServerInfoByID(tostring(realServerId)) and not private.updatedServerList[realServerId] then private.updatedServerList[realServerId] = v.serverName end end end end end function CrossServer_Controller.IsSameServer(serId) return private.serverId == serId end function CrossServer_Controller.IsInCrossServerScene() return CrossServer_Controller.IsMapCrossServerScene(BattleDataGetter.GetCurLevelID()) end function CrossServer_Controller.IsTeamMemberSameServer() if MDL.Team.GetTeamMemberNumbers() > 1 then --队伍里只有一个人的时候说明只有自己不用判断 local selfServerId = tonumber(MDL.Login.GetRealServerId()) for i, v in ipairs(MDL.Team.GetAllMembersInfo()) do if v.playerShowInfo.MergeServerId ~= selfServerId then return false end end end return true end --进入这个方法的前置判断是是否从本服进跨服,或者从跨服进本服 function CrossServer_Controller.CheckConveyCondition(mapId) local levelType = DataSheetManager.LevelInfoData:GetDataByLevelID(mapId).LevelType local mapFeatureData = DataSheetManager.LevelFeatureData:GetDataByLevelFeatureID(levelType) --组队的情况,客户端逻辑判断链条不完整,统一由服务器进行拦截,这里只处理单人进跨服的拦截 if CTL.Team.IsInTeam() then --队伍 if CrossServer_Controller.IsTeamMemberSameServer() then --是否同服 if CTL.Team.IsSelfLeader() then --队长 if not CTL.Team.IsAllMemberFollowing() and CrossServer_Controller.IsMapCrossServerScene(mapId) then --有队员没有跟随 UTL.MessageBox.ShowOKCancelNoCloseBox(nil, Const_IDS.IDS_ZoneTown_TeamMember, MDL.Team.TeamCallMemberReq) return false end else --队员 if CrossServer_Controller.IsInCrossServerScene() or CrossServer_Controller.IsMapCrossServerScene(mapId) then UTL.MessageBox.ShowOKCancelNoCloseBox(nil, Const_IDS.IDS_ZoneTown_TeamLeader, MDL.Team.TeamLeaveReq) return false end end else --有跨服成员 if CTL.CrossServer.IsMapOriginTown(mapId) then --从跨服进本服 if CTL.Team.IsSelfLeader() then --队长 UTL.MessageBox.ShowOKCancelNoCloseBox(nil, Const_IDS.IDS_ZoneTown_ZoneTeamMember1, CrossServer_Controller.KickDifferentServerTeammates) return false else --队员 UTL.MessageBox.ShowOKCancelNoCloseBox(nil, Const_IDS.IDS_ZoneTown_ZoneTeamMember2, MDL.Team.TeamLeaveReq) return false end end end else --单人 local enterLevel = mapFeatureData.EnterLevel if enterLevel and enterLevel > 0 and MDL.HeroSelect.GetTeamLevel() < enterLevel then CTL.Tips.AddTipsMsg(Const_IDS.IDS_ZoneTown_Level, "") return false end local enterOffice = mapFeatureData.EnterOffice if enterOffice and enterOffice > 0 and MDL.OfficialPosition.GetCurTitle() < enterOffice then CTL.Tips.AddTipsMsg(Const_IDS.IDS_ZoneTown_OfficeLevel, "") return false end local enterPower = mapFeatureData.EnterPower if enterPower and enterPower > 0 and MDL.Player.GetLineUpGs() < enterPower then CTL.Tips.AddTipsMsg(Const_IDS.IDS_ZoneTown_Power, "") return false end end return true end function CrossServer_Controller.IsMapCrossServerScene(mapId) local levelType = DataSheetManager.LevelInfoData:GetDataByLevelID(mapId).LevelType for i, v in ipairs(private.CrossServerMapList) do if levelType == v then return true end end return false end function CrossServer_Controller.IsMapOriginTown(mapId) return not CrossServer_Controller.IsMapCrossServerScene(mapId) end function CrossServer_Controller.KickDifferentServerTeammates(unableInfo) if unableInfo then --服务器返回信息 for i, v in ipairs(unableInfo) do if v.Reason == enter_world_pb.ReasonNotSameServer then MDL.Team.TeamKickOutMemberReq(v.Acid) end end else local selfServerId = tonumber(MDL.Login.GetServerId()) for i, v in ipairs(MDL.Team.GetAllMembersInfo()) do if v.playerShowInfo.MergeServerId ~= selfServerId then MDL.Team.TeamKickOutMemberReq(v.playerShowInfo.acid) end end end end --挖宝不显示玩家头顶区服 --如果是国服,因为涉及到虚拟大区,公平玩法也不显示玩家头顶区服 function CrossServer_Controller.IsShowServerInPlayerModelName() if BattleDataGetter.CheckCurLevelType(LuaConst.LevelType.TeamFairChampionshipTown) then return false end if BattleDataGetter.CheckCurLevelType(LuaConst.LevelType.SyncTeamFairChampionship) then return false end if not BattleDataGetter.CheckCurLevelType(LuaConst.LevelType.SyncDigTeamPVE) then if GameAppInfo.IsChinesePackage() then if not BattleDataGetter.CheckCurLevelType(LuaConst.LevelType.SyncSolo) and not BattleDataGetter.CheckCurLevelType(LuaConst.LevelType.SyncTeamPVP) then return true end else return true end end return false end function CrossServer_Controller.IsShowServerTextInFairPlay() return not GameAppInfo.IsChinesePackage() end return CrossServer_Controller