PGRData/Script/matrix/xui/xuifavorability/XUiPanelFavorabilityAction.lua

210 lines
7.9 KiB
Lua
Raw Normal View History

XUiPanelFavorabilityAction = XClass(nil, "XUiPanelFavorabilityAction")
local CurrentActionSchedule
local loadGridComplete
function XUiPanelFavorabilityAction:Ctor(ui, uiRoot, parent)
self.GameObject = ui.gameObject
self.Transform = ui.transform
self.UiRoot = uiRoot
self.Parent = parent
XTool.InitUiObject(self)
self.GridLikeActionItem.gameObject:SetActiveEx(false)
self.PanelEmpty.gameObject:SetActiveEx(false)
end
function XUiPanelFavorabilityAction:OnSelected(isSelected)
self.GameObject:SetActiveEx(isSelected)
if isSelected then
self.UiRoot.SignBoard:SetClickTrigger(false)
self.UiRoot.SignBoard:SetRoll(false)
self:Refresh()
else
loadGridComplete = false
self.UiRoot.SignBoard:SetClickTrigger(true)
self.UiRoot.SignBoard:SetRoll(true)
end
end
function XUiPanelFavorabilityAction:Refresh()
local currentCharacterId = self.UiRoot:GetCurrFavorabilityCharacter()
local actionDatas = XFavorabilityConfigs.GetCharacterActionById(currentCharacterId)
self:UpdateActionList(actionDatas)
end
function XUiPanelFavorabilityAction:UpdateActionList(actionDatas)
if not actionDatas then
self.PanelEmpty.gameObject:SetActiveEx(true)
self.TxtNoDataTip.text = CS.XTextManager.GetText("FavorabilityNoActionData")
self.ActionList = {}
else
self.PanelEmpty.gameObject:SetActiveEx(false)
self:SortActions(actionDatas)
for k, v in pairs(actionDatas or {}) do
if self.CurrentPlayAction and self.CurrentPlayAction.Id == v.Id then
v.IsPlay = true
self.CurrentPlayAction.Index = k
else
v.IsPlay = false
end
end
self.ActionList = actionDatas
end
if not self.DynamicTableAction then
self.DynamicTableAction = XDynamicTableNormal.New(self.SViewActionList.gameObject)
self.DynamicTableAction:SetProxy(XUiGridLikeActionItem)
self.DynamicTableAction:SetDelegate(self)
end
self.DynamicTableAction:SetDataSource(self.ActionList)
self.DynamicTableAction:ReloadDataASync()
end
function XUiPanelFavorabilityAction:SortActions(actions)
local characterId = self.UiRoot:GetCurrFavorabilityCharacter()
for _, action in pairs(actions) do
local isUnlock = XDataCenter.FavorabilityManager.IsActionUnlock(characterId, action.Id)
local canUnlock = XDataCenter.FavorabilityManager.CanActionUnlock(characterId, action.Id)
action.priority = 2
if not isUnlock then
action.priority = canUnlock and 1 or 3
end
end
table.sort(actions, function(action1, action2)
if action1.priority == action2.priority then
return action1.Id < action2.Id
else
return action1.priority < action2.priority
end
end)
end
function XUiPanelFavorabilityAction:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
grid:Init(self.UiRoot)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
local data = self.ActionList[index]
if data ~= nil then
grid:OnRefresh(self.ActionList[index], index)
end
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
if self.CurrentPlayAction and self.CurrentPlayAction.Id == self.ActionList[index].Id and self.CurrentPlayAction.IsPlay then
--点击相同的动作停止播放动作
self.CurrentPlayAction.IsPlay = false
grid:OnRefresh(self.CurrentPlayAction, index)
--播放打断特效
self:UnScheduleAction(true)
return
end
self:OnActionClick(self.ActionList[index], grid, index)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RELOAD_COMPLETED then
loadGridComplete = true
end
end
function XUiPanelFavorabilityAction:ResetPlayStatus(index)
for k, v in pairs(self.ActionList) do
v.IsPlay = (k == index)
local grid = self.DynamicTableAction:GetGridByIndex(k)
if grid then
grid:OnRefresh(v)
end
end
end
function XUiPanelFavorabilityAction:OnActionClick(clickAction, grid, index)
XDataCenter.FavorabilityManager.SetDontStopCvContent(true)
local characterId = self.UiRoot:GetCurrFavorabilityCharacter()
local isUnlock = XDataCenter.FavorabilityManager.IsActionUnlock(characterId, clickAction.Id)
local canUnlock = XDataCenter.FavorabilityManager.CanActionUnlock(characterId, clickAction.Id)
if isUnlock or canUnlock then
if canUnlock and not isUnlock then
XDataCenter.FavorabilityManager.OnUnlockCharacterAction(characterId, clickAction.Id)
grid:HideRedDot()
XEventManager.DispatchEvent(XEventId.EVENT_FAVORABILITY_ACTIONUNLOCK)
end
--停止正在播放的动作,准备播放新动作
self:UnScheduleAction(true)
self:ResetPlayStatus(index)
self.UiRoot.SignBoard:ForcePlay(clickAction.SignBoardActionId, self.Parent.CvType, true)
self.CurrentPlayAction = clickAction
self.CurrentPlayAction.Index = index
local isFinish = false
local progress = 0
local updateCount = 0
local startTime = self.UiRoot.SignBoard.SignBoardPlayer.PlayerData.PlayingElement.StartTime
local duration = self.UiRoot.SignBoard.SignBoardPlayer.PlayerData.PlayingElement.Duration
CurrentActionSchedule = XScheduleManager.ScheduleForever(function()
local clickGrid
if loadGridComplete then
--根据index找到点击的数据所在的Grid
clickGrid = self.DynamicTableAction:GetGridByIndex(self.CurrentPlayAction.Index)
end
if clickGrid == nil then
--不存在点击数据的grid(列表滑动不显示这个数据的Grid)使用点击时的Grid来代替
clickGrid = grid
end
if not clickGrid then
XLog.Error("XUiPanelFavorabilityAction:OnActionClick函数错误clickGrid不能为空")
return
end
if self.CurrentPlayAction then
local time = self.UiRoot.SignBoard.SignBoardPlayer.Time
progress = (time - startTime) / duration
if progress >= 1 or self.UiRoot.SignBoard.SignBoardPlayer.PlayerData.PlayingElement == nil then
progress = 1
isFinish = true
end
--判断当前grid存放的数据是不是正在播放的数据
if clickGrid:GetActionDataId() == clickAction.Id then
clickGrid:UpdateProgress(progress)
clickGrid:UpdateActionAlpha(updateCount)
end
updateCount = updateCount + 1
end
if not self.CurrentPlayAction or isFinish then
clickAction.IsPlay = false
if clickGrid:GetActionDataId() == clickAction.Id then
clickGrid:UpdatePlayStatus()
clickGrid:UpdateProgress(0)
end
--自然结束动作,不播放打断特效
self:UnScheduleAction(false)
end
end, 20)
else
XUiManager.TipMsg(clickAction.ConditionDescript)
end
end
function XUiPanelFavorabilityAction:UnScheduleAction(playEffect)
self.UiRoot:SetWhetherPlayChangeActionEffect(playEffect)
if CurrentActionSchedule then
XScheduleManager.UnSchedule(CurrentActionSchedule)
CurrentActionSchedule = nil
end
self.UiRoot.SignBoard:Stop()
self.CurrentPlayAction = nil
self.UiRoot:ResumeCvContent()
end
function XUiPanelFavorabilityAction:SetViewActive(isActive)
self.GameObject:SetActiveEx(isActive)
self:UnScheduleAction()
if isActive then
self:Refresh()
end
end
function XUiPanelFavorabilityAction:OnClose()
self:UnScheduleAction()
end