local XSpringFestivalBoxGift = require("XEntity/XSpringFestival/XSpringFestivalBoxGift") local XSpringFestivalFriendRequestInfo = require("XEntity/XSpringFestival/XSpringFestivalFriendRequestInfo") XSpringFestivalActivityManagerCreator = function() local tableInsert = table.insert local tableRemove = table.remove local tableSort = table.sort local pairs = pairs local XSpringFestivalActivityManager = {} local _CurrRecvRewardInfo = {} local _RecvFinalRewardTimes = 0 local _CurrActivityId = 0 local _GiftBoxData = {} local _FriendRequestList = {} local _RequestWordId = 0 local _LastRequestTime = 0 local _LastSendGuildRequestTime = 0 local _SequenceSuccessCount = 0 local _EggList = {} local _TodayScore = 0 local _CurrentScore = 0 local _HighestScore = 0 local _TodayScoreRewardStatus = 0 local _LastUseItemData = { Buff = 0, SafetyProtect = 0, Hammer = 1 } local CollectWordsRequestWordCd = CS.XGame.Config:GetInt("CollectWordsRequestWordCd") local CollectWordsRequestWordGuildCd = CS.XGame.Config:GetInt("CollectWordsRequestWordGuildCd") local CollectWordsGiftBoxMaxCount = CS.XGame.Config:GetInt("CollectWordsGiftBoxMaxCount") local CollectWordsRecvRequestMaxCount = CS.XGame.Config:GetInt("CollectWordsRecvRequestMaxCount") local CollectWordsRequestWordFriendCd = CS.XGame.Config:GetInt("CollectWordsRequestWordFriendCd") -----------------------集字相关 begin---------------------------- local GetAlreadyRecvTimes = function(type) for i = 1, #_CurrRecvRewardInfo do if type == _CurrRecvRewardInfo[i].Id then return _CurrRecvRewardInfo[i].AlreadyRecvTimes end end return 0 end function XSpringFestivalActivityManager.GetCanGetNumberByType(type) local itemList = XSpringFestivalActivityConfigs.GetWordsItemListByType(type) local min for _, item in pairs(itemList) do local count = XDataCenter.ItemManager.GetCount(item.Id) if not min or count < min then min = count end end return XMath.Clamp(min, 0, XSpringFestivalActivityConfigs.GetCollectWordsRewardMaxCount(type) - GetAlreadyRecvTimes(type)) end function XSpringFestivalActivityManager.CheckRewardIsMaxCount(type) for i = 1, #_CurrRecvRewardInfo do if type == _CurrRecvRewardInfo[i].Id then return _CurrRecvRewardInfo[i].AlreadyRecvTimes >= XSpringFestivalActivityConfigs.GetCollectWordsRewardMaxCount(type) end end return false end function XSpringFestivalActivityManager.CheckIsInGuildRequestCd() local now = XTime.GetServerNowTimestamp() local offset = now - _LastSendGuildRequestTime return offset < CollectWordsRequestWordGuildCd, CollectWordsRequestWordGuildCd - offset end function XSpringFestivalActivityManager.GetAlreadyRecvTimes(type) for _,v in pairs(_CurrRecvRewardInfo) do if v.Id == type then return v.AlreadyRecvTimes end end end function XSpringFestivalActivityManager.GetCollectWordDuringDay() local startTime = XSpringFestivalActivityManager.GetActivityStartTime() local now = XTime.GetServerNowTimestamp() local offset = now - startTime return math.ceil(offset / (3600 * 24)) end function XSpringFestivalActivityManager.GetGiftBoxDataByIndex(index) return _GiftBoxData[index] end function XSpringFestivalActivityManager.GetGiftCount() return #_GiftBoxData end function XSpringFestivalActivityManager.GetRequestWordId() return _RequestWordId end function XSpringFestivalActivityManager.HasRequestWord() return _RequestWordId > 0 end function XSpringFestivalActivityManager.GetNextRequestRefreshTime() local nextRecoverTime = XTime.GetSeverNextRefreshTime() local now = XTime.GetServerNowTimestamp() return nextRecoverTime - now end function XSpringFestivalActivityManager.GetNextRequestTime() local now = XTime.GetServerNowTimestamp() local during = now - _LastRequestTime local offset = CollectWordsRequestWordCd - during if offset < 0 then offset = 0 end return offset end function XSpringFestivalActivityManager.CheckCanGetCollectWordsReward(type) if type == XSpringFestivalActivityConfigs.CollectWordsRewardType.Final then return XSpringFestivalActivityManager.GetCanRecvFinalRewardTimes() > 0 end if XSpringFestivalActivityManager.CheckRewardIsMaxCount(type) then return false end local costItemList = XSpringFestivalActivityConfigs.GetCollectWordsRewardCostItemList(type) local costItemCount = XSpringFestivalActivityConfigs.GetCollectWordsRewardCostCountList(type) local need = 0 for i = 1, #costItemList do local itemCount = XDataCenter.ItemManager.GetCount(costItemList[i]) if itemCount < costItemCount[i] then need = need + costItemCount[i] - itemCount end end local universalWordId = XSpringFestivalActivityConfigs.GetWordsItemListByType(XSpringFestivalActivityConfigs.CollectCardType.Universal) local universalWordCount = 0 for i = 1, #universalWordId do universalWordCount = universalWordCount + XDataCenter.ItemManager.GetCount(universalWordId[i].Id) end return need == 0 or universalWordCount >= need, need end function XSpringFestivalActivityManager.CheckCanGetRewardWithoutUniversal(type) local costItemList = XSpringFestivalActivityConfigs.GetCollectWordsRewardCostItemList(type) local costItemCount = XSpringFestivalActivityConfigs.GetCollectWordsRewardCostCountList(type) local need = 0 for i = 1, #costItemList do local itemCount = XDataCenter.ItemManager.GetCount(costItemList[i]) if itemCount < costItemCount[i] then need = need + costItemCount[i] - itemCount end end return need == 0 end function XSpringFestivalActivityManager.GetCanRecvFinalRewardTimes() local min = _CurrRecvRewardInfo[1].AlreadyRecvTimes return XMath.Clamp(min - _RecvFinalRewardTimes, 0, min) end function XSpringFestivalActivityManager.GetRecvFinalRewardTimes() return _RecvFinalRewardTimes end function XSpringFestivalActivityManager.CheckHasUnReceiveGift() for _,giftInfo in pairs(_GiftBoxData) do if not giftInfo:IsReceive() then return true end end return false end -----------------------集字相关 end---------------------------- -----------------------砸蛋相关 begin-------------------------- local ResetEggList = function() for _, v in pairs(_EggList) do v.IsBroken = false end end local UpdateEggListByPlace = function(place, isBroken) for _, v in pairs(_EggList) do if v.Place == place then v.IsBroken = isBroken end end end local UpdateLastUseItemData = function(data) if not data then return end _LastUseItemData.Hammer = data.Hammer == 0 and 1 or data.Hammer _LastUseItemData.SafetyProtect = data.SafetyProtect _LastUseItemData.Buff = data.Buff end function XSpringFestivalActivityManager.GetSmashEggsSequenceSuccessCount() return _SequenceSuccessCount end function XSpringFestivalActivityManager.GetSmashEggsEggList() return _EggList end function XSpringFestivalActivityManager.GetSmashEggsTodayScore() return _TodayScore end function XSpringFestivalActivityManager.GetSmashEggsCurrentScore() return _CurrentScore end function XSpringFestivalActivityManager.GetSmashEggsHighestScore() return _HighestScore end function XSpringFestivalActivityManager.CheckRewardIsReceive(index) return 1 << index & _TodayScoreRewardStatus > 0 end function XSpringFestivalActivityManager.GetTodayScoreRewardStatus() return _TodayScoreRewardStatus end function XSpringFestivalActivityManager.GetCurrHammer() return _LastUseItemData.Hammer end function XSpringFestivalActivityManager.GetCurrBuffItem() return _LastUseItemData.Buff end function XSpringFestivalActivityManager.GetCurrSafetyProtect() return _LastUseItemData.SafetyProtect end function XSpringFestivalActivityManager.CheckIsNeedTip() return _SequenceSuccessCount >= XSpringFestivalActivityConfigs.GetNeedTipCount() end function XSpringFestivalActivityManager.GetSequenceSuccessCount() return _SequenceSuccessCount end -----------------------砸蛋相关 end---------------------------- -----------------------活动相关 begin-------------------------- function XSpringFestivalActivityManager.IsOpen() local isOpen = XFunctionManager.CheckInTimeByTimeId(XSpringFestivalActivityConfigs.GetSpringFestivalActivityTimeId()) if not isOpen then XUiManager.TipText("SpringFestivalNotOpen") end return isOpen end function XSpringFestivalActivityManager.IsActivityEnd() local endTime = XSpringFestivalActivityManager.GetActivityEndTime() local now = XTime.GetServerNowTimestamp() return now >= endTime end function XSpringFestivalActivityManager.IsActivityStart() local startTime = XSpringFestivalActivityManager.GetActivityStartTime() local now = XTime.GetServerNowTimestamp() return now >= startTime end function XSpringFestivalActivityManager.OpenActivityMain() if XSpringFestivalActivityManager.IsOpen() then XLuaUiManager.Open("UiFubenSpringFestivalChapter") else end end function XSpringFestivalActivityManager.OpenMainWithClose() if XSpringFestivalActivityManager.IsOpen() then XLuaUiManager.PopThenOpen("UiFubenSpringFestivalChapter") else end end function XSpringFestivalActivityManager.GetSmashEggsActivityDay() local smashActivityTimeId = XSpringFestivalActivityConfigs.GetSpringFestivalActivityTimeId() local now = XTime.GetServerNowTimestamp() local startTime = XFunctionManager.GetStartTimeByTimeId(smashActivityTimeId) return math.ceil((now-startTime) / (3600 * 24)) end function XSpringFestivalActivityManager.OnActivityEnd() if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") or XLuaUiManager.IsUiLoad("UiSettleLose") or XLuaUiManager.IsUiLoad("UiSettleWin") then return end XUiManager.TipText("SpringFestivalOver") XLuaUiManager.RunMain() end function XSpringFestivalActivityManager.GetActivityStartTime() local timeId = XSpringFestivalActivityConfigs.GetSpringFestivalActivityTimeId() return XFunctionManager.GetStartTimeByTimeId(timeId) end function XSpringFestivalActivityManager.GetActivityEndTime() local timeId = XSpringFestivalActivityConfigs.GetSpringFestivalActivityTimeId() return XFunctionManager.GetEndTimeByTimeId(timeId) end function XSpringFestivalActivityManager.GetActivityChapter() local chapter = {} if XSpringFestivalActivityManager.IsOpen() then local tempChapter = {} tempChapter.Id = XSpringFestivalActivityConfigs.GetSpringFestivalActivityId() tempChapter.Type = XDataCenter.FubenManager.ChapterType.SpringFestivalActivity tempChapter.BannerBg = XSpringFestivalActivityConfigs.GetSpringFestivalActivityBg() tableInsert(chapter, tempChapter) end return chapter end -----------------------活动相关 end---------------------------- -----------------------数据相关 begin---------------------------- local function UpdateRequestWordList(requestList) _FriendRequestList = {} for _, requestInfo in pairs(requestList) do local temp = XSpringFestivalFriendRequestInfo.New(requestInfo) tableInsert(_FriendRequestList, temp) end end function XSpringFestivalActivityManager.GetFriendRequestList() return _FriendRequestList end function XSpringFestivalActivityManager.GetFriendRequestByType(type) local requestList = {} for _, info in pairs(_FriendRequestList) do if info:GetFromType() == type then tableInsert(requestList, info) end end return requestList end function XSpringFestivalActivityManager.GetFriendRequestInfoByIndex(index) return _FriendRequestList[index] end -----------------------数据相关 end------------------------------ -----------------------推送相关 begin---------------------------- local UpdateCurrActivityId = function(Id) _CurrActivityId = Id or _CurrActivityId end local UpdateGetRewardInfo = function(data) if not data then return end _CurrRecvRewardInfo = data table.sort(_CurrRecvRewardInfo, function(a, b) return a.AlreadyRecvTimes < b.AlreadyRecvTimes end) end local UpdateRecvFinalRewardTimes = function(times) if not times then return end _RecvFinalRewardTimes = times end local function UpdateGiftBoxData(data) if not data then return end _GiftBoxData = {} for _, v in pairs(data) do local temp = XSpringFestivalBoxGift.New(v) tableInsert(_GiftBoxData, temp) end tableSort(_GiftBoxData,function(a,b) if a:IsReceive() ~= b:IsReceive() then return not a:IsReceive() end end) CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_GIFT_BAG_REFRESH) end local function SetAllGiftReceived() for _, v in pairs(_GiftBoxData) do v:SetReceive(true) end end local function UpdateRequestWordData(data) if not data then return end _RequestWordId = data.WordId or _RequestWordId _LastRequestTime = data.LastRequestTime or _LastRequestTime _LastSendGuildRequestTime = data.LastSendGuildRequestTime or _LastSendGuildRequestTime end function XSpringFestivalActivityManager.NotifyCollectWordsActivityData(data) if not data then return end UpdateRecvFinalRewardTimes(data.JackpotRecvRewardTime) UpdateGetRewardInfo(data.RecvHalfRewardRecordData) UpdateCurrActivityId(data.ActivityId) UpdateGiftBoxData(data.GiftBoxData) UpdateRequestWordData(data.RequestWordData) CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_COLLECT_CARD_REFRESH) end function XSpringFestivalActivityManager.NotifyRecvHalfRewardRecordInfo(data) if not data then return end UpdateRecvFinalRewardTimes(data.JackpotRecvRewardTime) UpdateGetRewardInfo(data.RecvHalfRewardRecordData) CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_COLLECT_CARD_REFRESH) end function XSpringFestivalActivityManager.NotifyCollectWordsRequestInfoChange(data) if not data then return end UpdateRequestWordData(data.RequestWordData) end function XSpringFestivalActivityManager.NotifyRecvGiftFromOther(data) if not data and not data.GiftData then return end for i = 1,#data.GiftData do local giftData = XSpringFestivalBoxGift.New(data.GiftData[i]) tableInsert(_GiftBoxData, giftData) if #_GiftBoxData > CollectWordsGiftBoxMaxCount then local min = XTime.GetServerNowTimestamp() local index = 0 for i = 1, #_GiftBoxData do if min > _GiftBoxData[i]:GetTime() then min = _GiftBoxData[i]:GetTime() index = i end end tableRemove(_GiftBoxData,index) end end tableSort(_GiftBoxData,function(a,b) if a:IsReceive() ~= b:IsReceive() then return not a:IsReceive() end end) XEventManager.DispatchEvent(XEventId.EVENT_SPRING_FESTIVAL_GIFT_BAG_RED) CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_GIFT_BAG_REFRESH) end function XSpringFestivalActivityManager.NotifySmashEggsActivityData(data) if not data then return end _SequenceSuccessCount = data.SequenceSuccessCount or _SequenceSuccessCount _EggList = data.EggsData or _EggList _TodayScore = data.TodayScore or _TodayScore _CurrentScore = data.CurrentScore or _CurrentScore _HighestScore = data.HighestScore or _HighestScore _TodayScoreRewardStatus = data.TodayScoreRewardStatus or _TodayScoreRewardStatus UpdateLastUseItemData(data.LastUseItemData) CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_SMASH_EGGS_REFRESH) end function XSpringFestivalActivityManager.NotifySmashEggsActivityDailyReset(data) if not data then return end _TodayScoreRewardStatus = data.TodayScoreRewardStatus or _TodayScoreRewardStatus _TodayScore = data.TodayScore or _TodayScore CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_SMASH_EGGS_REFRESH) end -----------------------推送相关 end---------------------------- -----------------------请求相关 begin---------------------------- --送字给好友或公会成员请求 function XSpringFestivalActivityManager.CollectWordsGiveWordToOthersRequest(wordId, otherId,isRequest, callback) local count = XDataCenter.ItemManager.GetCount(wordId) if count == 0 then XUiManager.TipText("SpringFestivalItemCantSend") return end local request = { WordId = wordId, OtherId = otherId,IsRequest = isRequest } XNetwork.Call("CollectWordsGiveWordToOthersRequest", request, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if callback then callback(res.RewardGoodsList) end end) end --领取上下阕奖励请求 function XSpringFestivalActivityManager.CollectWordsRecvRewardRequest(type, callback) local request = { Type = type } XNetwork.Call("CollectWordsRecvRewardRequest", request, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_COLLECT_CARD_REFRESH) if callback then callback(res.RewardGoodsList) end end) end -- 领取终极大奖奖励请求 function XSpringFestivalActivityManager.CollectWordsRecvGrandPrizeRewardRequest(callback) XNetwork.Call("CollectWordsRecvGrandPrizeRewardRequest", nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if callback then callback(res.RewardGoodsList) end end) end --更新求字请求 function XSpringFestivalActivityManager.CollectWordsRequestWordRequest(wordId, callback) local request = { WordId = wordId } XNetwork.Call("CollectWordsRequestWordRequest", request, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end UpdateRequestWordData(res.RequestWordInfo) if XDataCenter.GuildManager.IsJoinGuild() then local chatData = { ChannelType = ChatChannelType.Guild, MsgType = ChatMsgType.SpringFestival, Content = CS.XTextManager.GetText("SpringFestivalCollectCardGuildHelp", XDataCenter.ItemManager.GetItemName(XSpringFestivalActivityManager.GetRequestWordId())), TargetIds = { XPlayer.Id } } XDataCenter.ChatManager.SendChat(chatData, function() if callback then callback() end end) else if callback then callback() end end end) end function XSpringFestivalActivityManager.CollectWordsRequestWordToFriendRequest(friendId, callback) local request = { FriendId = friendId } XNetwork.Call("CollectWordsRequestWordToFriendRequest", request, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if callback then callback() end end) end --向公会求字请求 function XSpringFestivalActivityManager.CollectWordsRequestWordToGuildRequest(callback) XNetwork.Call("CollectWordsRequestWordToGuildRequest", nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local chatData = { ChannelType = ChatChannelType.Guild, MsgType = ChatMsgType.SpringFestival, Content = CS.XTextManager.GetText("SpringFestivalCollectCardGuildHelp", XDataCenter.ItemManager.GetItemName(XSpringFestivalActivityManager.GetRequestWordId())), TargetIds = { XPlayer.Id } } XDataCenter.ChatManager.SendChat(chatData, function() if callback then callback() end end) end) end --一键领取礼物盒中的礼物请求 function XSpringFestivalActivityManager.CollectWordsRecvWordGiftFromGiftBoxRequest(callback) XNetwork.Call("CollectWordsRecvWordGiftFromGiftBoxRequest", nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end SetAllGiftReceived() CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_COLLECT_CARD_REFRESH) if callback then callback() end end) end function XSpringFestivalActivityManager.CollectWordsRefreshRequestWordListRequest(callback) XNetwork.Call("CollectWordsRefreshRequestWordListRequest", nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end UpdateRequestWordList(res.RequestList) if callback then callback() end end) end function XSpringFestivalActivityManager.SmashEggRequest(eggPlace, useItem, callback) local request = { EggPlace = eggPlace, UseItemData = useItem } XNetwork.Call("SmashEggRequest", request, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_SMASH_EGGS_REFRESH) if callback then callback(res.IsSuccess, res.DropItem, res.AddScore) end end) end function XSpringFestivalActivityManager.SmashEggsGetActivationDailyRewardRequest(index, callback) local request = { StageIndex = index } XNetwork.Call("SmashEggsGetActivationDailyRewardRequest", request, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end _TodayScoreRewardStatus = res.TodayScoreRewardStatus or _TodayScoreRewardStatus CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_SMASH_EGGS_REFRESH) if callback then callback(res.RewardList) end end) end function XSpringFestivalActivityManager.SmashEggsConvertScoreRequest(callback) XNetwork.Call("SmashEggsConvertScoreRequest", nil, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end _CurrentScore = 0 _SequenceSuccessCount = 0 CsXGameEventManager.Instance:Notify(XEventId.EVENT_SPRING_FESTIVAL_SMASH_EGGS_REFRESH) if callback then callback() end end) end function XSpringFestivalActivityManager.SmashEggsResetEggsRequest(list, callback) local request = { ResetList = list } XNetwork.Call("SmashEggsResetEggsRequest", request, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end ResetEggList() if callback then callback() end end) end -----------------------请求相关 end---------------------------- return XSpringFestivalActivityManager end -----------------------协议相关 begin---------------------------- XRpc.NotifyCollectWordsActivityData = function(data) XDataCenter.SpringFestivalActivityManager.NotifyCollectWordsActivityData(data) end XRpc.NotifyCollectWordsRequestInfoChange = function(data) XDataCenter.SpringFestivalActivityManager.NotifyCollectWordsRequestInfoChange(data) end XRpc.NotifyRecvHalfRewardRecordInfo = function(data) XDataCenter.SpringFestivalActivityManager.NotifyRecvHalfRewardRecordInfo(data) end XRpc.NotifyRecvGiftFromOther = function(data) XDataCenter.SpringFestivalActivityManager.NotifyRecvGiftFromOther(data) end XRpc.NotifySmashEggsActivityData = function(data) XDataCenter.SpringFestivalActivityManager.NotifySmashEggsActivityData(data) end XRpc.NotifySmashEggsActivityDailyReset = function(data) XDataCenter.SpringFestivalActivityManager.NotifySmashEggsActivityDailyReset(data) end -----------------------协议相关 end----------------------------