local GVGFight_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') GVGFight_Controller.SubscribeInterval = 180 -- 180秒 3分钟 local OpenActiveTimeRefreshId = 10308 local GVGFightBulletScreen = "GVGFight_BulletScreen" local GVGFightSeverOpenDay = DataSheetManager.ConstData:GetDataByID("GVGFightSeverOpenDay").IntValue -- 开服多少天可以开启该玩法 local GVGFightHarvestRedPointTime = DataSheetManager.ConstData:GetDataByID("GVGFightHarvestRedPointTime").IntValue * 60 -- 挂机收益最低显示红点时间(分钟) GVGFight_Controller.GVGFightChatCostItem = DataSheetManager.ConstData:GetDataByID("GVGFightChatCostItem").IntValue -- 聊天消耗道具 GVGFight_Controller.GVGFightChatCostNum = DataSheetManager.ConstData:GetDataByID("GVGFightChatCostNum").IntValue -- 聊天消耗道具数量 local GVG_FIGHT_VIEWED_SEASON_ID = "GVG_FIGHT_VIEWED_SEASON_ID" function GVGFight_Controller.OnStartup() EventSystem.Regist(EventID.ServerRedPoint_Changed, GVGFight_Controller.DealwithRedPoint) EventSystem.Regist(EventID.FunctionUnlockUpdate, private.CheckIfFuncUnlock) -- GMS EventSystem.Regist(EventID.New_Day_Refresh, private.NewDayRefresh) private.mapPosX = 0 private.mapPosY = 0 private.fightCityId = 0 private.fightCityPage = 0 private.fightCityPlayerShowType = 0 private.playGVGBullet = false end function GVGFight_Controller.SetCanPlayGVGBullet(playGVGBullet) private.playGVGBullet = playGVGBullet end function GVGFight_Controller.CanPlayGVGBullet() return private.playGVGBullet end function GVGFight_Controller.RecordCityMapPos(posX, posY) private.mapPosX = posX private.mapPosY = posY end function GVGFight_Controller.GetCityMapPos() return private.mapPosX, private.mapPosY end function GVGFight_Controller.RecordFightCityInfo(cityId, fightCityPage, playerShowType) private.fightCityId = cityId private.fightCityPage = fightCityPage private.fightCityPlayerShowType = playerShowType end function GVGFight_Controller.GetFightCityInfo() return private.fightCityId, private.fightCityPage, private.fightCityPlayerShowType end function GVGFight_Controller.SetGVGFightBulletScreenOpen(isOpen) PersistentData.PlayerData:Set(GVGFightBulletScreen, isOpen, true) end function GVGFight_Controller.GetGVGFightBulletScreenOpen() return PersistentData.PlayerData:Get(GVGFightBulletScreen, true) end function GVGFight_Controller.GetGVGFightBadgeData(badgeScore) local curGVGFightBadgeData = nil for _, v in DataSheetManager.GVGFightBadge:GetEnumerator() do if v.BadgeScore > badgeScore then break else curGVGFightBadgeData = v end end return curGVGFightBadgeData end function GVGFight_Controller.GetGVGFightNextBadgeData(badgeScore) for _, v in DataSheetManager.GVGFightBadge:GetEnumerator() do if v.BadgeScore > badgeScore then return v end end return nil end function GVGFight_Controller.OpenGVGFightMain() local isUnlock, condition = CTL.Activities.IsOpen(LuaConst.ActivityType.GVGFight) if isUnlock then local lineUpHeroCount = MDL.Player.GetLineUpHeroCount() if lineUpHeroCount < 6 then -- 不满6人时无法开启该界面 CTL.Tips.AddTipsMsg(Const_IDS.IDS_ERRORCODE_1024_InfoCode_PeopleNotEnough) else GVGFight_Controller.SetCanPlayGVGBullet(true) UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIGVGFightMain) -- 清空当前弹幕 CTL.BulletScreen.ClearScreen() end else CTL.Tips.AddTipsMsg(condition) end end -- 不要直接使用此方法 请使用 CTL.Activities.IsOpen(LuaConst.ActivityType.GVGFight) function GVGFight_Controller.IsOpenGVGFight() -- 特殊判断需要达到开服多少天后方可进入该活动 if MDL.Player.GetPersonalServerDayCount() < GVGFightSeverOpenDay then return false, UTL.Color.FormatRedColor(string.FormatByIdsId(Const_IDS.IDS_GVGFight_ServerOpenDaysTips, GVGFightSeverOpenDay)) else if UTL.Time.GetServerTimestamp() < UTL.Time.GetConfigTimestampById(OpenActiveTimeRefreshId) then return false, UTL.Color.FormatRedColor(UIUtils.GetLocalizedTxt(Const_IDS.IDS_GVGFight_Season_GroupTips2)) end end return true, "" end function private.NewDayRefresh() if MDL.GVGFight.IsInOffSeasonWeekState() then EventSystem.Dispatch(EventID.UI_Shop_ForceClose) end GVGFight_Controller.DealwithRedPoint() end function private.CheckIfFuncUnlock(funcId, isUnlock) if funcId == MDL.Unlock.FunctionType.GVGFight and not isUnlock then --关闭各种相关界面 UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightTransferTips) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightAttack) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightCityGuardingArray) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightSeasonReward) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightMedalList) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightSeasonMedal) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightWarReport) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightWarTasks) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightRank) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightRewardInfo) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightSeasonStage) UIManager.CloseView(Const_UI_Lua.UIEnum.UIGVGFightTransferTips) if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGVGFightGarrisonTroops) then CTL.HomeMain.ClosePushedView(Const_UI_Lua.UIEnum.UIGVGFightGarrisonTroops) end if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGVGFightMain) then CTL.HomeMain.ClosePushedView(Const_UI_Lua.UIEnum.UIGVGFightMain) end end end function GVGFight_Controller.IsExistInGVGFightMain() return UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGVGFightMain) end function GVGFight_Controller.IsExistInGVGFightTroops() return UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGVGFightGarrisonTroops) end -- 阶段变化需要重新计算红点 function GVGFight_Controller.DealwithRedPoint() local isInOffSeasonWeekState = MDL.GVGFight.IsInOffSeasonWeekState() local isShowHomeHint = false -- 优先取消收益红点计时器 if private.timerHandle then TimerUtil.Remove(private.timerHandle) private.timerHandle = nil end if not isInOffSeasonWeekState and private.IsNewSeasonStruggleStart() then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.GVGFight_NewSeasonStruggleStart) isShowHomeHint = true else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_NewSeasonStruggleStart) end -- 徽章红点 if not isInOffSeasonWeekState and MDL.GVGFight.GetBadgeTaskRedPoint() then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.GVGFight_SeasonMedal) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_SeasonMedal) end -- 战报红点 if not isInOffSeasonWeekState and MDL.RedPoint.GetEnterWorldRedPoint(MDL.RedPoint.EnterWorldRedPointType.GVGFightWarReport) then isShowHomeHint = true CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.GVGFight_WarReport) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_WarReport) end -- 赛季任务\助力\收益\可布置城池 仅在争夺期、激战期显示红点 local curGVGFightState = MDL.GVGFight.GetCurGVGFightState() if curGVGFightState == MDL.GVGFight.GVGFightStage.Struggle or curGVGFightState == MDL.GVGFight.GVGFightStage.Fierce then -- 赛季任务红点 if MDL.GVGFight.GetSeasonTaskRedPoint() then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.GVGFight_SeasonTask) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_SeasonTask) end -- 助力红点 if MDL.Guild.IsHasGuild() and MDL.GVGFight.GetAssistNum() == 0 then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.GVGFightAssist) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFightAssist) end -- 收益红点 local incomeTime = MDL.GVGFight.GetIncomeTime() if incomeTime >= GVGFightHarvestRedPointTime then isShowHomeHint = true CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.GVGFight_Reward) else -- 没达到时间 取消红点 并挂一个计时器处理后续红点 CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_Reward) private.timerHandle = TimerUtil.Interval(GVGFight_Controller.DealwithRedPoint, GVGFightHarvestRedPointTime - incomeTime + 1, 1) -- 比收益时间多1秒 保证红点计算正确 end -- 在大营可布置城池红点 if MDL.GVGFight.IsInCampCity() then isShowHomeHint = true CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.GVGFight_CanOccupyCity) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_CanOccupyCity) end else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_SeasonTask) CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFightAssist) CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_Reward) CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.GVGFight_CanOccupyCity) end -- 如果说收益和战报有红点需要主城显示气泡 if not isInOffSeasonWeekState and isShowHomeHint then CTL.HomeMain.AddMainNotice(CTL.HomeMain.NoticeType.GVGFight) else CTL.HomeMain.RemoveMainNotice(CTL.HomeMain.NoticeType.GVGFight) end -- 整体活动的红点 EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.GVGFight, CTL.RedPoint.GetRedPointActive(CTL.RedPoint.RedPointKey.GVGFight)) end function private.IsNewSeasonStruggleStart() local curGVGFightState = MDL.GVGFight.GetCurGVGFightState() if curGVGFightState ~= MDL.GVGFight.GVGFightStage.Struggle then return false end if PersistentData.PlayerData:Get(GVG_FIGHT_VIEWED_SEASON_ID, -1) < MDL.GVGFight.GetCurSeasonId() then return true end return false end function GVGFight_Controller.SetCurSeasonStruggleViewed() local curGVGFightState = MDL.GVGFight.GetCurGVGFightState() if curGVGFightState == MDL.GVGFight.GVGFightStage.Struggle then PersistentData.PlayerData:Set(GVG_FIGHT_VIEWED_SEASON_ID, MDL.GVGFight.GetCurSeasonId(), true) GVGFight_Controller.DealwithRedPoint() end end function GVGFight_Controller.EnterLevelError(errorCode) if errorCode == 3332 then -- 错误码特殊处理 "目标已经不在该城池" EventSystem.Dispatch(EventID.GVGFight_CloseUIGVGFightAttack) end -- 刷新城池内界面 MDL.GVGFight.GVGCityInnerInfoReq(MDL.GVGFight.GetCityInsideInfoBelongCityId(), true, true) end function GVGFight_Controller.CanNotShowApplicationPauseHint() local levelType = LevelManager.LevelType if levelType == nil then return true end return levelType == LuaConst.LevelType.AttackCity and (UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGVGFightMain) or UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGVGFightGarrisonTroops)) end function GVGFight_Controller.GetSeasonMinID() local curSeasonId = MDL.GVGFight.GetCurSeasonId() local seasonMinID = 0 for _, data in DataSheetManager.GVGFightCitySeasonReward:GetEnumerator() do if curSeasonId >= data.SeasonIDMin then seasonMinID = data.SeasonIDMin else break end end return seasonMinID end --是否显示税收店铺 function GVGFight_Controller.IsShowStore() if MDL.GVGFight.IsInOffSeasonWeekState() then --计算下赛季分组期当天5点时间戳 --先加2周时间为分组期开始时间,再减掉6小时为当日5点 local nextSubGroupTime = MDL.GVGFight.GetGVGFightStageOpenTime(MDL.GVGFight.GVGFightStage.SubGroup) + UTL.Time.TotalSecondsOneWeek * 2 - UTL.Time.TotalSecondsOneHour * 6 if UTL.Time.GetServerTimestamp() >= nextSubGroupTime then return true end return false end return true end return GVGFight_Controller