Files
Endfield-Data/LuaScripts/UI/Panels/BattlePassWeaponCase/BattlePassWeaponCaseCtrl.lua
2025-12-02 20:37:18 +07:00

330 lines
10 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.BattlePassWeaponCase
BattlePassWeaponCaseCtrl = HL.Class('BattlePassWeaponCaseCtrl', uiCtrl.UICtrl)
local CellStateName = {
Normal = 'Normal',
Selected = 'Selected',
}
BattlePassWeaponCaseCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_SC_OPEN_USABLE_ITEM_CHEST] = '_OnOpenChest',
}
BattlePassWeaponCaseCtrl.m_arg = HL.Field(HL.Table)
BattlePassWeaponCaseCtrl.m_selectedRewardId = HL.Field(HL.Any)
BattlePassWeaponCaseCtrl.m_selectedCell = HL.Field(HL.Table)
BattlePassWeaponCaseCtrl.m_chestData = HL.Field(HL.Userdata)
BattlePassWeaponCaseCtrl.isAutoOpenWhenGet = HL.Field(HL.Boolean) << false
BattlePassWeaponCaseCtrl.m_isPreview = HL.Field(HL.Boolean) << false
BattlePassWeaponCaseCtrl.m_itemCellCache = HL.Field(HL.Forward("UIListCache"))
BattlePassWeaponCaseCtrl.OpenBPWeaponCase = HL.StaticMethod(HL.Any) << function(arg)
local itemId, isPreview, isAutoOpenWhenGet, subTitle = unpack(arg)
local luaArg = {
itemId = itemId,
isPreview = isPreview,
isAutoOpenWhenGet = isAutoOpenWhenGet,
subTitle = subTitle
}
UIManager:Open(PanelId.BattlePassWeaponCase, luaArg)
end
BattlePassWeaponCaseCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_arg = arg
self.isAutoOpenWhenGet = self.m_arg.isAutoOpenWhenGet == true
self.m_isPreview = self.m_arg.isPreview == true
self.view.txtDesc.text = Language.LUA_BATTLEPASS_WEAPON_CHEST_TITLE
local hint = arg.subTitle
if string.isEmpty(hint) then
hint = self.isAutoOpenWhenGet and Language.LUA_BATTLEPASS_WEAPON_CHEST_SUBTITLE or ""
end
self.view.txtHint.text = hint
self.view.txtHint.gameObject:SetActive(not string.isEmpty(hint))
self.view.titleTxt.text = self.m_isPreview and
Language.LUA_BATTLEPASS_WEAPON_CHEST_TITLE_LEFT_PREVIEW or Language.LUA_BATTLEPASS_WEAPON_CHEST_TITLE_LEFT
self.view.desc3Text.gameObject:SetActive(not self.m_isPreview)
self.m_itemCellCache = UIUtils.genCellCache(self.view.weaponCell)
self:_InitAction()
self:_InitController()
self:_Refresh()
self.view.scrollRect.normalizedPosition = 0
end
BattlePassWeaponCaseCtrl._InitAction = HL.Method() << function(self)
self.view.btnBack.onClick:AddListener(function()
self:_CloseWithConfirm()
end)
self.view.btnMore.gameObject:SetActive(self.m_isPreview)
self.view.btnMore.onClick:AddListener(function()
self:PlayAnimationOutAndClose()
end)
self.view.btnCancel.gameObject:SetActive(not self.m_isPreview)
self.view.btnCancel.onClick:AddListener(function()
self:_CloseWithConfirm()
end)
self.view.btnConfirm.onClick:AddListener(function()
if self.m_selectedRewardId then
local itemId = UIUtils.getRewardFirstItem(self.m_selectedRewardId).id
Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_BATTLEPASS_WEAPON_CHEST_CONFIRM_TITLE,
subContent = string.format(Language.LUA_BATTLEPASS_WEAPON_CHEST_CONFIRM_CONTENT_FORMAT, Tables.itemTable[itemId].name),
onConfirm = function()
GameInstance.player.inventory:OpenUsableItemChest(self.m_chestData.id, 1, {self.m_selectedRewardId })
end,
})
end
end)
self:_UpdateBtns()
end
BattlePassWeaponCaseCtrl._CloseWithConfirm = HL.Method() << function(self)
if self.isAutoOpenWhenGet then
Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_BATTLEPASS_WEAPON_CHEST_CANCEL_TITLE,
subContent = Language.LUA_BATTLEPASS_WEAPON_CHEST_CANCEL_CONTENT,
onConfirm = function()
self:PlayAnimationOutAndClose()
end,
})
else
self:PlayAnimationOutAndClose()
end
end
BattlePassWeaponCaseCtrl._UpdateBtns = HL.Method() << function(self)
local isSelected = self.m_selectedRewardId ~= nil
self.view.btnConfirm.gameObject:SetActive(not self.m_isPreview and isSelected)
self.view.emptyNode.gameObject:SetActive(not self.m_isPreview and not isSelected)
end
BattlePassWeaponCaseCtrl._Refresh = HL.Method() << function(self)
local _, itemChestData = Tables.usableItemChestTable:TryGetValue(self.m_arg.itemId)
self.m_chestData = itemChestData
if not itemChestData then
self.m_itemCellCache:Refresh(0)
return
end
local itemCount = #itemChestData.rewardIdList
self.m_itemCellCache:Refresh(itemCount, function(cell, index)
local rewardId = itemChestData.rewardIdList[CSIndex(index)]
local weaponId = UIUtils.getRewardFirstItem(rewardId).id
cell.nodeState:SetState(CellStateName.Normal)
cell.btnConfirm.onClick:RemoveAllListeners()
cell.btnConfirm.onClick:AddListener(function()
if self.m_isPreview and not DeviceInfo.usingController then
self:_PreviewWeapon(weaponId)
return
end
self:_OnWeaponCellClicked(cell, rewardId)
end)
cell.btnDetail.onClick:RemoveAllListeners()
cell.btnDetail.onClick:AddListener(function()
self:_PreviewWeapon(weaponId)
end)
local _, itemData = Tables.itemTable:TryGetValue(weaponId)
if itemData then
cell.weaponImg:LoadSprite(UIConst.UI_SPRITE_GACHA_WEAPON, itemData.iconId)
cell.nameTxt.text = itemData.name
local stateName = self:_GetCellRarityStateName(itemData.rarity)
cell.selectedNode:SetState(stateName)
cell.unselectedNode:SetState(stateName)
cell.numTxt.text = tostring(Utils.getItemCount(weaponId))
cell.starGroup:InitStarGroup(itemData.rarity)
end
if DeviceInfo.usingController then
cell.btnDetailInputGroup.enabled = false
if not self.m_isPreview then
InputManagerInst:SetBindingText(cell.btnConfirm.hoverConfirmBindingId, Language.LUA_BATTLEPASS_WEAPON_SELECT)
else
InputManagerInst:SetBindingText(cell.btnConfirm.hoverConfirmBindingId, "")
end
cell.btnConfirm.onIsNaviTargetChanged = function(isTarget)
cell.btnDetailInputGroup.enabled = isTarget
end
if index == 1 then
UIUtils.setAsNaviTarget(cell.btnConfirm)
end
end
end)
end
BattlePassWeaponCaseCtrl._OnWeaponCellClicked = HL.Method(HL.Table, HL.Any) << function(self, cell, rewardId)
if cell == self.m_selectedCell then
if DeviceInfo.usingController then
return
end
self.m_selectedCell.nodeState:SetState(CellStateName.Normal)
self.m_selectedCell = nil
self.m_selectedRewardId = nil
self:_UpdateBtns()
return
end
if self.m_selectedCell then
self.m_selectedCell.nodeState:SetState(CellStateName.Normal)
end
cell.nodeState:SetState(CellStateName.Selected)
self.m_selectedCell = cell
self.m_selectedRewardId = rewardId
self:_UpdateBtns()
end
BattlePassWeaponCaseCtrl._PreviewWeapon = HL.Method(HL.String) << function(self, weaponId)
local weaponGroupData = {
title = Language.LUA_BATTLEPASS_WEAPON_CHEST_TITLE,
weaponIds = {},
}
for _, rewardId in pairs(self.m_chestData.rewardIdList) do
local weaponId = UIUtils.getRewardFirstItem(rewardId).id
table.insert(weaponGroupData.weaponIds, weaponId)
end
local showWeaponPreviewArgs = {
isWeaponPreview = true,
weaponId = weaponId,
weaponGroups = { weaponGroupData },
}
PhaseManager:OpenPhase(PhaseId.Wiki, showWeaponPreviewArgs)
end
BattlePassWeaponCaseCtrl._GetCellRarityStateName = HL.Method(HL.Number).Return(HL.String) << function(self, rarity)
local stateName = ''
if rarity <= 4 then
stateName = 'Low'
elseif rarity == 5 then
stateName = 'Mid'
else
stateName = 'High'
end
return stateName
end
BattlePassWeaponCaseCtrl._OnOpenChest = HL.Method(HL.Table) << function(self, args)
local openCount = args[1]
if openCount == 0 then
Notify(MessageConst.SHOW_TOAST, Language.LUA_USABLE_ITEM_CHEST_OPEN_FAILED)
return
end
self:Close()
local rewardPack = GameInstance.player.inventory:ConsumeLatestRewardPackOfType(CS.Beyond.GEnums.RewardSourceType.ItemCase)
local items = {}
local chars = nil
if rewardPack and rewardPack.rewardSourceType == CS.Beyond.GEnums.RewardSourceType.ItemCase then
for _, itemBundle in pairs(rewardPack.itemBundleList) do
local _, itemData = Tables.itemTable:TryGetValue(itemBundle.id)
if itemData then
local putInside = false
for i = 1, #items do
if items[i].id == itemData.id and itemBundle.instId == 0 then
items[i].count = items[i].count + itemBundle.count
putInside = true
break
end
end
if not putInside then
table.insert(items, {id = itemBundle.id,
count = itemBundle.count,
instData = itemBundle.instData,
instId = itemBundle.instId,
rarity = itemData.rarity,
type = itemData.type:ToInt()})
end
end
end
table.sort(items, Utils.genSortFunction({"rarity", "type", "id"}, false))
chars = rewardPack.chars
end
local rewardPanelArgs = {}
rewardPanelArgs.items = items
rewardPanelArgs.chars = chars
Notify(MessageConst.SHOW_SYSTEM_REWARDS, rewardPanelArgs)
end
BattlePassWeaponCaseCtrl._InitController = HL.Method() << function(self)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({self.view.inputGroup.groupId})
end
HL.Commit(BattlePassWeaponCaseCtrl)