Files
Main/Assets/GameAssets/Resources/Lua/Logic/CrossServerMapSystem/CrossServerMapSystem.lua
2025-01-25 04:38:09 +08:00

455 lines
19 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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