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

686 lines
20 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.SubmitItem
local PHASE_ID = PhaseId.SubmitItem
SubmitItemCtrl = HL.Class('SubmitItemCtrl', uiCtrl.UICtrl)
local SubmitType = {
Common = 0,
CommonAndInst = 1,
AnyAndInst = 2,
AnyAndNoInst = 3,
}
SubmitItemCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_SUBMIT_ITEM] = 'OnSubmitItem',
}
SubmitItemCtrl.m_submitItemsNormal = HL.Field(HL.Table)
SubmitItemCtrl.m_submitItemsSelect = HL.Field(HL.Table)
SubmitItemCtrl.m_selectItemBundle = HL.Field(HL.Table)
SubmitItemCtrl.m_controllerSelectCache = HL.Field(HL.Table)
SubmitItemCtrl.m_controllerToggleSelectBindingId = HL.Field(HL.Number) << -1
SubmitItemCtrl.m_info = HL.Field(HL.Table)
SubmitItemCtrl.m_normalItemListCache = HL.Field(HL.Forward("UIListCache"))
SubmitItemCtrl.m_selectItemListCache = HL.Field(HL.Forward("UIListCache"))
SubmitItemCtrl.m_submitType = HL.Field(HL.Number) << SubmitType.Common
SubmitItemCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.view.btnClose.onClick:AddListener(function()
self:PlayAnimationOutWithCallback(function()
self:ClosePanel(1)
end)
end)
self.view.btnSubmit.onClick:AddListener(function()
self:_OnClickSubmit()
end)
self.view.selectListMask.onClick:AddListener(function()
self:_CloseItemSelectList()
end)
self.view.selectListMask.gameObject:SetActiveIfNecessary(false)
self.view.left.gameObject:SetActiveIfNecessary(false)
local submitId = arg.submitId
local questId = arg.questId
local objId = arg.objId
if not questId then
questId = ""
end
if not objId then
objId = 0
end
self.m_info = { submitId = submitId, questId = questId, objId = objId , fromDialog = arg.fromDialog}
local data = Tables.submitItem[submitId]
if data.name ~= nil and data.name ~= "" then
self.view.title.text = data.name
else
self.view.title.text = Language[self.view.config.TITLE_TEXT_ID]
end
if data.icon ~= nil and data.icon ~= "" then
self.view.icon:LoadSprite(data.icon)
else
self.view.icon:LoadSprite(self.view.config.TITLE_ICON_PATH)
end
self.m_submitItemsNormal = {}
self.m_submitItemsSelect = {}
self.m_controllerSelectCache = {}
local itemData = {
id = "",
count = 0,
instId = 0
}
self.m_selectItemBundle = {
itemData,
}
for _, v in pairs(data.paramData) do
if v.type == GEnums.SubmitTermType.Common then
local itemId = v.paramList[0].valueStringList[0]
if Utils.isItemInstType(itemId) then
self.m_submitType = SubmitType.CommonAndInst
else
self.m_submitType = SubmitType.Common
end
local needCount = v.paramList[1].valueIntList[0]
local itemBundle = Tables.itemTable[itemId]
if itemBundle ~= nil and Utils.isItemInstType(itemId) then
if self.m_selectItemBundle[1].id == itemId then
self.m_selectItemBundle[1].count = self.m_selectItemBundle[1].count + needCount
else
if self.m_selectItemBundle[1].id == "" then
self.m_selectItemBundle[1].id = itemId
self.m_selectItemBundle[1].count = needCount
self.m_selectItemBundle[1].name = itemBundle.name
end
end
else
self.m_selectItemBundle = {}
table.insert(self.m_submitItemsNormal, {
id = itemId,
count = v.paramList[1].valueIntList[0],
})
end
elseif v.type == GEnums.SubmitTermType.AnyItem then
local itemIds = v.paramList[0].valueStringList
local needCount = v.paramList[1].valueIntList[0]
self.m_selectItemBundle = {}
for _, itemId in pairs(itemIds) do
if Utils.isItemInstType(itemId) then
self.m_submitType = SubmitType.AnyAndInst
else
self.m_submitType = SubmitType.AnyAndNoInst
end
local itemBundle = Tables.itemTable[itemId]
table.insert(self.m_selectItemBundle, {
id = itemId,
count = needCount,
name = itemBundle.name,
})
end
end
end
self.m_normalItemListCache = UIUtils.genCellCache(self.view.centerNormal.itemCellNormal)
self.m_normalItemListCache:Refresh(#self.m_submitItemsNormal, function(cell, index)
cell.item:InitItem(self.m_submitItemsNormal[index], true)
cell.item:SetExtraInfo({
tipsPosType = UIConst.UI_TIPS_POS_TYPE.LeftTop,
tipsPosTransform = self.view.itemTips.transform,
isSideTips = true,
})
cell.item:SetEnableHoverTips(not DeviceInfo.usingController)
end)
self.view.centerNormal.normalNaviGroup.onIsFocusedChange:AddListener(function(isFocused)
if not isFocused then
Notify(MessageConst.HIDE_ITEM_TIPS)
end
end)
self.view.leftNaviGroup.onIsFocusedChange:AddListener(function(isFocused)
if not isFocused then
self:_CloseItemSelectList()
end
end)
local totalCount = self:_GetSelectItemBundleCount()
self.m_selectItemListCache = UIUtils.genCellCache(self.view.centerSelect.itemCellSelect)
self.m_selectItemListCache:Refresh(totalCount, function(cell, _)
cell.item:InitItem({})
cell.add.onClick:RemoveAllListeners()
cell.add.onClick:AddListener(function()
self:_OpenItemSelectList()
end)
end)
if totalCount > 0 then
local bindingId = self:BindInputPlayerAction("submit_item_select_item", function()
self:_OpenItemSelectList()
end, self.view.right.groupId)
end
self.m_controllerToggleSelectBindingId = self:BindInputPlayerAction("submit_item_toggle_select", function()
self:_OnControllerConfirmSelect()
end, self.view.left.groupId)
InputManagerInst:ToggleBinding(self.m_controllerToggleSelectBindingId, false)
self:_UpdateSelectText()
self:_UpdateCount()
self:_StartCoroutine(function()
while true do
coroutine.wait(UIConst.COMMON_UI_TIME_UPDATE_INTERVAL)
self:_UpdateCount()
end
end)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId })
end
SubmitItemCtrl._GetSelectItemBundleCount = HL.Method().Return(HL.Number) << function(self)
local totalCount = 0
for _, itemData in pairs(self.m_selectItemBundle) do
if totalCount == 0 then
local itemId = itemData.id
local isInst = Utils.isItemInstType(itemId)
if isInst then
totalCount = totalCount + itemData.count
else
totalCount = 1
break
end
end
end
return totalCount
end
SubmitItemCtrl._OnClickSubmit = HL.Method() << function(self)
local enoughNormal = true
self.m_normalItemListCache:Update(function(cell, index)
local bundle = self.m_submitItemsNormal[index]
local count = SubmitItemCtrl._GetItemCount(bundle.id)
local isLack = count < bundle.count
cell.item:UpdateCountSimple(bundle.count, isLack)
if isLack then
enoughNormal = false
end
end)
local enoughSelect = true
self.m_selectItemListCache:Update(function(cell, index)
local bundle = self.m_submitItemsSelect[index]
if bundle == nil or bundle.instId == 0 then
enoughSelect = false
end
end)
if not enoughNormal or not enoughSelect then
Notify(MessageConst.SHOW_TOAST, Language.LUA_SUBMIT_ITEM_INSUFFICENT_TIP)
return
end
local selectInstIds, selectItemIds = nil, nil
if self:_GetSelectItemBundleCount() ~= 0 then
if self.m_submitType == SubmitType.AnyAndInst or self.m_submitType == SubmitType.CommonAndInst then
selectInstIds = {}
for _, v in pairs(self.m_submitItemsSelect) do
table.insert(selectInstIds, v.instId)
end
elseif self.m_submitType == SubmitType.AnyAndNoInst then
selectItemIds = {}
for _, v in pairs(self.m_submitItemsSelect) do
table.insert(selectItemIds, v.id)
end
end
end
local waitSubmitCallback = self:_Submit(selectInstIds, selectItemIds)
if not waitSubmitCallback then
self:PlayAnimationOutWithCallback(function()
self:ClosePanel(0)
end)
end
end
SubmitItemCtrl._Submit = HL.Method(HL.Table, HL.Table).Return(HL.Boolean) << function(self, selectInstIds, selectItemIds)
if self.m_info.fromDialog and GameWorld.dialogManager.isPlaying then
GameWorld.dialogManager:RegisterPendingSubmission(CS.Beyond.Gameplay.InventoryItemSubmitter(
Utils.getCurrentScope(),
Utils.getCurrentChapterId(),
self.m_info.submitId,
self.m_info.questId,
self.m_info.objId,
selectInstIds,
selectItemIds
))
return false
else
GameInstance.player.inventory:SubmitItem(
Utils.getCurrentScope(),
Utils.getCurrentChapterId(),
self.m_info.submitId,
self.m_info.questId,
self.m_info.objId,
selectInstIds,
selectItemIds
)
return true
end
end
SubmitItemCtrl._OpenItemSelectList = HL.Method() << function(self)
if self.view.left.gameObject.activeSelf then
return
end
self.view.left.gameObject:SetActiveIfNecessary(true)
self.view.selectListMask.gameObject:SetActiveIfNecessary(true)
local data = Tables.submitItem[self.m_info.submitId]
local selectHintDes = data.selectHintDes
local title
if string.isEmpty(selectHintDes) then
if self.m_submitType == SubmitType.AnyAndInst then
title = Language.LUA_SUBMIT_COMMON_HINT
elseif self.m_submitType == SubmitType.AnyAndNoInst then
title = string.format(Language.LUA_SUBMIT_SELECT_HINT, self:_GetSelectItemBundleCount())
else
title = string.format(Language.LUA_ITEM_SELECT_LIST_TITLE_TEMPLATE, self.m_selectItemBundle[1].name)
end
else
title = selectHintDes
end
local itemIds = {}
for _, itemData in pairs(self.m_selectItemBundle) do
table.insert(itemIds, itemData.id)
end
self.view.itemSelectList:InitItemSelectList(itemIds, self.m_submitItemsSelect, function(itemBundle, cell, index)
self:_OnSelectItem(itemBundle, cell, index)
end, title, function(itemId, instId)
self:OnItemLockedStateChanged(itemId, instId)
end)
if DeviceInfo.usingController then
if #self.view.itemSelectList.items > 0 then
self.view.leftNaviGroup:ManuallyFocus();
else
local bindingId = self:BindInputPlayerAction("common_back", function()
Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.left.groupId)
end, self.view.left.groupId)
Notify(MessageConst.SHOW_AS_CONTROLLER_SMALL_MENU, {
panelId = PANEL_ID,
isGroup = true,
id = self.view.left.groupId,
hintPlaceholder = self.view.controllerHintPlaceholder,
rectTransform = self.view.left.transform,
noHighlight = true,
onClose = function()
InputManagerInst:DeleteBinding(bindingId)
self:_CloseItemSelectList()
end,
})
end
end
end
SubmitItemCtrl._CloseItemSelectList = HL.Method() << function(self)
if not self.view.left.gameObject.activeSelf then
return
end
if self.view.leftAnimationWrapper.curState == CS.Beyond.UI.UIConst.AnimationState.Out then
return
end
Notify(MessageConst.HIDE_ITEM_TIPS)
self.view.selectListMask.gameObject:SetActiveIfNecessary(false)
self.view.leftAnimationWrapper:PlayOutAnimation(function()
self.view.left.gameObject:SetActiveIfNecessary(false)
end)
end
SubmitItemCtrl._OnSelectItem = HL.Method(HL.Table, HL.Any, HL.Number) << function(self, itemBundle, cell, index)
if DeviceInfo.usingController then
self.m_controllerSelectCache = {itemBundle, cell, index}
local keyHintText = Language["key_hint_submit_item_toggle_select_true"]
if self:_GetItemSelectIndex(itemBundle) > 0 then
keyHintText = Language["key_hint_submit_item_toggle_select_false"]
end
InputManagerInst:SetBindingText(self.m_controllerToggleSelectBindingId, keyHintText)
InputManagerInst:ToggleBinding(self.m_controllerToggleSelectBindingId, true)
else
self:_RealSelectItem(itemBundle, cell, index)
end
end
SubmitItemCtrl._OnControllerConfirmSelect = HL.Method() << function(self)
if next(self.m_controllerSelectCache) ~= nil then
self:_RealSelectItem(unpack(self.m_controllerSelectCache))
AudioAdapter.PostEvent("Au_UI_Button_Item")
local itemBundle = self.m_controllerSelectCache[1]
local keyHintText = Language["key_hint_submit_item_toggle_select_true"]
if self:_GetItemSelectIndex(itemBundle) > 0 then
keyHintText = Language["key_hint_submit_item_toggle_select_false"]
end
InputManagerInst:SetBindingText(self.m_controllerToggleSelectBindingId, keyHintText)
end
end
SubmitItemCtrl._GetItemSelectIndex = HL.Method(HL.Table).Return(HL.Number) << function(self, itemBundle)
for i = #self.m_submitItemsSelect, 1, -1 do
local bundle = self.m_submitItemsSelect[i]
if self.m_submitType == SubmitType.AnyAndInst or self.m_submitType == SubmitType.CommonAndInst then
if bundle.instId == itemBundle.instId then
return i
end
elseif self.m_submitType == SubmitType.AnyAndNoInst then
if bundle.id == itemBundle.id then
return i
end
end
end
return -1
end
SubmitItemCtrl._RealSelectItem = HL.Method(HL.Table, HL.Any, HL.Number) << function(self, itemBundle, cell, index)
local i = self:_GetItemSelectIndex(itemBundle)
if i > 0 then
table.remove(self.m_submitItemsSelect, i)
cell.view.toggle.gameObject:SetActiveIfNecessary(false)
self:_UpdateCount()
return
end
local selectCount = 0
if self.m_submitType == SubmitType.CommonAndInst then
for _,data in pairs(self.m_submitItemsSelect) do
if data then
selectCount = selectCount + 1
end
end
else
selectCount = #self.m_submitItemsSelect
end
local totalCount = self:_GetSelectItemBundleCount()
local id = cell.id
if not Utils.isItemInstType(id) and cell.count <= 0 then
Notify(MessageConst.SHOW_TOAST, Language.LUA_SUBMIT_ITEM_SELECT_NOT_ENOUGH)
return
end
if selectCount >= totalCount then
Notify(MessageConst.SHOW_TOAST, Language.LUA_SUBMIT_ITEM_SELECT_MAX_COUNT_TIP)
return
end
local isLocked = GameInstance.player.inventory:IsItemLocked(Utils.getCurrentScope(), itemBundle.id, itemBundle.instId)
if isLocked then
Notify(MessageConst.SHOW_TOAST, Language.LUA_SUBMIT_ITEM_LOCKED_TIP)
return
end
cell.view.toggle.gameObject:SetActiveIfNecessary(true)
local selectItem = {
id = itemBundle.id,
count = 1,
instId = itemBundle.instId
}
table.insert(self.m_submitItemsSelect, selectItem)
self:_UpdateCount()
end
SubmitItemCtrl._UpdateSelectText = HL.Method() << function(self)
local totalCount = self:_GetSelectItemBundleCount()
local hasSelectItem = totalCount > 0
if hasSelectItem then
self.view.centerSelect.textSelect.gameObject:SetActiveIfNecessary(hasSelectItem)
local data = Tables.submitItem[self.m_info.submitId]
local hintDes = data.selectHintDes
local title
if string.isEmpty(hintDes) then
if self.m_submitType == SubmitType.AnyAndInst then
title = Language.LUA_SUBMIT_COMMON_HINT
elseif self.m_submitType == SubmitType.AnyAndNoInst then
title = string.format(Language.LUA_SUBMIT_SELECT_HINT, self:_GetSelectItemBundleCount())
else
local submitItemData = Tables.itemTable:GetValue(self.m_selectItemBundle[1].id)
local rarityColorStr = Tables.rarityColorTable[submitItemData.rarity].color
title = string.format(
Language.LUA_SUBMIT_ITEM_SELECT_TIP,
totalCount,
submitItemData.name,
rarityColorStr)
end
else
title = hintDes
end
self.view.centerSelect.textSelect:SetAndResolveTextStyle(title)
end
end
SubmitItemCtrl._RefreshCenter = HL.Method() << function(self)
local totalCount = self:_GetSelectItemBundleCount()
local hasSelectItem = totalCount > 0
local hasNormalItem = #self.m_submitItemsNormal > 0
self.view.centerSelect.gameObject:SetActiveIfNecessary(hasSelectItem)
self.view.centerNormal.gameObject:SetActiveIfNecessary(hasNormalItem)
end
SubmitItemCtrl._GetItemCount = HL.StaticMethod(HL.String).Return(HL.Number) << function(itemId)
local itemData = Tables.itemTable:GetValue(itemId)
local typeData = Tables.itemTypeTable:GetValue(itemData.type:GetHashCode())
if typeData.storageSpace == GEnums.ItemStorageSpace.ValuableDepot then
local count = Utils.getItemCount(itemId)
return count
end
return GameInstance.player.inventory:GetItemCountInBag(Utils.getCurrentScope(), itemId)
end
SubmitItemCtrl._UpdateCount = HL.Method() << function(self)
self:_RefreshCenter()
local enoughNormal = true
self.m_normalItemListCache:Update(function(cell, index)
local bundle = self.m_submitItemsNormal[index]
local count = SubmitItemCtrl._GetItemCount(bundle.id)
local isLack = count < bundle.count
cell.item:UpdateCountSimple(bundle.count, isLack)
UIUtils.setItemStorageCountText(cell.storageNode, bundle.id, bundle.count)
if isLack then
enoughNormal = false
end
end)
local enoughSelect = true
self.m_selectItemListCache:Update(function(cell, index)
local bundle = self.m_submitItemsSelect[index]
if bundle == nil or bundle.instId == 0 then
enoughSelect = false
cell.item:InitItem({ })
cell.add.gameObject:SetActiveIfNecessary(true)
cell.storageNode.gameObject:SetActive(false)
else
cell.item:InitItem(bundle, function()
self:_OpenItemSelectList()
end, "", true)
cell.add.gameObject:SetActiveIfNecessary(false)
if self.m_submitType == SubmitType.AnyAndNoInst then
cell.storageNode.gameObject:SetActive(true)
UIUtils.setItemStorageCountText(cell.storageNode, bundle.id, bundle.count)
else
cell.storageNode.gameObject:SetActive(false)
end
end
end)
end
SubmitItemCtrl.OnSubmitItem = HL.Method(HL.Any) << function(self, submitId)
if (submitId[1] == self.m_info.submitId) then
self:PlayAnimationOutWithCallback(function()
self:ClosePanel(0)
end)
else
print("SubmitItemCtrl.OnSubmitItem: submitId not match", submitId, self.m_info.submitId)
end
end
SubmitItemCtrl.OnItemLockedStateChanged = HL.Method(HL.String, HL.Number) << function(self, itemId, instId)
local selectedItems = self.m_submitItemsSelect
local needRefresh = false
for i = #selectedItems, 1, -1 do
if (selectedItems[i].instId == instId) then
table.remove(selectedItems, i)
needRefresh = true
end
end
if needRefresh then
self:_UpdateCount()
end
end
SubmitItemCtrl.ShowPanel = HL.StaticMethod(HL.Any) << function(arg)
arg = unpack(arg) or arg
PhaseManager:OpenPhase(PHASE_ID, arg)
end
SubmitItemCtrl.ClosePanel = HL.Method(HL.Number) << function(self, nextChunkIndex)
if PhaseManager:IsOpen(PhaseId.Dialog) then
self:Notify(MessageConst.DIALOG_CLOSE_UI, { PANEL_ID, PHASE_ID, nextChunkIndex })
else
PhaseManager:ExitPhaseFast(PHASE_ID)
end
end
HL.Commit(SubmitItemCtrl)