Skip to main content
forge-items owns immutable item definitions and the helpers to create and reason about item instances. It has no opinion on where items live; inventory, equipment, loot, crafting, and economy all consume definitions and pass instances around.

Concepts

  • Definition. A stable item:<name> with type, label, weight, rarity, stack size, tags, and optional open blocks (equip, weapon, use). Immutable, shared on server and client.
  • Instance. A value object: { instanceId, defId, quantity, durability?, meta }. The holder (inventory, drop, equipment) persists it; there is no separate items table.
  • Open blocks. Definitions are open tables. Consumer packages read their own blocks; unknown blocks ride along untouched.

Exports

Definitions

ExportSignatureReturns
RegisterItemRegisterItem(def)Result
RegisterItemsRegisterItems(list)Result
GetDefinitionGetDefinition(id)Result{ data = { definition } }
HasDefinitionHasDefinition(id)boolean
GetDefinitionsGetDefinitions(filter)Result{ data = { items } }, filter by type/tag/rarity
GetRaritiesGetRarities()Result
GetDisplayGetDisplay(instance)label/icon/color/rarity/weight for UI

Instances

ExportSignatureReturns
CreateInstanceCreateInstance(item_id, opts)Result{ data = { instance } } (mints a unique instanceId)
ValidateInstanceValidateInstance(instance)Result, reject items whose def no longer exists or whose meta is illegal
CanStackCanStack(a, b)boolean
StackMergeStackMerge(into, from)merge stacks
SplitSplit(instance, qty)split a stack
GetWeightGetWeight(instance)total weight
ApplyDurabilityApplyDurability(instance, delta)durability math (nil max = indestructible)

Definition shape

exports["forge-items"]:RegisterItem({
  id = "item:iron_sword", type = "weapon", label = "Iron Sword",
  stackSize = 1, weight = 1.5, rarity = "common",
  tags = { "weapon", "melee" },
  equipSlot = "slot:mainhand",   -- read by forge-equipment
  maxDurability = 100,           -- optional; nil = indestructible
  useable = false,
  -- equip = { ... }, weapon = { ... }, use = { ... }  -- optional open blocks
})
See add an item for the full walk, including equippable items.

Configuration

Ships a small neutral starter set (bandage, bread, water, cloth, simple dagger, coin) in editable shared/data/items.lua (ForgeItems.DefaultItems), gated by Config.ShipDefaults. Rarities are creator-configurable in Config.Rarities.
forge-items depends on forge-core only. It has no character_id and no per-character state. Everything above it in the stack depends on forge-items.