--- 管理游戏所有功能的开关状态 --- Created by Steven. --- DateTime: 2019/5/9 16:07 ActTimeCtrlManager = {}; local this = ActTimeCtrlManager local AllActSetConfig = ConfigManager.GetConfig(ConfigName.GlobalSystemConfig) local censorshipConfig = ConfigManager.GetConfig(ConfigName.MainLevelConfig) local gameSetConfig = ConfigManager.GetConfig(ConfigName.GameSetting) local vipConfig = ConfigManager.GetConfig(ConfigName.VipLevelConfig) local GuideConfig = ConfigManager.GetConfig(ConfigName.GuideConfig) -- 整数的服务器时间 this.serTime = 0 local lastTime local count = 0 local sendTime = 0 --时间间隔 local fixedTime = 1 local noVersion = {} -- 服务数据 this.serData = {} function this.Initialize() lastTime = this.serTime this.hasSendMsg = false -- 工坊等级提升 Game.GlobalEvent:AddEvent(GameEvent.WorkShow.WorkShopLvChange, function() local lv = WorkShopManager.WorkShopData.lv this.CheckFuncActiveByType(3, lv) end) -- 等级提升 Game.GlobalEvent:AddEvent(GameEvent.Player.OnLevelChange, function() local lv = PlayerManager.level this.CheckFuncActiveByType(2, lv) end) -- 关卡解锁 Game.GlobalEvent:AddEvent(GameEvent.Mission.OnOpenFight, function(fightId) --Log("关卡通关,id = "..fightId) this.CheckFuncActiveByType(1, fightId) end) end -- 当功能解锁条件变化时检测 function this.CheckFuncActiveByType(activeType, params) local ids = {} for id, funcData in pairs(this.serData) do local funcInfo = ConfigManager.GetConfigData(ConfigName.GlobalSystemConfig, id) if funcInfo.OpenRules[1] == activeType then local typeId = funcInfo.IsIDdSame local isActive = this.SingleFuncState(typeId) --Log("检测功能是否已解锁,id = "..id..", isActive = "..tostring(isActive)) local aGuideId = AllActSetConfig[typeId].GuideId if AllActSetConfig[aGuideId] and AllActSetConfig[aGuideId].IsOpen and AllActSetConfig[aGuideId].IsOpen> 0 then if ActivityGiftManager.IsActivityTypeOpen(ActivityGiftManager.GetActivityTypeFromId(GuideConfig[aGuideId].IsOpen)) then table.insert(ids,typeId) end elseif not funcData.isActive and isActive then --Log(">>>>>>功能解锁:id = "..funcInfo.Id..", name = "..funcInfo.Name) -- 未解锁,但是判断已解锁 --Game.GlobalEvent:DispatchEvent(GameEvent.FunctionCtrl.OnFunctionOpen, typeId) table.insert(ids,typeId) elseif funcData.isActive and not isActive then --Log(">>>>>>功能关闭:id = "..funcInfo.Id..", name = "..funcInfo.Name) -- 已解锁但是判断未解锁 --Game.GlobalEvent:DispatchEvent(GameEvent.FunctionCtrl.OnFunctionClose, typeId) table.insert(ids,typeId) end -- 保存状态 funcData.isActive = isActive end end table.sort(ids,function(a,b) local aGuideId = AllActSetConfig[a].GuideId local bGuideId = AllActSetConfig[b].GuideId if (GuideConfig[aGuideId] and GuideConfig[bGuideId]) then return GuideConfig[aGuideId].Sort < GuideConfig[bGuideId].Sort elseif (not GuideConfig[aGuideId] and not GuideConfig[aGuideId]) then return a < b else return GuideConfig[aGuideId] and not GuideConfig[bGuideId] end end) for i = 1 ,#ids do Game.GlobalEvent:DispatchEvent(GameEvent.FunctionCtrl.OnFunctionOpen, ids[i]) end end -- 初始化服务器数据 function this.InitMsg(msg) if #msg.functionOfTime == 0 then Log(Language[10765]) return end for i = 1, #msg.functionOfTime do local t = msg.functionOfTime[i] local id = t.functionId local startTime = t.startTime local endTime = t.endTime local restTime = t.interval local switch = t.switch this.serData[id] = {} this.serData[id].id = id this.serData[id].startTime = startTime this.serData[id].endTime = endTime this.serData[id].restTime = restTime this.serData[id].switch = switch LogGreen(string.format("--- 功能解锁数据 id = %s, startTime = %s, endTime = %s, switch = %s",id, startTime, endTime, switch)) -- 用于标记是否解锁使用 local typeId = AllActSetConfig[id].IsIDdSame this.serData[id].isActive = this.SingleFuncState(typeId) end this.WatchFuncState() end -- 根据活动类型获取当前活动表数据 local ActTypeConfigList = {} -- 做一个缓存避免重复遍历表数据 function this.GetTableDataByTypeId(typeId) if not ActTypeConfigList[typeId] then ActTypeConfigList[typeId] = ConfigManager.GetAllConfigsDataByKey(ConfigName.GlobalSystemConfig, "IsIDdSame", typeId) end return ActTypeConfigList[typeId] end -- 根据活动类型获取当前活动得数据 function this.GetSerDataByTypeId(typeId) local configList = this.GetTableDataByTypeId(typeId) for _, config in ipairs(configList) do local actId = config.Id if this.serData[actId] then return this.serData[actId] end end end -- //////////////////////////////////////////////////////////////////////////// -- 根据服务器时间更新 function this.Updata() if this.serTime ~= lastTime then lastTime = this.serTime this.FixedUpDate() end end -- 1秒更新一次 function this.FixedUpDate() count = count + 1 this.WatchFuncState() if count == fixedTime then -- 每fixedTime更新一次 count = 0 -- do something end if this.hasSendMsg then sendTime = sendTime + 1 if sendTime >= 5 then sendTime = 0 this.hasSendMsg = false end end end -- /////////////////////////////////////////////////////////////////////////// -- 监测所有活动状态 function this.WatchFuncState() for i, v in pairs(this.serData) do local typeId = AllActSetConfig[i].IsIDdSame if this.IsQualifiled(typeId) then local timeType = "" if this.serTime >= v.startTime and this.serTime < v.endTime then --活动结束倒计时 local closeTime = v.endTime - this.serTime --local showStr = os.date("%d天%H时%M分%S秒",closeTime) local showStr = FormatSecond(closeTime) timeType = Language[10766] .. showStr else local openTime = 0 openTime = v.startTime - this.serTime if openTime > 0 then --local showStr = os.date("%Y年%M月%d日%H时%M分%S秒", 30) local showStr = FormatSecond(openTime) timeType = Language[10767] .. showStr end end this.serData[i].countDown = timeType -- 活动计时文字 this.serData[i].isOpen = this.SingleFuncState(typeId) -- 活动开启状态 -- 活动开启前同步一次状态 if this.serTime == v.startTime + 1 then if not this.hasSendMsg then this.hasSendMsg = true NetManager.GetAllFunState(function () Log("服务器返回活动消息") Game.GlobalEvent:DispatchEvent(GameEvent.FunctionCtrl.OnFunctionOpen, typeId) end) end end -- 活动结束前同步一次状态 if this.serTime == v.endTime + 1 then if not this.hasSendMsg then this.hasSendMsg = true NetManager.GetAllFunState(function () Log("服务器返回活动消息") Game.GlobalEvent:DispatchEvent(GameEvent.FunctionCtrl.OnFunctionClose, typeId) end) end end end end end -- /////////////////////////////////////////////////////////////////////////// -- 检测某一活动开启与否 function this.FuncTimeJudge(id) local isActive = false local serData = this.GetSerDataByTypeId(id) if serData then local startTime = serData.startTime local endTime = serData.endTime if this.serTime >= startTime and this.serTime <= endTime then isActive = true else isActive = false end else end return isActive end -- 活动状态, 返回提示文字 function this.GetFuncTip(id) local tip = "" local qualifiled = this.IsQualifiled(id) local isActive = this.FuncTimeJudge(id) if noVersion[id] then tip = Language[10768] return tip end if not qualifiled then -- 相同活动类型解锁数据相同,所以只用第一个进行判断 local data = this.GetTableDataByTypeId(id)[1] local rules = data.OpenRules if rules[1] == 1 then tip = string.format(Language[10769], GetLanguageStrById(censorshipConfig[rules[2]].Name)) elseif rules[1] == 2 then tip = string.format(Language[10279], rules[2]) elseif rules[1] == 3 then tip = string.format("伙伴共鸣英雄等级达到%s开启", rules[2]) end else if not isActive then if id == FUNCTION_OPEN_TYPE.ARENA then tip = Language[10772] else tip = Language[10773] end end end return tip end -- 活动总状态 function this.SingleFuncState(id) if id==42066 then local t=1 end local isOpen = false local qualifiled = this.IsQualifiled(id) local isOpen = this.IsSwitchOpen(id) local isActive = this.FuncTimeJudge(id) local isSpecialActive = this.IsSpecialActive(id) if isOpen and qualifiled and isActive and isSpecialActive then isOpen = true else isOpen = false end return isOpen end -- 传入活动的ID, 显示活动期间文字 function this.ShowActText(id) local serData = this.GetSerDataByTypeId(id) if not serData then return end -- 如果活动正在进行,返回活动开启结束文字 if this.FuncTimeJudge(id)then local beginStr = os.date(Language[10774],this.serData[id].startTime) local endStr = os.date(Language[10774],this.serData[id].endTime) return beginStr, endStr else return Language[10775] end end -- 玩家是否有资格开启 function this.IsQualifiled(id) -- 相同类型活动解锁类型相同,所以只判断第一个 if id==26001 then local t=1 end local data = this.GetTableDataByTypeId(id)[1] if not data then return false end if data.IsOpen == 0 then --Log("此功能不在版本范围内!") noVersion[id] = true return false else noVersion[id] = false end -- 当前玩家等级 local qualifiled = false local playerLv = PlayerManager.level local openRule = data.OpenRules if openRule[1] == 1 then -- 关卡开启 qualifiled = FightPointPassManager.IsFightPointPass(openRule[2]) elseif openRule[1] == 2 then -- 等级开启 qualifiled = playerLv >= openRule[2] elseif openRule[1] == 3 then -- 鸿蒙阵神将共鸣等级 qualifiled = HarmonyManager.GetSingleAdditions(HarmonyAddType.AddLv) >= openRule[2] end --1#创角 --2#开服 -- local curTime=GetTimeStamp() -- if data.IfOpen then -- local type=data.IfOpen[1] -- local dayNum=data.IfOpen[2] -- if type==1 then -- if curTime= value if isPass then num = num + 1 end end end return num end -- 上阵位置解锁条件 function this.UnLockCondition(index) local tip = Language[10776] local formatData = GetLanguageStrById(gameSetConfig[1].HeroLocation) local judgeType = formatData[index][1] local value = formatData[index][2] if judgeType == 1 then -- 关卡判断 tip = Language[10309] .. GetLanguageStrById(censorshipConfig[value].Name) elseif judgeType == 2 then -- 等级判断 tip = Language[10777] .. tostring(value) .. Language[10065] end return tip end -- 下一个解锁可上阵的条件 function this.NextArmCondition() -- 当前已经解锁的数量 local nextIndex = this.MaxArmyNum() + 1 if nextIndex>= this.MaxArmyNum() then nextIndex= this.MaxArmyNum() end local formatData = GetLanguageStrById(gameSetConfig[1].HeroLocation) local judgeType = formatData[nextIndex][1] local value = formatData[nextIndex][2] local nextTip = Language[10778] if judgeType == 1 then -- 关卡判断 nextTip = Language[10309] .. GetLanguageStrById(censorshipConfig[value].Name) .. Language[10779] elseif judgeType == 2 then -- 等级判断 nextTip = Language[10777] .. tostring(value) .. Language[10780] end return nextTip end -- 获取某模块剩余开放时间 -1 表示未开放/已关闭 function this.GetActLeftTime(typeId) -- 检测数据正确性 local serData = this.GetSerDataByTypeId(typeId) if not typeId or not serData then return -1 end -- 判断时间戳 local curTimeStamp = GetTimeStamp()---毫秒 if curTimeStamp < serData.startTime then --- 时间未到 return -1 end -- 计算剩余时间 local leftTime = math.floor(serData.endTime - curTimeStamp) return leftTime end -- 获取某模块剩余开放时间 -1 表示未开放/已关闭 function this.GetActEndTime(typeId) -- 检测数据正确性 local serData = this.GetSerDataByTypeId(typeId) if not typeId or not serData then return -1 end return serData.endTime end function this.GetActOpenTime(id) local serData = this.GetSerDataByTypeId(id) if not serData then return end if this.SingleFuncState(id) then return end local openTime = serData.startTime - this.serTime local str = FormatSecond(openTime) return str end -- 最大上阵异妖数量 function this.MaxDemonNum() local maxNum = 0 local gameSettingConFig = ConfigManager.GetConfigData(ConfigName.GameSetting,1).DifferLocation for i = 1, #gameSettingConFig do if gameSettingConFig[i][1] == 1 then--关卡判断 if FightPointPassManager.IsFightPointPass(gameSettingConFig[i][2]) then maxNum = maxNum + 1 end elseif gameSettingConFig[i][1] == 2 then--等级判断 if PlayerManager.level >= gameSettingConFig[i][2] then maxNum = maxNum + 1 end end end return maxNum end -- 开启下一个位置需要的VIP等级, 只有未解锁的才有用 function this.DemonNeedVipLv(index,srtType) local gameSettingConFig = ConfigManager.GetConfigData(ConfigName.GameSetting,1).DifferLocation for i = 1, #gameSettingConFig do if i == index then if gameSettingConFig[i][1] == 1 then--关卡判断 local str = "" if srtType == 1 then str = Language[10309]..string.gsub(GetLanguageStrById(ConfigManager.GetConfigData(ConfigName.MainLevelConfig,gameSettingConFig[i][2]).Name),"-","|") else str = Language[10309]..GetLanguageStrById(ConfigManager.GetConfigData(ConfigName.MainLevelConfig,gameSettingConFig[i][2]).Name) end return str elseif gameSettingConFig[i][1] == 2 then--等级判断 return Language[10781]..gameSettingConFig[i][2] end end end end -- 异妖上阵数量提示内容 function this.TipText(index) local tip = this.DemonNeedVipLv(index,2) .. Language[10782] return tip end -- 恶心的副本的单独提示 function this.CarbonOpenTip() local minFight = 99999 local minLevel = 99999 local openRuleList = {} -- table.insert(openRuleList, AllActSetConfig[17].OpenRules) -- table.insert(openRuleList, AllActSetConfig[18].OpenRules) -- table.insert(openRuleList, AllActSetConfig[30].OpenRules) -- table.insert(openRuleList, AllActSetConfig[46].OpenRules) --根据副本里面功能 等级最低的设置提示 table.insert(openRuleList, AllActSetConfig[44].OpenRules) for i = 1, #openRuleList do local openRule = openRuleList[i][1] local openValue = openRuleList[i][2] if openRule == 1 then minFight = minFight < openValue and minFight or openValue elseif openRule == 2 then minLevel = minLevel < openRule and minLevel or openValue end end local str = "" if minLevel < 99999 and minFight ~= 99999 then str = string.format(Language[10783], GetLanguageStrById(censorshipConfig[minFight].Name), minLevel) elseif minLevel == 99999 then str = string.format(Language[10784], GetLanguageStrById(censorshipConfig[minFight].Name)) elseif minFight == 99999 then str = string.format(Language[10785], minLevel) end return str end --系统开启规则提示 type 开启系统类型 function this.SystemOpenTip(type) local str="" if AllActSetConfig[type].OpenRules[1]==1 then str=string.format(Language[10786],GetLanguageStrById(censorshipConfig[AllActSetConfig[type].OpenRules[2]].Name)) elseif AllActSetConfig[type].OpenRules[1]==2 then str=string.format(Language[10787],AllActSetConfig[type].OpenRules[2]) elseif AllActSetConfig[type].OpenRules[1]==3 then str=string.format("伙伴共鸣英雄等级达到%s开启",AllActSetConfig[type].OpenRules[2]) end return str end -- 一些功能特殊判断 function this.IsSpecialActive(id) if id == FUNCTION_OPEN_TYPE.WEEK_CARD then return WeekCardManager.IsWeekCardOpen() end return true end return this