PGRData/Script/matrix/xui/xuirift/XUiRiftChoosePlugin.lua
2024-09-01 22:49:41 +02:00

464 lines
No EOL
18 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--大秘境角色插件选择
local XUiRiftChoosePlugin = XLuaUiManager.Register(XLuaUi, "UiRiftChoosePlugin")
local XUiRiftPluginAdditonGrid = require("XUi/XUiRift/Grid/XUiRiftPluginAdditonGrid")
local XUiRiftPluginEffectiveGrid = require("XUi/XUiRift/Grid/XUiRiftPluginEffectiveGrid")
local XUiRiftPluginGrid = require("XUi/XUiRift/Grid/XUiRiftPluginGrid")
local IsEffectTrigger = nil
local ToggleSelectKey = "ToggleSelectKey"
local DynamicTableType = -- 用来判断刷新时动态列表是哪个类型的
{
Addition = 1,
Effective = 2,
Bag = 3,
}
function XUiRiftChoosePlugin:OnAwake()
self.CurrAddEffSeleIndex = nil -- 当前右边列表点击选中的插件index
self.AttrGameObjDic = {}
self.StarSelectList = {true, true, true, true, true, true}
self:InitButton()
self:InitToggleList()
self:InitDynamicTable()
self:InitTimes()
end
function XUiRiftChoosePlugin:InitButton()
XUiHelper.RegisterClickEvent(self, self.BtnBack, self.Close)
XUiHelper.RegisterClickEvent(self, self.BtnMainUi, function() XLuaUiManager.RunMain() end)
self:BindHelpBtn(self.BtnHelp, "RiftPluginHelp")
XUiHelper.RegisterClickEvent(self, self.BtnTeamAttribute, self.OnBtnTeamAttributeClick)
XUiHelper.RegisterClickEvent(self, self.BtnUnwear, self.OnBtnUnwearClick)
XUiHelper.RegisterClickEvent(self, self.BtnConfirm, self.Close)
XUiHelper.RegisterClickEvent(self, self.BtnClosePopup, function() self.PanelPlugin.gameObject:SetActiveEx(false) end)
XUiHelper.RegisterClickEvent(self, self.PanelPluginScrollList, function() self.PanelPlugin.gameObject:SetActiveEx(false) end)
XUiHelper.RegisterClickEvent(self, self.PanelEffectiveList, function() self.PanelPlugin.gameObject:SetActiveEx(false) end)
XUiHelper.RegisterClickEvent(self, self.PanelAdditionList, function() self.PanelPlugin.gameObject:SetActiveEx(false) end)
-- 右边的单选按钮
local tabBtns = { self.BtnEffective, self.BtnAddition }
self.PanelTabBtns:Init(tabBtns, function(index) self:OnselectPluginAE(index) end)
-- 左边的筛选框
XUiHelper.RegisterClickEvent(self, self.TogCurrRole, self.RefreshDynamicTableBag)
XUiHelper.RegisterClickEvent(self, self.TogStar3, self.OnTogStar3Click)
XUiHelper.RegisterClickEvent(self, self.TogStar4, self.OnTogStar4Click)
XUiHelper.RegisterClickEvent(self, self.TogStar5, self.OnTogStar5Click)
XUiHelper.RegisterClickEvent(self, self.TogStar6, self.OnTogStar6Click)
end
function XUiRiftChoosePlugin:InitToggleList()
self.StarSelectList = {true, true, true, true, true, true}
for index, isSelect in ipairs(self.StarSelectList) do
local tog = self["TogStar" .. index]
if tog then
local state = isSelect and CS.UiButtonState.Select or CS.UiButtonState.Normal
tog:SetButtonState(state)
end
end
self.BtnIsShowPlugin:SetButtonState(CS.UiButtonState.Select)
-- 缓存的toggle信息
local isShow = XSaveTool.GetData(ToggleSelectKey)
if isShow then
self.TogCurrRole:SetButtonState(CS.UiButtonState.Select)
else
self.TogCurrRole:SetButtonState(CS.UiButtonState.Normal)
end
end
function XUiRiftChoosePlugin:OnTogStar3Click()
local isOn = self.TogStar3:GetToggleState()
self.StarSelectList[1] = isOn
self.StarSelectList[2] = isOn
self.StarSelectList[3] = isOn
self:RefreshDynamicTableBag()
end
function XUiRiftChoosePlugin:OnTogStar4Click()
local isOn = self.TogStar4:GetToggleState()
self.StarSelectList[4] = isOn
self:RefreshDynamicTableBag()
end
function XUiRiftChoosePlugin:OnTogStar5Click()
local isOn = self.TogStar5:GetToggleState()
self.StarSelectList[5] = isOn
self:RefreshDynamicTableBag()
end
function XUiRiftChoosePlugin:OnTogStar6Click()
local isOn = self.TogStar6:GetToggleState()
self.StarSelectList[6] = isOn
self:RefreshDynamicTableBag()
end
function XUiRiftChoosePlugin:OnselectPluginAE(index)
self.Transform:Find("Animation/QieHuan"):PlayTimelineAnimation()
if index == DynamicTableType.Addition then
self.PanelAdditionList.gameObject:SetActiveEx(true)
self.PanelEffectiveList.gameObject:SetActiveEx(false)
elseif index == DynamicTableType.Effective then
self.PanelAdditionList.gameObject:SetActiveEx(false)
self.PanelEffectiveList.gameObject:SetActiveEx(true)
end
self:RefeshDynamicTableByClickAddOrEff()
end
-- 初始化三个动态列表
function XUiRiftChoosePlugin:InitDynamicTable()
-- 已装备插件效果列表
self.DynamicTableAddition = XDynamicTableNormal.New(self.PanelAdditionList)
self.DynamicTableAddition:SetProxy(XUiRiftPluginAdditonGrid)
self.DynamicTableAddition:SetDelegate(self)
self.DynamicTableAddition:SetDynamicEventDelegate(function (event, index, grid)
self:OnDynamicTableEvent(event, index, grid, DynamicTableType.Addition)
end)
-- 已装备插件描述列表
self.DynamicTableEffective = XDynamicTableNormal.New(self.PanelEffectiveList)
self.DynamicTableEffective:SetProxy(XUiRiftPluginEffectiveGrid)
self.DynamicTableEffective:SetDelegate(self)
self.DynamicTableEffective:SetDynamicEventDelegate(function (event, index, grid)
self:OnDynamicTableEvent(event, index, grid, DynamicTableType.Effective)
end)
-- 已拥有插件列表背包
self.DynamicTableBag = XDynamicTableNormal.New(self.PanelPluginScrollList)
self.DynamicTableBag:SetProxy(XUiRiftPluginGrid)
self.DynamicTableBag:SetDelegate(self)
self.DynamicTableBag:SetDynamicEventDelegate(function (event, index, grid)
self:OnDynamicTableEvent(event, index, grid, DynamicTableType.Bag)
end)
end
function XUiRiftChoosePlugin:OnStart(xRole)
self.XRole = xRole
end
function XUiRiftChoosePlugin:OnEnable()
self.Super.OnEnable(self)
self:RefreshDynamicTableAddition()
self:RefreshDynamicTableEffective()
self:RefreshDynamicTableBag()
self:RefreshUiShow()
self.PanelTabBtns:SelectIndex(DynamicTableType.Effective)
end
function XUiRiftChoosePlugin:RefreshUiShow()
-- 负载信息
self.TxtLoadNum.text = CS.XTextManager.GetText("RiftPluginLoad", self.XRole:GetCurrentLoad(), XDataCenter.RiftManager.GetMaxLoad())
self.ImgLoadProgress.fillAmount = self.XRole:GetCurrentLoad() / XDataCenter.RiftManager.GetMaxLoad()
-- 加点信息
local defaultTemp = XDataCenter.RiftManager.GetAttrTemplate()
local allAttr = XRiftConfig.GetAllConfigs(XRiftConfig.TableKey.RiftTeamAttribute)
for i, cfg in pairs(allAttr) do
local go = self.AttrGameObjDic[i]
if not go then
go = CS.UnityEngine.Object.Instantiate(self.PanelAttribute, self.PanelAttribute.parent)
end
local v = defaultTemp:GetAttrLevel(i)
go.transform:Find("TxtAttributeName"):GetComponent("Text").text = cfg.Name
go.transform:Find("TxtAttributeLevel"):GetComponent("Text").text = v
end
self.PanelAttribute.gameObject:SetActiveEx(false)
self.BtnTeamAttribute:SetNameByGroup(0, defaultTemp:GetAllLevel())
local isUnlock = XDataCenter.RiftManager.IsFuncUnlock(XRiftConfig.FuncUnlockId.Attribute)
self.BtnTeamAttribute.transform.parent.gameObject:SetActiveEx(isUnlock)
end
function XUiRiftChoosePlugin:RefreshPluginTipDetail(xPlugin)
-- 插件详情弹窗
if self.TipsPluginGrid == nil then
self.TipsPluginGrid = XUiRiftPluginGrid.New(self.GridRiftPluginTips:GetObject("GridRiftPlugin"))
end
self.TipsPluginGrid:Refresh(xPlugin)
self.GridRiftPluginTips:GetObject("TxtPluginName").text = xPlugin:GetName()
self.GridRiftPluginTips:GetObject("TxtCoreExplain").text = xPlugin:GetDesc()
-- 补正属性
local fixTypeList = xPlugin:GetAttrFixTypeList()
for i = 1, XRiftConfig.PluginMaxFixCnt do
local isShow = #fixTypeList >= i
self.GridRiftPluginTips:GetObject("PanelAddition" .. i).gameObject:SetActiveEx(isShow)
if isShow then
self.GridRiftPluginTips:GetObject("TxtAddition" .. i).text = fixTypeList[i]
end
end
-- 补正效果
local attrFixList = xPlugin:GetEffectStringList()
for i = 1, XRiftConfig.PluginMaxFixCnt do
local isShow = #attrFixList >= i
self.GridRiftPluginTips:GetObject("PanelEntry" .. i).gameObject:SetActiveEx(isShow)
if isShow then
local attrFix = attrFixList[i]
self.GridRiftPluginTips:GetObject("TxtEntry" .. i).text = attrFix.Name
self.GridRiftPluginTips:GetObject("TxtEntryNum" .. i).text = attrFix.ValueString
end
end
-- 效果描述
self.GridRiftPluginTips:GetObject("TxtPluginExplain").text = xPlugin:GetDesc()
end
function XUiRiftChoosePlugin:RefreshDynamicTableAddition(index)
self.RolePlugins = self.XRole:GetPlugIns()
local isEmpty = XTool.IsTableEmpty(self.RolePlugins)
self.PanelNoPlugin1.gameObject:SetActiveEx(isEmpty)
self.PanelNoPlugin2.gameObject:SetActiveEx(isEmpty)
self.DynamicTableAddition:SetDataSource(self.RolePlugins)
self.DynamicTableAddition:ReloadDataSync(index or 1)
end
function XUiRiftChoosePlugin:RefreshDynamicTableEffective(index)
self.RolePlugins = self.XRole:GetPlugIns()
self.DynamicTableEffective:SetDataSource(self.RolePlugins)
self.DynamicTableEffective:ReloadDataSync(index or 1)
end
function XUiRiftChoosePlugin:RefreshDynamicTableBag()
self.BagPluginList = XDataCenter.RiftManager.GetOwnPluginList(self.StarSelectList)
local isFilter = self.TogCurrRole:GetToggleState()
if isFilter then
local filterRes = {}
for k, xPlugin in ipairs(self.BagPluginList) do
if not xPlugin:CheckCharacterWearLimit(self.XRole:GetCharacterId()) then
table.insert(filterRes, xPlugin)
end
end
self.BagPluginList = filterRes
end
self.PanelNoPluginBag.gameObject:SetActiveEx(XTool.IsTableEmpty(self.BagPluginList))
self.DynamicTableBag:SetDataSource(self.BagPluginList)
self.DynamicTableBag:ReloadDataSync(1)
end
function XUiRiftChoosePlugin:AutoPosIndexInBagListByRightGrid(additonGrid)
local index = 1
for k, xPlugin in pairs(self.BagPluginList) do
if xPlugin == additonGrid.XPlugin then
index = k
IsEffectTrigger = additonGrid.XPlugin
break
end
end
self.DynamicTableBag:SetDataSource(self.BagPluginList)
self.DynamicTableBag:ReloadDataSync(index)
end
function XUiRiftChoosePlugin:OnDynamicTableEvent(event, index, grid, dynamicTableType)
if dynamicTableType == DynamicTableType.Addition then
-- Addition
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
grid:Refresh(self.RolePlugins[index])
local isSelect = self.CurrAddEffSeleIndex == index
if isSelect then
self.CurAddGrid = grid
grid.Btn:SetButtonState(CS.UiButtonState.Select)
else
grid.Btn:SetButtonState(CS.UiButtonState.Normal)
end
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
if self.CurAddGrid then
self.CurAddGrid.Btn:SetButtonState(CS.UiButtonState.Normal)
end
grid.Btn:SetButtonState(CS.UiButtonState.Select)
self.CurrAddEffSeleIndex = index
self.CurAddGrid = grid
self:AutoPosIndexInBagListByRightGrid(grid)
end
elseif dynamicTableType == DynamicTableType.Effective then
-- Effective
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
grid:Refresh(self.RolePlugins[index])
local isSelect = self.CurrAddEffSeleIndex == index
if isSelect then
grid.Btn:SetButtonState(CS.UiButtonState.Select)
self.CurEffGrid = grid
else
grid.Btn:SetButtonState(CS.UiButtonState.Normal)
end
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
if self.CurEffGrid then
self.CurEffGrid.Btn:SetButtonState(CS.UiButtonState.Normal)
end
grid.Btn:SetButtonState(CS.UiButtonState.Select)
self.CurrAddEffSeleIndex = index
self.CurEffGrid = grid
self:AutoPosIndexInBagListByRightGrid(grid)
end
elseif dynamicTableType == DynamicTableType.Bag then
-- Bag
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
local xPlugin = self.BagPluginList[index]
local isWear = self.XRole:CheckHasPlugin(xPlugin:GetId())
grid:Refresh(xPlugin)
local isEffect = self:CheckEffectTrigger(xPlugin)
grid.Effct.gameObject:SetActiveEx(false)
if isEffect then
grid.Effct.gameObject:SetActiveEx(true)
end
grid:SetIsWear(isWear)
-- 有负载或类型限制则ban
local isBan = (self.XRole:CheckLoadLimitAddPlugin(xPlugin:GetId()) or xPlugin:CheckCurPluginTypeLimit(self.XRole)) and not isWear
grid:SetBan(isBan)
grid:Init(function ()
self:OnBagPluginClick(grid)
end)
end
end
end
-- 装备插件后的背包刷新(只刷新格子状态 不刷新位置)
function XUiRiftChoosePlugin:RefeshDynamicTableByWear()
for k, grid in pairs(self.DynamicTableBag:GetGrids()) do
local xPlugin = grid.XPlugin
local isWear = self.XRole:CheckHasPlugin(xPlugin:GetId())
grid:Refresh(xPlugin)
grid:SetIsWear(isWear)
-- 有负载或类型限制则ban
local isBan = (self.XRole:CheckLoadLimitAddPlugin(xPlugin:GetId()) or xPlugin:CheckCurPluginTypeLimit(self.XRole)) and not isWear
grid:SetBan(isBan)
end
end
-- 点击右边动态列表的刷新
function XUiRiftChoosePlugin:RefeshDynamicTableByClickAddOrEff()
for index, grid in pairs(self.DynamicTableAddition:GetGrids()) do
local xPlugin = self.RolePlugins[index]
if xPlugin then
grid:Refresh(xPlugin)
local isSelect = self.CurrAddEffSeleIndex == index
if isSelect then
self.CurAddGrid = grid
grid.Btn:SetButtonState(CS.UiButtonState.Select)
else
grid.Btn:SetButtonState(CS.UiButtonState.Normal)
end
end
end
for index, grid in pairs(self.DynamicTableEffective:GetGrids()) do
local xPlugin = self.RolePlugins[index]
if xPlugin then
grid:Refresh(self.RolePlugins[index])
local isSelect = self.CurrAddEffSeleIndex == index
if isSelect then
self.CurEffGrid = grid
grid.Btn:SetButtonState(CS.UiButtonState.Select)
else
grid.Btn:SetButtonState(CS.UiButtonState.Normal)
end
end
end
end
function XUiRiftChoosePlugin:OnBagPluginClick(gridPlugin)
local xPlugin = gridPlugin.XPlugin
-- 弹出详情
if self.BtnIsShowPlugin:GetToggleState() then
self:RefreshPluginTipDetail(xPlugin)
self.PanelPlugin.gameObject:SetActiveEx(true)
end
local pluginId = xPlugin:GetId()
local pluginList = self.XRole:GetPlugInIdList()
local res, index = table.contains(pluginList, pluginId)
local afterChangePluginList = XTool.Clone(pluginList)
-- 没有插件就装备,有就卸下
if res then
-- 卸下插件
table.remove(afterChangePluginList, index)
if index == self.CurrAddEffSeleIndex then
self.CurrAddEffSeleIndex = nil -- 删除了选中状态的插件 要移除选中格子
end
else
-- 装备上插件
-- 插件角色限制检测
if xPlugin:CheckCharacterWearLimit(self.XRole:GetCharacterId()) then
XUiManager.TipError(CS.XTextManager.GetText("RiftPluginCharLimit"))
return
end
-- 插件负载上限检测
if self.XRole:CheckLoadLimitAddPlugin(pluginId) then
XUiManager.TipError(CS.XTextManager.GetText("RiftPluginLoadNoneLeft"))
return
end
-- 插件类型穿戴限制检测
if xPlugin:CheckCurPluginTypeLimit(self.XRole) then
XUiManager.TipError(CS.XTextManager.GetText("RiftPluginTypeLimit"))
return
end
-- 装备上插件
table.insert(afterChangePluginList, pluginId)
end
XDataCenter.RiftManager.RiftSetCharacterPluginsRequest(self.XRole, afterChangePluginList, function ()
gridPlugin:SetIsWear(not res)
self:RefreshDynamicTableAddition(index or #afterChangePluginList) -- 右边的动态列表为了保持刷新后不变位置,重新定位到装备前的位置
self:RefreshDynamicTableEffective(index or #afterChangePluginList)
self:RefeshDynamicTableByWear()
self:RefreshUiShow()
end)
end
function XUiRiftChoosePlugin:OnBtnTeamAttributeClick()
local isUnlock = XDataCenter.RiftManager.IsFuncUnlock(XRiftConfig.FuncUnlockId.Attribute)
if isUnlock then
XLuaUiManager.Open("UiRiftAttribute")
end
end
-- 卸下指定插件
function XUiRiftChoosePlugin:OnBtnUnwearClick()
local pluginList = self.XRole:GetPlugInIdList()
if XTool.IsTableEmpty(pluginList) then
return
end
if not self.CurrAddEffSeleIndex or self.CurrAddEffSeleIndex > #pluginList then
return
end
local afterChangePluginList = XTool.Clone(pluginList)
table.remove(afterChangePluginList, self.CurrAddEffSeleIndex)
XDataCenter.RiftManager.RiftSetCharacterPluginsRequest(self.XRole, afterChangePluginList, function ()
local refreshIndex = self.CurrAddEffSeleIndex > #afterChangePluginList and #afterChangePluginList or self.CurrAddEffSeleIndex
self:RefreshDynamicTableAddition(refreshIndex)
self:RefreshDynamicTableEffective(refreshIndex)
self:RefeshDynamicTableByWear()
self:RefreshUiShow()
end)
end
function XUiRiftChoosePlugin:OnDestroy()
XSaveTool.SaveData(ToggleSelectKey, self.TogCurrRole:GetToggleState())
end
function XUiRiftChoosePlugin:InitTimes()
self:SetAutoCloseInfo(XDataCenter.RiftManager.GetActivityEndTime(), function(isClose)
if isClose then
XLuaUiManager.RunMain()
XUiManager.TipMsg(XUiHelper.GetText("ActivityAlreadyOver"))
end
end)
end
function XUiRiftChoosePlugin:CheckEffectTrigger(targetPlayEffectPlugin)
if IsEffectTrigger == targetPlayEffectPlugin then
IsEffectTrigger = false
return true
end
end
return XUiRiftChoosePlugin