forked from endernon/PGRData
1505 lines
No EOL
56 KiB
Lua
1505 lines
No EOL
56 KiB
Lua
-- 战双大秘境管理器
|
||
local XExFubenActivityManager = require("XEntity/XFuben/XExFubenActivityManager")
|
||
local XRiftChapter = require("XEntity/XRift/XRiftChapter")
|
||
local XRiftFightLayer = require("XEntity/XRift/XRiftFightLayer")
|
||
local XRiftRole = require("XEntity/XRift/XRiftRole")
|
||
local XRiftMonster = require("XEntity/XRift/XRiftMonster")
|
||
local XRiftTeam = require("XEntity/XRift/XRiftTeam")
|
||
local XRobot = require("XEntity/XRobot/XRobot")
|
||
local XRiftPlugin = require("XEntity/XRift/XRiftPlugin")
|
||
local XRiftAttributeTemplate = require("XEntity/XRift/XRiftAttributeTemplate")
|
||
local ScreenAll = CS.XTextManager.GetText("ScreenAll")
|
||
|
||
XRiftManagerCreator = function()
|
||
local XRiftManager = XExFubenActivityManager.New(XFubenConfigs.ChapterType.Rift, "RiftManager")
|
||
-- 活动配置数据
|
||
local CurrentConfig = nil -- 基本活动配置
|
||
local StartTime = 0 -- 本轮开始时间
|
||
local EndTime = 0 -- 本轮结束时间
|
||
-- 实体数据
|
||
local AllRoles = {}
|
||
local AllPluginDicById = {} -- XPlugin插件列表
|
||
local ChapterDicById = {} -- 区域
|
||
local FightLayerDicById = {} -- 作战层
|
||
local RoleDicById = {}
|
||
local MonsterDicById = {}
|
||
-- 自定义数据
|
||
local TargetCanResetTimestamp = 0 -- 在这个时间戳之后才可以重置
|
||
local MultiTeamData = {} -- 多队伍数据(存本地)
|
||
local SingleTeamData = {}
|
||
local CurrSelectRiftStageGroup = nil -- 全局数据,最后一次点击过的关卡节点,用来作为进入战斗时传入的参数
|
||
local LastFightXStage = nil -- 记录最后1次战斗过的stage,扫荡也算
|
||
local PluginShopGoodList = nil -- 插件商店物品列表
|
||
local NewLayerIdTrigger = nil -- 层结算后是否确认跳转到下一层
|
||
local IsFirstPassChapterTrigger = nil -- 区域首通后是否弹提示
|
||
local IsLayerSettleTrigger = nil -- 层结算ui(必须在外面显示)
|
||
local IsEnterNextFightTrigger = nil -- 触发了进入下一关战斗
|
||
local IsJumpOpenTrigger = nil -- 触发了跨层解锁
|
||
local IsJumpResTrigger = nil -- 触发高盖低(跨层通关)奖励机制
|
||
-- 服务器下发确认的数据
|
||
local ActivityId = 1
|
||
local MaxUnLockFightLayerOrder = nil -- 当前解锁的最高层作战层
|
||
local MaxPassFightLayerOrder = nil -- 当前通过的最高层作战层
|
||
local MaxLoad = 0 -- 角色负载上限
|
||
local SweepTimes = 0 -- 已扫荡次数
|
||
local AttrTemplateDicById = {} -- 队伍加点模板列表
|
||
local TotalAttrLevel = 0 -- 队伍加点:当前已拥有的属性点数
|
||
local AttrLevelMax = 0 -- 队伍加点:当前单个属性加点最大值
|
||
local RankData = {} -- 排行榜数据
|
||
local TeamDatas = {} -- 队伍对应的加点模板
|
||
|
||
function XRiftManager.Init()
|
||
XRiftManager.RegisterEvents()
|
||
XRiftManager.InitChapter()
|
||
XRiftManager.InitFightLayer()
|
||
-- StageGroup和Stage比较特殊,和作战层位置绑定,必须等服务器下发后再创建实例,所以具体的某个StageGroup和Stage都不能通过ID查找,只能通过【作战层-关卡节点序号】这样的关系查找
|
||
XRiftManager.GenerateMonsterData()
|
||
XRiftManager.GenerateAttrTemplate()
|
||
XRiftManager.GeneratePluginData()
|
||
end
|
||
|
||
--注册事件
|
||
function XRiftManager.RegisterEvents()
|
||
--玩家角色增加时,增加成员
|
||
XEventManager.AddEventListener(XEventId.EVENT_CHARACTER_ADD_SYNC, XRiftManager.OnCharacterAdd)
|
||
XEventManager.AddEventListener(XEventId.EVENT_FUBEN_SETTLE_REWARD,
|
||
function(settleData)
|
||
if not LastFightXStage then
|
||
return
|
||
end
|
||
-- 这条代码开新手指引检测
|
||
XDataCenter.FunctionEventManager.UnLockFunctionEvent()
|
||
-- 不是大秘境stage 返回
|
||
local isRiftStageRes = XRiftConfig.GetStageConfigById(settleData.StageId)
|
||
if not isRiftStageRes then
|
||
return
|
||
end
|
||
|
||
-- 因为会在战斗结束后重复请求战斗 提前移除
|
||
XLuaUiManager.Remove("UiRiftSettlePlugin")
|
||
XLuaUiManager.Remove("UiRiftSettleWin")
|
||
|
||
if settleData.IsWin then
|
||
XRiftManager.DoShowReward({SettleData = settleData})
|
||
else
|
||
CS.XFight.ExitForClient(true)
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XRiftManager.GetCurrentConfig()
|
||
return CurrentConfig
|
||
end
|
||
|
||
function XRiftManager.GetTime()
|
||
return StartTime, EndTime
|
||
end
|
||
|
||
function XRiftManager.IsInActivity()
|
||
if XTool.IsTableEmpty(CurrentConfig) then
|
||
return false
|
||
end
|
||
return XFunctionManager.CheckInTimeByTimeId(CurrentConfig.TimeId)
|
||
end
|
||
|
||
function XRiftManager.GetLastFightXStage()
|
||
return LastFightXStage
|
||
end
|
||
|
||
function XRiftManager.SetCurrSelectRiftStage(xStageGroup)
|
||
CurrSelectRiftStageGroup = xStageGroup
|
||
end
|
||
|
||
function XRiftManager.GetCurrSelectRiftStageGroup()
|
||
return CurrSelectRiftStageGroup
|
||
end
|
||
|
||
function XRiftManager.GetMaxUnLockFightLayerId()
|
||
return MaxUnLockFightLayerOrder
|
||
end
|
||
|
||
function XRiftManager.GetMaxPassFightLayerId()
|
||
return MaxPassFightLayerOrder
|
||
end
|
||
|
||
function XRiftManager.GetIsNewLayerIdTrigger() --(Trigger)触发后关闭
|
||
if NewLayerIdTrigger then
|
||
local tempId = NewLayerIdTrigger
|
||
NewLayerIdTrigger = nil
|
||
return tempId
|
||
end
|
||
end
|
||
|
||
function XRiftManager.SetNewLayerTrigger(newFightLayerId)
|
||
NewLayerIdTrigger = newFightLayerId
|
||
end
|
||
|
||
function XRiftManager.GetIsFirstPassChapterTrigger() --(Trigger)触发后关闭
|
||
if IsFirstPassChapterTrigger then
|
||
local tempId = IsFirstPassChapterTrigger
|
||
IsFirstPassChapterTrigger = nil
|
||
return tempId
|
||
end
|
||
end
|
||
|
||
function XRiftManager.SetFirstPassChapterTrigger(fightLayerId)
|
||
IsFirstPassChapterTrigger = fightLayerId
|
||
end
|
||
|
||
function XRiftManager.GetIsLayerSettleTrigger() --(Trigger)触发后关闭
|
||
if IsLayerSettleTrigger then
|
||
local tempData = IsLayerSettleTrigger
|
||
IsLayerSettleTrigger = nil
|
||
return tempData
|
||
end
|
||
end
|
||
|
||
function XRiftManager.SetLayerSettleTrigger(fun)
|
||
IsLayerSettleTrigger = fun
|
||
end
|
||
|
||
function XRiftManager.GetIsEnterNextFightTrigger() --(Trigger)触发后关闭
|
||
if IsEnterNextFightTrigger then
|
||
local tempData = IsEnterNextFightTrigger
|
||
IsEnterNextFightTrigger = nil
|
||
return tempData
|
||
end
|
||
end
|
||
|
||
function XRiftManager.SetEnterNextFightTrigger(fun)
|
||
IsEnterNextFightTrigger = fun
|
||
end
|
||
|
||
function XRiftManager.GetIsTriggerJumpOpen() --(Trigger)触发后关闭
|
||
if IsJumpOpenTrigger then
|
||
local tmpData = IsJumpOpenTrigger
|
||
IsJumpOpenTrigger = nil
|
||
return tmpData
|
||
end
|
||
end
|
||
|
||
-- 是否触发了高盖低机制
|
||
function XRiftManager.GetIsTriggerJumpRes() --(Trigger)触发后关闭
|
||
if IsJumpResTrigger then
|
||
local tmpData = IsJumpResTrigger
|
||
IsJumpResTrigger = nil
|
||
return tmpData
|
||
end
|
||
end
|
||
|
||
-- 设置每日提示
|
||
local SetDayTip = function (isSelect)
|
||
local key = "RiftDayTipLuckValue"..XPlayer.Id
|
||
if not isSelect then
|
||
XSaveTool.RemoveData(key)
|
||
else
|
||
local updateTime = XTime.GetSeverTomorrowFreshTime()
|
||
XSaveTool.SaveData(key, updateTime)
|
||
end
|
||
end
|
||
|
||
-- 今天是否可以弹每日提示
|
||
local GetIsNewDayUpdate = function ()
|
||
local key = "RiftDayTipLuckValue"..XPlayer.Id
|
||
local data = XSaveTool.GetData(key)
|
||
|
||
if not data then
|
||
return true
|
||
end
|
||
|
||
return data ~= XTime.GetSeverTomorrowFreshTime()
|
||
end
|
||
|
||
-- 检测每日提示并继续
|
||
function XRiftManager.CheckDayTipAndDoFun(xChapter, doFun)
|
||
if XRiftManager.IsFuncUnlock(XRiftConfig.FuncUnlockId.LuckyStage) and xChapter:GetLuckValueProgress() >= 1 and GetIsNewDayUpdate() then
|
||
local titile = CS.XTextManager.GetText("TipTitle")
|
||
local content = CS.XTextManager.GetText("RiftLuckValueTip")
|
||
local hitInfo =
|
||
{
|
||
SetHintCb = SetDayTip,
|
||
Status = false
|
||
}
|
||
XUiManager.DialogHintTip(titile, content, nil, nil , doFun, hitInfo)
|
||
else
|
||
doFun()
|
||
end
|
||
end
|
||
|
||
function XRiftManager.InitMultiTeamData()
|
||
if not XPlayer or not XPlayer.Id then
|
||
return
|
||
end
|
||
|
||
-- 队伍数据会在实例XRiftTeam更新时自动保存到本地
|
||
local data = {}
|
||
for i = 1, CurrentConfig.AttrLevelSetCount do
|
||
data[i] = XRiftTeam.New(i)
|
||
end
|
||
MultiTeamData = data
|
||
end
|
||
|
||
function XRiftManager.GetMultiTeamData()
|
||
if XTool.IsTableEmpty(MultiTeamData) then
|
||
XRiftManager.InitMultiTeamData()
|
||
end
|
||
return MultiTeamData
|
||
end
|
||
|
||
function XRiftManager.GetSingleTeamData()
|
||
if XTool.IsTableEmpty(SingleTeamData) then
|
||
SingleTeamData = XRiftTeam.New(-1)
|
||
end
|
||
return SingleTeamData
|
||
end
|
||
|
||
function XRiftManager.ChangeMultiTeamData(data)
|
||
MultiTeamData = data
|
||
end
|
||
|
||
function XRiftManager.CheckRoleInTeam(roleId)
|
||
for teamIndex, xTeam in pairs(MultiTeamData) do
|
||
for i = 1, 3 do
|
||
local idInTeam = xTeam:GetEntityIdByTeamPos(i)
|
||
if roleId == idInTeam then
|
||
return true, xTeam, i
|
||
end
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查该队伍是否有关卡进度
|
||
function XRiftManager.CheckRoleInMultiTeamLock(xTeam)
|
||
if not xTeam or not CurrSelectRiftStageGroup then
|
||
return
|
||
end
|
||
|
||
local xStageGroup = CurrSelectRiftStageGroup
|
||
if xStageGroup:GetParent():CheckNoneData() then -- 没有战斗数据
|
||
return false
|
||
end
|
||
|
||
local index = xTeam:GetId()
|
||
local xStage = xStageGroup:GetAllEntityStages()[index]
|
||
return xStage:CheckHasPassed()
|
||
end
|
||
|
||
function XRiftManager.AddMultiTeamMember(teamIndex, pos, xRole)
|
||
MultiTeamData[teamIndex]:UpdateEntityTeamPos(xRole:GetId(), pos, true) -- 如果存在会替换
|
||
end
|
||
|
||
function XRiftManager.RemoveTeamMember(teamIndex, pos)
|
||
MultiTeamData[teamIndex]:UpdateEntityTeamPos(nil, pos, true)
|
||
end
|
||
|
||
function XRiftManager.SwapMultiTeamMember(aTeamIndex, aPos, bTeamIndex, bPos)
|
||
local aRoleId = MultiTeamData[aTeamIndex]:GetEntityIdByTeamPos(aPos)
|
||
local bRoleId = MultiTeamData[bTeamIndex]:GetEntityIdByTeamPos(bPos)
|
||
|
||
MultiTeamData[aTeamIndex]:UpdateEntityTeamPos(bRoleId, aPos, true)
|
||
MultiTeamData[bTeamIndex]:UpdateEntityTeamPos(aRoleId, bPos, true)
|
||
end
|
||
|
||
function XRiftManager.InitStageInfo()
|
||
local allConfigs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftStage)
|
||
for k, config in pairs(allConfigs) do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(config.StageId)
|
||
stageInfo.Type = XDataCenter.FubenManager.StageType.Rift
|
||
end
|
||
end
|
||
|
||
function XRiftManager.InitChapter()
|
||
local allConfigs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftChapter)
|
||
for k, config in pairs(allConfigs) do
|
||
local XRiftChapter = XRiftChapter.New(config)
|
||
ChapterDicById[config.Id] = XRiftChapter
|
||
end
|
||
end
|
||
|
||
function XRiftManager.InitFightLayer()
|
||
local allConfigs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftLayer)
|
||
for k, config in pairs(allConfigs) do
|
||
local XRiftFightLayer = XRiftFightLayer.New(config)
|
||
FightLayerDicById[config.Id] = XRiftFightLayer
|
||
end
|
||
end
|
||
|
||
function XRiftManager.GetEntityChapterById(id)
|
||
return ChapterDicById[id]
|
||
end
|
||
|
||
function XRiftManager.GetEntityFightLayerById(id)
|
||
return FightLayerDicById[id]
|
||
end
|
||
|
||
function XRiftManager.CheckIsHasFightLayerRedPoint()
|
||
for k, xFightLayer in pairs(FightLayerDicById) do
|
||
if xFightLayer:CheckRedPoint() then
|
||
return true
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 创建【区域-作战层-关卡节点-关卡】关系链,所有的关系必须在初始化所有实例后才能建立
|
||
-- tips:双向关系链仅有【区域 - 作战层】1条
|
||
-- 不构建【关卡节点 - 关卡】,【关卡 - 怪物】,【怪物 - 词缀】双向关系链,因为策划说他们子节点可重复配置,是单向关系
|
||
function XRiftManager.CreateChapterLayerRelationshipChain()
|
||
-- 作战层(向上建立的关系都是双向关系)
|
||
for k, xFightLayer in pairs(FightLayerDicById) do
|
||
xFightLayer:InitRelationshipChainUp()
|
||
end
|
||
end
|
||
|
||
-- 【关卡库】【怪物库】【词缀库】是随机的,需要提供重置接口,且他们的关系都为单向向下关系
|
||
-- 重置【作战层 - 关卡节点】关系链,点击重置按钮或初始化关系链调用(都是服务端下发数据后)
|
||
function XRiftManager.ResetOrCreateStageGroupRelationshipChain(data)
|
||
if not data or not data.LayerId or data.LayerId <= 0 then
|
||
return
|
||
end
|
||
|
||
local xFightLayer = FightLayerDicById[data.LayerId]
|
||
xFightLayer:InitRelationshipChainDown(data.NodeDatas)
|
||
xFightLayer:AddRecordPluginDrop(data.PluginDropRecords)
|
||
end
|
||
|
||
-- 重置按钮点击后清除随机数据。【作战层 - 关卡节点】【关卡 - 怪物(库)】【怪物 - 词缀】
|
||
function XRiftManager.ClearStageGroupRelationshipChain()
|
||
for k, xFightLayer in pairs(FightLayerDicById) do
|
||
xFightLayer:ClearRelationShipChainDown()
|
||
end
|
||
|
||
for k, xMonster in pairs(MonsterDicById) do
|
||
xMonster:ClearAffixs()
|
||
end
|
||
end
|
||
|
||
-- 生成大秘境专用角色实例
|
||
function XRiftManager.GenerateRoleData()
|
||
local characters = XDataCenter.CharacterManager.GetOwnCharacterList()
|
||
-- 拥有角色
|
||
for _, character in pairs(characters) do
|
||
XRiftManager.AddNewRole(character)
|
||
end
|
||
-- 机器人
|
||
for _, config in pairs(XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftCharacterAndRobot)) do
|
||
if config.RobotId and config.RobotId > 0 then
|
||
XRiftManager.AddNewRole(XRobot.New(config.RobotId))
|
||
end
|
||
end
|
||
end
|
||
|
||
--玩家角色增加时
|
||
function XRiftManager.OnCharacterAdd(character)
|
||
if character == nil then return end
|
||
if RoleDicById[character.Id] then return end
|
||
-- 防止错误判断Roles,新增角色时先调用一遍初始化
|
||
if XTool.IsTableEmpty(AllRoles) then
|
||
XRiftManager.GenerateRoleData()
|
||
end
|
||
XRiftManager.AddNewRole(character)
|
||
end
|
||
|
||
function XRiftManager.AddNewRole(roleData)
|
||
-- 如果已经存在,直接不处理
|
||
if RoleDicById[roleData.Id] then return end
|
||
local role = XRiftRole.New(roleData)
|
||
table.insert(AllRoles, role)
|
||
RoleDicById[role:GetId()] = role
|
||
end
|
||
|
||
function XRiftManager.GetEntityRoleById(id)
|
||
if XTool.IsTableEmpty(AllRoles) then
|
||
XRiftManager.GenerateRoleData()
|
||
end
|
||
return RoleDicById[id]
|
||
end
|
||
|
||
function XRiftManager.GetEntityRoleListByCharacterId(id)
|
||
if XTool.IsTableEmpty(AllRoles) then
|
||
XRiftManager.GenerateRoleData()
|
||
end
|
||
local res = {}
|
||
for k, xRole in pairs(RoleDicById) do
|
||
if xRole:GetCharacterId() == id then
|
||
table.insert(res, xRole)
|
||
end
|
||
end
|
||
|
||
return res
|
||
end
|
||
|
||
function XRiftManager.GetEntityRoleListByCharaType(charaType)
|
||
if XTool.IsTableEmpty(AllRoles) then
|
||
XRiftManager.GenerateRoleData()
|
||
end
|
||
if not charaType then
|
||
return AllRoles
|
||
end
|
||
|
||
local result = {}
|
||
for _, xRole in ipairs(AllRoles) do
|
||
if xRole:GetCharacterType() == charaType then
|
||
table.insert(result, xRole)
|
||
end
|
||
end
|
||
return result
|
||
end
|
||
|
||
function XRiftManager.GenerateMonsterData()
|
||
local allConfigs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftMonster)
|
||
for k, config in pairs(allConfigs) do
|
||
local xMonster = XRiftMonster.New(config)
|
||
MonsterDicById[config.Id] = xMonster
|
||
end
|
||
end
|
||
|
||
function XRiftManager.GetEntitytMonsterById(id)
|
||
return MonsterDicById[id]
|
||
end
|
||
|
||
function XRiftManager.GetRandomCDLeftTime()
|
||
local nowTime = XTime.GetServerNowTimestamp()
|
||
return TargetCanResetTimestamp - nowTime
|
||
end
|
||
|
||
function XRiftManager.GetResetCountkey()
|
||
return "RiftResetCount"..XPlayer.Id
|
||
end
|
||
|
||
function XRiftManager.GetResetCDkey()
|
||
return "RiftResetCD"..XPlayer.Id
|
||
end
|
||
|
||
function XRiftManager.ClearResetCDAndCount()
|
||
XSaveTool.SaveData(XRiftManager.GetResetCountkey(), CurrentConfig.ResetNoCdTimes)
|
||
XSaveTool.SaveData(XRiftManager.GetResetCDkey(), CurrentConfig.ResetCdIncrease)
|
||
end
|
||
|
||
function XRiftManager.CheckRequestResetRandom()
|
||
local nowTime = XTime.GetServerNowTimestamp() -- 使用目标时间点做标记来替代计时器
|
||
local leftNoneCdResetCount = XSaveTool.GetData(XRiftManager.GetResetCountkey())
|
||
leftNoneCdResetCount = (not leftNoneCdResetCount) and CurrentConfig.ResetNoCdTimes or leftNoneCdResetCount -- 做1次判空处理
|
||
if leftNoneCdResetCount > 0 then
|
||
leftNoneCdResetCount = leftNoneCdResetCount - 1
|
||
XSaveTool.SaveData(XRiftManager.GetResetCountkey(), leftNoneCdResetCount)
|
||
if leftNoneCdResetCount == 0 then -- 如果保存的时候次数已经是0了,说明这是你最后1次机会了。先上CD,下把再按就直接检测CD
|
||
TargetCanResetTimestamp = nowTime + CurrentConfig.ResetCdIncrease
|
||
XSaveTool.SaveData(XRiftManager.GetResetCDkey(), CurrentConfig.ResetCdIncrease)
|
||
end
|
||
return true
|
||
else
|
||
local leftTime = TargetCanResetTimestamp - nowTime
|
||
if leftTime > 0 then
|
||
return false
|
||
end
|
||
|
||
local resetCD = XSaveTool.GetData(XRiftManager.GetResetCDkey())
|
||
resetCD = (not resetCD) and CurrentConfig.ResetCdIncrease or resetCD
|
||
if resetCD < CurrentConfig.ResetCdMax then -- CD时间单位是秒。
|
||
resetCD = resetCD + CurrentConfig.ResetCdIncrease
|
||
resetCD = resetCD > CurrentConfig.ResetCdMax and CurrentConfig.ResetCdMax or resetCD -- CD上限处理
|
||
XSaveTool.SaveData(XRiftManager.GetResetCDkey(), resetCD)
|
||
end
|
||
TargetCanResetTimestamp = nowTime + resetCD
|
||
return true
|
||
end
|
||
|
||
end
|
||
|
||
function XRiftManager.GetCurrPlayingChapter()
|
||
for k, xChapter in pairs(ChapterDicById) do
|
||
local curPlayingLayer = xChapter:GetCurPlayingFightLayer()
|
||
if curPlayingLayer then
|
||
return xChapter, curPlayingLayer
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 获取上一次进入的作战层
|
||
function XRiftManager.GetLastRecordFightLayer()
|
||
local key = "LastFightLayer"..XPlayer.Id .. "ActivityId".. CurrentConfig.Id
|
||
return XSaveTool.GetData(key)
|
||
end
|
||
|
||
-- 上一次进入的作战层
|
||
function XRiftManager.SaveLastFightLayer(XFightLayer)
|
||
local key = "LastFightLayer"..XPlayer.Id .. "ActivityId".. CurrentConfig.Id
|
||
local data =
|
||
{
|
||
ChapterId = XFightLayer:GetParent():GetId(),
|
||
FightLayerId = XFightLayer:GetId()
|
||
}
|
||
XSaveTool.SaveData(key, data)
|
||
end
|
||
|
||
function XRiftManager.GetActivityStartTime()
|
||
return StartTime
|
||
end
|
||
|
||
function XRiftManager.GetActivityEndTime()
|
||
return EndTime
|
||
end
|
||
|
||
function XRiftManager.RefreshWholeData(data)
|
||
XRiftManager.RefreshMaxLoad(data.PluginPeakLoad) -- 角色负载上限
|
||
XRiftManager.RefreshSweepTimes(data.SweepTimes)
|
||
end
|
||
|
||
function XRiftManager.RefreshMaxLoad(maxLoad)
|
||
MaxLoad = maxLoad
|
||
end
|
||
|
||
function XRiftManager.RefreshSweepTimes(sweepTimes)
|
||
SweepTimes = sweepTimes
|
||
end
|
||
|
||
function XRiftManager.GetMaxLoad()
|
||
return MaxLoad
|
||
end
|
||
|
||
function XRiftManager.GetSweepLeftTimes()
|
||
return CurrentConfig.DailySweepTimes - SweepTimes
|
||
end
|
||
|
||
-- 请求刷新作战层内数据(开始/重置)
|
||
function XRiftManager.RiftStartLayerRequest(layerId, cb)
|
||
XNetwork.Call("RiftStartLayerRequest", {LayerId = layerId}, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
XRiftManager.RefreshRandomDataByServer(res.LayerData)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 请求刷新作战层内数据(开始/重置)附带检测CD
|
||
function XRiftManager.RiftStartLayerRequestWithCD(layerId, cb)
|
||
if XRiftManager.CheckRequestResetRandom() then
|
||
XRiftManager.RiftStartLayerRequest(layerId, cb)
|
||
end
|
||
end
|
||
|
||
-- 请求下发幸运关信息
|
||
function XRiftManager.RiftStartLuckyNodeRequest(cb)
|
||
XNetwork.Call("RiftStartLuckyNodeRequest", nil, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
XRiftManager.RefreshChapterData({[1] = res.ChapterData})
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 请求中止该层作战
|
||
function XRiftManager.RiftStopLayerRequest(cb)
|
||
XNetwork.Call("RiftStopLayerRequest", nil, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
-- 弹出层结算
|
||
local currXFightLayer = LastFightXStage and LastFightXStage:GetParent():GetParent()
|
||
if currXFightLayer and currXFightLayer:CheckIsOwnFighting() then -- 放弃作战时,只有打过任意一关才能结算
|
||
XLuaUiManager.Open("UiRiftSettleWin", currXFightLayer:GetId(), nil, true)
|
||
end
|
||
|
||
-- 清空数据
|
||
XRiftManager.RefreshRandomDataByServer(res.LayerData)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 请求扫荡
|
||
function XRiftManager.RiftSweepLayerRequest(layerId, cb)
|
||
XNetwork.Call("RiftSweepLayerRequest", {LayerId = layerId}, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
-- 区域信息
|
||
XRiftManager.RefreshChapterData({[1] = res.ChapterData})
|
||
-- 解锁插件
|
||
XRiftManager.UnlockedPluginByDrop(res.PluginDropRecords)
|
||
-- 记录当前层累计的插件掉落
|
||
local xFightLayer = FightLayerDicById[layerId]
|
||
xFightLayer:AddRecordPluginDrop(res.PluginDropRecords)
|
||
SweepTimes = SweepTimes + 1
|
||
-- 扫荡也算作作战层
|
||
local layer = XRiftManager.GetEntityFightLayerById(layerId)
|
||
local tempSg = layer and layer:GetAllStageGroups()[1]
|
||
LastFightXStage = tempSg and tempSg:GetAllEntityStages()[1] or LastFightXStage
|
||
-- 弹层结算
|
||
XLuaUiManager.Open("UiRiftSettleWin", layerId, nil, true, true)
|
||
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 请求装备/卸载角色插件
|
||
function XRiftManager.RiftSetCharacterPluginsRequest(xRole, pluginIdList, cb)
|
||
local data =
|
||
{
|
||
CharacterId = not xRole:GetIsRobot() and xRole:GetId() or nil,
|
||
RobotId = xRole:GetIsRobot() and xRole:GetId() or nil,
|
||
PluginIds = pluginIdList,
|
||
}
|
||
XNetwork.Call("RiftSetCharacterPluginsRequest", data, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
-- 装备成功 刷新角色插件
|
||
xRole:SyncPlugInIds(pluginIdList)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 请求更改队伍对应模板
|
||
function XRiftManager.RiftSetTeamRequest(xTeam, newChangeTempId, cb)
|
||
if newChangeTempId == xTeam:GetAttrTemplateId() then
|
||
return
|
||
end
|
||
|
||
for i = 1, CurrentConfig.AttrLevelSetCount do
|
||
local tempTeam = XRiftManager.GetMultiTeamData()[i]
|
||
TeamDatas[i] = {Id = i, AttrSetId = tempTeam and tempTeam:GetShowAttrTemplateId()}
|
||
end
|
||
local teamId = xTeam:GetId()
|
||
local currAttrTeamData = TeamDatas[teamId]
|
||
currAttrTeamData.AttrSetId = newChangeTempId
|
||
|
||
XNetwork.Call("RiftSetTeamRequest", {TeamDatas = TeamDatas}, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
xTeam:SetAttrTemplateId(newChangeTempId)
|
||
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XRiftManager.OpenFightLoading(stageId)
|
||
if CurrSelectRiftStageGroup:GetType() == XRiftConfig.StageGroupType.Multi then
|
||
XLuaUiManager.Open("UiRiftLoading")
|
||
else
|
||
XDataCenter.FubenManager.OpenFightLoading(stageId)
|
||
end
|
||
end
|
||
|
||
function XRiftManager.CloseFightLoading(stageId)
|
||
if XLuaUiManager.IsUiLoad("UiRiftLoading") then
|
||
XLuaUiManager.Remove("UiRiftLoading")
|
||
else
|
||
XDataCenter.FubenManager.CloseFightLoading(stageId)
|
||
end
|
||
end
|
||
|
||
-- 战斗胜利 & 奖励界面
|
||
function XRiftManager.DoShowReward(winData)
|
||
local currFightStageGroup = LastFightXStage:GetParent()
|
||
local currFightLayer = currFightStageGroup:GetParent()
|
||
local xStageList = currFightStageGroup:GetAllEntityStages()
|
||
local nextStageGroup = nil -- 是否仍有可进行连续战斗的下一关卡节点(有下一个【关卡】或者有下一个【关卡节点】时,就可以连续战斗)
|
||
local nextStageIndex = nil -- 需要继续进行战斗的关卡在关卡节点中的序号
|
||
local curStageIndex = LastFightXStage:GetIndex() -- 当前战斗的stage在父节点stageList的顺序下标
|
||
if LastFightXStage.StageId == winData.SettleData.StageId then
|
||
if curStageIndex < #xStageList then
|
||
nextStageGroup = currFightStageGroup
|
||
nextStageIndex = curStageIndex + 1
|
||
elseif curStageIndex == #xStageList then
|
||
local currStageGroupIndex = currFightStageGroup.NodePositionIndex
|
||
local nxStageGroup = currFightLayer:GetAllStageGroups()[currStageGroupIndex + 1]
|
||
if nxStageGroup then -- 如果打到下一个关卡节点,从第一个关卡开始打
|
||
nextStageGroup = nxStageGroup
|
||
nextStageIndex = 1
|
||
end
|
||
end
|
||
end
|
||
|
||
local riftSettleResult = winData.SettleData.RiftSettleResult
|
||
-- 刷新当前Stage的信息
|
||
LastFightXStage:SetHasPassed(true) -- 通关了一定是pass,由于尽量减少服务器发放信息,这里就手动设置了
|
||
LastFightXStage:SetPassTime(riftSettleResult.PassTime)
|
||
-- 刷新战斗结算后的区域信息
|
||
local chapterData =
|
||
{
|
||
[1] = riftSettleResult.ChapterData
|
||
}
|
||
XDataCenter.RiftManager.RefreshChapterData(chapterData)
|
||
-- 刷新当前跃升信息
|
||
local xStageGroup = LastFightXStage:GetParent()
|
||
local fightLayer = xStageGroup:GetParent()
|
||
if xStageGroup:GetType() == XRiftConfig.StageGroupType.Zoom then
|
||
fightLayer:SetJumpCount(riftSettleResult.JumpLayerRecord.AddOrderMax)
|
||
end
|
||
-- 记录当前层累计的插件掉落
|
||
fightLayer:AddRecordPluginDrop(riftSettleResult.PluginDropRecords)
|
||
-- 解锁插件
|
||
XRiftManager.UnlockedPluginByDrop(riftSettleResult.PluginDropRecords)
|
||
-- 如果多队伍完成全部压制,返回时不再出现多队伍编辑界面
|
||
local isAllClear = true
|
||
for k, xStage in pairs(xStageList) do
|
||
if not xStage:CheckHasPassed() then
|
||
isAllClear = false
|
||
end
|
||
end
|
||
if isAllClear or currFightLayer:CheckNoneData() then
|
||
XLuaUiManager.Remove("UiRiftDeploy")
|
||
end
|
||
-- 打开结算界面
|
||
XLuaUiManager.Open("UiRiftSettlePlugin", winData.SettleData, nextStageGroup, nextStageIndex)
|
||
end
|
||
|
||
function XRiftManager.ShowReward()
|
||
-- nothing
|
||
-- 不走通用结算,改为在关卡内结算
|
||
end
|
||
|
||
function XRiftManager.EnterFight(xTeam)
|
||
if not xTeam then -- 如果没传xteam,则根据上一次点击的stageGroup,判断当前层类型,选择对应的队伍自动进入该stageGroup的第一个stage
|
||
if CurrSelectRiftStageGroup:GetType() == XRiftConfig.StageGroupType.Multi then
|
||
xTeam = XRiftManager.GetMultiTeamData()[1]
|
||
else
|
||
xTeam = XRiftManager.GetSingleTeamData()
|
||
end
|
||
end
|
||
|
||
local index = math.abs(xTeam:GetId()) --由于单关卡的队伍id是-1,但是它仅有1个关卡,所以如果是-1也传1
|
||
LastFightXStage = CurrSelectRiftStageGroup:GetAllEntityStages()[index]
|
||
-- 进入战斗层,记录进入打个卡(为了避免通过下一层战斗直接进入战斗而没打开切层列表,这里也记录一遍)
|
||
local currLayer = CurrSelectRiftStageGroup:GetParent()
|
||
XDataCenter.RiftManager.SaveLastFightLayer(currLayer)
|
||
currLayer:SaveFirstEnter()
|
||
XDataCenter.FubenManager.EnterRiftFight(xTeam, CurrSelectRiftStageGroup, index)
|
||
end
|
||
|
||
--战斗是否自动退出
|
||
function XRiftManager.CheckAutoExitFight(stageId)
|
||
return false
|
||
end
|
||
-------------------------------------------------- 5加点 begin --------------------------------------------------
|
||
|
||
function XRiftManager.GenerateAttrTemplate()
|
||
-- 生成属性模板实例
|
||
for id = 1, XRiftConfig.AttrTemplateCnt do
|
||
AttrTemplateDicById[id] = XRiftAttributeTemplate.New(id)
|
||
end
|
||
end
|
||
|
||
function XRiftManager.RefreshAttrTemplate(riftData)
|
||
TotalAttrLevel = riftData.TotalAttrLevel
|
||
XRiftManager.RefreshAttrLevelMax(riftData.AttrLevelMax)
|
||
|
||
for _, attrSet in ipairs(riftData.AttrSets) do
|
||
local xAttrTemplate = XRiftAttributeTemplate.New(attrSet.Id, attrSet.AttrLevels)
|
||
AttrTemplateDicById[attrSet.Id] = xAttrTemplate
|
||
end
|
||
end
|
||
|
||
function XRiftManager.RefreshAttrLevelMax(attrLevelMax)
|
||
AttrLevelMax = attrLevelMax
|
||
end
|
||
|
||
function XRiftManager.GetAttrLevelMax()
|
||
return AttrLevelMax
|
||
end
|
||
|
||
function XRiftManager.GetTotalAttrLevel()
|
||
return TotalAttrLevel
|
||
end
|
||
|
||
-- 获取队伍加点模板
|
||
function XRiftManager.GetAttrTemplate(id)
|
||
if id == nil then id = XRiftConfig.DefaultAttrTemplateId end -- 不传参是使用默认加点
|
||
return AttrTemplateDicById[id]
|
||
end
|
||
|
||
-- 获取默认模板属性加点的属性等级
|
||
function XRiftManager.GetDefaultTemplateAttrLevel(attrId)
|
||
local attrTemplate = XRiftManager.GetAttrTemplate()
|
||
return attrTemplate:GetAttrLevel(attrId)
|
||
end
|
||
|
||
function XRiftManager.GetAttributeCost(attrLevel)
|
||
if attrLevel <= TotalAttrLevel then
|
||
return 0
|
||
end
|
||
|
||
local attrCostCfgs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftTeamAttributeCost)
|
||
local cost = 0
|
||
for i = TotalAttrLevel + 1, attrLevel do
|
||
if attrCostCfgs[i] then
|
||
cost = cost + attrCostCfgs[i].Cost
|
||
end
|
||
end
|
||
return cost
|
||
end
|
||
|
||
-- 获取可预览加点的总等级:当前已购买等级 + 可购买等级
|
||
function XRiftManager.GetCanPreviewAttrAllLevel()
|
||
local attrCostCfgs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftTeamAttributeCost)
|
||
local ownCnt = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.RiftGold)
|
||
local attrIndex = TotalAttrLevel
|
||
local const = 0
|
||
while(true)
|
||
do
|
||
local nextIndex = attrIndex + 1
|
||
if attrCostCfgs[nextIndex] and (ownCnt >= const + attrCostCfgs[nextIndex].Cost) then
|
||
const = const + attrCostCfgs[nextIndex].Cost
|
||
attrIndex = nextIndex
|
||
else
|
||
break
|
||
end
|
||
end
|
||
|
||
return attrIndex
|
||
end
|
||
|
||
-- 请求保存属性模板
|
||
function XRiftManager.RequestSetAttrSet(attrTemplate, cb)
|
||
local allLevel = attrTemplate:GetAllLevel()
|
||
local attrList = XTool.Clone(attrTemplate.AttrList)
|
||
local isClear = attrTemplate.Id ~= XRiftConfig.DefaultAttrTemplateId and allLevel == 0 -- 默认模板不能设置为nil
|
||
local request = { AttrSet = { Id = attrTemplate.Id, AttrLevels = nil } }
|
||
if not isClear then
|
||
request.AttrSet.AttrLevels = attrList
|
||
end
|
||
|
||
XNetwork.Call("RiftSetAttrSetRequest", request, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
-- 更新本地模板
|
||
local attrTemp = AttrTemplateDicById[attrTemplate.Id]
|
||
if attrTemp then
|
||
for _, attr in ipairs(attrList) do
|
||
attrTemp:SetAttrLevel(attr.Id, attr.Level)
|
||
end
|
||
else
|
||
AttrTemplateDicById[attrTemplate.Id] = XRiftAttributeTemplate.New(attrTemplate.Id, attrList)
|
||
end
|
||
|
||
-- 更新已购买点数
|
||
if allLevel > TotalAttrLevel then
|
||
TotalAttrLevel = allLevel
|
||
end
|
||
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XRiftManager.GetBuyAttrRedSaveKey()
|
||
return XPlayer.Id .. "_XRiftManager_BuyAttrRed_Key"
|
||
end
|
||
|
||
-- 是否显示购买属性红点
|
||
function XRiftManager.IsBuyAttrRed()
|
||
local ownCnt = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.RiftGold)
|
||
local recordCnt = XSaveTool.GetData(XRiftManager.GetBuyAttrRedSaveKey())
|
||
if recordCnt == nil or ownCnt > recordCnt then
|
||
local attrCostCfgs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftTeamAttributeCost)
|
||
local nextAttrLevel = TotalAttrLevel + 1
|
||
local canBuy = attrCostCfgs[nextAttrLevel] and (ownCnt >= attrCostCfgs[nextAttrLevel].Cost)
|
||
return canBuy
|
||
elseif ownCnt < recordCnt then
|
||
XRiftManager.CloseBuyAttrRed()
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
-- 关闭购买属性红点
|
||
function XRiftManager.CloseBuyAttrRed()
|
||
local ownCnt = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.RiftGold)
|
||
XSaveTool.SaveData(XRiftManager.GetBuyAttrRedSaveKey(), ownCnt)
|
||
end
|
||
|
||
-------------------------------------------------- 5加点 end --------------------------------------------------
|
||
|
||
-------------------------------------------------- 6插件背包 begin --------------------------------------------------
|
||
|
||
function XRiftManager.GeneratePluginData()
|
||
local pluginCfgs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftPlugin)
|
||
for _, config in ipairs(pluginCfgs) do
|
||
local xPlugin = XRiftPlugin.New(config)
|
||
AllPluginDicById[config.Id] = xPlugin
|
||
end
|
||
end
|
||
|
||
-- 活动协议/作弊指令 解锁插件
|
||
function XRiftManager.UnlockedPlugin(unlockedPluginIds)
|
||
if unlockedPluginIds == nil then return end
|
||
|
||
for _, pluginId in ipairs(unlockedPluginIds) do
|
||
XRiftManager.SetPluginHave(pluginId)
|
||
end
|
||
end
|
||
|
||
-- 战斗结算掉落插件 解锁
|
||
function XRiftManager.UnlockedPluginByDrop(pluginDropRecords)
|
||
for _, dropPlugin in ipairs(pluginDropRecords) do
|
||
local xPluginDrop = AllPluginDicById[dropPlugin.PluginId]
|
||
-- 1 先检测生成蓝点
|
||
local charId = xPluginDrop.Config.CharacterId
|
||
if dropPlugin.DecomposeCount <= 0 and XTool.IsNumberValid(charId) then -- 通用插件不会显示蓝点,已获得的插件也不会显示蓝点
|
||
local setRed = true
|
||
for k, xPluginInBag in pairs(AllPluginDicById) do
|
||
if xPluginInBag:GetHave() and xPluginInBag.Config.Type == xPluginDrop.Config.Type and xPluginInBag:GetStar() >= xPluginDrop:GetStar() then
|
||
setRed = false -- 如果掉落的插件 背包已经存在更高星数的同类型插件了 也不显示蓝点
|
||
break
|
||
end
|
||
end
|
||
if setRed then
|
||
xPluginDrop:SetCharacterUpgradeRedpoint(true)
|
||
end
|
||
end
|
||
-- 2 再设置掉落获取
|
||
xPluginDrop:SetHave()
|
||
end
|
||
end
|
||
|
||
function XRiftManager.GetOwnPluginList(starSelectList)
|
||
local pluginList = {}
|
||
for _, plugin in pairs(AllPluginDicById) do
|
||
local star = plugin:GetStar()
|
||
if starSelectList[star] and plugin:GetHave() and not plugin:GetIsDisplay() then
|
||
table.insert(pluginList, plugin)
|
||
end
|
||
end
|
||
|
||
table.sort(pluginList, function(a, b)
|
||
if a:GetStar() == b:GetStar() then
|
||
return a:GetId() > b:GetId()
|
||
else
|
||
return a:GetStar() > b:GetStar()
|
||
end
|
||
end)
|
||
|
||
return pluginList
|
||
end
|
||
|
||
function XRiftManager.GetAllPluginList(starSelectList)
|
||
local pluginList = {}
|
||
for _, plugin in pairs(AllPluginDicById) do
|
||
local star = plugin:GetStar()
|
||
if starSelectList[star] and not plugin:GetIsDisplay() then
|
||
table.insert(pluginList, plugin)
|
||
end
|
||
end
|
||
|
||
table.sort(pluginList, function(a, b)
|
||
local isHaveA = a:GetHave()
|
||
local isHaveB = b:GetHave()
|
||
|
||
if isHaveA == isHaveB then
|
||
if a:GetStar() == b:GetStar() then
|
||
return a:GetId() > b:GetId()
|
||
else
|
||
return a:GetStar() > b:GetStar()
|
||
end
|
||
else
|
||
return isHaveA
|
||
end
|
||
end)
|
||
|
||
return pluginList
|
||
end
|
||
|
||
function XRiftManager.GetPluginHaveAndAllCnt()
|
||
local haveCnt = 0
|
||
local allCnt = 0
|
||
for _, plugin in pairs(AllPluginDicById) do
|
||
if not plugin:GetIsDisplay() then
|
||
if plugin:GetHave() then
|
||
haveCnt = haveCnt + 1
|
||
end
|
||
allCnt = allCnt + 1
|
||
end
|
||
end
|
||
return haveCnt, allCnt
|
||
end
|
||
|
||
function XRiftManager.GetPlugin(pluginId)
|
||
return AllPluginDicById[pluginId]
|
||
end
|
||
function XRiftManager.GetAllPlugin()
|
||
return AllPluginDicById
|
||
end
|
||
|
||
function XRiftManager.SetPluginHave(pluginId)
|
||
AllPluginDicById[pluginId]:SetHave()
|
||
end
|
||
|
||
function XRiftManager.GetPluginSaveKey(pluginId)
|
||
return XPlayer.Id .. "_XRiftManager_PluginRed_" .. pluginId
|
||
end
|
||
|
||
function XRiftManager.IsPluginRed(pluginId)
|
||
local plugin = XRiftManager.GetPlugin(pluginId)
|
||
if not plugin:GetHave() then
|
||
return false
|
||
end
|
||
|
||
local saveKey = XRiftManager.GetPluginSaveKey(pluginId)
|
||
local isRed = XSaveTool.GetData(saveKey) == nil
|
||
return isRed
|
||
end
|
||
|
||
function XRiftManager.ClosePluginRed(pluginId)
|
||
local plugin = XRiftManager.GetPlugin(pluginId)
|
||
if not plugin:GetHave() then
|
||
return
|
||
end
|
||
|
||
local saveKey = XRiftManager.GetPluginSaveKey(pluginId)
|
||
XSaveTool.SaveData(saveKey, true)
|
||
end
|
||
|
||
function XRiftManager.IsPluginBagRed()
|
||
for _, plugin in pairs(AllPluginDicById) do
|
||
if XRiftManager.IsPluginRed(plugin:GetId()) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XRiftManager.ClosePluginBagRed()
|
||
for _, plugin in pairs(AllPluginDicById) do
|
||
if plugin:GetHave() then
|
||
XRiftManager.ClosePluginRed(plugin:GetId())
|
||
end
|
||
end
|
||
end
|
||
|
||
-------------------------------------------------- 6插件背包 end --------------------------------------------------
|
||
|
||
-------------------------------------------------- 7任务 begin --------------------------------------------------
|
||
|
||
function XRiftManager.GetTaskGroupIdList()
|
||
local config = XRiftConfig.GetCfgByIdKey(XRiftConfig.TableKey.RiftActivity, ActivityId)
|
||
return config.TaskGroupId
|
||
end
|
||
|
||
-- 检查所有任务是否有奖励可领取
|
||
function XRiftManager.CheckTaskCanReward()
|
||
local groupIdList = XRiftManager.GetTaskGroupIdList()
|
||
for _, groupId in pairs(groupIdList) do
|
||
if XDataCenter.TaskManager.CheckLimitTaskList(groupId) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 获取任务按钮显示的任务
|
||
function XRiftManager.GetBtnShowTask()
|
||
local finish = XDataCenter.TaskManager.TaskState.Finish
|
||
local groupIdList = XRiftManager.GetTaskGroupIdList()
|
||
for index, groupId in ipairs(groupIdList) do
|
||
local taskList = XDataCenter.TaskManager.GetTimeLimitTaskListByGroupId(groupId)
|
||
for _, taskData in pairs(taskList) do
|
||
if taskData.State ~= finish then
|
||
local taskCfgs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftTask)
|
||
local config = XDataCenter.TaskManager.GetTaskTemplate(taskData.Id)
|
||
return taskCfgs[index].Name, config.Desc
|
||
end
|
||
end
|
||
end
|
||
|
||
return XUiHelper.GetText("PokerGuessingTask"), XUiHelper.GetText("DlcHuntTaskFinish")
|
||
end
|
||
|
||
-------------------------------------------------- 7任务 end --------------------------------------------------
|
||
|
||
-------------------------------------------------- 8商店 begin --------------------------------------------------
|
||
|
||
function XRiftManager.GetActivityShopIds()
|
||
return XRiftConfig.GetActivityShopIds(ActivityId)
|
||
end
|
||
|
||
function XRiftManager.OpenUiShop()
|
||
if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.ShopCommon)
|
||
or XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.ShopActive) then
|
||
|
||
local shopIds = XRiftManager.GetActivityShopIds()
|
||
XShopManager.GetShopInfoList(shopIds, function()
|
||
XLuaUiManager.Open("UiRiftShop")
|
||
XRiftManager.CloseShopRed()
|
||
end, XShopManager.ActivityShopType.RiftShop)
|
||
end
|
||
end
|
||
|
||
function XRiftManager.GetPluginShopGoodList()
|
||
if PluginShopGoodList == nil then
|
||
PluginShopGoodList = {}
|
||
local goodCfgs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftPluginShopGoods)
|
||
for _, goodCfg in ipairs(goodCfgs) do
|
||
if goodCfg.ActivityId == ActivityId then
|
||
table.insert(PluginShopGoodList, goodCfg)
|
||
end
|
||
end
|
||
end
|
||
return PluginShopGoodList
|
||
end
|
||
|
||
function XRiftManager.GetPluginShopTagList()
|
||
local tagDic = {}
|
||
local tagList = { ScreenAll }
|
||
|
||
local goodList = XRiftManager.GetPluginShopGoodList()
|
||
for _, good in pairs(goodList) do
|
||
local plugin = XRiftManager.GetPlugin(good.PluginId)
|
||
local tag = plugin:GetTag()
|
||
if tagDic[tag] == nil then
|
||
tagDic[tag] = true
|
||
table.insert(tagList, tag)
|
||
end
|
||
end
|
||
|
||
return tagList
|
||
end
|
||
|
||
local PluginShopSortFunc = function(goodA, goodB)
|
||
local pluginA = XRiftManager.GetPlugin(goodA.PluginId)
|
||
local isSellOutA = pluginA:GetHave()
|
||
local pluginB = XRiftManager.GetPlugin(goodB.PluginId)
|
||
local isSellOutB = pluginB:GetHave()
|
||
|
||
if isSellOutA == isSellOutB then
|
||
return goodA.Id < goodB.Id
|
||
else
|
||
return isSellOutB
|
||
end
|
||
end
|
||
|
||
function XRiftManager.FilterPluginShopGoodList(selectTag)
|
||
local goodList = {}
|
||
for _, good in pairs(PluginShopGoodList) do
|
||
local plugin = XRiftManager.GetPlugin(good.PluginId)
|
||
local tag = plugin:GetTag()
|
||
if selectTag == ScreenAll or tag == selectTag then
|
||
table.insert(goodList, good)
|
||
end
|
||
end
|
||
|
||
table.sort(goodList, PluginShopSortFunc)
|
||
return goodList
|
||
end
|
||
|
||
function XRiftManager.RequestBuyPlugin(id, cb)
|
||
local request = { GoodsId = id }
|
||
XNetwork.Call("RiftBuyPluginRequest", request, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
XRiftManager.SetPluginHave(res.AddedPluginId)
|
||
cb()
|
||
end)
|
||
end
|
||
|
||
function XRiftManager.GetShopRedSaveKey()
|
||
return XPlayer.Id .. "_XRiftManager_ShopRed"
|
||
end
|
||
|
||
function XRiftManager.IsShopRed()
|
||
local ownCnt = XDataCenter.ItemManager.GetCount(XDataCenter.ItemManager.ItemId.RiftCoin)
|
||
if ownCnt > 0 then
|
||
local recordTime = XSaveTool.GetData(XRiftManager.GetShopRedSaveKey())
|
||
if recordTime then
|
||
local now = XTime.GetServerNowTimestamp()
|
||
return not XTime.IsToday(now, recordTime)
|
||
else
|
||
return true
|
||
end
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
function XRiftManager.CloseShopRed()
|
||
local now = XTime.GetServerNowTimestamp()
|
||
XSaveTool.SaveData(XRiftManager.GetShopRedSaveKey(), now)
|
||
end
|
||
|
||
-------------------------------------------------- 8商店 end --------------------------------------------------
|
||
|
||
|
||
-------------------------------------------------- 9排行榜 begin --------------------------------------------------
|
||
|
||
function XRiftManager.OpenUiPluginRanking()
|
||
local request = { ActivityId = ActivityId }
|
||
XNetwork.Call("RiftGetRankRequest", request, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
RankData = res
|
||
|
||
XLuaUiManager.Open("UiRiftRanking")
|
||
end)
|
||
end
|
||
|
||
function XRiftManager.GetRankingList()
|
||
return RankData.RankPlayerInfos
|
||
end
|
||
|
||
function XRiftManager.GetMyRankInfo()
|
||
local myRank = {}
|
||
local percentRank = 100 -- 101名及以上显示百分比
|
||
local rank = RankData.Rank
|
||
if RankData.Rank > percentRank then
|
||
rank = math.floor(RankData.Rank * 100 / RankData.TotalCount) .. "%"
|
||
elseif RankData.Rank == 0 then
|
||
rank = XUiHelper.GetText("ExpeditionNoRanking")
|
||
end
|
||
myRank["Rank"] = rank
|
||
myRank["Id"] = XPlayer.Id
|
||
myRank["Name"] = XPlayer.Name
|
||
myRank["HeadPortraitId"] = XPlayer.CurrHeadPortraitId
|
||
myRank["HeadFrameId"] = XPlayer.CurrHeadFrameId
|
||
myRank["Score"] = RankData.Score
|
||
myRank["CharacterIds"] = RankData.CharacterIds
|
||
return myRank
|
||
end
|
||
|
||
function XRiftManager.GetRankingSpecialIcon(rank)
|
||
if type(rank) ~= "number" or rank < 1 or rank > 3 then return end
|
||
local icon = CS.XGame.ClientConfig:GetString("BabelTowerRankIcon"..rank)
|
||
return icon
|
||
end
|
||
-------------------------------------------------- 9排行榜 end --------------------------------------------------
|
||
|
||
-------------------------------------------------- 特权解锁 begin --------------------------------------------------
|
||
|
||
function XRiftManager.IsFuncUnlock(unlockCfgId)
|
||
local funcUnlockCfg = XRiftConfig.GetCfgByIdKey(XRiftConfig.TableKey.RiftFuncUnlock, unlockCfgId)
|
||
local isOpen, desc = XConditionManager.CheckCondition(funcUnlockCfg.Condition)
|
||
local funcUnlockCfg = XRiftConfig.GetCfgByIdKey(XRiftConfig.TableKey.RiftFuncUnlock, unlockCfgId)
|
||
desc = funcUnlockCfg.Desc
|
||
return isOpen, desc
|
||
end
|
||
|
||
-- 获取下一个特权解锁的配置
|
||
function XRiftManager.GetNextFuncUnlockConfig()
|
||
local funcUnlockCfgs = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftFuncUnlock)
|
||
local unlockCfg = nil
|
||
for _, cfg in ipairs(funcUnlockCfgs) do
|
||
if not XConditionManager.CheckCondition(cfg.Condition) then
|
||
if unlockCfg then
|
||
if cfg.Order < unlockCfg.Order then
|
||
unlockCfg = cfg
|
||
end
|
||
else
|
||
unlockCfg = cfg
|
||
end
|
||
end
|
||
end
|
||
|
||
return unlockCfg
|
||
end
|
||
|
||
function XRiftManager.GetFuncUnlockRedSaveKey(unlockCfgId)
|
||
return XPlayer.Id .. "_XRiftManager_FuncUnlockRed_CfgId_" .. unlockCfgId
|
||
end
|
||
|
||
-- 判断功能解锁是否显示红点
|
||
function XRiftManager.IsFuncUnlockRed()
|
||
local config = XRiftManager.GetNextFuncUnlockConfig()
|
||
if config then
|
||
local key = XRiftManager.GetFuncUnlockRedSaveKey(config.Id)
|
||
local isRed = XSaveTool.GetData(key) == nil
|
||
return isRed
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 关闭功能解锁的红点
|
||
function XRiftManager.CloseFuncUnlockRed()
|
||
local config = XRiftManager.GetNextFuncUnlockConfig()
|
||
if config then
|
||
local key = XRiftManager.GetFuncUnlockRedSaveKey(config.Id)
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
end
|
||
|
||
-------------------------------------------------- 特权解锁 end --------------------------------------------------
|
||
|
||
-- 服务器刷新
|
||
function XRiftManager.RefreshActivityData(activityId)
|
||
CurrentConfig = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftActivity)[activityId]
|
||
StartTime = XFunctionManager.GetStartTimeByTimeId(CurrentConfig.TimeId)
|
||
EndTime = XFunctionManager.GetEndTimeByTimeId(CurrentConfig.TimeId)
|
||
XRiftManager.CreateChapterLayerRelationshipChain()
|
||
end
|
||
|
||
-- 服务器刷新随机重置数据(在登录和手动请求时都要调用)
|
||
function XRiftManager.RefreshRandomDataByServer(LayerData)
|
||
-- 服务器下发一个Layer数据 包含所有的关系链信息,自上而下建立关系
|
||
XRiftManager.ClearStageGroupRelationshipChain()
|
||
XRiftManager.ResetOrCreateStageGroupRelationshipChain(LayerData)
|
||
end
|
||
|
||
-- 区域信息
|
||
function XRiftManager.RefreshChapterData(ChapterDatas)
|
||
if XTool.IsTableEmpty(ChapterDatas) then
|
||
return
|
||
end
|
||
|
||
for k, cpData in pairs(ChapterDatas) do
|
||
local XChapter = XRiftManager.GetEntityChapterById(cpData.ChapterId)
|
||
XChapter:SyncData(cpData)
|
||
end
|
||
-- 【已解锁】和【通关】的作战层
|
||
local maxUnlockOrder = 0
|
||
local maxPassOrder = 0
|
||
for k, XChapter in pairs(ChapterDicById) do
|
||
maxUnlockOrder = XChapter:GetMaxUnlockLayer() > maxUnlockOrder and XChapter:GetMaxUnlockLayer() or maxUnlockOrder
|
||
maxPassOrder = XChapter:GetMaxPassLayer() > maxPassOrder and XChapter:GetMaxPassLayer() or maxPassOrder
|
||
end
|
||
-- 对unlock【已解锁】做特殊处理,因为当A区域完成所有作战层后下发同步的数据,服务器是不会下发下一区域的unlock的信息的,因此必须检查前置区域是否全部通关来设置下一关区域的第一个作战层解锁
|
||
for i = #ChapterDicById, 1, -1 do
|
||
local xChapter = XRiftManager.GetEntityChapterById(i) -- 降序检查
|
||
local layerList = xChapter:GetAllFightLayersOrderList()
|
||
local currChapterLastLayerId = layerList[#layerList]:GetId()
|
||
-- 进入这个判断说明, 当前区域已全部通关, 且该区域是全部通关区域的最高区域。如果还有下一区域,需要设置下一区域的第一个作战层为已解锁状态
|
||
if i < #ChapterDicById and maxPassOrder == currChapterLastLayerId then
|
||
local nextChapter = XRiftManager.GetEntityChapterById(i+1)
|
||
if nextChapter then
|
||
local nextLayerList = nextChapter:GetAllFightLayersOrderList()
|
||
maxUnlockOrder = nextLayerList[1]:GetId()
|
||
end
|
||
break
|
||
end
|
||
end
|
||
|
||
for k, xFightLayer in pairs(FightLayerDicById) do
|
||
if xFightLayer:GetConfig().Order <= maxUnlockOrder then
|
||
xFightLayer:SetHasLock(false)
|
||
end
|
||
|
||
if xFightLayer:GetConfig().Order <= maxPassOrder then
|
||
xFightLayer:SetHasPassed(true)
|
||
end
|
||
end
|
||
if MaxUnLockFightLayerOrder and maxUnlockOrder - MaxUnLockFightLayerOrder > 1 then
|
||
IsJumpOpenTrigger = maxUnlockOrder - MaxUnLockFightLayerOrder
|
||
end
|
||
if MaxPassFightLayerOrder and maxPassOrder - MaxPassFightLayerOrder > 1 then
|
||
IsJumpResTrigger = maxPassOrder - MaxPassFightLayerOrder
|
||
end
|
||
|
||
MaxUnLockFightLayerOrder = maxUnlockOrder
|
||
MaxPassFightLayerOrder = maxPassOrder
|
||
end
|
||
|
||
function XRiftManager.RefreshZoomJumpData(jumpLayerRecords)
|
||
for k, data in pairs(jumpLayerRecords) do
|
||
local xFightLayer = FightLayerDicById[data.LayerId]
|
||
xFightLayer:SetJumpCount(data.AddOrderMax)
|
||
end
|
||
end
|
||
|
||
-- 服务器刷新关卡/战斗数据
|
||
function XRiftManager.RefreshBattleDataByServer(data)
|
||
-- 关系链信息
|
||
XRiftManager.RefreshRandomDataByServer(data.CurLayerData)
|
||
-- 区域信息
|
||
XRiftManager.RefreshChapterData(data.ChapterDatas)
|
||
-- 跃升记录数据
|
||
XRiftManager.RefreshZoomJumpData(data.JumpLayerRecords)
|
||
end
|
||
|
||
-- 服务器刷新角色信息
|
||
function XRiftManager.RefreshCharacterData(data)
|
||
XRiftManager.RefreshCharacterPluginData(data)
|
||
XRiftManager.RefreshTeamTemplateData(data)
|
||
end
|
||
|
||
function XRiftManager.RefreshCharacterPluginData(data)
|
||
for k, data in pairs(data.CharacterDatas) do
|
||
local roleId = XTool.IsNumberValid(data.CharacterId) and data.CharacterId or data.RobotId
|
||
local xRole = XRiftManager.GetEntityRoleById(roleId)
|
||
xRole:SyncPlugInIds(data.PluginIds)
|
||
end
|
||
end
|
||
|
||
function XRiftManager.RefreshTeamTemplateData(data)
|
||
-- 队伍对应的模板
|
||
for k, data in pairs(data.TeamDatas) do
|
||
local xTeam = XRiftManager.GetMultiTeamData()[data.Id]
|
||
if xTeam then
|
||
xTeam:SetAttrTemplateId(data.AttrSetId)
|
||
end
|
||
end
|
||
TeamDatas = data.TeamDatas
|
||
end
|
||
|
||
-- 服务器刷新
|
||
function XRiftManager.RefreshDataByServer(data)
|
||
ActivityId = data.ActivityId
|
||
-- 活动配置数据
|
||
XRiftManager.RefreshActivityData(data.ActivityId)
|
||
-- 关卡/战斗数据
|
||
XRiftManager.RefreshBattleDataByServer(data)
|
||
-- 角色相关数据
|
||
XRiftManager.RefreshCharacterData(data)
|
||
-- 全局数据
|
||
XRiftManager.RefreshWholeData(data)
|
||
-- 加点模板
|
||
XRiftManager.RefreshAttrTemplate(data)
|
||
-- 解锁插件
|
||
XRiftManager.UnlockedPlugin(data.UnlockedPluginIds)
|
||
end
|
||
------------------副本入口扩展
|
||
--region
|
||
--endregion
|
||
------------------副本入口扩展结束
|
||
|
||
XRiftManager.Init()
|
||
return XRiftManager
|
||
end
|
||
|
||
-- =========网络=========
|
||
XRpc.NotifyRiftData = function(data)
|
||
XDataCenter.RiftManager.RefreshDataByServer(data.Data)
|
||
end
|
||
|
||
XRpc.NotifyRiftNewPlugin = function(data)
|
||
XDataCenter.RiftManager.UnlockedPlugin(data.PluginIds)
|
||
end
|
||
|
||
XRpc.NotifyRiftPluginPeakLoadChanged = function(data)
|
||
XDataCenter.RiftManager.RefreshMaxLoad(data.PluginPeakLoad)
|
||
end
|
||
|
||
XRpc.NotifyRiftAttrLevelMaxChanged = function(data)
|
||
XDataCenter.RiftManager.RefreshAttrLevelMax(data.AttrLevelMax)
|
||
end
|
||
|
||
XRpc.NotifyRiftDailyReset = function(data)
|
||
XDataCenter.RiftManager.RefreshSweepTimes(data.SweepTimes)
|
||
end |