Skip to content

Storage and Animations

Dan Alexander edited this page Nov 3, 2026 · 1 revision

Inventories and use animations

Furniture can expose a persistent chest-style inventory. Its size must be a multiple of nine from 9 through 54. An optional animation.use item selects a different render model while at least one player has that inventory open. For furniture without an inventory, the same animation.use field acts as a persistent right-click toggle: each interaction switches between the normal model and the use model, and the selected state survives restarts:

items:
  oak_bench:
    material: OAK_PLANKS
    display_name: "&fOak Bench"
    render:
      model: voxel:furniture/basic/bench/oak_bench
    properties:
      furniture:
        renderer: auto
        rotation_step: 90
        animation:
          use: voxel:oak_bench_open
          close_delay: 10
        inventory:
          size: 27

  oak_bench_open:
    extends: oak_bench
    abstract: true
    render:
      model: voxel:furniture/basic/bench/oak_bench_open

Players with voxelfurniture.inventory open the inventory by interacting with inventory furniture. All simultaneous viewers share the same live inventory. The use model remains active until the last viewer closes it, then the furniture returns to its current base or blockstate model. Contents persist in furniture.yml, are saved on close and shutdown, and drop when the furniture is broken.

For furniture without an inventory, right-clicking toggles animation.use on or off instead. This state is persisted with the furniture instance and survives restarts, content synchronization, blockstate refreshes, and dye changes. A dye interaction takes priority, so recolouring dyeable furniture does not also toggle its use animation. The animation model must reference a renderable VoxelCore item; an abstract item is recommended so it cannot be obtained directly. The inventory title can be specified independently with properties.furniture.inventory.title. It supports the same legacy color codes and VoxelCore font/UI placeholders as the previous inventory title. If title is omitted, the inventory continues to use the furniture item's resolved display_name for backwards compatibility. Within a custom title, <name> and <item> are interchangeable tokens that insert the furniture item's resolved display_name with legacy and RGB color/format codes stripped. The title's own color codes and VoxelCore font/UI placeholders are preserved. This allows an inherited furniture inventory title to display the child item's name automatically. Item display names are unaffected.

For example:

items:
  oak_drawer_bench:
    material: OAK_PLANKS
    display_name: "&fOak Drawer Bench"
    render:
      model: voxel:furniture/basic/bench/oak_drawer_bench
    properties:
      furniture:
        inventory:
          title: ":offset_-8::generic_27_top::offset_-170:&r<name>"
          size: 27

Set animation.sync_neighbors: true on persistent non-inventory animations to synchronize connected furniture. Right-clicking one opted-in instance chooses the new target state, then applies that same state to the entire contiguous group of horizontally face-adjacent, same-height furniture whose definitions also enable sync_neighbors and define animation.use. This intentionally synchronizes state instead of blindly toggling every neighbor, so a mixed group becomes consistently open or consistently closed. Diagonal, vertical, non-animated, inventory, and opted-out furniture stop propagation.

For example, a curtain wall can use:

        animation:
          use: voxel:curtain_closed
          sync_neighbors: true

animation.close_delay is measured in server ticks and defaults to 10 (half a second). Opening switches to the use model immediately. After the last viewer closes the inventory, VoxelFurniture saves its contents immediately but keeps the use model visible for this delay before restoring the normal or blockstate model. Set it to 0 for an immediate return.

Players can place ordinary blocks against furniture collision blocks. Furniture with an inventory consumes a normal right-click to open it, so the player must sneak while placing a block against it, matching vanilla container interaction. VoxelFurniture items remain protected from placing their carrier blocks through this bypass.

Clone this wiki locally