808 lines
32 KiB
Lua
808 lines
32 KiB
Lua
|
local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager")
|
|||
|
local XAwarenessChapter = require("XEntity/XAwareness/XAwarenessChapter")
|
|||
|
local XAwarenessTeam = require("XEntity/XAwareness/XAwarenessTeam")
|
|||
|
|
|||
|
--- 意识公约管理器
|
|||
|
XFubenAwarenessManagerCreator = function()
|
|||
|
local XFubenAwarenessManager = {}
|
|||
|
|
|||
|
XFubenAwarenessManager.CAPTIAN_MEMBER_INDEX = 1 -- 队长位置
|
|||
|
XFubenAwarenessManager.FIRSTFIGHT_MEMBER_INDEX = 1 -- 首发位置
|
|||
|
|
|||
|
local MEMBER_MAX_COUNT = 3 -- 队伍最大成员数
|
|||
|
|
|||
|
-- 自定义数据
|
|||
|
local ChapterIdList = nil
|
|||
|
local ChapterDataDict = nil -- 章节
|
|||
|
|
|||
|
local TeamDataDict = nil -- 队伍
|
|||
|
local LoadingData = nil
|
|||
|
local ChapterFirstPassTrigger = nil
|
|||
|
--- 服务器下发确认的数据
|
|||
|
local ChapterTeamRecords = {}
|
|||
|
local ChapterTeamRecordsDic = {} -- ChapterTeamRecords 的重定义字典
|
|||
|
local FinishStageIds = {}
|
|||
|
local FinishStageIdDic = {}
|
|||
|
|
|||
|
------ 战斗接口用的数据
|
|||
|
local FinishFightCb = nil
|
|||
|
local CloseLoadingCb = nil
|
|||
|
-- local MEMBER_INDEX_BY_ORDER = {[1] = 2, [2] = 1, [3] = 3} -- 面板上显示的位置(order) = 队伍中实际中的位置(index)
|
|||
|
local MEMBER_ORDER_BY_INDEX = {[1] = 2, [2] = 1, [3] = 3 } -- 队伍中实际中的位置(index) = 面板上显示的位置(order)
|
|||
|
local ChapterIdByStageId = nil -- {[stageId] = chapterId, ...}
|
|||
|
local FollowGroupDict = nil -- {[前置组id] = {后置组id, ...}, ...}
|
|||
|
|
|||
|
function XFubenAwarenessManager.Init()
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetChapterFirstPassTrigger()
|
|||
|
if ChapterFirstPassTrigger then
|
|||
|
local tempData = ChapterFirstPassTrigger
|
|||
|
ChapterFirstPassTrigger = nil
|
|||
|
return tempData
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 角色是否已在占领
|
|||
|
function XFubenAwarenessManager.CheckCharacterInOccupy(characterId)
|
|||
|
local chapterData
|
|||
|
for _, id in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
|||
|
chapterData = XFubenAwarenessManager.GetChapterDataById(id)
|
|||
|
if chapterData:GetCharacterId() == characterId then
|
|||
|
return true, id
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetChapterDataById(id)
|
|||
|
if not id then
|
|||
|
XLog.Error("XFubenAwarenessManager.GetChapterDataById函数参数id不能为空" .. tostring(id))
|
|||
|
return
|
|||
|
end
|
|||
|
if not ChapterDataDict then
|
|||
|
ChapterDataDict = {}
|
|||
|
end
|
|||
|
if not ChapterDataDict[id] then
|
|||
|
ChapterDataDict[id] = XAwarenessChapter.New(id)
|
|||
|
end
|
|||
|
return ChapterDataDict[id]
|
|||
|
end
|
|||
|
|
|||
|
-- 根据意识位拿chapter
|
|||
|
function XFubenAwarenessManager.GetChapterDataBySiteNum(siteNum)
|
|||
|
local chapterId = XFubenAwarenessManager.GetChapterIdList()[siteNum]
|
|||
|
return XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetCurrentChapterData()
|
|||
|
local idList = XFubenAwarenessManager.GetChapterIdList()
|
|||
|
for _, chapterId in ipairs(idList) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
if not chapterData:IsPass() then
|
|||
|
return chapterData
|
|||
|
end
|
|||
|
end
|
|||
|
return XFubenAwarenessManager.GetChapterDataById(idList[#idList])
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetChapterIdList()
|
|||
|
if XTool.IsTableEmpty(ChapterIdList) then
|
|||
|
ChapterIdList = {}
|
|||
|
for chapterId, v in pairs(XFubenAwarenessConfigs.GetAllConfigs(XFubenAwarenessConfigs.TableKey.AwarenessChapter)) do
|
|||
|
table.insert(ChapterIdList, chapterId)
|
|||
|
end
|
|||
|
table.sort(ChapterIdList, function(a, b)
|
|||
|
local chapterA = XFubenAwarenessManager.GetChapterDataById(a)
|
|||
|
local chapterB = XFubenAwarenessManager.GetChapterDataById(b)
|
|||
|
|
|||
|
return chapterA:GetCfg().Site < chapterB:GetCfg().Site
|
|||
|
end)
|
|||
|
end
|
|||
|
return ChapterIdList
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetAllChapterOccupyNum()
|
|||
|
local count = 0
|
|||
|
for _, chapterId in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
if chapterData:IsOccupy() then
|
|||
|
count = count + 1
|
|||
|
end
|
|||
|
end
|
|||
|
return count
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetChapterProgressTxt()
|
|||
|
local chapterData = XFubenAwarenessManager.GetCurrentChapterData()
|
|||
|
return CS.XTextManager.GetText("AssignChapterProgressTxt", chapterData:GetDesc())
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetCharacterOccupyChapterId(characterId)
|
|||
|
if characterId and characterId ~= 0 then
|
|||
|
for _, chapterId in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
if chapterData:GetCharacterId() == characterId then
|
|||
|
return chapterId
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
-- 检查该group是否有服务器记录过队伍数据
|
|||
|
function XFubenAwarenessManager.CheckChapterHadRecordTeam(chapterId)
|
|||
|
return ChapterTeamRecordsDic[chapterId]
|
|||
|
end
|
|||
|
|
|||
|
-- 检查该group是否有服务器记录过队伍数据
|
|||
|
function XFubenAwarenessManager.GetChapterTeamRecords()
|
|||
|
return ChapterTeamRecords
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetFinishStageIds()
|
|||
|
return FinishStageIds
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.CheckStageFinish(stageId)
|
|||
|
return FinishStageIdDic[stageId]
|
|||
|
end
|
|||
|
|
|||
|
-- 角色是否已在队伍中
|
|||
|
function XFubenAwarenessManager.CheckCharacterInTeam(characterId)
|
|||
|
for _, teamData in pairs(TeamDataDict) do
|
|||
|
if teamData:GetCharacterOrder(characterId) ~= nil then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
-- 该角色是否已有关卡进度 压制
|
|||
|
function XFubenAwarenessManager.CheckCharacterInMultiTeamLock(characterId, groupId)
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(groupId)
|
|||
|
local isIn, teamData, teamOrder = XFubenAwarenessManager.CheckCharacterInCurChapterTeam(characterId, groupId)
|
|||
|
|
|||
|
local stageList = chapterData:GetStageId()
|
|||
|
local stageId = stageList[teamOrder]
|
|||
|
|
|||
|
return XFubenAwarenessManager.CheckStageFinish(stageId)
|
|||
|
end
|
|||
|
|
|||
|
-- 角色是否已在该chapter的队伍中
|
|||
|
function XFubenAwarenessManager.CheckCharacterInCurChapterTeam(characterId, chapterId)
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
|
|||
|
for order, teamId in pairs(chapterData:GetTeamInfoId()) do
|
|||
|
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
if teamData:GetCharacterOrder(characterId) ~= nil then
|
|||
|
return true, teamData, order
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
-- 获取其他队伍的角色
|
|||
|
function XFubenAwarenessManager.GetOtherTeamCharacters(chapterId, srcTeamId)
|
|||
|
local otherTeamCharacters = {}
|
|||
|
for _, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
|||
|
if teamId ~= srcTeamId and TeamDataDict[teamId] then
|
|||
|
for i, member in ipairs(TeamDataDict[teamId]:GetMemberList()) do
|
|||
|
local characterId = member:GetCharacterId()
|
|||
|
if characterId and characterId ~= 0 then
|
|||
|
table.insert(otherTeamCharacters, { teamId, i, characterId })
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return otherTeamCharacters
|
|||
|
end
|
|||
|
|
|||
|
-- 获取某组里 角色对应的队伍编号
|
|||
|
function XFubenAwarenessManager.GetCharacterTeamOderMapByGroup(chapterId)
|
|||
|
local teamOrderMap = {}
|
|||
|
local teamIdMap = {}
|
|||
|
for i, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
|||
|
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
for _, memberData in ipairs(teamData:GetMemberList()) do
|
|||
|
if memberData:HasCharacter() then
|
|||
|
teamIdMap[memberData:GetCharacterId()] = teamId
|
|||
|
teamOrderMap[memberData:GetCharacterId()] = i
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return teamIdMap, teamOrderMap
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.SwapMultiTeamMember(aTeam, aPos, bTeam, bPos)
|
|||
|
local aMemberData = aTeam:GetMemberList()[aPos]
|
|||
|
local bMemberData = bTeam:GetMemberList()[bPos]
|
|||
|
local aTeamaPosCharId = aMemberData:GetCharacterId()
|
|||
|
local bTeambPosCharId = bMemberData:GetCharacterId()
|
|||
|
|
|||
|
if aTeamaPosCharId == bTeambPosCharId then
|
|||
|
bMemberData:SetCharacterId(0)
|
|||
|
else
|
|||
|
aMemberData:SetCharacterId(bTeambPosCharId)
|
|||
|
bMemberData:SetCharacterId(aTeamaPosCharId)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.SetTeamMember(teamId, targetOrder, characterId)
|
|||
|
local targetTeamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
targetTeamData:SetMember(targetOrder, characterId)
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetTeamDataById(id)
|
|||
|
if not TeamDataDict then
|
|||
|
TeamDataDict = {}
|
|||
|
end
|
|||
|
if not TeamDataDict[id] then
|
|||
|
TeamDataDict[id] = XAwarenessTeam.New(id)
|
|||
|
end
|
|||
|
return TeamDataDict[id]
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetTeamCharacterType(teamId)
|
|||
|
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
return teamData:GetCharacterType()
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.IsCharacterInTeamById(teamId, characterId)
|
|||
|
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
return teamData:GetCharacterOrder(characterId) ~= nil
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetChapterMemberCount(chapterId)
|
|||
|
local count = 0
|
|||
|
for _, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
|||
|
for _, member in ipairs(XFubenAwarenessManager.GetTeamDataById(teamId):GetMemberList()) do
|
|||
|
if member:HasCharacter() then
|
|||
|
count = count + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return count
|
|||
|
end
|
|||
|
|
|||
|
-- 一键上阵
|
|||
|
function XFubenAwarenessManager.AutoTeam(chapterId)
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
for k, stageId in pairs(chapterData:GetStageId()) do
|
|||
|
local isFinish = XFubenAwarenessManager.CheckStageFinish(stageId)
|
|||
|
if isFinish then -- 有完成进度
|
|||
|
XUiManager.TipError(CS.XTextManager.GetText("AutoTeamLimit"))
|
|||
|
return
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local ownCharacters = XDataCenter.CharacterManager.GetOwnCharacterList()
|
|||
|
table.sort(ownCharacters, function(a, b)
|
|||
|
return a.Ability > b.Ability
|
|||
|
end)
|
|||
|
-- 保留当前角色
|
|||
|
-- local curCharacters = XFubenAwarenessManager.GetOtherTeamCharacters(chapterId, nil)
|
|||
|
for _, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
|||
|
local targetTeamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
targetTeamData:ClearMemberList()
|
|||
|
end
|
|||
|
local count = 1
|
|||
|
local maxCount = #ownCharacters
|
|||
|
for _, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
|||
|
if count > maxCount then
|
|||
|
break
|
|||
|
end
|
|||
|
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
local needCount = teamData:GetNeedCharacter()
|
|||
|
for index = 1, needCount do
|
|||
|
local order = XFubenAwarenessManager.GetMemberOrderByIndex(index, needCount)
|
|||
|
local targetTeamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
|
|||
|
local stageId = teamId
|
|||
|
local characterLimitType = XFubenConfigs.GetStageCharacterLimitType(teamId)
|
|||
|
local defaultCharacterType = XDataCenter.FubenManager.GetDefaultCharacterTypeByCharacterLimitType(characterLimitType)
|
|||
|
|
|||
|
local i
|
|||
|
for charIndex, char in ipairs(ownCharacters) do
|
|||
|
local charType = XCharacterConfigs.GetCharacterType(char.Id)
|
|||
|
if defaultCharacterType ~= XFubenConfigs.CharacterLimitType.All and defaultCharacterType ~= charType then
|
|||
|
goto CONTINUE
|
|||
|
end
|
|||
|
XFubenAwarenessManager.SetTeamMember(teamId, order, char.Id)
|
|||
|
i = charIndex
|
|||
|
break
|
|||
|
:: CONTINUE ::
|
|||
|
end
|
|||
|
if i then
|
|||
|
table.remove(ownCharacters, i)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 是否满足关卡所需战力
|
|||
|
function XFubenAwarenessManager.IsAbilityMatch(targetStageId, charIdList)
|
|||
|
local chapterId = XFubenAwarenessConfigs.GetChapterIdByStageId(targetStageId)
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
local isMatch = false
|
|||
|
local teamIdList = chapterData:GetTeamInfoId()
|
|||
|
for i, stageId in pairs(chapterData:GetStageId()) do
|
|||
|
if stageId == targetStageId then
|
|||
|
isMatch = true
|
|||
|
local teamId = teamIdList[i]
|
|||
|
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
for order = 1, teamData:GetNeedCharacter() do
|
|||
|
local characterId = charIdList[order]
|
|||
|
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
|
|||
|
if character.Ability < teamData:GetRequireAbility() then
|
|||
|
isMatch = false
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
return isMatch
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.SetCloseLoadingCb(cb)
|
|||
|
CloseLoadingCb = cb
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.SetFinishFightCb(cb)
|
|||
|
FinishFightCb = cb
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetMemberOrderByIndex(index, maxCount)
|
|||
|
return maxCount > 1 and MEMBER_ORDER_BY_INDEX[index] or index
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
function XFubenAwarenessManager.CheckIsGroupLastStage(stageId)
|
|||
|
local chapterId = XFubenAwarenessConfigs.GetChapterIdByStageId(stageId)
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
local stageIdList = chapterData:GetStageId()
|
|||
|
return (stageIdList[#stageIdList] == stageId)
|
|||
|
end
|
|||
|
|
|||
|
------ 以下是在FubenManager注册的函数
|
|||
|
function XFubenAwarenessManager.InitStageInfo()
|
|||
|
local stageType = XDataCenter.FubenManager.StageType.Awareness
|
|||
|
for _, chapterId in pairs(XFubenAwarenessManager.GetChapterIdList()) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
for _, stageId in ipairs(chapterData:GetStageId()) do
|
|||
|
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
|||
|
stageInfo.IsOpen = true
|
|||
|
stageInfo.Type = stageType
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 设置进入loading界面用到的数据
|
|||
|
function XFubenAwarenessManager.SetEnterLoadingData(stageIndex, teamCharList, chapterData, isNextFight)
|
|||
|
LoadingData = {
|
|||
|
StageIndex = stageIndex,
|
|||
|
TeamCharList = teamCharList,
|
|||
|
ChapterData = chapterData,
|
|||
|
IsNextFight = isNextFight,
|
|||
|
}
|
|||
|
end
|
|||
|
|
|||
|
-- 打开战斗前loading界面
|
|||
|
function XFubenAwarenessManager.OpenFightLoading(stageId)
|
|||
|
if LoadingData.IsNextFight then
|
|||
|
XLuaUiManager.Open("UiAssignLoading", LoadingData)
|
|||
|
else
|
|||
|
XLuaUiManager.Open("UiLoading", LoadingType.Fight)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.CloseFightLoading()
|
|||
|
XLuaUiManager.Remove("UiAssignLoading")
|
|||
|
XLuaUiManager.Remove("UiLoading")
|
|||
|
if CloseLoadingCb then
|
|||
|
CloseLoadingCb()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.ShowReward(winData)
|
|||
|
-- 同步本地战斗后的关卡数据
|
|||
|
-- 关卡通关数据要先刷新,再在下一关for循环检测,最后再清除
|
|||
|
FinishStageIdDic[winData.StageId] = true
|
|||
|
|
|||
|
local index = nil
|
|||
|
local targetNextStageId = nil
|
|||
|
local chapterData = LoadingData.ChapterData
|
|||
|
local stageIdList = chapterData:GetStageId()
|
|||
|
for i = 1, #stageIdList, 1 do
|
|||
|
local stageId = stageIdList[i]
|
|||
|
if not XFubenAwarenessManager.CheckStageFinish(stageId) then
|
|||
|
index = i
|
|||
|
targetNextStageId = stageId
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 如果还有未完成的关
|
|||
|
if targetNextStageId then
|
|||
|
-- 且是连续挑战
|
|||
|
if LoadingData.IsNextFight then
|
|||
|
local isNextFight = true
|
|||
|
|
|||
|
local _, teamCharListOrg, captainPosList, firstFightPosList = XFubenAwarenessManager.TryGetFightTeamCharList(chapterData:GetId())
|
|||
|
local teamCharList = teamCharListOrg[index]
|
|||
|
|
|||
|
XFubenAwarenessManager.SetEnterLoadingData(index, teamCharList, chapterData, isNextFight)
|
|||
|
XDataCenter.FubenManager.EnterAwarenessFight(targetNextStageId, teamCharList, captainPosList[index], nil, nil, firstFightPosList[index])
|
|||
|
end
|
|||
|
else
|
|||
|
-- 如果没有未完成的关了 说明已经作战完毕 结算
|
|||
|
-- 并清除所有已完成的关卡数据
|
|||
|
for k, id in pairs(stageIdList) do
|
|||
|
FinishStageIdDic[id] = nil
|
|||
|
end
|
|||
|
|
|||
|
chapterData:SetFightCount(chapterData:GetFightCount() + 1)
|
|||
|
|
|||
|
-- 检测设置首通提示驻守trigger
|
|||
|
if chapterData:GetFightCount() == 1 then
|
|||
|
ChapterFirstPassTrigger = chapterData:GetId()
|
|||
|
end
|
|||
|
|
|||
|
XLuaUiManager.Remove("UiAwarenessDeploy")
|
|||
|
XLuaUiManager.Remove("UiAssignLoading")
|
|||
|
XLuaUiManager.Open("UiAwarenessSettleWin", winData)
|
|||
|
end
|
|||
|
|
|||
|
-- 结算完刷新下数据
|
|||
|
XFubenAwarenessManager.AwarenessGetDataRequest()
|
|||
|
end
|
|||
|
----------- 战斗接口 end-----------
|
|||
|
|
|||
|
-- 某角色某技能加成
|
|||
|
function XFubenAwarenessManager.GetSkillLevel(characterId, skillId)
|
|||
|
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
|
|||
|
if not character then return 0 end
|
|||
|
|
|||
|
local keys, levels = XFubenAwarenessManager.GetBuffKeysAndLevels()
|
|||
|
local npcTemplate = XCharacterConfigs.GetNpcTemplate(character.NpcId)
|
|||
|
local tragetCharacterType = npcTemplate.Type
|
|||
|
local targetSkilType = XCharacterConfigs.GetSkillType(skillId)
|
|||
|
local level = nil
|
|||
|
for _, key in pairs(keys) do
|
|||
|
local skillType = key % SKILLTYPE_BITS
|
|||
|
local characterType = (key - skillType) / SKILLTYPE_BITS
|
|||
|
if (characterType == tragetCharacterType or characterType == CHARACTERTYPE_ALL) and skillType == targetSkilType then
|
|||
|
level = levels[key]
|
|||
|
end
|
|||
|
end
|
|||
|
return level or 0
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetSkillLevelByCharacterData(character, skillId, assignChapterRecords)
|
|||
|
local keys = {}
|
|||
|
local levels = {}
|
|||
|
for _, v in ipairs(assignChapterRecords) do
|
|||
|
local chapterData = XAwarenessChapter.New(v.ChapterId)
|
|||
|
chapterData:SetCharacterId(v.CharacterId)
|
|||
|
|
|||
|
if chapterData:IsOccupy() then
|
|||
|
for _, key in ipairs(chapterData:GetBuffKeys()) do
|
|||
|
if not levels[key] then
|
|||
|
levels[key] = 1
|
|||
|
table.insert(keys, key)
|
|||
|
else
|
|||
|
levels[key] = levels[key] + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
local npcTemplate = XCharacterConfigs.GetNpcTemplate(character.NpcId)
|
|||
|
local tragetCharacterType = npcTemplate.Type
|
|||
|
local targetSkilType = XCharacterConfigs.GetSkillType(skillId)
|
|||
|
local level = nil
|
|||
|
for _, key in pairs(keys) do
|
|||
|
local skillType = key % SKILLTYPE_BITS
|
|||
|
local characterType = (key - skillType) / SKILLTYPE_BITS
|
|||
|
if (characterType == tragetCharacterType or characterType == CHARACTERTYPE_ALL) and skillType == targetSkilType then
|
|||
|
level = levels[key]
|
|||
|
end
|
|||
|
end
|
|||
|
return level or 0
|
|||
|
end
|
|||
|
|
|||
|
-- 参数keys: {角色类型*1000+技能类型, ...}
|
|||
|
-- 参数levels: {[key] = level, ...}
|
|||
|
function XFubenAwarenessManager.GetBuffDescListByKeys(keys, levels)
|
|||
|
local descList = {}
|
|||
|
local GetCareerName = XCharacterConfigs.GetCareerName
|
|||
|
local GetSkillTypeName = XCharacterConfigs.GetSkillTypeName
|
|||
|
local GetText = CS.XTextManager.GetText
|
|||
|
for _, key in ipairs(keys) do
|
|||
|
local skillType = key % SKILLTYPE_BITS
|
|||
|
local characterType = (key - skillType) / SKILLTYPE_BITS
|
|||
|
local level = levels and levels[key] or 1
|
|||
|
local memberTypeName = characterType == CHARACTERTYPE_ALL and "" or GetCareerName(characterType)
|
|||
|
local str = GetText("AssignSkillPlus", memberTypeName, GetSkillTypeName(skillType), level) -- 全体{0}成员{1}等级+{2}
|
|||
|
table.insert(descList, str)
|
|||
|
end
|
|||
|
return descList
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetBuffKeysAndLevels()
|
|||
|
local keys = {}
|
|||
|
local levels = {}
|
|||
|
for _, id in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(id)
|
|||
|
if chapterData:IsOccupy() then
|
|||
|
for _, key in ipairs(chapterData:GetBuffKeys()) do
|
|||
|
if not levels[key] then
|
|||
|
levels[key] = 1
|
|||
|
table.insert(keys, key)
|
|||
|
else
|
|||
|
levels[key] = levels[key] + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return keys, levels
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.SortKeys(keys)
|
|||
|
table.sort(keys, function(a, b)
|
|||
|
local skillTypeA = a % SKILLTYPE_BITS
|
|||
|
local characterTypeA = (a - skillTypeA) / SKILLTYPE_BITS
|
|||
|
local skillTypeB = b % SKILLTYPE_BITS
|
|||
|
local characterTypeB = (b - skillTypeB) / SKILLTYPE_BITS
|
|||
|
if skillTypeA ~= skillTypeB then
|
|||
|
return skillTypeA < skillTypeB
|
|||
|
end
|
|||
|
return characterTypeA < characterTypeB
|
|||
|
end)
|
|||
|
return keys
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetAllBuffList()
|
|||
|
local keys, levels = XFubenAwarenessManager.GetBuffKeysAndLevels()
|
|||
|
keys = XFubenAwarenessManager.SortKeys(keys)
|
|||
|
return XFubenAwarenessManager.GetBuffDescListByKeys(keys, levels)
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.TryGetFightTeamCharList(chapterId)
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
local teamList = {}
|
|||
|
local captainPosList = {}
|
|||
|
local firstFightPosList = {}
|
|||
|
local teamIdList = chapterData:GetTeamInfoId()
|
|||
|
local allTeamHasMember = (#teamIdList > 0)
|
|||
|
for i, teamId in ipairs(teamIdList) do
|
|||
|
teamList[i] = {}
|
|||
|
local count = 0
|
|||
|
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
captainPosList[i] = teamData:GetLeaderIndex()
|
|||
|
firstFightPosList[i] = teamData:GetFirstFightIndex()
|
|||
|
local memberList = teamData:GetMemberList()
|
|||
|
for _, memberData in ipairs(memberList) do
|
|||
|
local characterId = memberData:GetCharacterId() or 0
|
|||
|
teamList[i][memberData:GetIndex()] = characterId
|
|||
|
if characterId ~= 0 then
|
|||
|
count = count + 1
|
|||
|
end
|
|||
|
end
|
|||
|
if count < #memberList then
|
|||
|
allTeamHasMember = false
|
|||
|
end
|
|||
|
end
|
|||
|
return allTeamHasMember, teamList, captainPosList, firstFightPosList
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.IsRedPoint()
|
|||
|
for _, chapterId in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
if chapterData:CanReward() then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
-- 是否满足关卡所需战力
|
|||
|
function XFubenAwarenessManager.IsStagePass(stageId)
|
|||
|
local chapterId = XFubenAwarenessConfigs.GetChapterIdByStageId(stageId)
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
return chapterData:IsPass()
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.UpdateChapterRecords(chapterRecords)
|
|||
|
if not chapterRecords then
|
|||
|
return
|
|||
|
end
|
|||
|
for _, v in pairs(chapterRecords) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(v.ChapterId)
|
|||
|
chapterData:SetCharacterId(v.CharacterId)
|
|||
|
chapterData:SetRewarded(v.IsGetReward)
|
|||
|
chapterData:SetIsPassByServer(true)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.RefreshAwarenessInfo(data)
|
|||
|
local info = data.AwarenessInfo
|
|||
|
if XTool.IsTableEmpty(info) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
-- 章节占领角色数据
|
|||
|
local chapterRecords = info.ChapterRecords
|
|||
|
XFubenAwarenessManager.UpdateChapterRecords(chapterRecords)
|
|||
|
|
|||
|
-- 关卡通关数据
|
|||
|
FinishStageIdDic = {}
|
|||
|
local chapterChallengeRecords = info.ChallengeRecords
|
|||
|
for _, v in pairs(chapterChallengeRecords or {}) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(v.ChapterId)
|
|||
|
chapterData:SetFightCount(v.Count)
|
|||
|
if not XTool.IsTableEmpty(v.FinishStageIds) then
|
|||
|
for k, id in pairs(v.FinishStageIds) do
|
|||
|
-- 使用全局变量记录服务器发下来的数据
|
|||
|
-- 已通关的StageId
|
|||
|
FinishStageIdDic[id] = true
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 编队记录
|
|||
|
ChapterTeamRecords = info.TeamRecords
|
|||
|
ChapterTeamRecordsDic = {}
|
|||
|
for _, v in ipairs(ChapterTeamRecords or {}) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(v.ChapterId)
|
|||
|
local teamCount = #v.TeamInfoList
|
|||
|
local posCount = v.CaptainPosList and #v.CaptainPosList or 0
|
|||
|
local firstFightCount = v.FirstFightPosList and #v.FirstFightPosList or 0
|
|||
|
|
|||
|
for i, teamId in ipairs(chapterData:GetTeamInfoId()) do
|
|||
|
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
|||
|
local charaterIds = (i <= teamCount) and v.TeamInfoList[i] or nil
|
|||
|
local captainPos = (i <= posCount) and v.CaptainPosList[i] or XFubenAwarenessManager.CAPTIAN_MEMBER_INDEX
|
|||
|
local firstFightPos = (i <= firstFightCount) and v.FirstFightPosList[i] or XFubenAwarenessManager.FIRSTFIGHT_MEMBER_INDEX
|
|||
|
teamData:SetMemberList(charaterIds)
|
|||
|
teamData:SetLeaderIndex(captainPos)
|
|||
|
teamData:SetFirstFightIndex(firstFightPos)
|
|||
|
end
|
|||
|
-- 队伍字典
|
|||
|
ChapterTeamRecordsDic[v.ChapterId] = v
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-----------------协议----------
|
|||
|
-- Login登录后端初始化数据接口
|
|||
|
function XFubenAwarenessManager.NotifyLoginAwarenessInfo(data)
|
|||
|
if XTool.IsTableEmpty(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
XFubenAwarenessManager.RefreshAwarenessInfo(data)
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.AwarenessGetDataRequest(cb)
|
|||
|
XNetwork.Call("AwarenessGetDataRequest", nil, function(res)
|
|||
|
XFubenAwarenessManager.RefreshAwarenessInfo(res)
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end)
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.AwarenessSetTeamRequest(ChapterId, TeamList, captainPosList, firstFightPosList, cb)
|
|||
|
XNetwork.Call("AwarenessSetTeamRequest", { ChapterId = ChapterId, TeamList = TeamList, CaptainPosList = captainPosList, FirstFightPosList = firstFightPosList }, function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end)
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.AwarenessSetCharacterRequest(ChapterId, CharacterId, cb)
|
|||
|
XNetwork.Call("AwarenessSetCharacterRequest", { ChapterId = ChapterId, CharacterId = CharacterId }, function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(ChapterId)
|
|||
|
chapterData:SetCharacterId(CharacterId)
|
|||
|
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_REFRESH_CHRACTER_ABLIITY) -- 重新计算角色战力
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ASSIGN_SELECT_OCCUPY_END) -- 刷新驻守界面
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end)
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.AwarenessGetRewardRequest(ChapterId, cb)
|
|||
|
XNetwork.Call("AwarenessGetRewardRequest", { ChapterId = ChapterId }, function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(ChapterId)
|
|||
|
chapterData:SetRewarded(true)
|
|||
|
XUiManager.OpenUiObtain(res.RewardList or {})
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end)
|
|||
|
end
|
|||
|
|
|||
|
-- 重置关卡
|
|||
|
function XFubenAwarenessManager.AwarenessResetStageRequest(chapterId, stageId, cb)
|
|||
|
XNetwork.Call("AwarenessResetStageRequest", { ChapterId = chapterId, StageId = stageId }, function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
FinishStageIdDic[stageId] = nil
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end)
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetSkillPlusIdList()
|
|||
|
local list = {}
|
|||
|
for _, chapterId in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
|||
|
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
if chapterData:IsOccupy() then
|
|||
|
table.insert(list, chapterData:GetSkillPlusId())
|
|||
|
end
|
|||
|
end
|
|||
|
return list
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.GetSkillPlusIdListOther(assignChapterRecords)
|
|||
|
|
|||
|
local list = {}
|
|||
|
if assignChapterRecords == nil then
|
|||
|
return list
|
|||
|
end
|
|||
|
for _, v in ipairs(assignChapterRecords) do
|
|||
|
local chapterData = XAwarenessChapter.New(v.ChapterId)
|
|||
|
chapterData:SetCharacterId(v.CharacterId)
|
|||
|
|
|||
|
if chapterData:IsOccupy() then
|
|||
|
table.insert(list, chapterData:GetSkillPlusId())
|
|||
|
end
|
|||
|
end
|
|||
|
return list
|
|||
|
end
|
|||
|
|
|||
|
-- 2选1入口的红点
|
|||
|
function XFubenAwarenessManager.CheckIsShowRedPoint()
|
|||
|
for k, chapterId in pairs(XFubenAwarenessManager.GetChapterIdList()) do
|
|||
|
local chapter = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
|||
|
if chapter:IsRed() then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XFubenAwarenessManager.OpenUi(openCb)
|
|||
|
if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.FubenAwareness, true) then
|
|||
|
if openCb then
|
|||
|
XLuaUiManager.OpenWithCallback("UiAwarenessMain", openCb)
|
|||
|
else
|
|||
|
XLuaUiManager.Open("UiAwarenessMain")
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
XFubenAwarenessManager.Init()
|
|||
|
return XFubenAwarenessManager
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyLoginAwarenessInfo = function(data)
|
|||
|
XDataCenter.FubenAwarenessManager.NotifyLoginAwarenessInfo(data)
|
|||
|
end
|