Skip to main content

Inventory

Snapshot of the bot's inventory at capture time. Re-call client:inventory() (or getInventory()) to refresh — values don't auto-update.

local client = getClient()
local inventory = client:inventory() -- or getInventory()

inventory.slots -- total slot count
inventory.items -- table keyed by inventory key

-- Lookups
inventory:getItem(invKey)
inventory:getItem(blockType, invType)

for invKey, item in pairs(inventory.items) do
item.id -- block type
item.type -- inventory item type (see below)
item.amount
end

Constructors

getInventory()

FieldType
Signature() → Inventory
ReturnsInventory — fresh snapshot of the parent bot's cells
Common errors"getInventory: no parent client" (script has no bound bot), "getInventory: parent client not found"
Asyncyes

Shortcut for getClient():inventory(). Errors when no parent is bound (e.g. running from the global executor).

client:inventory()

FieldType
Signature(self: Client) → Inventory
ReturnsInventory — snapshot of this bot's cells
Asyncyes

Same as getInventory() but lets you target a sibling bot resolved via getClient(key).

Fields

inventory.slots

FieldType
SignatureInventory.slots: number
Returnsnumber — count of cells currently in use

The protocol has no separate "max slots" surface — call client:expandInventory() to grow it.

inventory.items

FieldType
SignatureInventory.items: {[number]: InventoryItem}
Returns{[number]: InventoryItem} — cells keyed by invKey = (inventory_type << 16) | block_id

The composite key lets the same block_id live in two cells when it exists as both a Block and a Seed (e.g. Obsidian + Obsidian Seed).

for invKey, item in pairs(inventory.items) do
print(invKey, item.id, item.type, item.amount, item.name)
end

Lookups

inventory:getItem(invKey)

FieldType
Signature(self: Inventory, invKey: number) → InventoryItem?
ReturnsInventoryItem?nil when no cell matches
Asyncno
local seedKey = (InventoryItemType.seed << 16) | 9 -- Obsidian Seed
local item = inventory:getItem(seedKey)

inventory:getItem(blockType, invType)

FieldType
Signature(self: Inventory, blockType: number, invType: number) → InventoryItem?
ReturnsInventoryItem?nil when no cell matches
Asyncno

invType is the raw InventoryItemType enum (0..12) — the boundary handles the upper-byte packing for you, so getItem(9, InventoryItemType.seed) resolves to the Obsidian Seed cell.

local item = inventory:getItem(9, InventoryItemType.seed)

InventoryItem fields

FieldTypeNotes
idnumberBlock id (same number you'd pass to client:place).
typenumberRaw InventoryItemType enum (0..12), unpacked.
amountnumberStack count.
namestringFrom block_types.json; falls back to "#<id>".

Inventory item types

InventoryItemType.block -- 0 (default)
InventoryItemType.background -- 1
InventoryItemType.seed -- 2 (use client:plant shortcut)
InventoryItemType.water -- 3
InventoryItemType.wearable -- 4
InventoryItemType.weapon -- 5
InventoryItemType.throwable -- 6
InventoryItemType.consumable -- 7
InventoryItemType.shard -- 8
InventoryItemType.blueprint -- 9
InventoryItemType.familiar -- 10
InventoryItemType.food -- 11 (FAMFood)
InventoryItemType.wiring -- 12

Drop, trash, equip, expand and use are on the client.