local UIActivityNotice = UIViewClass() local EventSystem = require('Event/EventSystem') local MAX = 9999 local MAX_NUM_SHOW = 3 --界面上最多显示的数量 local TypeIsRB = 1 --表示右下角功能界面类型 local Together_Show_Num = 2 --state(进行中>未开启)->isUnlock->ID local function SortRule(a, b) local aID = a.configData.ID local bID = b.configData.ID --围剿叛军单独处理,只要id吻合就一致往后排 if aID == LuaConst.ActivityType.RebelStrike then return false end if bID == LuaConst.ActivityType.RebelStrike then return true end if a.state ~= b.state then return a.state < b.state else local isOpenA = CTL.Activities.IsOpen(aID) local isOpenB = CTL.Activities.IsOpen(bID) if isOpenA ~= isOpenB then return isOpenA else local timeA = 0 local timeB = 0 if a.state == CTL.Activities.ActivityState.NotOpen then timeA = CTL.Activities.GetTimeToOpen(aID) timeB = CTL.Activities.GetTimeToOpen(bID) else timeA = CTL.Activities.GetTimeToClose(aID) timeB = CTL.Activities.GetTimeToClose(bID) end return timeA < timeB end end end function UIActivityNotice:OnOpened(context) self:RegistSystemEvent(EventID.UI_TownHome_BtnState_Changed, self.OnTownHomeBtnStateChanged) self:RegistSystemEvent(EventID.UI_UpdatePlayerChange, self.OnPlayerChange) self:RegistSystemEvent(EventID.UI_ActivityNotice_HideSelf, self.HideSelf) self:RegistSystemEvent(EventID.UI_GuildWarStageUpdate, self.UpdateCell) self:RegistSystemEvent(EventID.UI_SceneQuiz_StageChange, self.UpdateCell) self:RegistSystemEvent(EventID.Country_OnGetFoundCountry, self.UpdateCell) --有些玩法的状态依赖国家数据,因此需要监听下国家状态的变化来更新通知 self:RegistSystemEvent(EventID.Country_RefreshSelectInfo, self.OnCountryStageChange) self:RegistSystemEvent(EventID.FunctionUnlockUpdate, self.OnFunctionUnlockUpdate) self.foldRed = false self.passTime = 0 self.isFoldOut = false self.noticeInfoList = {} self.noticeItemList = {} self.minTime = 0 self.isAllUnlock = true for _, v in DataSheetManager.ActivityData:GetEnumerator() do if v.Notice > 0 then if v.ID == LuaConst.ActivityType.HeroMatch1v1 then if MDL.HeroMatch1v1.CheckIsBattleStage() then self:SetNoticeInfoList(v) end elseif v.ID == LuaConst.ActivityType.HeroMatch3v3 then if MDL.HeroMatch3v3.CheckIsBattleStage() then self:SetNoticeInfoList(v) end elseif v.ID == LuaConst.ActivityType.FairSoloTournament then if MDL.FairSoloTournament.CheckIsBattleStage() then self:SetNoticeInfoList(v) end elseif v.ID == LuaConst.ActivityType.TeamFairChampionship then if CTL.TeamFairChampionship.IsInBattleStage() then self:SetNoticeInfoList(v) end elseif v.ID == LuaConst.ActivityType.SceneQuizPreliminary then if CTL.SceneQuiz.IsTodayOpen() and not CTL.SceneQuiz.IsFinalOpen() then self:SetNoticeInfoList(v) end elseif v.ID == LuaConst.ActivityType.SceneQuizFinal then if CTL.SceneQuiz.IsFinalOpen() then self:SetNoticeInfoList(v) end else self:SetNoticeInfoList(v) end end end self:UpdateCell() local red = MDL.HomeMain.GetLastNoticeRed() if red ~= nil then UIUtils.SetActive(self.img_Red, red) end self:StartRepeatFunc(self.OnUpdateFun, 1) end function UIActivityNotice:OnFunctionUnlockUpdate(id, isUnlock) if id == LuaConst.ActivityType.SyncCityWar then self:UpdateInfo() end end function UIActivityNotice:SetNoticeInfoList(activityData) local _state, _isNotice, _freshTime = self:GetShowInfo(activityData) local info = { configData = activityData, state = _state, isNotice = _isNotice, freshTime = _freshTime, } table.insert(self.noticeInfoList, info) --拿到最早更新的时间 if self.minTime == 0 or self.minTime > info.freshTime then self.minTime = info.freshTime end if _isNotice == false and _freshTime == MAX then self.isAllUnlock = false end end function UIActivityNotice:HideSelf(isShow) if isShow and MDL.HomeMain.GetTownHomeUIFoldStateByType(MDL.HomeMain.TownFoldType.RightBottom) then return end UIUtils.SetActive(self.gameObject, isShow) end function UIActivityNotice:UpdateInfo() self.minTime = 0 self.isAllUnlock = true for _, v in ipairs(self.noticeInfoList) do local state, isNotice, freshTime = self:GetShowInfo(v.configData) v.state = state v.isNotice = isNotice v.freshTime = freshTime if self.minTime == 0 or self.minTime > v.freshTime then self.minTime = v.freshTime end if isNotice == false and freshTime == MAX then self.isAllUnlock = false end end self.passTime = 0 self:UpdateCell() end function UIActivityNotice:OnUpdateFun(deltaTime, timeSinceUpdate) -- 势力战第一场结束刷新时间 if self.SecondGuildWarCountDownTime and self.SecondGuildWarCountDownTime > UTL.Time.TotalSecondsOneMinute then self.SecondGuildWarCountDownTime = self.SecondGuildWarCountDownTime - 1 if self.SecondGuildWarCountDownTime == UTL.Time.TotalSecondsOneMinute then self:UpdateCell() end end self.passTime = timeSinceUpdate if timeSinceUpdate > self.minTime then self:UpdateInfo() self:ResetRepeatFunc(self.OnUpdateFun) end end function UIActivityNotice:OnPlayerChange() if self.isAllUnlock then return end local needFresh = false for _,v in ipairs(self.noticeInfoList) do if v.isNotice == false and v.freshTime == MAX then local config = v.configData if CTL.Activities.IsOpen(config.ID) or MDL.Activities.PreviewUnlock(config.SheetShowConditionType, config.SheetShowConditionParam) then needFresh = true break end end end if needFresh then self:UpdateInfo() self:ResetRepeatFunc(self.OnUpdateFun) end end --获取活动的预告显示状态和刷新时间(若显示预告,则时间为消失时间;若不显示预告,则时间为显示时间) function UIActivityNotice:GetShowInfo(config) local id = config.ID local noticeTime = config.Notice local isNotice = false local freshTime = 0 local state --功能未解锁切未达到预示条件不可见 if CTL.Activities.IsOpen(id) == false and MDL.Activities.PreviewUnlock(config.SheetShowConditionType, config.SheetShowConditionParam) == false then return CTL.Activities.ActivityState.NotOpen, false, MAX end --叛军突袭不能按照活动表配置的时间来,活动表里的配置的是总时长 if id == LuaConst.ActivityType.RebelStrike then local openTime = CTL.RebelStrike.GetTimeToOpen() if openTime > 0 then --未在时间内 state = CTL.Activities.ActivityState.NotOpen if openTime <= noticeTime then isNotice = true --活动开启倒计时 freshTime = openTime else isNotice = false --预告开启时间 freshTime = openTime - noticeTime end else --在活动时间内 state = CTL.Activities.ActivityState.Opening isNotice = true freshTime = CTL.RebelStrike.GetTimeToClose() end -- 如果 次数为0则不显示 local countData = MDL.Activities.GetCountInfo(LuaConst.ActivityType.RebelStrike) if countData.curCount == 0 then isNotice = false end return state, isNotice, freshTime elseif id == LuaConst.ActivityType.FightThrone then if MDL.GuildWar.GuildWarIsFirstSign() and CTL.FightThrone.IsWedOrSatDay() then -- 大乱斗替换势力战 state, freshTime = CTL.FightThrone.GetFightThroneFakeOpenState() if state and freshTime then isNotice = state == CTL.Activities.ActivityState.Opening or (state == CTL.Activities.ActivityState.NotOpen and freshTime <= noticeTime) return state, isNotice, freshTime end else local entryState, offset = CTL.FightThrone.GetEntryState() if entryState == CTL.FightThrone.EntryState.Timeout then return CTL.Activities.ActivityState.End, false, CTL.Activities.GetNextTimeToOpen(id) elseif entryState == CTL.FightThrone.EntryState.Opening then return CTL.Activities.ActivityState.Opening, true, offset end end elseif id == LuaConst.ActivityType.HeroMatch1v1 or id == LuaConst.ActivityType.HeroMatch3v3 then --活动未开启,需要在开启前的noticeTime内显示预告 local openTime = CTL.Activities.GetTimeToOpen(id) if openTime > 0 then --未在时间内 state = CTL.Activities.ActivityState.NotOpen if openTime <= noticeTime then isNotice = true --活动开启倒计时 freshTime = openTime else isNotice = false --预告开启时间 freshTime = openTime - noticeTime end else local closeTimer if id == LuaConst.ActivityType.HeroMatch1v1 then closeTimer = MDL.HeroMatch1v1.GetTimeToClose() else closeTimer = MDL.HeroMatch3v3.GetTimeToClose() end if closeTimer > 0 then state = CTL.Activities.ActivityState.Opening isNotice = true freshTime = closeTimer else state = CTL.Activities.ActivityState.NotOpen isNotice = false freshTime = 0 end end return state, isNotice, freshTime elseif id == LuaConst.ActivityType.FairSoloTournament or id == LuaConst.ActivityType.TeamFairChampionship then --活动未开启,需要在开启前的noticeTime内显示预告 local openTime = CTL.Activities.GetTimeToOpen(id) if openTime > 0 then --未在时间内 state = CTL.Activities.ActivityState.NotOpen if openTime <= noticeTime then isNotice = true --活动开启倒计时 freshTime = openTime else isNotice = false --预告开启时间 freshTime = openTime - noticeTime end else local closeTimer = nil if id == LuaConst.ActivityType.FairSoloTournament then closeTimer = MDL.FairSoloTournament.GetTimeToClose() else closeTimer = CTL.TeamFairChampionship.GetToadyTimeToClose() end if closeTimer > 0 then state = CTL.Activities.ActivityState.Opening isNotice = true freshTime = closeTimer else state = CTL.Activities.ActivityState.NotOpen isNotice = false freshTime = 0 end end return state, isNotice, freshTime elseif id == LuaConst.ActivityType.SceneQuizPreliminary then if not CTL.SceneQuiz.IsFinalOpen() then local openTime = 0 state, openTime = CTL.SceneQuiz.GetActivityStateAndTime() if openTime <= noticeTime then isNotice = true --活动开启倒计时 freshTime = openTime else isNotice = false --预告开启时间 freshTime = openTime - noticeTime end else state = CTL.Activities.ActivityState.End isNotice = false freshTime = 0 end return state, isNotice, freshTime elseif id == LuaConst.ActivityType.SceneQuizFinal then if CTL.SceneQuiz.IsFinalOpen() then local openTime = 0 state, openTime = CTL.SceneQuiz.GetActivityStateAndTime() if openTime <= noticeTime then isNotice = true --活动开启倒计时 freshTime = openTime else isNotice = false --预告开启时间 freshTime = openTime - noticeTime end else state = CTL.Activities.ActivityState.End isNotice = false freshTime = 0 end return state, isNotice, freshTime elseif id == LuaConst.ActivityType.SyncCityWar and not CTL.ChangAnSiege.IsOpen() then return CTL.Activities.ActivityState.NotOpen, false, 0 end --走通用的判断活动开启逻辑 if self:PreDeActiveActivity(id) then return CTL.Activities.ActivityState.End, false, MAX end state = CTL.Activities.GetState(id) if state == CTL.Activities.ActivityState.NotOpen or state == CTL.Activities.ActivityState.End then --活动未开启,需要在开启前的noticeTime内显示预告 local openTime = state == CTL.Activities.ActivityState.NotOpen and CTL.Activities.GetTimeToOpen(id) or CTL.Activities.GetNextTimeToOpen(id) if openTime <= noticeTime then isNotice = true --活动开启倒计时 freshTime = openTime else isNotice = false --预告开启时间 freshTime = openTime - noticeTime end else --活动时间段中,可能已经提前完成 if self:IsActivityPreFinished(id) then isNotice = false freshTime = CTL.Activities.GetNextTimeToOpen(id) else --活动开启中,需要显示预告 isNotice = true --预告关闭的时间 freshTime = CTL.Activities.GetTimeToClose(id) end end return state, isNotice, freshTime end function UIActivityNotice:PreDeActiveActivity(id) if id == LuaConst.ActivityType.DragonArtery or id == LuaConst.ActivityType.CountryNightBoss or id == LuaConst.ActivityType.SyncCityWar then if MDL.Country.GetCurStage() ~= MDL.Country.Stage.CountryBuild and MDL.Country.GetCurStage() ~= MDL.Country.Stage.CountryBuildPreBalance then return true end end return false end function UIActivityNotice:OnCountryStageChange() self:UpdateInfo() self:ResetRepeatFunc(self.OnUpdateFun) end function UIActivityNotice:IsActivityPreFinished(id) if id == LuaConst.ActivityType.DragonArtery then return MDL.DragonArtery.GetEnterNums() > 0 end return false end function UIActivityNotice:UpdateCell() local isChange = false for _, v in ipairs(self.noticeInfoList) do local flag = false for i, info in ipairs(self.noticeItemList) do if v == info then if v.isNotice == false then table.remove(self.noticeItemList, i) end flag = true break end end if flag == false and v.isNotice then --新增,需要显示红点 isChange = true table.insert(self.noticeItemList, v) end end table.sort(self.noticeItemList, SortRule) if self.isFoldOut then --展开 self.foldRed = false self.scroll_Notice:ReloadAll(self.noticeItemList) if #self.noticeItemList > MAX_NUM_SHOW then UIUtils.SetActive(self.group_Btn, false) else self.group_Btn:SetAsLastSibling() end else --收起 self.foldRed = isChange local data = self.noticeItemList[1] if data == nil then self.scroll_Notice:ClearCells() else self.scroll_Notice:ClearCells() for i = 1, Together_Show_Num do local itemInfo = self.noticeItemList[i] if itemInfo then self.scroll_Notice:AddData(itemInfo, 0) end end if MDL.HomeMain.GetTownHomeUIFoldStateByType(TypeIsRB) == true then self:HideSelf(false) end end self.group_Btn:SetAsLastSibling() UIUtils.SetActive(self.group_Btn, true) end if self.scroll_Notice.Count <= MAX_NUM_SHOW then UIUtils.SetActive( self.group_Btn2, false) self.scroll_Notice:SetMovementType(3) else UIUtils.SetActive( self.group_Btn2, true) self.scroll_Notice:SetMovementType(1) end self:UpdateFoldState() end function UIActivityNotice:SetGuildWarNoticeInfo(cell) local isFirst, time = CTL.GuildWar.GetCountDownTimeBySecondBattleInfo() self.SecondGuildWarCountDownTime = (time and time > 0) and time or nil if isFirst and time > 0 then UIUtils.SetActive(cell.group_GoNow.gameObject, false) if time > UTL.Time.TotalSecondsOneMinute then cell.cdTimer_seconds:EndTimer() cell.cdTimer_minutes:ResetAndBeginCustomTimer(false, time, 0, UIUtils.GetLocalizedTxt(Const_IDS["IDS_ActivitiesRemind_GuildWar2"]), 1) else cell.cdTimer_minutes:EndTimer() cell.cdTimer_seconds:ResetAndBeginCustomTimer(false, time - 1, 0, UIUtils.GetLocalizedTxt(Const_IDS["IDS_ActivitiesRemind_GuildWar1"]), 1) end else UIUtils.SetActive(cell.group_GoNow, true) cell.cdTimer_seconds:EndTimer() cell.cdTimer_minutes:EndTimer() cell.cdTimer_minutes:SetCDLabel("") end end function UIActivityNotice:OnCellInit(scrollRect, index, cellTable, data) local activityData = data.configData local activityIconPath = CTL.Activities.GetActivityIconPath(activityData.ActivityIcon) UIUtils.SetImageByAssetBundle(cellTable.icon_Activity, activityIconPath) UIUtils.SetLabelText(cellTable.txt_Title, Const_IDS[activityData.Activity]) if data.state == CTL.Activities.ActivityState.Opening then if activityData.ID == LuaConst.ActivityType.GuildWar then -- 势力战特殊处理,如果为第一场则显示第二场倒计时 self:SetGuildWarNoticeInfo(cellTable) else UIUtils.SetActive(cellTable.group_GoNow, true) cellTable.cdTimer_seconds:EndTimer() cellTable.cdTimer_minutes:EndTimer() cellTable.cdTimer_minutes:SetCDLabel("") end UIUtils.SetActive(cellTable.btn_Goto, true) else UIUtils.SetActive(cellTable.btn_Goto, false) local passTime = math.ceil(self.passTime) local time = data.freshTime - passTime if time > UTL.Time.TotalSecondsOneMinute then cellTable.cdTimer_seconds:EndTimer() cellTable.cdTimer_minutes:ResetAndBeginCustomTimer(false, time, 0, UIUtils.GetLocalizedTxt(Const_IDS["IDS_ActivityNotice_CountDown1"]), 1) local minutes = math.floor(time / UTL.Time.TotalSecondsOneMinute) - 1 if minutes > 0 then self.minTime = math.min(self.minTime, minutes * UTL.Time.TotalSecondsOneMinute) else self.minTime = math.min(self.minTime, time - UTL.Time.TotalSecondsOneMinute) end else cellTable.cdTimer_minutes:EndTimer() cellTable.cdTimer_seconds:ResetAndBeginCustomTimer(false, time - 1, 0, UIUtils.GetLocalizedTxt(Const_IDS["IDS_ActivityNotice_CountDown"]), 1) end end end function UIActivityNotice:OnCellClicked(scrollRect, index, cellTable, target, data) if target == cellTable.btn_Goto or target == cellTable.btn_Icon then local activityData = data.configData if data.state == CTL.Activities.ActivityState.Opening then local isUnlock, content = CTL.Activities.IsOpen(activityData.ID) if isUnlock == false then CTL.Tips.AddTipsMsg(content) return end CTL.ItemSources.ExecuteSourceFunctionById(activityData.Turn) else if activityData.BeforeTurn > 0 then local isUnlock, content = CTL.Activities.IsOpen(activityData.ID) if isUnlock == false then CTL.Tips.AddTipsMsg(content) return end CTL.ItemSources.ExecuteSourceFunctionById(activityData.BeforeTurn) else CTL.Tips.AddTipsMsg(Const_IDS["IDS_ActivityNotice_CantTurn"]) end end end end function UIActivityNotice:OnFoldOutNotice() if self.isFoldOut then return end self.isFoldOut = true self:UpdateCell() --关闭按钮组 EventSystem.Dispatch(EventID.UI_ActivityNotice_FoldOut) end function UIActivityNotice:OnFoldInNotice() if self.isFoldOut == false then return end self.isFoldOut = false self:UpdateCell() EventSystem.Dispatch(EventID.UI_ActivityNotice_FoldIn) end function UIActivityNotice:OnTownHomeBtnStateChanged(foldType, value) if foldType == MDL.HomeMain.TownFoldType.RightBottom and value == true then self:OnFoldInNotice() end end function UIActivityNotice:UpdateFoldState() if #self.noticeItemList <= Together_Show_Num then self.state_foldOut:SetState(2) else if self.isFoldOut then self.state_foldOut:SetState(1) else self.state_foldOut:SetState(0) UIUtils.SetActive(self.img_Red, self.foldRed) end end end function UIActivityNotice:OnButtonClicked(comp) if comp == self.btn_Open then self:OnFoldOutNotice() elseif comp == self.btn_Back or comp == self.btn_Back2 then self:OnFoldInNotice() elseif comp == self.btn_DailyActivities then UIUtils.SetActive(self.group_DailyActivities, false) MDL.Activities.RecordContinuousLineTarget(self.continuousLineTargetID) CTL.Activities.OpenActivityWindowByID(self.continuousLineTargetID) end end function UIActivityNotice:OnClosed() MDL.HomeMain.SetLastNoticeRed(self.foldRed) end return UIActivityNotice