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

989 lines
31 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
InventoryArea = HL.Class('InventoryArea', UIWidgetBase)
InventoryArea.m_opening = HL.Field(HL.Boolean) << false
InventoryArea.m_dataInited = HL.Field(HL.Boolean) << false
InventoryArea.m_isItemBag = HL.Field(HL.Boolean) << true
InventoryArea.m_args = HL.Field(HL.Table)
InventoryArea.m_cellValidStateCache = HL.Field(HL.Table)
InventoryArea.m_isDepotLocked = HL.Field(HL.Boolean) << false
InventoryArea.m_cacheAllQuickDropBindingIds = HL.Field(HL.Table)
InventoryArea.m_allQuickDropBindingSetGray = HL.Field(HL.Boolean) << false
InventoryArea.inSafeZone = HL.Field(HL.Boolean) << false
InventoryArea._OnFirstTimeInit = HL.Override() << function(self)
self:_InitInventoryAreaController()
self.view.itemBagBtn.onClick:AddListener(function()
self:_Show(true)
end)
self.view.depotBtn.onClick:AddListener(function()
self:_Show(false)
end)
self.view.itemDropAreaBtn.onClick:AddListener(function()
self:_Show(true)
end)
self.view.depotDropAreaBtn.onClick:AddListener(function()
self:_Show(false)
end)
self:RegisterMessage(MessageConst.ON_START_UI_DRAG, function(dragHelper)
if UIUtils.isTypeDropValid(dragHelper, UIConst.ITEM_BAG_DROP_ACCEPT_INFO) then
if not self.m_opening then
local dataInited = self.m_dataInited
if not dataInited then
self.view.itemBag.view.itemBagContent:OnStartUiDrag(dragHelper)
self.view.depot.view.depotContent:OnStartUiDrag(dragHelper)
end
end
self.view.depotNotOpenDropHint.gameObject:SetActive(true)
self.view.itemBagNotOpenDropHint.gameObject:SetActive(true)
end
end)
self:RegisterMessage(MessageConst.ON_END_UI_DRAG, function(dragHelper)
self.view.depotNotOpenDropHint.gameObject:SetActive(false)
self.view.itemBagNotOpenDropHint.gameObject:SetActive(false)
end)
self:RegisterMessage(MessageConst.ON_NAVI_INVENTORY_SELECT_FLUID, function(args)
self:_OnNaviTargetToSelectFluid(args)
end)
UIUtils.initUIDropHelper(self.view.itemDropArea, {
acceptTypes = UIConst.INVENTORY_AREA_ITEM_BAG_DROP_ACCEPT_INFO,
onToggleHighlight = function(active)
if active then
self:_OnDropOnArea(true)
end
end,
})
UIUtils.initUIDropHelper(self.view.depotDropArea, {
acceptTypes = UIConst.INVENTORY_AREA_FACTORY_DEPOT_DROP_ACCEPT_INFO,
onToggleHighlight = function(active)
if active then
self:_OnDropOnArea(false)
end
end,
})
self:_RegisterPlayAnimationOut()
local ctrl = self:GetUICtrl()
local node = self.view.moveItemMouseHintNode
node:SetParent(ctrl.view.transform)
node.pivot = Vector2.zero
node.anchorMin = Vector2.zero
node.anchorMax = Vector2.zero
node.anchoredPosition = Vector2.zero
end
InventoryArea.InitInventoryArea = HL.Method(HL.Opt(HL.Table)) << function(self, args)
self:_FirstTimeInit()
self.m_cellValidStateCache = {}
self.m_cacheAllQuickDropBindingIds = {}
self.m_opening = false
self.m_isItemBag = true
self.m_args = args or {}
self.m_args.layoutStyle = self.m_args.layoutStyle or UIConst.INVENTORY_AREA_LAYOUT_STYLE.ACCORDION
self.m_args.itemMoveType = self.m_args.itemMoveType or UIConst.INVENTORY_AREA_ITEM_MOVE_TYPE.DEFAULT
self.inSafeZone = self.m_args.ignoreInSafeZone or Utils.isInSafeZone()
self.view.content.gameObject:SetActive(true)
self.view.itemBagNode.gameObject:SetActive(true)
self.view.depotNode.gameObject:SetActive(true)
self:_Show(true, true)
self:_InitDepotLockInBlackbox()
end
InventoryArea._Hide = HL.Method() << function(self)
self.m_opening = false
self.view.content.gameObject:SetActive(false)
local uiCtrl = self:GetUICtrl()
if uiCtrl.view.blockMask then
uiCtrl.view.blockMask.gameObject:SetActive(false)
end
end
InventoryArea._Show = HL.Method(HL.Boolean, HL.Opt(HL.Boolean)) << function(self, isItemBag, forceUpdate)
if not isItemBag and not self.inSafeZone then
Notify(MessageConst.SHOW_TOAST, Language.LUA_CANT_OPEN_FAC_DEPOT_IN_NON_SAFE_ZONE)
return
end
if isItemBag == self.m_isItemBag and not forceUpdate then
return
end
local fastMode = not self.m_opening
local layoutStyle = self.m_args.layoutStyle
self.m_opening = true
self:_InitData()
if layoutStyle == UIConst.INVENTORY_AREA_LAYOUT_STYLE.ACCORDION then
self:_SwitchTo(isItemBag, fastMode)
end
self.view.content.gameObject:SetActive(true)
local uiCtrl = self:GetUICtrl()
if uiCtrl.view.blockMask then
uiCtrl.view.blockMask.gameObject:SetActive(true)
end
self.view.itemBag.view.itemBagContent:ToggleCanQuickDrop(true)
self.view.depot.view.depotContent:ToggleQuickAcceptDrop(true)
self.m_isItemBag = isItemBag
if self.m_args.onStateChange then
self.m_args.onStateChange(isItemBag)
end
end
InventoryArea._SwitchTo = HL.Method(HL.Boolean, HL.Boolean) << function(self, isItemBag, fastMode)
local anim
if self.inSafeZone then
anim = isItemBag and "ui_storage_area_expand_down" or "ui_storage_area_expand_up"
else
anim = "ui_storage_area_expand_only_bag"
end
if fastMode then
self.view.content:SampleClipAtPercent(anim, 1)
else
self.view.content:PlayWithTween(anim)
end
self.view.itemBag.itemBagContent.view.quickDropButton.enabled = isItemBag
if self.inSafeZone then
self.view.depot.depotContent.view.quickDropButton.enabled = not isItemBag
end
if isItemBag then
if self.view.itemBag.view.forbiddenMask.gameObject.activeSelf then
self.view.itemBag.view.forbiddenMask:PlayInAnimation()
end
else
if self.view.depot.view.forbiddenMask.gameObject.activeSelf then
self.view.depot.view.forbiddenMask:PlayInAnimation()
end
end
if DeviceInfo.usingController then
AudioAdapter.PostEvent("Au_UI_Button_SelectSourceBag")
end
end
InventoryArea._InitData = HL.Method() << function(self)
if self.m_dataInited then
return
end
self.view.itemBag:InitItemBag(function(itemId, cell, csIndex)
self:_OnClickItem(itemId, cell, csIndex)
end, {
canSplit = true,
canClear = true,
customOnUpdateCell = function(cell, itemBundle, csIndex)
self:_RefreshItemSlotCellValidState(cell, itemBundle)
if self.m_args.customOnUpdateCell ~= nil then
self.m_args.customOnUpdateCell(cell, itemBundle, LuaIndex(csIndex), true)
end
if DeviceInfo.usingController then
cell.item:SetExtraInfo({
tipsPosType = UIConst.UI_TIPS_POS_TYPE.RightTop,
tipsPosTransform = self.view.itemBag.transform,
})
end
cell.item.view.button.onIsNaviTargetChanged = function(active)
if active then
self:_TryDisableHoverBindingOnEmptyItem(cell, itemBundle)
end
end
self:_TryDisableHoverBindingOnEmptyItem(cell, itemBundle)
InputManagerInst:SetBindingText(cell.item.view.button.hoverConfirmBindingId, Language["key_hint_item_open_action_menu"])
if self:_GetIsValidControllerNaviTarget(cell, itemBundle, true) then
local quickDropId = cell.item:AddHoverBinding("common_quick_drop", function()
cell:QuickDrop()
end)
if self.m_args.adaptForceQuickDropKeyhintToGray then
self.m_cacheAllQuickDropBindingIds["BAG_" .. csIndex] = quickDropId
if self.m_allQuickDropBindingSetGray then
InputManagerInst:ForceBindingKeyhintToGray(quickDropId, true)
end
end
if self.m_args.isFluidOnlyMachine then
local itemId = itemBundle.id
local isEmptyBottle = Tables.emptyBottleTable:ContainsKey(itemId)
local isFullBottle = Tables.fullBottleTable:ContainsKey(itemId)
local isBottle = isEmptyBottle or isFullBottle
if isBottle then
local quickDropText = isEmptyBottle and Language.LUA_ITEM_ACTION_FILL_LIQUID or Language.LUA_ITEM_ACTION_DUMP_LIQUID
InputManagerInst:SetBindingText(quickDropId, quickDropText)
end
else
local quickDropBindingText = self.m_args.itemBagQuickDropBindingText
if not string.isEmpty(quickDropBindingText) then
InputManagerInst:SetBindingText(quickDropId, quickDropBindingText)
end
end
else
if self.m_args.adaptForceQuickDropKeyhintToGray and self.m_cacheAllQuickDropBindingIds["BAG_" .. csIndex] then
self.m_cacheAllQuickDropBindingIds["BAG_" .. csIndex] = nil
end
end
self:_RefreshForbiddenItemActionMenuArgs(cell, itemBundle)
end,
customSetActionMenuArgs = self.m_args.customSetActionMenuArgs,
})
if self.inSafeZone then
self.view.depot:InitDepot(GEnums.ItemValuableDepotType.Factory, function(itemId, cell)
self:_OnClickItem(itemId, cell)
end, {
canClear = true,
itemMoveTarget = UIConst.ITEM_MOVE_TARGET.FacMachine,
customItemInfoListPostProcess = function(allItemInfoList)
for _, info in ipairs(allItemInfoList) do
local isValid = self:_IsItemValid(info.id)
if not isValid then
info.missionSortId = info.missionSortId + 100
info.missionReverseSortId = -info.missionSortId
end
end
return allItemInfoList
end,
customOnUpdateCell = function(cell, itemBundle, luaIndex)
self:_RefreshItemSlotCellValidState(cell, itemBundle)
if self.m_args.customOnUpdateCell ~= nil then
self.m_args.customOnUpdateCell(cell, itemBundle, luaIndex, false)
end
cell.item.view.button.onIsNaviTargetChanged = function(active)
if active then
self:_TryDisableHoverBindingOnEmptyItem(cell, itemBundle)
if self.m_curNaviSelectComponentId ~= -1 then
end
end
end
self:_TryDisableHoverBindingOnEmptyItem(cell, itemBundle)
if self:_GetIsValidControllerNaviTarget(cell, itemBundle, true) then
local quickDropBindingId = cell.item:AddHoverBinding("common_quick_drop", function()
cell:QuickDrop()
end)
if self.m_args.adaptForceQuickDropKeyhintToGray then
self.m_cacheAllQuickDropBindingIds["DEPOT_" .. itemBundle.id] = quickDropBindingId
if self.m_allQuickDropBindingSetGray then
InputManagerInst:ForceBindingKeyhintToGray(quickDropBindingId, true)
end
end
if self.m_args.isFluidOnlyMachine then
local itemId = itemBundle.id
local isEmptyBottle = Tables.emptyBottleTable:ContainsKey(itemId)
local isFullBottle = Tables.fullBottleTable:ContainsKey(itemId)
local isBottle = isEmptyBottle or isFullBottle
if isBottle then
local quickDropText = isEmptyBottle and Language.LUA_ITEM_ACTION_FILL_LIQUID or Language.LUA_ITEM_ACTION_DUMP_LIQUID
InputManagerInst:SetBindingText(quickDropBindingId, quickDropText)
end
else
local quickDropBindingText = self.m_args.itemBagQuickDropBindingText
if not string.isEmpty(quickDropBindingText) then
InputManagerInst:SetBindingText(quickDropBindingId, quickDropBindingText)
end
end
else
if self.m_args.adaptForceQuickDropKeyhintToGray and self.m_cacheAllQuickDropBindingIds["DEPOT_" .. itemBundle.id] then
self.m_cacheAllQuickDropBindingIds["DEPOT_" .. itemBundle.id] = nil
end
end
self:_RefreshForbiddenItemActionMenuArgs(cell, itemBundle)
end,
customSetActionMenuArgs = self.m_args.customSetActionMenuArgs
})
end
self.m_dataInited = true
end
InventoryArea._OnValueChanged = HL.Method(HL.Boolean) << function(self, isOn)
if isOn == self.m_opening then
return
end
if isOn then
self:_Show(self.m_isItemBag)
else
self:_Hide()
end
end
InventoryArea._OnDropOnArea = HL.Method(HL.Boolean) << function(self, isItemBag)
if isItemBag ~= self.m_isItemBag then
self:_Show(isItemBag)
if isItemBag then
self.view.itemBag.itemBagContent:_FindAndHighlightForDrop()
else
self.view.depot.depotContent:_FindAndHighlightForDrop()
end
end
end
InventoryArea._OnDestroy = HL.Override() << function(self)
if not self.m_dataInited then
return
end
self.view.itemBag.itemBagContent:ReadCurShowingItems()
if self.inSafeZone then
self.view.depot.depotContent:ReadCurShowingItems()
end
end
InventoryArea.PlayAnimationOut = HL.Override() << function(self)
self:_Hide()
end
InventoryArea._OnClickItem = HL.Method(HL.String, HL.Forward('ItemSlot'), HL.Opt(HL.Number)) << function(self, itemId, cell, csIndex)
cell.item:Read()
if DeviceInfo.usingController then
cell.item:ShowActionMenu(true)
return
elseif DeviceInfo.usingKeyboard then
local itemMoveCheckFunc = self.m_args.itemMoveCheckFunc
local valid = itemMoveCheckFunc == nil or itemMoveCheckFunc()
if valid then
local mode = UIUtils.getMovingItemMode()
if mode then
local dragHelper = cell.view.dragItem.luaTable
if not cell.view.dragItem.enabled then
Notify(MessageConst.SHOW_TOAST, Language.LUA_QUICK_DROP_INVALID)
return
end
if dragHelper then
dragHelper = dragHelper[1]
local uiCtrl = self:GetUICtrl()
local itemMoveType = self.m_args.itemMoveType
if itemMoveType == UIConst.INVENTORY_AREA_ITEM_MOVE_TYPE.BAG_TO_DEPOT then
local scope = Utils.getCurrentScope()
local chapterId = Utils.getCurrentChapterId()
if csIndex then
GameInstance.player.inventory:ItemBagMoveToFactoryDepot(scope, chapterId, csIndex, mode)
else
GameInstance.player.inventory:FactoryDepotMoveToItemBag(scope, chapterId, itemId, mode)
end
return
end
local facCacheArea = uiCtrl.view.cacheArea
local core = GameInstance.player.remoteFactory.core
local chapterId = Utils.getCurrentChapterId()
if facCacheArea then
local cptId = facCacheArea:GetDropToComponentId(dragHelper)
if self.m_isItemBag then
core:Message_OpMoveItemBagToCache(chapterId, csIndex, cptId, 0, mode)
else
core:Message_OpMoveItemDepotToCache(chapterId, itemId, cptId, 0, mode)
end
return
else
local storageContent = uiCtrl.view.storageContent
if storageContent then
local cptId = storageContent.m_storage.componentId
if self.m_isItemBag then
core:Message_OpMoveItemBagToGridBox(chapterId, csIndex, cptId, 0, mode)
else
core:Message_OpMoveItemDepotToGridBox(chapterId, itemId, cptId, 0, mode)
end
return
else
local facCacheRepository = uiCtrl.view.facCacheRepository
if not facCacheRepository then
return
end
if facCacheRepository.m_isFluidCache then
Notify(MessageConst.SHOW_TOAST, Language.LUA_QUICK_DROP_INVALID)
return
end
local cptId = facCacheRepository.m_cache.componentId
if self.m_isItemBag then
core:Message_OpMoveItemBagToCache(chapterId, csIndex, cptId, 0, mode)
else
core:Message_OpMoveItemDepotToCache(chapterId, itemId, cptId, 0, mode)
end
return
end
end
end
end
end
end
cell.item:ShowTips()
end
InventoryArea._RefreshItemSlotCellValidState = HL.Method(HL.Userdata, HL.Any) << function(self, cell, itemBundle)
if itemBundle == nil then
return
end
local itemId = itemBundle.id
local isEmpty = string.isEmpty(itemId)
if isEmpty then
cell.view.forbiddenMask.gameObject:SetActive(false)
cell.view.dragItem.enabled = false
cell.view.dropItem.enabled = true
return
end
local isValid = self:_IsItemValid(itemId)
cell.view.forbiddenMask.gameObject:SetActive(not isValid)
cell.view.dragItem.enabled = isValid
cell.view.dropItem.enabled = isValid
if isValid and itemBundle.count and itemBundle.count == 0 then
if cell.view.dragItem ~= nil
and cell.view.dragItem.luaTable ~= nil
and cell.view.dragItem.luaTable[1] ~= nil
and cell.view.dragItem.luaTable[1].info ~= nil
and cell.view.dragItem.luaTable[1].info.count ~= nil then
cell.view.dragItem.luaTable[1].info.count = 0
end
end
end
InventoryArea._IsItemValid = HL.Method(HL.String).Return(HL.Boolean) << function(self, itemId)
if string.isEmpty(itemId) then
return true
end
if self.m_cellValidStateCache[itemId] == nil then
local itemValid
local customCheckItemValid = self.m_args.customCheckItemValid
if customCheckItemValid then
itemValid = customCheckItemValid(itemId)
else
local success, factoryItemData = Tables.factoryItemTable:TryGetValue(itemId)
if not success then
logger.error("Can't find in factoryItemTable", itemId)
return false
end
itemValid = factoryItemData.buildingBufferStackLimit > 0
end
self.m_cellValidStateCache[itemId] = itemValid
end
return self.m_cellValidStateCache[itemId]
end
InventoryArea._InitDepotLockInBlackbox = HL.Method() << function(self)
local isLocked = Utils.isDepotManualInOutLocked()
self.view.depot.view.forbiddenMask.gameObject:SetActive(isLocked)
self.view.depot.view.depotContent:ToggleAcceptDrop(not isLocked)
self.m_isDepotLocked = isLocked
if isLocked then
self.view.moveItemMouseHintNode.gameObject:SetActive(false)
end
end
InventoryArea.LockInventoryArea = HL.Method(HL.Boolean) << function(self, isLocked)
local isDepotLocked = isLocked or self.m_isDepotLocked
self.view.itemBag.view.forbiddenMask.gameObject:SetActive(isLocked)
self.view.depot.view.forbiddenMask.gameObject:SetActive(isDepotLocked)
self.view.itemBag.view.itemBagContent:ToggleCanDrop(not isLocked)
self.view.depot.view.depotContent:ToggleAcceptDrop(not isDepotLocked)
end
InventoryArea.SetState = HL.Method(HL.String) << function(self, stateName)
self.view.stateCtrl:SetState(stateName)
end
InventoryArea.m_itemBagNaviGroup = HL.Field(HL.Userdata)
InventoryArea.m_depotNaviGroup = HL.Field(HL.Userdata)
InventoryArea.m_confirmSelectFluidBindingId = HL.Field(HL.Number) << -1
InventoryArea.m_cancelSelectFluidBindingId = HL.Field(HL.Number) << -1
InventoryArea.m_curNaviSelectComponentId = HL.Field(HL.Number) << -1
InventoryArea.m_curNaviSelectFluidId = HL.Field(HL.String) << ""
InventoryArea.m_curNaviSelectBagIndex = HL.Field(HL.Number) << -1
InventoryArea.m_curNaviSelectDepotItemId = HL.Field(HL.String) << ""
InventoryArea._InitInventoryAreaController = HL.Method() << function(self)
self.m_itemBagNaviGroup = self.view.itemBag.view.itemBagContent.view.itemListSelectableNaviGroup
self.m_depotNaviGroup = self.view.depot.view.depotContent.view.itemListSelectableNaviGroup
self:_RefreshItemBagGetDefaultNaviTargetFunc()
self:BindInputPlayerAction("fac_inventory_area_switch", function()
local nextIsItemBag
if self.m_isItemBag and self.m_itemBagNaviGroup.IsTopLayer then
nextIsItemBag = false
elseif not self.m_isItemBag and self.m_depotNaviGroup.IsTopLayer then
nextIsItemBag = true
end
self:_Show(not self.m_isItemBag, false)
if nextIsItemBag ~= nil then
self:NaviToPart(nextIsItemBag, true)
end
end)
self.m_confirmSelectFluidBindingId = UIUtils.bindInputPlayerAction("fac_move_to_in_cache_slot_confirm", function()
self:_OnNaviTargetToSelectFluidConfirm()
end, self.view.inputGroup.groupId)
self.m_cancelSelectFluidBindingId = UIUtils.bindInputPlayerAction("common_cancel", function()
self:_ClearSelectFluidBinding()
end, self.view.inputGroup.groupId)
InputManagerInst:ToggleBinding(self.m_confirmSelectFluidBindingId, false)
InputManagerInst:ToggleBinding(self.m_cancelSelectFluidBindingId, false)
end
InventoryArea._OnNaviTargetToSelectFluidConfirm = HL.Method() << function(self)
if self.m_isItemBag then
local csIndex, slot = self.view.itemBag.itemBagContent:GetCurNaviTargetSlot()
if csIndex ~= -1 and self:_CheckBottleDrop(slot.item.id, self.m_curNaviSelectFluidId) then
local core = GameInstance.player.remoteFactory.core
core:Message_OpFillingFluidComWithBag(Utils.getCurrentChapterId(), self.m_curNaviSelectComponentId, csIndex)
self:_ClearSelectFluidBinding()
return
end
else
local csIndex, slot = self.view.depot.depotContent:GetCurNaviTargetSlot()
if csIndex ~= -1 and self:_CheckBottleDrop(slot.item.id, self.m_curNaviSelectFluidId) then
local core = GameInstance.player.remoteFactory.core
core:Message_OpFillingFluidComWithDepot(Utils.getCurrentChapterId(), self.m_curNaviSelectComponentId, slot.item.id)
self:_ClearSelectFluidBinding()
return
end
end
end
InventoryArea._ClearSelectFluidBinding = HL.Method() << function(self)
self.m_curNaviSelectComponentId = -1
self.m_curNaviSelectFluidId = ""
self.m_curNaviSelectBagIndex = -1
self.m_curNaviSelectDepotItemId = ""
self.m_itemBagNaviGroup.enablePartner = true
self.m_depotNaviGroup.enablePartner = true
InputManagerInst:ToggleBinding(self.m_confirmSelectFluidBindingId, false)
InputManagerInst:ToggleBinding(self.m_cancelSelectFluidBindingId, false)
Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.inputGroup.groupId)
Notify(MessageConst.FAC_ON_MOVE_HIDE_CONTROLLER_MODE_HINT)
end
InventoryArea._CheckBottleDrop = HL.Method(HL.String, HL.Opt(HL.String)).Return(HL.Boolean) << function(self, itemId, liquidId)
if string.isEmpty(liquidId) then
return Tables.emptyBottleTable:ContainsKey(itemId)
else
local fullBottleSuccess, fullBottleData = Tables.fullBottleTable:TryGetValue(itemId)
if fullBottleSuccess then
return fullBottleData.liquidId == liquidId
end
end
return false
end
InventoryArea._OnNaviTargetToSelectFluid = HL.Method(HL.Table) << function(self, args)
self.m_curNaviSelectComponentId = args.componentId
self.m_curNaviSelectFluidId = args.fluidId
InputManagerInst:ToggleBinding(self.m_confirmSelectFluidBindingId, true)
InputManagerInst:ToggleBinding(self.m_cancelSelectFluidBindingId, true)
local ctrl = self:GetUICtrl()
Notify(MessageConst.SHOW_AS_CONTROLLER_SMALL_MENU, {
panelId = ctrl.panelId,
isGroup = true,
id = self.view.inputGroup.groupId,
hintPlaceholder = ctrl.view.controllerHintPlaceholder,
noHighlight = true,
rectTransform = self.view.rectTransform,
})
local textId = string.isEmpty(args.fluidId) and "LUA_ITEM_ACTION_CACHE_SELECT_FILL_LIQUID" or "LUA_ITEM_ACTION_CACHE_SELECT_DUMP_LIQUID"
Notify(MessageConst.FAC_ON_MOVE_SHOW_CONTROLLER_MODE_HINT, Language[textId])
if self.m_isItemBag then
self.view.itemBag.itemBagContent:CheckAndNaviToTargetCell(function(itemId)
return self:_CheckBottleDrop(itemId, self.m_curNaviSelectFluidId)
end)
else
self.view.depot.depotContent:CheckAndNaviToTargetCell(function(itemId)
return self:_CheckBottleDrop(itemId, self.m_curNaviSelectFluidId)
end)
end
self.m_itemBagNaviGroup.enablePartner = false
self.m_depotNaviGroup.enablePartner = false
end
InventoryArea._OnNaviChangeTargetToSelectFluid = HL.Method(HL.String, HL.Any) << function(self, itemId, arg)
if self.m_isItemBag then
self.m_curNaviSelectBagIndex = arg
else
self.m_curNaviSelectDepotItemId = arg
end
InputManagerInst:ToggleBinding(self.m_confirmSelectFluidBindingId, self:_CheckBottleDrop(itemId, self.m_curNaviSelectFluidId))
end
InventoryArea.AddNaviGroupSwitchInfo = HL.Method(HL.Table) << function(self, naviGroupInfos)
if self.m_isItemBag then
table.insert(naviGroupInfos, self:GetItemBagNaviGroupSwitchInfo())
else
if self.inSafeZone then
table.insert(naviGroupInfos, self:GetDepotNaviGroupSwitchInfo())
end
end
end
InventoryArea.GetItemBagNaviGroupSwitchInfo = HL.Method().Return(HL.Table) << function(self)
return {
naviGroup = self.m_itemBagNaviGroup,
text = Language.LUA_INV_NAVI_SWITCH_TO_ITEM_BAG,
forceDefault = true,
beforeSwitch = function()
self:_Show(true)
end
}
end
InventoryArea.GetDepotNaviGroupSwitchInfo = HL.Method().Return(HL.Table) << function(self)
return {
naviGroup = self.m_depotNaviGroup,
text = Language.LUA_INV_NAVI_SWITCH_TO_DEPOT,
forceDefault = true,
beforeSwitch = function()
self:_Show(false)
end
}
end
InventoryArea._RefreshItemBagGetDefaultNaviTargetFunc = HL.Method() << function(self)
self.m_itemBagNaviGroup.getDefaultSelectableFunc = function()
local itemList = self.view.itemBag.view.itemBagContent.view.itemList
local firstIndex = itemList:GetShowingCellsIndexRange()
local itemSlot = self.view.itemBag.view.itemBagContent:GetCell(LuaIndex(firstIndex))
return itemSlot.view.item.view.button
end
self.m_depotNaviGroup.getDefaultSelectableFunc = function()
local itemList = self.view.depot.view.depotContent.view.itemList
local firstIndex = itemList:GetShowingCellsIndexRange()
local itemSlot = self.view.depot.view.depotContent:GetCell(LuaIndex(firstIndex))
return itemSlot.view.item.view.button
end
end
InventoryArea._TryDisableHoverBindingOnEmptyItem = HL.Method(HL.Forward("ItemSlot"), HL.Opt(HL.Any)) << function(self, cell, itemBundle)
if self:_GetIsValidControllerNaviTarget(cell, itemBundle, false) then
return
end
InputManagerInst:ToggleBinding(cell.item.view.button.hoverConfirmBindingId, false)
end
InventoryArea._GetIsValidControllerNaviTarget = HL.Method(HL.Forward("ItemSlot"), HL.Any, HL.Boolean).Return(HL.Boolean) << function(self, cell, itemBundle, considerForbidden)
if itemBundle ~= nil and not string.isEmpty(itemBundle.id) then
if itemBundle.count and itemBundle.count <= 0 then
return false
end
if considerForbidden then
local isForbidden = not self.m_cellValidStateCache[itemBundle.id] or cell.view.forbiddenMask.gameObject.activeSelf
if isForbidden then
return false
end
end
if cell:_GetQuickDropTarget() then
return true
end
end
return false
end
InventoryArea._RefreshForbiddenItemActionMenuArgs = HL.Method(HL.Forward("ItemSlot"), HL.Any) << function(self, cell, itemBundle)
if itemBundle == nil then
return
end
local isForbidden = not self.m_cellValidStateCache[itemBundle.id] or cell.view.forbiddenMask.gameObject.activeSelf
if isForbidden then
cell.item.actionMenuArgs = {}
end
end
InventoryArea.NaviToPart = HL.Method(HL.Boolean, HL.Boolean) << function(self, toItemBag, toTop)
if toItemBag then
if toTop then
self.view.itemBag.itemBagContent.view.itemList:SetTop()
end
local cell = self.view.itemBag.itemBagContent:GetCell(1)
if cell then
cell:SetAsNaviTarget()
end
else
if toTop then
self.view.depot.depotContent.view.itemList:SetTop()
end
self.view.depot:SetAsNaviTarget()
end
end
InventoryArea.IsNaviGroupTopLayer = HL.Method(HL.Boolean).Return(HL.Boolean) << function(self, isItemBag)
if isItemBag then
return self.m_itemBagNaviGroup.IsTopLayer
end
return self.m_depotNaviGroup.IsTopLayer
end
InventoryArea.ToggleAllQuickDropBindings = HL.Method(HL.Boolean) << function(self, active)
if not self.m_cacheAllQuickDropBindingIds then
return
end
for i, bindingId in pairs(self.m_cacheAllQuickDropBindingIds) do
InputManagerInst:ToggleBinding(bindingId, active)
end
end
InventoryArea.SetAllQuickDropBindingGray = HL.Method(HL.Boolean) << function(self, grayState)
if not self.m_args.adaptForceQuickDropKeyhintToGray then
return
end
self.m_allQuickDropBindingSetGray = grayState
for index, bingdingId in pairs(self.m_cacheAllQuickDropBindingIds) do
InputManagerInst:ForceBindingKeyhintToGray(bingdingId, grayState)
end
end
HL.Commit(InventoryArea)
return InventoryArea