local XMoeWarPreparationBaseData = require("XEntity/XMoeWar/XMoeWarPreparationBaseData") local XMoeWarPlayer = require("XEntity/XMoeWar/XMoeWarPlayer") local XMoeWarMatch = require("XEntity/XMoeWar/XMoeWarMatch") local XMoeWarVoteItem = require("XEntity/XMoeWar/XMoeWarVoteItem") local XMoeWarParkourStage = require("XEntity/XMoeWar/XMoeWarParkourStage") local XTeam = require("XEntity/XTeam/XTeam") local RankReqIntervalTime = 60 * 2 XMoeWarManagerCreator = function() local tableInsert = table.insert local tableSort = table.sort local stringFormat = string.format local mathFloor = math.floor local pairs = pairs local ipairs = ipairs local mathMax = math.max local CSXTextManagerGetText = CS.XTextManager.GetText local ActivityInfo = nil local DefaultActivityInfo = nil local CurMatchEntity = nil local Timer local CurMatchId = 0 local VoteDaily = 0 local ScreenRecordDic = {} local PlayerDic = {} local MatchDic = {} local MatchGroup = {} local VoteItemDic = {} local SessionList = {} local RankCache = {} local TabIndexCache = {} local ParkourStageDict = {} local GROUP_TAB_INDEX_KEY local StatusInFightChangeCache = false -- 是否在战斗中缓存 local PrepareTeamData = {} local ExcludeWrongAnswersDic = {} local ParkourTeam local ParkourActivityId local ParkourTicket = 0 --跑酷票数 local ParkourMaxTicket = 0 --跑酷每日获取最大票数 local ParkourTicketMagnification = 10 --票数倍率,对应Reward的Count local ParkourTeachStage local PlayerScreenRecordSize = CS.XGame.ClientConfig:GetInt("MoeWarPlayerScreenRecordSize") local MoeWarPlayerScreenRecordShowNumber = CS.XGame.ClientConfig:GetInt("MoeWarPlayerScreenRecordShowNumber") local MoeWarPreparationBaseData = XMoeWarPreparationBaseData.New() ---------------------本地接口 begin------------------ local function Init() local activityTemplates = XMoeWarConfig.GetActTemplates() local nowTime = XTime.GetServerNowTimestamp() for _, template in pairs(activityTemplates) do DefaultActivityInfo = XMoeWarConfig.GetActivityTemplateById(template.Id) local timeId = template.ActivityTimeId local startTime, endTime = XFunctionManager.GetTimeByTimeId(timeId) if nowTime > startTime and nowTime < endTime then if not ActivityInfo then ActivityInfo = XMoeWarConfig.GetActivityTemplateById(template.Id) end if Timer then XScheduleManager.UnSchedule(Timer) end Timer = XScheduleManager.ScheduleForever(function() if not XFunctionManager.CheckInTimeByTimeId(timeId) then CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_ACTIVITY_END) XScheduleManager.UnSchedule(Timer) end end, XScheduleManager.SECOND * 3) end end if ActivityInfo then for _, v in pairs(XMoeWarConfig.GetPlayers()) do PlayerDic[v.Id] = XMoeWarPlayer.New(v.Id) end for _, v in pairs(XMoeWarConfig.GetMatchCfgs()) do local match = XMoeWarMatch.New(v.Id) MatchDic[v.Id] = match if not MatchGroup[v.SessionId] then MatchGroup[v.SessionId] = {} end MatchGroup[v.SessionId][v.Type] = match if v.Type == XMoeWarConfig.MatchType.Publicity then SessionList[v.SessionId] = match end end GROUP_TAB_INDEX_KEY = stringFormat("%s_%s", XMoeWarConfig.KEY_GROUP_TAB_INDEX, XPlayer.Id) TabIndexCache = XSaveTool.GetData(GROUP_TAB_INDEX_KEY) or {} for _, v in pairs(XMoeWarConfig.GetVoteItems()) do VoteItemDic[v.No] = XMoeWarVoteItem.New(v.No) end end end local SetExcludeWrongAnswers = function(excludeWrongAnswers) ExcludeWrongAnswersDic = {} for _, excludeWrongAnswerIndex in ipairs(excludeWrongAnswers or {}) do ExcludeWrongAnswersDic[excludeWrongAnswerIndex] = true end end --返回剩余未恢复的支援次数 local GetLastNotRecoverCount = function() local assistanceCount = MoeWarPreparationBaseData:GetAssistanceCount() local maxCount = XMoeWarConfig.GetPreparationAssistanceSupportMaxCount() return mathMax(maxCount - assistanceCount, 0) end -- 状态改变直接回到主界面 local JudgeGotoMain = function(newMatchId, newActivityId) if not XLuaUiManager.IsUiLoad("UiMoeWarPreparation") then return end -- 如果玩家在战斗中 先做缓存 if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") then StatusInFightChangeCache = true return end local oldMatchId = MoeWarPreparationBaseData:GetMatchId() local oldActivityId = MoeWarPreparationBaseData:GetActivityId() if oldMatchId ~= newMatchId or oldActivityId ~= newActivityId then XUiManager.TipText("ActivityStateChange") XLuaUiManager.RunMain() XLuaUiManager.Open("UiMoeWarMain") end end local GetQuestionTemplate = function(questionId, desc, recruitMsgType, isPlayMsgAnima, isOverPlayMsgAnima) return { QuestionId = questionId, Desc = desc, RecruitMsgType = recruitMsgType, IsPlayMsgAnima = isPlayMsgAnima, IsOverPlayMsgAnima = false } end local InitParkourData = function() if not XTool.IsNumberValid(ParkourActivityId) then return end local stageList = XMoeWarConfig.GetParkourStageList(ParkourActivityId) for _, stageId in ipairs(stageList or {}) do local template = XMoeWarConfig.GetParkourStageTemplate(stageId) local item = XMoeWarParkourStage.New(template) ParkourStageDict[stageId] = item end ParkourMaxTicket = XMoeWarConfig.GetParkourDailyMaxReward(ParkourActivityId) local teachTemplate = XMoeWarConfig.GetParkourStageTemplate(XMoeWarConfig.GetParkourTeachStageId(ParkourActivityId)) ParkourTeachStage = XMoeWarParkourStage.New(teachTemplate) end ---------------------本地接口 end-------------------- local MoeWarManager = {} ---------------------选手与赛程接口 begin-------------------- function MoeWarManager.GetActivityInfo() return ActivityInfo end function MoeWarManager.GetActivityShopIds() return ActivityInfo.ShopIds end function MoeWarManager.GetPlayer(id) return PlayerDic[id] end function MoeWarManager.GetMySupportCount(playerId, matchId) -- matchId 为空则获取总支持数 local player = PlayerDic[playerId] if not player then return 0 else return player:GetMySupportCount(matchId) end end function MoeWarManager.GetMatch(sId) return SessionList[sId] end function MoeWarManager.GetVoteItem(id) return VoteItemDic[id] end function MoeWarManager.GetMatchById(Id) return MatchDic[Id] end function MoeWarManager.GetCurMatch() return CurMatchEntity end function MoeWarManager.GetCurMatchId() return CurMatchId end function MoeWarManager.GetVoteMatch(sId) if not MatchGroup[sId] then return end return MatchGroup[sId][XMoeWarConfig.MatchType.Voting] end function MoeWarManager.GetSessionList() return SessionList end function MoeWarManager.GetRankTabList() local list = XTool.Clone(XMoeWarConfig.GetRankGroups()) local playerList = {} for i, v in pairs(PlayerDic) do tableInsert(playerList, v) end local curMatch = MoeWarManager.GetCurMatch() tableSort(playerList, function(a, b) local isWeedOutA = curMatch and curMatch:IsPlayerWeedOut(a.Id) local isWeedOutB = curMatch and curMatch:IsPlayerWeedOut(b.Id) if isWeedOutA ~= isWeedOutB then return isWeedOutB elseif a.IsEliminate == b.IsEliminate then return a.Id < b.Id else return b.IsEliminate end end) for i, v in ipairs(playerList) do local info = { TagName = v:GetName(), RankType = XMoeWarConfig.RankType.Player, PlayerId = v.Id, HasSub = false, IsSub = true } tableInsert(list, info) end for k, v in pairs(list) do if v.IsSub then if list[k - 1].IsSub then v.SecondTagType = XMoeWarConfig.SubTagType.Mid else v.SecondTagType = XMoeWarConfig.SubTagType.Top end if list[k + 1] then if not list[k + 1].IsSub then if v.SecondTagType == XMoeWarConfig.SubTagType.Mid then v.SecondTagType = XMoeWarConfig.SubTagType.Btm else v.SecondTagType = XMoeWarConfig.SubTagType.All end end else if v.SecondTagType == XMoeWarConfig.SubTagType.Mid then v.SecondTagType = XMoeWarConfig.SubTagType.Btm else v.SecondTagType = XMoeWarConfig.SubTagType.All end end end end return list end function MoeWarManager.GetUserSupportPlayer(sId) local userSupportPlayer = 0 local pairListIndex = 0 local maxSupportCount = 0 local match = MoeWarManager.GetMatch(sId) for i, v in ipairs(match.PairList) do for _, playerId in ipairs(v.Players) do local count = XDataCenter.MoeWarManager.GetMySupportCount(playerId) if count > maxSupportCount then userSupportPlayer = playerId pairListIndex = i maxSupportCount = count end end end return userSupportPlayer, pairListIndex, maxSupportCount end function MoeWarManager.GetNextTabIndex(sType) local tabIndex = TabIndexCache[sType] or 0 local nextIndex = tabIndex % #XMoeWarConfig.GetGroups() + 1 TabIndexCache[sType] = nextIndex XSaveTool.SaveData(GROUP_TAB_INDEX_KEY, TabIndexCache) return nextIndex end ---------------------选手与赛程接口 end-------------------- ---------------------投票接口 begin-------------------- function MoeWarManager.NotifyMoeWarVoteScreenRecord(data) if not data then return end if MoeWarManager.IsSelectSkip() then return end for i = 1,#data.Records do local playerId = data.Records[i].TargetId if not ScreenRecordDic[playerId] then ScreenRecordDic[playerId] = XQueue.New() end if ScreenRecordDic[playerId]:Count() >= PlayerScreenRecordSize then ScreenRecordDic[playerId]:Dequeue() end ScreenRecordDic[playerId]:Enqueue(data.Records[i]) end end function MoeWarManager.NotifyMoeWarVoteShowChange(data) if not data or not CurMatchEntity then return end CurMatchEntity:UpdateInfo(data.Match) CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_UPDATE) end function MoeWarManager.NotifyMoeWarDailyReset(data) VoteDaily = 0 for _,player in pairs(PlayerDic) do for _,voteItem in pairs(VoteItemDic) do player:UpdateDailyVote(voteItem:GetVoteItemId(),0) end end end function MoeWarManager.SetIsSelectSkip(isSkip) XSaveTool.SaveData(string.format("%s_%s_%s",XMoeWarConfig.SKIP_KEY_PREFIX,XPlayer.Id,MoeWarManager.GetCurMatch():GetType()),isSkip) end function MoeWarManager.IsSelectSkip() local isSkip = XSaveTool.GetData(string.format("%s_%s_%s",XMoeWarConfig.SKIP_KEY_PREFIX,XPlayer.Id,MoeWarManager.GetCurMatch():GetType())) or false return isSkip end function MoeWarManager.GetDailyVoteCount() return VoteDaily end function MoeWarManager.GetScreenRecordByPlayerId(playerId) if ScreenRecordDic[playerId] and ScreenRecordDic[playerId]:Count() > 0 then return ScreenRecordDic[playerId]:Dequeue() end return nil end function MoeWarManager.ClearAllScreenRecord() for _,queue in pairs(ScreenRecordDic) do queue:Clear() end end function MoeWarManager:GetDefaultSelect() local match = MoeWarManager.GetCurMatch() local pairList = match:GetPairList() local player,index,maxCount = MoeWarManager.GetUserSupportPlayer(match:GetSessionId()) if maxCount > 0 then return index,false end local defaultSelectKey = string.format("%s_%s",XMoeWarConfig.DEFAULT_SELECT_KEY_PREFIX,tostring(XPlayer.Id)) local selectIndex = XSaveTool.GetData(defaultSelectKey) if match:GetSessionId() == XMoeWarConfig.SessionType.Game24In12 then if selectIndex then return selectIndex,false else return math.random(1,#pairList),true end else local lastPlayer,lastIndex,lastMaxCount = XDataCenter.MoeWarManager.GetUserSupportPlayer(match:GetSessionId() - 1) local lastPlayerEntity = MoeWarManager.GetPlayer(lastPlayer) if (lastPlayerEntity and lastPlayerEntity:GetIsEliminate()) or lastMaxCount == 0 then return math.random(1,#pairList),true else for i = 1,#pairList do for j = 1,#(pairList[i].Players) do if pairList[i].Players[j] == lastPlayer then return i,false end end end end end end function MoeWarManager:GetMatchPerGroupCount() local match = MoeWarManager.GetCurMatch() local sessionId = match:GetSessionId() if sessionId == XMoeWarConfig.SessionType.GameInAudition then return 9 elseif sessionId == XMoeWarConfig.SessionType.FirstRoundVoting then return 4 elseif sessionId == XMoeWarConfig.SessionType.FailWeekVotingUp then return 3 elseif sessionId == XMoeWarConfig.SessionType.FailWeekVotingDown then return 1 elseif sessionId == XMoeWarConfig.SessionType.Game6In3 then return 1 else return 1 end end function MoeWarManager.GetDefaultSelectGroup() local index,isRandom = MoeWarManager.GetDefaultSelect() local perGroupCount = MoeWarManager.GetMatchPerGroupCount() return (isRandom and { nil } or { math.ceil(index / perGroupCount) })[1] end --每次播放完弹幕动画清空缓存列表 function MoeWarManager.GetScreenRecord() return ScreenRecord end function MoeWarManager.UpdateDailyVoteCount(addCount) VoteDaily = VoteDaily + addCount end function MoeWarManager.IsInStatistics() return MoeWarManager.GetCurMatch():GetVoteEnd() and (not MoeWarManager.GetCurMatch():GetResultOut()) end ---------------------投票接口 end---------------------- ---------------------赛况同步 begin-------------------- function MoeWarManager.HandleActivityData(data) if not ActivityInfo or ActivityInfo.Id ~= data.ActivityNo then ActivityInfo = XMoeWarConfig.GetActivityTemplateById(data.ActivityNo) Init() end for _, matchData in ipairs(data.Matches) do local matchEntity = MatchDic[matchData.MatchId] matchEntity:UpdateInfo(matchData) if (matchEntity:GetIsEnd(true) and matchEntity:GetType() == XMoeWarConfig.MatchType.Publicity) or (matchEntity:GetNotOpen(true) and matchEntity:GetType() == XMoeWarConfig.MatchType.Voting) or matchEntity:GetInTime(true) then SessionList[matchEntity:GetSessionId()] = matchEntity end end for _, dailyRecord in ipairs(data.MyVoteItemDailyRecord) do local player = PlayerDic[dailyRecord.PlayerId] player:UpdateDailyVote(dailyRecord.ItemId,dailyRecord.MyVote) end CurMatchId = data.CurMatchId VoteDaily = data.VoteDaily CurMatchEntity = MatchDic[CurMatchId] for _, myVoteData in ipairs(data.MyVoteRecord) do PlayerDic[myVoteData.PlayerId]:UpdateMatchMyVote(myVoteData) end if CurMatchEntity:GetType() == XMoeWarConfig.MatchType.Publicity then for _,queue in pairs(ScreenRecordDic) do queue:Clear() end end CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_UPDATE) end ---------------------赛况同步 end-------------------- ---------------------赛事筹备 begin------------------ ----筹备界面begin function MoeWarManager.GetStagesAndOneReserveStage() return MoeWarPreparationBaseData:GetStagesAndOneReserveStage() end function MoeWarManager.GetPreparationAllOpenStageIdList() return MoeWarPreparationBaseData:GetAllOpenStageIdList() end function MoeWarManager.GetReserveStageTimeByIndex(index) return MoeWarPreparationBaseData:GetReserveStageTimeByIndex(index) end function MoeWarManager.IsOpenPreparationStageByIndex(index) local reserveStageTime = MoeWarManager.GetReserveStageTimeByIndex(index) local nowServerTime = XTime.GetServerNowTimestamp() return nowServerTime >= reserveStageTime end function MoeWarManager.IsPreparationGetRewardGears(gearId) return MoeWarPreparationBaseData:IsGetRewardGears(gearId) end function MoeWarManager.GetPreparationMatchOpenState(matchId) local nowServerTime = XTime.GetServerNowTimestamp() local timeId = XMoeWarConfig.GetPreparationMatchTimeId(matchId) local startTime, endTime = XFunctionManager.GetTimeByTimeId(timeId) local matchState if nowServerTime < startTime then matchState = XMoeWarConfig.MatchState.NotOpen elseif nowServerTime >= endTime then matchState = XMoeWarConfig.MatchState.Over else matchState = XMoeWarConfig.MatchState.Open end return matchState end function MoeWarManager.GetPreparationAllOpenStageCount() return MoeWarPreparationBaseData:GetAllOpenStageCount() end --获得已招募的角色列表 function MoeWarManager.GetAllOwnHelpersList() local helpersDic = MoeWarPreparationBaseData:GetAllHelpersDic() local helpersList = {} local helper local helperStatus for helperId in pairs(helpersDic) do helper = MoeWarPreparationBaseData:GetHelper(helperId) if helper:IsRecruitFinish() then tableInsert(helpersList, helperId) end end tableSort(helpersList, function(a, b) return a < b end) return helpersList end --获得单次送礼需要的数量 function MoeWarManager.GetOnceGiftAmount() local preparationActivityId = XMoeWarConfig.GetPreparationActivityIdInTime() return XTool.IsNumberValid(preparationActivityId) and XMoeWarConfig.GetPreparationActivityGiftAmount(preparationActivityId) or 1 end ----筹备界面end ----招募通讯begin function MoeWarManager.GetRecruitHelperStatus(helperId) return MoeWarPreparationBaseData:GetHelperStatus(helperId) end function MoeWarManager.GetRecruitHelperExpirationTime(helperId) return MoeWarPreparationBaseData:GetHelperExpirationTime(helperId) end function MoeWarManager.GetTotalQuestionCount(helperId) return MoeWarPreparationBaseData:GetTotalQuestionCount(helperId) end --当前通讯进度 function MoeWarManager.GetCurrQuestionCount(helperId) local finishQuestionCount = MoeWarManager.GetFinishQuestionCount(helperId) local answerRecords = MoeWarPreparationBaseData:GetAnswerRecords(helperId) local errorQuestionCount = 0 local questionId local questionType local answerId for _, answerRecord in ipairs(answerRecords) do questionId = answerRecord:GetQuestionId() questionType = XMoeWarConfig.GetPreparationQuestionType(questionId) answerId = answerRecord:GetAnswerId() if not answerRecord:QuestionIsRight() and XTool.IsNumberValid(answerId) and questionType == XMoeWarConfig.QuestionType.RandomQuestion then errorQuestionCount = errorQuestionCount + 1 end end return errorQuestionCount + finishQuestionCount end function MoeWarManager.GetRecruitQuestionIsRight(helperId, questionId) return MoeWarPreparationBaseData:QuestionIsRight(helperId, questionId) end function MoeWarManager.GetRecruitAnswerId(helperId, questionId) return MoeWarPreparationBaseData:GetAnswerId(helperId, questionId) end function MoeWarManager.GetFinishQuestionCount(helperId) return MoeWarPreparationBaseData:GetFinishQuestionCount(helperId) end function MoeWarManager.GetAnswerRecordsTemplate(helperId) return MoeWarPreparationBaseData:GetAnswerRecords(helperId) end function MoeWarManager.GetAssistanceCount() local nowServerTime = XTime.GetServerNowTimestamp() local effectId = MoeWarManager.GetSupportTakeEffectIdByEffectType(XMoeWarConfig.PreparationAssistanceEffectType.RecoveryTime) local recoveryTime = MoeWarPreparationBaseData:GetAssistanceRecoveryTime() local cd = XMoeWarConfig.GetPreparationAssistanceParam(effectId) local addCount = 0 local lastNotRecover = GetLastNotRecoverCount() local assistanceCount = MoeWarPreparationBaseData:GetAssistanceCount() for i = 1, lastNotRecover do local recoveryTimeTemp = recoveryTime + (i - 1) * cd if nowServerTime < recoveryTimeTemp then break else addCount = addCount + 1 end end return assistanceCount + addCount end function MoeWarManager.GetAssistanceRecoveryTime() local nowServerTime = XTime.GetServerNowTimestamp() local recoveryTime = MoeWarPreparationBaseData:GetAssistanceRecoveryTime() local effectId = MoeWarManager.GetSupportTakeEffectIdByEffectType(XMoeWarConfig.PreparationAssistanceEffectType.RecoveryTime) local lastNotRecover = GetLastNotRecoverCount() local cd = XMoeWarConfig.GetPreparationAssistanceParam(effectId) for i = 1, lastNotRecover do local recoveryTimeTemp = recoveryTime + (i - 1) * cd if nowServerTime < recoveryTimeTemp then return recoveryTimeTemp end end return 0 end --获得拥有的帮手对应的试玩角色Id列表 function MoeWarManager.GetPreparationOwnHelperRobotIdList() local helpersDic = MoeWarPreparationBaseData:GetAllHelpersDic() local robotIdList = {} local robotId for helperId, helper in pairs(helpersDic) do if helper:IsRecruitFinish() then robotId = XMoeWarConfig.GetMoeWarPreparationHelperRobotId(helperId) tableInsert(robotIdList, robotId) end end return robotIdList end function MoeWarManager.GetPreparationOwnHelperIdByRobotId(robotId) local helpersDic = MoeWarPreparationBaseData:GetAllHelpersDic() local robotIdTemp for helperId, helper in pairs(helpersDic) do if helper:IsRecruitFinish() then robotIdTemp = XMoeWarConfig.GetMoeWarPreparationHelperRobotId(helperId) if robotIdTemp == robotId then return helperId end end end return 0 end function MoeWarManager.GetAllQuestionTemplateByHelperId(helperId) local answerRecords = MoeWarManager.GetAnswerRecordsTemplate(helperId) local data = {} local questionType local questionId local isPlayMsgAnima = false for _, v in ipairs(answerRecords) do questionId = v:GetQuestionId() questionType = XMoeWarConfig.GetPreparationQuestionType(questionId) if questionType == XMoeWarConfig.QuestionType.RandomQuestion then --问题 tableInsert(data, 1, GetQuestionTemplate(questionId, XMoeWarConfig.GetPreparationQuestion(questionId), XMoeWarConfig.RecruitMsgType.OtherMsg, isPlayMsgAnima)) local answerId = v:GetAnswerId() if answerId ~= 0 then --我的回答 local recruitMsgType = v:QuestionIsRight() and XMoeWarConfig.RecruitMsgType.MyYes or XMoeWarConfig.RecruitMsgType.MyNo local myDesc = XMoeWarConfig.GetPreparationQuestionAnswer(questionId, answerId) tableInsert(data, 1, GetQuestionTemplate(questionId, myDesc, recruitMsgType, isPlayMsgAnima)) --回答回复 local replyDesc = v:QuestionIsRight() and XMoeWarConfig.GetPreparationQuestionRightReply(questionId) or XMoeWarConfig.GetPreparationQuestionWrongReply(questionId) tableInsert(data, 1, GetQuestionTemplate(questionId, replyDesc, XMoeWarConfig.RecruitMsgType.OtherMsg, isPlayMsgAnima)) tableInsert(data, 1, GetQuestionTemplate(questionId, "", XMoeWarConfig.RecruitMsgType.Line, isPlayMsgAnima)) end elseif questionType == XMoeWarConfig.QuestionType.RecruitRight or questionType == XMoeWarConfig.QuestionType.RecruitLose then tableInsert(data, 1, GetQuestionTemplate(questionId, XMoeWarConfig.GetPreparationQuestionChat(questionId), XMoeWarConfig.RecruitMsgType.OtherMsg, isPlayMsgAnima)) tableInsert(data, 1, GetQuestionTemplate(questionId, XMoeWarConfig.GetPreparationQuestionChatReply(questionId), XMoeWarConfig.RecruitMsgType.MyMsg, isPlayMsgAnima)) else tableInsert(data, 1, GetQuestionTemplate(questionId, XMoeWarConfig.GetPreparationQuestionChat(questionId), XMoeWarConfig.RecruitMsgType.OtherMsg, isPlayMsgAnima)) end end return data end function MoeWarManager.IsQuestionAllRight(helperId) local rightQuestionCount = MoeWarManager.GetFinishQuestionCount(helperId) local totalCount = XMoeWarConfig.GetMoeWarPreparationHelperTotalQuestionCount(helperId) return rightQuestionCount == totalCount end function MoeWarManager.SetHelperStatus(helperId, status) MoeWarPreparationBaseData:SetHelperStatus(helperId, status) end function MoeWarManager.IsExcludeWrongAnswer(answerIndex) return ExcludeWrongAnswersDic[answerIndex] or false end function MoeWarManager.CheckHelperRedPoint(helperId) local status = MoeWarPreparationBaseData:GetHelperStatus(helperId) return status == XMoeWarConfig.PreparationHelperStatus.Communicating end function MoeWarManager.CheckAllHelpersRedPoint() local helpersDic = MoeWarPreparationBaseData:GetAllHelpersDic() for helperId in pairs(helpersDic) do if MoeWarManager.CheckHelperRedPoint(helperId) then return true end end return false end function MoeWarManager.CheckAllOwnHelpersIsResetStatus() local ownHelpers = MoeWarPreparationBaseData:GetAllHelpersDic() for helperId in pairs(ownHelpers) do MoeWarManager.CheckIsResetHelperStatus(helperId) end end function MoeWarManager.CheckIsResetHelperStatus(helperId) local isExpired = MoeWarManager.IsHelperExpired(helperId) if isExpired then XDataCenter.MoeWarManager.SetHelperStatus(helperId, XMoeWarConfig.PreparationHelperStatus.NotCommunicating) end end --已招募的帮手是否过期 function MoeWarManager.IsHelperExpired(helperId) if not XTool.IsNumberValid(helperId) then return false end local nowServerTime = XTime.GetServerNowTimestamp() local expirationTime = XDataCenter.MoeWarManager.GetRecruitHelperExpirationTime(helperId) local status = MoeWarPreparationBaseData:GetHelperStatus(helperId) if expirationTime ~= 0 and nowServerTime >= expirationTime and status == XMoeWarConfig.PreparationHelperStatus.RecruitFinish then return true end return false end function MoeWarManager.GetMoodValue(helperId) return MoeWarPreparationBaseData:GetMoodValue(helperId) end function MoeWarManager.GetLastMoodValue(helperId) return MoeWarPreparationBaseData:GetLastMoodValue(helperId) end --获得赠礼可增加的心情值 function MoeWarManager.GetGiftAddMoodValue(helperId) local recoveryMood = XMoeWarConfig.GetPreparationHelperGiftRecoveryMood(helperId) local amount = MoeWarManager.GetOnceGiftAmount() local moodUpLimit = XMoeWarConfig.GetPreparationHelperMoodUpLimit(helperId) local curMood = MoeWarManager.GetMoodValue(helperId) local addMood = recoveryMood * amount return curMood + addMood > moodUpLimit and moodUpLimit - curMood or addMood end ----招募通讯end ----场外应援begin function MoeWarManager.GetSupportVoteItemCount(itemId) return MoeWarPreparationBaseData:GetVoteItemCount(itemId) end --返回当前支援类型生效的id function MoeWarManager.GetSupportTakeEffectIdByEffectType(effectType) local effectIdList = XMoeWarConfig.GetPreparationAssistanceEffectIdList() local ownVoteItemCount local effectTypeTemp local voteItemCount local voteItemId local effectLevel local takeEffectMaxlevel = 0 local supportTakeEffectId for _, effectId in ipairs(effectIdList) do effectTypeTemp = XMoeWarConfig.GetPreparationAssistanceEffectType(effectId) voteItemCount = XMoeWarConfig.GetPreparationAssistanceVoteItemCount(effectId) voteItemId = XMoeWarConfig.GetPreparationAssistanceVoteItemId(effectId) ownVoteItemCount = MoeWarManager.GetSupportVoteItemCount(voteItemId) effectLevel = XMoeWarConfig.GetPreparationAssistanceLevel(effectId) if effectTypeTemp == effectType and ownVoteItemCount >= voteItemCount and effectLevel >= takeEffectMaxlevel then takeEffectMaxlevel = effectLevel supportTakeEffectId = effectId end end return supportTakeEffectId end ----场外应援end ----选人界面begin function MoeWarManager.SetPrepareTeamData(teamData) PrepareTeamData = teamData end function MoeWarManager.GetPrepareTeamData() return XTool.IsTableEmpty(PrepareTeamData) and { 0, 0, 0 } or PrepareTeamData end function MoeWarManager.ClearPrepareTeamData() PrepareTeamData = {} end function MoeWarManager.GetPrepareOwnHelperId(charId) if XRobotManager.CheckIsRobotId(charId) then return MoeWarManager.GetPreparationOwnHelperIdByRobotId(charId) end local robotIdToChatId local ownHelpers = MoeWarPreparationBaseData:GetAllHelpersDic() local robotId for helperId in pairs(ownHelpers) do robotId = XMoeWarConfig.GetMoeWarPreparationHelperRobotId(helperId) robotIdToChatId = XRobotManager.GetCharacterId(robotId) if robotIdToChatId == charId then return helperId end end return 0 end ----选人界面end --萌战赛事筹备领取奖励 function MoeWarManager.RequestMoeWarPreparationGearReward(gearId, cb) local req = { GearId = gearId } XNetwork.Call("MoeWarPreparationGearRewardRequest", req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XUiManager.OpenUiObtain(res.RewardGoodsList) MoeWarPreparationBaseData:SetOverReceiveRewardGear(gearId) if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_MOE_WAR_PREPARATION_GEAR_REWARD) end) end --萌战赛事筹备通讯 --refreshCb:刷新答题界面回调 --receiveChatHandlerCb:播放问答动画回调 --currSelectContactBtnIndex:帮手对应的按钮下标 --setMsgListPanelHelperIdCb:设置当前通讯中的帮手id回调 --requestFailCb:请求失败回调 function MoeWarManager.RequestMoeWarPreparationHelperCommunicate(helperId, refreshCb, receiveChatHandlerCb, currSelectContactBtnIndex, setMsgListPanelHelperIdCb, requestFailCb) local req = { HelperId = helperId } if not XMoeWarConfig.GetPreparationHelperDefaultLock(helperId) then return end XNetwork.Call("MoeWarPreparationHelperCommunicateRequest", req, function(res) if res.Code ~= XCode.Success then if requestFailCb then requestFailCb() end XUiManager.TipCode(res.Code) return end if setMsgListPanelHelperIdCb then setMsgListPanelHelperIdCb(helperId) end local setHelperStatus = function() local helper = MoeWarPreparationBaseData:GetHelper(helperId) if helper:IsRecruitFinish() then MoeWarManager.SetHelperStatus(helperId, XMoeWarConfig.PreparationHelperStatus.RecruitFinishAndCommunicating) else MoeWarManager.SetHelperStatus(helperId, XMoeWarConfig.PreparationHelperStatus.Communicating) end end local setData = function() MoeWarPreparationBaseData:InsertQuestion(helperId, res.QuestionId) MoeWarPreparationBaseData:SetCurrQuestionId(helperId, res.QuestionId) SetExcludeWrongAnswers(res.ExcludeWrongAnswers) end local isPlayMsgAnima = false local status = MoeWarPreparationBaseData:GetHelperStatus(helperId) --不在通讯中状态 if status ~= XMoeWarConfig.PreparationHelperStatus.Communicating and status ~= XMoeWarConfig.PreparationHelperStatus.RecruitFinishAndCommunicating then --设置状态为通讯中并刷新答题界面 setHelperStatus() if refreshCb then refreshCb(helperId, currSelectContactBtnIndex) end --插入打招呼和问题 local data = {} local questionStartList = XMoeWarConfig.GetPreparationQuestionIdListByType(helperId, XMoeWarConfig.QuestionType.QuestionStart) for _, questionId in ipairs(questionStartList) do tableInsert(data, GetQuestionTemplate(questionId, XMoeWarConfig.GetPreparationQuestionChat(questionId), XMoeWarConfig.RecruitMsgType.OtherMsg, isPlayMsgAnima)) end tableInsert(data, GetQuestionTemplate(res.QuestionId, XMoeWarConfig.GetPreparationQuestion(res.QuestionId), XMoeWarConfig.RecruitMsgType.OtherMsg, isPlayMsgAnima)) --播放问答动画 if receiveChatHandlerCb then receiveChatHandlerCb(data) end --设置数据 setData() --刷新除答题界面外的其他界面(不中断问答动画) if refreshCb then refreshCb(helperId, currSelectContactBtnIndex, true) end else --正在通讯中状态,不播放问答动画,设置数据并刷新界面 setHelperStatus() setData() if refreshCb then refreshCb(helperId, currSelectContactBtnIndex) end end XEventManager.DispatchEvent(XEventId.EVENT_MOE_WAR_CHECK_RECRUIT_RED_POINT) end) end --萌战赛事筹备通讯答题 function MoeWarManager.RequestMoeWarPreparationHelperAnswer(helperId, answerId, refreshCb, receiveChatHandlerCb) local req = { HelperId = helperId, AnswerId = answerId } XNetwork.Call("MoeWarPreparationHelperAnswerRequest", req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end SetExcludeWrongAnswers({}) local preparationHelper = MoeWarPreparationBaseData:GetHelper(helperId) local questionId = MoeWarPreparationBaseData:GetCurrQuestionId(helperId) MoeWarPreparationBaseData:UpdateAnswerRecord(helperId, answerId, res.IsRight) if res.IsRight then MoeWarPreparationBaseData:AddOnceFinishQuestionCount(helperId) end local isPlayMsgAnima = false --回答错误播放动画 local replyDesc = res.IsRight and XMoeWarConfig.GetPreparationQuestionRightReply(questionId) or XMoeWarConfig.GetPreparationQuestionWrongReply(questionId) local recruitMsgType = res.IsRight and XMoeWarConfig.RecruitMsgType.MyYes or XMoeWarConfig.RecruitMsgType.MyNo local myDesc = XMoeWarConfig.GetPreparationQuestionAnswer(questionId, answerId) local data = {} tableInsert(data, GetQuestionTemplate(questionId, myDesc, recruitMsgType, isPlayMsgAnima)) tableInsert(data, GetQuestionTemplate(questionId, replyDesc, XMoeWarConfig.RecruitMsgType.OtherMsg, not res.IsRight)) tableInsert(data, GetQuestionTemplate(0, "", XMoeWarConfig.RecruitMsgType.Line, isPlayMsgAnima)) local isQuestionAllRight = MoeWarManager.IsQuestionAllRight(helperId) if res.NextQuestionId ~= 0 then --下个题目id,0表示没有题目了 MoeWarPreparationBaseData:InsertQuestion(helperId, res.NextQuestionId) tableInsert(data, GetQuestionTemplate(res.NextQuestionId, XMoeWarConfig.GetPreparationQuestion(res.NextQuestionId), XMoeWarConfig.RecruitMsgType.OtherMsg, isPlayMsgAnima)) else --已招募的角色不管是否全答对,状态都设为已招募 local status if preparationHelper:IsRecruitFinish() then status = XMoeWarConfig.PreparationHelperStatus.RecruitFinish else status = isQuestionAllRight and XMoeWarConfig.PreparationHelperStatus.RecruitFinish or XMoeWarConfig.PreparationHelperStatus.CommunicationEnd end MoeWarManager.SetHelperStatus(helperId, status) if receiveChatHandlerCb then local questionType = isQuestionAllRight and XMoeWarConfig.QuestionType.RecruitRight or XMoeWarConfig.QuestionType.RecruitLose local questionId = XMoeWarConfig.GetPreparationQuestionId(helperId, questionType) tableInsert(data, GetQuestionTemplate(questionId, XMoeWarConfig.GetPreparationQuestionChat(questionId), XMoeWarConfig.RecruitMsgType.OtherMsg, questionType == XMoeWarConfig.QuestionType.RecruitLose)) tableInsert(data, GetQuestionTemplate(questionId, XMoeWarConfig.GetPreparationQuestionChatReply(questionId), XMoeWarConfig.RecruitMsgType.MyMsg, isPlayMsgAnima)) end end if receiveChatHandlerCb then receiveChatHandlerCb(data) end if refreshCb then refreshCb() end if res.NextQuestionId == 0 then if isQuestionAllRight or preparationHelper:IsRecruitFinish() then preparationHelper:ResetData() else MoeWarPreparationBaseData:ClearAnswerRecords(helperId) end end MoeWarPreparationBaseData:SetCurrQuestionId(helperId, res.NextQuestionId) XEventManager.DispatchEvent(XEventId.EVENT_MOE_WAR_CHECK_RECRUIT_RED_POINT) end) end --萌战赛事筹备答题场外援助 function MoeWarManager.RequestMoeWarPreparationAssistance(helperId, cb) local req = { HelperId = helperId } XNetwork.Call("MoeWarPreparationAssistanceRequest", req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end SetExcludeWrongAnswers(res.ExcludeWrongAnswers) if cb then cb() end end) end --萌战赛事关卡扫荡 function MoeWarManager.RequestMoeWarPreparationHelperSweep(helperId, stageId) local req = { HelperId = helperId, StageId = stageId } XNetwork.Call("MoeWarPreparationHelperSweepRequest", req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XUiManager.OpenUiObtain(res.RewardGoodsList) end) end --萌战赛事赠送礼物 function MoeWarManager.RequestMoeWarPreparationHelperSendGift(helperId, receiveChatHandlerCb) local amount = MoeWarManager.GetOnceGiftAmount() local req = { HelperId = helperId, Amount = amount, --礼物数量 } XNetwork.Call("MoeWarPreparationHelperSendGiftRequest", req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local data = {} local thankId = XMoeWarConfig.GetPreparationHelperThankId(helperId) tableInsert(data, GetQuestionTemplate(0, XMoeWarConfig.GetThankText(thankId), XMoeWarConfig.RecruitMsgType.GiftThank, false)) if receiveChatHandlerCb then receiveChatHandlerCb(data) end end) end --推送萌战赛事筹备数据(进入服务器、活动重置、赛事阶段变更推送) function MoeWarManager.NotifyMoeWarPreparationData(data) JudgeGotoMain(data.Data.MatchId, data.Data.ActivityId) MoeWarPreparationBaseData:UpdateData(data.Data) CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_PREPARATION_UPDATE) end --萌战赛事筹备关卡变化 function MoeWarManager.NotifyMoeWarPreparationStage(data) MoeWarPreparationBaseData:UpdateStage(data.Stage) CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_PREPARATION_STAGE) end --萌战赛事筹备援助变化 function MoeWarManager.NotifyMoeWarPreparationAssistance(data) MoeWarPreparationBaseData:UpdateAssistance(data.Assistance) CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_PREPARATION_NOTIFY_ASSISTANCE) end --萌战赛事筹备应援道具变化 function MoeWarManager.NotifyMoeWarPreparationVoteItem(data) MoeWarPreparationBaseData:UpdateVoteItem(data.VoteItem) end --萌战招募成功推送 function MoeWarManager.NotifyMoeWarPreparationHelper(data) local helper = data.Helper local preparationHelper = MoeWarPreparationBaseData:GetHelper(helper.Id) if preparationHelper:GetStatus() ~= helper.Status then MoeWarManager.SetHelperStatus(helper.Id, helper.Status) end MoeWarPreparationBaseData:SetHelperExpirationTime(helper.Id, helper.ExpirationTime) preparationHelper:UpdateMoodValue(helper.MoodValue) CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_HELPER_NOTIFY) end --萌战赛事筹备每日重置 function MoeWarManager.NotifyMoeWarPreparationDailyReset(data) MoeWarPreparationBaseData:ClearGetRewardGears() CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_PREPARATION_DAILY_RESET) end ---------------------赛事筹备 end-------------------- --萌战排行榜请求 function MoeWarManager.RequestRank(rankType, playerId, cb) if not RankCache[rankType] then return end local cache = RankCache[rankType][playerId] if cache then local nowTime = XTime.GetServerNowTimestamp() if nowTime <= cache.RefreshTime + RankReqIntervalTime then if cb then cb(cache) end return end end local req = { RankType = rankType, PlayerId = playerId } XNetwork.Call("MoeWarOpenRankRequest", req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) if cb then cb({ RankingList = {} }) end return end local nowTime = XTime.GetServerNowTimestamp() local rankData = { RefreshTime = nowTime, UserRank = res.MyRankInfo, RankingList = res.RankList,} RankCache[rankType][playerId] = rankData if cb then cb(rankData) end end) end --萌战排行榜请求 function MoeWarManager.ClearCache() for _, v in pairs(XMoeWarConfig.RankType) do RankCache[v] = {} end end ---------------------活动相关 begin-------------------- function MoeWarManager.GetActivityStartTime() if DefaultActivityInfo then return XFunctionManager.GetStartTimeByTimeId(DefaultActivityInfo.ActivityTimeId) or 0 end return 0 end function MoeWarManager.GetActivityEndTime() if DefaultActivityInfo then return XFunctionManager.GetEndTimeByTimeId(DefaultActivityInfo.ActivityTimeId) or 0 end return 0 end function MoeWarManager.OnOpenMain() if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.MoeWar) then return end if not MoeWarManager.IsOpen() then XUiManager.TipText("MoeWarNotOpen") return end local isPlayedStory = XSaveTool.GetData(string.format("%s_%s","MoeWarPlayedStory",XPlayer.Id)) if isPlayedStory then XLuaUiManager.Open("UiMoeWarMain") else if ActivityInfo and XMovieConfigs.CheckMovieConfigExist(XMoeWarConfig.GetBeginStoryId()) then XDataCenter.MovieManager.PlayMovie(XMoeWarConfig.GetBeginStoryId(), function() XLuaUiManager.Open("UiMoeWarMain") XSaveTool.SaveData(string.format("%s_%s","MoeWarPlayedStory",XPlayer.Id),true) end, nil, nil, false) else XLog.Error("剧情不存在 MovieId:",ActivityInfo.BeginStoryId) XLuaUiManager.Open("UiMoeWarMain") end end end function MoeWarManager.IsOpen() if not ActivityInfo then return false end return XFunctionManager.CheckInTimeByTimeId(ActivityInfo.ActivityTimeId) end function MoeWarManager.OnActivityEnd() if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") then return end XUiManager.TipText("ActivityMainLineEnd") XLuaUiManager.RunMain() end function MoeWarManager.OpenVotePanel(index) local match = MoeWarManager.GetCurMatch() local key = string.format("%s_%s","MOE_WAR_VOTE_SHOW_MATCH_SCENE",tostring(XPlayer.Id)) local isShowMatchPanel = XSaveTool.GetData(key) if match and match:GetSessionId() == XMoeWarConfig.SessionType.GameInAudition and match:GetType() == XMoeWarConfig.MatchType.Voting then if not isShowMatchPanel then XLuaUiManager.Open("UiMoeWarGroupList") else XLuaUiManager.Open("UiMoeWarVote",index) end else XLuaUiManager.Open("UiMoeWarVote", index) end end function MoeWarManager.GetActivityChapter() local chapters = {} if MoeWarManager.IsOpen() then local temp = {} local template = MoeWarManager.GetActivityInfo() temp.Id = template.Id temp.Name = template.Name temp.Background = template.Background temp.Type = XDataCenter.FubenManager.ChapterType.MoeWar tableInsert(chapters, temp) end return chapters end function MoeWarManager.RequestShare(playerId,cb) local req = {PlayerId = playerId} XNetwork.Call("MoeWarShareRequest", req, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 战斗结束后判断是否跳到主界面 function MoeWarManager.JudgeGotoMainWhenFightOver() if not XLuaUiManager.IsUiLoad("UiMoeWarPreparation") then StatusInFightChangeCache = false return end if not StatusInFightChangeCache then return false end StatusInFightChangeCache = false XUiManager.TipText("ActivityStateChange") XLuaUiManager.RunMain() XLuaUiManager.Open("UiMoeWarMain") end ---------------------活动相关 end-------------------- ---------------------任务相关 begin-------------------- function MoeWarManager.GetTaskListByType(type,groupId) local taskList = {} local sortList = {} if type == XMoeWarConfig.TaskType.Daily then taskList = XDataCenter.TaskManager.GetMoeWarDailyTaskList() else taskList = XDataCenter.TaskManager.GetMoeWarNormalTaskList() end for id,task in pairs(taskList) do local config = XTaskConfig.GetTaskCfgById(task.Id) if config.GroupId == groupId then tableInsert(sortList,task) end end return sortList end function MoeWarManager.CheckTaskRedPoint(type,groupId) local taskList = MoeWarManager.GetTaskListByType(type,groupId) for _,task in pairs(taskList) do if XDataCenter.TaskManager.CheckTaskAchieved(task.Id) then return true end end return false end ---------------------任务相关 end-------------------- ---------------------场景动画相关 begin-------------------- --public class XMoeWarPlayerPair <==> pairInfo --{ -- public int WinnerId; -- public int SecondId; -- public List Players = new List(); --} function MoeWarManager.EnterAnimation(pairInfo, matchEntity, closeCallback) local winnerIndex = 0 local animGroupIds = {} local match = matchEntity or XDataCenter.MoeWarManager.GetCurMatch() local sessionId = match:GetSessionId() for index, playerId in ipairs(pairInfo.Players) do local animGroupId if XTool.IsNumberValid(playerId) then local player = MoeWarManager.GetPlayer(playerId) if playerId == pairInfo.WinnerId then winnerIndex = index animGroupId = player:GetWinAnimGroupId(sessionId) elseif playerId == pairInfo.SecondId then animGroupId = player:GetSecondAnimGroupId(sessionId) else animGroupId = player:GetLoseAnimGroupId(sessionId) end tableInsert(animGroupIds, animGroupId) end end if not XTool.IsNumberValid(winnerIndex) then XLog.Error("MoeWarManager.EnterAnimation error: 萌战动画播放错误,找不到胜利者,pairInfo:", pairInfo) return end XLuaUiManager.Open("UiMoeWarAnimation", animGroupIds, winnerIndex, closeCallback, pairInfo.Players, match) end ---------------------场景动画相关 end-------------------- ---------------------通用 begin-------------------- function MoeWarManager.CheckRespondItemIsMax(isShow) local match = XDataCenter.MoeWarManager.GetCurMatch() if not match then return false end --公示期不弹出提示框 if not isShow then local matchType = match:GetType() local session = match:GetSessionId() if matchType ~= XMoeWarConfig.MatchType.Voting then return false end end local itemId = XDataCenter.ItemManager.ItemId.MoeWarRespondItemId local itemMaxCount = XDataCenter.ItemManager.GetMaxCount(itemId) local itemCount = XDataCenter.ItemManager.GetCount(itemId) if itemCount == itemMaxCount then local itemName = XDataCenter.ItemManager.GetItemName(itemId) local title = CSXTextManagerGetText("MoeWarRespondItemMaxTitle", itemName) local content = CSXTextManagerGetText("MoeWarRespondItemMaxDesc", itemName) local sureCallback = function() XLuaUiManager.Open("UiMoeWarVote") end XUiManager.DialogTip(title, content, nil, nil, sureCallback, {sureText = CSXTextManagerGetText("MoeWarGoToVote")}) return true end return false end --region ------------------跑酷相关 start------------------- --============================== ---@desc 跳转到跑酷小游戏 --============================== function MoeWarManager.JumpToParkour() if not XTool.IsNumberValid(ParkourActivityId) then XUiManager.TipText("FubenRepeatNotInActivityTime") return end if not MoeWarManager.ParkourIsOpen() then XUiManager.TipText("FubenRepeatNotInActivityTime") return end XLuaUiManager.Open("UiMoeWarParkourMain") end --============================== ---@desc 跑酷关卡列表 ---@return table --============================== function MoeWarManager.GetParkourStageList() local list = {} for _, stage in pairs(ParkourStageDict) do tableInsert(list, stage) end tableSort(list, function(a, b) return a:GetId() < b:GetId() end) return list end --============================== ---@desc 获取关卡数据类 ---@stageId 关卡Id ---@return @Class XMoeWarParkourStage --============================== function MoeWarManager.GetStageById(stageId) if not XTool.IsNumberValid(stageId) then return end if stageId == XMoeWarConfig.GetParkourTeachStageId(ParkourActivityId) then return ParkourTeachStage end return ParkourStageDict[stageId] end --============================== ---@desc 跑酷活动开启时间 ---@return number --============================== function MoeWarManager.GetParkourStartTime() return XMoeWarConfig.GetParkourStartTime(ParkourActivityId) end --============================== ---@desc 跑酷活动关闭时间 ---@return number --============================== function MoeWarManager.GetParkourEndTime() return XMoeWarConfig.GetParkourEndTime(ParkourActivityId) end --============================== ---@desc 跑酷奖励Id ---@return number --============================== function MoeWarManager.GetParkourRewardId() return XMoeWarConfig.GetParkourRewardId(ParkourActivityId) or 0 end --============================== ---@desc 跑酷开启 ---@return boolean --============================== function MoeWarManager.ParkourIsOpen() local timeOfNow = XTime.GetServerNowTimestamp() local timeOfBgn = MoeWarManager.GetParkourStartTime() local timeOfEnd = MoeWarManager.GetParkourEndTime() return timeOfNow >= timeOfBgn and timeOfNow <= timeOfEnd end --============================== ---@desc 跑酷角色列表 ---@roleType 角色类型 1.泛用 2.独域 ---@return table --============================== function MoeWarManager.GetOwnHelperId(roleType) local list = MoeWarManager.GetAllOwnHelpersList() if not XTool.IsNumberValid(roleType) then return list end local tmpList = {} for _, helperId in ipairs(list) do local robotId = XMoeWarConfig.GetMoeWarPreparationHelperRobotId(helperId) local type = XRobotManager.GetRobotCharacterType(robotId) if type == roleType then tableInsert(tmpList, helperId) end end return tmpList end --============================== ---@desc 检查助手是否已经招募 ---@helperId 助手Id ---@return boolean --============================== function MoeWarManager.CheckHelperIsOwn(helperId) if not XTool.IsNumberValid(helperId) then return false end local helperDic = MoeWarPreparationBaseData:GetAllHelpersDic() return helperDic[helperId] and true or false end --============================== ---@desc 代理FubenManager的胜利结算界面 ---@winData 战斗胜利数据 ---@playEndStory 代理FubenManager的胜利结算界面 --============================== function MoeWarManager.ShowReward(winData, playEndStory) XLuaUiManager.Open("UiMoeWarParkourSettle", winData) end function MoeWarManager.GetParkourTeam() local teamId = XMoeWarConfig.KEY_PARKOUR_TEAM..XPlayer.Id.."_MoeWarManager" ParkourTeam = ParkourTeam or XTeam.New(teamId) return ParkourTeam end function MoeWarManager.ClearParkourTeam() if not ParkourTeam then return end ParkourTeam:Clear() end --============================== ---@desc 当日票数限制 ---@return number --============================== function MoeWarManager.GetParkourTicket() return (ParkourMaxTicket - ParkourTicket) * ParkourTicketMagnification end --============================== ---@desc 刷新票数 ---@tickets 票数 --============================== function MoeWarManager.RefreshParkourTicket(tickets) ParkourTicket = tickets end --============================== ---@desc 进跑酷战斗前,更新历史心情值,方便结算计算心情改变值 ---@helperId 帮手Id --============================== function MoeWarManager.RefreshLastMoodValue(helperId) if not XTool.IsNumberValid(helperId) then return end local helper = MoeWarPreparationBaseData:GetHelper(helperId) helper:UpdateMoodValue(helper.MoodValue) end --============================== ---@desc 跑酷阶段转换 --============================== function MoeWarManager.OnPreparationDataUpdate() -- 通过PopTheOpen打开,须一级一级关闭,注意顺序 local needCloseUiList = { "UiMoeWarParkourPerson", "UiMoeWarParkourPrepare", "UiMoeWarParkourMain" } for _, uiName in ipairs(needCloseUiList) do if XLuaUiManager.IsUiShow(uiName) then XLuaUiManager.Close(uiName) end end XUiManager.TipText("MoeWarParkourQuit") end --============================== ---@desc 跳转到跑酷教学关卡 --============================== function MoeWarManager.JumpToTeach() XLuaUiManager.Open("UiMoeWarParkourPrepare", ParkourTeachStage) end --============================== ---@desc 跑酷教学关关卡Id ---@return number --============================== function MoeWarManager.GetParkourTeachStageId() return XMoeWarConfig.GetParkourTeachStageId(ParkourActivityId) end --============================== ---@desc 刷新跑酷数据,登录下发 ---@data NotifyMoeWarParkourData --============================== function MoeWarManager.NotifyMoeWarParkourData(data) ParkourActivityId = data.ActivityId ParkourTicket = data.DailyReward InitParkourData() local list = data.StageDataList for _, stageData in ipairs(list or {}) do local stageId = stageData.StageId local stage = ParkourStageDict[stageId] if stage then stage:RefreshAllTimeHigh(stageData.MaxScore) end end CsXGameEventManager.Instance:Notify(XEventId.EVENT_MOE_WAR_PARKOUR_UPDATE) end --endregion------------------跑酷相关 finish------------------ --region ------------------铭牌商店相关 start------------------- --============================== ---@desc 获取当前角色的铭牌列表 ---@shopType 角色类型 ---@return table --============================== function MoeWarManager.GetMoeWarItemList(shopType) local nameplateList local cfgList = XMoeWarConfig.GetMoeWarNameplateList() if not XTool.IsNumberValid(shopType) then nameplateList = {} for _, cfg in pairs(cfgList) do for _, nId in ipairs(cfg.NameplateId) do table.insert(nameplateList, nId) end end else local cfg = cfgList[shopType] if not cfg then return {} end nameplateList = cfg.NameplateId end local sortTmp = { [true] = 2, [false] = 1 } tableSort(nameplateList, function(a, b) local unlockA = XDataCenter.MoeWarManager.CheckHaveNameplateById(a) local unlockB = XDataCenter.MoeWarManager.CheckHaveNameplateById(b) if unlockA ~= unlockB then return sortTmp[unlockA] < sortTmp[unlockB] end return a < b end) return nameplateList end --============================== ---@desc 判断名牌是否解锁 ---@nameplateId 铭牌Id ---@return boolean --============================== function MoeWarManager.CheckHaveNameplateById(nameplateId) local list = XDataCenter.MedalManager.GetNameplateGroupList() local unlockDict = {} for _, group in ipairs(list) do local id = group:GetNameplateId() unlockDict[id] = true local preId = XMoeWarConfig.GetPreNameplateId(id) while XTool.IsNumberValid(preId) do unlockDict[preId] = true preId = XMoeWarConfig.GetPreNameplateId(preId) end end return unlockDict[nameplateId] or false end --============================== ---@desc 商店购买物品 ---@itemId 铭牌Id ---@cb 回调 --============================== function MoeWarManager.BuyNameplate(itemId, cb) XNetwork.Call("MoeWarNameplateStoreBuyRequest", { NameplateId = itemId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end --endregion------------------铭牌商店相关 finish------------------ ---------------------通用 begin-------------------- XEventManager.AddEventListener(XEventId.EVENT_LOGIN_DATA_LOAD_COMPLETE, Init) return MoeWarManager end ---------------------(服务器推送)begin------------------ XRpc.NotifyMoeWarActivityData = function(data) XDataCenter.MoeWarManager.HandleActivityData(data) end XRpc.NotifyMoeWarPreparationData = function(data) XDataCenter.MoeWarManager.NotifyMoeWarPreparationData(data) end XRpc.NotifyMoeWarPreparationStage = function(data) XDataCenter.MoeWarManager.NotifyMoeWarPreparationStage(data) end XRpc.NotifyMoeWarVoteRecord = function(data) XDataCenter.MoeWarManager.NotifyMoeWarVoteScreenRecord(data) end XRpc.NotifyMoeWarVoteShowChange = function(data) XDataCenter.MoeWarManager.NotifyMoeWarVoteShowChange(data) end XRpc.NotifyMoeWarDailyReset = function(data) XDataCenter.MoeWarManager.NotifyMoeWarDailyReset(data) end XRpc.NotifyMoeWarPreparationAssistance = function(data) XDataCenter.MoeWarManager.NotifyMoeWarPreparationAssistance(data) end XRpc.NotifyMoeWarPreparationVoteItem = function(data) XDataCenter.MoeWarManager.NotifyMoeWarPreparationVoteItem(data) end XRpc.NotifyMoeWarPreparationHelper = function(data) XDataCenter.MoeWarManager.NotifyMoeWarPreparationHelper(data) end XRpc.NotifyMoeWarPreparationDailyReset = function(data) XDataCenter.MoeWarManager.NotifyMoeWarPreparationDailyReset(data) end XRpc.NotifyMoeWarParkourData = function(data) XDataCenter.MoeWarManager.NotifyMoeWarParkourData(data) end ---------------------(服务器推送)end--------------------