local OperationActivity_Controller = {} local private = {} local type = type --添加时需要对照HotConditionTypeEnum.proto文件中的枚举 OperationActivity_Controller.ConditionType = { TeamLevel = 1, VipLevel = 41, PassFuben = 7, TeamAndVip = 42, VipLevelAndPassFuben = 43, TeamLevelAndPassFuben = 44, All = 45, Any = 46, } --添加时需要对照HotChannelTypeEnum.proto文件中的枚举 OperationActivity_Controller.ChannelType = { All = 1, Common = 2, } --获取运营活动道具途径类型 OperationActivity_Controller.GetActivityType ={ Login = 1, --活动登录获取 Mission = 2, --活跃任务获取 Gift = 3, --活动礼包 Gold = 4, --元宝 DragonJade = 5, --龙玉 Shop = 6, --活动店铺 Special = 7, --活动特殊跳转 } function OperationActivity_Controller.InitOperationActivityRedPoint() --初始化金将体验红点 local goldHeroTypeData = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.GoldenHero) if goldHeroTypeData then for i, v in pairs(goldHeroTypeData) do CTL.GoldenHeroMain.InitRedPointTreeByActivityId(v.activityId) end end --初始化彩金红点 local superGoldTypeData = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.SuperGold) if superGoldTypeData then for i, v in pairs(superGoldTypeData) do CTL.SuperGoldMain.InitRedPointTreeByActivityId(v.activityId) end end --初始化养马红点 local horseRearTypeData = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.HorseRear) if horseRearTypeData then for i, v in pairs(horseRearTypeData) do CTL.HorseRear.InitRedPointTreeByActivityId(v.activityId) end end end --运营活动是否还在继续(附加的结束条件) function OperationActivity_Controller.IsOperationActivityStillGoing(activityType, activityId) if activityType == MDL.OperationActivity.ActivityType.StageSignIn then return CTL.SignIn.IsSignInStillGoing(activityId) end return true end --运营活动是否开放(解锁+处于活动时间) function OperationActivity_Controller.IsOperationActivityTypeOpen(activityType) local typeInfoList = MDL.OperationActivity.GetOperationActivityInfo(activityType) if typeInfoList then for key, value in pairs(typeInfoList) do if type(value) == "table" then local isOpen = OperationActivity_Controller.IsOperationActivityOpen(value) local isStillGoing = OperationActivity_Controller.IsOperationActivityStillGoing(activityType, value.activityId) if isOpen and isStillGoing then return true end end end end return false end --跨服运营活动入口是否开放(解锁+处于活动时间) function OperationActivity_Controller.IsOperationActivityTypeEntryOpen(activityType) local typeInfoList = MDL.OperationActivity.GetOperationActivityInfo(activityType) if typeInfoList then for key, value in pairs(typeInfoList) do if type(value) == "table" then local isOpen = OperationActivity_Controller.IsOperationActivityOpenEntry(value) local isStillGoing = OperationActivity_Controller.IsOperationActivityStillGoing(activityType, value.activityId) if isOpen and isStillGoing then return true end end end end return false end --运营活动类型是否解锁 function OperationActivity_Controller.IsOperationActivityTypeUnlock(activityType) if CTL.HotFix.CheckAssetIsReady("OperationActivity") == false then return end if MDL.OperationActivity.HotControlInfo then local typeDataList = MDL.OperationActivity.HotControlInfo:GetDataByActivityType_ActivityID(activityType) if typeDataList then for key, value in pairs(typeDataList) do if type(value) == "table" then if OperationActivity_Controller.IsOperationActivityUnlock(value) then return true end end end end end return false end function OperationActivity_Controller.IsOperationActivityOpen(operationActivityInfo) if operationActivityInfo then local startTime = operationActivityInfo.startTime local endTime = operationActivityInfo.endTime local nowTime = UTL.Time.GetServerTimestamp() return nowTime >= startTime and nowTime <= endTime else return false end end function OperationActivity_Controller.IsOperationActivityOpenEntry(operationActivityInfo) if operationActivityInfo then local entryStartTime = operationActivityInfo.entryStartTime local endTime = operationActivityInfo.endTime local nowTime = UTL.Time.GetServerTimestamp() return nowTime >= entryStartTime and nowTime <= endTime else return false end end function OperationActivity_Controller.IsOperationActivityUnlock(operationActivityData) if operationActivityData then local isCondition = private.IsConditionSatisfied(operationActivityData.CondID) local isChannel = private.IsChannelIdSatisfied(operationActivityData.ChannelGroupType, operationActivityData.AcceptCondition_Table) return isCondition and isChannel else return false end end function private.IsConditionSatisfied(conditionId) local conditionData = MDL.OperationActivity.HotGenCondID:GetDataByCondID(conditionId) if conditionData then for i, v in ipairs(conditionData.Task_Table) do --先临时用这个方法判断一下 if not MDL.Unlock.IsTriggerComplete(v.Trigger, nil, v.Param1) then return false end end end return true end function private.IsChannelIdSatisfied(channelType, channelIdList) if channelType == OperationActivity_Controller.ChannelType.All then return true elseif channelType == OperationActivity_Controller.ChannelType.Common then local sdkChannelId = SDKUtil.ChannelId for i, v in ipairs(channelIdList) do if v.ChannelID == tostring(sdkChannelId) then return true end end return false end end -- 按照类型获取 这个类型第一个活动剩余结束时间 function OperationActivity_Controller.GetActivityResidueTime(activityType) local typeInfoList = MDL.OperationActivity.GetOperationActivityInfo(activityType) if typeInfoList then for key, value in pairs(typeInfoList) do if type(value) == "table" then local startTime = value.startTime local endTime = value.endTime local nowTime = UTL.Time.GetServerTimestamp() if nowTime >= startTime and nowTime <= endTime then return endTime - nowTime end end end end return 0 end ---运用活动道具 跳转途径的通用执行方法 ---sourceId为表ItemSource中配置的ID,用来标识跳转到哪个功能页面;itemId 是道具ID function OperationActivity_Controller.ExecuteSourceFunctionById(activityId, activityType, sourceId, itemId, param) local sourcesData = DataSheetManager.ItemSource:GetDataByID(sourceId) if not sourcesData then logging.error(LTAG.ERROR, "not find in ItemSource" .. tostring(sourceId)) return end local type = sourcesData.Type --活动登录获取 if type == OperationActivity_Controller.GetActivityType.Login then --活跃任务获取 elseif type == OperationActivity_Controller.GetActivityType.Mission then if activityType == MDL.OperationActivity.ActivityType.Monopoly then --九州秘宝 UIManager.OpenView(Const_UI_Lua.UIEnum.UIMonopolyTasks, { selectedTypeID = 0, activityId = activityId }) elseif activityType == MDL.OperationActivity.ActivityType.HorseRear then --饲育大师 UIManager.OpenView(Const_UI_Lua.UIEnum.UIHorseRearTasks, {activityType = activityType, activityId = activityId}) elseif activityType == MDL.OperationActivity.ActivityType.GodBeastActivity then -- 神兽活动 UIManager.OpenView(Const_UI_Lua.UIEnum.UIGodBeastActivityTasks, {activityType = activityType, activityId = activityId}) elseif activityType == MDL.OperationActivity.ActivityType.BattlefieldMuster then --号令天下 if not CTL.CommandTheWorld.IsBattleAreaEnd() then UIManager.OpenView(Const_UI_Lua.UIEnum.UICommandTheWorldActiveTask,{activityType = activityType, activityId = MDL.CommandTheWorld.GetActivityId()}) end elseif activityType == MDL.OperationActivity.ActivityType.NewYear then --新年活动 CTL.NewYear.OpenView(activityId, CTL.NewYear.ViewName.UINewYearTaskPanel, {activityId = activityId, activityType = activityType}) end --活动礼包 elseif type == OperationActivity_Controller.GetActivityType.Gift then if activityType == MDL.OperationActivity.ActivityType.GoldenHero then --金将活动 UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.OperationActivity.UIOACommonDirectGiftPanel, {activityType = activityType, activityId = activityId}) elseif activityType == MDL.OperationActivity.ActivityType.SuperGold then --彩金 local heroType = MDL.SuperGoldMain.GetHeroTypeByActivityId(activityId) if heroType and heroType > 0 then local modeData = DataSheetManager.SuperGoldActivityModeData:GetDataByHeroType(heroType) UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.OperationActivity.UIOACommonDirectGiftPanel, {activityType = activityType, activityId = activityId, Title = modeData.GiftName}) end elseif activityType == MDL.OperationActivity.ActivityType.Monopoly then --九州秘宝 UIManager.OpenView(Const_UI_Lua.UIEnum.UIMonopolyPackageWindow, { activityId = activityId }) elseif activityType == MDL.OperationActivity.ActivityType.HorseRear then --饲育大师 UIManager.OpenView(Const_UI_Lua.UIEnum.UIHorseRearPackageWindow, {activityType = activityType, activityId = activityId}) elseif activityType == MDL.OperationActivity.ActivityType.GodBeastActivity then --神兽 UIManager.OpenView(Const_UI_Lua.UIEnum.UIGodBeastActivityPackageWindow, {activityType = activityType, activityId = activityId}) elseif activityType == MDL.OperationActivity.ActivityType.BattlefieldMuster then --号令天下 if not CTL.CommandTheWorld.IsBattleAreaEnd() and CTL.CommandTheWorld.IsCanShowGift() then UIManager.OpenView(Const_UI_Lua.UIEnum.UICommandTheWorldRecharge, {activityType = activityType, activityId = MDL.CommandTheWorld.GetActivityId()}) end elseif activityType == MDL.OperationActivity.ActivityType.NewYear then --新年活动 CTL.NewYear.OpenView(activityId, CTL.NewYear.ViewName.UINewYearGiftMain, {activityType = activityType, activityId = activityId, Title = "IDS_NewYearActivity_ChildTitle_5"}) elseif activityType == MDL.OperationActivity.ActivityType.GoldHeroReprint then -- 日服金将复刻活动 UIManager.OpenView(Const_UI_Lua.UIEnum.UIGoldHeroReprintRecharge, {activityType = activityType, activityId = activityId}) end --元宝\龙玉 elseif type == OperationActivity_Controller.GetActivityType.Gold or type == OperationActivity_Controller.GetActivityType.DragonJade then if activityType == MDL.OperationActivity.ActivityType.Monopoly or activityType == MDL.OperationActivity.ActivityType.HorseRear or activityType == MDL.OperationActivity.ActivityType.GodBeastActivity or activityType == MDL.OperationActivity.ActivityType.BattlefieldMuster or activityType == MDL.OperationActivity.ActivityType.NewYear --新年活动 or activityType == MDL.OperationActivity.ActivityType.GoldenHero or activityType == MDL.OperationActivity.ActivityType.SuperGold then --九州秘宝\饲育大师\号令天下 local moneyId if type == OperationActivity_Controller.GetActivityType.Gold then moneyId = MDL.Currency.CurrencyType.GoldIngot else moneyId = MDL.Currency.CurrencyType.DragonJade end local purchaseGoodData = OperationActivity_Controller.GetGoodsData(itemId, moneyId) CTL.PayMall.OpenPayMallPopUp(purchaseGoodData, activityId, activityType, activityType == activityType and "IDS_HorseActivity_ChildTitle_5") end --活动店铺 elseif type == OperationActivity_Controller.GetActivityType.Shop then if activityType == MDL.OperationActivity.ActivityType.GoldenHero then --金将活动 UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIGoldenHeroStore, {activityId = activityId}) end elseif type == OperationActivity_Controller.GetActivityType.Special then if activityType == MDL.OperationActivity.ActivityType.NewYear then --新年活动 CTL.ItemSources.ExecuteSourceFunctionById(sourceId, itemId, {activityId = activityId, activityType = activityType}) end end end function OperationActivity_Controller.GetGoodsData(itemId, moneyId) for _, v in MDL.OperationActivity.StoreGoodsData:GetEnumerator() do if v.ItemID == itemId and v.MoneyID == moneyId then return v end end logging.error(LTAG.ERROR, "运营活动静态数据表StoreGoodsData中没有找到ItemID:", itemId, " MoneyID:", moneyId, " 的数据!!!请策划检查!!!") return nil end --打开 运营活动道具通用获取界面 --customEndTime 是否使用自定义显示的结束时间,不为nil,则为自定义结束时间 function OperationActivity_Controller.OpenGetActivityItemPanel(itemId, activityId, activityType, customEndTime) local heroTypeID = MDL.OperationActivity.GetHeroTypeId(activityType, activityId) local typeId = heroTypeID and heroTypeID or 0 local isSuccess, sourceData = DataSheetManager.ActivityItemAcquisition:TryGetDataByItemID_HeroTypeID(itemId, typeId) if not isSuccess then --若某活动的道具ID或活动类型无法在表格中找到,则当玩家执行“获取路径”操作时,飘字提示“运营活动获得 CTL.Tips.AddTipsMsg(Const_IDS["IDS_ActivityItem_ActivityAcquisition"]) return end local isFindActivityType = false for i, v in pairs(MDL.OperationActivity.ActivityType) do if activityType == v then isFindActivityType = true break end end if isFindActivityType then UIManager.OpenView(Const_UI_Lua.UIEnum.OperationActivity.UIGetActivityItemPanel, {itemId = itemId,activityId = activityId,activityType = activityType, customEndTime = customEndTime}) else --若某活动的道具ID或活动类型无法在表格中找到,则当玩家执行“获取路径”操作时,飘字提示“运营活动获得 CTL.Tips.AddTipsMsg(Const_IDS["IDS_ActivityItem_ActivityAcquisition"]) end end function OperationActivity_Controller.IsNeedOpenGetActivityItemPanel(itemId, activityType, activityId) local heroTypeID = MDL.OperationActivity.GetHeroTypeId(activityType, activityId) local typeId = heroTypeID and heroTypeID or 0 if CTL.OperationActivity.IsOperationActivityTypeOpen(activityType) then local sourceData = DataSheetManager.ActivityItemAcquisition:GetDataByItemID_HeroTypeID(itemId, typeId) return sourceData ~= nil end return false end --是否可以显示礼包界面 function OperationActivity_Controller.IsCanShowGift(activityType) if activityType == MDL.OperationActivity.ActivityType.BattlefieldMuster then return CTL.CommandTheWorld.IsCanShowGift() else return true end end return OperationActivity_Controller