PGRData/Script/matrix/xmanager/xguildwar/XGuildWarManager.lua

1354 lines
52 KiB
Lua
Raw Normal View History

--===========================
--公会战活动管理器
--模块负责:吕天元 陈思亮 张爽
--===========================
XGuildWarManagerCreator = function()
--===================================
--DEBUG相关
--===================================
local DEBUG = true
local _printDebug = function(...)
if not DEBUG then return end
XLog.Debug(...)
end
-------------------------------------
-------------------------------------
local XGuildWarManager = {}
local Config = XGuildWarConfig
local InitialManagers = false
local LeaderManager
local BattleManagers = {}
-------------------------------------
--活动参数
-------------------------------------
local ActivityId = 0
local CurrentRoundId = 1
local ActivityName = ""
local ActivityTimeId = 0
local RoundTimeId = 0
local ActionPoint = 0
local RoundDatas = {}
local PopupRecord
local NeedPopup
local SpecialRoleList
--主要特攻角色
local MainSpecialRoleId
--难度通关记录
local DifficultyPassRecord
--公会战总任务信息列表
local GuildWarTaskList
--公会战真任务TaskId -》 TaskData检索字典
local GuildWarTaskByTaskIdDic
--任务缓存,只有临时任务数据
local CompleteTaskId
--表示所有轮次结束的标记(用于标记最后一轮战斗结束到活动关闭期间)
local AllRoundFinishFlag
--新一轮开始标记(用于弹出界面)
local NewRoundFlag = false
--===============
--公会战 协议名
--===============
local METHOD_NAME = {
GetActivityData = "GuildWarGetActivityDataRequest", --主动请求活动信息
EditPlan = "GuildWarEditLineRequest", --
RequestRanking = "GuildWarOpenRankRequest", --
SelectDifficult = "GuildWarSelectDifficultyRequest", --选择难度
ConfirmFight = "GuildWarConfirmFightResultRequest", --确认关卡结果
StageSweep = "GuildWarSweepRequest", --
PopUp = "GuildWarPopupRequest", --弹窗请求
PopupActionID = "GuildWarPopupActionRequest", --行动播放进度保存请求
PlayerMove = "GuildWarMoveRequest", -- 玩家移动
}
local function InitActivityCfg(cfg)
ActivityId = cfg.Id
ActivityName = cfg.Name
ActivityTimeId = cfg.TimeId
end
local function CheckIsGuildMaster()
return XDataCenter.GuildManager.IsGuildLeader()
end
local InitListenerFlag
local function AddInitListener()
if InitListenerFlag then return end
XEventManager.AddEventListener(XEventId.EVENT_TASK_SYNC, XGuildWarManager.SyncTasks)
InitListenerFlag = true
end
local function RemoveInitListener()
if not InitListenerFlag then return end
XEventManager.RemoveEventListener(XEventId.EVENT_TASK_SYNC, XGuildWarManager.SyncTasks)
InitListenerFlag = false
end
--===============
--初始化
--===============
function XGuildWarManager.Init()
if XGuildWarConfig.CLOSE_DEBUG then return end
local cfg = Config.GetCurrentActivity()
if cfg then
InitActivityCfg(cfg)
end
CurrentRoundId = 1
RoundTimeId = 0
ActionPoint = 0
RoundDatas = {}
SpecialRoleList = nil
MainSpecialRoleId = nil
PopupRecord = nil
GuildWarTaskList = nil
GuildWarTaskByTaskIdDic = nil
NewRoundFlag = false
CompleteTaskId = {}
NeedPopup = {}
DifficultyPassRecord = {}
RemoveInitListener()
AddInitListener()
end
--===============
--创建战斗管理器
--===============
local function CreateRound(roundId)
local manager = require("XEntity/XGuildWar/Round/XGuildWarRound")
return manager.New(roundId)
end
--================
--处理登陆活动数据通知
--================
function XGuildWarManager.OnNotifyActivityData(data)
local cfg = Config.GetCfgByIdKey(
Config.TableKey.Activity,
data.ActivityNo
)
InitActivityCfg(cfg)
PopupRecord = data.PopupRecord and data.PopupRecord.SettleDatas or {}
local activityData = data.ActivityData
XGuildWarManager.RefreshActivityData(activityData)
XGuildWarManager.RefreshMyRoundData(data.MyRoundData)
XGuildWarManager.RefreshFightRecords(data.FightRecords)
XGuildWarManager.RefreshLastActionIdDic(data.ActionPlayed)
end
--================
--处理公会活动数据刷新
--================
function XGuildWarManager.RefreshActivityData(activityData)
if not activityData then
return
end
--先取出当前RoundId
local preRoundId = CurrentRoundId or 0
--是否是新的一轮
NewRoundFlag = false
CurrentRoundId = activityData.CurRoundId
AllRoundFinishFlag = false
--CurrentRoundId是0时表示活动还没开始或休战期
if not CurrentRoundId or (CurrentRoundId == 0) then
--RestRoundId为表示当前轮次(涵盖轮次期间和后面的休战期)的Id
--在第一轮开始之前活动结束后这个值为0
local subRoundId = activityData.RestRoundId
if subRoundId and subRoundId > 0 then
CurrentRoundId = subRoundId
else
for roundId = Config.ROUND_NUM, 1, -1 do
local roundCfg = Config.GetCfgByIdKey(
Config.TableKey.Round,
roundId
)
local timeId = roundCfg.TimeId
local endTime = XFunctionManager.GetEndTimeByTimeId(timeId)
local now = XTime.GetServerNowTimestamp()
if now >= endTime then
--从最后一轮开始算,活动时间内,当前时间大于轮次结束时间,表示是处于当轮休战期
CurrentRoundId = roundId
if roundId == Config.ROUND_NUM then
AllRoundFinishFlag = true
end
return
elseif roundId == 1 and now >= XGuildWarManager.GetActivityStartTime() then
--活动时间内CurrentRoundId为0且不是休战期或活动结束那么则是开始活动期间
--默认取第一轮数据
CurrentRoundId = 1
end
end
local lastRoundCfg = Config.GetCfgByIdKey(
Config.TableKey.Round,
Config.ROUND_NUM
)
local timeId = lastRoundCfg.TimeId
local endTime = XFunctionManager.GetEndTimeByTimeId(timeId)
local now = XTime.GetServerNowTimestamp()
if now >= endTime then
--活动时间内,当前时间大于最后一轮结束时间,表示是结束活动期间
--默认取最后一轮数据
CurrentRoundId = Config.ROUND_NUM
AllRoundFinishFlag = true
elseif now >= XGuildWarManager.GetActivityStartTime() then
--活动时间内CurrentRoundId为0且不是活动结束那么则是开始活动期间
--默认取第一轮数据
CurrentRoundId = 1
else
--不在活动期间,返回
return
end
end
end
--对比更新后的RoundId取得是否是新一轮
NewRoundFlag = (CurrentRoundId > preRoundId)
local roundConfig = Config.GetCfgByIdKey(
Config.TableKey.Round,
CurrentRoundId,
true
)
RoundTimeId = roundConfig and roundConfig.TimeId
if activityData then
for _, roundData in ipairs(activityData.RoundData) do
local round = XGuildWarManager.GetRoundByRoundId(roundData.RoundId)
if round then
round:RefreshRoundData(roundData)
end
end
local battleManager = XGuildWarManager.GetBattleManager()
if battleManager then --活动开启前battleManager会为空
battleManager:SetActionList(activityData.ActionList)
end
for _, settleData in pairs(activityData.SettleDatas or {}) do
if settleData.IsPass == 1 then
DifficultyPassRecord[settleData.DifficultyId] = true
end
local round = XGuildWarManager.GetRoundByRoundId(settleData.RoundId)
if round then
round:SetSettleData(settleData)
end
end
end
--先重置缓存的完成任务情况
CompleteTaskId = {}
for _, taskId in pairs(activityData.CompleteTaskId or {}) do
if not CompleteTaskId[taskId] then
CompleteTaskId[taskId] = true
end
end
XGuildWarManager.RefreshGuildWarTaskList()
--如果是新的一轮,发出通知
if NewRoundFlag then
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_NEW_ROUND)
end
end
--================
--获取新一轮开始标记
--该标记在获取后会设置回False
--================
function XGuildWarManager.GetNewRoundFlag()
local flag = NewRoundFlag
NewRoundFlag = false
return flag
end
--================
--处理玩家活动数据刷新
--================
function XGuildWarManager.RefreshMyRoundData(myRoundData)
if myRoundData then
for _, myData in ipairs(myRoundData) do
local round = XGuildWarManager.GetRoundByRoundId(myData.RoundId)
if round then
round:UpdateMyRoundData(myData)
end
:: goNext ::
end
end
end
--================
--处理战斗数据刷新
--================
function XGuildWarManager.RefreshFightRecords(fightRecords)
if fightRecords then
local round = XGuildWarManager.GetCurrentRound()
if round then
round:UpdateFightRecords(fightRecords)
end
end
end
--================
--处理最后的ActionId刷新
--================
function XGuildWarManager.RefreshLastActionIdDic(actionIdList)
if actionIdList then
local round = XGuildWarManager.GetCurrentRound()
if round then
round:UpdateLastActionIdDic(actionIdList)
end
end
end
--================
--用轮次Id获取轮次对象
--@param roundId:轮次Id
--若roundId为nil或为0会返回空
--================
function XGuildWarManager.GetRoundByRoundId(roundId)
if not roundId or (roundId == 0) then return nil end
if not RoundDatas[roundId] then
RoundDatas[roundId] = CreateRound(roundId)
end
return RoundDatas[roundId]
end
function XGuildWarManager.GetCurrentRound()
return XGuildWarManager.GetRoundByRoundId(CurrentRoundId)
end
function XGuildWarManager.GetPopupRecord()
if not PopupRecord then
return nil
end
local record = PopupRecord
PopupRecord = nil
return record
end
--===============
--初始化管理器
--===============
function XGuildWarManager.InitManagers()
if InitialManagers then return end
InitialManagers = true
end
-------------------------------------------------------
--
-------------------------------------------------------
--===============
--获取给定配置的活动Id(XGuildWarActivityManager的Id)
--若配置为空则返回0
--===============
function XGuildWarManager.GetActivityId()
return ActivityId or 0
end
--===============
--获取当前配置的活动名称(XGuildWarActivityManager的Name)
--若配置为空,则返回字符串"UnNamed"
--===============
function XGuildWarManager.GetName()
return ActivityName or "UnNamed"
end
--===============
--获取当前轮次
--若配置为空则返回1
--===============
function XGuildWarManager.GetCurrentRoundId()
return CurrentRoundId or 1
end
---------------------------------------
---------------------------------------
--会长相关
---------------------------------------
---------------------------------------
--================
--请求:选择难度
--@param nodeList: --路线节点ID列表
--@param cb: function 回调
--================
function XGuildWarManager.EditPlan(nodeList, cb)
if not CheckIsGuildMaster() then
XUiManager.TipMsg(XUiHelper.GetText("GuildWarNotGuildMaster"))
return
end
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.EditPlan, {AttackPlan = nodeList}, function(res)
local battleManager = XGuildWarManager.GetBattleManager()
battleManager:UpdateNodePathIndex(nodeList)
if cb then
cb()
end
end)
end
---------------------------------------
---------------------------------------
--活动,轮次时间相关
---------------------------------------
---------------------------------------
--===============
--获取给定配置的活动TimeId
--若配置为空则返回0
--===============
function XGuildWarManager.GetActvityTimeId()
return ActivityTimeId or 0
end
--===============
--获取当前轮次的TimeId
--若为空则返回0
--===============
function XGuildWarManager.GetRoundTimeId()
return RoundTimeId or 0
end
--===============
--检查当前活动是否在开放时间内
--===============
function XGuildWarManager.CheckActivityIsInTime()
if XGuildWarConfig.CLOSE_DEBUG then return false end
local now = XTime.GetServerNowTimestamp()
return (now >= XGuildWarManager.GetActivityStartTime())
and (now < XGuildWarManager.GetActivityEndTime())
end
--===============
--获取当前活动开始时间戳(根据TimeId)
--===============
function XGuildWarManager.GetActivityStartTime()
if XGuildWarConfig.CLOSE_DEBUG then return 0 end
return XFunctionManager.GetStartTimeByTimeId(ActivityTimeId)
end
--===============
--获取当前活动结束时间戳(根据TimeId)
--===============
function XGuildWarManager.GetActivityEndTime()
if XGuildWarConfig.CLOSE_DEBUG then return 0 end
return XFunctionManager.GetEndTimeByTimeId(ActivityTimeId)
end
--===============
--获取当前活动剩余时间(秒)
--===============
function XGuildWarManager.GetActivityLeftTime()
local now = XTime.GetServerNowTimestamp()
local endTime = XGuildWarManager.GetActivityEndTime()
local leftTime = endTime - now
return leftTime
end
--===============
--检查当前轮次是否在开放时间内
--===============
function XGuildWarManager.CheckRoundIsInTime()
if XGuildWarConfig.CLOSE_DEBUG then return false end
local now = XTime.GetServerNowTimestamp()
return (now >= XGuildWarManager.GetRoundStartTime())
and (now < XGuildWarManager.GetRoundEndTime())
end
--===============
--获取当前轮次开始时间戳(根据TimeId)
--===============
function XGuildWarManager.GetRoundStartTime()
return XFunctionManager.GetStartTimeByTimeId(RoundTimeId)
end
--===============
--获取当前轮次结束时间戳(根据TimeId)
--===============
function XGuildWarManager.GetRoundEndTime()
return XFunctionManager.GetEndTimeByTimeId(RoundTimeId)
end
--===============
--获取当前轮次剩余时间(秒)
--===============
function XGuildWarManager.GetRoundLeftTime()
local now = XTime.GetServerNowTimestamp()
local endTime = XGuildWarManager.GetRoundEndTime()
local leftTime = endTime - now
return leftTime
end
--=========================
--获取服务器下一次关卡刷新时间的时间戳
--=========================
function XGuildWarManager.GetNextMapRefreshTime()
local oclock = Config.GetClientConfigValues("DayRefreshTime", "Float")[1]
return XTime.GetServerNextTargetTime(oclock)
end
--=========================
--获取固定时长刷新的时间间隔
--=========================
function XGuildWarManager.GetHourRefreshTime()
local time = Config.GetClientConfigValues("HourRefreshTime", "Float")[1]
return time
end
--=========================
--获取最大目标节点数
--=========================
function XGuildWarManager.GetPathMarkMaxCount()
local time = Config.GetClientConfigValues("PathMarkMaxCount", "Float")[1]
return time
end
--================
--检查是否能进入玩法
--@return1 :是否在活动时间内(true为在活动时间内)
--@return2 :是否未开始活动(true为未开始活动)
--================
function XGuildWarManager.CheckActivityCanGoTo()
if XGuildWarConfig.CLOSE_DEBUG then return false end
local isActivityEnd, notStart = XGuildWarManager.CheckActivityIsEnd()
return not isActivityEnd, notStart
end
--================
--检查玩法是否关闭(用于判断玩法入口,进入活动条件等)
--@return1 :玩法是否关闭
--@return2 :是否活动未开启
--================
function XGuildWarManager.CheckActivityIsEnd()
local timeNow = XTime.GetServerNowTimestamp()
local startTime = XGuildWarManager.GetActivityStartTime()
local endTime = XGuildWarManager.GetActivityEndTime()
local isEnd = timeNow >= endTime
local isStart = timeNow >= startTime
local inActivity = (not isEnd) and (isStart)
return not inActivity, timeNow < startTime
end
--=============
--检查本轮公会是否已经选择难度
--=============
function XGuildWarManager.CheckHaveDifficultySelected()
local battleManager = XGuildWarManager.GetBattleManager()
local mydata = battleManager:GetCurrentMyRoundData()
if not mydata or (not next(mydata)) then return false end
return mydata.DifficultyId > 0
end
--=============
--检查是否公会跳过轮
--=============
function XGuildWarManager.CheckIsGuildSkipRound(roundId)
local round = XGuildWarManager.GetRoundByRoundId(roundId or CurrentRoundId)
return round and round:CheckIsSkipRound()
end
--=============
--检查是否玩家跳过轮
--=============
function XGuildWarManager.CheckIsPlayerSkipRound(roundId)
local round = XGuildWarManager.GetRoundByRoundId(roundId or CurrentRoundId)
return round and round:CheckIsMySkipRound()
end
--=============
--根据轮次Id检查是否跳过轮
--=============
function XGuildWarManager.CheckIsSkipRound(roundId)
return XGuildWarManager.CheckIsGuildSkipRound(roundId)
or XGuildWarManager.CheckIsPlayerSkipRound(roundId)
end
--=============
--检查当前轮是否跳过轮
--=============
function XGuildWarManager.CheckIsSkipCurrentRound()
return XGuildWarManager.CheckIsGuildSkipRound()
or XGuildWarManager.CheckIsPlayerSkipRound()
end
--=============
--检查当轮是否能进入地图
--=============
function XGuildWarManager.CheckCanEnterMain()
--检查轮数是否开始
local isInRound = XGuildWarManager.CheckRoundIsInTime()
if not isInRound then return false end
--第二步检查跳过情况
local isSkip = XGuildWarManager.CheckIsSkipRound()
if isSkip then return false end
--第三步检查是否选择了难度
local isSelectDifficulty = XGuildWarManager.CheckHaveDifficultySelected()
if not isSelectDifficulty then return false end
end
function XGuildWarManager.CheckIsInGuildByRound(roundId)
if roundId == 0 then return true end --全局任务默认在公会
local round = XGuildWarManager.GetRoundByRoundId(roundId)
if not round then return false end
local isChange = round:CheckIsChangeGuild()
return not isChange
end
--===============
--获取到下一轮的开放时间
--若已经没有下一轮返回nil
--===============
function XGuildWarManager.GetNextRoundTime()
local now = XTime.GetServerNowTimestamp()
local startTime = XGuildWarManager.GetRoundStartTime()
--检查是否是第一轮未开始
if CurrentRoundId == 1 and now < startTime then
return XUiHelper.GetTime(startTime - now, XUiHelper.TimeFormatType.ACTIVITY)
elseif CurrentRoundId == Config.ROUND_NUM then
return nil
else
local nextRoundCfg = Config.GetCfgByIdKey(
Config.TableKey.Round,
CurrentRoundId + 1
)
local nextStartTime = XFunctionManager.GetStartTimeByTimeId(nextRoundCfg.TimeId)
return XUiHelper.GetTime(nextStartTime - now, XUiHelper.TimeFormatType.ACTIVITY)
end
end
--================
--获取上一轮轮次控件
--若这是第一轮则返回nil
--================
function XGuildWarManager.GetPreRound()
if not CurrentRoundId or (CurrentRoundId <= 1) then
return nil
end
return XGuildWarManager.GetRoundByRoundId(CurrentRoundId - 1)
end
--------------------------------------------------------
--------------------------------------------------------
--难度选择相关
--------------------------------------------------------
--------------------------------------------------------
--================
--获取难度数据列表
--================
function XGuildWarManager.GetDifficultyDataList()
local cfgs = Config.GetAllConfigs(Config.TableKey.Difficulty)
local datas = {}
for id, cfg in pairs(cfgs or {}) do
local data = {
Id = id,
Name = cfg.Name,
RecommendActive = cfg.RecommendActive,
FightEventIds = cfg.FightEventIds,
PreId = cfg.PreId or 0,
BgPath = cfg.BgPath,
LockText = cfg.LockText or "",
}
datas[id] = data
end
return datas
end
--================
--检查难度是否已通关
--================
function XGuildWarManager.CheckDifficultyIsPass(difficultyId)
if difficultyId == 0 then return true end
return difficultyId and DifficultyPassRecord[difficultyId]
end
--================
--获取本期上一次通关的难度
--若是第一轮返回难度1
--================
function XGuildWarManager.GetDifficultyPreSelected()
if CurrentRoundId == 1 then return 1 end
for i = CurrentRoundId - 1, 1, -1 do
local round = XGuildWarManager.GetRoundByRoundId(i)
local battleManager = round and round:GetBattleManager()
if battleManager and battleManager:CheckAllInfectIsDead() then
return round:GetDifficulty()
end
end
return 1
end
--================
--获取难度名称
--若传入参数为空,则返回空字符串""
--================
function XGuildWarManager.GetDifficultyName(difficultyId)
local cfg = Config.GetCfgByIdKey(
Config.TableKey.Difficulty,
difficultyId,
true
)
return cfg and cfg.Name or ""
end
--================
--获取结算奖励Id
--@isPass 是否通过
--================
function XGuildWarManager.GetRoundSettleReward(difficultyId, isPass)
local rewardId = 0
local cfg = Config.GetCfgByIdKey(
Config.TableKey.Difficulty,
difficultyId,
true
)
if not cfg then return 0 end
if isPass == 1 then
rewardId = cfg and cfg.PassRewardId
else
rewardId = cfg and cfg.UnPassRewardId
end
return rewardId
end
--================
--请求:选择难度
--@param cb: function 回调
--================
function XGuildWarManager.SelectDifficulty(difficulty, cb)
if not CheckIsGuildMaster() then
XLog.Debug(XUiHelper.GetText("GuildWarNotGuildMaster"))
return
end
local preActive = 0
if CurrentRoundId > 1 then
local preRound = XGuildWarManager.GetRoundByRoundId(CurrentRoundId - 1)
if not preRound:CheckIsSkipRound() then
preActive = preRound:GetTotalActivation()
end
end
local confirmCb = function()
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.SelectDifficult, {DifficultyId = difficulty}, function(res)
if cb then
cb()
end
end)
end
local difficultyCfg = Config.GetCfgByIdKey(
Config.TableKey.Difficulty,
difficulty
)
local tipTitle = XUiHelper.GetText("GuildWarSelectDifficultyConfirmTitle")
local recommend = difficultyCfg.RecommendActive
--比较推荐值与上一轮的活跃度的大小,获取对应文本
local tipText = ((recommend > preActive) and XUiHelper.GetText("GWSelectDifficultyConfirmContentNotRecommend", difficultyCfg.RecommendActive, preActive))
or (XUiHelper.GetText("GWSelectDifficultyConfirmContentRecommend", difficultyCfg.RecommendActive, preActive))
local content = tipText
XLuaUiManager.Open("UiDialog", tipTitle, content, XUiManager.DialogType.Normal, nil, confirmCb)
end
--------------------------------------------------------
--------------------------------------------------------
--任务相关
--------------------------------------------------------
--------------------------------------------------------
--===============
--初始化任务数据
--===============
function XGuildWarManager.InitGuildWarTaskList()
local TaskManager = XDataCenter.TaskManager
GuildWarTaskList = {}
GuildWarTaskByTaskIdDic = {}
local taskCfgs = Config.GetAllConfigs(Config.TableKey.Task)
--获取所有真任务数据
local taskDatas = TaskManager.GetTaskList(TaskManager.TaskType.GuildWar)
--构筑临时检索用字典
local taskDataDic = {}
for _, taskData in pairs(taskDatas) do
taskDataDic[taskData.Id] = taskData
end
for id, cfg in pairs(taskCfgs) do
local roundId = cfg.RoundId or 0
if not GuildWarTaskList[roundId] then
GuildWarTaskList[roundId] = {}
end
local roundList = GuildWarTaskList[roundId]
local difficultyId = cfg.DifficultyId or 0
if not roundList[difficultyId] then
roundList[difficultyId] = {}
end
if cfg.SubType == XGuildWarConfig.SubTaskType.Real then
--真任务,任务数据从TaskManager走通常任务逻辑构造专用数据
local originTaskData = taskDataDic[cfg.TaskId]
local resultTaskData = originTaskData and XTool.Clone(originTaskData) or {}
resultTaskData.TaskType = cfg.SubType
resultTaskData.GuildWarTaskId = cfg.Id
resultTaskData.RoundId = roundId
--真任务需要任务Id走通用逻辑
resultTaskData.Id = cfg.TaskId
if originTaskData then
resultTaskData.SortWeight = (resultTaskData.State == XDataCenter.TaskManager.TaskState.Finish and 2)
or (resultTaskData.State == XDataCenter.TaskManager.TaskState.Achieved and 0) or 1
else
--没有数据也要构筑一个空的占位
resultTaskData.Schedule = { [1] = { Id = cfg.TaskId, Value = 0 }}
resultTaskData.State = XDataCenter.TaskManager.TaskState.Accepted
resultTaskData.SortWeight = 1
end
table.insert(roundList[difficultyId], resultTaskData)
GuildWarTaskByTaskIdDic[cfg.TaskId] = resultTaskData
else
--临时任务,直接构造专用数据
local resultTaskData = {
GuildWarTaskId = cfg.Id,
Name = cfg.Name,
TaskType = cfg.SubType,
Icon = cfg.Icon,
Desc = cfg.Desc,
RewardId = cfg.RewardId,
RoundId = roundId,
State = CompleteTaskId[cfg.Id] and XDataCenter.TaskManager.TaskState.Finish or XDataCenter.TaskManager.TaskState.Accepted,
SortWeight = CompleteTaskId[cfg.Id] and 2 or 1
}
table.insert(roundList[difficultyId], resultTaskData)
end
end
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_TASK_REFRESH)
end
--===============
--刷新所有临时任务数据
--===============
function XGuildWarManager.RefreshGuildWarTaskList()
if not GuildWarTaskList then
--初始化会用此时最新数据,不需要再刷新,初始化完后返回
XGuildWarManager.InitGuildWarTaskList()
return
end
for roundId, dataListByDifficulty in pairs(GuildWarTaskList) do
for difficultyId, taskList in pairs(dataListByDifficulty) do
for _, taskData in pairs(taskList) do
if taskData.TaskType ~= XGuildWarConfig.SubTaskType.Real then
taskData.State = CompleteTaskId[taskData.GuildWarTaskId] and XDataCenter.TaskManager.TaskState.Finish or XDataCenter.TaskManager.TaskState.Accepted
taskData.SortWeight = CompleteTaskId[taskData.GuildWarTaskId] and 2 or 1
end
end
end
end
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_TASK_REFRESH)
end
--===============
--同步所有真任务数据
--===============
function XGuildWarManager.SyncTasks()
if not GuildWarTaskList then
--初始化会用此时最新数据,不需要再刷新,初始化完后返回
XGuildWarManager.InitGuildWarTaskList()
return
end
local TaskManager = XDataCenter.TaskManager
--获取所有真任务数据
local taskDatas = TaskManager.GetTaskList(TaskManager.TaskType.GuildWar)
for _, taskData in pairs(taskDatas or {}) do
local task = GuildWarTaskByTaskIdDic[taskData.Id]
if task then
task.Schedule = XTool.Clone(taskData.Schedule)
task.State = taskData.State
task.SortWeight = (task.State == XDataCenter.TaskManager.TaskState.Finish and 2)
or (task.State == XDataCenter.TaskManager.TaskState.Achieved and 0) or 1
end
end
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_TASK_REFRESH)
end
--================
--获取公会战全部任务列表
--================
function XGuildWarManager.GetAllTaskList()
if not GuildWarTaskList then
XGuildWarManager.InitGuildWarTaskList()
end
return GuildWarTaskList
end
--================
--获取公会战显示的任务类型(屏蔽跳过的轮数)
--================
function XGuildWarManager.GetAllShowedTaskTypeList()
local index = Config.TaskType.Activity
local showedTaskTypeList = {}
while true do
local isNotStart = CurrentRoundId < index
if isNotStart then break end
local cfg = Config.GetCfgByIdKey(
Config.TableKey.TaskType,
index,
true
)
if not cfg or (not next(cfg)) then break end
local isSkip
if index == 0 then
isSkip = false
else
local round = XGuildWarManager.GetRoundByRoundId(index)
isSkip = (round and round:CheckIsTaskNotShow())
end
if not isSkip then
table.insert(showedTaskTypeList, { Name = cfg.Name, TaskType = cfg.Id})
end
index = index + 1
end
return showedTaskTypeList
end
--================
--根据工会战任务类型Id获取公会战任务列表(屏蔽没有选择的难度)
--@param taskType:任务类型Id
--@return TaskData列表
--================
function XGuildWarManager.GetTaskList(taskType)
if not GuildWarTaskList then
XGuildWarManager.InitGuildWarTaskList()
end
if not taskType then taskType = 0 end
if taskType == XGuildWarConfig.TaskType.Activity then
local tempTaskDatas = {}
for _, taskList in pairs(GuildWarTaskList[taskType] or {}) do
for index, taskData in pairs(taskList) do
table.insert(tempTaskDatas, taskData)
end
end
table.sort(tempTaskDatas, function(dataA, dataB)
if dataA.SortWeight == dataB.SortWeight then
return dataA.GuildWarTaskId < dataB.GuildWarTaskId
end
return dataA.SortWeight < dataB.SortWeight
end)
--周期任务不分难度
return tempTaskDatas
end
local tempTaskDatas = {}
local difficultyId = XGuildWarManager.GetRoundByRoundId(taskType):GetMyDifficulty()
for difficulty, taskDataList in pairs(GuildWarTaskList[taskType] or {}) do
if difficultyId == difficulty then
for _, taskData in pairs(taskDataList) do
table.insert(tempTaskDatas, taskData)
end
end
end
table.sort(tempTaskDatas, function(dataA, dataB)
if dataA.SortWeight == dataB.SortWeight then
return dataA.GuildWarTaskId < dataB.GuildWarTaskId
end
return dataA.SortWeight < dataB.SortWeight
end)
return tempTaskDatas
end
--===============
--检查有没任务可接收奖励
--===============
function XGuildWarManager.CheckTaskAchieved()
if XGuildWarConfig.CLOSE_DEBUG then return false end
if XGuildWarManager.CheckActivityIsEnd() then
return false
end
--只有真任务有这个状态
for _, taskData in pairs(GuildWarTaskByTaskIdDic or {}) do
if taskData.State == XDataCenter.TaskManager.TaskState.Achieved then
return true
end
end
return false
end
--================
--根据工会战任务类型Id获取改任务类型有没可领奖励任务
--@param taskType:任务类型Id
--@return result:bool true有可领奖励任务 false没有
--================
function XGuildWarManager.CheckTaskCanAchievedByType(taskType)
local taskDatas = XGuildWarManager.GetTaskList(taskType)
for _, taskData in pairs(taskDatas or {}) do
if taskData.State == XDataCenter.TaskManager.TaskState.Achieved then
return true
end
end
return false
end
--------------------------------------------------------
--------------------------------------------------------
--排行榜相关
--------------------------------------------------------
--------------------------------------------------------
function XGuildWarManager.CheckReadCurrentRanking()
if CurrentRoundId == 1 then
return true
end
local isRead = XSaveTool.GetData("GuildWar" .. XGuildWarManager.GetActivityId() .. XGuildWarManager.GetActvityTimeId() .. XPlayer.Id .. (CurrentRoundId - 1))
return isRead
end
--===============
--请求排行榜信息
--@param cb: function 回调
--===============
function XGuildWarManager.RequestRanking(rankType, uid, cb)
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.RequestRanking, {RankType = rankType, Uid = uid }, function(res)
if cb then
cb(res.RankList, res.MyRankInfo)
end
end)
end
--------------------------------------------------------
--------------------------------------------------------
--弹窗相关
--------------------------------------------------------
--------------------------------------------------------
--===============
--对比新弹窗记录数据,检查是否有新的节点攻破
--@param newPopupRecord:新弹窗记录数据
--===============
function XGuildWarManager.CheckNewRecord(newPopupRecord)
if not newPopupRecord then return end
local isNew = false
for index, data in pairs(newPopupRecord.SettleDatas) do
local roundId = data.RoundId
if not (PopupRecord and PopupRecord[index]) and (not XGuildWarManager.CheckIsSkipRound(data.RoundId))
and data.PlayerActivation > 0 then
table.insert(NeedPopup, data)
isNew = true
end
end
PopupRecord = newPopupRecord.SettleDatas
if isNew then
XGuildWarManager.OpenNewRecord()
end
end
function XGuildWarManager.OpenNewRecord()
local record = NeedPopup[1]
if not record then return end
table.remove(NeedPopup, 1)
XLuaUiManager.Open("UiGuildWarLastResults", record, function()
XGuildWarManager.OpenNewRecord()
end)
end
--===============
--请求弹窗
--@param cb: function 回调
--===============
function XGuildWarManager.RequestPopup(cb)
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.PopUp, {}, function(res)
local newRecord = res.PopupRecord
XGuildWarManager.CheckNewRecord(newRecord)
if cb then
cb()
end
end)
end
--===============
--行动播放进度保存请求
--@param cb: function 回调
--===============
function XGuildWarManager.RequestPopupActionID(showedActionIdList, cb)
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.PopupActionID, {ActionPlayed = showedActionIdList}, function(res)
if cb then
cb()
end
end)
end
--------------------------------------------------------
--------------------------------------------------------
--特攻角色相关
--------------------------------------------------------
--------------------------------------------------------
--===============
--获取所有特攻角色列表
--@return 角色Id列表 (默认索引1是主攻角色)
--===============
function XGuildWarManager.GetSpecialRoleList()
if not SpecialRoleList then
local tempList = {}
local roles = Config.GetAllConfigs(Config.TableKey.SpecialRole)
for _, role in pairs(roles) do
local data = { Center = role.CenterCharacter == 1, CharacterId = role.Id }
table.insert(tempList, data)
end
table.sort(tempList, function(roleDataA, roleDataB)
if roleDataA.Center then
return true
end
if roleDataB.Center then
return false
end
return roleDataA.CharacterId < roleDataB.CharacterId
end)
SpecialRoleList = {}
--主要特攻角色
MainSpecialRoleId = tempList[1].CharacterId
for i = 1, #tempList do
table.insert(SpecialRoleList, tempList[i].CharacterId)
end
end
return SpecialRoleList
end
--===============
--根据实体Id获取特攻角色的Buff数据
--若传入非特攻角色的Id返回nil
--@return buffData = { Icon = 图标地址, Name = Buff名称, Desc = Buff描述 }
--===============
function XGuildWarManager.GetSpecialRoleBuff(entityId)
if not entityId then return nil end
local characterId = 0
if XRobotManager.CheckIsRobotId(entityId) then
characterId = XRobotManager.GetCharacterId(entityId)
else
characterId = entityId
end
local roleCfg = Config.GetCfgByIdKey(
Config.TableKey.SpecialRole,
characterId,
true
)
if not roleCfg then return nil end
local fightEventId = roleCfg.FightEventId
if not fightEventId or (fightEventId == 0) then return nil end
local cfg = XFubenConfigs.GetStageFightEventDetailsByStageFightEventId(fightEventId)
if not cfg then return nil end
local buffData = { Icon = cfg.Icon, Name = cfg.Name, Desc = cfg.Description}
return buffData
end
--===============
--获取特攻角色队伍Buff数据
--@return buffData = { Icon = 图标地址, Name = Buff名称, Desc = Buff描述 }
--===============
function XGuildWarManager.GetSpecialTeamBuff()
local teamCfg = Config.GetCfgByIdKey(
Config.TableKey.SpecialTeam,
1
)
local fightEventId = teamCfg.FightEventId
if not fightEventId or (fightEventId == 0) then return nil end
local cfg = XFubenConfigs.GetStageFightEventDetailsByStageFightEventId(fightEventId)
if not cfg then return nil end
local buffData = { Icon = cfg.Icon, Name = cfg.Name, Desc = cfg.Description}
return buffData
end
--===============
--根据实体Id检查是否特攻角色
--===============
function XGuildWarManager.CheckIsSpecialRole(entityId)
if not entityId then return false end
local characterId = 0
if XRobotManager.CheckIsRobotId(entityId) then
characterId = XRobotManager.GetCharacterId(entityId)
else
characterId = entityId
end
local roleCfg = Config.GetCfgByIdKey(
Config.TableKey.SpecialRole,
characterId,
true
)
return next(roleCfg) ~= nil
end
--===============
--根据队伍数据检查是否特攻角色队伍
--@return CurrentSpecial, MaxNum, IsSpecial
--CurrentSpecial = (int)当前特攻角色数量
--MaxNum = (int)激活需要的特攻角色数量
--IsSpecial = (bool)是否已激活
--===============
function XGuildWarManager.CheckIsSpecialTeam(entityIds)
if not entityIds then return false end
local count = 0
local isSpecialTeam = true
for _, entityId in pairs(entityIds) do
if entityId == 0 then
isSpecialTeam = false --队伍要全队满员,且都是特攻角色才满足条件
goto continue
end
local isSpecialRole = XGuildWarManager.CheckIsSpecialRole(entityId)
if not isSpecialRole then
isSpecialTeam = false
goto continue
end
count = count + 1
:: continue ::
end
return count, XDataCenter.TeamManager.GetMaxPos(), isSpecialTeam
end
--------------------------------------------------------
--------------------------------------------------------
--战斗相关
--------------------------------------------------------
--------------------------------------------------------
--================
--处理轮次结算通知
--================
function XGuildWarManager.OnNotifyGuildWarRoundSettle(data)
if XUiManager.CheckTopUi(CsXUiType.Normal, "UiGuildWarStageMain")
or XUiManager.CheckTopUi(CsXUiType.Normal, "UiGuildMain") then
XGuildWarManager.RequestPopup()
end
end
function XGuildWarManager.GetBattleManager()
local round = XGuildWarManager.GetCurrentRound()
if round then
return round:GetBattleManager()
end
return nil
end
--================
--检查是否有足够活动体力
--================
function XGuildWarManager.CheckEnoughActionPoint(actionPoint)
return ActionPoint >= actionPoint
end
--================
--获取当前活动体力值
--================
function XGuildWarManager.GetCurrentActionPoint()
return ActionPoint
end
--================
--扣除活动体力
--================
function XGuildWarManager.CostActionPoint(costPoint)
if not XGuildWarManager.CheckEnoughActionPoint(costPoint) then
XUiManager.TipText("GuildWarActionPointNotEnough")
return
end
ActionPoint = ActionPoint - costPoint
end
--===============
--确认战斗
--@param cb: function 回调
--===============
function XGuildWarManager.ConfirmFight(stageId, cb)
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.ConfirmFight, {StageId = stageId}, function(res)
if cb then
cb()
end
end)
end
--===============
--扫荡关卡
--@param cb: function 回调
--===============
function XGuildWarManager.StageSweep(uid, sweepType, stageId, cb)
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.StageSweep, {Uid = uid, SweepType = sweepType
, StageId = stageId}, function(res)
if cb then
cb()
end
end)
end
--------------------------------------------------------
--------------------------------------------------------
--入口,跳转相关
--------------------------------------------------------
--------------------------------------------------------
--================
--跳转到活动主界面
--================
function XGuildWarManager.JumpTo()
if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.GuildWar) then
local canGoTo, notStart = XGuildWarManager.CheckActivityCanGoTo()
if canGoTo then
if XGuildWarManager.CheckCanEnterMain() then
XLuaUiManager.Open("UiGuildWarMain")
end
elseif notStart then
XUiManager.TipMsg(CS.XTextManager.GetText("CommonActivityNotStart"))
else
XUiManager.TipMsg(CS.XTextManager.GetText("CommonActivityEnd"))
end
end
end
--================
--玩法关闭时弹出主界面
--================
function XGuildWarManager.OnActivityEndHandler()
XLuaUiManager.RunMain()
XUiManager.TipMsg(CS.XTextManager.GetText("CommonActivityEnd"))
end
--===============
--获取活动信息
--@param cb: function 回调
--===============
function XGuildWarManager.GetActivityData(cb)
if XGuildWarConfig.CLOSE_DEBUG then return end
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.GetActivityData, {}, function(res)
XGuildWarManager.RefreshActivityData(res.ActivityData)
if cb then
cb()
end
end)
end
--===============
--获取活动信息
--@param cb: function 回调
--===============
function XGuildWarManager.RequestPlayerMove(targetNodeId, cb)
local cost = tonumber(XGuildWarConfig.GetServerConfigValue("MoveCostEnergy"))
if not XEntityHelper.CheckItemCountIsEnough(XGuildWarConfig.ActivityPointItemId
, cost) then
return
end
XNetwork.CallWithAutoHandleErrorCode(METHOD_NAME.PlayerMove, {
CurNodeId = XGuildWarManager.GetBattleManager():GetCurrentNodeId(),
NextNodeId = targetNodeId,
}, function(res)
XGuildWarManager.GetBattleManager():UpdateNodeDatas(res.NodeDatas)
XGuildWarManager.GetBattleManager():UpdateCurrentNodeId(targetNodeId)
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_PLAYER_MOVE)
if cb then cb() end
end)
end
--===============
-- 副本接口BEGIN
--===============
function XGuildWarManager.InitStageInfo()
-- 关卡池的关卡
local configs = XGuildWarConfig.GetAllConfigs(XGuildWarConfig.TableKey.Stage)
local stageInfo = nil
for _, config in pairs(configs) do
stageInfo = XDataCenter.FubenManager.GetStageInfo(config.StageId)
if stageInfo then
stageInfo.Type = XDataCenter.FubenManager.StageType.GuildWar
else
XLog.Error("公会战找不到配置的关卡id" .. config.StageId)
end
end
end
function XGuildWarManager.ShowReward(winData, playEndStory)
XLuaUiManager.Open("UiSettleWinCommon", winData, require("XUi/XUiGuildWar/XUiGuildWarSettleWin"))
end
function XGuildWarManager.PreFight(stage, teamId, isAssist, challengeCount, challengeId)
local battleManager = XGuildWarManager.GetBattleManager()
local team = battleManager:GetTeam()
local cardIds = { 0, 0, 0}
local robotIds = { 0, 0, 0}
for pos, entityId in ipairs(team:GetEntityIds()) do
if XEntityHelper.GetIsRobot(entityId) then
robotIds[pos] = entityId
else
cardIds[pos] = entityId
end
end
local result = {
StageId = stage.StageId,
IsHasAssist = isAssist,
ChallengeCount = challengeCount,
CaptainPos = team:GetCaptainPos(),
FirstFightPos = team:GetFirstFightPos(),
CardIds = cardIds,
RobotIds = robotIds,
}
result.GuildWarUid = XGuildWarManager.GetBattleManager():GetCurrentClientBattleUID()
return result
end
--===============
-- 副本接口END
--===============
function XGuildWarManager.GetMaxEnergy()
return tonumber(XGuildWarConfig.GetServerConfigValue("MaxEnergy"))
end
XGuildWarManager.Init()
return XGuildWarManager
end
--============
--登陆数据通知
--============
XRpc.NotifyGuildWarActivityData = function(data)
if XGuildWarConfig.CLOSE_DEBUG then return end
XDataCenter.GuildWarManager.OnNotifyActivityData(data)
end
--============
--轮次结算通知
--============
XRpc.NotifyGuildWarRoundSettle = function(data)
if XGuildWarConfig.CLOSE_DEBUG then return end
XDataCenter.GuildWarManager.OnNotifyGuildWarRoundSettle(data)
end
--============
--通知客户端,战斗记录有刷新
--============
XRpc.NotifyGuildWarFightRecordChange = function(data)
if XGuildWarConfig.CLOSE_DEBUG then return end
XDataCenter.GuildWarManager.GetBattleManager():UpdateFightRecords(data.FightRecords)
end
--============
--通知客户端,活动数据有刷新(8点)
--============
XRpc.NotifyGuildWarActivityDataChange = function(data)
if XGuildWarConfig.CLOSE_DEBUG then return end
XDataCenter.GuildWarManager.RefreshActivityData(data.ActivityData)
end
--============
--通知客户端,新事件发生
--============
XRpc.NotifyGuildWarAction = function(data)
if XGuildWarConfig.CLOSE_DEBUG then return end
local battleManager = XDataCenter.GuildWarManager.GetBattleManager()
battleManager:AddActionList(data.ActionList)
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_ACTIONLIST_CHANGE, data.ActionList)
end
--============
--通知客户端,节点数据更新
--============
XRpc.NotifyGuildWarNodeUpdate = function(data)
if XGuildWarConfig.CLOSE_DEBUG then return end
XDataCenter.GuildWarManager.GetBattleManager():UpdateNodeData(data.NodeData)
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_NODEDATA_CHANGE)
end
--============
--通知客户端,怪物数据更新
--============
XRpc.NotifyGuildWarMonsterUpdate = function(data)
if XGuildWarConfig.CLOSE_DEBUG then return end
XDataCenter.GuildWarManager.GetBattleManager():UpdateMonsterData(data.MonsterData)
XEventManager.DispatchEvent(XEventId.EVENT_GUILDWAR_MONSTER_CHANGE)
end