--[[ 势力驻地 ]] local GuildParty_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') -------上林宴活动-------------- --开始计时的时间戳 local activityStartTimerStamp = 0; --区域id,读活动表中的 local guildPartyItemId = 0 --上林宴活动剩余时间 local leftActivityTotalTime = 0 --今日的活动类型 local todayActivityType = 0 --活动的计时器 local guildPartyTimeHandler = nil --自己是否在活动区域 local isSelfInActivityArea = false --上次请求经验雨 local ExpTimeInterval = 0 local leftReqExpTime = 0 --子活动剩余开始时间 local todaySubActivityStartTimeId = 0 local todaySubActivityEndTimeId = 0 local subActivityOpenTimeLeft = 0 local subActivityTimeSinceOpen = 0 local subActivityEndTimeLeft = 0 --最多三次,保底措施 local ReqActivityDataCount = 0 --活动轮数 local TotalSubActivityCount = 0 local SubActivityTime = 0 local SubActivityRefreshInterval = 0 local CurSubActivityIndex = 0 -------上林宴答题活动-------------- local curExamData = nil --0:状态,1:答题状态,2:刷题状态,3:答题结束 local curExamState = 0 local curExamStateLeftTime = 0 ---1:未作答,1:错误,2:失败 local curExamAnswerState = -1 --聊天信息 local guildParty_ExamChatList = {} -------上林宴对饮活动-------------- --对饮检测timer local drinkDistanceTimer = nil --0:状态,1:对饮状态,2:等待刷新,3:活动结束 local curDrinkState = 0 local curDrinkStateLeftTime = 0 local DrinkPairDistance = 0 -------上林宴收集活动-------------- --0:状态,1:收集状态,2:等待刷新,3:活动结束 local curCollectState = 0 local curCollectStateLeftTime = 0 local boxEntityData = nil local TotalCanGetBoxCount = 0 local IsHasBoxDisappearTip = false --容错的一个timer,再进入到势力驻地场景的时候,如果活动没开始,启动 local tempGuildPartyStartTimer = nil local GuildPartyToastGuideTime = DataSheetManager.ConstData:GetDataByID("GuildPartyToastGuideTime").IntValue function GuildParty_Controller.OnStartup() EventSystem.Regist(EventID.TimerWheelStartTimeOver, private.OnGuildPartyActivityStart) EventSystem.Regist(EventID.TimerWheelEndTimeOver, private.OnTimerWheelEndTimeOver) end function private.SetActivityRedPoint(timeId, activityId, timeIndex) if activityId == LuaConst.ActivityType.GuildParty then if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.GuildParty) and CTL.Activities.IsOpeningTime(LuaConst.ActivityType.GuildParty) and not LevelManager.IsGuildPartyLevel() then local time = MDL.RedPoint.GetRedPointTimeByType(MDL.RedPoint.RedPointType.GuildParty) if time and time > 0 and UTL.Time.IsTimestampSameDay(time) then EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.GuildParty, false) else EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.GuildParty, true) end else EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.GuildParty, false) end end end function private.OnTimerWheelEndTimeOver(timeId, activityId, timeIndex) if activityId == LuaConst.ActivityType.GuildParty then EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.GuildParty, false) end end function GuildParty_Controller.ExitGuildPartyScene() private.ExcuteActivityOver() end function GuildParty_Controller.CanGotoGuildPartyScene(isShowTip) if not MDL.Guild.IsHasGuild() then if isShowTip then CTL.Tips.AddTipsMsg(Const_IDS["IDS_ERRORCODE_1319_InfoCode_Guild_PlayerNotInGuild"]) end return false end --是否已经在驻地 if LevelManager.IsGuildPartyLevel() then if isShowTip then CTL.Tips.AddTipsMsg(Const_IDS["IDS_Guild_AlreadyInGuildMap"]) end return false end return true end function GuildParty_Controller.GoToGuildPartyScene() return CTL.MiniMap.GoToMap(MDL.GuildParty.GetGuildPartyMapId()) end function GuildParty_Controller.IsSelfInActivityArea() return isSelfInActivityArea end --进入区域监听 function private.EnterGuildPartyArea(levelItemId, TransContext) if TransContext.HasExecutors() then for __, entityId in TransContext.IterExecutors() do if entityId == BattleDataGetter.GetCurEntityID() then isSelfInActivityArea = true end end end end --离开区域监听 function private.ExitGuildPartyArea(levelItemId, TransContext) if TransContext.HasExecutors() then for __, entityId in TransContext.IterExecutors() do if entityId == BattleDataGetter.GetCurEntityID() then isSelfInActivityArea = false end end end end function private.OnGuildPartyActivityStart(timeId, activityId, timeIndex) if activityId == LuaConst.ActivityType.GuildParty then private.StopPartyStartFaultTolerant() private.OpenGuildPartyRemind() end end function private.OpenGuildPartyRemind() if LevelManager.IsGuildPartyLevel() and not MDL.Loading.GetIsLoadingState() then private.SetActivityRedPoint(nil, LuaConst.ActivityType.GuildParty, nil) --显示左侧活动栏 GuildParty_Controller.OpenGuildPartyActivityUI() elseif MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Guild) then private.SetActivityRedPoint(nil, LuaConst.ActivityType.GuildParty, nil) if CTL.Activities.IsInActivitySpecificLevel() then UIManager.OpenView(Const_UI_Lua.UIEnum.UIActivitiesRemind, {LuaConst.ActivityType.GuildParty}) else CTL.HomeMain.AddTownHomeDelayView(Const_UI_Lua.UIEnum.UIActivitiesRemind, {LuaConst.ActivityType.GuildParty}) end end end function GuildParty_Controller.OpenGuildPartyActivityEntry() UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIGuildActivityDrinkEntry, nil, "Guild/UIGuildActivityDrinkEntry") end function GuildParty_Controller.OpenGuildPartyDesc() local activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.GuildParty) local desc1,timeStr1 = UTL.Time.GetDateDescAndTime(activityData.Time_Table) activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.GuildParty_Exam) local desc2,timeStr2 = UTL.Time.GetDateDescAndTime(activityData.Time_Table) activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.GuildParty_Drink) local desc3,timeStr3 = UTL.Time.GetDateDescAndTime(activityData.Time_Table) activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.GuildParty_Collect) local desc4,timeStr4 = UTL.Time.GetDateDescAndTime(activityData.Time_Table) if GameAppInfo.IsJapanesePackage() then UIManager.OpenView(Const_UI_Lua.UIEnum.UICommonNoteView, {id = LuaConst.NoteID.GuildParty, params = {desc1 .. ""..timeStr1,desc2 ..""..timeStr2, desc3 .. ""..timeStr3, desc4 .. ""..timeStr4}}); else UIManager.OpenView(Const_UI_Lua.UIEnum.UICommonNoteView, {id = LuaConst.NoteID.GuildParty, params = {desc1 .. " "..timeStr1,desc2 .." "..timeStr2, desc3 .. " "..timeStr3, desc4 .. " "..timeStr4}}); end end function GuildParty_Controller.GoToGuildPartyArea() CTL.Task.OnStopAutoTask() local activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.GuildParty) local levelItem = LevelItemManager.GetLevelItem(activityData.MapID, activityData.NPCItemID) NotSyncBattleSetter.FindPathByLevelItem(activityData.MapID, levelItem) return true end function GuildParty_Controller.OpenGuildPartyActivityUI() if CTL.Activities.IsOpeningTime(LuaConst.ActivityType.GuildParty) then local isRed = MDL.Activities.GetRedPointStateByActivityID(LuaConst.ActivityType.GuildParty) if isRed == true then --进入上林宴,需要消除红点,并记录进入时间 MDL.RedPoint.OneTimeRedPointRequest(MDL.RedPoint.RedPointType.GuildParty, 1, true, LuaConst.ActivityType.GuildParty) end private.ExcuteActivityStart() elseif CTL.Activities.GetState(LuaConst.ActivityType.GuildParty, true) == CTL.Activities.ActivityState.NotOpen then local openToTime = CTL.Activities.GetTimeToOpen(LuaConst.ActivityType.GuildParty) private.StopPartyStartFaultTolerant() tempGuildPartyStartTimer = TimerUtil.Interval(private.GuildPartyStartFaultTolerant, openToTime+2, 1) end end function private.StopPartyStartFaultTolerant() if tempGuildPartyStartTimer then TimerUtil.Remove(tempGuildPartyStartTimer) tempGuildPartyStartTimer = nil end end function private.GuildPartyStartFaultTolerant() if guildPartyTimeHandler then logging.error(LTAG.ERROR, "势力聚会已经开始了,容错机制不应该执行") return end logging.error(LTAG.ERROR, "势力聚会未开始,执行了容错机制") private.ExcuteActivityStart() end function private.ExcuteActivityStart() local activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.GuildParty) guildPartyItemId = activityData.NPCItemID EventSystem.Regist(guildPartyItemId .. "_" .. LuaConst.LevelConditionType.Trigger_Enter, private.EnterGuildPartyArea) EventSystem.Regist(guildPartyItemId .. "_" .. LuaConst.LevelConditionType.Trigger_Exit, private.ExitGuildPartyArea) private.InitGuildPartyData() --请求一下界面数据 MDL.GuildParty.ReqGetActivityPanel() --界面左侧显示活动栏 EventSystem.Dispatch(EventID.UI_TownGuide_UpdateActivity) --开启活动,通知场景LevelItem开始工作 EventSystem.Dispatch(LuaConst.GlobalItemID .. "_" .. LuaConst.LevelConditionType.Global_ReceiveLogicEvent, LuaConst.GlobalItemID, nil, LuaConst.ConditionRecLogicEventType.GuildParty_Activity, 1) --开启活动的计时器,每秒检测 leftReqExpTime = ExpTimeInterval if not guildPartyTimeHandler then activityStartTimerStamp = UTL.Time.GetServerTimestamp(); guildPartyTimeHandler = TimerUtil.Interval( function() private.StartCheckActivityTime() end, 1, 0) end end function private.ExcuteActivityOver() private.StopPartyStartFaultTolerant() if guildPartyTimeHandler ~= nil then TimerUtil.Remove(guildPartyTimeHandler) guildPartyTimeHandler = nil isSelfInActivityArea = false end if guildPartyItemId > 0 then EventSystem.UnRegist(guildPartyItemId .. "_" .. LuaConst.LevelConditionType.Trigger_Enter, private.EnterGuildPartyArea) EventSystem.UnRegist(guildPartyItemId .. "_" .. LuaConst.LevelConditionType.Trigger_Exit, private.ExitGuildPartyArea) end if todayActivityType == LuaConst.ActivityType.GuildParty_Exam then private.ExcuteGuildPartyExamEnd(false) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Drink then private.ExcuteGuildPartyDrinkEnd(false) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Collect then private.ExcuteGuildPartyCollectEnd(false) end MDL.GuildParty.ClearGuildPartyData() end function private.StartCheckActivityTime() local hasPassedTime = UTL.Time.GetServerTimestamp() - activityStartTimerStamp activityStartTimerStamp = UTL.Time.GetServerTimestamp() leftActivityTotalTime = leftActivityTotalTime-hasPassedTime if leftActivityTotalTime <= 0 then --晚2秒防止次数计时和活动时间有误差导致活动未结束 if leftActivityTotalTime <= -2 then private.ExcuteActivityOver() EventSystem.Dispatch(LuaConst.GlobalItemID .. "_" .. LuaConst.LevelConditionType.Global_ReceiveLogicEvent, LuaConst.GlobalItemID, nil, LuaConst.ConditionRecLogicEventType.GuildParty_Activity, 0) EventSystem.Dispatch(EventID.UI_TownGuide_UpdateActivity) CTL.Notification.TryOpenNotificationTipPanel() end return end if isSelfInActivityArea then leftReqExpTime = leftReqExpTime - hasPassedTime if leftReqExpTime<=0 then leftReqExpTime = ExpTimeInterval if MDL.GuildParty.HasLeftExpCount() then MDL.GuildParty.ReqReceiveExpRain() end end else leftReqExpTime = ExpTimeInterval end local lastTime = subActivityEndTimeLeft subActivityEndTimeLeft = subActivityEndTimeLeft - hasPassedTime if lastTime >= 0 and subActivityEndTimeLeft < 0 then --活动结束 private.ExcuteSubActivityEnd() return end --已经结束,不再向下执行 if subActivityEndTimeLeft<=0 then return end lastTime = subActivityOpenTimeLeft subActivityOpenTimeLeft = subActivityOpenTimeLeft - hasPassedTime if lastTime >= 5 and subActivityOpenTimeLeft < 5 then private.ExcuteSubActivityOpenTip() end if lastTime>=1 and subActivityOpenTimeLeft<=0 then --活动开始 private.ExcuteSubActivityOpen(subActivityTimeSinceOpen<=0) return end --未开始不启动活动进行中的tick if subActivityOpenTimeLeft>=0 then return end subActivityTimeSinceOpen = subActivityTimeSinceOpen + hasPassedTime private.ExcuteSubActivityOpening(hasPassedTime) end --获得活动已经开启的时间s function GuildParty_Controller.GetTimeSinceOpen() return -UTL.Time.GetServerIntervalTimeByTimeId(todaySubActivityStartTimeId) end --设置今天的活动id,135,答题,246对饮,7宝箱 function private.InitTodayActivityId() local curWeekDay = UTL.Time.GetServerWeekday() local activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.GuildParty) for __, subActivityId in ipairs(activityData.childID) do local subActivityData = DataSheetManager.ActivityData:GetDataByID(subActivityId) for __, timeData in ipairs(subActivityData.Time_Table) do local refreshTimeData = DataSheetManager.TimeRefresh:GetDataByID(timeData.StartTime) if refreshTimeData.Timer == UTL.Time.TimeType.DAILY or (refreshTimeData.Timer == UTL.Time.TimeType.WEEKLY and refreshTimeData.Day == curWeekDay) then todaySubActivityStartTimeId = timeData.StartTime todaySubActivityEndTimeId = timeData.EndTime todayActivityType = subActivityId return end end end end function private.InitGuildPartyData() ExpTimeInterval = DataSheetManager.ConstData:GetDataByID("GuildPartyHookRewardIntervalTime").IntValue leftActivityTotalTime = CTL.Activities.GetTimeToClose(LuaConst.ActivityType.GuildParty) private.InitTodayActivityId() if todayActivityType == LuaConst.ActivityType.GuildParty_Exam then SubActivityTime = DataSheetManager.ConstData:GetDataByID("GuildPartyAnsweringTime").IntValue SubActivityRefreshInterval = DataSheetManager.ConstData:GetDataByID("GuildPartyAnsweringWaitingTime").IntValue TotalSubActivityCount = DataSheetManager.ConstData:GetDataByID("GuildPartyQuestionNum").IntValue elseif todayActivityType == LuaConst.ActivityType.GuildParty_Drink then SubActivityTime = DataSheetManager.ConstData:GetDataByID("GuildPartyToastSeekTime").IntValue SubActivityRefreshInterval = DataSheetManager.ConstData:GetDataByID("GuildPartyToastRestTime").IntValue TotalSubActivityCount = DataSheetManager.ConstData:GetDataByID("GuildPartyToastRound").IntValue elseif todayActivityType == LuaConst.ActivityType.GuildParty_Collect then SubActivityTime = DataSheetManager.ConstData:GetDataByID("GuildPartyTreasureSeekTime").IntValue SubActivityRefreshInterval = DataSheetManager.ConstData:GetDataByID("GuildPartyTreasureRestTime").IntValue TotalSubActivityCount = DataSheetManager.ConstData:GetDataByID("GuildPartyTreasureRound").IntValue TotalCanGetBoxCount = DataSheetManager.ConstData:GetDataByID("GuildPartyTreasureLootLimit").IntValue end local activityState = CTL.Activities.GetState(todayActivityType, true) if activityState == CTL.Activities.ActivityState.Opening then subActivityOpenTimeLeft = 1 subActivityTimeSinceOpen = GuildParty_Controller.GetTimeSinceOpen() subActivityEndTimeLeft = CTL.Activities.GetTimeToClose(todayActivityType) elseif activityState == CTL.Activities.ActivityState.NotOpen then curExamState, curDrinkState, curCollectState = 0, 0, 0 subActivityOpenTimeLeft = CTL.Activities.GetTimeToOpen(todayActivityType) subActivityTimeSinceOpen = 0 subActivityEndTimeLeft = CTL.Activities.GetTimeToClose(todayActivityType) elseif activityState == CTL.Activities.ActivityState.End then curExamState, curDrinkState, curCollectState = 3, 3, 3 subActivityOpenTimeLeft = 0 subActivityTimeSinceOpen = 0 subActivityEndTimeLeft = -1 end end function GuildParty_Controller.GetTodayActivityType() return todayActivityType end function GuildParty_Controller.GetGulildPartyLeftTime() return leftActivityTotalTime >= 0 and leftActivityTotalTime or 0 end function GuildParty_Controller.GetSubActivityTimeData() return subActivityOpenTimeLeft, subActivityTimeSinceOpen, subActivityEndTimeLeft end function private.ExcuteSubActivityOpenTip() local tipsStr = "" if todayActivityType == LuaConst.ActivityType.GuildParty_Exam then tipsStr = UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_QAOpenReminder"]) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Drink then tipsStr = string.FormatByIdsKey("IDS_GuildParty_ToastOpenReminder", 1) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Collect then tipsStr = string.FormatByIdsKey("IDS_GuildParty_TreasureOpenReminder", 1) end GuildParty_Controller.StartGuildPartyTip(tipsStr, 3) end function private.ExcuteSubActivityOpen(isNormalStart) ReqActivityDataCount = 0 if todayActivityType == LuaConst.ActivityType.GuildParty_Exam then private.InitGuildPartyExamData() elseif todayActivityType == LuaConst.ActivityType.GuildParty_Drink then private.InitGuildPartyDrinkData(isNormalStart) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Collect then private.InitGuildPartyCollectData(isNormalStart) end end function private.ExcuteSubActivityOpening(hasPassedTime) if todayActivityType == LuaConst.ActivityType.GuildParty_Exam then private.TickGuildPartyExam(hasPassedTime) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Drink then private.TickGuildPartyDrink(hasPassedTime) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Collect then private.TickGuildPartyCollect(hasPassedTime) end end function private.ExcuteSubActivityEnd() if todayActivityType == LuaConst.ActivityType.GuildParty_Exam then private.ExcuteGuildPartyExamEnd(true) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Drink then private.ExcuteGuildPartyDrinkEnd(true) elseif todayActivityType == LuaConst.ActivityType.GuildParty_Collect then private.ExcuteGuildPartyCollectEnd(true) end EventSystem.Dispatch(EventID.UI_GuildParty_SubActivityEnd) end function GuildParty_Controller.IsSubActivityOpen(isShowTip) if subActivityOpenTimeLeft > 0 then if isShowTip then CTL.Tips.AddTipsMsg(Const_IDS["IDS_GuildParty_NotOpen"]) end return false end return true end function GuildParty_Controller.IsSubActivityEnd(isShowTip) if subActivityEndTimeLeft > 0 then return false end if isShowTip then CTL.Tips.AddTipsMsg(Const_IDS["IDS_GuildParty_AlreadyEnded"]) end return true end function GuildParty_Controller.StartGuildPartyTip(tipsStr, stayTime) UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildPartyMsg, {tipsStr = tipsStr, stayTime = stayTime}, "Guild/UIGuildTips") end -------------------------------------------驻地答题-------------------------------------------------- function private.JoinGuildPartyChatChannel() local guildId = MDL.Guild.GetMyGuildInfo().guildId local chatCfgData = DataSheetManager.Chat:GetDataByID(MDL.ChannelChat.ChannelCfgId.GuildPartyExam) local dateInfo = UTL.Time.OsDateOriginal("*t", UTL.Time.GetServerTimestamp()); local tmpGuildChannel = chatCfgData.ChannelPrefix..guildId .. "_" .. dateInfo.year .. dateInfo.month .. dateInfo.day; MDL.ChannelChat.JoinChannel(chatCfgData.ID, tmpGuildChannel) end function private.ExitGuildPartyChatChannel() MDL.ChannelChat.ExitChannelByChannelType(MDL.ChannelChat.ChannelCfgId.GuildPartyExam) end function private.InitGuildPartyExamData() --加入答题频道 BIManager.DispatchBIClientEvent(BIManager.EventName.GuildAnswer) private.JoinGuildPartyChatChannel() MDL.GuildParty.ReqGetQuestion() GuildParty_Controller.OpenGuildPartyExamView() end function private.ExcuteGuildPartyExamEnd(isNormalEnd) curExamState = 3 curExamData = nil table.clearArray(guildParty_ExamChatList) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildActivityExam) private.ExitGuildPartyChatChannel() if isNormalEnd then CTL.GuildParty.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_QAEndReminder"]), 5) end end function private.TickGuildPartyExam(hasPassedTime) local examDatas = MDL.GuildParty.GetGuildPartyExams() if not examDatas or #examDatas <= 0 then ReqActivityDataCount = ReqActivityDataCount + 1 MDL.GuildParty.ReqGetQuestion() logging.crit(LTAG.CRIT, "Req GuildPartyExam", ReqActivityDataCount) end if curExamState == 0 or curExamState == 3 then return end curExamStateLeftTime = curExamStateLeftTime - hasPassedTime if curExamState == 2 and curExamStateLeftTime <= 0 then GuildParty_Controller.RefreshExamData() elseif curExamState == 1 and curExamStateLeftTime <= 0 then curExamState = 2 curExamStateLeftTime = SubActivityRefreshInterval end end function GuildParty_Controller.RefreshExamData() local examDatas = MDL.GuildParty.GetGuildPartyExams() if not examDatas or #examDatas <= 0 then return end local examIndex = math.floor(subActivityTimeSinceOpen/(SubActivityTime+SubActivityRefreshInterval))+1 curExamData = examDatas[examIndex] local perQuestionTimeOffset = subActivityTimeSinceOpen - (examIndex-1) * (SubActivityTime+SubActivityRefreshInterval) if perQuestionTimeOffset < SubActivityTime then curExamState = 1 curExamStateLeftTime = SubActivityTime - perQuestionTimeOffset elseif perQuestionTimeOffset <= SubActivityTime + SubActivityRefreshInterval then curExamState = 2 curExamStateLeftTime = SubActivityTime + SubActivityRefreshInterval - perQuestionTimeOffset end if curExamData.index == TotalSubActivityCount then subActivityEndTimeLeft = SubActivityTime-perQuestionTimeOffset end curExamAnswerState = -1 EventSystem.Dispatch(EventID.UI_GuildParty_RefreshActivityData) end function GuildParty_Controller.GetCurExamData() return curExamData, TotalSubActivityCount end function GuildParty_Controller.GetCurExamTimeData() return curExamState, curExamStateLeftTime end function GuildParty_Controller.GetCurExamAnswerState() return curExamAnswerState end function GuildParty_Controller.SetCurExamAnswerState(state) curExamAnswerState = state end function GuildParty_Controller.OpenGuildPartyExamView() UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildActivityExam, nil, "Guild/UIGuildActivityExam") end -------------------------------------------聊天的信息处理----------------------------------------------- function GuildParty_Controller.ResetHistoryChatMsg() guildParty_ExamChatList = {} end function GuildParty_Controller.InitHistoryChatMsg(isSelf, content, senderName, answerType, rankIndex, extraParam) local msg = { isSelf = isSelf, senderName = senderName, content = content, answerType = answerType, rankIndex = rankIndex, heroId = extraParam.PlayerShowInfo.mainHeroId, level = extraParam.PlayerShowInfo.level, sex = extraParam.PlayerShowInfo.sex, emblemFrame = extraParam.PlayerShowInfo.EmblemFrame, emblemContent = extraParam.PlayerShowInfo.EmblemContent, jobTitle = extraParam.PlayerShowInfo.JobTitle, officialId = extraParam.PlayerShowInfo.OfficialId, portraitId = extraParam.PlayerShowInfo.PortraitId, frameId = extraParam.PlayerShowInfo.FrameId, wearSignetId = extraParam.PlayerShowInfo.WearSignetId, signetTimestamp = extraParam.PlayerShowInfo.SignetTimestamp, } table.insert(guildParty_ExamChatList, 1, msg) end function GuildParty_Controller.AddNewChatMsg(isSelf, content, senderName, answerType, rankIndex, extraParam) local msg = { isSelf = isSelf, senderName = senderName, content = content, answerType = answerType, rankIndex = rankIndex, heroId = extraParam.PlayerShowInfo.mainHeroId, level = extraParam.PlayerShowInfo.level, sex = extraParam.PlayerShowInfo.sex, emblemFrame = extraParam.PlayerShowInfo.EmblemFrame, emblemContent = extraParam.PlayerShowInfo.EmblemContent, jobTitle = extraParam.PlayerShowInfo.JobTitle, officialId = extraParam.PlayerShowInfo.OfficialId, portraitId = extraParam.PlayerShowInfo.PortraitId, frameId = extraParam.PlayerShowInfo.FrameId, wearSignetId = extraParam.PlayerShowInfo.WearSignetId, signetTimestamp = extraParam.PlayerShowInfo.SignetTimestamp, } guildParty_ExamChatList[#guildParty_ExamChatList+1] = msg EventSystem.Dispatch(EventID.UI_GuildParty_ExamChat, msg) end function GuildParty_Controller.GetAllChatMsg() return guildParty_ExamChatList end -------------------------------------------驻地对饮-------------------------------------------------- function private.InitGuildPartyDrinkData(isNormalStart) DrinkPairDistance = DataSheetManager.ConstData:GetDataByID("GuildPartyToastRange").FloatValue if not isNormalStart then MDL.GuildParty.ReqGetDrinkData() else GuildParty_Controller.RefreshDrinkData() end if not drinkDistanceTimer then drinkDistanceTimer = TimerUtil.Interval( function() private.CheckPlayerCanDrink() end, 0.15, 0) end end function private.CheckPlayerCanDrink() local curDrinkData = MDL.GuildParty.GetDrinkPairData() if curDrinkData and curDrinkState == 1 and curDrinkData.state == 1 then local myPos = BattleDataGetter.GetMainPlayerLastLogicPos() local otherEntity = SyncMoveManager.GetEntityByAcid(curDrinkData.aimId) if otherEntity then local otherPos = otherEntity:GetLogicPos() if FP.V2.IsDistanceSqrGreater(myPos, otherPos, DrinkPairDistance) then if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildPartyDrinkInteractView) then UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyDrinkInteractView) end else if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildPartyDrinkInteractView) then UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildPartyDrinkInteractView, nil, "Interact/UIGuildPartyDrinkInteractView") end end end end end function GuildParty_Controller.GetCurDrinkData() return CurSubActivityIndex, TotalSubActivityCount, MDL.GuildParty.GetDrinkPairData() end --是否服务器主动推送的,不是不弹提示 function GuildParty_Controller.RefreshDrinkData(isPush) if curDrinkState == 2 and curDrinkStateLeftTime > 0 then return end local curDrinkData = MDL.GuildParty.GetDrinkPairData() if not curDrinkData then return end CurSubActivityIndex = math.floor(subActivityTimeSinceOpen/(SubActivityTime+SubActivityRefreshInterval))+1 local perDrinkTimeOffset = subActivityTimeSinceOpen - (CurSubActivityIndex-1) * (SubActivityTime+SubActivityRefreshInterval) if perDrinkTimeOffset < SubActivityTime then curDrinkState = 1 curDrinkStateLeftTime = SubActivityTime - perDrinkTimeOffset elseif perDrinkTimeOffset <= SubActivityTime + SubActivityRefreshInterval then curDrinkState = 2 curDrinkStateLeftTime = SubActivityTime + SubActivityRefreshInterval - perDrinkTimeOffset end if CurSubActivityIndex == TotalSubActivityCount then subActivityEndTimeLeft = SubActivityTime-perDrinkTimeOffset end if curDrinkState == 1 and curDrinkStateLeftTime == SubActivityTime then if curDrinkData.state == 1 then CTL.GuildParty.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_ToastTargetReminder"]), 5) UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildPartyTargetView, {targetAccId=curDrinkData.aimId},"Guild/UIGuildPartyTargetView") elseif curDrinkData.state == 2 then CTL.GuildParty.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_ToastNoTargetReminder"]), 5) end else if curDrinkData.state == 3 and isPush then UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyDrinkInteractView) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyTargetView) CTL.GuildParty.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_ToastTargetLeaveReminder"]), 5) elseif curDrinkData.state == 5 then UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyDrinkInteractView) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyTargetView) if isPush then CTL.GuildParty.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_ToastSucceedReminder"]), 5) end end end EventSystem.Dispatch(EventID.UI_GuildParty_RefreshActivityData) end function private.TickGuildPartyDrink(hasPassedTime) if curDrinkState == 0 or curDrinkState == 3 then return end local lastTime = curDrinkStateLeftTime curDrinkStateLeftTime = curDrinkStateLeftTime - hasPassedTime local curDrinkData = MDL.GuildParty.GetDrinkPairData() if curDrinkState == 2 and lastTime >= 5 and curDrinkStateLeftTime < 5 then GuildParty_Controller.StartGuildPartyTip(string.FormatByIdsKey("IDS_GuildParty_ToastOpenReminder", CurSubActivityIndex+1), 3) elseif curDrinkState == 1 and lastTime >= GuildPartyToastGuideTime and curDrinkStateLeftTime < GuildPartyToastGuideTime then if curDrinkData and curDrinkData.state==1 then GuildParty_Controller.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_ToastTimeReminder"]), 5) end end if curDrinkState == 2 and curDrinkStateLeftTime <= 0 then GuildParty_Controller.RefreshDrinkData() elseif curDrinkState == 1 and curDrinkStateLeftTime <= 0 then UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyDrinkInteractView) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyTargetView) curDrinkState = 2 curDrinkStateLeftTime = SubActivityRefreshInterval end end function GuildParty_Controller.GetCurDrinkTimeData() return curDrinkState, curDrinkStateLeftTime end function private.ExcuteGuildPartyDrinkEnd(isNormalEnd) curDrinkState = 3 UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyDrinkInteractView) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyDrinkRank) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildPartyTargetView) if isNormalEnd then CTL.GuildParty.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_ToastEndReminder"]), 5) end if drinkDistanceTimer then TimerUtil.Remove(drinkDistanceTimer) drinkDistanceTimer = nil end MDL.GuildParty.ClearDrinkData() end -------------------------------------------驻地宝箱-------------------------------------------------- function private.InitGuildPartyCollectData(isNormalStart) IsHasBoxDisappearTip = false EventSystem.Regist(EventID.RandomScenePoint_BornOneCharacterComplete, private.BornOneCharacterComplete) EventSystem.Regist(EventID.UI_Interact_Start, private.OnPickBoxStart) EventSystem.Regist(EventID.UI_Interact_Over, private.OnPickBoxEnd) if not isNormalStart then MDL.GuildParty.ReqGetCollectData() else GuildParty_Controller.InitAllCollectBoxes() end end function private.BornOneCharacterComplete(levelItemID, groupIndex, pointIndex, entity) if not boxEntityData then boxEntityData = {} end boxEntityData[entity.EntityID] = levelItemID .. "|" .. groupIndex .. "|" .. pointIndex end function private.OnPickBoxStart(entity, interactIndex) if not entity:IsPlayerSelf() then return end local boxEntity = entity.components.interact:GetCmdOpInteractEntity() if not boxEntity then return end if not boxEntityData or not boxEntityData[boxEntity.EntityID] then return end local dataArr = string.split(boxEntityData[boxEntity.EntityID], "|") MDL.GuildParty.ReqStartPickCollectBox(tonumber(dataArr[2]), tonumber(dataArr[3])) end function private.OnPickBoxEnd(entity) if not entity:IsPlayerSelf() then return end local boxEntity = entity.components.interact:GetCmdOpInteractEntity() if not boxEntity then return end if not boxEntityData or not boxEntityData[boxEntity.EntityID] then return end local dataArr = string.split(boxEntityData[boxEntity.EntityID], "|") MDL.GuildParty.ReqEndPickCollectBox(tonumber(dataArr[2]), tonumber(dataArr[3])) end function private.TickGuildPartyCollect(hasPassedTime) if curCollectState == 0 or curCollectState == 3 then return end local lastTime = curCollectStateLeftTime curCollectStateLeftTime = curCollectStateLeftTime - hasPassedTime if curCollectState == 2 and lastTime >= 5 and curCollectStateLeftTime < 5 then GuildParty_Controller.StartGuildPartyTip(string.FormatByIdsKey("IDS_GuildParty_TreasureOpenReminder", CurSubActivityIndex+1), 3) elseif curCollectState == 1 and lastTime >= 10 and curCollectStateLeftTime < 10 then GuildParty_Controller.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_TreasureRoundEndReminder"]), 4) end if curCollectState == 2 and curCollectStateLeftTime <= 0 then GuildParty_Controller.InitAllCollectBoxes() elseif curCollectState == 1 and curCollectStateLeftTime <= 0 then curCollectState = 2 curCollectStateLeftTime = SubActivityRefreshInterval private.ClearAllCollectionBoxes() if IsHasBoxDisappearTip then GuildParty_Controller.TryTipBoxDisappear() end end end function GuildParty_Controller.TryTipBoxDisappear() if curCollectState == 1 and curCollectStateLeftTime > 0 then IsHasBoxDisappearTip = true else IsHasBoxDisappearTip = false CTL.Tips.AddTipsMsg(Const_IDS.IDS_GuildParty_Disappeared) end end function GuildParty_Controller.GetCurCollectData() return CurSubActivityIndex, TotalSubActivityCount end function GuildParty_Controller.GetCurCollectTimeData() return curCollectState, curCollectStateLeftTime end function GuildParty_Controller.RefreshCollectData() CurSubActivityIndex = math.floor(subActivityTimeSinceOpen/(SubActivityTime+SubActivityRefreshInterval))+1 local perCollectTimeOffset = subActivityTimeSinceOpen - (CurSubActivityIndex-1) * (SubActivityTime+SubActivityRefreshInterval) if perCollectTimeOffset < SubActivityTime then curCollectState = 1 curCollectStateLeftTime = SubActivityTime - perCollectTimeOffset elseif perCollectTimeOffset <= SubActivityTime + SubActivityRefreshInterval then curCollectState = 2 curCollectStateLeftTime = SubActivityTime + SubActivityRefreshInterval - perCollectTimeOffset end if CurSubActivityIndex == TotalSubActivityCount then subActivityEndTimeLeft = SubActivityTime-perCollectTimeOffset end if curCollectState==1 and curCollectStateLeftTime==SubActivityTime then GuildParty_Controller.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_TreasureRefreshReminder"]), 5) end EventSystem.Dispatch(EventID.UI_GuildParty_RefreshActivityData) end function GuildParty_Controller.GetCollectCountData() return MDL.GuildParty.GetHasGetBoxCount(), TotalCanGetBoxCount end function GuildParty_Controller.IsGuildPartyCanGetBox() return MDL.GuildParty.GetHasGetBoxCount() 0 then return end private.ClearAllCollectionBoxes() local boxInfos = MDL.GuildParty.GetServerCollectBoxes() if not boxInfos then return end local boxDataArr = nil for __, boxData in ipairs(boxInfos) do boxDataArr = string.split(boxData.id, ":") private.StartGenOneBox(tonumber(boxDataArr[1]), tonumber(boxDataArr[2]), private.GetCollectBoxed(boxData.typ)) end GuildParty_Controller.RefreshCollectData() end function private.GetCollectBoxed(boxType) if boxType == 1 then return DataSheetManager.ConstData:GetDataByID("GuildPartyTreasureBoxID3").IntValue elseif boxType == 2 then return DataSheetManager.ConstData:GetDataByID("GuildPartyTreasureBoxID2").IntValue elseif boxType == 3 then return DataSheetManager.ConstData:GetDataByID("GuildPartyTreasureBoxID1").IntValue end end function private.StartGenOneBox(groupIndex, pointIndex, boxId) EventSystem.Dispatch(EventID.RandomScenePoint_BornOneCharacter, 18001, LuaConst.CharacterType.Monster, boxId, groupIndex, pointIndex) end function GuildParty_Controller.RemoveOneBox(groupIndex, pointIndex) EventSystem.Dispatch(EventID.RandomScenePoint_RemoveOneCharacter, 18001, groupIndex, pointIndex) end function private.ExcuteGuildPartyCollectEnd(isNormalEnd) curCollectState = 3 EventSystem.UnRegist(EventID.RandomScenePoint_BornOneCharacterComplete, private.BornOneCharacterComplete) EventSystem.UnRegist(EventID.UI_Interact_Start, private.OnPickBoxStart) EventSystem.UnRegist(EventID.UI_Interact_Over, private.OnPickBoxEnd) if isNormalEnd then CTL.GuildParty.StartGuildPartyTip(UIUtils.GetLocalizedTxt(Const_IDS["IDS_GuildParty_TreasureEndReminder"]), 5) end private.ClearAllCollectionBoxes() end function private.ClearAllCollectionBoxes() if boxEntityData then for __, boxIdStr in pairs(boxEntityData) do local dataArr = string.split(boxIdStr, "|") GuildParty_Controller.RemoveOneBox(tonumber(dataArr[2]), tonumber(dataArr[3])) end end boxEntityData = nil end return GuildParty_Controller