Furniture & pets
The other worldgen-adjacent datapack registry — but furniture does sync to clients. See Furniture & pets.
A room theme is the palette + decoration set the worldgen feature uses to build the dungeon
room around the hanging cage. Each theme is a single JSON file at
data/<namespace>/tiedup_room_themes/<name>.json. When the structure generates, the server picks
one theme at random (weighted) and uses it to paint the room: walls, floor, ceiling, pillars,
scatter clutter, and scripted decoration blocks.
This page documents every field a theme file can contain.
The smallest valid definition — the six required palettes/blocks, each with a default condition:
{ "wall_palette": { "default": [{ "block": "minecraft:stone_bricks" }] }, "floor_palette": { "default": [{ "block": "minecraft:stone_bricks" }] }, "ceiling_palette": { "default": [{ "block": "minecraft:stone_bricks" }] }, "wall_shell": "minecraft:stone_bricks", "wall_accent": "minecraft:chiseled_stone_bricks", "pillar_palette": { "default": [{ "block": "minecraft:stone_brick_wall" }] }}The file name is the theme id: data/mypack/tiedup_room_themes/crypt.json registers as
mypack:crypt. The namespace comes from the folder, and the path after tiedup_room_themes/
(minus the .json suffix) becomes the id.
| Field | Type | Req? | Notes |
|---|---|---|---|
weight | int | optional (default 10) | Random selection weight across all themes. Clamped to [1, 1000]. Higher = more likely. |
wall_palette | palette | required | Wall blocks. Conditions: default, bottom_row. |
floor_palette | palette | required | Floor blocks. Conditions: default, edge, corner. |
ceiling_palette | palette | required | Ceiling blocks. Only default is read. |
wall_shell | block string | required | Single block for the outer wall shell (the structural backing behind the wall face). |
wall_accent | block string | required | Single block for trims/frames/accents. |
pillar_palette | palette | required | The four corner pillars. Conditions: default (shaft), cap (top & bottom). |
scatter_palette | palette | optional | Random floor/ground clutter (cobwebs, candles…). If present but invalid it’s ignored (check the log) and the theme still loads. |
decorations | object | optional | Scripted block placements (corners, midpoints, furniture, lighting flags). See Decorations. |
A palette is a JSON object mapping condition names to arrays of weighted block entries.
Every required palette must contain a default condition — it is the fallback used when a more
specific condition has no entries.
"wall_palette": { "default": [ { "block": "minecraft:cracked_deepslate_bricks", "weight": 0.20 }, { "block": "minecraft:deepslate_bricks", "weight": 0.80 } ], "bottom_row": [ { "block": "minecraft:mossy_cobblestone", "weight": 0.30 }, { "block": "minecraft:deepslate_bricks", "weight": 0.70 } ]}The worldgen feature requests a specific condition depending on where in the room the block
is being placed. If a palette has no entries for the requested condition, it transparently falls
back to default. So you only need to define the extra conditions you actually want to vary.
| Palette | Conditions | When each is used |
|---|---|---|
wall_palette | default, bottom_row | bottom_row at the lowest wall row (floor-level course); default for every other row. |
floor_palette | default, edge, corner | corner at the four room corners; edge along the perimeter; default for the interior. |
ceiling_palette | default | Only default is sampled. |
pillar_palette | default, cap | cap at the top and bottom of each pillar; default for the shaft in between. |
scatter_palette | default | Only default is sampled. |
Each entry in a condition’s array is an object:
| Field | Type | Default | Notes |
|---|---|---|---|
block | block-state string | — | Required. Uses vanilla blockstate syntax, so it supports state properties, e.g. minecraft:candle[lit=true]. No NBT (a {...} data tag is rejected). |
weight | float | 1.0 | Relative weight within the condition. Must be > 0 — a non-positive weight skips the entry (check the log). |
random_property | object | none | Optional. Expands this one entry into several, varying an integer block-state property over a range. See below. |
Within a condition the picker rolls proportionally by weight. Weights are relative — they do not
need to sum to 1.0 (using fractions that sum to 1 is just a readable convention).
random_property expansionrandom_property is sugar for “this block, but pick a random integer property value”. It expands
a single entry into one entry per value in [min, max], splitting the parent weight evenly
across them.
{ "block": "minecraft:candle[lit=true]", "weight": 0.30, "random_property": { "name": "candles", "min": 1, "max": 3 }}The example above produces three entries — candles=1, candles=2, candles=3 — each with
weight 0.30 / 3 = 0.10, so the combined chance of a lit candle stays 0.30.
| Field | Type | Default | Notes |
|---|---|---|---|
name | string | — | The block-state property to vary. Must be an integer property on that block, or it falls back to the base state (check the log). |
min | int | 1 | Lowest value (inclusive). |
max | int | min | Highest value (inclusive). If max < min the base state is used (check the log). |
The optional decorations object places scripted, positioned blocks on top of the painted
shell. Every field here is optional; omit the whole object for a bare room.
"decorations": { "corner_decorations": [ { "block": "minecraft:cobweb", "y_offset": 1 }, { "block": "minecraft:cobweb", "y_offset": 9 } ], "wall_midpoint_blocks": [ { "block": "minecraft:soul_lantern", "y_offset": 3 } ], "first_corner_special": { "block": "minecraft:water_cauldron[level=3]", "x_offset": 1, "y_offset": 1, "z_offset": 1 }, "furniture_cluster": [ { "block": "minecraft:barrel", "y_offset": 1 }, { "block": "minecraft:brewing_stand", "x_offset": 1, "y_offset": 1 } ], "use_torch_lighting": false, "has_ceiling_chain": true}| Field | Type | Default | Notes |
|---|---|---|---|
corner_decorations | positioned-block[] | [] | Blocks placed at each of the four room corners. Typically used in pairs (a low + a high cobweb). |
wall_midpoint_blocks | positioned-block[] | [] | Blocks placed at the four wall midpoints (e.g. wall sconces/lanterns). |
first_corner_special | positioned-block | none | A single block placed only at the first corner — good for a one-off feature (cauldron, skull). |
furniture_cluster | positioned-block[] | [] | A small grouped arrangement (barrel + brewing stand, lectern + candles…). |
use_torch_lighting | bool | false | Whether the room is lit with torches. |
has_ceiling_chain | bool | false | Whether a decorative chain hangs from the ceiling. |
Each decoration entry is a block string plus integer offsets from its anchor position:
| Field | Type | Default | Notes |
|---|---|---|---|
block | block-state string | — | Required. Same rules as palette block (state properties OK, no NBT). |
x_offset | int | 0 | Horizontal offset along the room’s local X. |
y_offset | int | 0 | Vertical offset from the floor (the most common one — height of the decoration). |
z_offset | int | 0 | Horizontal offset along the room’s local Z. |
A complete shipped theme — data/tiedup/tiedup_room_themes/oubliette.json — exercising every
feature (multi-block palettes, bottom_row / corner variation, random_property candles, a
scatter palette, and a full decoration block):
{ "weight": 10, "wall_palette": { "default": [ { "block": "minecraft:cracked_deepslate_bricks", "weight": 0.20 }, { "block": "minecraft:deepslate_bricks", "weight": 0.80 } ], "bottom_row": [ { "block": "minecraft:mossy_cobblestone", "weight": 0.30 }, { "block": "minecraft:cracked_deepslate_bricks", "weight": 0.14 }, { "block": "minecraft:deepslate_bricks", "weight": 0.56 } ] }, "floor_palette": { "default": [ { "block": "minecraft:cobblestone", "weight": 0.15 }, { "block": "minecraft:deepslate_tiles", "weight": 0.85 } ], "corner": [ { "block": "minecraft:mossy_cobblestone", "weight": 1.0 } ] }, "ceiling_palette": { "default": [ { "block": "minecraft:cracked_deepslate_bricks", "weight": 0.20 }, { "block": "minecraft:deepslate_bricks", "weight": 0.80 } ] }, "wall_shell": "minecraft:deepslate_bricks", "wall_accent": "minecraft:polished_deepslate", "pillar_palette": { "default": [ { "block": "minecraft:deepslate_brick_wall", "weight": 1.0 } ], "cap": [ { "block": "minecraft:polished_deepslate", "weight": 1.0 } ] }, "scatter_palette": { "default": [ { "block": "minecraft:cobweb", "weight": 0.40 }, { "block": "minecraft:candle[lit=true]", "weight": 0.30, "random_property": { "name": "candles", "min": 1, "max": 3 } }, { "block": "minecraft:moss_carpet", "weight": 0.30 } ] }, "decorations": { "corner_decorations": [ { "block": "minecraft:cobweb", "y_offset": 1 }, { "block": "minecraft:cobweb", "y_offset": 9 } ], "wall_midpoint_blocks": [ { "block": "minecraft:soul_lantern", "y_offset": 3 } ], "first_corner_special": { "block": "minecraft:water_cauldron[level=3]", "x_offset": 1, "y_offset": 1, "z_offset": 1 }, "furniture_cluster": [ { "block": "minecraft:barrel", "y_offset": 1 }, { "block": "minecraft:brewing_stand", "x_offset": 1, "y_offset": 1 } ], "use_torch_lighting": false, "has_ceiling_chain": true }}data/<namespace>/tiedup_room_themes/ inside your addon pack (see
Packaging for the full folder layout). The file name (path after the
folder, minus .json) becomes the theme id./reload (or restart the server). The log reports how many themes loaded and how many were
skipped.weight and paints the room with the winner.Furniture & pets
The other worldgen-adjacent datapack registry — but furniture does sync to clients. See Furniture & pets.
Bones & regions
Reference tables for the rest of the data-driven systems. See Bones & regions.
Item JSON
The block-state string syntax (block[prop=value]) is the same one used here. See
Item JSON.