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