Files
Main/Assets/GameAssets/Resources/Lua/Logic/CrossServerMapSystem/CrossServerMapSystem.lua

455 lines
19 KiB
Lua
Raw Normal View History

2025-01-25 04:38:09 +08:00
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