Files
barotrauma-localmods/QuickStackToBag/Lua/Cyka/utils.lua
2025-03-30 14:36:16 +02:00

88 lines
3.1 KiB
Lua

-- We got to do this shit because enqueueInventory calls enqueueItem
-- And enqueueItem calls enqueueInventory
-- So unless we define them both before using them
-- We will get an error saying either is undefined
local enqueueItem
local enqueueSlot
local enqueueInventory
local _
---@param item Barotrauma.Item
---@param queue Barotrauma.Item[]
---@param predicate? fun(item: Barotrauma.Item): boolean
---@return Barotrauma.Item[], string?
enqueueItem = function(item, queue, predicate)
queue = queue or {}
predicate = predicate or function() return true end
-- debugPrint(string.format("Enqueuing item: %s", item.Prefab.Identifier.Value))
-- local err
-- This should make it breadth first, right...?
-- No, not yet...
local ok, stop = predicate(item)
if ok then
queue[#queue + 1] = item
end
if stop then return queue, "Stop" end
if item.OwnInventory then
-- As far as I know every item has only one inventory
-- Only machines have multiple
-- So inventrorY should be fine here
-- debugPrint("Item has its own inventory, enqueuing inventory...")
queue, _ = enqueueInventory(item.OwnInventory, queue, predicate)
-- if err then
-- debugPrint(string.format("Error enqueuing inventory: %s", err))
-- end
end
-- debugPrint(string.format("Item enqueued. Current queue size: %d", #queue))
return queue, nil
end
---@param slot Barotrauma.ItemInventory.Slot
---@param queue Barotrauma.Item[]
---@param predicate? fun(item: Barotrauma.Item): boolean
---@return Barotrauma.Item[], string?
enqueueSlot = function(slot, queue, predicate)
queue = queue or {}
predicate = predicate or function() return true end
-- debugPrint(string.format("Enqueuing slot with %d items.", #slot.items))
-- We don't want to shadow queue
local err
-- If the slot is empty there's nothing to iterate
-- And we will naturally return queue as is
for _, item in ipairs(slot.items) do
-- Only the final leaf nodes decide upon the predicate
queue, err = enqueueItem(item, queue, predicate)
if err then
return queue, err
end
end
-- debugPrint(string.format("Finished enqueuing slot. Current queue size: %d", #queue))
return queue
end
---@param inventory Barotrauma.ItemInventory
---@param queue Barotrauma.Item[]
---@param predicate? fun(item: Barotrauma.Item): boolean
---@return Barotrauma.Item[], string?
enqueueInventory = function(inventory, queue, predicate)
queue = queue or {}
predicate = predicate or function() return true end
-- debugPrint(string.format("Enqueuing inventory with %d slots.", #inventory.slots))
local err
for _, slot in ipairs(inventory.slots) do
-- Only the final leaf nodes decide upon the predicate
queue, err = enqueueSlot(slot, queue, predicate)
if err then
return queue, err
end
end
-- debugPrint(string.format("Finished enqueuing inventory. Current queue size: %d", #queue))
return queue
end
return {
enqueueItem = enqueueItem,
enqueueSlot = enqueueSlot,
enqueueInventory = enqueueInventory
}