PGRData/Script/matrix/xui/xuipartner/partnerpreset/XUiPartnerPreset.lua

596 lines
No EOL
20 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 TEAM_MEMBER_ORDER = {2, 1, 3} --队伍顺序(蓝,红,黄)
local DEFAULT_SELECT_INDEX = 1 --默认选中辅助机
--==============================
---@desc 辅助机预设--辅助机格子
---@ui 对应的ui
---@return nil{type}
--==============================
local XUiGridPartner = XClass(nil, "XUiGridPartner")
function XUiGridPartner:Ctor(ui)
XTool.InitUiObjectByUi(self, ui)
self:InitUi()
end
function XUiGridPartner:InitUi()
--使用动态列表的点击
self.BtnClick.gameObject:SetActiveEx(false)
end
--==============================
---@desc 刷新显示
---@partner @class XPartner
--==============================
function XUiGridPartner:Refresh(partner, carriedDict, idx)
if not partner then
return
end
self.RImgHeadIcon:SetRawImage(partner:GetIcon())
self.RImgQuality:SetRawImage(XCharacterConfigs.GetCharacterQualityIcon(partner:GetQuality()))
self.PanelLv:GetObject("TxtLevel").text = partner:GetLevel()
self.ImgLock.gameObject:SetActiveEx(partner:GetIsLock())
self.ImgBreak:SetSprite(partner:GetBreakthroughIcon())
if idx <= #TEAM_MEMBER_ORDER then
local id = partner:GetId()
local pos = carriedDict[id]
self.ImgIsYellow.gameObject:SetActiveEx(pos == TEAM_MEMBER_ORDER[3])
self.ImgIsBlue.gameObject:SetActiveEx(pos == TEAM_MEMBER_ORDER[1])
self.ImgIsRed.gameObject:SetActiveEx(pos == TEAM_MEMBER_ORDER[2])
end
end
function XUiGridPartner:SetSelect(isSelect)
self.PanelSelected.gameObject:SetActiveEx(isSelect)
end
--=========================================类分界线=========================================--
--==============================
---@desc 辅助机预设--队伍角色列表
---@ui 对应的ui
---@index 对应的位置
--==============================
local XUiGridRoleTeam = XClass(nil, "XUiGridRoleTeam")
function XUiGridRoleTeam:Ctor(ui, index, selectCb)
XTool.InitUiObjectByUi(self, ui)
self.Index = index
self.BtnClick.CallBack = function()
if not XTool.IsNumberValid(self.RoleId) then
XUiManager.TipText("PartnerTeamPrefabNotCharacter")
return
end
if selectCb then
selectCb(index)
end
end
end
--==============================
---@desc 刷新显示
---@roleId 角色id
---@partnerId 宠物id, 非TemplateId
--==============================
function XUiGridRoleTeam:Refresh(roleId, partnerId)
self.RoleId = roleId
self.PartnerId = partnerId
local hasRole = XTool.IsNumberValid(roleId)
local color = XDataCenter.TeamManager.GetTeamMemberColor(self.Index)
self.ImgLeftSkill.color = color
self.ImgRightSkill.color = color
self.PanelNull.gameObject:SetActiveEx(not hasRole)
self.PanelHave.gameObject:SetActiveEx(hasRole)
self.RImgPartnerIcon.gameObject:SetActiveEx(hasRole)
self.PanelPartnerNone.gameObject:SetActiveEx(not hasRole)
if hasRole then
self:SetHave(roleId)
end
end
function XUiGridRoleTeam:SetHave(roleId)
if not roleId then
self.ImgIcon.gameObject:SetActiveEx(false)
return
end
self.ImgIcon.gameObject:SetActiveEx(true)
local character = XDataCenter.CharacterManager.GetCharacter(roleId)
if not character then return end
self.ImgIcon:SetRawImage(XDataCenter.CharacterManager.GetCharBigHeadIcon(roleId))
self.ImgQuality:SetSprite(XCharacterConfigs.GetCharacterQualityIcon(character.Quality))
local hasPartner = XTool.IsNumberValid(self.PartnerId)
self.RImgPartnerIcon.gameObject:SetActiveEx(hasPartner)
self.PanelPartnerNone.gameObject:SetActiveEx(not hasPartner)
if hasPartner then
local partner = XDataCenter.PartnerManager.GetPartnerEntityById(self.PartnerId)
self.RImgPartnerIcon:SetRawImage(partner:GetIcon())
end
end
function XUiGridRoleTeam:SetSelect(isSelect)
self.ImgSelect.gameObject:SetActiveEx(isSelect)
if isSelect then
self.ImgSelect.color = XDataCenter.TeamManager.GetTeamMemberColor(self.Index)
end
end
--=========================================类分界线=========================================--
--==============================
---@desc 辅助机预设
---@teamData 预设队伍数据
--==============================
local XUiPartnerPreset = XLuaUiManager.Register(XLuaUi, "UiPartnerPreset")
local XUiGridPresetSkill = require("XUi/XUiPartner/PartnerPreset/UiPartnerSkill/XUiGridPresetSkill")
function XUiPartnerPreset:OnAwake()
self:InitUi()
self:InitCb()
end
function XUiPartnerPreset:OnStart(teamData, pos)
self.TeamData = teamData
self.RoleList = teamData.TeamData
self.TeamId = teamData.TeamId
--@class XPartnerPrefab
self.PartnerPrefab = XDataCenter.TeamManager.GetPartnerPrefab(self.TeamId)
--刷新当前辅助机技能到缓存中
self.PartnerPrefab:InitSkillCache(teamData)
self.RoleGridList = {}
self.ActiveSkillGrids = {}
self.PassiveSkillGrids = {}
--队伍名
self.TxtName.text = teamData.TeamName
--角色列表刷新
self:RefreshRoleList()
--辅助剂列表刷新
self:RefreshPartnerList()
--默认选中角色
local index = pos > 0 and pos or 1
self:OnSelectRole(index)
end
function XUiPartnerPreset:OnEnable()
XEventManager.AddEventListener(XEventId.EVENT_PARTNER_PRESET_SKILL_CHANGE, self.OnSkillChange, self)
end
function XUiPartnerPreset:OnDisable()
XDataCenter.PartnerManager.ClearAllPresetSkillCache()
XEventManager.RemoveEventListener(XEventId.EVENT_PARTNER_PRESET_SKILL_CHANGE, self.OnSkillChange, self)
end
--region 回调
--==============================
---@desc 选择角色回调
---@index 位置
--==============================
function XUiPartnerPreset:OnSelectRole(index)
if index == self.SelectRoleIndex then return end
--人物切换之前判断
self:CheckIsClearSkillCache()
self.SelectRoleIndex = index
for i, grid in ipairs(self.RoleGridList) do
grid:SetSelect(i == index)
end
local partner = self.PartnerList[self.SelectPartnerIndex]
self:CheckIsUpdateSkillData(partner, function()
self:RefreshProperty(partner)
end)
end
--==============================
---@desc 选择辅助机回调
---@idx 辅助机下标
--==============================
function XUiPartnerPreset:OnClickPartner(idx)
if idx == self.SelectPartnerIndex then return end
--辅助机切换之前判断
self:CheckIsClearSkillCache()
self.SelectPartnerIndex = idx
local grids = self.DynamicTable:GetGrids()
for i, grid in ipairs(grids) do
grid:SetSelect(i == idx)
end
local partner = self.PartnerList[idx]
self:PlayAnimation("RightQieHuan", nil, function()
self:RefreshProperty(partner)
end)
end
function XUiPartnerPreset:OnDynamicTableEvent(evt, idx, grid)
if evt == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
grid:Refresh(self.PartnerList[idx], self.CarriedDict, idx)
elseif evt == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
self:OnClickPartner(idx)
elseif evt == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RELOAD_COMPLETED then
--默认选中辅助机
local hasPartner = self:CheckHasPartner()
local targetIndex
if hasPartner then
targetIndex = self:GetEquipPartnerIndexBySelectRole()
else
targetIndex = self:GetFirstNoEquipIndex()
end
self:OnClickPartner(targetIndex)
end
end
--==============================
---@desc 检测是否需要清除技能缓存
--==============================
function XUiPartnerPreset:CheckIsClearSkillCache()
if not XTool.IsNumberValid(self.SelectPartnerIndex) then
return
end
local lastPartner = self.PartnerList[self.SelectPartnerIndex]
local partnerId = lastPartner:GetId()
local changeSkill = self.PartnerPrefab:IsSkillChangeWithPrefab2Cache(partnerId)
if changeSkill then
XDataCenter.PartnerManager.ClearPresetSkillCache(partnerId)
local msg = XUiHelper.GetText("PartnerTeamPrefabSkillNotSaveTips", lastPartner:GetName())
XUiManager.TipMsg(msg)
local isCarried = XTool.IsNumberValid(self.CarriedDict[partnerId])
if isCarried then
local pos = self.PartnerPrefab:GetPosByPartnerId(partnerId)
self.PartnerPrefab:UpdateSkillData(pos, partnerId)
end
end
end
--==============================
---@desc 检测是否需要更新技能数据到辅助机预设中
---@partner @class XPartner
---@cancelCb 不更新回调
--==============================
function XUiPartnerPreset:CheckIsUpdateSkillData(partner, cancelCb)
if not partner then
return
end
local id = partner:GetId()
local isCarried = XTool.IsNumberValid(self.CarriedDict[id])
local isCorresponding = self:GetEquipPartnerIndexBySelectRole() == self.SelectPartnerIndex
local changeSkill = self.PartnerPrefab:IsSkillChangeWithPrefab2Cache(id)
if changeSkill and isCarried and isCorresponding then
local beginCb = function()
self.PartnerPrefab:UpdateSkillData(self.SelectRoleIndex, id)
local skillData = self.PartnerPrefab:GetSkillData(id)
XDataCenter.PartnerManager.TeamPreSetPartnerRequest(self.TeamId, self.SelectRoleIndex, id, skillData, function()
self:RefreshProperty(partner)
XEventManager.DispatchEvent(XEventId.EVENT_TEAM_PREFAB_CHANGE, self.TeamId, self.TeamData)
end)
end
self:OpenPopupTip(XUiHelper.GetText("PartnerTeamPrefabSkillSaveTips"), beginCb)
else
if cancelCb then cancelCb() end
end
end
--==============================
---@desc 修改技能回调
---@partner @class partner
--==============================
function XUiPartnerPreset:OnSkillChange(partner)
if not partner then
return
end
self:CheckIsUpdateSkillData(partner, function()
self:RefreshProperty(partner)
end)
end
--携带
function XUiPartnerPreset:OnBtnTakeOnClick()
self:OpenPopupTip(XUiHelper.GetText("PartnerTeamPrefabEquipTips"), function()
self:Equip()
end)
end
--卸下
function XUiPartnerPreset:OnBtnTakeOffClick()
self:OpenPopupTip(XUiHelper.GetText("PartnerTeamPrefabUnloadTips"), function()
self:Unload()
end)
end
--更换
function XUiPartnerPreset:OnBtnTakeChangeClick()
self:OpenPopupTip(XUiHelper.GetText("PartnerTeamPrefabExchangeTips"), function()
self:Equip()
end)
end
--endregion
--region 初始化
function XUiPartnerPreset:InitUi()
self.DynamicTable = XDynamicTableNormal.New(self.PanelPartnerScroll)
self.DynamicTable:SetProxy(XUiGridPartner)
self.DynamicTable:SetDelegate(self)
self.GridPartner.gameObject:SetActiveEx(false)
self.GridSkill.gameObject:SetActiveEx(false)
end
function XUiPartnerPreset:InitCb()
self:BindHelpBtn(self.BtnHelp, "PartnerPrefabHelp")
self.BtnBack.CallBack = function()
self:CheckIsClearSkillCache()
self:Close()
end
self.BtnMainUi.CallBack = function()
self:CheckIsClearSkillCache()
XLuaUiManager.RunMain()
end
self.BtnTakeOn.CallBack = function()
self:OnBtnTakeOnClick()
end
self.BtnTakeChange.CallBack = function()
self:OnBtnTakeChangeClick()
end
self.BtnTakeOff.CallBack = function()
self:OnBtnTakeOffClick()
end
end
--==============================
---@desc 刷新角色列表
--==============================
function XUiPartnerPreset:RefreshRoleList()
for i, order in ipairs(TEAM_MEMBER_ORDER) do
local grid = self.RoleGridList[order]
local roleId = self.RoleList[order]
local partnerId = self.PartnerPrefab:GetPartnerIdByPos(order)
if not grid then
local ui = i == 1 and self.GridTeamRole or CS.UnityEngine.Object.Instantiate(self.GridTeamRole, self.PanelTeam, false)
ui.gameObject.name = string.format("GridTeamRole%d", order)
grid = XUiGridRoleTeam.New(ui, order, handler(self, self.OnSelectRole))
self.RoleGridList[order] = grid
end
grid:Refresh(roleId, partnerId)
end
end
--==============================
---@desc 刷新辅助剂列表
--==============================
function XUiPartnerPreset:RefreshPartnerList()
self.DynamicTable:Clear()
self.PartnerList = XDataCenter.PartnerManager.GetPartnerOverviewDataList()
self.CarriedDict = self.PartnerPrefab:GetCarriedDict()
XPartnerSort.PresetSort(self.PartnerList, self.CarriedDict)
self.DynamicTable:SetDataSource(self.PartnerList)
self.DynamicTable:ReloadDataASync(1)
self:PlayAnimation("LeftQieHuan")
end
--==============================
---@desc 刷新辅助机属性
---@partner 辅助机实体 @class XPartner
--==============================
function XUiPartnerPreset:RefreshProperty(partner)
if not partner then
return
end
local partnerId = partner:GetId()
self.RImgPartnerIcon:SetRawImage(partner:GetIcon())
self.RawImageQuality:SetRawImage(XCharacterConfigs.GetCharacterQualityIcon(partner:GetQuality()))
self.TxtPartnerName.text = partner:GetName()
self.TxtPartnerLevel.text = partner:GetLevel()
self.TxtSelectAbil.text = partner:GetAbility()
--region 刷新按钮状态
--当前角色是否携带辅助机
local hasPartner = self:CheckHasPartner()
self.BtnTakeOn.gameObject:SetActiveEx(not hasPartner)
--角色位置与辅助机一一对应
local isCorresponding = self:GetEquipPartnerIndexBySelectRole() == self.SelectPartnerIndex
self.BtnTakeOff.gameObject:SetActiveEx(hasPartner and isCorresponding)
self.BtnTakeChange.gameObject:SetActiveEx(hasPartner and not isCorresponding)
--endregion
--region 刷新技能列表
--携带的主动技能
local activeSkills = XDataCenter.PartnerManager.GetPresetSkillList(partnerId, XPartnerConfigs.SkillType.MainSkill)
--携带的被动技能
local passiveSkills = XDataCenter.PartnerManager.GetPresetSkillList(partnerId, XPartnerConfigs.SkillType.PassiveSkill)
local skillCount = partner:GetQualitySkillColumnCount()
for idx = 1, XPartnerConfigs.MainSkillCount do
local grid = self.ActiveSkillGrids[idx]
if not grid then
local ui = CS.UnityEngine.Object.Instantiate(self.GridSkill, self.PanelSkills, false)
ui.gameObject:SetActiveEx(true)
grid = XUiGridPresetSkill.New(ui)
grid.GameObject.name = string.format("ActiveSkill%d", idx)
self.ActiveSkillGrids[idx] = grid
end
grid:Refresh(activeSkills[idx], partner, false, XPartnerConfigs.SkillType.MainSkill, idx + 1, self.PartnerPrefab)
end
for idx = 1, XPartnerConfigs.PassiveSkillCount do
local grid = self.PassiveSkillGrids[idx]
if not grid then
local ui = CS.UnityEngine.Object.Instantiate(self.GridSkill, self.PanelSkills, false)
ui.gameObject:SetActiveEx(true)
grid = XUiGridPresetSkill.New(ui)
grid.GameObject.name = string.format("PassiveSkill%d", idx)
self.PassiveSkillGrids[idx] = grid
end
grid:Refresh(passiveSkills[idx], partner, skillCount < idx, XPartnerConfigs.SkillType.PassiveSkill, idx + 1, self.PartnerPrefab)
end
--endregion
end
--endregion
--==============================
---@desc 判断当前角色是否携带辅助机
---@return boolean
--==============================
function XUiPartnerPreset:CheckHasPartner()
local index = self.SelectRoleIndex
local partnerId = self.PartnerPrefab:GetPartnerIdByPos(index)
return XTool.IsNumberValid(partnerId)
end
--==============================
---@desc 获取未被装备的辅助机的第一个,可能没有,没有则选中第一个
---@return number
--==============================
function XUiPartnerPreset:GetFirstNoEquipIndex()
local partnerCount = #self.PartnerList
if partnerCount <= 0 then
return 0
end
--携带了几个辅助机
local carryCount = self.PartnerPrefab:GetCarriedCount()
if partnerCount > carryCount then
return carryCount + 1
else
return DEFAULT_SELECT_INDEX
end
end
--==============================
---@desc 根据选中角色获取已经装备的辅助机下标
---@return number
--==============================
function XUiPartnerPreset:GetEquipPartnerIndexBySelectRole()
local partnerCount = #self.PartnerList
if partnerCount <= 0 then
return 0
end
local partnerId = self.PartnerPrefab:GetPartnerIdByPos(self.SelectRoleIndex)
if not XTool.IsNumberValid(partnerId) then return 0 end
--最多只检查前三位队伍容量为3
local maxIndex = #self.RoleList
for i, partner in ipairs(self.PartnerList) do
if i > maxIndex then return DEFAULT_SELECT_INDEX end
if partner:GetId() == partnerId then
return i
end
end
return DEFAULT_SELECT_INDEX
end
--==============================
---@desc 左上角提示
---@title 提示内容
--==============================
function XUiPartnerPreset:OpenPopupTip(title, beginCb, endCb)
title = title or ""
--避免同时打开多个界面
XLuaUiManager.SetMask(true)
if beginCb then beginCb() end
XLuaUiManager.Open("UiPartnerPopupTip", title, function()
if endCb then endCb() end
XLuaUiManager.SetMask(false)
end)
end
--==============================
---@desc 携带/替换
--==============================
function XUiPartnerPreset:Equip()
local partner = self.PartnerList[self.SelectPartnerIndex]
local partnerId = partner:GetId()
local equipFunc = function()
self.PartnerPrefab:Equip(self.SelectRoleIndex, partnerId)
local skillData = self.PartnerPrefab:GetSkillData(partnerId)
XDataCenter.PartnerManager.TeamPreSetPartnerRequest(self.TeamId, self.SelectRoleIndex, partnerId, skillData, function()
self.SelectPartnerIndex = 0
self:RefreshPartnerList()
self:RefreshRoleList()
XEventManager.DispatchEvent(XEventId.EVENT_TEAM_PREFAB_CHANGE, self.TeamId, self.TeamData)
end)
end
local unloadThenEquipFunc = function()
local pos = self.PartnerPrefab:GetPosByPartnerId(partnerId)
self.PartnerPrefab:Unload(pos, true)
XDataCenter.PartnerManager.TeamPreSetPartnerRequest(self.TeamId, pos, 0, {}, function()
equipFunc()
end)
end
--当前角色是否携带辅助机
local isRoleEquipPartner = self:CheckHasPartner()
--选择辅助机是否被携带
local isPartnerEquipped = self.PartnerPrefab:GetIsCarry(partnerId)
if isRoleEquipPartner then
if isPartnerEquipped then
--当前角色携带辅助机,选中辅助机已经携带 ---> 先从自身卸下清缓存,再从原先携带者卸下不清缓存,再携带
self.PartnerPrefab:Unload(self.SelectRoleIndex)
unloadThenEquipFunc()
else
--当前角色携带辅助机,选中辅助机未被携带 ---> 先从自身卸下清缓存,再携带
self.PartnerPrefab:Unload(self.SelectRoleIndex)
equipFunc()
end
else
if isPartnerEquipped then
--当前角色未携带辅助机,选中辅助机已经携带 ---> 先从原先携带者卸下不清缓存,再携带
unloadThenEquipFunc()
else
--当前角色未携带辅助机,选中辅助机未被携带 ---> 直接装备
equipFunc()
end
end
end
--==============================
---@desc 卸下
--==============================
function XUiPartnerPreset:Unload()
if not XTool.IsNumberValid(self.SelectRoleIndex) then return end
self.PartnerPrefab:Unload(self.SelectRoleIndex)
XDataCenter.PartnerManager.TeamPreSetPartnerRequest(self.TeamId, self.SelectRoleIndex, 0, {}, function()
self.SelectPartnerIndex = 0
self:RefreshPartnerList()
self:RefreshRoleList()
XEventManager.DispatchEvent(XEventId.EVENT_TEAM_PREFAB_CHANGE, self.TeamId, self.TeamData)
end)
end