Files
StellaSora_DataLua/lua/game/ui/activitylist/activitylistctrl.lua
T
SL1900 80af235e05 Update - 1.12.0.120
EN: 1.12.0.120
CN: 1.12.0.120
JP: 1.12.0.124
KR: 1.12.0.124
2026-06-30 14:30:00 +09:00

495 lines
19 KiB
Lua

local ActivityListCtrl = class("ActivityListCtrl", BaseCtrl)
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local ResTypeAny = GameResourceLoader.ResType.Any
local LocalData = require("GameCore.Data.LocalData")
ActivityListCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
loopSv = {
sNodeName = "sv",
sComponentName = "LoopScrollView"
},
trSv = {sNodeName = "sv", sComponentName = "Transform"},
rtContent = {
sNodeName = "---Content---",
sComponentName = "RectTransform"
},
animRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "Animator"
},
goRewardList = {
sCtrlName = "Game.UI.MainlineEx.RewardListCtrl"
}
}
ActivityListCtrl._mapEventConfig = {
ShowActRewardList = "OnEvent_ShowActRewardList"
}
local sEntranceFolder_old = "UI_Activity/%s/%s.prefab"
local sEntranceFolder = "UI_Activity/%s.prefab"
local sActTypePath = {
[GameEnum.activityType.PeriodicQuest] = "PeriodicQuest",
[GameEnum.activityType.LoginReward] = "LoginReward",
[GameEnum.activityType.Mining] = "Mining",
[GameEnum.activityType.Trial] = "Trial",
[GameEnum.activityType.Cookie] = "Cookie",
[GameEnum.activityType.TowerDefense] = "TowerDefense",
[GameEnum.activityType.JointDrill] = "JointDrill",
[GameEnum.activityType.Advertise] = "Advertise",
[GameEnum.activityType.Task] = "ActivityTask",
[GameEnum.activityType.PenguinCard] = "PenguinCard",
[GameEnum.activityType.Double] = "DoubleDrop"
}
function ActivityListCtrl:InitActivityList(nCurActId)
local tbActList = PlayerData.Activity:GetSortedActList()
local tbActGroupList = PlayerData.Activity:GetSortedActGroupList()
self.tbActList = {}
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
for k, v in ipairs(tbActList) do
if not v.actCfg.HideFromActivityList then
table.insert(self.tbActList, {
nType = AllEnum.ActivityMainType.Activity,
actData = v
})
end
end
for k, v in ipairs(tbActGroupList) do
table.insert(self.tbActList, {
nType = AllEnum.ActivityMainType.ActivityGroup,
actData = v
})
end
if nil ~= self.tbActList then
if nil ~= self.nSelectActId and nil ~= self.nSelectActMainType then
local actData
if self.nSelectActMainType == AllEnum.ActivityMainType.Activity then
actData = PlayerData.Activity:GetActivityDataById(self.nSelectActId)
elseif self.nSelectActMainType == AllEnum.ActivityMainType.ActivityGroup then
actData = PlayerData.Activity:GetActivityGroupDataById(self.nSelectActId)
end
local bOpen = false
if nil ~= actData then
if self.nSelectActMainType == AllEnum.ActivityMainType.Activity then
bOpen = actData:CheckActivityOpen()
elseif self.nSelectActMainType == AllEnum.ActivityMainType.ActivityGroup then
bOpen = actData:CheckActGroupShow()
end
end
if nil == actData or not bOpen then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_2")
})
self.nSelectActId = nil
end
end
self.nSelectIndex = 1
if self.nSelectActId ~= nil or nCurActId ~= nil then
local nActId = self.nSelectActId == nil and nCurActId or self.nSelectActId
for k, actData in ipairs(self.tbActList) do
local actId = actData.nType == AllEnum.ActivityMainType.Activity and actData.actData:GetActId() or actData.actData:GetActGroupId()
if nil ~= nActId and actId == nActId then
self.nSelectIndex = k
end
end
end
self.nPageCount = 0
self._mapNode.loopSv:Init(#self.tbActList, self, self.OnRefreshGrid, self.OnGridBtnClick, true, self.GetGridPageCount)
self._mapNode.loopSv:SetScrollGridPos(self.nSelectIndex - 1, 0.5)
self.bPlayAnim = false
self:RefreshSelectActivity(false)
end
end
function ActivityListCtrl:GetGridPageCount(nPageCount)
self.nPageCount = nPageCount >= #self.tbActList and #self.tbActList or nPageCount
end
function ActivityListCtrl:OnRefreshGrid(goGrid, gridIndex)
local nIndex = gridIndex + 1
if self.nPageCount > 0 and self.bPlayAnim then
local trans = goGrid.transform:Find("btnGrid")
local doTweenTime = 0.25
local delayTime = (nIndex - 1) * 0.05
trans.anchoredPosition = Vector2(0, -200)
local sequence = DOTween.Sequence()
sequence:Append(trans:DOAnchorPosY(0, doTweenTime):SetUpdate(true))
sequence:SetUpdate(true):SetDelay(delayTime)
self.nPageCount = self.nPageCount - 1
end
local nInstanceId = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceId] then
self.tbGridCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.ActivityList.ActivityTabCtrl")
end
goGrid.gameObject:SetActive(true)
self.tbGridCtrl[nInstanceId]:Init(self.tbActList[nIndex])
self.tbGridCtrl[nInstanceId]:SetSelect(nIndex == self.nSelectIndex)
end
function ActivityListCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
if nIndex == self.nSelectIndex then
return
end
local actData = self.tbActList[nIndex].actData
local bOpen = false
if actData == nil then
printError("活动列表中该活动数据为空")
elseif self.tbActList[nIndex].nType == AllEnum.ActivityMainType.Activity and actData:CheckActivityOpen() or self.tbActList[nIndex].nType == AllEnum.ActivityMainType.ActivityGroup and actData:CheckActGroupShow() then
bOpen = true
end
if not bOpen then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1")
})
EventManager.Hit(EventId.ClosePanel, PanelId.ActivityList)
return
end
local goSelect = self._mapNode.trSv:Find("Viewport/Content/" .. self.nSelectIndex - 1)
if goSelect then
self.tbGridCtrl[goSelect.gameObject:GetInstanceID()]:SetSelect(false)
end
local nInstanceID = goGrid:GetInstanceID()
self.nSelectIndex = nIndex
self.tbGridCtrl[nInstanceID]:SetSelect(true)
if self.tbActList[nIndex].nType == AllEnum.ActivityMainType.Activity then
EventManager.Hit("ActivityListChangeTab", actData:GetActId())
else
EventManager.Hit("ActivityListChangeTab", actData:GetActGroupId())
end
self.tbInitActIds = {}
self:RefreshSelectActivity(true)
end
function ActivityListCtrl:AddPeriodicActivityCtrl(actData, bResetDay)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local perActCfg = actData:GetPerQuestCfg()
local sCtrlFolder = sActTypePath[GameEnum.activityType.PeriodicQuest]
if sCtrlFolder == nil then
return
end
local sPrefabPath = string.format(sEntranceFolder, perActCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sCtrlFolder, perActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData, bResetDay)
end
function ActivityListCtrl:AddLoginRewardActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local mapActCfg = actData:GetLoginRewardControlCfg()
local sCtrlFolder = sActTypePath[GameEnum.activityType.LoginReward]
if sCtrlFolder == nil then
return
end
local sPrefabPath = string.format(sEntranceFolder, mapActCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sCtrlFolder, mapActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddMiningActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local miningActCfg = actData:GetMiningCfg()
local sFolder = sActTypePath[GameEnum.activityType.Mining]
if sFolder == nil then
return
end
local sPrefabPath = string.format(sEntranceFolder_old, sFolder, miningActCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sFolder, miningActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddTrialActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local mapActCfg = actData:GetTrialControlCfg()
local sFolder = mapActCfg.UIAssets
if sFolder == nil then
return
end
local sPrefabPath = string.format("UI_Activity/%s/Entrance.prefab", sFolder)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sFolder, mapActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddCookieActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local mapActCfg = actData:GetCookieControlCfg()
if mapActCfg == nil then
return
end
local sFolder = sActTypePath[GameEnum.activityType.Cookie]
if sFolder == nil then
return
end
local sPrefabPath = string.format(sEntranceFolder_old, sFolder, mapActCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sFolder, mapActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddTowerDefenseActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local towerDefenseActCfg = actData:GetActConfig()
local sFolder = sActTypePath[GameEnum.activityType.TowerDefense]
if sFolder == nil then
return
end
local sPrefabPath = string.format(sEntranceFolder_old, sFolder, towerDefenseActCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sFolder, towerDefenseActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddJointDrillActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local jointDrillActCfg = actData:GetJointDrillActCfg()
local sFolder = sActTypePath[GameEnum.activityType.JointDrill]
if sFolder == nil then
return
end
local sPrefabPath = string.format(sEntranceFolder, jointDrillActCfg.DrillPrefab)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sFolder, jointDrillActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddActivityGroupCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActGroupId()]
if nil == actCtrl then
local actGroupCfg = actData:GetActGroupCfgData()
local sFolder = actGroupCfg.UIAssetsPrefab
if sFolder == nil then
return
end
local sPrefabPath = string.format("UI_Activity/%s/Entrance.prefab", sFolder)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.ActivityTheme.%s.%s", sFolder, actGroupCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActGroupId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData, table.indexof(self.tbInitActIds, actData:GetActGroupId()) > 0)
table.insert(self.tbInitActIds, actData:GetActGroupId())
end
function ActivityListCtrl:AddAdvertisingActCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local sFolder = sActTypePath[GameEnum.activityType.Advertise]
if sFolder == nil then
return
end
local adControlCfg = ConfigTable.GetData("AdControl", actData.nActId)
local uiAssetPath = adControlCfg.UIAssets
local sPrefabPath = string.format(sEntranceFolder, uiAssetPath)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local ctrlPath = adControlCfg.CtrlName
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sFolder, ctrlPath)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddActivityTaskActCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local sAssetsFolder = "_" .. actData:GetActId()
local sCtrlFolder = sActTypePath[GameEnum.activityType.Task]
if sCtrlFolder == nil then
return
end
local adControlCfg = CacheTable.GetData("_ActivityTaskControl", actData.nActId)
if adControlCfg == nil then
return
end
local uiAssetPath = adControlCfg.UIAssets
if uiAssetPath == "" then
return
end
local sPrefabPath = string.format(sEntranceFolder_old, sAssetsFolder, uiAssetPath)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local ctrlPath = adControlCfg.CtrlName
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sCtrlFolder, ctrlPath)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddBdConvertActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local BdConvertActCfg = actData:GetActConfig()
local sPrefabPath = string.format(sEntranceFolder, BdConvertActCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", "BdConvert", BdConvertActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddPenguinCardActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local mapActCfg = ConfigTable.GetData("PenguinCardControl", actData:GetActId())
if not mapActCfg then
return
end
local sFolder = sActTypePath[GameEnum.activityType.PenguinCard]
if sFolder == nil then
return
end
local sPrefabPath = string.format(sEntranceFolder, mapActCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sFolder, mapActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:AddDoubleDropActivityCtrl(actData)
local actCtrl = self.tbActCtrlObj[actData:GetActId()]
if nil == actCtrl then
local mapActCfg = ConfigTable.GetData("ActivityDouble", actData:GetActId())
if not mapActCfg then
return
end
local sFolder = sActTypePath[GameEnum.activityType.Double]
if sFolder == nil then
return
end
local sPrefabPath = string.format(sEntranceFolder, mapActCfg.UIAssets)
local goObj = self:CreatePrefabInstance(sPrefabPath, self._mapNode.rtContent)
local sCtrlPath = string.format("Game.UI.Activity.%s.%s", sFolder, mapActCfg.CtrlName)
actCtrl = self:BindCtrlByNode(goObj, sCtrlPath)
self.tbActCtrlObj[actData:GetActId()] = actCtrl
end
actCtrl.gameObject:SetActive(true)
actCtrl:InitActData(actData)
end
function ActivityListCtrl:RefreshSelectActivity(bResetDay)
for _, v in pairs(self.tbActCtrlObj) do
v.gameObject:SetActive(false)
end
local actData = self.tbActList[self.nSelectIndex]
if nil == actData then
return
end
self.nSelectActMainType = actData.nType
if actData.nType == AllEnum.ActivityMainType.Activity then
self.nSelectActId = actData.actData:GetActId()
local actType = actData.actData:GetActType()
if actType == GameEnum.activityType.PeriodicQuest then
self:AddPeriodicActivityCtrl(actData.actData, bResetDay)
elseif actType == GameEnum.activityType.LoginReward then
self:AddLoginRewardActivityCtrl(actData.actData)
elseif actType == GameEnum.activityType.Mining then
self:AddMiningActivityCtrl(actData.actData)
elseif actType == GameEnum.activityType.Trial then
self:AddTrialActivityCtrl(actData.actData)
elseif actType == GameEnum.activityType.Cookie then
self:AddCookieActivityCtrl(actData.actData)
elseif actType == GameEnum.activityType.TowerDefense then
self:AddTowerDefenseActivityCtrl(actData.actData)
elseif actType == GameEnum.activityType.JointDrill then
self:AddJointDrillActivityCtrl(actData.actData)
elseif actType == GameEnum.activityType.Advertise then
self:AddAdvertisingActCtrl(actData.actData)
elseif actType == GameEnum.activityType.Task then
self:AddActivityTaskActCtrl(actData.actData)
elseif actType == GameEnum.activityType.BDConvert then
self:AddBdConvertActivityCtrl(actData.actData)
elseif actType == GameEnum.activityType.PenguinCard then
self:AddPenguinCardActivityCtrl(actData.actData)
elseif actType == GameEnum.activityType.Double then
self:AddDoubleDropActivityCtrl(actData.actData)
end
elseif actData.nType == AllEnum.ActivityMainType.ActivityGroup then
self.nSelectActId = actData.actData:GetActGroupId()
self:AddActivityGroupCtrl(actData.actData)
end
if self.nSelectActId ~= nil then
LocalData.SetPlayerLocalData("Activity_Tab_New_" .. self.nSelectActId, 1)
RedDotManager.SetValid(RedDotDefine.Activity_New_Tab, self.nSelectActId, false)
end
end
function ActivityListCtrl:FadeIn()
EventManager.Hit(EventId.SetTransition)
self._mapNode.animRoot:Play("ActivityPanel_in")
end
function ActivityListCtrl:Awake()
self.nSelectIndex = nil
self.nSelectActId = nil
self.nInitActId = nil
self.bPlayAnim = true
self.tbInitActIds = {}
local tbParams = self:GetPanelParam()
if type(tbParams) == "table" then
self.nInitActId = tbParams[1]
end
self._mapNode.goRewardList.gameObject:SetActive(false)
end
function ActivityListCtrl:OnEnable()
self.tbActCtrlObj = {}
self.tbActList = {}
self.tbGridCtrl = {}
self:InitActivityList(self.nInitActId)
end
function ActivityListCtrl:OnDisable()
self.tbActList = {}
for _, v in pairs(self.tbActCtrlObj) do
if v.ClearActivity ~= nil then
v:ClearActivity()
end
local obj = v.gameObject
self:UnbindCtrlByNode(v)
destroy(obj)
end
self.tbActCtrlObj = {}
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
end
function ActivityListCtrl:OnDestroy()
end
function ActivityListCtrl:OnEvent_ShowActRewardList(tbReward)
self._mapNode.goRewardList:OpenPanel(tbReward)
end
return ActivityListCtrl