Files
Endfield-Data/LuaScripts/UI/Widgets/WeaponInfo.lua
2025-12-02 20:37:18 +07:00

409 lines
14 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
WeaponInfo = HL.Class('WeaponInfo', UIWidgetBase)
WeaponInfo.m_weaponStarCell = HL.Field(HL.Forward("UIListCache"))
WeaponInfo.m_gemStarCell = HL.Field(HL.Forward("UIListCache"))
WeaponInfo.m_weaponInfo = HL.Field(HL.Table)
WeaponInfo.m_equipCallback = HL.Field(HL.Function)
WeaponInfo.m_expandCallback = HL.Field(HL.Function)
WeaponInfo.m_lastTryGemInstId = HL.Field(HL.Any)
WeaponInfo.m_isTrailChar = HL.Field(HL.Boolean) << false
WeaponInfo.m_isBtnUpgradeClicked = HL.Field(HL.Boolean) << false
WeaponInfo._OnFirstTimeInit = HL.Override() << function(self)
self.m_weaponStarCell = UIUtils.genCellCache(self.view.titleNode.starCell)
self.m_gemStarCell = UIUtils.genCellCache(self.view.gemCompareNode.starCell)
local function onBtnEquipClicked()
local isInRpgDungeon = Utils.isInRpgDungeon()
if isInRpgDungeon then
Notify(MessageConst.SHOW_TOAST, Language.LUA_RPG_DUNGEON_FORBID_CHAR_WEAPON)
return
end
if self.m_equipCallback then
self.m_equipCallback(self.m_weaponInfo)
end
end
self.view.buttonNode.buttonEquip.onClick:RemoveAllListeners()
self.view.buttonNode.buttonEquip.onClick:AddListener(onBtnEquipClicked)
if self.view.buttonNode.controllerConfirmBtn then
self.view.buttonNode.controllerConfirmBtn.onClick:RemoveAllListeners()
self.view.buttonNode.controllerConfirmBtn.onClick:AddListener(onBtnEquipClicked)
end
self.view.buttonNode.buttonExpand.onClick:RemoveAllListeners()
self.view.buttonNode.buttonExpand.onClick:AddListener(function()
local isInRpgDungeon = Utils.isInRpgDungeon()
if isInRpgDungeon then
Notify(MessageConst.SHOW_TOAST, Language.LUA_RPG_DUNGEON_FORBID_CHAR_WEAPON)
return
end
if self.m_expandCallback then
self.m_expandCallback(self.m_weaponInfo)
end
end)
self.view.charWeaponBasicNode.btnUpgrade.onClick:RemoveAllListeners()
self.view.charWeaponBasicNode.btnUpgrade.onClick:AddListener(function()
local isInRpgDungeon = Utils.isInRpgDungeon()
if isInRpgDungeon then
Notify(MessageConst.SHOW_TOAST, Language.LUA_RPG_DUNGEON_FORBID_CHAR_WEAPON)
return
end
local exhibitInfo = self.m_weaponInfo.weaponExhibitInfo
if self.m_isTrailChar then
Notify(MessageConst.SHOW_TOAST, Language.LUA_CHAR_INFO_WEAPON_UPGRADE_TRAIL_FORBID)
return
end
local isMaxLv = exhibitInfo.curLv >= exhibitInfo.maxLv
if isMaxLv then
Notify(MessageConst.SHOW_TOAST, Language.LUA_WEAPON_EXHIBIT_LEVEL_MAX_TOAST)
return
end
if self.m_isBtnUpgradeClicked then
return
end
self.m_isBtnUpgradeClicked = true
Notify(MessageConst.CHAR_INFO_BLEND_EXIT, {
finishCallback = function()
self.m_isBtnUpgradeClicked = false
CharInfoUtils.openWeaponInfoBestWay({
weaponTemplateId = exhibitInfo.weaponInst.templateId,
weaponInstId = exhibitInfo.weaponInst.instId,
pageType = UIConst.WEAPON_EXHIBIT_PAGE_TYPE.UPGRADE,
isFocusJump = true,
})
end
})
end)
self.view.charWeaponBasicNode.btnPotential.onClick:RemoveAllListeners()
self.view.charWeaponBasicNode.btnPotential.onClick:AddListener(function()
local isInRpgDungeon = Utils.isInRpgDungeon()
if isInRpgDungeon then
Notify(MessageConst.SHOW_TOAST, Language.LUA_RPG_DUNGEON_FORBID_CHAR_WEAPON)
return
end
local exhibitInfo = self.m_weaponInfo.weaponExhibitInfo
if self.m_isTrailChar then
Notify(MessageConst.SHOW_TOAST, Language.LUA_CHAR_INFO_WEAPON_POTENTIAL_TRAIL_FORBID)
return
end
Notify(MessageConst.CHAR_INFO_BLEND_EXIT, {
finishCallback = function()
CharInfoUtils.openWeaponInfoBestWay({
weaponTemplateId = exhibitInfo.weaponInst.templateId,
weaponInstId = exhibitInfo.weaponInst.instId,
pageType = UIConst.WEAPON_EXHIBIT_PAGE_TYPE.POTENTIAL,
isFocusJump = true,
})
end
})
end)
end
WeaponInfo._InitWeaponInfo = HL.Method(HL.Table, HL.Opt(HL.Number, HL.String)) << function(self, weaponInfo, tryGemInstId, tryCharId)
self:_FirstTimeInit()
self.m_weaponInfo = weaponInfo
self.m_equipCallback = weaponInfo.equipCallback
self.m_expandCallback = weaponInfo.expandCallback
self.m_lastTryGemInstId = tryGemInstId ~= nil and tryGemInstId or -1
self.m_isTrailChar = not CharInfoUtils.isCharDevAvailable(weaponInfo.weaponExhibitInfo.weaponInst.equippedCharServerId)
self:_RefreshButtonState(weaponInfo)
local weaponExhibitInfo = weaponInfo.weaponExhibitInfo
local weaponInstId = weaponExhibitInfo.weaponInst.instId
self:_RefreshGemCompareNode(weaponInfo.weaponExhibitInfo, tryGemInstId)
self:_RefreshNameNode(weaponInfo.weaponExhibitInfo)
self:_RefreshTitleNode(weaponInfo.weaponExhibitInfo)
self:_RefreshAttributes(weaponInstId, tryGemInstId)
self:_RefreshSkill(weaponInstId, tryGemInstId, tryCharId)
self:_RefreshBasicNode(weaponInfo)
self:_RefreshWeaponTrail(weaponInfo)
end
WeaponInfo.InitInCharInfo = HL.Method(HL.Table) << function(self, weaponInfo)
self.view.charWeaponBasicNode.gameObject:SetActive(true)
self.view.weaponBasicNode.gameObject:SetActive(false)
self.view.gemBasicNode.gameObject:SetActive(false)
self.view.gemCompareNode.gameObject:SetActive(false)
self:_InitWeaponInfo(weaponInfo, weaponInfo.weaponExhibitInfo.weaponInst.attachedGemInstId, weaponInfo.charId)
end
WeaponInfo.InitInWeaponExhibit = HL.Method(HL.Table) << function(self, weaponInfo)
self.view.charWeaponBasicNode.gameObject:SetActive(false)
self.view.weaponBasicNode.gameObject:SetActive(true)
self.view.gemBasicNode.gameObject:SetActive(false)
self.view.gemCompareNode.gameObject:SetActive(false)
self:_InitWeaponInfo(weaponInfo, weaponInfo.weaponExhibitInfo.weaponInst.attachedGemInstId)
end
WeaponInfo.InitInWeaponExhibitGem = HL.Method(HL.Table, HL.Opt(HL.Number)) << function(self, weaponInfo, tryGemInstId)
self.view.charWeaponBasicNode.gameObject:SetActive(false)
self.view.weaponBasicNode.gameObject:SetActive(false)
self.view.gemBasicNode.gameObject:SetActive(true)
self.view.gemCompareNode.gameObject:SetActive(false)
self:_InitWeaponInfo(weaponInfo, tryGemInstId)
end
WeaponInfo.InitInWeaponExhibitGemCompare = HL.Method(HL.Table, HL.Opt(HL.Number)) << function(self, weaponInfo, tryGemInstId)
self.view.charWeaponBasicNode.gameObject:SetActive(false)
self.view.weaponBasicNode.gameObject:SetActive(false)
self.view.gemBasicNode.gameObject:SetActive(false)
self.view.gemCompareNode.gameObject:SetActive(true)
self:_InitWeaponInfo(weaponInfo, tryGemInstId)
end
WeaponInfo._RefreshTitleNode = HL.Method(HL.Table) << function(self, weaponExhibitInfo)
local itemCfg = weaponExhibitInfo.itemCfg
local templateId = weaponExhibitInfo.weaponInst.templateId
local instId = weaponExhibitInfo.weaponInst.instId
self.m_weaponStarCell:Refresh(itemCfg.rarity)
self.view.titleNode.lockToggle:InitLockToggle(templateId, instId)
self.view.titleNode.lockToggle.gameObject:SetActive(not self.m_isTrailChar)
end
WeaponInfo._RefreshNameNode = HL.Method(HL.Table) << function(self, weaponExhibitInfo)
local itemCfg = weaponExhibitInfo.itemCfg
local weaponCfg = weaponExhibitInfo.weaponCfg
local weaponTypeInt = weaponCfg.weaponType:ToInt()
self.view.nameNode.weaponName.text = itemCfg.name
self.view.nameNode.typeIcon:LoadSprite(UIConst.UI_SPRITE_WEAPON_EXHIBIT, UIConst.WEAPON_EXHIBIT_WEAPON_TYPE_ICON_PREFIX .. weaponTypeInt)
self.view.nameNode.typeText.text = Language[string.format("LUA_WEAPON_TYPE_%d", weaponTypeInt)]
UIUtils.setItemRarityImage(self.view.nameNode.rarityColor, weaponExhibitInfo.itemCfg.rarity)
end
WeaponInfo._RefreshBasicNode = HL.Method(HL.Opt(HL.Table)) << function(self, arg)
local weaponExhibitInfo = self.m_weaponInfo.weaponExhibitInfo
local itemCfg = weaponExhibitInfo.itemCfg
local weaponBasicNode = self.view.weaponBasicNode
local charWeaponBasicNode = self.view.charWeaponBasicNode
local isMaxLv = weaponExhibitInfo.curLv >= weaponExhibitInfo.stageLv
weaponBasicNode.level.text = weaponExhibitInfo.curLv
weaponBasicNode.maxLevel.text = weaponExhibitInfo.stageLv
weaponBasicNode.experienceBar.fillAmount = isMaxLv and 1 or weaponExhibitInfo.curExp / weaponExhibitInfo.nextLvExp
weaponBasicNode.levelBreakNode:InitLevelBreakNode(weaponExhibitInfo.curBreakthroughLv, false, weaponExhibitInfo.breakthroughInfoList)
weaponBasicNode.btnPreview.onClick:RemoveAllListeners()
weaponBasicNode.btnPreview.onClick:AddListener(function()
UIManager:Open(PanelId.WeaponExhibitPreview, {
weaponTemplateId = weaponExhibitInfo.weaponInst.templateId,
weaponInstId = weaponExhibitInfo.weaponInst.instId,
})
end)
local attachedGemInstId = weaponExhibitInfo.weaponInst.attachedGemInstId
local canEditGem = arg and arg.canEditGem
charWeaponBasicNode.level.text = weaponExhibitInfo.curLv
charWeaponBasicNode.maxLevel.text = weaponExhibitInfo.stageLv
charWeaponBasicNode.weaponGemNode:InitWeaponGemNode(attachedGemInstId, canEditGem == true, function()
local isInRpgDungeon = Utils.isInRpgDungeon()
if isInRpgDungeon then
Notify(MessageConst.SHOW_TOAST, Language.LUA_RPG_DUNGEON_FORBID_CHAR_WEAPON)
return
end
local exhibitInfo = self.m_weaponInfo.weaponExhibitInfo
local isTrailCard = not CharInfoUtils.isCharDevAvailable(exhibitInfo.weaponInst.equippedCharServerId)
if isTrailCard then
Notify(MessageConst.SHOW_TOAST, Language.LUA_CHAR_INFO_WEAPON_GEM_TRAIL_FORBID)
return
end
Notify(MessageConst.CHAR_INFO_BLEND_EXIT, {
finishCallback = function()
CharInfoUtils.openWeaponInfoBestWay({
weaponTemplateId = weaponExhibitInfo.weaponInst.templateId,
weaponInstId = weaponExhibitInfo.weaponInst.instId,
pageType = UIConst.WEAPON_EXHIBIT_PAGE_TYPE.GEM,
isFocusJump = true,
})
end
})
end)
charWeaponBasicNode.levelBreakNode:InitLevelBreakNode(weaponExhibitInfo.curBreakthroughLv, false, weaponExhibitInfo.breakthroughInfoList)
charWeaponBasicNode.potentialStar:InitWeaponPotentialStar(weaponExhibitInfo.weaponInst.refineLv)
local canUpgrade = arg.canUpgrade == true
local canUpgradePotential = arg.canUpgradePotential == true
charWeaponBasicNode.addImage.gameObject:SetActive(canUpgrade)
charWeaponBasicNode.dotNode.gameObject:SetActive(canUpgradePotential)
charWeaponBasicNode.btnUpgrade.interactable = canUpgrade
charWeaponBasicNode.btnPotential.interactable = canUpgradePotential
self.m_weaponStarCell:Refresh(itemCfg.rarity)
end
WeaponInfo._RefreshWeaponTrail = HL.Method(HL.Opt(HL.Table)) << function(self, arg)
local weaponExhibitInfo = arg.weaponExhibitInfo
local isTrailWeapon = CharInfoUtils.checkIsWeaponInTrail(weaponExhibitInfo.weaponInst.instId)
self.view.weaponBasicNode.btnPreview.gameObject:SetActive(not isTrailWeapon)
end
WeaponInfo._RefreshGemCompareNode = HL.Method(HL.Table, HL.Opt(HL.Number)) << function(self, weaponExhibitInfo, tryGemInstId)
if tryGemInstId == nil then
tryGemInstId = weaponExhibitInfo.weaponInst.attachedGemInstId
end
if tryGemInstId and tryGemInstId <= 0 then
return
end
local gemInst = CharInfoUtils.getGemByInstId(tryGemInstId)
local gemTemplateId = gemInst.templateId
local gemItemCfg = Tables.itemTable:GetValue(gemTemplateId)
local gemRarity = gemItemCfg.rarity
self.m_gemStarCell:Refresh(gemRarity)
self.view.gemCompareNode.gemName.text = gemItemCfg.name
self.view.gemCompareNode.itemBlack:InitItem({
id = gemTemplateId,
instId = tryGemInstId,
}, true)
end
WeaponInfo._RefreshAttributes = HL.Method(HL.Number, HL.Opt(HL.Number)) << function(self, weaponInstId, tryGemInstId)
self.view.weaponAttributeNode:InitWeaponAttributeNode(weaponInstId, tryGemInstId)
end
WeaponInfo._RefreshSkill = HL.Method(HL.Number, HL.Opt(HL.Number, HL.String)) << function(self, weaponInstId, tryGemInstId, tryCharId)
local weaponInst = CharInfoUtils.getWeaponByInstId(weaponInstId)
self.view.weaponSkillNode:InitWeaponSkillNode(weaponInstId, {
tryRefineLv = weaponInst.refineLv,
tryBreakthroughLv = weaponInst.breakthroughLv,
tryGemInstId = tryGemInstId,
tryCharId = tryCharId,
})
end
WeaponInfo._RefreshButtonState = HL.Method(HL.Table) << function(self, weaponInfo)
if self.m_isTrailChar then
self.view.buttonNode.gameObject:SetActive(false)
end
if self.view.contentStateCtrl then
self.view.contentStateCtrl:SetState(self.m_isTrailChar and "Preview" or "Normal")
end
local useControllerEquipBtn = DeviceInfo.usingController and weaponInfo.isInDetail == true
and self.view.buttonNode.controllerConfirmBtn ~= nil
self.view.buttonNode.buttonEquip.gameObject:SetActive(weaponInfo.showEquip == true and not useControllerEquipBtn)
if self.view.buttonNode.controllerConfirmBtn ~= nil then
self.view.buttonNode.controllerConfirmBtn.gameObject:SetActive(weaponInfo.showEquip == true and useControllerEquipBtn)
end
self.view.buttonNode.buttonExpand.gameObject:SetActive(weaponInfo.showExpand == true)
local showAnyButton = weaponInfo.showEquip == true or weaponInfo.showEnhance == true
self.view.buttonNode.equippedNodeSmall.gameObject:SetActive(showAnyButton and weaponInfo.showEquipped == true)
self.view.buttonNode.equippedNodeBig.gameObject:SetActive((not showAnyButton) and weaponInfo.showEquipped == true)
end
HL.Commit(WeaponInfo)
return WeaponInfo