5e0d58cfad
EN: 1.2.0.60 CN: 1.2.0.61 JP: 1.2.0.63 KR: 1.2.0.67
403 lines
14 KiB
Lua
403 lines
14 KiB
Lua
local LocalData = require("GameCore.Data.LocalData")
|
|
local PhoneChatCtrl = class("PhoneChatCtrl", BaseCtrl)
|
|
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
|
|
PhoneChatCtrl._mapNodeConfig = {
|
|
goChatHistory = {},
|
|
btnHistoryList = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_HistoryList"
|
|
},
|
|
txtHistoryBtn = {
|
|
nCount = 2,
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Phone_Chat_History_List"
|
|
},
|
|
btnNormal = {},
|
|
btnSelect = {},
|
|
goHistoryList = {},
|
|
animHistoryList = {
|
|
sNodeName = "goHistoryList",
|
|
sComponentName = "Animator"
|
|
},
|
|
chatHistoryLSV = {
|
|
sComponentName = "LoopScrollView"
|
|
},
|
|
trLSV = {
|
|
sNodeName = "chatHistoryLSV",
|
|
sComponentName = "Transform"
|
|
},
|
|
btnHistoryMask = {
|
|
sComponentName = "Button",
|
|
callback = "OnBtnClick_HistoryMask"
|
|
},
|
|
goPhone = {
|
|
sCtrlName = "Game.UI.Avg.Avg_5_PhoneCtrl"
|
|
},
|
|
btnMask = {},
|
|
goChatEmpty = {},
|
|
animChatBgEmpty = {
|
|
sNodeName = "imgChatBgEmpty",
|
|
sComponentName = "Animator"
|
|
},
|
|
animChatBgActive = {
|
|
sNodeName = "imgChatBgActive",
|
|
sComponentName = "Animator"
|
|
},
|
|
txtChatEmpty = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Phone_Chat_None_Selection"
|
|
}
|
|
}
|
|
PhoneChatCtrl._mapEventConfig = {
|
|
[EventId.AvgShowNextPhoneMessage] = "OnEvent_AvgShowNextPhoneMessage",
|
|
[EventId.AvgSelectPhoneMsgChoice] = "OnEvent_AvgSelectPhoneMsgChoice",
|
|
[EventId.AvgSetToPhoneMsgChoiceEnd] = "OnEvent_AvgSetToPhoneMsgChoiceEnd",
|
|
RecordChatProcessSuccess = "OnEvent_RecordChatProcessSuccess",
|
|
ReceiveChatReward = "OnEvent_ReceiveChatReward"
|
|
}
|
|
function PhoneChatCtrl:SetChatContent(addressData, nSelectChatId, bRestart)
|
|
local bSameChat = nSelectChatId ~= nil and nSelectChatId == self.nSelectChatId
|
|
if bSameChat == true then
|
|
self:RefreshChatContent(nSelectChatId, false, false, true)
|
|
return
|
|
end
|
|
local sCharId = tostring(nSelectChatId):sub(1, 3)
|
|
LocalData.SetPlayerLocalData("LastPhoneChatId" .. sCharId, nSelectChatId)
|
|
self._mapNode.btnHistoryList.gameObject:SetActive(true)
|
|
self._mapNode.animChatBgActive.gameObject:SetActive(true)
|
|
self._mapNode.goChatEmpty.gameObject:SetActive(false)
|
|
self._mapNode.animChatBgActive:Play("Phone_chaticon_in")
|
|
self.nAddressId = addressData.nAddressId
|
|
self:RefreshChatContent(nSelectChatId, nil, bRestart)
|
|
end
|
|
function PhoneChatCtrl:RefreshChatHistory()
|
|
self.tbChatHistory = PlayerData.Phone:GetChatHistoryList(self.nAddressId)
|
|
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
|
|
self:UnbindCtrlByNode(objCtrl)
|
|
self.tbGridCtrl[nInstanceId] = nil
|
|
end
|
|
self._mapNode.chatHistoryLSV:Init(#self.tbChatHistory, self, self.OnGridRefresh, self.OnGridBtnClick)
|
|
end
|
|
function PhoneChatCtrl: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.Phone.Chat.ChatHistoryItemCtrl")
|
|
end
|
|
local chatData = self.tbChatHistory[nIndex]
|
|
self.tbGridCtrl[nInstanceID]:SetData(chatData)
|
|
if chatData.nChatId == self.nSelectChatId then
|
|
self.tbGridCtrl[nInstanceID]:SetSelect(true)
|
|
end
|
|
end
|
|
function PhoneChatCtrl:OnGridBtnClick(goGrid, gridIndex)
|
|
local nIndex = gridIndex + 1
|
|
local chatData = self.tbChatHistory[nIndex]
|
|
local bSameChat = chatData.nChatId == self.nSelectChatId
|
|
self.bHistoryOpen = false
|
|
if not bSameChat then
|
|
self:ResetPhone()
|
|
end
|
|
local sCharId = tostring(chatData.nChatId):sub(1, 3)
|
|
LocalData.SetPlayerLocalData("LastPhoneChatId" .. sCharId, chatData.nChatId)
|
|
self:OpenHistoryList(not bSameChat, chatData.nChatId)
|
|
end
|
|
function PhoneChatCtrl:RefreshChatContent(nSelectChatId, bReset, bRestart, bCountinue)
|
|
local bSameChat = not bCountinue and nSelectChatId ~= nil and nSelectChatId == self.nSelectChatId
|
|
if bSameChat == true then
|
|
return
|
|
end
|
|
self.bRestart = bRestart
|
|
if bReset and nil ~= self.nSelectChatId then
|
|
self:ResetPhone()
|
|
end
|
|
self:RecordServerProcess()
|
|
self.nSelectChatId = nSelectChatId
|
|
self.chatData = PlayerData.Phone:GetChatData(self.nAddressId, self.nSelectChatId)
|
|
if self.bHistoryOpen then
|
|
self.bHistoryOpen = false
|
|
self:OpenHistoryList()
|
|
end
|
|
if nil ~= self.chatData then
|
|
if bRestart and self.chatData.nStatus ~= AllEnum.PhoneChatState.Complete then
|
|
self.nChatProcess = 0
|
|
self.nInitProcess = 0
|
|
self.tbSelection = {}
|
|
else
|
|
self.nChatProcess = self.chatData.nProcess
|
|
self.nInitProcess = self.chatData.nProcess
|
|
if self.chatData.tbSelection ~= nil then
|
|
self.tbSelection = self.chatData.tbSelection
|
|
end
|
|
end
|
|
if self.nChatProcess == 0 then
|
|
self.nChatProcess = 1
|
|
self:RecordProcess()
|
|
end
|
|
self._mapNode.goPhone:SetPhoneContacts(self.nAddressId)
|
|
self:ResetPhone()
|
|
self._mapNode.goPhone:_SetAutoPlayState(false)
|
|
if self.nChatProcess > 1 then
|
|
self:RevertHistoryList()
|
|
else
|
|
self:RefreshContent()
|
|
end
|
|
end
|
|
end
|
|
function PhoneChatCtrl:RefreshContent()
|
|
local nCurIndex = self.nChatProcess
|
|
local data = self.chatData.avgMsg[self.nChatProcess]
|
|
if nil ~= data then
|
|
local nextData = self:GetNextData(nCurIndex, data)
|
|
local bManual
|
|
if nextData ~= nil then
|
|
bManual = nextData.param[1] == 1 or nextData.param[1] == 4
|
|
self._mapNode.goPhone:_SetAutoPlayState(not bManual)
|
|
end
|
|
if data.cmd == "SetPhoneMsg" then
|
|
self._mapNode.goPhone:SetPhoneMsg(data.param, false, self.nChatProcess)
|
|
self.nMsgDuration = self._mapNode.goPhone:_CalcTextAnimDuration(data.param[3])
|
|
self:CheckNextMessage(nCurIndex, 1)
|
|
elseif data.cmd == "SetPhoneMsgChoiceBegin" then
|
|
self._mapNode.goPhone:SetPhoneMsgChoiceBegin(data.param, false, self.nChatProcess)
|
|
elseif data.cmd == "SetPhoneMsgChoiceJumpTo" then
|
|
self._mapNode.goPhone:SetPhoneMsgChoiceJumpTo(data.param)
|
|
elseif data.cmd == "SetPhoneMsgChoiceEnd" then
|
|
self._mapNode.goPhone:SetPhoneMsgChoiceEnd(data.param)
|
|
end
|
|
end
|
|
end
|
|
function PhoneChatCtrl:CheckNextMessage(nCurProcess, index)
|
|
local data = self.chatData.avgMsg[nCurProcess + index]
|
|
if data == nil then
|
|
return
|
|
end
|
|
local state = self._mapNode.goPhone:GetNextDataState(data)
|
|
if state < 0 then
|
|
self._mapNode.goPhone:ShowNextInputingPhoneMsg(state)
|
|
elseif state == 0 then
|
|
index = index + 1
|
|
self:CheckNextMessage(nCurProcess, index)
|
|
end
|
|
end
|
|
function PhoneChatCtrl:RevertHistoryList()
|
|
local selectionData = PlayerData.Phone:GetHistoryPhoneSelectionData(self.nSelectChatId)
|
|
local historyData = PlayerData.Phone:GetHistoryPhoneMsgData(self.nSelectChatId)
|
|
if historyData ~= nil then
|
|
self._mapNode.goPhone:SetHistoryPhoneMsg(historyData, selectionData)
|
|
end
|
|
local nextData = self.chatData.avgMsg[self.nChatProcess + 1]
|
|
local bManual
|
|
if nextData ~= nil then
|
|
bManual = nextData.param[1] == 1 or nextData.param[1] == 4
|
|
self._mapNode.goPhone:_SetAutoPlayState(not bManual)
|
|
end
|
|
self:CheckNextMessage(self.nChatProcess, 1)
|
|
end
|
|
function PhoneChatCtrl:OpenHistoryList(bRefreshAddress, nChatId)
|
|
self._mapNode.btnHistoryMask.gameObject:SetActive(self.bHistoryOpen)
|
|
if self.bHistoryOpen then
|
|
self._mapNode.goHistoryList.gameObject:SetActive(true)
|
|
self._mapNode.animHistoryList:Play("t_window_05_t_in")
|
|
else
|
|
self._mapNode.animHistoryList:Play("t_window_05_t_out")
|
|
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
|
|
self:AddTimer(1, 0.3, function()
|
|
self._mapNode.goHistoryList.gameObject:SetActive(false)
|
|
if bRefreshAddress then
|
|
EventManager.Hit("RefreshPhoneAddress", nChatId, true)
|
|
end
|
|
end, true, true, true, false)
|
|
end
|
|
self._mapNode.btnNormal.gameObject:SetActive(not self.bHistoryOpen)
|
|
self._mapNode.btnSelect.gameObject:SetActive(self.bHistoryOpen)
|
|
end
|
|
function PhoneChatCtrl:RecordProcess()
|
|
if nil ~= self.chatData then
|
|
self.nChatProcess = self.nChatProcess > self.chatData.nAllProcess and self.chatData.nAllProcess or self.nChatProcess
|
|
if self.nChatProcess > self.chatData.nProcess and self.chatData.nStatus ~= AllEnum.PhoneChatState.Complete then
|
|
PlayerData.Phone:RefreshChatProcess(self.nAddressId, self.nSelectChatId, self.nChatProcess, self.tbSelection)
|
|
end
|
|
end
|
|
end
|
|
function PhoneChatCtrl:RecordServerProcess(callback)
|
|
if nil ~= self.chatData and self.nInitProcess ~= self.nChatProcess then
|
|
local bEnd = self.nChatProcess >= self.chatData.nAllProcess
|
|
if bEnd then
|
|
self._mapNode.btnMask.gameObject:SetActive(true)
|
|
end
|
|
if self.bRestart then
|
|
PlayerData.Phone:ClearHistoryPhoneMsgData(self.nSelectChatId)
|
|
end
|
|
PlayerData.Phone:SendChatProcess(self.nAddressId, self.nSelectChatId, self.nChatProcess, self.tbSelection, bEnd, callback)
|
|
end
|
|
end
|
|
function PhoneChatCtrl:CheckChatComplete()
|
|
local nNextProcess = PlayerData.Phone:GetNextProcess(self.nAddressId, self.nSelectChatId, self.nChatProcess)
|
|
if nNextProcess >= self.chatData.nAllProcess and self.nChatProcess ~= self.nInitProcess then
|
|
self.nChatProcess = self.chatData.nAllProcess
|
|
self:RecordProcess()
|
|
self:RecordServerProcess()
|
|
end
|
|
end
|
|
function PhoneChatCtrl:ResetPhone()
|
|
self._mapNode.goPhone:ResetPhoneMsgData()
|
|
end
|
|
function PhoneChatCtrl:GetNextData(nCurIndex, tbCurData)
|
|
if tbCurData.cmd ~= "SetPhoneMsgChoiceJumpTo" then
|
|
return self.chatData.avgMsg[nCurIndex + 1]
|
|
end
|
|
local sDataGroupID = tbCurData.param[1]
|
|
local sIndex = tbCurData.param[2]
|
|
local tbSelection = self._mapNode.goPhone.tbChoiceDecision[self._mapNode.goPhone.curContactsId]
|
|
local curSelection
|
|
for k, v in pairs(tbSelection) do
|
|
local sCurGroupId = v.groupID
|
|
if sCurGroupId == sDataGroupID then
|
|
curSelection = v
|
|
break
|
|
end
|
|
end
|
|
if curSelection ~= nil then
|
|
local sSelectedGroupId = curSelection.groupID
|
|
local sChoiceIndex = curSelection.choiceIndex
|
|
if sSelectedGroupId ~= nil and sSelectedGroupId == sDataGroupID and sChoiceIndex ~= nil then
|
|
local nEndCmdId, nStartCmdId
|
|
if sChoiceIndex == sIndex then
|
|
nEndCmdId = PlayerData.Phone:SetPhoneMsgChoiceJumpTo(self.nSelectChatId, sSelectedGroupId, sChoiceIndex)
|
|
nStartCmdId = PlayerData.Phone:GetAvgStartCmdId(self.nSelectChatId)
|
|
elseif sChoiceIndex ~= sIndex then
|
|
nEndCmdId = PlayerData.Phone:SetPhoneMsgChoiceEnd(self.nSelectChatId, sDataGroupID)
|
|
nStartCmdId = PlayerData.Phone:GetAvgStartCmdId(self.nSelectChatId)
|
|
end
|
|
if nEndCmdId ~= nil and nStartCmdId ~= nil then
|
|
local nNextIndex = nEndCmdId - nStartCmdId + 1
|
|
return self.chatData.avgMsg[nNextIndex]
|
|
end
|
|
end
|
|
end
|
|
return self.chatData.avgMsg[nCurIndex + 1]
|
|
end
|
|
function PhoneChatCtrl:Awake()
|
|
end
|
|
function PhoneChatCtrl:OnEnable()
|
|
self.bHistoryOpen = false
|
|
self.tbGridCtrl = {}
|
|
self.nChatProcess = 0
|
|
self.nInitProcess = 0
|
|
self.tbSelection = {}
|
|
self.nSelectChatId = nil
|
|
self.waitNextMsgTime = 3
|
|
self.nContentTextInterval = 0.3
|
|
self._mapNode.btnNormal.gameObject:SetActive(true)
|
|
self._mapNode.btnSelect.gameObject:SetActive(false)
|
|
self._mapNode.btnMask.gameObject:SetActive(false)
|
|
self._mapNode.btnHistoryList.gameObject:SetActive(false)
|
|
self._mapNode.goChatEmpty.gameObject:SetActive(true)
|
|
self._mapNode.animChatBgEmpty:Play("Phone_chaticon_in")
|
|
self._mapNode.animChatBgActive.gameObject:SetActive(false)
|
|
self._mapNode.goPhone:SetPhone({0, 1})
|
|
end
|
|
function PhoneChatCtrl:OnDisable()
|
|
self:RecordServerProcess()
|
|
self.bHistoryOpen = false
|
|
for nInstanceId, objCtrl in pairs(self.tbGridCtrl) do
|
|
self:UnbindCtrlByNode(objCtrl)
|
|
self.tbGridCtrl[nInstanceId] = nil
|
|
end
|
|
self.tbGridCtrl = {}
|
|
self.nChatProcess = 0
|
|
self.nInitProcess = 0
|
|
self.tbSelection = {}
|
|
self.nSelectChatId = nil
|
|
end
|
|
function PhoneChatCtrl:OnDestroy()
|
|
end
|
|
function PhoneChatCtrl:OnBtnClick_HistoryList()
|
|
self.bHistoryOpen = not self.bHistoryOpen
|
|
self:OpenHistoryList()
|
|
self:RefreshChatHistory()
|
|
end
|
|
function PhoneChatCtrl:OnBtnClick_HistoryMask()
|
|
self.bHistoryOpen = false
|
|
self:OpenHistoryList()
|
|
end
|
|
function PhoneChatCtrl:OnEvent_ReceiveChatReward()
|
|
if self.receiveRewardCb ~= nil then
|
|
self.receiveRewardCb()
|
|
self.receiveRewardCb = nil
|
|
end
|
|
end
|
|
function PhoneChatCtrl:OnEvent_AvgShowNextPhoneMessage()
|
|
if self.chatData.nStatus ~= AllEnum.PhoneChatState.Complete then
|
|
self.nChatProcess = self.nChatProcess + 1
|
|
self:RefreshContent()
|
|
self:RecordProcess()
|
|
self:CheckChatComplete()
|
|
end
|
|
end
|
|
function PhoneChatCtrl:OnEvent_AvgSelectPhoneMsgChoice(groupID, choiceIndex)
|
|
local nEndCmdId = PlayerData.Phone:SetPhoneMsgChoiceJumpTo(self.nSelectChatId, groupID, choiceIndex)
|
|
local nStartCmdId = PlayerData.Phone:GetAvgStartCmdId(self.nSelectChatId)
|
|
self.nChatProcess = nEndCmdId - nStartCmdId + 1
|
|
table.insert(self.tbSelection, choiceIndex)
|
|
self:RefreshContent()
|
|
self:RecordProcess()
|
|
self:CheckChatComplete()
|
|
end
|
|
function PhoneChatCtrl:OnEvent_AvgSetToPhoneMsgChoiceEnd(groupID, bAuto)
|
|
local nEndCmdId = PlayerData.Phone:SetPhoneMsgChoiceEnd(self.nSelectChatId, groupID)
|
|
local nStartCmdId = PlayerData.Phone:GetAvgStartCmdId(self.nSelectChatId)
|
|
self.nChatProcess = nEndCmdId - nStartCmdId
|
|
if self.nChatProcess >= self.chatData.nAllProcess then
|
|
self:RecordProcess()
|
|
self:CheckChatComplete()
|
|
elseif bAuto then
|
|
self.nChatProcess = self.nChatProcess + 1
|
|
self:RefreshContent()
|
|
else
|
|
self._mapNode.goPhone:_SetBtnEnable(true)
|
|
end
|
|
end
|
|
function PhoneChatCtrl:OnEvent_RecordChatProcessSuccess(mapChangeInfo)
|
|
self.chatData = PlayerData.Phone:GetChatData(self.nAddressId, self.nSelectChatId)
|
|
self.nChatProcess = self.chatData.nProcess
|
|
self.nInitProcess = self.chatData.nProcess
|
|
self.tbSelection = {}
|
|
if self.chatData.tbSelection ~= nil then
|
|
self.tbSelection = self.chatData.tbSelection
|
|
end
|
|
if self.chatData.nStatus == AllEnum.PhoneChatState.Complete then
|
|
local tbPlot = CacheTable.GetData("_PlotChat", self.nSelectChatId)
|
|
local bPlotLock = true
|
|
if nil ~= tbPlot then
|
|
bPlotLock = PlayerData.Char:IsPlotUnlock(tbPlot.nCharId, tbPlot.nPlotId)
|
|
end
|
|
local bHasNewChat = PlayerData.Phone:CheckHasNewChat()
|
|
local callback = function()
|
|
if not bPlotLock then
|
|
EventManager.Hit(EventId.ClosePanel, self._panel._nPanelId)
|
|
PlayerData.Char:EnterCharPlotAvg(tbPlot.nCharId, tbPlot.nPlotId)
|
|
else
|
|
PlayerData.Phone:CheckNewChat(self.nAddressId)
|
|
end
|
|
end
|
|
if bPlotLock and (mapChangeInfo.Props == nil or #mapChangeInfo.Props < 1) then
|
|
self._mapNode.btnMask.gameObject:SetActive(false)
|
|
elseif mapChangeInfo.Props ~= nil and #mapChangeInfo.Props > 0 and self.receiveRewardCb == nil then
|
|
EventManager.Hit("EnableReceiveChatReward", true)
|
|
self._mapNode.goPhone:_SetBtnEnable(false)
|
|
function self.receiveRewardCb()
|
|
self._mapNode.btnMask.gameObject:SetActive(false)
|
|
UTILS.OpenReceiveByChangeInfo(mapChangeInfo, callback)
|
|
if not bHasNewChat then
|
|
EventManager.Hit("RefreshChatRedDot")
|
|
end
|
|
EventManager.Hit("EnableReceiveChatReward", false)
|
|
self._mapNode.goPhone:_SetBtnEnable(true)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return PhoneChatCtrl
|