local CrossServerMapSystem = { --所有服务器 AllServer = nil, -- 跨服活动信息 MsgCrossServerMapInfoList = List:New(), --我的服务器信息 MyServerID = nil, MsgMyCrossServer = nil, --本地玩家服务器所在的组 key为组,value为bool MyCrossServerGroup = {}, --跨服世界等级开放状态 BaseWorldLvOpenDic = nil, --跨服开服时间开放状态 BaseOpenTimeOpenDic = nil, --活动世界等级开放状态 ActivityWorldLvOpenDic = nil, --跨服按组分类 CrossServerGroupDic = Dictionary:New() } function CrossServerMapSystem:Initialize() end function CrossServerMapSystem:UnInitialize() self.AllServer = nil self.MsgCrossServerMapInfoList:Clear(); self.MyServerID = nil self.MsgMyCrossServer = nil self.MyCrossServerGroup = {} self.BaseWorldLvOpenDic = nil self.BaseOpenTimeOpenDic = nil self.ActivityWorldLvOpenDic = nil self.CrossServerGroupDic:Clear(); end -- 游戏服 请求公共服 服务器分组数据 function CrossServerMapSystem:ReqCrossServerMatch() GameCenter.Network.Send("MSG_Dailyactive.ReqCrossServerMatch",{}) end --跨服活动地图数据更新 function CrossServerMapSystem:GS2U_ResCrossServerMatch(msg) self:UnInitialize(); local _myServerID = self:GetMyServerID(); if msg then local _serverList = msg.serverMatch_8 if _serverList then local _count = #_serverList for i=1, _count do local _server = _serverList[i]; self.MsgCrossServerMapInfoList:Add(_server) if _server.serverid == _myServerID then self.MyServerInBigMapIndex = math.floor((i-1)/8) + 1; self.MsgMyCrossServer = _server; end end end self:SetWorldLvOpenState(32, 1); self:SetOpenTimeOpenState(32, 1) self:SetAllActivityWorldLvOpenState(32); GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSSERVER_REFRESH); end end --设置等级开放状态 function CrossServerMapSystem:SetWorldLvOpenState(crossServerGroupType, pos) local _list = self:GetCrossServer(crossServerGroupType, pos) local _baseWorldLv = self:GetBaseCrossWorldLv(crossServerGroupType); local _totalLv = 0; for i=1, #_list do _totalLv = _totalLv + _list[i].serverWroldLv; end local _isOpen = _totalLv/crossServerGroupType >= _baseWorldLv if not self.BaseWorldLvOpenDic then self.BaseWorldLvOpenDic = {}; end if not self.BaseWorldLvOpenDic[crossServerGroupType] then self.BaseWorldLvOpenDic[crossServerGroupType] = {}; end if self.BaseWorldLvOpenDic[crossServerGroupType][pos] then self.BaseWorldLvOpenDic[crossServerGroupType][pos].IsOpen = _isOpen; self.BaseWorldLvOpenDic[crossServerGroupType][pos].WorldLv = _totalLv/crossServerGroupType; else self.BaseWorldLvOpenDic[crossServerGroupType][pos] = {IsOpen = _isOpen, WorldLv = _totalLv/crossServerGroupType}; end if crossServerGroupType / 2 >= 2 then self:SetWorldLvOpenState(crossServerGroupType/2, pos * 2 - 1) self:SetWorldLvOpenState(crossServerGroupType/2, pos * 2) end end --设置开服时间开放状态 function CrossServerMapSystem:SetOpenTimeOpenState(crossServerGroupType, pos) local _list = self:GetCrossServer(crossServerGroupType, pos) local _baseOpenDay = self:GetBaseCrossOpenTime(crossServerGroupType); local _minOpenDay = math.huge; for i=1, #_list do local _openTimeDay = Time.GetOpenSeverDayByOpenTime(_list[i].openTime * 0.001); _minOpenDay = _minOpenDay > _openTimeDay and _openTimeDay or _minOpenDay; end local _isOpen = _minOpenDay >= _baseOpenDay if not self.BaseOpenTimeOpenDic then self.BaseOpenTimeOpenDic = {}; end if not self.BaseOpenTimeOpenDic[crossServerGroupType] then self.BaseOpenTimeOpenDic[crossServerGroupType] = {}; end if self.BaseOpenTimeOpenDic[crossServerGroupType][pos] then self.BaseOpenTimeOpenDic[crossServerGroupType][pos].IsOpen = _isOpen; self.BaseOpenTimeOpenDic[crossServerGroupType][pos].MinOpenDay = _minOpenDay; else self.BaseOpenTimeOpenDic[crossServerGroupType][pos] = {IsOpen = _isOpen, MinOpenDay = _minOpenDay}; end if crossServerGroupType / 2 >= 2 then self:SetOpenTimeOpenState(crossServerGroupType/2, pos * 2 - 1) self:SetOpenTimeOpenState(crossServerGroupType/2, pos * 2) end end --设置活动世界等级开放状态 function CrossServerMapSystem:SetActivityWorldLvOpenState(cfgItem) local _activityID = cfgItem.Id; local _t = Utils.SplitStrByTableS(cfgItem.CrossMatch); if not self.ActivityWorldLvOpenDic then self.ActivityWorldLvOpenDic = {}; end for i=1, #_t do local _crossServerGroupType = _t[i][1]; --不处理1个跨服 if _crossServerGroupType ~= 1 then local _needWorldLv = _t[i][2]; if not self.ActivityWorldLvOpenDic[_crossServerGroupType] then self.ActivityWorldLvOpenDic[_crossServerGroupType] = {}; end for j=1,32/_crossServerGroupType do local _allActivityDic = self.ActivityWorldLvOpenDic[_crossServerGroupType][j]; if not _allActivityDic then _allActivityDic = {} self.ActivityWorldLvOpenDic[_crossServerGroupType][j] = _allActivityDic; end local _list = self:GetCrossServer(_crossServerGroupType, j); --是否开放 local _isOpen = false; --进度世界等级 local _worldLv = 0; --全部达到 if cfgItem.Crosstype == 0 then local _minLv = math.huge; for k=1, #_list do _worldLv = _list[k].serverWroldLv; _minLv = _worldLv < _minLv and _worldLv or _minLv; end _isOpen = _minLv >= _needWorldLv; _worldLv = _minLv; --自身到达 elseif cfgItem.Crosstype == 1 then --如果是本地玩家组的,进度显示本地玩家的 if self.MyCrossServerGroup[_crossServerGroupType][j] then _worldLv = self.MsgMyCrossServer.serverWroldLv; _isOpen = _worldLv >= _needWorldLv; else local _maxLv = 0; for k=1, #_list do _worldLv = _list[k].serverWroldLv; _maxLv = _worldLv > _maxLv and _worldLv or _maxLv; end _isOpen = _maxLv >= _needWorldLv; _worldLv = _maxLv; end --平均值到达 else local _totalLv = 0; for k=1, #_list do _totalLv = _totalLv + _list[k].serverWroldLv; end local _averageLv = math.floor(_totalLv/_crossServerGroupType); _isOpen = _averageLv >= _needWorldLv; _worldLv = _averageLv; end if _allActivityDic[_activityID] then _allActivityDic[_activityID].IsOpen = _isOpen; _allActivityDic[_activityID].WorldLv = _worldLv; _allActivityDic[_activityID].NeedWorldLv = _needWorldLv; _allActivityDic[_activityID].Name = cfgItem.Name; else _allActivityDic[_activityID] = {ID = _activityID,Name = cfgItem.Name, IsOpen = _isOpen, WorldLv = _worldLv, NeedWorldLv = _needWorldLv}; end end end end end --设置所有活动世界等级开放状态 function CrossServerMapSystem:SetAllActivityWorldLvOpenState(crossServerGroupType) local _func = function (k,v) if v.Ifcross == 1 then self:SetActivityWorldLvOpenState(v); end end DataConfig.DataDaily:Foreach(_func); if crossServerGroupType / 2 >= 2 then self:SetAllActivityWorldLvOpenState(crossServerGroupType/2) end end --=================[大、小地图]=================== --成员是否充足 function CrossServerMapSystem:IsEnoughMember(crossServerGroupType, pos) return #self:GetCrossServer(crossServerGroupType, pos) >= crossServerGroupType end --是否达到基础等级 function CrossServerMapSystem:IsOpenByBaseWorldLv(crossServerGroupType, pos) if not self.BaseWorldLvOpenDic then self:SetWorldLvOpenState(32, 1); end return self.BaseWorldLvOpenDic[crossServerGroupType][pos].IsOpen; end --是否达到基础开服时间 function CrossServerMapSystem:IsOpenByBaseTimeOpen(crossServerGroupType, pos) if not self.BaseOpenTimeOpenDic then self:SetOpenTimeOpenState(32, 1); end return self.BaseOpenTimeOpenDic[crossServerGroupType][pos].IsOpen; end --获取当前服务器ID function CrossServerMapSystem:GetMyServerID() if not self.MyServerID then self.MyServerID = GameCenter.ServerListSystem:GetCurrentServer().ReallyServerId; end return self.MyServerID; end --获取服务器名字 function CrossServerMapSystem:GetServerName(serverId) if not self.AllServer then self.AllServer = Dictionary:New(); local _allList = GameCenter.ServerListSystem.AllList; for _, _server in ipairs(_allList) do local _serverId = _server.ServerId; self.AllServer:Add(_serverId, {name = _server.Name}); end end return self.AllServer[serverId] and self.AllServer[serverId].name or DataConfig.DataMessageString.Get("NotFind"); end --是否是本地玩家服务器的组 function CrossServerMapSystem:IsLocalPlayerServerGroup(crossServerGroupType, pos) self:GetCrossServer(crossServerGroupType, pos); return not not(self.MyCrossServerGroup[crossServerGroupType][pos]) end --是否开放了X跨服 function CrossServerMapSystem:IsOpenMyCrossServer(crossServerGroupType) for i=1, 32/crossServerGroupType do if self:IsLocalPlayerServerGroup(crossServerGroupType, i) then return self:IsOpenByBaseWorldLv(crossServerGroupType, i) and self:IsOpenByBaseTimeOpen(crossServerGroupType, i),i end end end --=================[跨服活动单个信息]=================== --获取配置表中所有跨服活动 crossServerGroupType:跨服分组类型,如8跨服 function CrossServerMapSystem:GetCfgDataByGroupType(crossServerGroupType) if not self.AllCrossServerCfgDataDic then self.AllCrossServerCfgDataDic = Dictionary:New(); local _func = function (k,v) if v.Ifcross == 1 then local _t = Utils.SplitStrByTableS(v.CrossMatch) for j=1, #_t do if not self.AllCrossServerCfgDataDic[_t[j][1]] then self.AllCrossServerCfgDataDic[_t[j][1]] = List:New(); end self.AllCrossServerCfgDataDic[_t[j][1]]:Add({Cfg = v, ID = v.Id, Name = v.Name, CrossType = v.CrossType, CrossLv = _t[j][2]}); end end end DataConfig.DataDaily:Foreach(_func); end return self.AllCrossServerCfgDataDic[crossServerGroupType] end --获取活动状态(是否开启、进度){Name = "", IsOpen = false, WorldLv = 100, NeedWorldLv = 200} function CrossServerMapSystem:GetActivity(crossServerGroupType, pos, activityID) if not self.ActivityWorldLvOpenDic then self:SetAllActivityWorldLvOpenState(32); end return self.ActivityWorldLvOpenDic[crossServerGroupType][pos][activityID] end --获取跨服活动基础开服时间 function CrossServerMapSystem:GetBaseCrossOpenTime(crossServerGroupType) if not self.BaseCrossOpenTimeDic then self.BaseCrossOpenTimeDic = Dictionary:New(); local _str = DataConfig.DataGlobal[GlobalName.Cross_Match_OpneTime].Params; local _t = Utils.SplitStrByTableS(_str); for i,v in ipairs(_t) do self.BaseCrossOpenTimeDic:Add(v[1],v[2]); end end return self.BaseCrossOpenTimeDic[crossServerGroupType] or 1 end --最低开服天数 function CrossServerMapSystem:GetMinOpenDay(crossServerGroupType, pos) if not self.BaseOpenTimeOpenDic then self:SetOpenTimeOpenState(32, 1); end return self.BaseOpenTimeOpenDic[crossServerGroupType][pos].MinOpenDay; end --=================[服务器进度]=================== --获取跨服活动基础世界等级 function CrossServerMapSystem:GetBaseCrossWorldLv(crossServerGroupType) if not self.BaseCrossWorldLvDic then self.BaseCrossWorldLvDic = Dictionary:New(); local _str = DataConfig.DataGlobal[GlobalName.Cross_Match_WroldLv].Params; local _t = Utils.SplitStrByTableS(_str); for i,v in ipairs(_t) do self.BaseCrossWorldLvDic:Add(v[1],v[2]); end end return self.BaseCrossWorldLvDic[crossServerGroupType] or 0 end --获取多跨服服务器 crossServerGroupType:跨服分组类型,如8跨服, pos:该组中的位置 function CrossServerMapSystem:GetCrossServer(crossServerGroupType, pos) if not self.CrossServerGroupDic then self.CrossServerGroupDic = Dictionary:New(); end if not self.CrossServerGroupDic[crossServerGroupType] then self.CrossServerGroupDic:Add(crossServerGroupType, Dictionary:New()); end local _list = self.CrossServerGroupDic[crossServerGroupType][pos]; if not _list then local _myServerID = self:GetMyServerID() _list = List:New() self.CrossServerGroupDic[crossServerGroupType]:Add(pos, _list) for i=crossServerGroupType-1, 0,-1 do local _MsgCrossServerMapInfo = self.MsgCrossServerMapInfoList[crossServerGroupType * pos -i]; if _MsgCrossServerMapInfo then _list:Add(_MsgCrossServerMapInfo); if _MsgCrossServerMapInfo.serverid == _myServerID then if not self.MyCrossServerGroup[crossServerGroupType] then self.MyCrossServerGroup[crossServerGroupType] = {} end self.MyCrossServerGroup[crossServerGroupType][pos] = true; end else break; end end end return _list; end --获取我的最大跨服及位置 function CrossServerMapSystem:GetMyMaxGroupTypeAndPos() local _crossServerGroupType = 8 while _crossServerGroupType > 1 do local _isOpen, _pos = self:IsOpenMyCrossServer(_crossServerGroupType); if _isOpen then return math.floor(_crossServerGroupType), _pos; end _crossServerGroupType = _crossServerGroupType*0.5 end return 0; end function CrossServerMapSystem:Test() GameCenter.ServerListSystem = {} GameCenter.ServerListSystem.AllList = { [1]={ServerId = 1002, Name = "1002"}, [2]={ServerId = 1003, Name = "1003"}, [3]={ServerId = 1004, Name = "1004"}, [4]={ServerId = 1005, Name = "1005"}, [5]={ServerId = 1006, Name = "1006"}, [6]={ServerId = 1007, Name = "1007"}, [7]={ServerId = 1008, Name = "1008"}, [8]={ServerId = 1009, Name = "1009"}, [9]={ServerId = 1010, Name = "1010"}, [10]={ServerId = 1011, Name = "1011"}, [11]={ServerId = 1012, Name = "1012"}, [12]={ServerId = 1013, Name = "1013"}, [13]={ServerId = 1014, Name = "1014"}, [14]={ServerId = 1015, Name = "1015"}, [15]={ServerId = 1016, Name = "1016"}, [16]={ServerId = 1017, Name = "1017"}, [17]={ServerId = 1018, Name = "1018"}, [18]={ServerId = 1019, Name = "1019"}, [19]={ServerId = 1020, Name = "1020"}, [20]={ServerId = 1021, Name = "1021"}, [21]={ServerId = 1022, Name = "1022"}, [22]={ServerId = 1023, Name = "1023"}, [23]={ServerId = 1024, Name = "1024"}, [24]={ServerId = 1025, Name = "1025"}, [25]={ServerId = 1026, Name = "1026"}, [26]={ServerId = 1027, Name = "1027"}, [27]={ServerId = 1028, Name = "1028"}, [28]={ServerId = 1029, Name = "1029"}, [29]={ServerId = 1030, Name = "1030"}, [30]={ServerId = 1031, Name = "1031"}, [31]={ServerId = 1032, Name = "1032"}, }; GameCenter.ServerListSystem.GetCurrentServer = function(sender) return {ServerId = 1002} end GameCenter.CrossServerMapSystem.MyServerID = 1002; GameCenter.CrossServerMapSystem:GS2U_ResCrossServerMatch({ serverMatch_32 = { {serverid = 1002,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1003,serverWroldLv = 500,openTime = 1583892000000}, {serverid = 1004,serverWroldLv = 600,openTime = 1583892000000}, {serverid = 1005,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1006,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1007,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1008,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1009,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1010,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1011,serverWroldLv = 300,openTime = 1583892000000}, {serverid = 1012,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1013,serverWroldLv = 500,openTime = 1583892000000}, {serverid = 1014,serverWroldLv = 600,openTime = 1583892000000}, {serverid = 1015,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1016,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1017,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1018,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1019,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1020,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1021,serverWroldLv = 300,openTime = 1583892000000}, {serverid = 1022,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1023,serverWroldLv = 500,openTime = 1583892000000}, {serverid = 1024,serverWroldLv = 600,openTime = 1583892000000}, {serverid = 1025,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1026,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1027,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1028,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1029,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1030,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1031,serverWroldLv = 200,openTime = 1583892000000}, {serverid = 1032,serverWroldLv = 200,openTime = 1583892000000}, } }); GameCenter.PushFixEvent(UILuaEventDefine.UICrossServerMapForm_OPEN) end return CrossServerMapSystem