Skip to content

Room themes

✅ Available

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.

FieldTypeReq?Notes
weightintoptional (default 10)Random selection weight across all themes. Clamped to [1, 1000]. Higher = more likely.
wall_palettepaletterequiredWall blocks. Conditions: default, bottom_row.
floor_palettepaletterequiredFloor blocks. Conditions: default, edge, corner.
ceiling_palettepaletterequiredCeiling blocks. Only default is read.
wall_shellblock stringrequiredSingle block for the outer wall shell (the structural backing behind the wall face).
wall_accentblock stringrequiredSingle block for trims/frames/accents.
pillar_palettepaletterequiredThe four corner pillars. Conditions: default (shaft), cap (top & bottom).
scatter_palettepaletteoptionalRandom floor/ground clutter (cobwebs, candles…). If present but invalid it’s ignored (check the log) and the theme still loads.
decorationsobjectoptionalScripted 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.

PaletteConditionsWhen each is used
wall_palettedefault, bottom_rowbottom_row at the lowest wall row (floor-level course); default for every other row.
floor_palettedefault, edge, cornercorner at the four room corners; edge along the perimeter; default for the interior.
ceiling_palettedefaultOnly default is sampled.
pillar_palettedefault, capcap at the top and bottom of each pillar; default for the shaft in between.
scatter_palettedefaultOnly default is sampled.

Each entry in a condition’s array is an object:

FieldTypeDefaultNotes
blockblock-state stringRequired. Uses vanilla blockstate syntax, so it supports state properties, e.g. minecraft:candle[lit=true]. No NBT (a {...} data tag is rejected).
weightfloat1.0Relative weight within the condition. Must be > 0 — a non-positive weight skips the entry (check the log).
random_propertyobjectnoneOptional. 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 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.

FieldTypeDefaultNotes
namestringThe block-state property to vary. Must be an integer property on that block, or it falls back to the base state (check the log).
minint1Lowest value (inclusive).
maxintminHighest 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
}
FieldTypeDefaultNotes
corner_decorationspositioned-block[][]Blocks placed at each of the four room corners. Typically used in pairs (a low + a high cobweb).
wall_midpoint_blockspositioned-block[][]Blocks placed at the four wall midpoints (e.g. wall sconces/lanterns).
first_corner_specialpositioned-blocknoneA single block placed only at the first corner — good for a one-off feature (cauldron, skull).
furniture_clusterpositioned-block[][]A small grouped arrangement (barrel + brewing stand, lectern + candles…).
use_torch_lightingboolfalseWhether the room is lit with torches.
has_ceiling_chainboolfalseWhether a decorative chain hangs from the ceiling.

Each decoration entry is a block string plus integer offsets from its anchor position:

FieldTypeDefaultNotes
blockblock-state stringRequired. Same rules as palette block (state properties OK, no NBT).
x_offsetint0Horizontal offset along the room’s local X.
y_offsetint0Vertical offset from the floor (the most common one — height of the decoration).
z_offsetint0Horizontal 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
}
}
  1. Drop the JSON in 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.
  2. Run /reload (or restart the server). The log reports how many themes loaded and how many were skipped.
  3. The next time the structure generates, the server rolls across all loaded themes by their top-level 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.