Files
StellaSora_DataLua/lua/game/ui/tracehunt/tracehuntctrl.lua
T
SL1900 fb98bcdc16 Hotfix - 1.13.0.126
EN: 1.13.0.126
CN: 1.13.0.126
JP: 1.13.0.130
KR: 1.13.0.132
2026-07-23 17:00:00 +09:00

1206 lines
43 KiB
Lua

local TraceHuntCtrl = class("TraceHuntCtrl", BaseCtrl)
local LocalSettingData = require("GameCore.Data.LocalSettingData")
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local BubbleVoiceManager = require("Game.Actor2D.BubbleVoiceManager")
local PlayerVoiceData = PlayerData.Voice
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local ClientManager = CS.ClientManager.Instance
local WwiseManger = CS.WwiseAudioManager.Instance
TraceHuntCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
rawImgActor2D = {
sNodeName = "----Actor2D----",
sComponentName = "RawImage"
},
trActor2D_PNG = {
sNodeName = "----Actor2D_PNG----",
sComponentName = "Transform"
},
btnActor = {
sComponentName = "Button",
callback = "OnBtnClick_Actor2D"
},
goBubbleRoot = {
sNodeName = "----fixed_bubble----"
},
Trace = {sNodeName = "--Trace--"},
imgPieceOff = {nCount = 5},
imgPieceOn = {nCount = 5},
imgPieceIcon = {nCount = 5, sComponentName = "Image"},
imgTraceProgress = {sComponentName = "Image"},
txtTraceProgress = {sComponentName = "TMP_Text"},
txtTraceProgressTitle = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_TraceProgress"
},
aniPiece = {
nCount = 5,
sNodeName = "goPiece",
sComponentName = "Animator"
},
MagnifierRoot = {},
aniMagnifier = {sNodeName = "magnifier", sComponentName = "Animator"},
Hunt = {sNodeName = "--Hunt--"},
imgFullIcon = {sComponentName = "Image"},
txtBossName = {sComponentName = "TMP_Text"},
txtHuntProgressTitle = {sComponentName = "TMP_Text"},
imgHuntProgress = {sComponentName = "Image"},
txtHuntLeftTime = {sComponentName = "TMP_Text"},
imgArrested = {},
imgEscaped = {},
dbHuntLeftTime = {},
txtTraceHuntTitle = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_Board_Title"
},
btnShop = {
sComponentName = "UIButton",
callback = "OnBtnClick_Shop"
},
btnHandbook = {
sComponentName = "UIButton",
callback = "OnBtnClick_Handbook"
},
btnHelpFriend = {
sComponentName = "UIButton",
callback = "OnBtnClick_Help"
},
txtBtnShop = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_Btn_Shop"
},
txtBtnHandbook = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_Btn_HandBook"
},
txtBtnHelp = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_Btn_Help"
},
txtRefreshTime = {sComponentName = "TMP_Text"},
txtHelpCount = {sComponentName = "TMP_Text"},
iconHelp = {sComponentName = "Image"},
cgLeft = {
sNodeName = "---Left---",
sComponentName = "CanvasGroup"
},
btnTrace = {
sComponentName = "UIButton",
callback = "OnBtnClick_Trace"
},
txtBtnTrace = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_Btn_Trace"
},
imgReqTraceIcon = {sComponentName = "Image"},
txtReqTraceCount = {sComponentName = "TMP_Text"},
btnHunt = {
sComponentName = "UIButton",
callback = "OnBtnClick_Hunt"
},
goReqHunt = {},
txtBtnHunt = {sComponentName = "TMP_Text"},
imgReqHuntIcon = {sComponentName = "Image"},
txtReqHuntCount = {sComponentName = "TMP_Text"},
btnMultiTrace = {
sComponentName = "UIButton",
callback = "OnBtnClick_MultiTrace"
},
txtBtnMultiTrace = {sComponentName = "TMP_Text"},
btnSkip = {
sComponentName = "UIButton",
callback = "OnBtnClick_Skip"
},
txtBtnSkip = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_Btn_Skip"
},
goAutoTips = {},
txtAutoTips = {sComponentName = "TMP_Text"},
btnHuntReward = {
sComponentName = "UIButton",
callback = "OnBtnClick_Reward"
},
txtBtnHuntReward = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_Btn_Reward"
},
txtLevelTitle = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_HuntLevelTitle"
},
txtLevel = {sComponentName = "TMP_Text"},
btnLevelInfo = {
sComponentName = "UIButton",
callback = "OnBtnClick_LevelInfo"
},
goExpBar = {
sCtrlName = "Game.UI.TemplateEx.TemplateExpBarCtrl"
},
Content = {sComponentName = "Transform"},
ScrollView = {sComponentName = "ScrollRect"},
LogHeight = {sComponentName = "Transform"},
LogRoot = {},
goTraceBtn = {},
goHuntBtn = {},
goHuntLogEmpty = {},
goTraceLogEmpty = {},
txtHuntLogEmpty = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_HuntLogEmpty"
},
txtTraceLogEmpty = {
sComponentName = "TMP_Text",
sLanguageId = "TraceHunt_TraceLogEmpty"
},
goResCoin2 = {},
btnResCoin = {
nCount = 2,
sNodeName = "goResCoin",
sComponentName = "UIButton",
callback = "OnBtnClick_CoinTips"
},
imgResCoin = {nCount = 2, sComponentName = "Image"},
txtResCount = {nCount = 2, sComponentName = "TMP_Text"},
goTip = {sNodeName = "--Tips--"},
btnTipsBg = {
sComponentName = "Button",
callback = "OnBtnClick_TipsBg"
},
txtTipsName = {sComponentName = "TMP_Text"},
txtTipsContent = {sComponentName = "TMP_Text"},
txtDailyCount = {sComponentName = "TMP_Text"},
txtDailyTime = {sComponentName = "TMP_Text"},
blur = {
sNodeName = "t_fullscreen_blur_blue"
},
aniBlur = {
sNodeName = "t_fullscreen_blur_blue",
sComponentName = "Animator"
},
btnBlur = {
sNodeName = "snapshot",
sComponentName = "Button",
callback = "OnBtnClick_ClosePop"
},
Update = {sNodeName = "--Update--"},
aniUpdate = {sNodeName = "--Update--", sComponentName = "Animator"},
txtDate = {sComponentName = "TMP_Text"},
txtClickToContinue = {
sComponentName = "TMP_Text",
sLanguageId = "Tips_Continue_Refresh"
},
redDotReward = {},
redDotHelp = {},
redDotResBar = {}
}
TraceHuntCtrl._mapEventConfig = {
[EventId.CoinResChange] = "RefreshRes",
TraceHuntItemChange = "RefreshRes",
[EventId.UIBackConfirm] = "OnEvent_Back",
[EventId.UIHomeConfirm] = "OnEvent_Home",
TraceHuntCurBossExpired = "OnEvent_BossExpired",
TraceHuntNewControl = "OnEvent_NewControl",
[EventId.ShowBubbleVoiceText] = "OnEvent_ShowBubbleVoiceText",
TraceHuntInfoChange = "OnEvent_InfoChange"
}
TraceHuntCtrl._mapRedDotConfig = {
[RedDotDefine.TraceHunt_Reward_Boss] = {
sNodeName = "redDotReward"
},
[RedDotDefine.TraceHunt_TraceItem] = {
sNodeName = "redDotResBar"
},
[RedDotDefine.TraceHunt_HuntItem] = {sNodeName = "redDotHelp"}
}
function TraceHuntCtrl:RefreshContent()
self:RefreshControl()
self:RefreshInfo()
self:RefreshState()
self:RefreshRes()
self:StartTicketsRefreshTimer()
self:RefreshNPC2D()
end
function TraceHuntCtrl:RefreshConfig()
self.nTraceItemId = ConfigTable.GetConfigNumber("TraceHuntRequestItemTid")
local mapCfg = ConfigTable.GetData_Item(self.nTraceItemId)
self.sTraceItemTitle = mapCfg and mapCfg.Title or ""
self.nHuntItemId = ConfigTable.GetConfigNumber("TraceHuntPermitItemTid")
local mapHuntCfg = ConfigTable.GetData_Item(self.nHuntItemId)
self.sHuntItemTitle = mapHuntCfg and mapHuntCfg.Title or ""
self.sHuntItemIcon = mapHuntCfg and mapHuntCfg.Icon or ""
self.tbHuntPieceSuffix = ConfigTable.GetConfigArray("TraceHuntPieceSuffixOrder")
self.tbPieceNeedProgress = ConfigTable.GetConfigNumberArray("TraceHuntPieceNeedTraceProgress")
self.nMaxTraceProgress = ConfigTable.GetConfigNumber("TraceHuntMaxTraceProgress")
self.nMaxMultiTrace = ConfigTable.GetConfigNumber("TraceHuntMaxMultiTrace")
self.npcId = ConfigTable.GetConfigNumber("TraceHuntNPCId")
end
function TraceHuntCtrl:RefreshControl()
self.nControlLeftTime = PlayerData.TraceHunt:GetControlLeftTime()
if self.timerCountDownControl == nil then
self.timerCountDownControl = self:AddTimer(0, 1, "RefreshControlTime", false, true, false)
end
self.nControlLeftTime = self.nControlLeftTime + 1
self:RefreshControlTime()
if self.nControlLeftTime > 0 then
self.timerCountDownControl:Pause(false)
end
end
function TraceHuntCtrl:RefreshInfo()
local nLevel, nExp = PlayerData.TraceHunt:GetTraceHuntLevel()
local nMaxLevel = PlayerData.TraceHunt:GetTraceHuntMaxLevel()
local mapLevel = PlayerData.TraceHunt:GetTraceHuntLevelData(nLevel)
NovaAPI.SetTMPText(self._mapNode.txtLevel, orderedFormat(ConfigTable.GetUIText("TraceHunt_HuntLevel"), nLevel))
local mapLevelData = {
nLevel = nLevel,
nExp = nExp,
nMaxLevel = nMaxLevel,
nMaxExp = mapLevel.Exp
}
self._mapNode.goExpBar:Refresh(mapLevelData)
local tbMax = ConfigTable.GetConfigArray("TraceHuntPermitItem")
local nHasHunt = PlayerData.TraceHunt:GetHuntTokenCount()
NovaAPI.SetTMPText(self._mapNode.txtHelpCount, self:ThousandsNumber(nHasHunt) .. "/" .. tbMax[3])
self:SetPngSprite(self._mapNode.iconHelp, self.sHuntItemIcon)
NovaAPI.SetCanvasGroupInteractable(self._mapNode.cgLeft, true)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.cgLeft, true)
end
function TraceHuntCtrl:RefreshRes()
local nCount = PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.TraceHunt)
self:SetSprite_Coin(self._mapNode.imgResCoin[1], AllEnum.CoinItemId.TraceHunt)
NovaAPI.SetTMPText(self._mapNode.txtResCount[1], self:ThousandsNumber(nCount))
self:SetSprite_Coin(self._mapNode.imgResCoin[2], self.nTraceItemId)
local tbMax = ConfigTable.GetConfigArray("TraceHuntRequestItem")
local nHasCoin = PlayerData.TraceHunt:GetTraceTokenCount()
NovaAPI.SetTMPText(self._mapNode.txtResCount[2], self:ThousandsNumber(nHasCoin) .. "/" .. tbMax[3])
end
function TraceHuntCtrl:RefreshControlTime()
self.nControlLeftTime = self.nControlLeftTime - 1
if self.nControlLeftTime > 0 then
local sTime = ""
if self.nControlLeftTime <= 60 then
local sec = math.floor(self.nControlLeftTime)
sTime = orderedFormat(ConfigTable.GetUIText("TraceHunt_ControlRefresh_Sec"), sec)
elseif self.nControlLeftTime > 60 and self.nControlLeftTime <= 3600 then
local min = math.floor(self.nControlLeftTime / 60)
local sec = math.floor(self.nControlLeftTime - min * 60)
if sec == 0 then
min = min - 1
sec = 60
end
sTime = orderedFormat(ConfigTable.GetUIText("TraceHunt_ControlRefresh_Min"), min, sec)
elseif self.nControlLeftTime > 3600 and self.nControlLeftTime <= 86400 then
local hour = math.floor(self.nControlLeftTime / 3600)
local min = math.floor((self.nControlLeftTime - hour * 3600) / 60)
if min == 0 then
hour = hour - 1
min = 60
end
sTime = orderedFormat(ConfigTable.GetUIText("TraceHunt_ControlRefresh_Hour"), hour, min)
elseif self.nControlLeftTime > 86400 then
local day = math.floor(self.nControlLeftTime / 86400)
local hour = math.floor((self.nControlLeftTime - day * 86400) / 3600)
if hour == 0 then
day = day - 1
hour = 24
end
sTime = orderedFormat(ConfigTable.GetUIText("TraceHunt_ControlRefresh_Day"), day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtRefreshTime, sTime)
else
NovaAPI.SetTMPText(self._mapNode.txtRefreshTime, orderedFormat(ConfigTable.GetUIText("TraceHunt_ControlRefresh_Sec"), 0))
self.timerCountDownControl:Pause(true)
end
end
function TraceHuntCtrl:RefreshState()
local bMaxTrace = PlayerData.TraceHunt:CheckMaxTrace()
self._mapNode.Trace:SetActive(not bMaxTrace)
self._mapNode.goTraceBtn:SetActive(not bMaxTrace)
self._mapNode.Hunt:SetActive(bMaxTrace)
self._mapNode.goHuntBtn:SetActive(bMaxTrace)
if not bMaxTrace then
self:RefreshTrace()
elseif bMaxTrace then
self:RefreshHunt()
end
self:PlayEnterStateVoice()
end
function TraceHuntCtrl:ChangeState()
EventManager.Hit(EventId.TemporaryBlockInput, 2.5)
self._mapNode.Hunt:SetActive(true)
self.bChangeState = true
self.animator:Play("TraceHuntSelectPanel_unlock_synthesis", 0, 0)
WwiseManger:PostEvent("mode_gongdou_get")
self:AddTimer(1, 1, function()
self:RefreshState()
self.bChangeState = false
end, true, true, true)
end
function TraceHuntCtrl:RefreshTrace()
self:RefreshTraceBoard()
self:RefreshTraceBtn()
self:RefreshTraceLog()
end
function TraceHuntCtrl:RefreshTraceBoard()
local nProgress = PlayerData.TraceHunt:GetTraceProgress()
local nBossId = PlayerData.TraceHunt:GetBossId()
local sIcon = ""
if nBossId ~= 0 then
local mapBossCfg = ConfigTable.GetData("TraceHuntBoss", nBossId, true)
sIcon = mapBossCfg and mapBossCfg.ClueIcon or ""
end
local nPieceCount = 0
for i, v in ipairs(self.tbPieceNeedProgress) do
if v <= nProgress then
nPieceCount = i
end
end
for i = 1, 5 do
self._mapNode.imgPieceOff[i]:SetActive(i > nPieceCount)
self._mapNode.imgPieceOn[i]:SetActive(i <= nPieceCount)
if i <= nPieceCount and nBossId ~= 0 then
self:SetPngSprite(self._mapNode.imgPieceIcon[i], sIcon .. self.tbHuntPieceSuffix[i])
end
end
NovaAPI.SetTMPText(self._mapNode.txtTraceProgress, string.format("%.1f%%", nProgress))
NovaAPI.SetImageFillAmount(self._mapNode.imgTraceProgress, nProgress / 100)
end
function TraceHuntCtrl:PlayTraceBoardAni(nBeforeProgress)
local nProgress = PlayerData.TraceHunt:GetTraceProgress()
local nBossId = PlayerData.TraceHunt:GetBossId()
local sIcon = ""
if nBossId ~= 0 then
local mapBossCfg = ConfigTable.GetData("TraceHuntBoss", nBossId, true)
sIcon = mapBossCfg and mapBossCfg.ClueIcon or ""
end
local nPieceCount, nBeforePieceCount = self:GetPieceCount(nBeforeProgress)
if nBeforePieceCount < nPieceCount then
self:KillSequenceBoard()
self.sequenceBoard = DOTween.Sequence()
for i = nBeforePieceCount + 1, nPieceCount do
if i <= nPieceCount and nBossId ~= 0 then
self:SetPngSprite(self._mapNode.imgPieceIcon[i], sIcon .. self.tbHuntPieceSuffix[i])
end
self:AddSequence_PieceOn(self.sequenceBoard, i)
end
local bMaxTrace = PlayerData.TraceHunt:CheckMaxTrace()
if bMaxTrace then
EventManager.Hit(EventId.BlockInput, true)
end
local callback = dotween_callback_handler(self, function()
self:PlayPieceEndAni(bMaxTrace, nBeforePieceCount, nPieceCount)
if bMaxTrace then
EventManager.Hit(EventId.BlockInput, false)
self:ChangeState()
end
end)
self.sequenceBoard:OnComplete(callback)
end
local nTextTime = 0.3
DOTween.To(function()
return nBeforeProgress
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtTraceProgress, string.format("%.1f%%", v))
end, nProgress, nTextTime)
NovaAPI.ImageDoFillAmount(self._mapNode.imgTraceProgress, nProgress / 100, nTextTime, false)
end
function TraceHuntCtrl:PlayTraceAddLog(nNewLogStart, nBeforeProgress)
self:KillSequenceTraceLog()
self.sequenceTraceLog = DOTween.Sequence()
local nPieceCount, nBeforePieceCount = self:GetPieceCount(nBeforeProgress)
local tbLog = PlayerData.TraceHunt:GetTraceLog()
local nEmptyLogIndex = nNewLogStart
local ctrlLogPlaying
for i = nNewLogStart, self.nTraceLogCount do
do
local mapLog = tbLog[i]
local mapLogCfg = ConfigTable.GetData("TraceHuntLogEntryTemplate", mapLog.nId)
if not mapLogCfg then
return
end
local log = function(nWaitTime)
self.sequenceTraceLog:AppendCallback(function()
local ctrlLog = self:CreateLog(mapLog)
nEmptyLogIndex = nEmptyLogIndex + 1
if ctrlLog then
ctrlLog:PlayLogAni(false, nWaitTime)
local nTime = 0.3
self._mapNode.ScrollView:DOVerticalNormalizedPos(0, nTime):SetEase(Ease.OutQuart)
ctrlLogPlaying = ctrlLog
end
end)
end
local bWait = mapLogCfg.Type == GameEnum.TraceHuntLogType.Tracing and nBeforePieceCount < nPieceCount
local nWaitTime = 1
if bWait then
log(nWaitTime)
else
log()
end
self.sequenceTraceLog:AppendInterval(bWait and nWaitTime or 0.5)
end
end
local callback = dotween_callback_handler(self, function()
if ctrlLogPlaying and ctrlLogPlaying.gameObject and ctrlLogPlaying.gameObject:IsNull() == false then
ctrlLogPlaying:PlayLogAni(true)
end
self:RefreshAddLog(tbLog, nEmptyLogIndex, true)
end)
self.sequenceTraceLog:OnComplete(callback)
end
function TraceHuntCtrl:PlayMultiTraceAni(nBeforeProgress, nTraceCount, nNewLogStart)
self:KillSequenceBoard()
self:KillSequenceTraceLog()
self._mapNode.btnSkip.gameObject:SetActive(true)
self._mapNode.goAutoTips.gameObject:SetActive(true)
self._mapNode.btnTrace.gameObject:SetActive(false)
self._mapNode.btnMultiTrace.gameObject:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtAutoTips, orderedFormat(ConfigTable.GetUIText("TraceHunt_AutoCount"), nTraceCount))
local nBossId = PlayerData.TraceHunt:GetBossId()
local sIcon = ""
if nBossId ~= 0 then
local mapBossCfg = ConfigTable.GetData("TraceHuntBoss", nBossId, true)
sIcon = mapBossCfg and mapBossCfg.ClueIcon or ""
end
local nAimProgress = PlayerData.TraceHunt:GetTraceProgress()
local nBeforePieceCount, nAimPieceCount = 0, 0
for i, v in ipairs(self.tbPieceNeedProgress) do
if nBeforeProgress >= v then
nBeforePieceCount = i
end
if v <= nAimProgress then
nAimPieceCount = i
end
end
local nProgress = nBeforeProgress
local nStartPieceCount = nBeforePieceCount
local nPieceCount = 0
self.sequenceMulti = DOTween.Sequence()
local tbLog = PlayerData.TraceHunt:GetTraceLog()
local nEmptyLogIndex = nNewLogStart
for i = nNewLogStart, self.nTraceLogCount do
do
local mapLog = tbLog[i]
local mapLogCfg = ConfigTable.GetData("TraceHuntLogEntryTemplate", mapLog.nId)
if not mapLogCfg then
return
end
local log = function(nWaitTime)
self.sequenceMulti:AppendCallback(function()
local ctrlLog = self:CreateLog(mapLog)
nEmptyLogIndex = nEmptyLogIndex + 1
if ctrlLog then
ctrlLog:PlayLogAni(false, nWaitTime)
local nTime = 0.3
self._mapNode.ScrollView:DOVerticalNormalizedPos(0, nTime):SetEase(Ease.OutQuart)
end
end)
end
if mapLogCfg.Type == GameEnum.TraceHuntLogType.Tracing then
local nAdd = tonumber(mapLog.tbArgs[1]) / self.nMaxTraceProgress * 100
nProgress = nProgress + nAdd
if 100 < nProgress then
nProgress = 100
end
for j, v in ipairs(self.tbPieceNeedProgress) do
if v <= nProgress then
nPieceCount = j
end
end
local nWaitTime = 1
if nBeforePieceCount < nPieceCount then
log(nWaitTime)
else
log()
end
local nTextTime = 0.3
local tw1 = DOTween.To(function()
return nBeforeProgress
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtTraceProgress, string.format("%.1f%%", v))
end, nProgress, nTextTime)
local tw2 = NovaAPI.ImageDoFillAmount(self._mapNode.imgTraceProgress, nProgress / 100, nTextTime, false)
self.sequenceMulti:Join(tw1)
self.sequenceMulti:Join(tw2)
self.sequenceMulti:AppendCallback(function()
nTraceCount = nTraceCount - 1
nBeforeProgress = nBeforeProgress + nAdd
NovaAPI.SetTMPText(self._mapNode.txtAutoTips, orderedFormat(ConfigTable.GetUIText("TraceHunt_AutoCount"), nTraceCount))
end)
if nBeforePieceCount < nPieceCount then
for j = nBeforePieceCount + 1, nPieceCount do
if nPieceCount >= j and nBossId ~= 0 then
self:SetPngSprite(self._mapNode.imgPieceIcon[j], sIcon .. self.tbHuntPieceSuffix[j])
end
self:AddSequence_PieceOn(self.sequenceMulti, j)
end
nBeforePieceCount = nPieceCount
end
else
log()
end
self.sequenceMulti:AppendInterval(0.3)
end
end
local bMaxTrace = PlayerData.TraceHunt:CheckMaxTrace()
local callback = dotween_callback_handler(self, function()
self:PlayPieceEndAni(bMaxTrace, nStartPieceCount, nAimPieceCount)
self:RefreshAddLog(tbLog, nEmptyLogIndex, true)
if bMaxTrace then
self:ChangeState()
else
self:RefreshTraceBtn()
end
end)
self.sequenceMulti:OnComplete(callback)
end
function TraceHuntCtrl:AddSequence_PieceOn(sequence, nPiece)
sequence:AppendCallback(function()
self._mapNode.MagnifierRoot:SetActive(true)
self._mapNode.aniMagnifier:Play("TraceHuntSelectPanel_magnifier" .. nPiece, 0, 0)
WwiseManger:PostEvent("mode_gongdou_finding")
end)
local nTime1 = NovaAPI.GetAnimClipLength(self._mapNode.aniMagnifier, {
"TraceHuntSelectPanel_magnifier" .. nPiece
}) - 0.2
sequence:AppendInterval(nTime1)
sequence:AppendCallback(function()
self._mapNode.aniPiece[nPiece]:Play("TraceHuntSelectPanel_unlock" .. nPiece, 0, 0)
WwiseManger:PostEvent("mode_gongdou_found")
self._mapNode.imgPieceOn[nPiece]:SetActive(true)
end)
local nTime2 = NovaAPI.GetAnimClipLength(self._mapNode.aniPiece[nPiece], {
"TraceHuntSelectPanel_unlock" .. nPiece
})
sequence:AppendInterval(nTime2)
sequence:AppendCallback(function()
self._mapNode.imgPieceOff[nPiece]:SetActive(false)
self._mapNode.MagnifierRoot:SetActive(false)
end)
end
function TraceHuntCtrl:PlayPieceEndAni(bMaxTrace, nStartPiece, nEndPiece)
self._mapNode.MagnifierRoot:SetActive(false)
if bMaxTrace then
for i = nStartPiece + 1, nEndPiece do
self._mapNode.imgPieceOn[i]:SetActive(true)
self._mapNode.imgPieceOff[i]:SetActive(false)
self._mapNode.aniPiece[i]:Play("TraceHuntSelectPanel_unlock" .. i, 0, 1)
end
else
for i = nStartPiece + 1, nEndPiece do
if self._mapNode.imgPieceOn[i].activeSelf == true then
self._mapNode.imgPieceOff[i]:SetActive(false)
self._mapNode.aniPiece[i]:Play("TraceHuntSelectPanel_unlock" .. i, 0, 1)
else
self._mapNode.imgPieceOn[i]:SetActive(true)
self._mapNode.aniPiece[i]:Play("TraceHuntSelectPanel_unlock" .. i, 0, 0)
WwiseManger:PostEvent("mode_gongdou_found")
do
local nTime = NovaAPI.GetAnimClipLength(self._mapNode.aniPiece[i], {
"TraceHuntSelectPanel_unlock" .. i
})
self:AddTimer(1, nTime, function()
self._mapNode.imgPieceOff[i]:SetActive(false)
end, true, true, true)
end
end
end
end
end
function TraceHuntCtrl:RefreshTraceBtn()
local nCost = PlayerData.TraceHunt:GetTraceCostCount()
local nHasCoin = PlayerData.TraceHunt:GetTraceTokenCount()
self:SetSprite_Coin(self._mapNode.imgReqTraceIcon, self.nTraceItemId)
NovaAPI.SetTMPText(self._mapNode.txtReqTraceCount, math.ceil(nCost))
NovaAPI.SetTMPColor(self._mapNode.txtReqTraceCount, nCost <= nHasCoin and Blue_Normal or Red_Unable)
self._mapNode.btnMultiTrace.gameObject:SetActive(true)
self._mapNode.btnSkip.gameObject:SetActive(false)
self._mapNode.goAutoTips.gameObject:SetActive(false)
self._mapNode.btnTrace.gameObject:SetActive(true)
if nHasCoin >= 2 * nCost then
local nCount = math.modf(nHasCoin / nCost)
if nCount > self.nMaxMultiTrace then
nCount = self.nMaxMultiTrace
end
NovaAPI.SetTMPText(self._mapNode.txtBtnMultiTrace, orderedFormat(ConfigTable.GetUIText("TraceHunt_Btn_MultiTrace"), nCount))
else
NovaAPI.SetTMPText(self._mapNode.txtBtnMultiTrace, orderedFormat(ConfigTable.GetUIText("TraceHunt_Btn_MultiTrace"), 2))
end
end
function TraceHuntCtrl:RefreshTraceLog()
local tbLog = PlayerData.TraceHunt:GetTraceLog()
self.nTraceLogCount = #tbLog
delChildren(self._mapNode.Content)
self:RefreshLog(tbLog)
self:RefreshTraceLogEmpty()
end
function TraceHuntCtrl:UpdateTraceLogCount()
local tbLog = PlayerData.TraceHunt:GetTraceLog()
local nNewLogStart = self.nTraceLogCount + 1
self.nTraceLogCount = #tbLog
self:RefreshTraceLogEmpty()
return nNewLogStart
end
function TraceHuntCtrl:RefreshTraceLogEmpty()
self._mapNode.goTraceLogEmpty:SetActive(self.nTraceLogCount == 0)
self._mapNode.goHuntLogEmpty:SetActive(false)
end
function TraceHuntCtrl:RefreshHunt()
self:RefreshHuntBoard()
self:RefreshHuntBtn()
self:RefreshHuntLog()
end
function TraceHuntCtrl:RefreshHuntBoard()
local nProgress = PlayerData.TraceHunt:GetHuntProgress()
local nBossId = PlayerData.TraceHunt:GetBossId()
local mapBossCfg = ConfigTable.GetData("TraceHuntBoss", nBossId, true)
if not mapBossCfg then
return
end
self:SetPngSprite(self._mapNode.imgFullIcon, mapBossCfg.TargetIcon)
local mData = ConfigTable.GetData("Monster", mapBossCfg.MonsterId)
local mSkin = ConfigTable.GetData("MonsterSkin", mData.FAId)
local mManual = ConfigTable.GetData("MonsterManual", mSkin.MonsterManual)
NovaAPI.SetTMPText(self._mapNode.txtBossName, mManual.Name)
local sP = string.format("%.1f", nProgress)
NovaAPI.SetTMPText(self._mapNode.txtHuntProgressTitle, orderedFormat(ConfigTable.GetUIText("TraceHunt_HuntProgress"), sP))
NovaAPI.SetImageFillAmount(self._mapNode.imgHuntProgress, nProgress / 100)
self.nHuntLeftTime = PlayerData.TraceHunt:GetHuntLeftTime()
if self.timerCountDownHunt == nil then
self.timerCountDownHunt = self:AddTimer(0, 1, "RefreshHuntTime", false, true, false)
end
self:RefreshHuntTime()
if self.nHuntLeftTime > 0 then
self.timerCountDownHunt:Pause(false)
end
end
function TraceHuntCtrl:RefreshHuntBtn()
local nHuntCount = PlayerData.TraceHunt:GetSelfHuntCount()
local nCost = PlayerData.TraceHunt:GetHuntCostCount(true)
local nHasCoin = PlayerData.TraceHunt:GetHuntTokenCount()
local bComplete = PlayerData.TraceHunt:CheckHuntComplete()
local bInterrupt = PlayerData.TraceHunt:CheckHuntInterrupt()
if bComplete or bInterrupt then
self._mapNode.btnHunt.gameObject:SetActive(false)
self._mapNode.btnHuntReward.gameObject:SetActive(true)
self._mapNode.imgArrested:SetActive(bComplete)
self._mapNode.imgEscaped:SetActive(bInterrupt)
self._mapNode.dbHuntLeftTime:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtHuntLeftTime, ConfigTable.GetUIText("TraceHunt_HuntEnd"))
else
self._mapNode.btnHunt.gameObject:SetActive(true)
self._mapNode.btnHuntReward.gameObject:SetActive(false)
self._mapNode.imgArrested:SetActive(false)
self._mapNode.imgEscaped:SetActive(false)
self._mapNode.dbHuntLeftTime:SetActive(0 < nHuntCount)
if nHuntCount == 0 then
NovaAPI.SetTMPText(self._mapNode.txtBtnHunt, ConfigTable.GetUIText("TraceHunt_Btn_Hunt"))
else
NovaAPI.SetTMPText(self._mapNode.txtBtnHunt, ConfigTable.GetUIText("TraceHunt_Btn_HuntAgain"))
end
self._mapNode.goReqHunt:SetActive(0 < nCost)
if 0 < nCost then
self:SetSprite_Coin(self._mapNode.imgReqHuntIcon, self.nHuntItemId)
NovaAPI.SetTMPText(self._mapNode.txtReqHuntCount, math.ceil(nCost))
NovaAPI.SetTMPColor(self._mapNode.txtReqHuntCount, nCost <= nHasCoin and Blue_Normal or Red_Unable)
end
end
end
function TraceHuntCtrl:RefreshHuntLog()
local tbLog = PlayerData.TraceHunt:GetHuntLog()
self.nHuntLogCount = #tbLog
delChildren(self._mapNode.Content)
self:RefreshLog(tbLog)
self:RefreshHuntLogEmpty()
end
function TraceHuntCtrl:RefreshHuntLogEmpty()
self._mapNode.goTraceLogEmpty:SetActive(false)
self._mapNode.goHuntLogEmpty:SetActive(self.nHuntLogCount == 0)
end
function TraceHuntCtrl:RefreshHuntAddLog()
local tbLog = PlayerData.TraceHunt:GetHuntLog()
self:RefreshAddLog(tbLog, self.nHuntLogCount + 1)
self.nHuntLogCount = #tbLog
self:RefreshHuntLogEmpty()
end
function TraceHuntCtrl:RefreshLog(tbLog)
for _, mapLog in ipairs(tbLog) do
self:CreateLog(mapLog)
end
NovaAPI.SetVerticalNormalizedPosition(self._mapNode.ScrollView, 0)
end
function TraceHuntCtrl:RefreshAddLog(tbLog, nStart, bSkip)
for i = nStart, #tbLog do
local mapLog = tbLog[i]
local ctrlLog = self:CreateLog(mapLog)
if ctrlLog then
ctrlLog:PlayLogAni(bSkip)
local nTime = 0.3
self._mapNode.ScrollView:DOVerticalNormalizedPos(0, nTime):SetEase(Ease.OutQuart)
end
end
end
function TraceHuntCtrl:CreateLog(mapLog)
local mapCfg = ConfigTable.GetData("TraceHuntLogEntryTemplate", mapLog.nId)
if mapCfg then
local logPrefab
local sPrefab = "UI/Play_TraceHuntLevelSelect/LogTemplate/TraceHuntLogTemplate" .. mapCfg.Template .. ".prefab"
if GameResourceLoader.ExistsAsset(Settings.AB_ROOT_PATH .. sPrefab) == true then
logPrefab = self:LoadAsset(sPrefab)
end
if logPrefab ~= nil then
local goRoot = instantiate(self._mapNode.LogRoot, self._mapNode.Content)
local rtRoot = goRoot.transform:GetComponent("RectTransform")
local goLog = instantiate(logPrefab, self._mapNode.LogHeight)
local ctrlLog = self:BindCtrlByNode(goLog, "Game.UI.TraceHunt.TraceHuntLogCtrl")
ctrlLog:Refresh(mapLog)
local nH = ctrlLog:ForceRebuild()
rtRoot.sizeDelta = Vector2(rtRoot.sizeDelta.x, nH)
goLog.transform:SetParent(rtRoot)
goLog.transform:GetComponent("RectTransform").anchoredPosition = Vector2(0, 0)
return ctrlLog
end
end
return nil
end
function TraceHuntCtrl:RefreshHuntTime()
self.nHuntLeftTime = self.nHuntLeftTime - 1
if self.nHuntLeftTime > 0 then
local sTime = ""
if self.nHuntLeftTime <= 60 then
local sec = math.floor(self.nHuntLeftTime)
sTime = orderedFormat(ConfigTable.GetUIText("TraceHunt_HuntRefresh_Sec"), sec)
elseif self.nHuntLeftTime > 60 and self.nHuntLeftTime <= 3600 then
local min = math.floor(self.nHuntLeftTime / 60)
local sec = math.floor(self.nHuntLeftTime - min * 60)
if sec == 0 then
min = min - 1
sec = 60
end
sTime = orderedFormat(ConfigTable.GetUIText("TraceHunt_HuntRefresh_Min"), min, sec)
elseif self.nHuntLeftTime > 3600 and self.nHuntLeftTime <= 86400 then
local hour = math.floor(self.nHuntLeftTime / 3600)
local min = math.floor((self.nHuntLeftTime - hour * 3600) / 60)
if min == 0 then
hour = hour - 1
min = 60
end
sTime = orderedFormat(ConfigTable.GetUIText("TraceHunt_HuntRefresh_Hour"), hour, min)
end
NovaAPI.SetTMPText(self._mapNode.txtHuntLeftTime, sTime)
else
NovaAPI.SetTMPText(self._mapNode.txtHuntLeftTime, orderedFormat(ConfigTable.GetUIText("TraceHunt_HuntRefresh_Sec"), 0))
self.timerCountDownHunt:Pause(true)
end
end
function TraceHuntCtrl:RefreshNPC2D()
local bUseL2D = LocalSettingData.mapData.UseLive2D
self._mapNode.rawImgActor2D.transform.localScale = bUseL2D == true and Vector3.one or Vector3.zero
self._mapNode.trActor2D_PNG.localScale = bUseL2D == true and Vector3.zero or Vector3.one
NovaAPI.SetButtonInteractable(self._mapNode.btnActor, true)
local nPanelId = self:GetPanelId()
if bUseL2D == true then
Actor2DManager.SetBoardNPC2D(nPanelId, self._mapNode.rawImgActor2D, self.npcId)
else
Actor2DManager.SetBoardNPC2D_PNG(self._mapNode.trActor2D_PNG, nPanelId, self.npcId)
end
end
function TraceHuntCtrl:PlayEnterStateVoice()
local bMaxTrace = PlayerData.TraceHunt:CheckMaxTrace()
if bMaxTrace then
PlayerVoiceData:PlayCharVoice("greet_th_hunt0", self.npcId, nil, true)
else
local nProgress = PlayerData.TraceHunt:GetTraceProgress()
if nProgress <= 50 then
PlayerVoiceData:PlayCharVoice("greet_th_trace0", self.npcId, nil, true)
else
PlayerVoiceData:PlayCharVoice("greet_th_trace1", self.npcId, nil, true)
end
end
end
function TraceHuntCtrl:RefreshNewControl(bWait)
local bNew = PlayerData.TraceHunt:GetNewControl()
if not bNew then
return
end
local open = function()
self._mapNode.blur:SetActive(true)
self._mapNode.Update:SetActive(true)
self._mapNode.aniUpdate:Play("TraceHuntHelpPanel_tips_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
local nEndTime = PlayerData.TraceHunt:GetEndTime()
local nStartTime = PlayerData.TraceHunt:GetStartTime()
local nOpenYear = tostring(os.date("%Y", nStartTime))
local nOpenMonth = tostring(os.date("%m", nStartTime))
local nOpenDay = tostring(os.date("%d", nStartTime))
local nOpenHour = tonumber(os.date("%H", nStartTime))
local nOpenMin = tonumber(os.date("%M", nStartTime))
local nEndYear = tostring(os.date("%Y", nEndTime))
local nEndMonth = tostring(os.date("%m", nEndTime))
local nEndDay = tostring(os.date("%d", nEndTime))
local nEndHour = tonumber(os.date("%H", nEndTime))
local nEndMin = tonumber(os.date("%M", nEndTime))
local strOpenHour = string.format("%02d", nOpenHour)
local strEndHour = string.format("%02d", nEndHour)
local strOpenMin = string.format("%02d", nOpenMin)
local strEndMin = string.format("%02d", nEndMin)
local dateStr = string.format("%s/%s/%s %s:%s ~ %s/%s/%s %s:%s", nOpenYear, nOpenMonth, nOpenDay, strOpenHour, strOpenMin, nEndYear, nEndMonth, nEndDay, strEndHour, strEndMin)
NovaAPI.SetTMPText(self._mapNode.txtDate, dateStr)
end
PlayerData.TraceHunt:SetNewControl(false)
if bWait then
EventManager.Hit(EventId.TemporaryBlockInput, 1)
self:AddTimer(1, 1, open, true, true, true)
else
open()
end
end
function TraceHuntCtrl:GetPieceCount(nBeforeProgress)
local nProgress = PlayerData.TraceHunt:GetTraceProgress()
local nPieceCount, nBeforePieceCount = 0, 0
for i, v in ipairs(self.tbPieceNeedProgress) do
if v <= nProgress then
nPieceCount = i
end
if v <= nBeforeProgress then
nBeforePieceCount = i
end
end
return nPieceCount, nBeforePieceCount
end
function TraceHuntCtrl:StartTicketsRefreshTimer()
if self.ticketRefreshTimer ~= nil then
self.ticketRefreshTimer:Cancel()
self.ticketRefreshTimer = nil
end
local nCurTime = ClientManager.serverTimeStamp
local nNextRefreshTime = CS.ClientManager.Instance:GetNextRefreshTime(nCurTime)
local refreshTime = function()
nCurTime = ClientManager.serverTimeStamp
local nRemainTime = nNextRefreshTime - nCurTime
local sTime = timeFormat_HMS(nRemainTime)
NovaAPI.SetTMPText(self._mapNode.txtDailyTime, orderedFormat(ConfigTable.GetUIText("TraceHunt_Coin_Time"), self.sTraceItemTitle, sTime))
end
refreshTime()
self.ticketRefreshTimer = self:AddTimer(0, 1, function()
refreshTime()
end, true, true, false)
end
function TraceHuntCtrl:PlayTraceInAni(callback)
self._mapNode.TopBar:SetTitleTxt(ConfigTable.GetUIText("TraceHunt_Topbar_Sub"))
self.animator:Play("TraceHuntSelectPanel_enlarge", 0, 0)
NovaAPI.SetButtonInteractable(self._mapNode.btnActor, false)
NovaAPI.SetCanvasGroupInteractable(self._mapNode.cgLeft, false)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.cgLeft, false)
WwiseManger:PostEvent("mode_gongdou_board")
EventManager.Hit(EventId.TemporaryBlockInput, 0.5)
self:AddTimer(1, 0.5, callback, true, true, true)
end
function TraceHuntCtrl:KillSequence()
self:KillSequenceBoard()
self:KillSequenceTraceLog()
self:KillSequenceMulti()
end
function TraceHuntCtrl:KillSequenceBoard()
if self.sequenceBoard then
self.sequenceBoard:Kill(true)
self.sequenceBoard = nil
end
end
function TraceHuntCtrl:KillSequenceTraceLog()
if self.sequenceTraceLog then
self.sequenceTraceLog:Kill(true)
self.sequenceTraceLog = nil
end
end
function TraceHuntCtrl:KillSequenceMulti()
if self.sequenceMulti then
self.sequenceMulti:Kill(true)
self.sequenceMulti = nil
end
end
function TraceHuntCtrl:ClearTimer()
if self.ticketRefreshTimer ~= nil then
self.ticketRefreshTimer:Cancel()
self.ticketRefreshTimer = nil
end
if self.timerCountDownControl ~= nil then
self.timerCountDownControl:Cancel()
self.timerCountDownControl = nil
end
if self.timerCountDownHunt ~= nil then
self.timerCountDownHunt:Cancel()
self.timerCountDownHunt = nil
end
end
function TraceHuntCtrl:FadeIn()
if self._panel._nFadeInType == 1 then
EventManager.Hit(EventId.SetTransition)
self.animator:Play("TraceHuntSelectPanel_in", 0, 0)
elseif self._panel._nFadeInType == 2 then
self.animator:Play("TraceHuntSelectPanel_in", 0, 1)
end
end
function TraceHuntCtrl:Awake()
self.bLarge = false
self:RefreshConfig()
end
function TraceHuntCtrl:OnEnable()
self.animator = self.gameObject:GetComponent("Animator")
PlayerVoiceData:StartBoardFreeTimer(self.npcId)
self:RefreshContent()
self:RefreshNewControl(true)
end
function TraceHuntCtrl:OnDisable()
Actor2DManager.UnsetBoardNPC2D()
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
self._panel._nFadeInType = 2
self.bLarge = false
self.bChangeState = false
self:ClearTimer()
self:KillSequence()
end
function TraceHuntCtrl:OnDestroy()
end
function TraceHuntCtrl:OnBtnClick_Shop(btn)
EventManager.Hit(EventId.OpenPanel, PanelId.ShopPanel, ConfigTable.GetConfigNumber("TraceHuntShopID"))
end
function TraceHuntCtrl:OnBtnClick_Handbook(btn)
EventManager.Hit(EventId.OpenPanel, PanelId.TraceHuntHandBook)
end
function TraceHuntCtrl:OnBtnClick_Help(btn)
EventManager.Hit(EventId.OpenPanel, PanelId.TraceHuntHelp)
end
function TraceHuntCtrl:OnBtnClick_Trace(btn)
local nCost = PlayerData.TraceHunt:GetTraceCostCount()
local nHasCoin = PlayerData.TraceHunt:GetTraceTokenCount()
if nCost > nHasCoin then
EventManager.Hit(EventId.OpenMessageBox, orderedFormat(ConfigTable.GetUIText("TraceHunt_Tips_TraceItemNotEnough"), self.sTraceItemTitle))
return
end
local nBeforeProgress = PlayerData.TraceHunt:GetTraceProgress()
local trace = function()
local callback = function()
self:RefreshTraceBtn()
local nNewLogStart = self:UpdateTraceLogCount()
self:PlayTraceAddLog(nNewLogStart, nBeforeProgress)
self:PlayTraceBoardAni(nBeforeProgress)
end
PlayerData.TraceHunt:SendTraceHuntTraceReq(1, callback)
end
if not self.bLarge then
self.bLarge = true
self:PlayTraceInAni(trace)
else
trace()
end
end
function TraceHuntCtrl:OnBtnClick_MultiTrace(btn)
local nCost = PlayerData.TraceHunt:GetTraceCostCount()
local nHasCoin = PlayerData.TraceHunt:GetTraceTokenCount()
local nCount = math.modf(nHasCoin / nCost)
if nCount > self.nMaxMultiTrace then
nCount = self.nMaxMultiTrace
end
if nHasCoin < 2 * nCost then
EventManager.Hit(EventId.OpenMessageBox, orderedFormat(ConfigTable.GetUIText("TraceHunt_Tips_TraceItemNotEnough"), self.sTraceItemTitle))
return
end
local nBeforeProgress = PlayerData.TraceHunt:GetTraceProgress()
local trace = function()
local callback = function()
local nNewLogStart = self:UpdateTraceLogCount()
self:PlayMultiTraceAni(nBeforeProgress, nCount, nNewLogStart)
end
PlayerData.TraceHunt:SendTraceHuntTraceReq(nCount, callback)
end
if not self.bLarge then
self.bLarge = true
self:PlayTraceInAni(trace)
else
trace()
end
end
function TraceHuntCtrl:OnBtnClick_Hunt(btn)
local nHuntCount = PlayerData.TraceHunt:GetSelfHuntCount()
local nCost = PlayerData.TraceHunt:GetHuntCostCount(true)
local nHasCoin = PlayerData.TraceHunt:GetHuntTokenCount()
if nCost > nHasCoin then
EventManager.Hit(EventId.OpenMessageBox, orderedFormat(ConfigTable.GetUIText("TraceHunt_Tips_HuntItemNotEnough"), self.sHuntItemTitle))
return
end
if PlayerData.TraceHunt:GetControlLeftTime() <= 0 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("TraceHunt_Tips_ControlInterrupt"))
return
end
if PlayerData.TraceHunt:CheckHuntInterrupt() then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("TraceHunt_Tips_HuntInterrupt"))
return
end
local hunt = function()
local OpenPanel = function()
local nBossCreateTime = PlayerData.TraceHunt:GetBossCreateTime()
local nBossId = PlayerData.TraceHunt:GetBossId()
EventManager.Hit(EventId.OpenPanel, PanelId.RegionBossFormation, AllEnum.RegionBossFormationType.TraceHunt, nBossId, {
PlayerData.Base._nPlayerId,
nBossCreateTime
})
end
EventManager.Hit(EventId.SetTransition, 2, OpenPanel)
end
local bWarn = PlayerData.TraceHunt:GetHuntWarning()
if 0 < nHuntCount and bWarn then
local isSelectAgain = false
local confirmCallback = function()
PlayerData.TraceHunt:SetHuntWarning(not isSelectAgain)
hunt()
end
local againCallback = function(isSelect)
isSelectAgain = isSelect
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = orderedFormat(ConfigTable.GetUIText("TraceHunt_MultiHuntWarning"), self.sHuntItemTitle),
callbackConfirm = confirmCallback,
callbackAgain = againCallback,
sAgain = ConfigTable.GetUIText("MessageBox_LoginWarning"),
sConfirm = ConfigTable.GetUIText("TraceHunt_Btn_MultiHuntWarningConfirm"),
sCancel = ConfigTable.GetUIText("TraceHunt_Btn_MultiHuntWarningCancel")
}
EventManager.Hit(EventId.OpenMessageBox, msg)
else
hunt()
end
end
function TraceHuntCtrl:OnBtnClick_Reward(btn)
local callback = function(mapBeforeLevel, mapAfterLevel, mapChangeInfo)
local ani_end = function()
if mapAfterLevel.nLevel > mapBeforeLevel.nLevel then
local suc = function()
local mapData = {
nLevel = mapAfterLevel.nLevel,
mapLevel = PlayerData.TraceHunt:GetTraceHuntLevelData(mapAfterLevel.nLevel)
}
EventManager.Hit(EventId.OpenPanel, PanelId.TraceHuntSucBar, mapData)
end
UTILS.OpenReceiveByChangeInfo(mapChangeInfo, suc)
else
UTILS.OpenReceiveByChangeInfo(mapChangeInfo)
end
self:RefreshContent()
end
EventManager.Hit(EventId.TemporaryBlockInput, 0.5)
self:RefreshHuntAddLog()
self:AddTimer(1, 0.5, function()
self._mapNode.goExpBar:PlayAni(mapBeforeLevel, mapAfterLevel, ani_end)
end, true, true, true)
end
PlayerData.TraceHunt:SendTraceHuntRewardReceiveReq(callback)
end
function TraceHuntCtrl:OnBtnClick_Skip(btn)
self:KillSequenceMulti()
end
function TraceHuntCtrl:OnBtnClick_LevelInfo(btn)
EventManager.Hit(EventId.OpenPanel, PanelId.TraceHuntLevel)
end
function TraceHuntCtrl:OnBtnClick_CoinTips(btn, nIndex)
if nIndex == 1 then
UTILS.ClickItemGridWithTips(AllEnum.CoinItemId.TraceHunt, self._mapNode.btnResCoin[1].transform, true, true, false)
else
self._mapNode.goTip.gameObject:SetActive(true)
local sortingOrder = NovaAPI.GetCanvasSortingOrder(self.gameObject:GetComponent("Canvas"))
NovaAPI.SetButtonInteractable(self._mapNode.btnResCoin[2], false)
NovaAPI.SetComponentEnableByName(self._mapNode.goResCoin2, "TopGridCanvas", true)
NovaAPI.SetTopGridCanvasSorting(self._mapNode.goResCoin2, sortingOrder + 1)
NovaAPI.SetTMPText(self._mapNode.txtTipsName, self.sTraceItemTitle)
local tbMax = ConfigTable.GetConfigArray("TraceHuntRequestItem")
NovaAPI.SetTMPText(self._mapNode.txtTipsContent, orderedFormat(ConfigTable.GetUIText("TraceHunt_Coin_Rule"), tbMax[1], self.sTraceItemTitle))
local nDaily = PlayerData.TraceHunt:GetTraceTokenDailyCount()
NovaAPI.SetTMPText(self._mapNode.txtDailyCount, orderedFormat(ConfigTable.GetUIText("TraceHunt_Coin_Daily"), nDaily, tbMax[2]))
end
end
function TraceHuntCtrl:OnBtnClick_TipsBg()
NovaAPI.SetButtonInteractable(self._mapNode.btnResCoin[2], true)
NovaAPI.SetComponentEnableByName(self._mapNode.goResCoin2, "TopGridCanvas", false)
self._mapNode.goTip.gameObject:SetActive(false)
end
function TraceHuntCtrl:OnBtnClick_ClosePop(btn)
self._mapNode.aniUpdate:Play("TraceHuntHelpPanel_tips_out")
self._mapNode.aniBlur:SetTrigger("tOut")
self:AddTimer(1, 0.25, function()
self._mapNode.blur:SetActive(false)
self._mapNode.Update:SetActive(false)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.25)
end
function TraceHuntCtrl:OnBtnClick_Actor2D()
local bMaxTrace = PlayerData.TraceHunt:CheckMaxTrace()
if bMaxTrace then
PlayerVoiceData:PlayBoardNPCClickVoice(self.npcId, 0, "poster_th_hunt0")
else
local nProgress = PlayerData.TraceHunt:GetTraceProgress()
if nProgress <= 50 then
PlayerVoiceData:PlayBoardNPCClickVoice(self.npcId, 0, "poster_th_trace0")
else
PlayerVoiceData:PlayBoardNPCClickVoice(self.npcId, 0, "poster_th_trace1")
end
end
end
function TraceHuntCtrl:OnEvent_BossExpired()
self:RefreshHuntBoard()
self:RefreshHuntBtn()
self:RefreshHuntAddLog()
end
function TraceHuntCtrl:OnEvent_NewControl()
self.animator:Play("TraceHuntSelectPanel_in", 0, 1)
self:RefreshContent()
self:RefreshNewControl()
end
function TraceHuntCtrl:OnEvent_InfoChange()
self:RefreshContent()
end
function TraceHuntCtrl:OnEvent_ShowBubbleVoiceText(nNpcId, nId)
if nNpcId ~= self.npcId then
return
end
local mapVoDirectoryData = ConfigTable.GetData("VoDirectory", nId)
if mapVoDirectoryData == nil then
printError("VoDirectory未找到数据id:" .. nId)
return
end
BubbleVoiceManager.PlayFixedBubbleAnim(self._mapNode.goBubbleRoot, mapVoDirectoryData.voResource)
end
function TraceHuntCtrl:OnEvent_Back(nPanelId)
if self._panel._nPanelId ~= nPanelId then
return
end
if self.bLarge then
self:KillSequence()
if self.bChangeState then
return
end
self.bLarge = false
self._mapNode.TopBar:SetTitleTxt(ConfigTable.GetData("TopBar", "TraceHunt").Title)
self.animator:Play("TraceHuntSelectPanel_back", 0, 0)
NovaAPI.SetButtonInteractable(self._mapNode.btnActor, true)
NovaAPI.SetCanvasGroupInteractable(self._mapNode.cgLeft, true)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.cgLeft, true)
WwiseManger:PostEvent("mode_gongdou_board_out")
EventManager.Hit(EventId.TemporaryBlockInput, 0.5)
else
EventManager.Hit(EventId.CloesCurPanel)
end
end
function TraceHuntCtrl:OnEvent_Home(nPanelId)
if self._panel._nPanelId ~= nPanelId then
return
end
PanelManager.Home()
end
return TraceHuntCtrl