455 lines
19 KiB
Lua
455 lines
19 KiB
Lua
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
|
||
|