PGRData/Script/matrix/xmanager/XNewActivityCalendarManager.lua

374 lines
15 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
XNewActivityCalendarManagerCreator = function()
local XNewActivityCalendar = require("XEntity/XNewActivityCalendar/XNewActivityCalendar")
local XNewActivityCalendarActivityEntity = require("XEntity/XNewActivityCalendar/Entity/XNewActivityCalendarActivityEntity")
local XNewActivityCalendarPeriodEntity = require("XEntity/XNewActivityCalendar/Entity/XNewActivityCalendarPeriodEntity")
---@class XNewActivityCalendarManager
local XNewActivityCalendarManager = {}
---@type XNewActivityCalendar
local ActivityCalendarViewModel = nil
---@type table<number, XNewActivityCalendarActivityEntity>
local ActivityEntity = {}
---@type table<number, XNewActivityCalendarPeriodEntity>
local PariodEntity = {}
local RequestProto = {
NewActivityCalendarGetDataRequest = "NewActivityCalendarGetDataRequest"
}
---@return XNewActivityCalendarActivityEntity
function XNewActivityCalendarManager.GetActivityEntity(activityId)
if not XTool.IsNumberValid(activityId) then
return
end
local entity = ActivityEntity[activityId]
if not entity then
entity = XNewActivityCalendarActivityEntity.New(activityId)
ActivityEntity[activityId] = entity
end
return entity
end
---@return XNewActivityCalendarPeriodEntity
function XNewActivityCalendarManager.GetPeriodEntity(periodId)
if not XTool.IsNumberValid(periodId) then
return
end
local entity = PariodEntity[periodId]
if not entity then
entity = XNewActivityCalendarPeriodEntity.New(periodId)
PariodEntity[periodId] = entity
end
return entity
end
---@return XNewActivityCalendar
function XNewActivityCalendarManager.GetViewModel()
return ActivityCalendarViewModel
end
function XNewActivityCalendarManager.NewActivityCalendarGetDataRequest(cb)
XNetwork.Call(RequestProto.NewActivityCalendarGetDataRequest, nil, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
--public XNewActivityCalendarDataDb NewActivityCalendarData;
ActivityCalendarViewModel:UpdateRewardInfos(res.NewActivityCalendarData)
if cb then
cb()
end
end)
end
function XNewActivityCalendarManager.NotifyNewActivityCalendarData(data)
--public List<int> OpenActivityIds;
--public XNewActivityCalendarDataDb NewActivityCalendarData;
if not ActivityCalendarViewModel then
ActivityCalendarViewModel = XNewActivityCalendar.New()
end
ActivityCalendarViewModel:UpdateData(data)
end
function XNewActivityCalendarManager.GetIsOpen(noTips)
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.NewActivityCalendar, false, noTips) or XUiManager.IsHideFunc then
return false
end
local viewModel = XNewActivityCalendarManager.GetViewModel()
if not viewModel then
if not noTips then
XUiManager.TipText("CommonActivityNotStart")
end
return false
end
return true
end
-- 获取周历活动信息(包含未开启、活动中)
function XNewActivityCalendarManager.GetCalenderActivityInfo()
local tempInfo = {}
local allCalendarCfg = XNewActivityCalendarConfigs.GetAllCalendarActivityConfig()
for _, calendarCfg in pairs(allCalendarCfg) do
local activityEntity = XNewActivityCalendarManager.GetActivityEntity(calendarCfg.ActivityId)
if activityEntity and (activityEntity:CheckActivityNotOpen() or activityEntity:CheckInActivity()) then
table.insert(tempInfo, activityEntity)
end
end
return tempInfo
end
-- 获取奖励信息(活动中)
function XNewActivityCalendarManager.GetRewardItemData(activityId, isShowAllTemplate)
local mainTemplateData, extraItemData = XNewActivityCalendarManager.GetTemplateData(activityId, true)
if isShowAllTemplate then
local tempData = appendArray(mainTemplateData, extraItemData)
return tempData
end
if not XNewActivityCalendarManager.CheckIsAllReceiveMainTemplate(mainTemplateData) or XTool.IsTableEmpty(extraItemData) then
return mainTemplateData
end
return extraItemData
end
-- 获取奖励数据(活动中)
-- return 1 核心奖励 2 额外奖励
function XNewActivityCalendarManager.GetTemplateData(activityId, isCheckNotOpen)
local mainTemplateData = {}
local extraItemData = {}
local activityEntity = XNewActivityCalendarManager.GetActivityEntity(activityId)
if not activityEntity then
return mainTemplateData, extraItemData
end
-- 总核心奖励
local totalMainTemplateData = activityEntity:GetTotalMainTemplateData()
-- 额外奖励
extraItemData = activityEntity:GetExtraItemData()
-- 未开启显示总核心奖励
local isShowAllTemplate = isCheckNotOpen and activityEntity:CheckActivityNotOpen() or false
if isShowAllTemplate then
return totalMainTemplateData, extraItemData
end
-- 已结束的时间断奖励信息
local endItemData = {}
local periodIds = activityEntity:GetPeriodId()
for _, periodId in pairs(periodIds) do
local periodEntity = XNewActivityCalendarManager.GetPeriodEntity(periodId)
if periodEntity then
local tempTemplateData = periodEntity:GetMainTemplateData(activityId)
if periodEntity:CheckInTime() then
mainTemplateData = appendArray(mainTemplateData, tempTemplateData)
elseif periodEntity:CheckEndTime() then
endItemData = appendArray(endItemData, tempTemplateData)
end
end
end
-- 合并相同的数据
mainTemplateData = XNewActivityCalendarManager.MergeAndSortList(mainTemplateData)
endItemData = XNewActivityCalendarManager.MergeAndSortList(endItemData)
local totalTemplateDict = {}
for _, info in pairs(totalMainTemplateData) do
totalTemplateDict[info.TemplateId] = info
end
local endItemDict = {}
for _, info in pairs(endItemData) do
endItemDict[info.TemplateId] = info
end
-- 数据有可能会保存在已结束的时间断内 需要使用总的数量减去结束的数量(如果结束的领取数量大于配置的数量,实际的数量需要加上结束的差值)
for _, info in pairs(mainTemplateData) do
local totalTemplate = totalTemplateDict[info.TemplateId]
local endTemplate = endItemDict[info.TemplateId]
local endLerp = 0
local curReceiveCount = totalTemplate.ReceiveCount
if endTemplate then
endLerp = endTemplate.ReceiveCount - endTemplate.Count
curReceiveCount = totalTemplate.ReceiveCount - endTemplate.ReceiveCount
end
if endLerp > 0 then
curReceiveCount = curReceiveCount + endLerp
end
info.ReceiveCount = curReceiveCount
end
return mainTemplateData, extraItemData
end
function XNewActivityCalendarManager.MergeAndSortList(data)
if XTool.IsTableEmpty(data) then
return {}
end
local mergeList = {}
local mergeDict = {}
for _, info in pairs(data) do
local oldData = mergeDict[info.TemplateId]
if oldData then
mergeDict[info.TemplateId].Count = mergeDict[info.TemplateId].Count + info.Count
mergeDict[info.TemplateId].ReceiveCount = mergeDict[info.TemplateId].ReceiveCount + info.ReceiveCount
else
mergeDict[info.TemplateId] = {
TemplateId = info.TemplateId,
Count = info.Count,
ReceiveCount = info.ReceiveCount,
}
end
end
for _, info in pairs(mergeDict) do
table.insert(mergeList, info)
end
table.sort(mergeList, function(a, b)
return a.TemplateId > b.TemplateId
end)
return mergeList
end
-- 检查核心奖励是否全部已领取
function XNewActivityCalendarManager.CheckIsAllReceiveMainTemplate(data)
if XTool.IsTableEmpty(data) then
return true
end
for _, info in pairs(data) do
local count = info.Count - info.ReceiveCount
if count > 0 then
return false
end
end
return true
end
-- 检查核心奖励是否有未领取的奖励
function XNewActivityCalendarManager.CheckNotReceiveMainTemplate(activityId)
local mainTemplateData = XNewActivityCalendarManager.GetTemplateData(activityId)
local isReceive = XNewActivityCalendarManager.CheckIsAllReceiveMainTemplate(mainTemplateData)
return not isReceive
end
-- 检查在活动中是否有未领取的奖励
function XNewActivityCalendarManager.CheckInActivityNotReceiveReward()
local viewModel = XNewActivityCalendarManager.GetViewModel()
if not viewModel then
return false
end
local activityIds = viewModel:GetOpenActivityIds()
for _, activityId in pairs(activityIds) do
local mainTemplateData = XNewActivityCalendarManager.GetTemplateData(activityId)
local isReceive = XNewActivityCalendarManager.CheckIsAllReceiveMainTemplate(mainTemplateData)
if not isReceive then
return true
end
end
return false
end
-- 检查是否有新活动开启
function XNewActivityCalendarManager.CheckIsNewActivityOpen()
local viewModel = XNewActivityCalendarManager.GetViewModel()
if not viewModel then
return false
end
local activityIds = viewModel:GetOpenActivityIds()
local localActivityIds = XNewActivityCalendarManager.GetLocalActivityIds()
for _, id in pairs(activityIds) do
if not table.contains(localActivityIds, id) then
return true
end
end
return false
end
-- 检查是否需要播放特效
--1、刷光特效
--1大前提只有满足这个前提才会出现改特效新周历内的活动还有未领取完的核心奖励
--2每日登录关闭主界面所有弹窗后播放一次即可
--3有新活动开启后返回主界面播放一次即可
function XNewActivityCalendarManager.CheckIsNeedPlayEffect()
if XNewActivityCalendarManager.CheckIsPlayEffect() then
return false
end
local isRadPoint = XNewActivityCalendarManager.CheckActivityCalendarRadPoint()
if isRadPoint then
XNewActivityCalendarManager.SaveIsPlayEffect(true)
return true
end
return false
end
-- 检查是否需要显示红点
--2、摇铃动效
--1大前提只有满足这个前提才会出现改特效新周历内的活动还有未领取完的核心奖励
--2出现时机每日登录和有新活动开启
--3消失时机玩家点进新周历结束
function XNewActivityCalendarManager.CheckActivityCalendarRadPoint()
if not XNewActivityCalendarManager.CheckInActivityNotReceiveReward() then
return false
end
if not XNewActivityCalendarManager.CheckIsDailyFirstLogin() then
return true
end
if XNewActivityCalendarManager.CheckIsNewActivityOpen() then
return true
end
return false
end
--1、有新活动开启时 提示文本【新活动开启了】
--2、有未领完核心奖励活动开启 提示文本【丰厚奖励活动】
--3、领完核心奖励活动但还有活动正在进行 提示文本【这里有些活动】
function XNewActivityCalendarManager.GetMainBtnShowTextDesc()
if XNewActivityCalendarManager.CheckIsNewActivityOpen() then
return XUiHelper.GetText("UiNewActivityCalendarBtnTips1")
end
if XNewActivityCalendarManager.CheckInActivityNotReceiveReward() then
return XUiHelper.GetText("UiNewActivityCalendarBtnTips2")
end
return XUiHelper.GetText("UiNewActivityCalendarBtnTips3")
end
--region 本地数据
function XNewActivityCalendarManager.GetDailyFirstLoginKey()
local time = XTime.GetSeverTodayFreshTime()
return string.format("NewActivityCalendarDailyFirstLogin_%s_%s", XPlayer.Id, time)
end
function XNewActivityCalendarManager.CheckIsDailyFirstLogin()
local key = XNewActivityCalendarManager.GetDailyFirstLoginKey()
local data = XSaveTool.GetData(key) or 0
return data == 1
end
function XNewActivityCalendarManager.SaveIsDailyFirstLogin()
local key = XNewActivityCalendarManager.GetDailyFirstLoginKey()
local data = XSaveTool.GetData(key) or 0
if data == 1 then
return
end
XSaveTool.SaveData(key, 1)
end
function XNewActivityCalendarManager.GetPlayEffectKey()
return string.format("NewActivityCalendarPlayEffect_%s", XPlayer.Id)
end
function XNewActivityCalendarManager.CheckIsPlayEffect()
local key = XNewActivityCalendarManager.GetPlayEffectKey()
local data = XSaveTool.GetData(key) or 0
return data == 1
end
function XNewActivityCalendarManager.SaveIsPlayEffect(value)
local key = XNewActivityCalendarManager.GetPlayEffectKey()
XSaveTool.SaveData(key, value and 1 or 0)
end
function XNewActivityCalendarManager.GetLocalActivityIdsKey()
return string.format("NewActivityCalendarLocalActivityIds_%s", XPlayer.Id)
end
function XNewActivityCalendarManager.GetLocalActivityIds()
local key = XNewActivityCalendarManager.GetLocalActivityIdsKey()
return XSaveTool.GetData(key) or {}
end
function XNewActivityCalendarManager.SaveLoaclActivityIds()
local key = XNewActivityCalendarManager.GetLocalActivityIdsKey()
local viewModel = XNewActivityCalendarManager.GetViewModel()
local activityIds = {}
if viewModel then
activityIds = viewModel:GetOpenActivityIds()
end
XSaveTool.SaveData(key, activityIds)
end
--endregion
function XNewActivityCalendarManager.Init()
end
XNewActivityCalendarManager.Init()
return XNewActivityCalendarManager
end
XRpc.NotifyNewActivityCalendarData = function(data)
XDataCenter.NewActivityCalendarManager.NotifyNewActivityCalendarData(data)
end