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

370 lines
No EOL
14 KiB
Lua

local XUiGridEquip = require("XUi/XUiEquipAwarenessReplace/XUiGridEquip")
local XUiGridEquipReplaceAttr = require("XUi/XUiEquipReplaceNew/XUiGridEquipReplaceAttr")
local XUiGridResonanceSkill = require("XUi/XUiEquipResonanceSkill/XUiGridResonanceSkill")
local XUiEquipOverrunDetail = require("XUi/XUiEquipOverrun/XUiEquipOverrunDetail")
local XUiEquipReplaceNew = XLuaUiManager.Register(XLuaUi, "UiEquipReplaceNew")
function XUiEquipReplaceNew:OnAwake()
self:AutoAddListener()
self:InitComponentStatus()
end
function XUiEquipReplaceNew:OnStart(charId, closecallback, notShowStrengthenBtn)
self.IsAscendOrder = false --初始降序
self.NotShowStrengthenBtn = notShowStrengthenBtn or false
self:InitViewData(charId, closecallback)
self:InitDynamicTable()
self.ImgAscend.gameObject:SetActive(self.IsAscendOrder)
self.ImgDescend.gameObject:SetActive(not self.IsAscendOrder)
end
function XUiEquipReplaceNew:OnEnable()
self:UpdateView()
end
function XUiEquipReplaceNew:OnDestroy()
if self.CloseCallback then
self.CloseCallback(self.CharacterId, self.ChangeEquipSuccess)
end
end
--注册监听事件
function XUiEquipReplaceNew:OnGetEvents()
return {
XEventId.EVENT_EQUIP_PUTON_NOTYFY
, XEventId.EVENT_EQUIP_LOCK_STATUS_CHANGE_NOTYFY
, XEventId.EVENT_EQUIP_RECYCLE_STATUS_CHANGE_NOTYFY
, XEventId.EVENT_EQUIP_STRENGTHEN_NOTYFY
, XEventId.EVENT_EQUIP_BREAKTHROUGH_NOTYFY
, XEventId.EVENT_EQUIP_RESONANCE_ACK_NOTYFY
, XEventId.EVENT_EQUIP_RECYCLE_NOTIFY
}
end
--处理事件监听
function XUiEquipReplaceNew:OnNotify(evt, ...)
local args = { ... }
local equipId = args[1]
if evt == XEventId.EVENT_EQUIP_PUTON_NOTYFY then
self.UsingEquipId = equipId
self:OnPutOnEquip()
elseif evt == XEventId.EVENT_EQUIP_LOCK_STATUS_CHANGE_NOTYFY
or evt == XEventId.EVENT_EQUIP_RECYCLE_STATUS_CHANGE_NOTYFY then
self:OnEquipLockStatusChange(equipId)
self:UpdateEquipGridList()
elseif evt == XEventId.EVENT_EQUIP_STRENGTHEN_NOTYFY
or evt == XEventId.EVENT_EQUIP_BREAKTHROUGH_NOTYFY
or evt == XEventId.EVENT_EQUIP_RESONANCE_ACK_NOTYFY
or evt == XEventId.EVENT_EQUIP_RECYCLE_NOTIFY
then
self:UpdateView()
end
end
function XUiEquipReplaceNew:InitComponentStatus()
self.GridEquip.gameObject:SetActive(false)
self.GridEquipReplaceAttr.gameObject:SetActive(false)
self.GridEquipReplaceAttr.gameObject:SetActive(false)
self.GridResonanceSkill.gameObject:SetActive(false)
self.AssetPanel = XUiPanelAsset.New(self, self.PanelAsset, XDataCenter.ItemManager.ItemId.FreeGem, XDataCenter.ItemManager.ItemId.ActionPoint, XDataCenter.ItemManager.ItemId.Coin)
end
function XUiEquipReplaceNew:InitViewData(characterid, closecallback)
self.CharacterId = characterid
self.CloseCallback = closecallback
self.AttrGridList = {}
self.GridResonanceSkills = {}
self.PriorSortType = XEquipConfig.PriorSortType.Star
local equipId = XDataCenter.EquipManager.GetCharacterWearingWeaponId(self.CharacterId) --初始为角色身上的装备
self.SelectEquipId = equipId
self.UsingEquipId = equipId
end
function XUiEquipReplaceNew:UpdateView()
self.WeaponIdList = XDataCenter.EquipManager.GetCanUseWeaponIds(self.CharacterId)
self:OnPutOnEquip()
self:SelectSortType()
self:OnSelectEquip()
end
function XUiEquipReplaceNew:InitDynamicTable()
self.DynamicTable = XDynamicTableNormal.New(self.PanelEquipScroll)
self.DynamicTable:SetProxy(XUiGridEquip, self)
self.DynamicTable:SetDelegate(self)
end
function XUiEquipReplaceNew:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
grid:InitRootUi(self)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
local equipId = self.WeaponIdList[index]
grid:Refresh(equipId)
local isSelected = equipId == self.SelectEquipId
grid:SetSelected(isSelected)
if isSelected then
self.LastSelectGrid = grid
end
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
self.SelectEquipId = self.WeaponIdList[index]
self:OnSelectEquip()
if self.LastSelectGrid then
self.LastSelectGrid:SetSelected(false)
end
self.LastSelectGrid = grid
self.LastSelectGrid:SetSelected(true)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RELOAD_COMPLETED then
XEventManager.DispatchEvent(XEventId.EVENT_GUIDE_STEP_OPEN_EVENT)
end
end
function XUiEquipReplaceNew:OnPutOnEquip()
self:UpdateCompareAttr()
self:UpdateBtnEquipStatus()
self:SelectSortType()
if self.UiEquipOverrunDetail then
self.UiEquipOverrunDetail:Refresh()
end
end
function XUiEquipReplaceNew:OnEquipLockStatusChange(equipId)
if equipId ~= self.SelectEquipId then return end
local equip = XDataCenter.EquipManager.GetEquip(equipId)
self.BtnLock.gameObject:SetActive(equip.IsLock)
self.BtnUnlock.gameObject:SetActive(not equip.IsLock)
end
function XUiEquipReplaceNew:SelectSortType()
XDataCenter.EquipManager.SortEquipIdListByPriorType(self.WeaponIdList, self.PriorSortType)
if self.IsAscendOrder then
XTool.ReverseList(self.WeaponIdList)
end
self:UpdateEquipGridList()
end
function XUiEquipReplaceNew:UpdateEquipGridList()
self:UsingWeaponFirstInList()
self.DynamicTable:SetDataSource(self.WeaponIdList)
self.DynamicTable:ReloadDataASync(#self.WeaponIdList > 0 and 1 or -1)
self:PlayAnimation("LeftQieHuan")
end
function XUiEquipReplaceNew:UpdateResonanceSkills()
local skillCount = 0
local resonanceSkillNum = XDataCenter.EquipManager.GetResonanceSkillNum(self.SelectEquipId)
for pos = resonanceSkillNum, 1, -1 do
if XDataCenter.EquipManager.CheckEquipPosResonanced(self.SelectEquipId, pos) then
if not self.GridResonanceSkills[pos] then
local item = CS.UnityEngine.Object.Instantiate(self.GridResonanceSkill) -- 复制一个item
self.GridResonanceSkills[pos] = XUiGridResonanceSkill.New(item, self.SelectEquipId, pos, self.CharacterId, function(equipId, selectPos, characterId)
XLuaUiManager.Open("UiEquipResonanceSkillDetailInfo", equipId, selectPos, characterId)
end)
self.GridResonanceSkills[pos].Transform:SetParent(self.PanelSkills, false)
end
self.GridResonanceSkills[pos]:SetEquipIdAndPos(self.SelectEquipId, pos)
self.GridResonanceSkills[pos]:Refresh()
self.GridResonanceSkills[pos].GameObject:SetActive(true)
self.GridResonanceSkills[pos].Transform:SetAsFirstSibling()
skillCount = skillCount + 1
else
if self.GridResonanceSkills[pos] then
self.GridResonanceSkills[pos].GameObject:SetActive(false)
end
end
end
if skillCount == 0 then
for _, grid in pairs(self.GridResonanceSkills) do
grid.GameObject:SetActive(false)
end
end
for pos = 1, XEquipConfig.MAX_RESONANCE_SKILL_COUNT do
self["ImgBg" .. pos].gameObject:SetActive(pos > skillCount and pos <= resonanceSkillNum)
end
if resonanceSkillNum == 0 then
self.PanelResonanceSkill.gameObject:SetActive(false)
else
self.PanelResonanceSkill.gameObject:SetActive(true)
end
end
function XUiEquipReplaceNew:OnSelectEquip()
self:UpdateSelectEquip()
self:UpdateCompareAttr()
self:UpdateBtnEquipStatus()
self:OnEquipLockStatusChange(self.SelectEquipId)
self:UpdateResonanceSkills()
end
function XUiEquipReplaceNew:UpdateSelectEquip()
local equip = XDataCenter.EquipManager.GetEquip(self.SelectEquipId)
local weaponSkillInfo = XDataCenter.EquipManager.GetOriginWeaponSkillInfo(equip.TemplateId)
self.RImgEquipIcon:SetRawImage(XDataCenter.EquipManager.GetWeaponTypeIconPath(self.SelectEquipId))
self.TxtEquipName.text = XDataCenter.EquipManager.GetEquipName(equip.TemplateId)
self.TxtEquipLevel.text = equip.Level
self.TxtSkillDes.text = weaponSkillInfo.Description
local noSkill = not weaponSkillInfo.Description and not weaponSkillInfo.Name
self.PanelSkillDes.gameObject:SetActive(not noSkill)
for i = 1, XEquipConfig.MAX_STAR_COUNT do
if i <= XDataCenter.EquipManager.GetEquipStar(equip.TemplateId) then
self["ImgStar" .. i].gameObject:SetActive(true)
else
self["ImgStar" .. i].gameObject:SetActive(false)
end
end
-- 武器超限
local canOverrun = equip:CanOverrun()
self.PanelEquipOverrun.gameObject:SetActiveEx(canOverrun)
if canOverrun then
if not self.UiEquipOverrunDetail then
self.UiEquipOverrunDetail = XUiEquipOverrunDetail.New(self, self.OverrunDetail)
end
self.UiEquipOverrunDetail:SetEquipId(self.SelectEquipId, self.CharacterId)
end
end
function XUiEquipReplaceNew:UpdateCompareAttr()
if not self.UsingEquipId or not self.SelectEquipId then return end
local curAttrMap = XDataCenter.EquipManager.GetEquipAttrMap(self.UsingEquipId)
local newAttrMap = XDataCenter.EquipManager.GetEquipAttrMap(self.SelectEquipId)
for key, _ in pairs(curAttrMap) do
local curAttrValue = curAttrMap[key] and curAttrMap[key].Value or 0
local newAttrValue = newAttrMap[key] and newAttrMap[key].Value or 0
if not self.AttrGridList[key] then
local ui = CS.UnityEngine.Object.Instantiate(self.GridEquipReplaceAttr)
self.AttrGridList[key] = XUiGridEquipReplaceAttr.New(ui, curAttrMap[key].Name)
self.AttrGridList[key].Transform:SetParent(self.PanelAttrParent, false)
end
self.AttrGridList[key]:UpdateData(curAttrValue, newAttrValue)
self.AttrGridList[key].GameObject:SetActive(true)
end
self:PlayAnimation("RightQieHuan")
end
function XUiEquipReplaceNew:UpdateBtnEquipStatus()
if self.UsingEquipId == self.SelectEquipId then
--当前角色使用中
self.BtnTakeOn.gameObject:SetActive(false)
self.ImgEquipOn.gameObject:SetActive(true)
else
self.BtnTakeOn.gameObject:SetActive(true)
self.ImgEquipOn.gameObject:SetActive(false)
end
self.BtnStrengthen.gameObject:SetActive(not self.NotShowStrengthenBtn)
end
function XUiEquipReplaceNew:AutoAddListener()
self:RegisterClickEvent(self.BtnTakeOn, self.OnBtnTakeOnClick)
self:RegisterClickEvent(self.BtnStrengthen, self.OnBtnStrengthenClick)
self:RegisterClickEvent(self.BtnBack, self.OnBtnBackClick)
self:RegisterClickEvent(self.BtnMain, self.OnBtnMainClick)
self:RegisterClickEvent(self.BtnOrder, self.OnBtnOrderClick)
self:RegisterClickEvent(self.BtnLock, self.OnBtnLockClick)
self:RegisterClickEvent(self.BtnUnlock, self.OnBtnUnlockClick)
self.DrdSort.onValueChanged:AddListener(function()
self.PriorSortType = self.DrdSort.value
self:SelectSortType()
end)
end
function XUiEquipReplaceNew:OnBtnOrderClick()
self.IsAscendOrder = not self.IsAscendOrder
XTool.ReverseList(self.WeaponIdList)
self:UpdateEquipGridList()
self.ImgAscend.gameObject:SetActive(self.IsAscendOrder)
self.ImgDescend.gameObject:SetActive(not self.IsAscendOrder)
end
function XUiEquipReplaceNew:OnBtnLockClick()
XDataCenter.EquipManager.SetLock(self.SelectEquipId, false)
end
function XUiEquipReplaceNew:OnBtnUnlockClick()
XDataCenter.EquipManager.SetLock(self.SelectEquipId, true)
end
function XUiEquipReplaceNew:OnBtnStrengthenClick()
XMVCA:GetAgency(ModuleId.XEquip):OpenUiEquipDetail(self.SelectEquipId, nil, self.CharacterId)
end
function XUiEquipReplaceNew:OnBtnTakeOnClick()
local equip = XDataCenter.EquipManager.GetEquip(self.SelectEquipId)
local characterId = equip.CharacterId
--其他角色使用中
if characterId and characterId > 0 then
--自己穿戴了专属装备
local specialCharacterId = XDataCenter.EquipManager.GetEquipSpecialCharacterId(self.UsingEquipId)
if specialCharacterId and specialCharacterId > 0 then
XUiManager.TipText("EquipWithSpecialCharacterIdCanNotBeReplaced")
return
end
local fullName = XCharacterConfigs.GetCharacterFullNameStr(characterId)
local content = CS.XTextManager.GetText("EquipReplaceTip", fullName)
XUiManager.DialogTip(CS.XTextManager.GetText("TipTitle"), content, XUiManager.DialogType.Normal, function() end, function()
XMVCA:GetAgency(ModuleId.XEquip):PutOn(self.CharacterId, self.SelectEquipId)
self.ChangeEquipSuccess = true
end)
-- 检测这个角色穿戴是否意识不匹配
elseif not equip:IsOverrunBlindMatch(self.CharacterId) then
local content = CS.XTextManager.GetText("EquipOverrunBlindNotMatchTips")
XUiManager.DialogTip(CS.XTextManager.GetText("TipTitle"), content, XUiManager.DialogType.Normal, function() end, function()
XMVCA:GetAgency(ModuleId.XEquip):PutOn(self.CharacterId, self.SelectEquipId)
self.ChangeEquipSuccess = true
end)
else
XMVCA:GetAgency(ModuleId.XEquip):PutOn(self.CharacterId, self.SelectEquipId)
self.ChangeEquipSuccess = true
end
end
function XUiEquipReplaceNew:OnBtnBackClick()
self:Close()
end
function XUiEquipReplaceNew:OnBtnMainClick()
XLuaUiManager.RunMain()
end
function XUiEquipReplaceNew:UsingWeaponFirstInList()
local usingEquipId
for index, equipId in pairs(self.WeaponIdList) do
if equipId == self.UsingEquipId then
usingEquipId = table.remove(self.WeaponIdList, index)
end
end
if usingEquipId then
table.insert(self.WeaponIdList, 1, usingEquipId)
end
end
function XUiEquipReplaceNew:GuideGetDynamicTableIndex(id)
for i, v in ipairs(self.WeaponIdList) do
local equip = XDataCenter.EquipManager.GetEquip(v)
if tostring(equip.TemplateId) == id then
return i
end
end
return -1
end