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

1405 lines
45 KiB
Lua

------------------------------------------------
-- 作者: 王圣
-- 日期: 2021-02-01
-- 文件: CrossFuDiSystem.lua
-- 模块: CrossFuDiSystem
-- 描述: 跨服福地
------------------------------------------------
-- 引用
local L_CrossFuDi = require "Logic.CrossFuDi.CrossFuDiData"
local L_ResultData = require "Logic.CrossFuDi.CrossFuDiResultData"
local L_TimeUtils = CS.Thousandto.Core.Base.TimeUtils
local RedPointCustomCondition = CS.Thousandto.Code.Logic.RedPointCustomCondition
local RedPointItemCondition = CS.Thousandto.Code.Logic.RedPointItemCondition
local CrossFuDiSystem = {
-- 是否解锁
IsUnLock = false,
-- 当前天禁值
CurTianJin = 0,
-- 最大天禁值
MaxTianJin = 0,
-- 本周积分
Score = 0,
-- 跨服世界等级
CrossWorldLv = 0,
-- 当前跨服类型
CrossType = FuDiCrossType.Cross_2,
-- 城市(复活点)列表
DicFuDi = Dictionary:New(),
-- 积分领奖列表
RewardList = nil,
-- 积分排行{Rank, Name, ServerId, Score}
ScoreRankList = List:New(),
-- 击杀排行{Rank, Name, ServerId, Score}
KillRankList = List:New(),
-- 我的排名{Rank, Name, ServerId, Score}
MyRank = nil,
-- 结算数据
ResultData = nil,
-- 当前选中的城市Id
CurCityId = 0,
-- 当前进入的城市Id
EnterCityId = 0,
-- 跨副本传送数据
CrossTransData = nil,
-- 副本数据同步消息缓存
CacheCopyMsgList = List:New(),
CacheCopyHurtMsgList = List:New(),
-- 魔王裂隙数据
M_ShowBossList = nil,
-- 魔王裂隙活动boss数据
M_DicBossList = Dictionary:New(),
-- 魔王裂隙团本数据
M_CopyList = nil,
-- 魔王裂隙活动时间数据
M_OpenData = nil,
-- 魔王裂隙副本数据同步消息缓存
M_CacheCopyMsgList = List:New(),
M_CacheCopyHurtMsgList = List:New(),
--是否检测魔王缝隙的红点
IsCheckOyLiKaiRedPoint = false,
--是否支援古魔封印
IsHelpFengXi = false,
WaitFastEnter = false,
}
-- 初始化
function CrossFuDiSystem:Initialize()
GameCenter.RegFixEventHandle(LogicLuaEventDefine.EID_EVENT_SLAYER_LISTUPDATE, self.SlayerUpdate, self)
GameCenter.RegFixEventHandle(LogicLuaEventDefine.EID_EVENT_SLAYER_FOLLOW, self.SlayerUpdate, self)
GameCenter.RegFixEventHandle(LogicLuaEventDefine.EID_EVENT_UPDATE_HOOKSITTING, self.OnUpdateWorldLevel)
self.TimerEventId = GameCenter.TimerEventSystem:AddTimeStampHourEvent(2, 3600, true, nil,
function(id, remainTime, param)
self:SetFunctionVisable()
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSFUDI_REFRESH_TIME)
end)
end
function CrossFuDiSystem:UnInitialize()
GameCenter.UnRegFixEventHandle(LogicLuaEventDefine.EID_EVENT_SLAYER_LISTUPDATE, self.SlayerUpdate, self)
GameCenter.UnRegFixEventHandle(LogicLuaEventDefine.EID_EVENT_SLAYER_FOLLOW, self.SlayerUpdate, self)
GameCenter.UnRegFixEventHandle(LogicLuaEventDefine.EID_EVENT_UPDATE_HOOKSITTING, self.OnUpdateWorldLevel)
end
--检测魔王缝隙红点
function CrossFuDiSystem:CheckOyLieKaiRedPoint()
--清理掉魔王缝隙的红点
GameCenter.RedPointSystem:CleraFuncCondition(FunctionStartIdCode.OyLieKai)
--关注红点
local _haveCount = false
local _copyList = GameCenter.SlayerBossSystem.FollowCopyList
for i = 1, #_copyList do
local _copyId = _copyList[i]
if GameCenter.SlayerBossSystem:GetCopyCountByID(_copyId) > 0 then
_haveCount = true
end
end
if _haveCount then
GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.OyLieKai, 1, RedPointCustomCondition(true))
--GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.CrossFuDi, 1, RedPointCustomCondition(true))
end
--物品红点
local _dataList = self:GetMCopyDataList()
if _dataList ~= nil then
for i = 1, #_dataList do
local _data = _dataList[i]
--添加红点条件
GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.OyLieKai, _data.Id, RedPointItemCondition(_data.Need.Id, _data.Need.Num))
--GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.CrossFuDi, _data.Id, RedPointItemCondition(_data.Need.Id, _data.Need.Num))
end
end
end
function CrossFuDiSystem:IsShowLieKaiRedPoint()
local _ret = false
--关注红点
local _copyList = GameCenter.SlayerBossSystem.FollowCopyList
for i = 1, #_copyList do
local _copyId = _copyList[i]
if GameCenter.SlayerBossSystem:GetCopyCountByID(_copyId) > 0 then
_ret = true
break
end
end
--物品红点
local _dataList = self:GetMCopyDataList()
if _dataList ~= nil then
for i = 1, #_dataList do
local _data = _dataList[i]
local _haveNum = GameCenter.ItemContianerSystem:GetItemCountFromCfgId(_data.Need.Id)
if _haveNum >= _data.Need.Num then
_ret = true
break
end
end
end
return _ret
end
function CrossFuDiSystem:SlayerUpdate(obj, sender)
self.IsCheckOyLiKaiRedPoint = true
end
function CrossFuDiSystem:OnUpdateWorldLevel(obj, sender)
local _openDay = Time.GetOpenSeverDay()
local _worldLv = GameCenter.OfflineOnHookSystem.CurWorldLevel
if self.M_ShowBossList == nil then
self.M_ShowBossList = List:New()
else
self.M_ShowBossList:Clear()
end
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
if _lp == nil then
return
end
local _playerOcc = _lp.IntOcc
DataConfig.DataCrossDevilBoss:Foreach(function(k, v)
if v.Position == 0 then
local _dayCondition = Utils.SplitNumber(v.Day, '_')
local _lvCondition = Utils.SplitNumber(v.Level, '_')
if _openDay <= _dayCondition[2] and _openDay >= _dayCondition[1] and _worldLv <= _lvCondition[2] and _worldLv >= _lvCondition[1] then
local _head = v.Icon
local _name = v.Name
local _itemList = List:New()
local _list = Utils.SplitStr(v.Reward, ';')
if _list ~= nil then
for i = 1, #_list do
local _values = Utils.SplitNumber(_list[i], '_')
if _values ~= nil and #_values == 2 then
local _occ = _values[1]
local _itemId = _values[2]
if _occ == 9 or _occ == _playerOcc then
local _itemData = {
Id = _itemId,
Num = 1,
IsBind = true
}
_itemList:Add(_itemData)
end
end
end
end
local _data = {
CfgId = k,
Head = _head,
Name = _name,
ItemList = _itemList
}
self.M_ShowBossList:Add(_data)
end
end
end)
-- 排序
self.M_ShowBossList:Sort(function(a, b)
return a.CfgId < b.CfgId
end)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_HUOSHI_BOSSLIST_UPDATE, self.M_ShowBossList)
end
function CrossFuDiSystem:OnEnterScene()
if self.CrossTransData ~= nil then
if self.CrossTransData.Type == 1 then
GameCenter.CrossFuDiSystem:SetCurCityId(self.CrossTransData.CityId)
GameCenter.CrossFuDiSystem:SetEnterCityId(self.CrossTransData.CityId)
GameCenter.CrossFuDiSystem:SetCurSelectBossId(self.CrossTransData.BossId)
GameCenter.CrossFuDiSystem:ReqCrossFudEnter(self.CrossTransData.CityId, self.CrossTransData.Type)
else
-- 需要进入对应的副本
GameCenter.CrossFuDiSystem:SetCurCityId(self.CrossTransData.CityId)
GameCenter.CrossFuDiSystem:SetCurSelectBossId(self.CrossTransData.BossId)
GameCenter.CrossFuDiSystem:ReqCrossFudEnter(self.CrossTransData.CityId, self.CrossTransData.Type)
end
self.CrossTransData = nil
end
end
-- 获取当前天禁值
function CrossFuDiSystem:GetCurTianJin()
return self.CurTianJin
end
-- 获取最大天禁值
function CrossFuDiSystem:GetMaxTianJin()
if self.MaxTianJin == 0 then
DataConfig.DataCrossFudiMain:ForeachCanBreak(function(k, v)
if v.MaxTianjin ~= 0 then
self.MaxTianJin = v.MaxTianjin
return true
end
end)
end
return self.MaxTianJin
end
-- 获取跨服类型
function CrossFuDiSystem:GetCrossType()
return self.CrossType
end
-- 获取跨服福地数据data
function CrossFuDiSystem:GetFuDiDatas()
return self.DicFuDi
end
-- 获取本服可以进入的福地
function CrossFuDiSystem:GetValidFuDiDatas()
local _ret = Dictionary:New()
local _keys = self.DicFuDi:GetKeys()
if _keys ~= nil then
for i = 1, #_keys do
local _key = _keys[i]
local _city = self.DicFuDi[_key]
if _city:IsLocalOwn() then
local _list = _city:GetRelationCity()
for m = 1, #_list do
local _relationKey = _list[m]
if _ret[_relationKey] == nil then
_ret[_relationKey] = self.DicFuDi[_relationKey]
end
end
end
end
end
return _ret
end
-- 通过福地id获取福地数据
function CrossFuDiSystem:GetFuDiData(id)
local _ret = nil
local _dic = self:GetFuDiDatas()
if _dic ~= nil then
_ret = _dic[id]
end
return _ret
end
-- 获取选中的城市数据
function CrossFuDiSystem:GetCurCityData()
local _ret = nil
local _cityId = self:GetCurCityId()
_ret = self:GetFuDiData(_cityId)
return _ret
end
-- 获取进入的城市数据
function CrossFuDiSystem:GetEnterCityData()
local _ret = nil
local _cityId = self:GetEnterCityId()
_ret = self:GetFuDiData(_cityId)
return _ret
end
-- 获取指定被占领福地的阵营名字
function CrossFuDiSystem:GetCampName(id)
local _ret = nil
local _city = self:GetFuDiData(id)
if _city ~= nil then
-- 判断当前跨服类型
if self.CrossType == FuDiCrossType.Cross_2 or self.CrossType == FuDiCrossType.Cross_4 or self.CrossType ==
FuDiCrossType.Cross_8 then
local _sdata = GameCenter.ServerListSystem:FindServer(_city:GetGetOccupierServerId())
if _sdata ~= nil then
_ret = UIUtils.CSFormat("S{0}_{1}", _sdata.ShowServerId, _sdata.Name)
end
else
end
end
return _ret
end
function CrossFuDiSystem:GetLocalCampName()
local _ret = nil
-- 判断当前跨服类型
if self.CrossType == FuDiCrossType.Cross_2 or self.CrossType == FuDiCrossType.Cross_4 or self.CrossType ==
FuDiCrossType.Cross_8 then
local _sdata = GameCenter.ServerListSystem:FindServer(
GameCenter.ServerListSystem:GetCurrentServer().ReallyServerId)
if _sdata ~= nil then
_ret = UIUtils.CSFormat("S{0}_{1}", _sdata.ShowServerId, _sdata.Name)
end
else
end
return _ret
end
-- 获取积分领奖数据
function CrossFuDiSystem:GetRewardList()
if self.RewardList == nil then
self.RewardList = List:New()
DataConfig.DataCrossFudiScoreReward:Foreach(function(k, v)
local _id = v.Id
local _score = v.Need
local _list = Utils.SplitNumber(v.Reward, '_')
local _itemData = {
Id = _list[1],
Num = _list[2],
IsBind = true
}
local _pay = v.IfPay
local _data = {
Id = _id,
Need = _score,
ItemData = _itemData,
IsPay = false,
PayNum = _pay,
IsReward = false
}
self.RewardList:Add(_data)
end)
end
return self.RewardList
end
function CrossFuDiSystem:GetScoreReward(id)
local _ret = nil
local _list = self:GetRewardList()
if _list ~= nil then
for i = 1, #_list do
local _data = _list[i]
if _data.Id == id then
_ret = _data
end
end
end
return _ret
end
-- 是否显示锁
function CrossFuDiSystem:IsShowLock()
local _score = 0
local _dataList = self:GetRewardList()
if _dataList ~= nil then
for i = 1, #_dataList do
local _data = _dataList[i]
if _data.PayNum > 0 and not self.IsUnLock then
-- _score = _data.Need
self.IsUnLock = _data.IsPay
break
end
end
-- _ret = self.Score >= _score
end
return not self.IsUnLock
end
-- 设置积分排行数据
function CrossFuDiSystem:SetScoreRankDatas(msg)
if msg.rankList == nil then
return
end
self.ScoreRankList:Clear()
-- {Rank, Name, ServerId, Score}
for i = 1, #msg.rankList do
local _rank = msg.rankList[i]
local _playerId = _rank.playerId
local _name = _rank.name
local _rankId = _rank.rank
local _score = _rank.score
local _damage = _rank.damage
local _occ = _rank.career
local _visInfo = nil
if _rank.facade ~= nil then
_visInfo = PlayerVisualInfo:New()
_visInfo:ParseByLua(_rank.facade, 0)
end
local _facade = _rank.facade
local _campName = ""
-- 判断当前跨服类型
local _camp = _rank.camp
local _crossType = self:GetCrossType()
if _camp ~= nil then
if _crossType == FuDiCrossType.Cross_2 or _crossType == FuDiCrossType.Cross_4 or _crossType ==
FuDiCrossType.Cross_8 then
if _camp.serverId ~= nil and #_camp.serverId > 0 then
local _sdata = GameCenter.ServerListSystem:FindServer(_camp.serverId[1])
if _sdata ~= nil then
_campName = UIUtils.CSFormat("S{0}_{1}", _sdata.ShowServerId, _sdata.Name)
end
end
end
end
local _data = {
PlayerId = _playerId,
Name = _name,
Rank = _rankId,
Score = _score,
Damage = _damage,
Occ = _occ,
VisInfo = _visInfo,
ServerName = _campName
}
self.ScoreRankList:Add(_data)
end
end
-- 获取积分排行数据
function CrossFuDiSystem:GetScoreRankDatas()
return self.ScoreRankList
end
-- 设置击杀排行数据
function CrossFuDiSystem:SetKillRankDatas(msg)
if msg == nil then
return
end
if msg.rankList == nil then
return
end
self.KillRankList:Clear()
-- {Rank, Name, ServerId, Score}
for i = 1, #msg.rankList do
local _rank = msg.rankList[i]
local _playerId = _rank.playerId
local _name = _rank.name
local _rankId = _rank.rank
local _score = _rank.kill
local _damage = _rank.damage
local _occ = _rank.career
local _visInfo = nil
if _rank.facade ~= nil then
_visInfo = PlayerVisualInfo:New()
_visInfo:ParseByLua(_rank.facade, 0)
end
local _facade = _rank.facade
local _campName = ""
-- 判断当前跨服类型
local _camp = _rank.camp
local _crossType = self:GetCrossType()
if _camp ~= nil then
if _crossType == FuDiCrossType.Cross_2 or _crossType == FuDiCrossType.Cross_4 or _crossType ==
FuDiCrossType.Cross_8 then
if _camp.serverId ~= nil and #_camp.serverId > 0 then
local _sdata = GameCenter.ServerListSystem:FindServer(_camp.serverId[1])
if _sdata ~= nil then
_campName = UIUtils.CSFormat("S{0}_{1}", _sdata.ShowServerId, _sdata.Name)
end
end
end
end
local _data = {
PlayerId = _playerId,
Name = _name,
Rank = _rankId,
Score = _score,
Damage = _damage,
Occ = _occ,
VisInfo = _visInfo,
ServerName = _campName
}
self.KillRankList:Add(_data)
end
end
-- 获取击杀排行数据
function CrossFuDiSystem:GetKillRankDatas()
return self.KillRankList
end
-- 设置我的排名
function CrossFuDiSystem:SetMyRank(msg)
if msg.my == nil then
return
end
local _rank = msg.my
local _playerId = _rank.playerId
local _name = _rank.name
local _rankId = _rank.rank
local _score = _rank.score
local _kill = _rank.kill
local _damage = _rank.damage
local _occ = _rank.career
local _visInfo = nil
if _rank.facade ~= nil then
_visInfo = PlayerVisualInfo:New()
_visInfo:ParseByLua(_rank.facade, 0)
end
local _facade = _rank.facade
local _campName = ""
-- 判断当前跨服类型
local _camp = _rank.camp
local _crossType = self:GetCrossType()
if _crossType == FuDiCrossType.Cross_2 or _crossType == FuDiCrossType.Cross_4 or _crossType == FuDiCrossType.Cross_8 then
if _camp.serverId ~= nil and #_camp.serverId > 0 then
local _sdata = GameCenter.ServerListSystem:FindServer(_camp.serverId[1])
if _sdata ~= nil then
_campName = UIUtils.CSFormat("S{0}_{1}", _sdata.ShowServerId, _sdata.Name)
end
end
end
local _data = {
PlayerId = _playerId,
Name = _name,
Rank = _rankId,
Score = _score,
Kill = _kill,
Damage = _damage,
Occ = _occ,
VisInfo = _visInfo,
ServerName = _campName
}
self.MyRank = _data
end
-- 获取我的排名
function CrossFuDiSystem:GetMyRank()
return self.MyRank
end
-- 获取结算数据
function CrossFuDiSystem:GetResultData()
if self.ResultData == nil then
self.ResultData = L_ResultData:New()
end
return self.ResultData
end
-- 获取选中的城市Id
function CrossFuDiSystem:GetCurCityId()
return self.CurCityId
end
-- 设置选中的城市Id
function CrossFuDiSystem:SetCurCityId(id)
self.CurCityId = id
end
-- 获取进入的城市Id
function CrossFuDiSystem:GetEnterCityId()
return self.EnterCityId
end
-- 设置进入的城市Id
function CrossFuDiSystem:SetEnterCityId(id)
self.EnterCityId = id
end
-- 设置当前算中的bossId
function CrossFuDiSystem:SetCurSelectBossId(id)
local _cityId = self:GetCurCityId()
local _city = self:GetFuDiData(_cityId)
if _city ~= nil then
_city:SetCurSelectBossId(id)
end
end
-- 获取玩家在城市中选中的bossId
function CrossFuDiSystem:GetCuSelectBossId()
local _ret = 0
local _cityId = self:GetCurCityId()
local _city = self:GetFuDiData(_cityId)
if _city ~= nil then
_ret = _city:GetCurSelectBossId()
end
return _ret
end
function CrossFuDiSystem:SetFunctionVisable()
local _day = Time.GetOpenSeverDay()
GameCenter.MainFunctionSystem:SetFunctionVisible(FunctionStartIdCode.CrossFuDi, _day >= 3)
end
function CrossFuDiSystem:GetCityLeftTime(id)
local _ret = 0
local _city = self:GetFuDiData(id)
if _city ~= nil then
_ret = _city:GetLeftTime()
end
return _ret
end
-- 获取魔王裂隙Boss展示数据
function CrossFuDiSystem:GetMShowBossList()
if self.M_ShowBossList == nil then
self.M_ShowBossList = List:New()
local _playerOcc = GameCenter.GameSceneSystem:GetLocalPlayer().IntOcc
DataConfig.DataCrossDevilBoss:Foreach(function(k, v)
if v.Position == 0 then
local _head = v.Icon
local _name = v.Name
local _itemList = List:New()
local _list = Utils.SplitStr(v.Reward, ';')
if _list ~= nil then
for i = 1, #_list do
local _values = Utils.SplitNumber(_list[i], '_')
if _values ~= nil and #_values == 2 then
local _occ = _values[1]
local _itemId = _values[2]
if _occ == 9 or _occ == _playerOcc then
local _itemData = {
Id = _itemId,
Num = 1,
IsBind = true
}
_itemList:Add(_itemData)
end
end
end
end
local _data = {
CfgId = k,
Head = _head,
Name = _name,
ItemList = _itemList
}
self.M_ShowBossList:Add(_data)
end
end)
-- 排序
self.M_ShowBossList:Sort(function(a, b)
return a.CfgId < b.CfgId
end)
end
return self.M_ShowBossList
end
-- 获取魔王裂隙Boss列表数据
function CrossFuDiSystem:GetMBossList(cityId)
local _ret = nil
if self.M_DicBossList ~= nil then
_ret = self.M_DicBossList[cityId]
end
return _ret
end
-- 获取魔王裂隙boss数据
function CrossFuDiSystem:GetMBossData(cityId, bossId)
local _ret = nil
if self.M_DicBossList ~= nil then
local _bossList = self.M_DicBossList[cityId]
if _bossList ~= nil then
for i = 1, #_bossList do
local _boss = _bossList[i]
if _boss.CfgId == bossId then
_ret = _boss
break
end
end
end
end
return _ret
end
-- 获取魔王裂隙第一个boss数据
function CrossFuDiSystem:GetMFirstBossData(cityId)
local _ret = nil
if self.M_DicBossList ~= nil then
local _bossList = self.M_DicBossList[cityId]
if _bossList ~= nil then
for i = 1, #_bossList do
local _boss = _bossList[i]
_ret = _boss
break
end
end
end
return _ret
end
-- 获取魔王蕾西boss伤害排行数据
function CrossFuDiSystem:GetMBossRankList(cityId, bossId)
local _ret = nil
if self.M_DicBossList ~= nil then
local _bossList = self.M_DicBossList[cityId]
if _bossList ~= nil then
for i = 1, #_bossList do
local _boss = _bossList[i]
if _boss.CfgId == bossId or _boss.MonsterId == bossId then
_ret = _boss.RankList
break
end
end
end
end
return _ret
end
-- 判断是否处于魔王裂隙活动时间
function CrossFuDiSystem:OyLiKaiIsOpen()
local _ret = false
local _openServerDay = Time.GetOpenSeverDay()
if _openServerDay < 11 then
return false
end
if self.M_OpenData == nil then
local _dayList = List:New()
local _openTime = 0
local _endTime = 0
local _cfg = DataConfig.DataDaily[114]
if _cfg ~= nil then
local _list = Utils.SplitNumber(_cfg.OpenTime, '_')
for i = 1, #_list do
_dayList:Add(_list[i])
end
_list = Utils.SplitNumber(_cfg.Time, '_')
_openTime = _list[1] * 60
_endTime = _list[2] * 60
end
self.M_OpenData = {
DayList = _dayList,
OpenTime = _openTime,
EndTime = _endTime
}
end
local _serverTime = math.floor(GameCenter.HeartSystem.ServerZoneTime)
-- 计算当前周几 1 - 7
local week = L_TimeUtils.GetStampTimeWeeklyNotZone(_serverTime)
if #self.M_OpenData.DayList == 1 and self.M_OpenData.DayList[1] == 0 then
local _hour, _min, _sec = L_TimeUtils.GetStampTimeHHMMSSNotZone(_serverTime)
local _curSeconds = _hour * 3600 + _min * 60 + _sec
if _curSeconds >= self.M_OpenData.OpenTime and _curSeconds <= self.M_OpenData.EndTime then
_ret = true
end
else
if self.M_OpenData.DayList:Contains(week) then
local _hour, _min, _sec = L_TimeUtils.GetStampTimeHHMMSSNotZone(_serverTime)
local _curSeconds = _hour * 3600 + _min * 60 + _sec
if _curSeconds >= self.M_OpenData.OpenTime and _curSeconds <= self.M_OpenData.EndTime then
_ret = true
end
end
end
return _ret
end
function CrossFuDiSystem:GetLieKaiLeftTime()
local _ret = 0
if self.M_OpenData == nil then
local _dayList = List:New()
local _openTime = 0
local _endTime = 0
local _cfg = DataConfig.DataDaily[114]
if _cfg ~= nil then
local _list = Utils.SplitNumber(_cfg.OpenTime, '_')
for i = 1, #_list do
_dayList:Add(_list[i])
end
_list = Utils.SplitNumber(_cfg.Time, '_')
_openTime = _list[1] * 60
_endTime = _list[2] * 60
end
self.M_OpenData = {
DayList = _dayList,
OpenTime = _openTime,
EndTime = _endTime
}
end
local _serverTime = math.floor(GameCenter.HeartSystem.ServerZoneTime)
local _hour, _min, _sec = L_TimeUtils.GetStampTimeHHMMSSNotZone(_serverTime)
local _curSeconds = _hour * 3600 + _min * 60 + _sec
if _curSeconds >= self.M_OpenData.OpenTime and _curSeconds <= self.M_OpenData.EndTime then
_ret = self.M_OpenData.EndTime - _curSeconds
end
return _ret
end
function CrossFuDiSystem:GetLieKaiPreTime()
local _ret = 0
if self.M_OpenData == nil then
local _dayList = List:New()
local _openTime = 0
local _endTime = 0
local _cfg = DataConfig.DataDaily[114]
if _cfg ~= nil then
local _list = Utils.SplitNumber(_cfg.OpenTime, '_')
for i = 1, #_list do
_dayList:Add(_list[i])
end
_list = Utils.SplitNumber(_cfg.Time, '_')
_openTime = _list[1] * 60
_endTime = _list[2] * 60
end
self.M_OpenData = {
DayList = _dayList,
OpenTime = _openTime,
EndTime = _endTime
}
end
local week = L_TimeUtils.GetStampTimeWeeklyNotZone(_serverTime)
if self.M_OpenData.DayList:Contains(week) then
local _serverTime = math.floor(GameCenter.HeartSystem.ServerZoneTime)
local _hour, _min, _sec = L_TimeUtils.GetStampTimeHHMMSSNotZone(_serverTime)
local _curSeconds = _hour * 3600 + _min * 60 + _sec
if _curSeconds > self.M_OpenData.OpenTime then
_ret = _curSeconds - self.M_OpenData.OpenTime
end
end
return _ret
end
--获取下次开启时间
function CrossFuDiSystem:GetOyLiKaiNextTime()
local _ret1 = 0
local _ret2 = 0
if self.M_OpenData == nil then
local _dayList = List:New()
local _openTime = 0
local _endTime = 0
local _cfg = DataConfig.DataDaily[114]
if _cfg ~= nil then
local _list = Utils.SplitNumber(_cfg.OpenTime, '_')
for i = 1, #_list do
_dayList:Add(_list[i])
end
_list = Utils.SplitNumber(_cfg.Time, '_')
_openTime = _list[1] * 60
_endTime = _list[2] * 60
end
self.M_OpenData = {
DayList = _dayList,
OpenTime = _openTime,
EndTime = _endTime
}
end
local _serverTime = math.floor(GameCenter.HeartSystem.ServerZoneTime)
-- 计算当前周几 1 - 7
local week = L_TimeUtils.GetStampTimeWeeklyNotZone(_serverTime)
if #self.M_OpenData.DayList == 1 and self.M_OpenData.DayList[1] == 0 then
local _hour, _min, _sec = L_TimeUtils.GetStampTimeHHMMSSNotZone(_serverTime)
local _curSeconds = _hour * 3600 + _min * 60 + _sec
if _curSeconds > self.M_OpenData.OpenTime then
_ret1 = 3600 * 24 - _curSeconds + self.M_OpenData.OpenTime
_ret2 = week
else
_ret1 = self.M_OpenData.OpenTime - _curSeconds
_ret2 = week + 1
end
if _ret2 > 7 then
_ret2 = 1
end
else
local _hour, _min, _sec = L_TimeUtils.GetStampTimeHHMMSSNotZone(_serverTime)
local _curSeconds = _hour * 3600 + _min * 60 + _sec
local _preDay = 0
local _nextDay = 0
local _disDay = 0
for i = 1, #self.M_OpenData.DayList do
_preDay = self.M_OpenData.DayList[i]
if week == 1 then
_nextDay = self.M_OpenData.DayList[#self.M_OpenData.DayList]
break
else
if self.M_OpenData.DayList[i] >= week then
if self.M_OpenData.DayList[i] == week then
if _curSeconds < self.M_OpenData.EndTime then
_nextDay = self.M_OpenData.DayList[i]
end
else
_nextDay = self.M_OpenData.DayList[i]
end
break
end
end
end
if _nextDay == 0 then
_nextDay = self.M_OpenData.DayList[1]
_disDay = 7 - week + _nextDay - 1
else
_disDay = _nextDay - week - 1
end
if week == _preDay and self.M_OpenData.OpenTime > _curSeconds then
_ret1 = self.M_OpenData.OpenTime - _curSeconds
_ret2 = _preDay
else
_ret1 = 3600 * 24 - _curSeconds + _disDay * 3600 * 24 + self.M_OpenData.OpenTime
_ret2 = _nextDay
end
end
return _ret1, _ret2
end
function CrossFuDiSystem:GetMCopyDataList()
if self.M_CopyList == nil then
self.M_CopyList = List:New()
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
if _lp == nil then
return
end
local _playerOcc = _lp.IntOcc
DataConfig.DataCrossDevilGroupCopy:Foreach(function(k, v)
local _id = v.Id
local _name = v.Name
local _list = Utils.SplitNumber(v.OpenItem, '_')
local _needItem = {
Id = _list[1],
Num = _list[2],
IsBind = false
}
local _sprName = v.Icon
-- CapReward = 5,
-- MemberReward = 6,
local _leaderItemList = List:New()
_list = Utils.SplitStr(v.CapReward, ';')
if _list ~= nil then
for i = 1, #_list do
local _values = Utils.SplitNumber(_list[i], '_')
local _occ = _values[4]
if _occ == 9 or _occ == _playerOcc then
local _leaderItem = {
Id = _values[1],
Num = _values[2],
IsBind = _values[3] == 1
}
_leaderItemList:Add(_leaderItem)
end
end
end
local _memberItemList = List:New()
_list = Utils.SplitStr(v.MemberReward, ';')
if _list ~= nil then
for i = 1, #_list do
local _values = Utils.SplitNumber(_list[i], '_')
local _occ = _values[4]
if _occ == 9 or _occ == _playerOcc then
local _memberItem = {
Id = _values[1],
Num = _values[2],
IsBind = _values[3] == 1
}
_memberItemList:Add(_memberItem)
end
end
end
local _copyData = {
Id = _id,
Name = _name,
SprName = _sprName,
Need = _needItem,
LeaderItemList = _leaderItemList,
MemberItemList = _memberItemList
}
self.M_CopyList:Add(_copyData)
end)
end
return self.M_CopyList
end
-- 心跳
function CrossFuDiSystem:Update(dt)
if self.IsCheckOyLiKaiRedPoint then
self:CheckOyLieKaiRedPoint()
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_LIEXI_REDPOINT)
self.IsCheckOyLiKaiRedPoint = false
end
-- if self.CacheCopyMsgList ~= nil and #self.CacheCopyMsgList > 0 then
-- -- 同步数据
-- GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSFUDI_COPY_DATAUPDATE)
-- end
-- -- CacheCopyHurtMsgList
-- if self.CacheCopyHurtMsgList ~= nil and #self.CacheCopyHurtMsgList > 0 then
-- -- 同步数据
-- end
end
-- ==========================================================消息==========================================================
-- 请求跨服福地数据
function CrossFuDiSystem:ReqAllCrossFudInfo()
GameCenter.Network.Send("MSG_GuildCrossFud.ReqAllCrossFudInfo")
end
-- 请求解锁积分宝箱
function CrossFuDiSystem:ReqCrossFudUnLockScoreBox(id)
GameCenter.Network.Send("MSG_GuildCrossFud.ReqCrossFudUnLockScoreBox", {
boxId = id
})
end
-- 请求领取积分宝箱
function CrossFuDiSystem:ReqCrossFudScoreBoxOpen(id)
GameCenter.Network.Send("MSG_GuildCrossFud.ReqCrossFudScoreBoxOpen", {
boxId = id
})
end
-- 领取福地宝箱
function CrossFuDiSystem:ReqCrossFudBoxOpen(id)
GameCenter.Network.Send("MSG_GuildCrossFud.ReqCrossFudBoxOpen", {
cityId = id
})
end
-- 获取福地详情
function CrossFuDiSystem:ReqCrossFudCityInfo(id, t)
GameCenter.Network.Send("MSG_GuildCrossFud.ReqCrossFudCityInfo", {
city = id,
type = t
})
end
-- 获取个人排名
function CrossFuDiSystem:ReqCrossFudRank(t)
GameCenter.Network.Send("MSG_GuildCrossFud.ReqCrossFudRank", {
type = t
})
end
-- 请求关注
function CrossFuDiSystem:ReqCrossFudCareBoss(t, cId, bId)
GameCenter.Network.Send("MSG_GuildCrossFud.ReqCrossFudCareBoss", {
type = t,
cityId = cId,
bossId = bId
})
end
-- 请求进入跨服福地
function CrossFuDiSystem:ReqCrossFudEnter(id, t)
self:SetCurCityId(id)
GameCenter.Network.Send("MSG_GuildCrossFud.ReqCrossFudEnter", {
cityId = id,
type = t
})
end
--请求魔王缝隙boss列表
function CrossFuDiSystem:ReqDevilBossList()
GameCenter.Network.Send("MSG_GuildCrossFud.ReqDevilBossList")
end
--返回魔王缝隙boss展示列表
function CrossFuDiSystem:ResDevilBossList(msg)
end
-- 返回跨服福地数据
function CrossFuDiSystem:ResAllCrossFudInfo(msg)
if msg == nil then
return
end
-- 设置个人积分
self.Score = msg.score
-- 设置世界等级
self.CrossWorldLv = msg.worldLevel
-- 设置当前天禁值
self.CurTianJin = msg.tValue
-- 设置城市数据
if msg.cityList ~= nil then
for i = 1, #msg.cityList do
local _city = self.DicFuDi[msg.cityList[i].cityId]
if _city == nil then
_city = L_CrossFuDi:New()
self.DicFuDi[msg.cityList[i].cityId] = _city
end
_city:SetData(msg.cityList[i])
_city:SetFinalItem(msg.cityList[i].box)
if i == 1 then
-- 设置跨服类型
self.CrossType = _city:GetCrossType()
end
end
local _keys = self.DicFuDi:GetKeys()
if _keys ~= nil then
for i = 1, #_keys do
local _key = _keys[1]
if math.floor(_key / 100) ~= self.CrossType then
self.DicFuDi:Remove(_key)
end
end
end
end
-- 设置个人积分宝箱
local _rewardList = self:GetRewardList()
if msg.boxList ~= nil then
for i = 1, #msg.boxList do
local _box = msg.boxList[i]
local _data = self:GetScoreReward(_box.boxId)
if _data ~= nil then
_data.IsPay = not _box.isLock
_data.IsReward = _box.isGet
end
end
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSFUDI_DATA_RESULT)
end
-- 福地宝箱领取返回
function CrossFuDiSystem:ResUpdateCrossFudBox(msg)
if msg == nil then
return
end
local _city = self:GetFuDiData(msg.cityId)
if _city ~= nil then
_city:RewardedBox()
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSFUDI_BOX_REWARDED, msg)
end
-- 积分宝箱解锁
function CrossFuDiSystem:ResUpdateCrossFudScoreBox(msg)
if msg == nil then
return
end
if msg.boxList == nil then
return
end
for i = 1, #msg.boxList do
local _box = msg.boxList[i]
local _data = self:GetScoreReward(_box.boxId)
if _data ~= nil then
_data.IsPay = not _box.isLock
_data.IsReward = _box.isGet
end
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSFUDI_DATA_RESULT)
end
-- 返回福地详情
function CrossFuDiSystem:ResCrossFudCityInfo(msg)
if msg == nil then
return
end
local _playerOcc = GameCenter.GameSceneSystem:GetLocalPlayer().IntOcc
if msg.type == 0 then
local _city = self:GetFuDiData(msg.cityId)
if _city == nil then
return
end
-- 设置服务器(阵营)排行
_city:SetServerScoreRankDatas(msg)
-- 设置boss列表
_city:SetBossDatas(msg.bossList)
_city.OwnPlayerNum = msg.enterRole
else
local _bossList = List:New()
if msg.bossList ~= nil then
for i = 1, #msg.bossList do
local _bossMsg = msg.bossList[i]
local _cfgId = _bossMsg.bossId
local _bossState = 0
if _bossMsg.time == nil then
_bossMsg.time = 0
end
if _bossMsg.isDie and _bossMsg.time <= 0 then
_bossState = 1
end
local _leftTime = _bossMsg.time / 1000
local _cfg = DataConfig.DataCrossDevilBoss[_bossMsg.bossId]
local _itemList = List:New()
local _list = Utils.SplitStr(_cfg.Reward, ';')
if _list ~= nil then
for i = 1, #_list do
local _values = Utils.SplitNumber(_list[i], '_')
if _values ~= nil and #_values == 2 then
local _occ = _values[1]
local _itemId = _values[2]
if _occ == 9 or _occ == _playerOcc then
local _itemData = {
Id = _itemId,
Num = 1,
IsBind = true
}
_itemList:Add(_itemData)
end
end
end
end
local _head = _cfg.Icon
local _name = _cfg.Name
local _monsterCfg = DataConfig.DataMonster[_cfg.MonsterId]
local _level = _monsterCfg.Level
local _boss = {
CfgId = _cfgId,
MonsterId = _cfg.MonsterId,
BossState = _bossState,
LeftTime = _leftTime,
Head = _head,
Name = _name,
Level = _level,
ItemList = _itemList,
RankList = List:New()
}
_bossList:Add(_boss)
end
end
self.M_DicBossList[msg.cityId] = _bossList
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSFUDI_CITY_DETAIL, msg.cityId)
end
-- 返回福地排名
function CrossFuDiSystem:ResCrossFudRankInfo(msg)
if msg == nil then
return
end
if msg.type == 0 then
-- 设置积分排名
self:SetScoreRankDatas(msg)
elseif msg.type == 1 then
-- 设置击杀排名
self:SetKillRankDatas(msg)
end
-- 设置我的排名
self:SetMyRank(msg)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSFUDI_RANK_RESULT)
end
-- 福地攻打情况
function CrossFuDiSystem:ResCrossFudReport(msg)
if msg == nil then
return
end
if msg.type == 0 then
self:SetCurCityId(msg.cityId)
local _cityData = self:GetFuDiData(msg.cityId)
if _cityData == nil then
return
end
_cityData:SetBossDatas(msg.boss)
self.CacheCopyMsgList:Add(1)
else
local _bossList = List:New()
if msg.boss ~= nil then
for i = 1, #msg.boss do
local _bossMsg = msg.boss[i]
local _cfgId = _bossMsg.bossId
local _bossState = 0
if _bossMsg.isDie and _bossMsg.time <= 0 then
_bossState = 1
end
local _leftTime = _bossMsg.time / 1000
local _cfg = DataConfig.DataCrossDevilBoss[_bossMsg.bossId]
local _head = _cfg.Icon
local _name = _cfg.Name
local _monsterCfg = DataConfig.DataMonster[_cfg.MonsterId]
local _level = _monsterCfg.Level
local _boss = {
CfgId = _cfgId,
MonsterId = _cfg.MonsterId,
BossState = _bossState,
LeftTime = _leftTime,
Head = _head,
Name = _name,
Level = _level,
RankList = List:New()
}
_bossList:Add(_boss)
end
end
self.M_DicBossList[msg.cityId] = _bossList
self.M_CacheCopyMsgList:Add(1)
end
end
-- 福地伤害统计
function CrossFuDiSystem:ResCrossFudBossReport(msg)
if msg == nil then
return
end
if msg.type == 0 then
local _cityData = self:GetEnterCityData()
if _cityData ~= nil then
_cityData:SetBossGuiShuCamp(msg.camp)
_cityData:SetDamageRankList(msg.rankList, msg.boss.bossId)
end
else
local _bossMsg = msg.boss
local _cfgId = _bossMsg.bossId
local _bossState = 0
if _bossMsg.isDie then
_bossState = 1
end
local _leftTime = _bossMsg.time / 1000
local _cfg = DataConfig.DataCrossDevilBoss[_bossMsg.bossId]
local _head = _cfg.Icon
local _name = _cfg.Name
local _monsterCfg = DataConfig.DataMonster[_cfg.MonsterId]
local _level = _monsterCfg.Level
local _boss = self:GetMBossData(self:GetEnterCityId(), _bossMsg.bossId)
_boss.CfgId = _cfgId
_boss.BossState = _bossState
_boss.Head = _head
_boss.Name = _name
_boss.Level = _level
_boss.RankList:Clear()
if msg.rankList ~= nil then
for i = 1, #msg.rankList do
local _rank = msg.rankList[i]
_boss.RankList:Add({
Rank = _rank.rank,
Name = _rank.name,
Damage = _rank.damage
})
end
_boss.RankList:Sort(function(a, b)
return a.Damage > b.Damage
end)
end
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_CROSSFUDI_HURTRANK_UPDATE)
end
-- 福地结算
function CrossFuDiSystem:ResCrossFudOwnerNotice(msg)
if msg == nil then
return
end
local _data = self:GetResultData()
_data:SetFirstData(msg)
-- 设置城市数据
local _cityData = self:GetFuDiData(msg.city.cityId)
if _cityData == nil then
-- 有可能没有打开过界面没有获取到城市数据
_cityData = L_CrossFuDi:New()
self.DicFuDi[msg.city.cityId] = _cityData
end
if _cityData ~= nil then
_cityData:SetData(msg.city)
-- 设置击杀排名
_cityData:SetPersonKillRankDatas(msg.killRank)
-- 设置积分排名
_cityData:SetPersonScoreRankDatas(msg.scoreRank)
end
_data:SetFinalItemData(msg.city.box.boxId)
GameCenter.PushFixEvent(UILuaEventDefine.UICrossFuDiResultForm_OPEN, msg.city.cityId)
end
-- 返回关注数据
function CrossFuDiSystem:ResCrossFudCareBoss(msg)
if msg == nil then
return
end
local _cityData = self:GetFuDiData(msg.cityId)
if _cityData == nil then
return
end
local _bossData = _cityData:GetBossData(msg.boss.bossId)
if _bossData == nil then
return
end
_bossData.IsCare = msg.boss.care
-- local _cfg = DataConfig.DataCrossFudiMain[msg.cityId]
-- if _cfg ~= nil then
-- GameCenter.PushFixEvent(UIEventDefine.UIBossInfoTips_OPEN, {_cfg.Id, _cfg.CloneId, msg.boss.bossId, 13})
-- end
end
function CrossFuDiSystem:ResCrossFudCareBossRefresh(msg)
if msg == nil then
return
end
local _cfg = DataConfig.DataCrossFudiMain[msg.cityId]
if _cfg ~= nil then
GameCenter.PushFixEvent(UIEventDefine.UIBossInfoTips_OPEN, {_cfg.Id, _cfg.CloneId, msg.bossId, 13})
end
end
function CrossFuDiSystem:ResUpdateTJValue(msg)
if msg == nil then
return
end
self.CurTianJin = msg.tValue
end
-- ==========================================================消息==========================================================
return CrossFuDiSystem