Files
StellaSora_DataLua/lua/game/ui/activity/reengagement/reengagementtaskctrl.lua
T
SL1900 08b515afd9 Major Update - 2.0.0.143
EN: 2.0.0.143
CN: 2.0.0.142
JP: 2.0.0.145
KR: 2.0.0.150
2026-10-20 13:00:00 +09:00

352 lines
13 KiB
Lua

local ReengagementTaskCtrl = class("ReengagementTaskCtrl", BaseCtrl)
local TimerManager = require("GameCore.Timer.TimerManager")
ReengagementTaskCtrl._mapNodeConfig = {
txtActName = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_Task_Title"
},
loopSv = {
sNodeName = "srGuideQuest",
sComponentName = "LoopScrollView"
},
rtDays = {},
PerActGroupItem = {
nCount = 7,
sCtrlName = "Game.UI.Activity.Reengagement.ReengagementTaskGroupCtrl"
},
btnGroup = {
sNodeName = "PerActGroupItem",
nCount = 7,
sComponentName = "UIButton",
callback = "OnBtnClick_Group"
},
btnGroupLock = {
sNodeName = "btnGroupLock",
nCount = 7,
sComponentName = "UIButton",
callback = "OnBtnClick_GroupLock"
},
btnActDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_Detail"
},
txtBtnActDetail = {
sComponentName = "TMP_Text",
sLanguageId = "Activity_Btn_Detail"
},
goActTime = {},
txtActivityTime = {sComponentName = "TMP_Text"},
txtActValue = {sComponentName = "TMP_Text"},
rtActProgressFill = {
sComponentName = "RectTransform"
},
btnNodeItem = {
nCount = 7,
sComponentName = "UIButton",
callback = "OnBtnClick_NodeItem"
},
item = {
nCount = 7,
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
}
}
ReengagementTaskCtrl._mapEventConfig = {
RefreshReengagementQuest = "RefreshQuestList",
RefreshReengagementQuestPoint = "RefreshActivityNode",
RefreshReengagementGroup = "OnRefreshGroup"
}
function ReengagementTaskCtrl:Refresh(nCurTog)
if nCurTog ~= AllEnum.ReengagementTog.Task then
return
end
self:InitActData()
self:RefreshQuestList()
self:RefreshActivityNode()
end
function ReengagementTaskCtrl:RefreshRemainTime()
local endTime = PlayerData.Reengagement:GetReengagementCloseTime()
local curTime = CS.ClientManager.Instance.serverTimeStamp
local remainTime = endTime - curTime
if remainTime < 0 then
TimerManager.Remove(self.remainTimer)
self.remainTimer = nil
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1"),
callbackConfirm = function()
EventManager.Hit(EventId.ClosePanel, PanelId.ReengagementPanel)
end
})
return
end
local sTimeStr = ""
if remainTime <= 60 then
local sec = math.floor(remainTime)
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Sec") or "", sec)
elseif 60 < remainTime and remainTime <= 3600 then
local min = math.floor(remainTime / 60)
local sec = math.floor(remainTime - min * 60)
if sec == 0 then
min = min - 1
sec = 60
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Min") or "", min, sec)
elseif 3600 < remainTime and remainTime <= 86400 then
local hour = math.floor(remainTime / 3600)
local min = math.floor((remainTime - hour * 3600) / 60)
if min == 0 then
hour = hour - 1
min = 60
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Hour") or "", hour, min)
elseif 86400 < remainTime then
local day = math.floor(remainTime / 86400)
local hour = math.floor((remainTime - day * 86400) / 3600)
if hour == 0 then
day = day - 1
hour = 24
end
sTimeStr = orderedFormat(ConfigTable.GetUIText("Activity_Remain_Time_Day") or "", day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtActivityTime, orderedFormat(ConfigTable.GetUIText("PerActivity_Remain_Time") or "", sTimeStr))
end
local tbConvertStatus = {
[0] = 1,
[1] = 0,
[2] = 2
}
function ReengagementTaskCtrl:RefreshQuestList()
local nGroupId = 100 + (self._panel.nSelectGroup or 1)
self.tbQuestList = PlayerData.Reengagement:GetQuestListByGroup(nGroupId)
self.tbQuestData = PlayerData.Reengagement:GetQuestConfigDataByGroup(nGroupId)
table.sort(self.tbQuestData, function(a, b)
if not self.tbQuestList[a.Id] or not self.tbQuestList[b.Id] then
return a.Id < b.Id
end
if self.tbQuestList[a.Id].nStatus == self.tbQuestList[b.Id].nStatus then
return a.Id < b.Id
end
return tbConvertStatus[self.tbQuestList[a.Id].nStatus] < tbConvertStatus[self.tbQuestList[b.Id].nStatus]
end)
for k, v in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(v)
self.tbGridCtrl[k] = nil
end
if #self.tbQuestData > 0 then
self.nPageCount = 0
self._mapNode.loopSv:SetAnim(0.06)
self._mapNode.loopSv:Init(#self.tbQuestData, self, self.OnGridRefresh, nil, false, self.GetGridPageCount)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
for k, v in ipairs(self._mapNode.PerActGroupItem) do
local bAllReceived = PlayerData.Reengagement:IsQuestGroupAllReceived(k)
v:RefreshStatus(bAllReceived)
end
end
function ReengagementTaskCtrl:GetGridPageCount(pageCount)
self.nPageCount = pageCount > #self.tbQuestList and #self.tbQuestList or pageCount
end
function ReengagementTaskCtrl:InitGroupList()
self.nMaxOpenGroup = 0
self.tbGroupList = {}
local foreachtabelline = function(mapData)
if mapData.ReturneeId == self.nActId then
table.insert(self.tbGroupList, mapData)
end
end
ForEachTableLine(ConfigTable.Get("ActivityReturneeQuestGroup"), foreachtabelline)
local tbNextOpenGroupList = {}
local nEventOpenTime = PlayerData.Reengagement:GetReengagementOpenTime()
local nCurTime = CS.ClientManager.Instance.serverTimeStamp
self.nCurDay = 0
if nil ~= nEventOpenTime and 0 < nEventOpenTime and nEventOpenTime < nCurTime then
local nOpenDayStartTime = CS.ClientManager.Instance:GetNextRefreshTime(nEventOpenTime) - 86400
self.nCurDay = math.floor((nCurTime - nOpenDayStartTime) / 86400)
end
for _, v in ipairs(self.tbGroupList) do
local nOpenDay = v.DayOpen
if nOpenDay <= self.nCurDay then
self.nMaxOpenGroup = math.max(self.nMaxOpenGroup, v.Id - 100)
elseif nOpenDay == self.nCurDay + 1 then
tbNextOpenGroupList[v.Id] = 1
end
end
local nRedDotGroup = 0
for _, mapGroup in ipairs(self.tbGroupList) do
if mapGroup.DayOpen <= self.nCurDay and RedDotManager.GetValid(RedDotDefine.Activity_Reengagement_Task_Group, {
self.nActId,
mapGroup.Id
}) then
nRedDotGroup = math.max(nRedDotGroup, mapGroup.Id - 100)
end
end
local nSelectGroup = 0 < nRedDotGroup and nRedDotGroup or math.max(1, self.nMaxOpenGroup)
for k, v in ipairs(self._mapNode.PerActGroupItem) do
local bAllReceived = PlayerData.Reengagement:IsQuestGroupAllReceived(k)
v:Init(self.nActId, k, self.nMaxOpenGroup, bAllReceived)
if nil ~= tbNextOpenGroupList[k + 100] then
local nNextRefreshTime = CS.ClientManager.Instance:GetNextRefreshTime(nCurTime)
local nHour = math.floor((nNextRefreshTime - nCurTime) / 3600)
if nHour < 1 then
v:SetTime(orderedFormat(ConfigTable.GetUIText("PerActivity_Quest_Open_Time_2") or "", 1))
else
v:SetTime(orderedFormat(ConfigTable.GetUIText("PerActivity_Quest_Open_Time_1") or "", nHour))
end
end
end
if nil == self._panel.nSelectGroup or 0 >= self._panel.nSelectGroup or self._panel.nSelectGroup > self.nMaxOpenGroup then
self._panel.nSelectGroup = nSelectGroup
end
if nil ~= self._mapNode.PerActGroupItem[self._panel.nSelectGroup] then
self._mapNode.PerActGroupItem[self._panel.nSelectGroup]:SetSelect(true)
end
end
function ReengagementTaskCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceId = goGrid:GetInstanceID()
if not self.tbGridCtrl[nInstanceId] then
self.tbGridCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.Activity.Reengagement.ReengagementQuestItemCtrl")
end
self.tbGridCtrl[nInstanceId]:SetData(self.nActId, self.tbQuestData[nIndex])
end
local totalLength = 816
local totalNodeLength = 136
local actNodeItemHeight = 152
local totalHeight = 20
function ReengagementTaskCtrl:RefreshActivityNode()
self.tbQuestActive = {}
self.nTotalActiveCount = 0
local ForeachActivity = function(mapData)
if mapData.ReturneeId == self.nActId then
table.insert(self.tbQuestActive, mapData)
end
end
ForEachTableLine(ConfigTable.Get("ActivityReturneeQuestPoint"), ForeachActivity)
table.sort(self.tbQuestActive, function(a, b)
return a.Point < b.Point
end)
local nMaxAct = self.tbQuestActive[#self.tbQuestActive].Point
self.nTotalActiveCount = nMaxAct
self.nActiveCount = PlayerData.Reengagement:GetQuestPointInfo().Point or 0
NovaAPI.SetTMPText(self._mapNode.txtActValue, self.nActiveCount)
for k, v in ipairs(self.tbQuestActive) do
if self._mapNode.btnNodeItem[k] ~= nil then
local bReceived = PlayerData.Reengagement:CheckPointRewardReceived(v.Index)
self._mapNode.item[k]:SetItem(v.Reward1Tid, nil, v.Reward1Qty, nil, bReceived)
local node = self._mapNode.btnNodeItem[k]
local nPosX = math.min(k / #self.tbQuestActive * totalNodeLength, totalNodeLength)
node.gameObject:SetActive(true)
local imgNodeAct1 = node.transform:Find("AnimRoot/goNodeItem/imgNumNml")
local imgNodeAct2 = node.transform:Find("AnimRoot/goNodeItem/imgNumSel")
local txtNodeAct1 = node.transform:Find("AnimRoot/goNodeItem/imgNumNml/txtNmlValue"):GetComponent("TMP_Text")
local txtNodeAct2 = node.transform:Find("AnimRoot/goNodeItem/imgNumSel/txtSelValue"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtNodeAct1, v.Point)
NovaAPI.SetTMPText(txtNodeAct2, v.Point)
local anim = node.transform:Find("AnimRoot"):GetComponent("Animator")
local goParticle1 = node.transform:Find("AnimRoot/goNodeItem/UIParticle1")
local goParticle2 = node.transform:Find("AnimRoot/goNodeItem/UIParticle2")
local bComplete = v.Point <= self.nActiveCount and not bReceived
imgNodeAct1.gameObject:SetActive(not bReceived)
imgNodeAct2.gameObject:SetActive(bReceived)
goParticle1.gameObject:SetActive(not bReceived and bComplete)
goParticle2.gameObject:SetActive(not bReceived and bComplete)
if not bReceived and bComplete then
anim:Play("Quest_btnNodeComplete_loop", 0, 0)
else
anim:Play("Empty")
end
end
end
local nWidth = math.min(self.nActiveCount / nMaxAct * totalLength, totalLength)
self._mapNode.rtActProgressFill.sizeDelta = Vector2(nWidth, totalHeight)
end
function ReengagementTaskCtrl:InitActData(bResetGroup)
if bResetGroup or self._panel.nSelectGroup == nil or self._panel.nSelectGroup == 0 then
self._panel.nSelectGroup = nil
end
self.nActId = PlayerData.Reengagement:GetActId()
self.bQuestAnim = false
self:InitGroupList()
if nil == PlayerData.Reengagement:GetQuestListByGroup(self._panel.nSelectGroup + 100) then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_1")
})
return
end
self._mapNode.goActTime.gameObject:SetActive(true)
self:RefreshRemainTime()
if nil == self.remainTimer then
self.remainTimer = self:AddTimer(0, 1, "RefreshRemainTime", true, true, false)
end
end
function ReengagementTaskCtrl:Awake()
self.tbGridCtrl = {}
self.tbSequences = {}
end
function ReengagementTaskCtrl:FadeIn()
end
function ReengagementTaskCtrl:FadeOut()
end
function ReengagementTaskCtrl:OnEnable()
end
function ReengagementTaskCtrl:OnDisable()
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[nInstanceId] = nil
end
self.tbGridCtrl = {}
end
function ReengagementTaskCtrl:OnDestroy()
end
function ReengagementTaskCtrl:OnRelease()
end
function ReengagementTaskCtrl:OnRefreshGroup()
self:InitGroupList()
self:RefreshRemainTime()
end
function ReengagementTaskCtrl:OnBtnClick_Group(_, nIndex)
if self._panel.nSelectGroup == nIndex then
return
end
if nIndex > self.nMaxOpenGroup then
return
end
if nil == PlayerData.Reengagement:GetQuestConfigDataByGroup(nIndex + 100) or nil == next(PlayerData.Reengagement:GetQuestConfigDataByGroup(nIndex + 100)) then
printError(string.format("当前任务组下没有任务!!! 活动id = %d, 任务组 = %s", self.nActId, nIndex))
return
end
self._mapNode.PerActGroupItem[self._panel.nSelectGroup]:SetSelect(false)
if nil ~= self._mapNode.PerActGroupItem[nIndex] then
self._mapNode.PerActGroupItem[nIndex]:SetSelect(true)
end
self._panel.nSelectGroup = nIndex
self.bQuestAnim = true
self:RefreshQuestList()
end
function ReengagementTaskCtrl:OnBtnClick_GroupLock()
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("PerActivity_Not_Open"))
end
function ReengagementTaskCtrl:OnBtnClick_Detail()
local perQuestActCfg = PlayerData.Reengagement:GetActDetail(AllEnum.ReengagementTog.Task)
local msg = {
nType = AllEnum.MessageBox.Desc,
sContent = perQuestActCfg.DesText,
sTitle = ConfigTable.GetUIText("Activity_Btn_Detail")
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function ReengagementTaskCtrl:OnBtnClick_NodeItem(btn, index)
if PlayerData.Reengagement:CheckPointRewardReceived(index) then
UTILS.ClickItemGridWithTips(self.tbQuestActive[index].Reward1Tid, btn.transform, true, true, false)
return
end
if self.nActiveCount >= self.tbQuestActive[index].Point then
PlayerData.Reengagement:RequestReceiveQuestPointReward(index)
else
UTILS.ClickItemGridWithTips(self.tbQuestActive[index].Reward1Tid, btn.transform, true, true, false)
return
end
end
return ReengagementTaskCtrl