feat(UC-02): data-driven room themes — 6 JSON + consumer migration + cleanup
Phase 3: Extract 6 themes into JSON (oubliette, inferno, crypt, ice, sculk, sandstone) Phase 4: Migrate HangingCagePiece to use RoomThemeRegistry.pickRandomOrFallback() - Move 7 shared static methods from RoomTheme into HangingCagePiece - Replace per-enum placeDecorations() with generic DecorationConfig-based placement Phase 5: Delete RoomTheme.java (-1368L)
This commit is contained in:
@@ -26,6 +26,7 @@ import net.minecraft.world.level.ChunkPos;
|
||||
import net.minecraft.world.level.WorldGenLevel;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.ChestBlock;
|
||||
import net.minecraft.world.level.block.LanternBlock;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
@@ -279,7 +280,7 @@ public class HangingCagePiece extends StructurePiece {
|
||||
|
||||
/**
|
||||
* Fallback: carve a 13x13x12 dungeon room and place the cage inside.
|
||||
* Randomly selects a theme (Oubliette/Inferno) and layout (Square/Octagonal).
|
||||
* Randomly selects a data-driven theme and layout (Square/Octagonal).
|
||||
*/
|
||||
private void carveAndPlaceRoom(
|
||||
WorldGenLevel level,
|
||||
@@ -288,9 +289,7 @@ public class HangingCagePiece extends StructurePiece {
|
||||
int centerZ,
|
||||
BoundingBox chunkBB
|
||||
) {
|
||||
RoomTheme theme = RoomTheme.values()[random.nextInt(
|
||||
RoomTheme.values().length
|
||||
)];
|
||||
RoomThemeDefinition theme = RoomThemeRegistry.pickRandomOrFallback(random);
|
||||
RoomLayout layout = RoomLayout.values()[random.nextInt(
|
||||
RoomLayout.values().length
|
||||
)];
|
||||
@@ -358,62 +357,24 @@ public class HangingCagePiece extends StructurePiece {
|
||||
}
|
||||
}
|
||||
|
||||
theme.placeDecorations(
|
||||
level,
|
||||
random,
|
||||
baseX,
|
||||
baseZ,
|
||||
floorY,
|
||||
layout,
|
||||
chunkBB
|
||||
placeThemeDecorations(
|
||||
level, random, baseX, baseZ, floorY, layout, chunkBB, theme
|
||||
);
|
||||
|
||||
RoomTheme.placeSharedPillars(
|
||||
level,
|
||||
random,
|
||||
baseX,
|
||||
baseZ,
|
||||
floorY,
|
||||
layout,
|
||||
theme,
|
||||
chunkBB
|
||||
placeSharedPillars(
|
||||
level, random, baseX, baseZ, floorY, layout, theme, chunkBB
|
||||
);
|
||||
RoomTheme.placeSharedFloorScatter(
|
||||
level,
|
||||
random,
|
||||
baseX,
|
||||
baseZ,
|
||||
floorY,
|
||||
layout,
|
||||
theme,
|
||||
chunkBB
|
||||
placeSharedFloorScatter(
|
||||
level, random, baseX, baseZ, floorY, layout, theme, chunkBB
|
||||
);
|
||||
RoomTheme.placeSharedCeilingDecor(
|
||||
level,
|
||||
random,
|
||||
baseX,
|
||||
baseZ,
|
||||
floorY,
|
||||
layout,
|
||||
chunkBB
|
||||
placeSharedCeilingDecor(
|
||||
level, random, baseX, baseZ, floorY, layout, chunkBB
|
||||
);
|
||||
RoomTheme.placeSharedWallLighting(
|
||||
level,
|
||||
random,
|
||||
baseX,
|
||||
baseZ,
|
||||
floorY,
|
||||
layout,
|
||||
chunkBB
|
||||
placeSharedWallLighting(
|
||||
level, random, baseX, baseZ, floorY, layout, chunkBB
|
||||
);
|
||||
RoomTheme.placeSharedWallBands(
|
||||
level,
|
||||
baseX,
|
||||
baseZ,
|
||||
floorY,
|
||||
layout,
|
||||
theme,
|
||||
chunkBB
|
||||
placeSharedWallBands(
|
||||
level, baseX, baseZ, floorY, layout, theme, chunkBB
|
||||
);
|
||||
|
||||
placeVanillaChest(level, random, baseX, baseZ, floorY, layout, chunkBB);
|
||||
@@ -451,7 +412,7 @@ public class HangingCagePiece extends StructurePiece {
|
||||
|
||||
TiedUpMod.LOGGER.info(
|
||||
"[HangingCage] Placed cage in carved room (theme={}, layout={}) at {}",
|
||||
theme.name(),
|
||||
theme.id(),
|
||||
layout.name(),
|
||||
masterPos.toShortString()
|
||||
);
|
||||
@@ -655,4 +616,318 @@ public class HangingCagePiece extends StructurePiece {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Data-driven theme decorations ───────────────────────────────
|
||||
|
||||
/**
|
||||
* Place decorations from the data-driven {@link DecorationConfig}.
|
||||
* Replaces the old per-enum {@code RoomTheme.placeDecorations()} method.
|
||||
*/
|
||||
private static void placeThemeDecorations(
|
||||
WorldGenLevel level,
|
||||
RandomSource random,
|
||||
int baseX,
|
||||
int baseZ,
|
||||
int floorY,
|
||||
RoomLayout layout,
|
||||
BoundingBox chunkBB,
|
||||
RoomThemeDefinition theme
|
||||
) {
|
||||
DecorationConfig deco = theme.decorations();
|
||||
int[][] corners = layout.innerCorners();
|
||||
|
||||
// Corner decorations (e.g. cobwebs low+high, soul fire, snow layers)
|
||||
for (DecorationConfig.PositionedBlock pb : deco.cornerDecorations()) {
|
||||
for (int[] c : corners) {
|
||||
if (layout.isInShape(c[0], c[1]) && !layout.isWall(c[0], c[1])) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + c[0], floorY + pb.yOffset(), baseZ + c[1]),
|
||||
pb.state(), chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Wall midpoint decorations (e.g. soul lanterns, crying obsidian, sculk veins)
|
||||
int[][] wallMidpoints = {{6, 1}, {6, 11}, {1, 6}, {11, 6}};
|
||||
for (DecorationConfig.PositionedBlock pb : deco.wallMidpointBlocks()) {
|
||||
for (int[] wp : wallMidpoints) {
|
||||
if (layout.isWall(wp[0], wp[1])) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + wp[0], floorY + pb.yOffset(), baseZ + wp[1]),
|
||||
pb.state(), chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// First corner special (e.g. water cauldron, skull, TNT, sculk catalyst)
|
||||
if (deco.firstCornerSpecial() != null && corners.length > 0) {
|
||||
int[] sc = corners[0];
|
||||
if (layout.isInShape(sc[0], sc[1]) && !layout.isWall(sc[0], sc[1])) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + sc[0], floorY + deco.firstCornerSpecial().yOffset(), baseZ + sc[1]),
|
||||
deco.firstCornerSpecial().state(), chunkBB);
|
||||
}
|
||||
}
|
||||
|
||||
// Furniture cluster at corners[1] (e.g. barrel+brewing_stand, soul_campfire+cauldron)
|
||||
if (corners.length > 1) {
|
||||
int[] fc = corners[1];
|
||||
int fcx = fc[0] + (fc[0] < 6 ? 1 : -1);
|
||||
int fcz = fc[1] + (fc[1] < 6 ? 1 : -1);
|
||||
if (layout.isInShape(fcx, fcz) && !layout.isWall(fcx, fcz)) {
|
||||
for (DecorationConfig.PositionedBlock pb : deco.furnitureCluster()) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + fcx, floorY + pb.yOffset(), baseZ + fcz),
|
||||
pb.state(), chunkBB);
|
||||
}
|
||||
}
|
||||
|
||||
// Ceiling chain above furniture
|
||||
if (deco.hasCeilingChain()) {
|
||||
for (int cy = 8; cy <= 10; cy++) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + fcx, floorY + cy, baseZ + fcz),
|
||||
Blocks.CHAIN.defaultBlockState(), chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Torch lighting (wall torches at outer wall midpoints) -- used by Crypt, Sandstone
|
||||
if (deco.useTorchLighting()) {
|
||||
for (int[] wallPos : new int[][] {{6, 0}, {6, 12}, {0, 6}, {12, 6}}) {
|
||||
if (layout.isWall(wallPos[0], wallPos[1])) {
|
||||
Direction torchDir = getTorchDirection(wallPos[0], wallPos[1]);
|
||||
if (torchDir != null) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + wallPos[0], floorY + 3, baseZ + wallPos[1]),
|
||||
Blocks.WALL_TORCH.defaultBlockState().setValue(
|
||||
net.minecraft.world.level.block.WallTorchBlock.FACING, torchDir),
|
||||
chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Side chains + hanging lanterns (shared by all themes)
|
||||
placeSharedChains(level, baseX, baseZ, floorY, chunkBB);
|
||||
placeSharedHangingLanterns(level, baseX, baseZ, floorY, chunkBB);
|
||||
}
|
||||
|
||||
// ── Shared structural features (moved from RoomTheme) ──────────
|
||||
|
||||
/** Pillar positions -- verified to be inside all 4 layouts. */
|
||||
private static final int[][] PILLAR_POSITIONS = {
|
||||
{4, 4}, {4, 8}, {8, 4}, {8, 8},
|
||||
};
|
||||
|
||||
/** Place 4 full-height pillars at verified positions. */
|
||||
private static void placeSharedPillars(
|
||||
WorldGenLevel level,
|
||||
RandomSource random,
|
||||
int baseX,
|
||||
int baseZ,
|
||||
int floorY,
|
||||
RoomLayout layout,
|
||||
RoomThemeDefinition theme,
|
||||
BoundingBox chunkBB
|
||||
) {
|
||||
for (int[] p : PILLAR_POSITIONS) {
|
||||
if (!layout.isInShape(p[0], p[1]) || layout.isWall(p[0], p[1])) continue;
|
||||
for (int ry = 1; ry <= 10; ry++) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + p[0], floorY + ry, baseZ + p[1]),
|
||||
theme.pillarBlock(random, ry), chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Place random floor scatter (~12% of interior positions). */
|
||||
private static void placeSharedFloorScatter(
|
||||
WorldGenLevel level,
|
||||
RandomSource random,
|
||||
int baseX,
|
||||
int baseZ,
|
||||
int floorY,
|
||||
RoomLayout layout,
|
||||
RoomThemeDefinition theme,
|
||||
BoundingBox chunkBB
|
||||
) {
|
||||
for (int rx = 1; rx <= 11; rx++) {
|
||||
for (int rz = 1; rz <= 11; rz++) {
|
||||
if (!layout.isInShape(rx, rz) || layout.isWall(rx, rz)) continue;
|
||||
// Skip pillar positions
|
||||
if ((rx == 4 || rx == 8) && (rz == 4 || rz == 8)) continue;
|
||||
// Skip cage center area (5-7, 5-7)
|
||||
if (rx >= 5 && rx <= 7 && rz >= 5 && rz <= 7) continue;
|
||||
// Skip corner positions (used by decorations/chests)
|
||||
if ((rx <= 2 || rx >= 10) && (rz <= 2 || rz >= 10)) continue;
|
||||
if (random.nextFloat() < 0.12f) {
|
||||
BlockState scatter = theme.scatterBlock(random);
|
||||
if (scatter != null) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + rx, floorY + 1, baseZ + rz),
|
||||
scatter, chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Place ceiling cobwebs and extra hanging chains. */
|
||||
private static void placeSharedCeilingDecor(
|
||||
WorldGenLevel level,
|
||||
RandomSource random,
|
||||
int baseX,
|
||||
int baseZ,
|
||||
int floorY,
|
||||
RoomLayout layout,
|
||||
BoundingBox chunkBB
|
||||
) {
|
||||
// Cobwebs along walls at ceiling level
|
||||
int[][] cobwebCandidates = {
|
||||
{2, 1}, {4, 1}, {8, 1}, {10, 1},
|
||||
{2, 11}, {4, 11}, {8, 11}, {10, 11},
|
||||
{1, 4}, {1, 8}, {11, 4}, {11, 8},
|
||||
};
|
||||
for (int[] pos : cobwebCandidates) {
|
||||
if (layout.isInShape(pos[0], pos[1])
|
||||
&& !layout.isWall(pos[0], pos[1])
|
||||
&& random.nextFloat() < 0.45f) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + pos[0], floorY + 10, baseZ + pos[1]),
|
||||
Blocks.COBWEB.defaultBlockState(), chunkBB);
|
||||
}
|
||||
}
|
||||
// Extra hanging chains at random interior positions
|
||||
int[][] chainCandidates = {{5, 3}, {7, 9}, {3, 7}};
|
||||
for (int[] pos : chainCandidates) {
|
||||
if (layout.isInShape(pos[0], pos[1])
|
||||
&& !layout.isWall(pos[0], pos[1])
|
||||
&& random.nextFloat() < 0.6f) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + pos[0], floorY + 10, baseZ + pos[1]),
|
||||
Blocks.CHAIN.defaultBlockState(), chunkBB);
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + pos[0], floorY + 9, baseZ + pos[1]),
|
||||
Blocks.CHAIN.defaultBlockState(), chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Place additional wall-mounted lighting. */
|
||||
private static void placeSharedWallLighting(
|
||||
WorldGenLevel level,
|
||||
RandomSource random,
|
||||
int baseX,
|
||||
int baseZ,
|
||||
int floorY,
|
||||
RoomLayout layout,
|
||||
BoundingBox chunkBB
|
||||
) {
|
||||
// Lanterns on pillar sides (facing center) at ry=1 (on the floor)
|
||||
int[][] pillarLanternPositions = {
|
||||
{5, 4}, {4, 7}, {8, 5}, {7, 8},
|
||||
};
|
||||
for (int[] pos : pillarLanternPositions) {
|
||||
if (layout.isInShape(pos[0], pos[1])
|
||||
&& !layout.isWall(pos[0], pos[1])) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + pos[0], floorY + 1, baseZ + pos[1]),
|
||||
Blocks.LANTERN.defaultBlockState(), chunkBB);
|
||||
}
|
||||
}
|
||||
// Extra wall sconces at quarter-points
|
||||
int[][] wallSconces = {
|
||||
{4, 0}, {8, 0}, {4, 12}, {8, 12},
|
||||
{0, 4}, {0, 8}, {12, 4}, {12, 8},
|
||||
};
|
||||
for (int[] pos : wallSconces) {
|
||||
if (layout.isWall(pos[0], pos[1]) && random.nextFloat() < 0.5f) {
|
||||
Direction torchDir = getTorchDirection(pos[0], pos[1]);
|
||||
if (torchDir != null) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + pos[0], floorY + 3, baseZ + pos[1]),
|
||||
Blocks.WALL_TORCH.defaultBlockState().setValue(
|
||||
net.minecraft.world.level.block.WallTorchBlock.FACING, torchDir),
|
||||
chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Place wall accent bands at ry=5 and ry=8. */
|
||||
private static void placeSharedWallBands(
|
||||
WorldGenLevel level,
|
||||
int baseX,
|
||||
int baseZ,
|
||||
int floorY,
|
||||
RoomLayout layout,
|
||||
RoomThemeDefinition theme,
|
||||
BoundingBox chunkBB
|
||||
) {
|
||||
int[][] bandPositions = {
|
||||
{6, 1}, {6, 11}, {1, 6}, {11, 6},
|
||||
{4, 1}, {8, 1}, {4, 11}, {8, 11},
|
||||
{1, 4}, {1, 8}, {11, 4}, {11, 8},
|
||||
};
|
||||
for (int[] pos : bandPositions) {
|
||||
if (layout.isWall(pos[0], pos[1])) {
|
||||
// Band at ry=5
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + pos[0], floorY + 5, baseZ + pos[1]),
|
||||
theme.wallAccentBlock(), chunkBB);
|
||||
// Optional band at ry=8
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + pos[0], floorY + 8, baseZ + pos[1]),
|
||||
theme.wallAccentBlock(), chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Chains on cage flanks and ceiling corners -- shared by all themes. */
|
||||
private static void placeSharedChains(
|
||||
WorldGenLevel level,
|
||||
int baseX,
|
||||
int baseZ,
|
||||
int floorY,
|
||||
BoundingBox chunkBB
|
||||
) {
|
||||
for (int[] chainPos : new int[][] {{3, 6}, {9, 6}}) {
|
||||
for (int ry = 5; ry <= 10; ry++) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + chainPos[0], floorY + ry, baseZ + chainPos[1]),
|
||||
Blocks.CHAIN.defaultBlockState(), chunkBB);
|
||||
}
|
||||
}
|
||||
for (int[] chainPos : new int[][] {{3, 3}, {3, 9}, {9, 3}, {9, 9}}) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + chainPos[0], floorY + 10, baseZ + chainPos[1]),
|
||||
Blocks.CHAIN.defaultBlockState(), chunkBB);
|
||||
}
|
||||
}
|
||||
|
||||
/** Determine torch facing direction for a wall position (torch faces inward). */
|
||||
private static Direction getTorchDirection(int rx, int rz) {
|
||||
if (rz == 0) return Direction.SOUTH;
|
||||
if (rz == 12) return Direction.NORTH;
|
||||
if (rx == 0) return Direction.EAST;
|
||||
if (rx == 12) return Direction.WEST;
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Hanging lanterns -- shared by all themes. */
|
||||
private static void placeSharedHangingLanterns(
|
||||
WorldGenLevel level,
|
||||
int baseX,
|
||||
int baseZ,
|
||||
int floorY,
|
||||
BoundingBox chunkBB
|
||||
) {
|
||||
for (int[] pos : new int[][] {{3, 3}, {9, 9}}) {
|
||||
safeSetBlock(level,
|
||||
new BlockPos(baseX + pos[0], floorY + 9, baseZ + pos[1]),
|
||||
Blocks.LANTERN.defaultBlockState().setValue(LanternBlock.HANGING, true),
|
||||
chunkBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
61
src/main/resources/data/tiedup/tiedup_room_themes/crypt.json
Normal file
61
src/main/resources/data/tiedup/tiedup_room_themes/crypt.json
Normal file
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"weight": 10,
|
||||
"wall_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:mossy_stone_bricks", "weight": 0.15 },
|
||||
{ "block": "minecraft:cracked_stone_bricks", "weight": 0.15 },
|
||||
{ "block": "minecraft:stone_bricks", "weight": 0.70 }
|
||||
],
|
||||
"bottom_row": [
|
||||
{ "block": "minecraft:mossy_cobblestone", "weight": 0.20 },
|
||||
{ "block": "minecraft:mossy_stone_bricks", "weight": 0.12 },
|
||||
{ "block": "minecraft:cracked_stone_bricks", "weight": 0.12 },
|
||||
{ "block": "minecraft:stone_bricks", "weight": 0.56 }
|
||||
]
|
||||
},
|
||||
"floor_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:cobblestone", "weight": 0.20 },
|
||||
{ "block": "minecraft:stone_bricks", "weight": 0.80 }
|
||||
],
|
||||
"corner": [
|
||||
{ "block": "minecraft:mossy_cobblestone", "weight": 1.0 }
|
||||
]
|
||||
},
|
||||
"ceiling_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:cracked_stone_bricks", "weight": 0.20 },
|
||||
{ "block": "minecraft:stone_bricks", "weight": 0.80 }
|
||||
]
|
||||
},
|
||||
"wall_shell": "minecraft:stone_bricks",
|
||||
"wall_accent": "minecraft:mossy_stone_bricks",
|
||||
"pillar_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:stone_brick_wall", "weight": 1.0 }
|
||||
],
|
||||
"cap": [
|
||||
{ "block": "minecraft:chiseled_stone_bricks", "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:bone_block", "weight": 0.30 }
|
||||
]
|
||||
},
|
||||
"decorations": {
|
||||
"corner_decorations": [
|
||||
{ "block": "minecraft:cobweb", "y_offset": 1 },
|
||||
{ "block": "minecraft:cobweb", "y_offset": 9 }
|
||||
],
|
||||
"first_corner_special": { "block": "minecraft:skeleton_skull", "y_offset": 1 },
|
||||
"furniture_cluster": [
|
||||
{ "block": "minecraft:lectern", "y_offset": 1 },
|
||||
{ "block": "minecraft:candle[lit=true,candles=4]", "y_offset": 1 }
|
||||
],
|
||||
"use_torch_lighting": true,
|
||||
"has_ceiling_chain": true
|
||||
}
|
||||
}
|
||||
58
src/main/resources/data/tiedup/tiedup_room_themes/ice.json
Normal file
58
src/main/resources/data/tiedup/tiedup_room_themes/ice.json
Normal file
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"weight": 10,
|
||||
"wall_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:ice", "weight": 0.10 },
|
||||
{ "block": "minecraft:blue_ice", "weight": 0.20 },
|
||||
{ "block": "minecraft:packed_ice", "weight": 0.70 }
|
||||
]
|
||||
},
|
||||
"floor_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:snow_block", "weight": 0.20 },
|
||||
{ "block": "minecraft:packed_ice", "weight": 0.80 }
|
||||
],
|
||||
"edge": [
|
||||
{ "block": "minecraft:blue_ice", "weight": 1.0 }
|
||||
]
|
||||
},
|
||||
"ceiling_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:blue_ice", "weight": 0.20 },
|
||||
{ "block": "minecraft:packed_ice", "weight": 0.80 }
|
||||
]
|
||||
},
|
||||
"wall_shell": "minecraft:packed_ice",
|
||||
"wall_accent": "minecraft:blue_ice",
|
||||
"pillar_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:packed_ice", "weight": 0.50 },
|
||||
{ "block": "minecraft:blue_ice", "weight": 0.50 }
|
||||
],
|
||||
"cap": [
|
||||
{ "block": "minecraft:blue_ice", "weight": 1.0 }
|
||||
]
|
||||
},
|
||||
"scatter_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:snow[layers=1]", "weight": 0.50, "random_property": { "name": "layers", "min": 1, "max": 2 } },
|
||||
{ "block": "minecraft:powder_snow", "weight": 0.20 },
|
||||
{ "block": "minecraft:ice", "weight": 0.30 }
|
||||
]
|
||||
},
|
||||
"decorations": {
|
||||
"corner_decorations": [
|
||||
{ "block": "minecraft:snow[layers=2]", "y_offset": 1 }
|
||||
],
|
||||
"wall_midpoint_blocks": [
|
||||
{ "block": "minecraft:lantern", "y_offset": 3 }
|
||||
],
|
||||
"furniture_cluster": [
|
||||
{ "block": "minecraft:powder_snow_cauldron[level=3]", "y_offset": 1 },
|
||||
{ "block": "minecraft:blue_ice", "y_offset": 1 },
|
||||
{ "block": "minecraft:lantern", "y_offset": 2 }
|
||||
],
|
||||
"use_torch_lighting": false,
|
||||
"has_ceiling_chain": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"weight": 10,
|
||||
"wall_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:cracked_nether_bricks", "weight": 0.20 },
|
||||
{ "block": "minecraft:nether_bricks", "weight": 0.80 }
|
||||
]
|
||||
},
|
||||
"floor_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:gilded_blackstone", "weight": 0.08 },
|
||||
{ "block": "minecraft:blackstone", "weight": 0.92 }
|
||||
],
|
||||
"edge": [
|
||||
{ "block": "minecraft:magma_block", "weight": 1.0 }
|
||||
]
|
||||
},
|
||||
"ceiling_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:cracked_nether_bricks", "weight": 0.20 },
|
||||
{ "block": "minecraft:nether_bricks", "weight": 0.80 }
|
||||
]
|
||||
},
|
||||
"wall_shell": "minecraft:nether_bricks",
|
||||
"wall_accent": "minecraft:red_nether_bricks",
|
||||
"pillar_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:nether_brick_wall", "weight": 1.0 }
|
||||
],
|
||||
"cap": [
|
||||
{ "block": "minecraft:quartz_pillar", "weight": 1.0 }
|
||||
]
|
||||
},
|
||||
"scatter_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:soul_sand", "weight": 0.40 },
|
||||
{ "block": "minecraft:nether_wart_block", "weight": 0.30 },
|
||||
{ "block": "minecraft:bone_block", "weight": 0.30 }
|
||||
]
|
||||
},
|
||||
"decorations": {
|
||||
"corner_decorations": [
|
||||
{ "block": "minecraft:soul_sand", "y_offset": 0 },
|
||||
{ "block": "minecraft:soul_fire", "y_offset": 1 }
|
||||
],
|
||||
"wall_midpoint_blocks": [
|
||||
{ "block": "minecraft:crying_obsidian", "y_offset": 2 },
|
||||
{ "block": "minecraft:soul_lantern", "y_offset": 3 }
|
||||
],
|
||||
"furniture_cluster": [
|
||||
{ "block": "minecraft:soul_campfire", "y_offset": 1 },
|
||||
{ "block": "minecraft:lava_cauldron", "y_offset": 1 },
|
||||
{ "block": "minecraft:gilded_blackstone", "y_offset": 1 }
|
||||
],
|
||||
"use_torch_lighting": false,
|
||||
"has_ceiling_chain": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"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]", "y_offset": 1 },
|
||||
"furniture_cluster": [
|
||||
{ "block": "minecraft:barrel", "y_offset": 1 },
|
||||
{ "block": "minecraft:brewing_stand", "y_offset": 1 }
|
||||
],
|
||||
"use_torch_lighting": false,
|
||||
"has_ceiling_chain": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"weight": 10,
|
||||
"wall_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:chiseled_sandstone", "weight": 0.10 },
|
||||
{ "block": "minecraft:sandstone", "weight": 0.20 },
|
||||
{ "block": "minecraft:cut_sandstone", "weight": 0.70 }
|
||||
]
|
||||
},
|
||||
"floor_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:sand", "weight": 0.15 },
|
||||
{ "block": "minecraft:smooth_sandstone", "weight": 0.85 }
|
||||
]
|
||||
},
|
||||
"ceiling_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:sandstone", "weight": 0.20 },
|
||||
{ "block": "minecraft:cut_sandstone", "weight": 0.80 }
|
||||
]
|
||||
},
|
||||
"wall_shell": "minecraft:cut_sandstone",
|
||||
"wall_accent": "minecraft:chiseled_sandstone",
|
||||
"pillar_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:sandstone_wall", "weight": 1.0 }
|
||||
],
|
||||
"cap": [
|
||||
{ "block": "minecraft:chiseled_sandstone", "weight": 1.0 }
|
||||
]
|
||||
},
|
||||
"scatter_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:sand", "weight": 0.40 },
|
||||
{ "block": "minecraft:dead_bush", "weight": 0.30 },
|
||||
{ "block": "minecraft:candle[lit=true]", "weight": 0.30, "random_property": { "name": "candles", "min": 1, "max": 3 } }
|
||||
]
|
||||
},
|
||||
"decorations": {
|
||||
"wall_midpoint_blocks": [
|
||||
{ "block": "minecraft:orange_terracotta", "y_offset": 2 }
|
||||
],
|
||||
"first_corner_special": { "block": "minecraft:tnt", "y_offset": 1 },
|
||||
"furniture_cluster": [
|
||||
{ "block": "minecraft:barrel", "y_offset": 1 },
|
||||
{ "block": "minecraft:flower_pot", "y_offset": 1 },
|
||||
{ "block": "minecraft:orange_terracotta", "y_offset": 1 }
|
||||
],
|
||||
"use_torch_lighting": true,
|
||||
"has_ceiling_chain": true
|
||||
}
|
||||
}
|
||||
58
src/main/resources/data/tiedup/tiedup_room_themes/sculk.json
Normal file
58
src/main/resources/data/tiedup/tiedup_room_themes/sculk.json
Normal file
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"weight": 10,
|
||||
"wall_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:cracked_deepslate_bricks", "weight": 0.10 },
|
||||
{ "block": "minecraft:sculk", "weight": 0.30 },
|
||||
{ "block": "minecraft:deepslate_bricks", "weight": 0.60 }
|
||||
]
|
||||
},
|
||||
"floor_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:sculk", "weight": 0.30 },
|
||||
{ "block": "minecraft:deepslate_tiles", "weight": 0.70 }
|
||||
],
|
||||
"edge": [
|
||||
{ "block": "minecraft:sculk", "weight": 1.0 }
|
||||
]
|
||||
},
|
||||
"ceiling_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:cracked_deepslate_bricks", "weight": 0.10 },
|
||||
{ "block": "minecraft:sculk", "weight": 0.20 },
|
||||
{ "block": "minecraft:deepslate_bricks", "weight": 0.70 }
|
||||
]
|
||||
},
|
||||
"wall_shell": "minecraft:deepslate_bricks",
|
||||
"wall_accent": "minecraft:sculk_catalyst",
|
||||
"pillar_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:sculk", "weight": 0.30 },
|
||||
{ "block": "minecraft:deepslate_tile_wall", "weight": 0.70 }
|
||||
],
|
||||
"cap": [
|
||||
{ "block": "minecraft:sculk", "weight": 1.0 }
|
||||
]
|
||||
},
|
||||
"scatter_palette": {
|
||||
"default": [
|
||||
{ "block": "minecraft:sculk", "weight": 0.50 },
|
||||
{ "block": "minecraft:sculk_vein", "weight": 0.30 },
|
||||
{ "block": "minecraft:moss_carpet", "weight": 0.20 }
|
||||
]
|
||||
},
|
||||
"decorations": {
|
||||
"wall_midpoint_blocks": [
|
||||
{ "block": "minecraft:sculk_vein", "y_offset": 2 },
|
||||
{ "block": "minecraft:soul_lantern", "y_offset": 3 }
|
||||
],
|
||||
"first_corner_special": { "block": "minecraft:sculk_catalyst", "y_offset": 1 },
|
||||
"furniture_cluster": [
|
||||
{ "block": "minecraft:sculk_shrieker", "y_offset": 1 },
|
||||
{ "block": "minecraft:sculk_sensor", "y_offset": 1 },
|
||||
{ "block": "minecraft:candle[lit=true,candles=3]", "y_offset": 1 }
|
||||
],
|
||||
"use_torch_lighting": false,
|
||||
"has_ceiling_chain": true
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user