local OperationActivity_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local OperationActivityData = require 'Modules/OperationActivity/OperationActivityData' ---每次新的运营活动需要在此,手动增加一个ActivityType的枚举型 ---对应HotActivityTypeEnum这个运营活动表 OperationActivity_Model.ActivityType = { DailySignIn = 1, -- 每日签到 StageSignIn = 2, -- 阶段签到 Hegemony = 3, -- 霸业之始 GoldenHero = 4, -- 金将活动 PushGift = 5, -- 活动礼包(定向礼包) Monopoly = 7, -- 大富翁(九州秘宝) HonorOrder = 8, -- 战令 DirectGift = 9, -- 直购礼包 HorseRear = 10, -- 养马(饲育大师) BattlefieldMuster = 11, -- 号令天下(沙场点兵) SuperGold = 12, -- 彩金将活动 FreeBuy = 13, -- 0元购 -- WarZoneAuction = 14, -- 异域珍奇 -- 原大拍卖type = 14,现在改成了18,14这个废弃 LuckyLottery = 15, -- 幸运扭蛋 NewYear = 16, -- 新年活动 WarZoneAuction = 18, -- 大拍卖 AnniversaryPrepare = 19, -- 新年预热 TreasureBowl = 20, -- 聚宝盆 FriendRecharge = 21, -- 金兰邀约 FestivalLogin = 23, -- 节日签到 RedEnvelopeRain = 22, -- 红包雨 CycleRecharge = 24, -- 聚宝赠礼(周期累充) GodBeastActivity = 26, -- 神兽活动 FunctionUpdateNotice = 27, -- 版本更新内容 Turntable = 32, -- 转盘 DouYinRechargeReward = 33, -- 渠道专属充值返利活动 GoldHeroReprint = 10004, -- 金将返场抽卡活动 APPPushGift = 34, --推送召回礼包 SubjectMonth = 35, --主题月活动 } ---运营活动的时间类型枚举 OperationActivity_Model.TimeType = { NaturalTime = 1, --自然时间 SinceServerOpen = 2, --开服时间 SinceFuncUnlock = 3, --创角或功能解锁后持续 Forever = 4, --永久 Activity = 5, --随活动时间 } function OperationActivity_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushHotActivityData, private.UpdateOAStaticData) private.operationActivityInfo = {} private.dataEntryList = {} end function private.SetDataEntry(data) OperationActivityData.SetData(data) for entry, func in pairs(OperationActivityData.GetDataEntry()) do OperationActivity_Model[entry] = func end EventSystem.Dispatch(EventID.UI_OperationActivity_DataChanged) end function private.UpdateOAStaticData(msg) logging.log(LTAG.OA, "MessageG2CPushHotActivityData", msg.HotActivityData) xpcall(private.SetDataEntry, private.OAErrorMsg, msg.HotActivityData) if IsProtoDataNotNil(msg.FreePurchaseIapGiftFreeReturn) then --0元购IAP礼包返还龙玉数据 MDL.FreeBuy.SyncIapGiftFreeReturnInfo(msg.FreePurchaseIapGiftFreeReturn) end end function OperationActivity_Model.SetOAInfo(msgData, info) local data = msgData and msgData.HotActivityData if data and IsServerDataNotNil(data) then xpcall(private.SetDataEntry, private.OAErrorMsg, data) end if info.isHasDoingActivity then if IsServerDataNotNil(info.doingActivity) then xpcall(OperationActivity_Model.SetOperationActivityInfo, private.OAErrorMsg, info.doingActivity) else xpcall(OperationActivity_Model.ClearOperationActivityInfo, private.OAErrorMsg) end end --在静态数据改变或者doingActivity变化的时候,通过请求养马的信息来替代主动推送过来 if (data and IsServerDataNotNil(data)) or info.isHasDoingActivity then xpcall(MDL.HorseRear.HorseRearInfoRequest, private.OAErrorMsg) xpcall(MDL.GodBeastActivity.GodBeastActivityInfoRequest, private.OAErrorMsg) end if info.isTaskRedPoints then -- 服务器在2022年3月改为了登录推全量,playerChange推增量。这次改动跟服务器对齐 xpcall(MDL.OACommon.SetOARedPoint, private.OAErrorMsg, info.activityTaskRedPoints) end if IsServerDataNotNil(info.signInfo) then xpcall(MDL.SignIn.SetStageSignInInfo, private.OAErrorMsg, info.signInfo) end if IsServerDataNotNil(info.hegemonyInfo) then xpcall(MDL.Hegemony.SetHegemonyInfo, private.OAErrorMsg, info.hegemonyInfo) if data and IsServerDataNotNil(data) then xpcall(CTL.Hegemony.InitHegemonyRedPointTree, private.OAErrorMsg) end -- 触发霸业之始活动打脸图 xpcall(MDL.PushInterface.TriggerHegemony, private.OAErrorMsg, info.hegemonyInfo) end if IsServerDataNotNil(info.pushGiftInfo) then xpcall(MDL.PushGift.SetPushGiftArray, private.OAErrorMsg, info.pushGiftInfo.gifts) end if IsServerDataNotNil(info.goldHeroInfo) then --为了防止服务器发送已过期的活动数据导致报错 if CTL.OperationActivity.IsOperationActivityTypeOpen(OperationActivity_Model.ActivityType.GoldenHero) then xpcall(MDL.GoldenHeroFame.SyncGoldHeroFameInfo, private.OAErrorMsg, info.goldHeroInfo) -- 触发金将活动打脸图 xpcall(MDL.PushInterface.TriggerGoldHero, private.OAErrorMsg, info.goldHeroInfo) xpcall(MDL.GoldenHeroBoss.SetBossRelevantInfo, private.OAErrorMsg, info.goldHeroInfo) end end --0元购信息 (这个放在直购礼包前面,确保有数据) if IsServerDataNotNil(info.freePurOpens) then MDL.FreeBuy.SyncActivityInfo(info.freePurOpens) end --0元购IAP礼包返还龙玉数据 if IsServerDataNotNil(msgData) and IsProtoDataNotNil(msgData.FreePurchaseIapGiftFreeReturn) then MDL.FreeBuy.SyncIapGiftFreeReturnInfo(msgData.FreePurchaseIapGiftFreeReturn) end if IsServerDataNotNil(info.directGiftInfo) then local directGiftInfo = info.directGiftInfo xpcall(MDL.DirectGift.SetBuyingCountInfo, private.OAErrorMsg, directGiftInfo.gifts) if directGiftInfo.needUpdateTimeInfo then xpcall(MDL.DirectGift.SetDirectGiftInfo, private.OAErrorMsg, directGiftInfo.timeInfos) end end if IsServerDataNotNil(info.monopolyRedPoints) then xpcall(MDL.Monopoly.SetActivityInfo, private.OAErrorMsg, info.monopolyRedPoints) end -- 战令奖励信息 if IsServerDataNotNil(info.honorInfo) then xpcall(MDL.HonorOrder.SyncHonorOrderAwardInfo, private.OAErrorMsg, info.honorInfo) end --沙场点兵 if IsServerDataNotNil(info.commandWorldInfo) then --为了防止服务器发送已过期的活动数据导致报错 if CTL.OperationActivity.IsOperationActivityTypeOpen(OperationActivity_Model.ActivityType.BattlefieldMuster) then MDL.CommandTheWorld.SynActivityInfo(info.commandWorldInfo) end end --region ***************** 彩金将活动 *************************** -- 彩金将动态信息 if IsServerDataNotNil(info.superGoldInfo) then xpcall(MDL.SuperGoldMain.SyncSuperGoldMainInfo, private.OAErrorMsg, info.superGoldInfo) xpcall(MDL.PushInterface.TriggerSuperGold, private.OAErrorMsg, info.superGoldInfo) end -- 彩金将-战令动态信息 if IsServerDataNotNil(info.subHonorInfos) then xpcall(MDL.SuperGoldHonorOrder.SyncHonorOrderInfo, private.OAErrorMsg, info.subHonorInfos) end --扭蛋(所有活动的扭蛋都在这) if IsServerDataNotNil(info.capsuleInfo) then xpcall(MDL.SuperGoldLottery.SynActivityInfo, private.OAErrorMsg, info.capsuleInfo) --扭蛋抽奖 end --endregion ***************** 彩金将活动 *************************** if IsServerDataNotNil(info.luckyLotteryInfo) then xpcall(CTL.LuckyLottery.RefreshRedPointInfo, private.OAErrorMsg, info.luckyLotteryInfo) end --新年活动 if IsServerDataNotNil(info.newYearInfo) then xpcall(MDL.NewYear.SetInfo, private.OAErrorMsg, info.newYearInfo) xpcall(MDL.AnniversaryLuckyDraw.SetInfo, private.OAErrorMsg, info.newYearInfo) end --聚宝盆 if IsServerDataNotNil(info.treasureBowlInfo) then xpcall(MDL.TreasureBowl.SetBowlInfo, private.OAErrorMsg, info.treasureBowlInfo) end --聚宝赠礼(周期累充) if IsProtoDataNotNil(info.cycleRecharge) then xpcall(MDL.CycleRecharge.SyncRechargeInfo, private.OAErrorMsg, info.cycleRecharge) end if IsServerDataNotNil(info.anniversaryPrepareInfo) then xpcall(CTL.AnniversaryPrepare.RefreshRedPointInfo, private.OAErrorMsg, info.anniversaryPrepareInfo) end -- 金兰之邀 if IsServerDataNotNil(info.friendRechargeInfo) then xpcall(MDL.FriendRecharge.SyncFriendRechargeInfo, private.OAErrorMsg, info.friendRechargeInfo) end -- 节日签到 if IsServerDataNotNil(info.festivalInfo) then xpcall(MDL.FestivalLogin.SyncFestivalLoginInfos, private.OAErrorMsg, info.festivalInfo) end -- 版本更新内容 if IsServerDataNotNil(info.verIntroduce) then xpcall(MDL.FunctionUpdateNotice.SyncInfos, private.OAErrorMsg, info.verIntroduce) end if IsServerDataNotNil(info.ContinuousRecharge) then xpcall(MDL.CycleRecharge.SyncWeekInfos, private.OAErrorMsg, info.ContinuousRecharge) end -- 渠道专属充值返利活动 if IsServerDataNotNil(info.douYinRechargeInfo) then xpcall(MDL.DouYinRechargeReward.SyncInfos, private.OAErrorMsg, info.douYinRechargeInfo) end --转盘 if IsServerDataNotNil(info.petCasinoInfo) then xpcall(MDL.Turntable.SyncInfo, private.OAErrorMsg, info.petCasinoInfo) end --主题月活动 if IsProtoDataNotNil(info.subjectMonthInfo) then xpcall(MDL.SubjectMonth.SyncInfo, private.OAErrorMsg, info.subjectMonthInfo) end EventSystem.Dispatch(EventID.UI_OperationActivity_InfoChanged) end function OperationActivity_Model.SetOperationActivityInfo(info) OperationActivity_Model.ClearOperationActivityInfo() for i, v in ipairs(info) do if not private.operationActivityInfo[v.activityType] then private.operationActivityInfo[v.activityType] = {} end local activityInfo = {} activityInfo.activityId = v.activityId activityInfo.activityType = v.activityType activityInfo.startTime = v.startTime activityInfo.endTime = v.endTime if v.activityType == OperationActivity_Model.ActivityType.BattlefieldMuster or v.activityType == OperationActivity_Model.ActivityType.WarZoneAuction or v.activityType == OperationActivity_Model.ActivityType.SuperGold or v.activityType == OperationActivity_Model.ActivityType.RedEnvelopeRain or v.activityType == OperationActivity_Model.ActivityType.NewYear or v.activityType == OperationActivity_Model.ActivityType.AnniversaryPrepare then -- 跨服活动,开始时间是5:00,服务器需要时间处理,所以客户端延后5:05再显示入口 activityInfo.entryStartTime = v.startTime + 5 * UTL.Time.TotalSecondsOneMinute private.operationActivityInfo[v.activityType][v.activityId] = activityInfo private.InitDelayOpenEntryTimer(activityInfo.entryStartTime) else activityInfo.entryStartTime = v.startTime private.operationActivityInfo[v.activityType][v.activityId] = activityInfo end end CTL.OperationActivity.InitOperationActivityRedPoint() end function private.InitDelayOpenEntryTimer(activityDelayStartTime) if private.delayOpenEntryTimer then return end local time = activityDelayStartTime - UTL.Time.GetServerTimestamp() + 1 if time > 0 then private.delayOpenEntryTimer = TimerUtil.Interval(function() private.delayOpenEntryTimer = nil EventSystem.Dispatch(EventID.UI_OperationActivity_InfoChanged) end, time, 1) end end function OperationActivity_Model.GetOperationActivityInfo(typeId, activityId) if activityId then if private.operationActivityInfo[typeId] then return private.operationActivityInfo[typeId][activityId] end else return private.operationActivityInfo[typeId] end end function OperationActivity_Model.ClearOperationActivityInfo() private.operationActivityInfo = {} end --获取运营活动的道具来源 function OperationActivity_Model.GetActivityItemSourcesById(itemId, heroTypeID) local data = {} local typeId = heroTypeID and heroTypeID or 0 local sourceData = DataSheetManager.ActivityItemAcquisition:GetDataByItemID_HeroTypeID(itemId, typeId) if sourceData then local sources = sourceData.SourceIds for i, v in ipairs(sources) do table.insert(data, MDL.ItemSources.GetSourceDataById(v, itemId)) end table.sort(data, private.SortItemSources) end return data end function OperationActivity_Model.GetHeroTypeId(activityType, activityId) local heroTypeId = 0 --金将活动 if activityType == MDL.OperationActivity.ActivityType.GoldenHero then heroTypeId = MDL.GoldenHeroMain.GetHeroTypeByActivityId(activityId) return heroTypeId end return heroTypeId end function private.SortItemSources(sourceDataA, sourceDataB) local isUnlockA = sourceDataA.isUnlock local isUnlockB = sourceDataB.isUnlock if isUnlockA == isUnlockB then return sourceDataA.sort < sourceDataB.sort else return isUnlockA > isUnlockB end end --获取运营活动时间段文字 function OperationActivity_Model.GetTimePeriodDesc(typeId, activityId, timeFormat, linkFormat) timeFormat = timeFormat or UTL.Time.FormatDateEnum.YMDHM linkFormat = linkFormat or "%s - %s" local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(typeId, activityId) if activityInfo then local startTime = os.date(timeFormat, activityInfo.startTime) local endTime = os.date(timeFormat, activityInfo.endTime) return string.format(linkFormat, startTime, endTime) end return nil end function private.OAErrorMsg(msg) logging.error(LTAG.OA, "运营活动数据错误", msg) end return OperationActivity_Model