PGRData/Script/matrix/xmanager/XBfrtManager.lua

1003 lines
No EOL
34 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

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

XBfrtManagerCreator = function()
local pairs = pairs
local ipairs = ipairs
local string = string
local table = table
local tableInsert = table.insert
local tableRemove = table.remove
local tableSort = table.sort
local ParseToTimestamp = XTime.ParseToTimestamp
local FightCb
local CloseLoadingCb
-- 据点战管理器
local XBfrtManager = {}
--据点战梯队类型
XBfrtManager.EchelonType = {
Fight = 0, --作战梯队
Logistics = 1, --后勤梯队
}
local METHOD_NAME = {
GetBfrtDataRequest = "GetBfrtDataRequest",
BfrtTeamSetRequest = "BfrtTeamSetRequest"
}
local BfrtChapterTemplates = {}
local BfrtGroupTemplates = {}
local EchelonInfoTemplates = {}
local BfrtFollowGroupDic = {}
local ChapterInfos = {}
local GroupInfos = {}
local ChapterDic = {}
local GroupIdToOrderIdDic = {}
local StageDic = {}
local TaskIdToOrderIdDic = {}
local GroupIdToChapterIdDic = {}
local EchlonTeamPosDic = {} --缓存本地修改的队长位
local EchlonServerTeamPosDic = {} --缓存服务端下发的队长位
local EchlonFirstFightDic = {} --缓存本地修改的首发位
local EchlonServerFirstFightDic = {} --缓存服务端下发的首发位
--面板上显示的位置 = 队伍中实际中的位置
local TEAM_POS_DIC = {
[1] = 2,
[2] = 1,
[3] = 3,
}
local BfrtData = {}
local FightTeams = {}
local LogisticsTeams = {}
local function IsGroupPassed(groupId)
local records = BfrtData.BfrtGroupRecords
if not records then
return false
end
for _, record in pairs(records) do
if record.Id == groupId then
return true
end
end
return false
end
function XBfrtManager.GetChapterInfo(chapterId)
return ChapterInfos[chapterId]
end
local function GetGroupInfo(groupId)
return GroupInfos[groupId]
end
function XBfrtManager.GetChapterCfg(chapterId)
local chapterCfg = BfrtChapterTemplates[chapterId]
if not chapterCfg then
XLog.ErrorTableDataNotFound("XBfrtManager.GetChapterCfg", "chapterCfg",
"Share/Fuben/Bfrt/BfrtChapter.tab", "chapterId", tostring(chapterId))
return
end
return chapterCfg
end
local function GetGroupCfg(groupId)
local groupCfg = BfrtGroupTemplates[groupId]
if not groupCfg then
XLog.ErrorTableDataNotFound("GetGroupCfg", "groupCfg", "Share/Fuben/Bfrt/BfrtGroup.tab", "groupId", tostring(groupId))
return
end
return groupCfg
end
function XBfrtManager.GetStageIdList(groupId)
local stageIdList = {}
local groupCfg = GetGroupCfg(groupId)
local seqList = string.ToIntArray(groupCfg.TeamFightSeq, '|')
local originList = groupCfg.StageId
for index, seq in ipairs(seqList) do
stageIdList[index] = originList[seq]
end
return stageIdList
end
function XBfrtManager.GetFightInfoIdList(groupId)
local fightInfoIdList = {}
local groupCfg = GetGroupCfg(groupId)
local seqList = string.ToIntArray(groupCfg.TeamFightSeq, '|')
local originList = groupCfg.FightInfoId
for index, seq in ipairs(seqList) do
fightInfoIdList[index] = originList[seq]
end
return fightInfoIdList
end
function XBfrtManager.GetLogisticsInfoIdList(groupId)
local groupCfg = GetGroupCfg(groupId)
return groupCfg.LogisticsInfoId
end
local function GetEchelonInfo(echelonId)
local echelon = EchelonInfoTemplates[echelonId]
if not echelon then
XLog.ErrorTableDataNotFound("GetEchelonInfo", "echelon", "Share/Fuben/Bfrt/EchelonInfo.tab", "echelonId", tostring(echelonId))
return
end
return echelon
end
function XBfrtManager.GetGroupList(chapterId)
local chapter = BfrtChapterTemplates[chapterId]
if not chapter then
XLog.ErrorTableDataNotFound("XBfrtManager.GetGroupList", "chapter", "Share/Fuben/Bfrt/BfrtChapter.tab", "chapterId", tostring(chapterId))
return
end
return chapter.GroupId
end
function XBfrtManager.GetChapterName(chapterId)
local chapter = BfrtChapterTemplates[chapterId]
if not chapter then
XLog.ErrorTableDataNotFound("XBfrtManager.GetChapterName", "chapter", "Share/Fuben/Bfrt/BfrtChapter.tab", "chapterId", tostring(chapterId))
return
end
return chapter.ChapterName
end
function XBfrtManager.TeamPosConvert(index)
return TEAM_POS_DIC[index]
end
function XBfrtManager.MemberIndexConvert(pos)
for index, dicPos in pairs(TEAM_POS_DIC) do
if pos == dicPos then
return index
end
end
end
local function CheckTeamLimit(echelonId, team)
local needNum = XBfrtManager.GetEchelonNeedCharacterNum(echelonId)
for i = 1, needNum do
local characterId = team[i]
if not characterId or characterId == 0 then
return false
end
end
return true
end
--获取各梯队需求人数
function XBfrtManager.GetEchelonNeedCharacterNum(echelonId)
local echelon = GetEchelonInfo(echelonId)
return echelon and echelon.NeedCharacter
end
function XBfrtManager.InitStageInfo()
for groupId, groupCfg in pairs(BfrtGroupTemplates) do
local groupInfo = GroupInfos[groupId]
for _, v in pairs(groupCfg.StageId) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v)
if not stageInfo then
local tmpStr = "XBfrtManager InitStageInfo错误, 无法根据 Share/Fuben/Bfrt/BfrtGroup.tab 表里面的stageId"
XLog.Error(tmpStr .. v .. " 找到Share/Fuben/Stage.tab 表中的表项")
break
end
stageInfo.IsOpen = true
stageInfo.Type = XDataCenter.FubenManager.StageType.Bfrt
stageInfo.Unlock = groupInfo and groupInfo.Unlock or false
stageInfo.ChapterId = groupInfo and groupInfo.ChapterId
end
local baseStageInfo = XDataCenter.FubenManager.GetStageInfo(groupCfg.BaseStage)
baseStageInfo.IsOpen = true
baseStageInfo.Type = XDataCenter.FubenManager.StageType.Bfrt
baseStageInfo.Unlock = groupInfo and groupInfo.Unlock or false
baseStageInfo.ChapterId = groupInfo and groupInfo.ChapterId
end
end
local function InitGroupInfo()
GroupInfos = {}
for groupId, groupCfg in pairs(BfrtGroupTemplates) do
local info = {}
GroupInfos[groupId] = info
GroupIdToOrderIdDic[groupId] = groupCfg.GroupOrderId
info.Unlock = true
local preGroupId = groupCfg.PreGroupId
if preGroupId and preGroupId > 0 then
info.Unlock = false
for _, record in pairs(BfrtData.BfrtGroupRecords) do
if record.Id == preGroupId then
info.Unlock = true
break
end
end
end
StageDic[groupCfg.BaseStage] = {
GroupId = groupId,
IsLastStage = false,
}
local count = #groupCfg.StageId
for k, v in pairs(groupCfg.StageId) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v)
if stageInfo then
stageInfo.Unlock = info.Unlock
StageDic[v] = {
GroupId = groupId,
IsLastStage = (k == count)
}
else
local tmpStr = "XBfrtManager.InitGroupInfo错误, 无法根据 Share/Fuben/Bfrt/BfrtGroup.tab 表里面的stageId"
XLog.Error(tmpStr .. v .. " 找到Share/Fuben/Stage.tab 表中的表项")
end
end
info.Passed = IsGroupPassed(groupId)
end
end
local function InitChapterInfo()
ChapterInfos = {}
for chapterId, chapterCfg in pairs(BfrtChapterTemplates) do
ChapterDic[chapterCfg.OrderId] = chapterId
local info = {}
ChapterInfos[chapterId] = info
info.ChapterId = chapterId
if #chapterCfg.GroupId > 0 then
local groupId = chapterCfg.GroupId[1]
local groupInfo = GroupInfos[groupId]
if groupInfo then
info.Unlock = groupInfo.Unlock
end
end
local allPassed = true
for k, v in pairs(chapterCfg.GroupId) do
GroupIdToChapterIdDic[v] = chapterId
local groupInfo = GroupInfos[v]
groupInfo.OrderId = k
groupInfo.ChapterId = chapterId
local groupCfg = BfrtGroupTemplates[v]
for _, v2 in pairs(groupCfg.StageId) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v2)
stageInfo.ChapterId = chapterId
end
if not groupInfo.Passed then
allPassed = false
end
end
info.Passed = allPassed
for orderId, taskId in ipairs(chapterCfg.TaskId) do
TaskIdToOrderIdDic[taskId] = orderId
end
end
end
local function GetChapterTaskIdList(chapterId)
local chapterCfg = XBfrtManager.GetChapterCfg(chapterId)
local taskIdList = chapterCfg.TaskId
if not taskIdList then
XLog.ErrorTableDataNotFound("XBfrtManager.GetChapterTaskIdList",
"TaskId", "Share/Fuben/Bfrt/BfrtChapter.tab", "chapterId", tostring(chapterId))
end
return taskIdList
end
local function InitFollowGroup()
for k, v in pairs(BfrtGroupTemplates) do
if v.PreGroupId > 0 then
local list = BfrtFollowGroupDic[v.PreGroupId]
if not list then
list = {}
end
tableInsert(list, k)
BfrtFollowGroupDic[v.PreGroupId] = list
end
end
end
local function InitTeamRecords()
local teamInfos = BfrtData.BfrtTeamInfos
if not teamInfos then return end
for _, teamInfo in pairs(teamInfos) do
if teamInfo then
local groupId = teamInfo.Id
FightTeams[groupId] = teamInfo.FightTeamList
LogisticsTeams[groupId] = teamInfo.LogisticsTeamList
local captainList = teamInfo.CaptainPosList
local firstFightList = teamInfo.FirstFightPosList
if captainList then
local fightInfoIdList = XBfrtManager.GetFightInfoIdList(groupId)
for index, echelonId in ipairs(fightInfoIdList) do
XBfrtManager.SetTeamCaptainPos(echelonId, captainList[index])
XBfrtManager.SetServerTeamCaptainPos(echelonId, captainList[index])
end
end
if firstFightList then
local fightInfoIdList = XBfrtManager.GetFightInfoIdList(groupId)
for index, echelonId in ipairs(fightInfoIdList) do
XBfrtManager.SetTeamFirstFightPos(echelonId, firstFightList[index])
XBfrtManager.SetServerTeamFirstFightPos(echelonId, firstFightList[index])
end
end
end
end
end
local function UnlockFollowGroup(groupId)
local list = BfrtFollowGroupDic[groupId]
if not list then
return
end
for _, id in pairs(list) do
GroupInfos[id].Unlock = true
local groupCfg = BfrtGroupTemplates[id]
for _, v in pairs(groupCfg.StageId) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v)
stageInfo.Unlock = true
end
local baseStageInfo = XDataCenter.FubenManager.GetStageInfo(groupCfg.BaseStage)
baseStageInfo.Unlock = true
local chapterId = XBfrtManager.GetChapterIdByGroupId(id)
local chapterInfo = XBfrtManager.GetChapterInfo(chapterId)
chapterInfo.Unlock = true
end
end
function XBfrtManager.CheckActivityCondition(chapterId)
local chapterCfg = XBfrtManager.GetChapterCfg(chapterId)
local conditionId = chapterCfg.ActivityCondition
if conditionId ~= 0 and not XConditionManager.CheckCondition(conditionId) then
return false
end
return true
end
function XBfrtManager.CheckAnyTaskRewardCanGet(chapterId)
if not chapterId then
return
end
local taskId = XBfrtManager.GetBfrtTaskId(chapterId)
local taskData = XDataCenter.TaskManager.GetTaskDataById(taskId)
return taskData and taskData.State == XDataCenter.TaskManager.TaskState.Achieved
end
function XBfrtManager.GetTaskOrderId(taskId)
return TaskIdToOrderIdDic[taskId]
end
function XBfrtManager.GetGroupIdByStageId(stageId)
if not StageDic[stageId] then
XLog.Error("XBfrtManager GetGroupIdByStageId 无法从StageDic中找到groupId检查 Share/Fuben/Bfrt/BfrtGroup.tab 表, stageId 是" .. stageId)
return
end
return StageDic[stageId].GroupId
end
function XBfrtManager.GetGroupIdByBaseStage(baseStage)
return XBfrtManager.GetGroupIdByStageId(baseStage)
end
function XBfrtManager.Init()
BfrtChapterTemplates = XBfrtConfigs.GetBfrtChapterTemplates()
BfrtGroupTemplates = XBfrtConfigs.GetBfrtGroupTemplates()
EchelonInfoTemplates = XBfrtConfigs.GetEchelonInfoTemplates()
end
function XBfrtManager.IsChapterInTime(chapterId)
local chapterCfg = XBfrtManager.GetChapterCfg(chapterId)
local startTime = ParseToTimestamp(chapterCfg.OpenTimeStr)
if not startTime or startTime <= 0 then
return true
end
local nowTime = XTime.GetServerNowTimestamp()
return startTime <= nowTime
end
function XBfrtManager.GetChapterList()
local list = {}
for _, chapterId in pairs(ChapterDic) do
if XBfrtManager.IsChapterInTime(chapterId) then
tableInsert(list, chapterId)
end
end
return list
end
function XBfrtManager.GetChapterInfoForOrder(orderId)
local chapterId = ChapterDic[orderId]
return ChapterInfos[chapterId]
end
function XBfrtManager.GetGroupRequireCharacterNum(groupId)
local groupRequireCharacterNum = 0
local fightInfoList = XBfrtManager.GetFightInfoIdList(groupId)
for _, echelonId in pairs(fightInfoList) do
groupRequireCharacterNum = groupRequireCharacterNum + XBfrtManager.GetEchelonNeedCharacterNum(echelonId)
end
local logisticsInfoList = XBfrtManager.GetLogisticsInfoIdList(groupId)
for _, echelonId in pairs(logisticsInfoList) do
groupRequireCharacterNum = groupRequireCharacterNum + XBfrtManager.GetEchelonNeedCharacterNum(echelonId)
end
return groupRequireCharacterNum
end
function XBfrtManager.CheckChapterNew(chapterId)
local chapterInfo = XBfrtManager.GetChapterInfo(chapterId)
return chapterInfo.Unlock and not chapterInfo.Passed
end
--获取当前最新解锁的Chapter
function XBfrtManager.GetActiveChapterId()
local activeChapterId
local chapterIdList = XBfrtManager.GetChapterList()
for _, chapterId in ipairs(chapterIdList) do
local chapterInfo = XBfrtManager.GetChapterInfo(chapterId)
if chapterInfo.Unlock then
activeChapterId = chapterId
end
end
return activeChapterId
end
function XBfrtManager.GetChapterOrderId(chapterId)
local chapterCfg = XBfrtManager.GetChapterCfg(chapterId)
return chapterCfg.OrderId
end
function XBfrtManager.GetGroupOrderId(groupId)
local groupInfo = GetGroupInfo(groupId)
return groupInfo.OrderId
end
--获取Chapter中所有Group用于展示的BaseStage的List
function XBfrtManager.GetBaseStageList(chapterId)
local baseStageList = {}
local groupList = XBfrtManager.GetGroupList(chapterId)
for _, groupId in ipairs(groupList) do
local groupCfg = GetGroupCfg(groupId)
table.insert(baseStageList, groupCfg.BaseStage)
end
return baseStageList
end
function XBfrtManager.GetBaseStage(groupId)
local groupCfg = GetGroupCfg(groupId)
return groupCfg.BaseStage
end
function XBfrtManager.CheckBaseStageUnlock(baseStage)
local groupId = XBfrtManager.GetGroupIdByBaseStage(baseStage)
local groupInfo = GetGroupInfo(groupId)
return groupInfo.Unlock
end
function XBfrtManager.IsGroupPassedByStageId(stageId)
local groupId = XDataCenter.BfrtManager.GetGroupIdByStageId(stageId)
local groupInfo = GetGroupInfo(groupId)
return groupInfo.Passed
end
function XBfrtManager.GetLogisticSkillDes(echelonId)
local echelon = GetEchelonInfo(echelonId)
if not echelon.BuffId or echelon.BuffId == 0 then
XLog.ErrorTableDataNotFound("XBfrtManager.GetLogisticSkillDes", "BuffId",
"Share/Fuben/Bfrt/EchelonInfo.tab", "echelonId", tostring(echelonId))
return
end
local fightEventCfg = CS.XNpcManager.GetFightEventTemplate(echelon.BuffId)
return fightEventCfg and fightEventCfg.Description
end
function XBfrtManager.GetEchelonRequireAbility(echelonId)
local echelon = GetEchelonInfo(echelonId)
return echelon.RequireAbility
end
function XBfrtManager.GetEchelonConditionId(echelonId)
local echelon = GetEchelonInfo(echelonId)
return echelon.Condition
end
function XBfrtManager.CheckStageTypeIsBfrt(stageId)
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
if stageInfo and stageInfo.Type == XDataCenter.FubenManager.StageType.Bfrt then
return true
end
return false
end
function XBfrtManager.GetFightTeamList(groupId)
local team = FightTeams[groupId]
if not team then
local preGroupId = XBfrtConfigs.GetBfrtPreGroupId(groupId)
team = FightTeams[preGroupId] or {}
end
return XTool.Clone(team)
end
function XBfrtManager.GetLogisticsTeamList(groupId)
local team = LogisticsTeams[groupId] or {}
return XTool.Clone(team)
end
function XBfrtManager.GetTotalTaskNum(chapterId)
local taskIdList = GetChapterTaskIdList(chapterId)
return #taskIdList
end
function XBfrtManager.GetCurFinishTaskNum(chapterId)
local finishTaskNum = 0
local taskIdList = GetChapterTaskIdList(chapterId)
for _, taskId in pairs(taskIdList) do
local taskData = XDataCenter.TaskManager.GetTaskDataById(taskId)
if taskData then
if taskData.State == XDataCenter.TaskManager.TaskState.Achieved or taskData.State == XDataCenter.TaskManager.TaskState.Finish then
finishTaskNum = finishTaskNum + 1
end
end
end
return finishTaskNum
end
function XBfrtManager.CheckAllTaskRewardHasGot(chapterId)
local taskId = XBfrtManager.GetBfrtTaskId(chapterId)
local taskData = XDataCenter.TaskManager.GetTaskDataById(taskId)
return taskData and taskData.State == XDataCenter.TaskManager.TaskState.Finish
end
function XBfrtManager.GetBfrtTaskId(chapterId)
local taskIdList = GetChapterTaskIdList(chapterId)
return taskIdList[1]
end
function XBfrtManager.CheckAllChapterReward()
if not ChapterDic then return false end
for _, chapterId in pairs(ChapterDic) do
if XBfrtManager.CheckAnyTaskRewardCanGet(chapterId) then
return true
end
end
return false
end
function XBfrtManager.FinishStage(stageId)
local stage = StageDic[stageId]
if not stage or not stage.IsLastStage then
return
end
local groupId = stage.GroupId
GroupInfos[groupId].Passed = true
local findRecord = false
for _, record in pairs(BfrtData.BfrtGroupRecords) do
if record.Id == groupId then
record.Count = record.Count + 1
findRecord = true
break
end
end
if not findRecord then
local record = {
Id = groupId,
Count = 1,
}
tableInsert(BfrtData.BfrtGroupRecords, record)
end
UnlockFollowGroup(groupId)
end
function XBfrtManager.GetGroupFinishCount(baseStage)
local records = BfrtData.BfrtGroupRecords
if not records then
return 0
end
local groupId = XBfrtManager.GetGroupIdByBaseStage(baseStage)
for _, record in pairs(records) do
if record.Id == groupId then
return record.Count
end
end
return 0
end
function XBfrtManager.IsBfrtChapter(id)
return BfrtChapterTemplates[id] ~= nil
end
function XBfrtManager.GetGroupMaxChallengeNum(baseStage)
local groupId = XBfrtManager.GetGroupIdByBaseStage(baseStage)
local groupCfg = GetGroupCfg(groupId)
return groupCfg.ChallengeNum
end
function XBfrtManager.GetChapterIdByGroupId(groupId)
return GroupIdToChapterIdDic[groupId]
end
function XBfrtManager.GetEchelonNameTxt(echelonType, echelonIndex)
local echelonNameTxt
if echelonType == XBfrtManager.EchelonType.Fight then
echelonNameTxt = CS.XTextManager.GetText("BfrtFightEchelonTitle", echelonIndex)
elseif echelonType == XBfrtManager.EchelonType.Logistics then
echelonNameTxt = CS.XTextManager.GetText("BfrtLogisticEchelonTitle", echelonIndex)
end
return echelonNameTxt
end
function XBfrtManager.OpenFightLoading()
return
end
function XBfrtManager.CloseFightLoading(stage)
if CloseLoadingCb then
CloseLoadingCb()
end
local groupId = XBfrtManager.GetGroupIdByStageId(stage)
local logisticsInfoIdList = XBfrtManager.GetLogisticsInfoIdList(groupId)
local totalShowTimes = #logisticsInfoIdList
if totalShowTimes > 0 then
XLuaUiManager.Open("UiTipBfrtLogisticSkill", groupId)
end
end
function XBfrtManager.FinishFight(settle)
XDataCenter.FubenManager.FinishFight(settle)
if FightCb then
FightCb(settle.IsWin)
end
end
function XBfrtManager.ShowReward(winData)
if XBfrtManager.CheckIsGroupLastStage(winData.StageId) then
XLuaUiManager.Open("UiBfrtPostWarCount", winData)
end
end
function XBfrtManager.SetCloseLoadingCb(cb)
CloseLoadingCb = cb
end
function XBfrtManager.SetFightCb(cb)
FightCb = cb
end
function XBfrtManager.CheckIsGroupLastStage(stageId)
local groupId = XBfrtManager.GetGroupIdByStageId(stageId)
local stageIdList = XBfrtManager.GetStageIdList(groupId)
return stageIdList[#stageIdList] == stageId
end
function XBfrtManager.GetGroupOrderIdByStageId(stageId)
local groupId = XBfrtManager.GetGroupIdByStageId(stageId)
return GroupIdToOrderIdDic[groupId]
end
function XBfrtManager.CheckPreGroupUnlock(groupId)
local groupInfo = GetGroupInfo(groupId)
local groupCfg = GetGroupCfg(groupId)
return groupInfo.Unlock, groupCfg.PreGroupId
end
function XBfrtManager.GetEchelonInfoShowFightEventIds(echelonId)
local config = GetEchelonInfo(echelonId)
return config and config.ShowFightEventIds or {}
end
----------------------服务端协议begin----------------------
local function CheckFightTeamCondition(groupId, teamList)
local infoList = XBfrtManager.GetFightInfoIdList(groupId)
for k, echelonId in pairs(infoList) do
local team = teamList[k]
if not team then
return false
end
if not CheckTeamLimit(echelonId, team) then
return false
end
end
return true
end
local function CheckLogisticsTeamCondition(groupId, teamList)
local infoList = XBfrtManager.GetLogisticsInfoIdList(groupId)
if not infoList or not next(infoList) then
return true
end
for k, echelonId in pairs(infoList) do
local team = teamList[k]
if not team or not CheckTeamLimit(echelonId, team) then
return false
end
end
return true
end
function XBfrtManager.CheckTeam(groupId, fightTeamList, logisticsTeamList, cb)
if not CheckFightTeamCondition(groupId, fightTeamList) then
XUiManager.TipText("FightTeamConditionLimit")
return
end
if not CheckLogisticsTeamCondition(groupId, logisticsTeamList) then
XUiManager.TipText("LogisticsTeamConditionLimit")
return
end
local captainList = {}
local firstFightPosList = {}
local fightInfoIdList = XBfrtManager.GetFightInfoIdList(groupId)
for i, echelonId in ipairs(fightInfoIdList) do
local captainPos = XBfrtManager.GetTeamCaptainPos(echelonId, groupId, i)
if not XTool.IsNumberValid(fightTeamList[i] and fightTeamList[i][captainPos]) then
XUiManager.TipMsg(XUiHelper.GetText("BfrtNotCaptain", i))
return
end
tableInsert(captainList, captainPos)
local firstFightPos = XBfrtManager.GetTeamFirstFightPos(echelonId, groupId, i)
if not XTool.IsNumberValid(fightTeamList[i] and fightTeamList[i][firstFightPos]) then
XUiManager.TipMsg(XUiHelper.GetText("BfrtNotFirstFight", i))
return
end
tableInsert(firstFightPosList, firstFightPos)
end
XNetwork.Call(METHOD_NAME.BfrtTeamSetRequest, {
BfrtGroupId = groupId,
FightTeam = fightTeamList, --List<List<int /*characterId*/> /*characterId list*/>
LogisticsTeam = logisticsTeamList, --List<List<int /*characterId*/> /*characterId list*/>
CaptainPosList = captainList,
FirstFightPosList = firstFightPosList,
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
FightTeams[groupId] = fightTeamList
LogisticsTeams[groupId] = logisticsTeamList
XBfrtManager.InitTeamCaptainPos(true)
XBfrtManager.InitTeamFirstFightPos(true)
if cb then
cb()
end
end)
end
function XBfrtManager.AutoTeam(groupId)
local anyMemberInTeam = false
local fightTeamList = {}
local logisticsTeamList = {}
local sortTeamInfoList = {}
local fightInfoIdList = XBfrtManager.GetFightInfoIdList(groupId)
local stageIds = XBfrtManager.GetStageIdList(groupId)
for i, echelonId in ipairs(fightInfoIdList) do
local fightTeam = { 0, 0, 0 }
tableInsert(fightTeamList, fightTeam)
local echelonCfg = GetEchelonInfo(echelonId)
local teamInfo = {
Index = i,
RequireAbility = echelonCfg.RequireAbility,
NeedCharacter = echelonCfg.NeedCharacter,
Team = fightTeam,
StageId = stageIds[i],
}
tableInsert(sortTeamInfoList, teamInfo)
end
local logisticsInfoIdList = XBfrtManager.GetLogisticsInfoIdList(groupId)
for i, echelonId in ipairs(logisticsInfoIdList) do
local logisticsTeam = { 0, 0, 0 }
tableInsert(logisticsTeamList, logisticsTeam)
local echelonCfg = GetEchelonInfo(echelonId)
local teamInfo = {
Index = i,
RequireAbility = echelonCfg.RequireAbility,
NeedCharacter = echelonCfg.NeedCharacter,
Team = logisticsTeam,
StageId = stageIds[i],
}
tableInsert(sortTeamInfoList, teamInfo)
end
tableSort(sortTeamInfoList, function(a, b)
if a.RequireAbility ~= b.RequireAbility then
return a.RequireAbility > b.RequireAbility
end
return a.Index < b.Index
end)
local ownCharacters = XDataCenter.CharacterManager.GetOwnCharacterList()
tableSort(ownCharacters, function(a, b)
return a.Ability > b.Ability
end)
for _, teamInfo in pairs(sortTeamInfoList) do
if not next(ownCharacters) then break end
local characterLimitType = XFubenConfigs.GetStageCharacterLimitType(teamInfo.StageId)
local defaultCharacterType = XDataCenter.FubenManager.GetDefaultCharacterTypeByCharacterLimitType(characterLimitType)
for memberIndex = 1, teamInfo.NeedCharacter do
for index, character in ipairs(ownCharacters) do
-- if character.Ability >= teamInfo.RequireAbility then
local charType = XCharacterConfigs.GetCharacterType(character.Id)
if defaultCharacterType ~= XFubenConfigs.CharacterLimitType.All and defaultCharacterType ~= charType then
goto SELECT_CONTINUE
end
teamInfo.Team[memberIndex] = character.Id
tableRemove(ownCharacters, index)
anyMemberInTeam = true
break
-- end
:: SELECT_CONTINUE ::
end
end
end
return fightTeamList, logisticsTeamList, anyMemberInTeam
end
function XBfrtManager.GetChapterPassCount(chapterId)
local passCount = 0
local groupList = XBfrtManager.GetGroupList(chapterId)
for _, groupId in ipairs(groupList) do
if GroupInfos[groupId].Passed then
passCount = passCount + 1
end
end
return passCount
end
function XBfrtManager.GetGroupCount(chapterId)
local groupList = XBfrtManager.GetGroupList(chapterId)
return #groupList
end
function XBfrtManager.GetTeamCaptainPos(echelonId, groupId, stageIndex)
local captainPos = EchlonTeamPosDic[echelonId]
local preGroupId = XBfrtConfigs.GetBfrtPreGroupId(groupId)
if not captainPos and XTool.IsNumberValid(preGroupId) then
local stageIdList = XBfrtManager.GetStageIdList(preGroupId)
echelonId = stageIdList and stageIdList[stageIndex]
captainPos = echelonId and EchlonTeamPosDic[echelonId]
end
return captainPos or XBfrtConfigs.CAPTIAN_MEMBER_INDEX
end
function XBfrtManager.SetTeamCaptainPos(echelonId, captainPos)
EchlonTeamPosDic[echelonId] = captainPos
end
function XBfrtManager.SetServerTeamCaptainPos(echelonId, captainPos)
EchlonServerTeamPosDic[echelonId] = captainPos
end
function XBfrtManager.InitTeamCaptainPos(isClientToServerData)
if isClientToServerData then
for echelonId, captainPos in pairs(EchlonTeamPosDic) do
XBfrtManager.SetServerTeamCaptainPos(echelonId, captainPos)
end
return
end
for echelonId, captainPos in pairs(EchlonServerTeamPosDic) do
XBfrtManager.SetTeamCaptainPos(echelonId, captainPos)
end
end
---==========================================
--- 得到队伍首发位
--- 当首发位不为空时,直接返回首发位,否则返回默认首发位
---(因为服务器在之前只有队长位,后面区分了队长位与首发位,存在有队长位数据,没有首发位数据的情况)
---@return number
---==========================================
function XBfrtManager.GetTeamFirstFightPos(echelonId, groupId, stageIndex)
local firstFightPos = EchlonFirstFightDic[echelonId]
local preGroupId = XBfrtConfigs.GetBfrtPreGroupId(groupId)
if not firstFightPos and XTool.IsNumberValid(preGroupId) then
local stageIdList = XBfrtManager.GetStageIdList(preGroupId)
echelonId = stageIdList and stageIdList[stageIndex]
firstFightPos = echelonId and EchlonFirstFightDic[echelonId]
end
return firstFightPos or XBfrtConfigs.FIRST_FIGHT_MEMBER_INDEX
end
function XBfrtManager.SetTeamFirstFightPos(echelonId, firstFightPos)
EchlonFirstFightDic[echelonId] = firstFightPos
end
function XBfrtManager.SetServerTeamFirstFightPos(echelonId, firstFightPos)
EchlonServerFirstFightDic[echelonId] = firstFightPos
end
function XBfrtManager.InitTeamFirstFightPos(isClientToServerData)
if isClientToServerData then
for echelonId, firstFightPos in pairs(EchlonFirstFightDic) do
XBfrtManager.SetServerTeamFirstFightPos(echelonId, firstFightPos)
end
return
end
for echelonId, firstFightPos in pairs(EchlonServerFirstFightDic) do
XBfrtManager.SetTeamFirstFightPos(echelonId, firstFightPos)
end
end
function XBfrtManager.NotifyBfrtData(data)
BfrtData = data.BfrtData
InitGroupInfo()
InitChapterInfo()
InitFollowGroup()
InitTeamRecords()
end
----------------------服务端协议end----------------------
XBfrtManager.Init()
return XBfrtManager
end
XRpc.NotifyBfrtData = function(data)
XDataCenter.BfrtManager.NotifyBfrtData(data)
end