bayuMIR/client/dev/GUILayout/storage/Storage.lua
2026-06-12 02:32:15 +08:00

385 lines
13 KiB
Lua

Storage = {}
-- 存取模式
local STORE_MODE = {
normal = 1, -- 普通的双击存取
quick = 2, -- 快速存取
}
function Storage.Init(isWin32)
Storage._lockImg = "res/public/icon_tyzys_01.png"
Storage._PWidth = isWin32 and 336 or 508 -- 容器可见区域 宽
Storage._PHeight = isWin32 and 254.4 or 384 -- 容器可见区域 高
Storage._PerPageNum = 48
Storage._PerRowItemNum = 8
Storage._PerColItemNum = 6
Storage._MaxPage = 5
Storage._selPage = 0 -- 当前选中的页签
Storage._pageBtns = {}
Storage._defaultNum = 48 -- 官方默认仓库格子数量
Storage._isBig = false -- 是否单页大仓库
end
function Storage.main()
local data = GUI:GetLayerOpenParam()
local page = data and data.initPage
local parent = GUI:Win_Create(UIConst.LAYERID.NPCStorageGUI, 0, 0, 0, 0, false, false, true, true)
local isWin32 = SL:GetValue("IS_PC_OPER_MODE")
GUI:LoadExport(parent, isWin32 and "bag/storage_layer_win32" or "bag/storage_layer")
-- 初始化数据
Storage.Init(isWin32)
Storage._ui = GUI:ui_delegate(parent)
Storage._openedCount = SL:GetValue("STORAGE_OPEN_SIZE")
Storage._PerPageNum = Storage._PerPageNum or GUIDefine.STORAGE_PER_PAGE_MAX
-- 取实际容器大小
Storage._PHeight = GUI:getContentSize(Storage._ui["Panel_items"]).height
Storage._PWidth = GUI:getContentSize(Storage._ui["Panel_items"]).width
local screenH = SL:GetValue("SCREEN_HEIGHT")
local pSizeH = GUI:getContentSize(Storage._ui["Panel_1"]).height
local isWinMode = SL:GetValue("IS_PC_OPER_MODE")
if isWinMode then
GUI:setPositionY(Storage._ui["Panel_1"], screenH - pSizeH / 2 - 70)
else
GUI:setPositionY(Storage._ui["Panel_1"], screenH / 2 + 20)
end
local storage_row_col = SL:GetValue("GAME_DATA", "bag_storage_row_col_max")
if isWinMode and storage_row_col then
local slices = SL:Split(storage_row_col, "|")
Storage._PerRowItemNum = tonumber(slices[1]) or 8
Storage._PerColItemNum = tonumber(slices[2]) or 6
Storage._PerPageNum = Storage._PerRowItemNum * Storage._PerColItemNum
-- 隐藏页签
if Storage._PerPageNum > Storage._defaultNum then
Storage._isBig = true
for i = 1, Storage._MaxPage do
local pageBtn = Storage._ui["Button_page" .. i]
GUI:setVisible(pageBtn, false)
end
end
end
SL:SetValue("STORAGE_PAGE_INDEX", Storage._selPage)
SL:SetValue("STORAGE_TOUCH_TYPE", STORE_MODE.normal)
Storage._root = Storage._ui.Panel_1
Storage._panelItems = Storage._root:getChildByName("Panel_items")
-- 界面拖动
GUI:Win_SetDrag(parent, Storage._ui["Panel_1"])
Storage.InitUI()
Storage.InitMouseEvent()
-- 初始化右侧页签
Storage.InitPage()
Storage.PageTo(page or 1)
Storage.UpdateItemList()
SL:AttachTXTSUI({
root = Storage._root,
index = SLDefine.SUIComponentTable.Storage
})
Storage.RegisterEvent()
-- 交易行 截图节点 请勿删除
Storage._screenshotRootNode = Storage._ui["Panel_1"]
end
function Storage.InitPage()
local openNum = SL:GetValue("GAME_DATA", "warehouse_max_num") or 240
SL:Print("仓库最大格子数量:", openNum)
-- 当前最大显示几页
Storage._openPage = math.ceil(openNum / Storage._PerPageNum)
Storage._openPage = math.max(Storage._openPage, 1)
Storage._openPage = math.min(Storage._openPage, Storage._MaxPage)
for i = 1, Storage._MaxPage do
local pageBtn = Storage._ui["Button_page" .. i]
GUI:setVisible(pageBtn, false)
if Storage._openPage ~= 1 and i <= Storage._openPage then
GUI:setVisible(pageBtn, true)
GUI:setTag(pageBtn, i)
Storage._pageBtns[i] = pageBtn
GUI:addOnClickEvent(GUI:getChildByName(pageBtn, "TouchSize"), function()
Storage.PageTo(i)
Storage.UpdateItemList()
end)
end
end
end
function Storage.PageTo(page)
if Storage._selPage == page then
return false
end
SL:SetValue("STORGE_PAGE_CUR", page)
Storage._selPage = page
Storage.SetPageBtnStatus()
end
function Storage.SetPageBtnStatus()
for i = 1, Storage._openPage do
local btnPage = Storage._pageBtns[i]
if btnPage then
local isPress = i == Storage._selPage and true or false
GUI:Button_setBright(btnPage, not isPress)
GUI:setLocalZOrder(btnPage, isPress and Storage._openPage + 1 or GUI:getTag(btnPage))
local pageText = GUI:getChildByName(btnPage, "PageText")
GUI:Text_setTextColor(pageText, isPress and "#f8e6c6" or "#807256")
GUI:setScale(pageText, isPress and 1 or 0.9)
end
end
end
function Storage.InitMouseEvent()
local function addItemIntoStorage(touchPos)
local state = SL:GetValue("ITEM_MOVE_STATE")
if state then
local goToName = GUIDefine.ItemGoTo.STORAGE
local data = {}
data.target = goToName
data.pos = touchPos
SL:ItemMoveCheck(data)
else
return -1
end
end
local function setNoSwallowMouse()
return -1
end
local addItemPanel = GUI:getChildByName(Storage._root, "Panel_itemstouch")
GUI:setSwallowTouches(addItemPanel, false)
GUI:addMouseButtonEvent(addItemPanel, {
onRightDownFunc = setNoSwallowMouse,
onSpecialRFunc = addItemIntoStorage
})
end
function Storage.InitUI()
-- 关闭
local btnClose = GUI:getChildByName(Storage._root, "Button_close")
local function closePanel()
UIOperator:CloseNpcStorageUI()
end
GUI:addOnClickEvent(btnClose, closePanel)
-- 快速存取
local btnQuickPut = GUI:getChildByName(Storage._root, "Button_quick")
local function quickPut(sender)
local touchType = SL:GetValue("STORAGE_TOUCH_TYPE")
if touchType == STORE_MODE.normal then
touchType = STORE_MODE.quick
else
touchType = STORE_MODE.normal
end
SL:SetValue("STORAGE_TOUCH_TYPE", touchType)
local text = touchType == STORE_MODE.normal and "快速存取" or "取消选中"
GUI:Button_setTitleText(sender, text)
end
GUI:addOnClickEvent(btnQuickPut, quickPut)
-- 整理仓库
local btnRefresh = GUI:getChildByName(Storage._root, "Button_reset")
local function refreshStorage()
GUI:delayTouchEnabled(btnRefresh, 0.5)
SL:ArrangeStorageData(Storage._selPage)
Storage._resetList = true
Storage.UpdateItemList()
end
GUI:addOnClickEvent(btnRefresh, refreshStorage)
end
function Storage.UpdateItemList(page)
GUI:removeAllChildren(Storage._panelItems)
local maxHeight = Storage._PHeight
local maxWidth = Storage._PWidth
local itemHeight = maxHeight / Storage._PerColItemNum
local itemWidth = maxWidth / Storage._PerRowItemNum
local notOpenedIndex = Storage._selPage * Storage._PerPageNum - Storage._openedCount
if notOpenedIndex > 0 then
local clockPos = Storage._PerPageNum - notOpenedIndex + 1
local noOpen = math.floor(notOpenedIndex / Storage._PerPageNum)
clockPos = noOpen > 0 and 1 or clockPos
for i = clockPos, Storage._PerPageNum do
local gridY = math.floor((clockPos - 1) / Storage._PerRowItemNum)
local gridX = (clockPos - 1) % Storage._PerRowItemNum
local posX = gridX * itemWidth + itemWidth / 2
local posY = maxHeight - itemHeight / 2 - itemHeight * gridY
local clockImage = GUI:Image_Create(Storage._panelItems, "clock" .. i, posX, posY,
Storage._lockImg or SLDefine.PATH_RES_PUBLIC .. "icon_tyzys_01.png")
GUI:setScale(clockImage, SL:GetValue("IS_PC_OPER_MODE") and 0.7 or 1)
GUI:setAnchorPoint(clockImage, 0.5, 0.5)
GUI:setTouchEnabled(clockImage, true)
GUI:addOnClickEvent(clockImage, function()
ssrMessage:sendmsg(ssrNetMsgCfg.open_storagecount)
end)
clockPos = clockPos + 1
end
end
local itemDataList = {}
if Storage._isBig then
itemDataList = SL:GetValue("NPC_STORAGE_DATA")
else
itemDataList = SL:GetValue("NPC_STORAGE_DATA_BY_PAGE", Storage._selPage)
end
if not itemDataList or next(itemDataList) == nil then
return
end
Storage._resetList = false
local pos = 1
for _, data in pairs(itemDataList) do
if pos > Storage._selPage * Storage._PerPageNum then
break
end
local info = {}
info.itemData = data
info.index = data.Index
info.look = true
info.movable = true
info.starLv = true
info.from = GUIDefine.ItemFrom.STORAGE
local gridY = math.floor((pos - 1) / Storage._PerRowItemNum)
local gridX = (pos - 1) % Storage._PerRowItemNum
local posX = gridX * itemWidth + itemWidth / 2
local posY = maxHeight - itemHeight / 2 - itemHeight * gridY
local goodItem = GUI:ItemShow_Create(Storage._panelItems, "goodItem" .. pos, posX, posY, info)
GUI:setStrTag(goodItem, data.MakeIndex)
GUI:setAnchorPoint(goodItem, 0.5, 0.5)
-- 取出物品
local function putOutStorageItem()
UIOperator:CloseItemTips()
SL:RequestPutOutStorageData(data)
GUI:delayTouchEnabled(goodItem)
end
-- 单击
GUI:ItemShow_addReplaceClickEvent(goodItem, function()
local touchType = SL:GetValue("STORAGE_TOUCH_TYPE")
local isQuick = touchType == STORE_MODE.quick
if isQuick then
putOutStorageItem()
end
return not isQuick
end)
if SL:GetValue("IS_PC_OPER_MODE") then
local function mouseMoveCallBack()
if goodItem._movingState then
return
end
local tipsData = {}
tipsData.itemData = data
tipsData.pos = GUI:getWorldPosition(goodItem)
UIOperator:OpenItemTips(tipsData)
end
local function leaveItem()
UIOperator:CloseItemTips()
end
GUI:addMouseMoveEvent(goodItem, {
onEnterFunc = mouseMoveCallBack,
onLeaveFunc = leaveItem
})
-- 双击和右键取出
GUI:addMouseButtonEvent(goodItem, {
onRightDownFunc = putOutStorageItem,
onDoubleLFunc = putOutStorageItem
})
else
-- 双击取出
GUI:ItemShow_addDoubleEvent(goodItem, putOutStorageItem)
end
pos = pos + 1
end
end
function Storage.UpdateStorageItemState(data)
if data and next(data) then
if data.resetItem then
Storage.UpdatePutOutData(data.resetItem)
end
end
end
function Storage.UpdatePutOutData(data)
if data and next(data) then
local onPutOutNode = GUI:getChildByStrTag(Storage._panelItems, data.MakeIndex)
if onPutOutNode then
GUI:setVisible(onPutOutNode, data.state and data.state > 0)
onPutOutNode._movingState = not (data.state and data.state > 0)
end
end
end
function Storage.UpdateStorageOpenNum()
local lastIndex = math.min(Storage._openedCount - (Storage._selPage - 1) * Storage._PerPageNum, Storage._PerPageNum)
Storage._openedCount = SL:GetValue("STORAGE_OPEN_SIZE")
local openIndex = math.min(Storage._openedCount - (Storage._selPage - 1) * Storage._PerPageNum, Storage._PerPageNum)
if openIndex > 0 then
if openIndex <= lastIndex then
return
end
for i = lastIndex + 1, openIndex do
if GUI:getChildByName(Storage._panelItems, "clock_" .. i) then
GUI:removeChildByName(Storage._panelItems, "clock_" .. i)
end
end
end
end
function Storage.OnCloseLayer()
UIOperator:CloseNpcMakeDrugUI()
end
function Storage.OnClose(UID)
if UID ~= UIConst.LAYERID.NPCStorageGUI then
return false
end
Storage.UnRegisterEvent()
SL:SetValue("STORAGE_TOUCH_TYPE", 0)
SL:UnAttachTXTSUI({
index = SLDefine.SUIComponentTable.Storage
})
end
function Storage.RegisterEvent()
SL:RegisterLUAEvent(LUA_EVENT_CLOSEWIN, "Storage", Storage.OnClose)
SL:RegisterLUAEvent(LUA_EVENT_NPC_TALK_CLOSE, "Storage", Storage.OnCloseLayer)
SL:RegisterLUAEvent(LUA_EVENT_STORAGE_DATA_UPDATE, "Storage", Storage.UpdateItemList)
SL:RegisterLUAEvent(LUA_EVENT_STORAGE_ITEM_STATE, "Storage", Storage.UpdateStorageItemState)
SL:RegisterLUAEvent(LUA_EVENT_STORAGE_SIZE_CHANGE, "Storage", Storage.UpdateStorageOpenNum)
end
function Storage.UnRegisterEvent()
SL:UnRegisterLUAEvent(LUA_EVENT_CLOSEWIN, "Storage")
SL:UnRegisterLUAEvent(LUA_EVENT_NPC_TALK_CLOSE, "Storage")
SL:UnRegisterLUAEvent(LUA_EVENT_STORAGE_DATA_UPDATE, "Storage")
SL:UnRegisterLUAEvent(LUA_EVENT_STORAGE_ITEM_STATE, "Storage")
end
Storage.main()