From 678583a4edb44b9fd3d419f330d89ab364bfc976 Mon Sep 17 00:00:00 2001 From: chelsea Date: Tue, 2 Dec 2025 21:29:53 -0600 Subject: [PATCH] Tighten cabin placement and add ladders/foundations --- worldgen-c/bin/worldgen | Bin 127552 -> 135896 bytes worldgen-c/include/worldgen.h | 6 +- worldgen-c/src/main.c | 11 +- worldgen-c/src/worldgen.c | 230 +++++++++++++++++++++++++++------- 4 files changed, 199 insertions(+), 48 deletions(-) diff --git a/worldgen-c/bin/worldgen b/worldgen-c/bin/worldgen index 92fd3db2a41a6c8d4305bb6435c690bba68a47f7..f1c51a956acf88f03e5ea2308d336e467d620fe9 100755 GIT binary patch delta 55760 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 delta 49233 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 diff --git a/worldgen-c/include/worldgen.h b/worldgen-c/include/worldgen.h index f4ea7e0..00d1a66 100644 --- a/worldgen-c/include/worldgen.h +++ b/worldgen-c/include/worldgen.h @@ -47,7 +47,11 @@ BLOCK_SPRUCE_DOOR_E_LOWER = 35, BLOCK_SPRUCE_DOOR_E_UPPER = 36, BLOCK_SPRUCE_STAIRS_E = 37, - BLOCK_SPRUCE_STAIRS_W = 38 + BLOCK_SPRUCE_STAIRS_W = 38, + BLOCK_LADDER_N = 39, + BLOCK_LADDER_S = 40, + BLOCK_LADDER_W = 41, + BLOCK_LADDER_E = 42 }; struct trail_segment; diff --git a/worldgen-c/src/main.c b/worldgen-c/src/main.c index d53db3e..1f5a76c 100644 --- a/worldgen-c/src/main.c +++ b/worldgen-c/src/main.c @@ -89,7 +89,10 @@ static const kv_pair PROPS_DOOR_W_LOWER[] = {{"facing", "west"}, {"half", "lower static const kv_pair PROPS_DOOR_W_UPPER[] = {{"facing", "west"}, {"half", "upper"}, {"hinge", "left"}, {"open", "false"}, {"powered", "false"}}; static const kv_pair PROPS_DOOR_E_LOWER[] = {{"facing", "east"}, {"half", "lower"}, {"hinge", "left"}, {"open", "false"}, {"powered", "false"}}; static const kv_pair PROPS_DOOR_E_UPPER[] = {{"facing", "east"}, {"half", "upper"}, {"hinge", "left"}, {"open", "false"}, {"powered", "false"}}; - +static const kv_pair PROPS_LADDER_N[] = {{"facing", "north"}, {"waterlogged", "false"}}; +static const kv_pair PROPS_LADDER_S[] = {{"facing", "south"}, {"waterlogged", "false"}}; +static const kv_pair PROPS_LADDER_W[] = {{"facing", "west"}, {"waterlogged", "false"}}; +static const kv_pair PROPS_LADDER_E[] = {{"facing", "east"}, {"waterlogged", "false"}}; static const size_t BLOCK_STATE_CAP = 256; static const block_state BLOCK_STATE_TABLE[] = { [BLOCK_BEDROCK] = {"minecraft:bedrock", NULL, 0}, @@ -130,7 +133,11 @@ static const block_state BLOCK_STATE_TABLE[] = { [BLOCK_SPRUCE_DOOR_E_LOWER] = {"minecraft:spruce_door", PROPS_DOOR_E_LOWER, 5}, [BLOCK_SPRUCE_DOOR_E_UPPER] = {"minecraft:spruce_door", PROPS_DOOR_E_UPPER, 5}, [BLOCK_SPRUCE_STAIRS_E] = {"minecraft:spruce_stairs", PROPS_STAIRS_E, 4}, - [BLOCK_SPRUCE_STAIRS_W] = {"minecraft:spruce_stairs", PROPS_STAIRS_W, 4} + [BLOCK_SPRUCE_STAIRS_W] = {"minecraft:spruce_stairs", PROPS_STAIRS_W, 4}, + [BLOCK_LADDER_N] = {"minecraft:ladder", PROPS_LADDER_N, 2}, + [BLOCK_LADDER_S] = {"minecraft:ladder", PROPS_LADDER_S, 2}, + [BLOCK_LADDER_W] = {"minecraft:ladder", PROPS_LADDER_W, 2}, + [BLOCK_LADDER_E] = {"minecraft:ladder", PROPS_LADDER_E, 2} }; static const block_state *get_block_state(uint16_t id) { diff --git a/worldgen-c/src/worldgen.c b/worldgen-c/src/worldgen.c index 38f668f..67a3df2 100644 --- a/worldgen-c/src/worldgen.c +++ b/worldgen-c/src/worldgen.c @@ -132,9 +132,13 @@ static void generate_chunk_flowers(worldgen_ctx *ctx, int chunk_x, int chunk_z, static void generate_chunk_cabins(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out); static void trail_node_position(worldgen_ctx *ctx, int node_x, int node_z, double spacing, double *out_x, double *out_z); static void carve_trail_pad(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *out, column_data columns[CHUNK_SIZE][CHUNK_SIZE], int center_x, int center_z, int radius, int target_height); +static void carve_trail_span(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *out, column_data columns[CHUNK_SIZE][CHUNK_SIZE], int x0, int z0, int x1, int z1, int width); static double old_growth_plains_mask(worldgen_ctx *ctx, int x, int z); static double old_growth_grove_mask(worldgen_ctx *ctx, int x, int z); static uint16_t generate_normal_ores(worldgen_ctx *ctx, int x, int y, int z, const column_data *col); +static void connect_cabin_to_trail(worldgen_ctx *ctx, int chunk_x, int chunk_z, + column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *chunk, + int door_x, int door_z, int door_side, int path_width); static uint32_t hash_coords(int x, int z, uint32_t seed) { uint32_t h = (uint32_t)(x * 374761393 + z * 668265263) ^ seed; @@ -1373,11 +1377,14 @@ typedef struct { uint16_t stair_e_block; uint16_t stair_w_block; uint16_t window_block; + uint16_t foundation_block; double log_decay; double plank_decay; double window_chance; double door_decay; int door_rect_index; + int has_ladder; + int path_width; } cabin_blueprint; static const cabin_rect CABIN_RECT_SMALL[] = { @@ -1392,11 +1399,6 @@ static const cabin_rect CABIN_RECT_TWO_STORY[] = { {0, 0, 3, 3} }; -static const cabin_rect CABIN_RECT_L_SHAPE[] = { - {0, 0, 3, 3}, - {3, -2, 2, 2} -}; - static const cabin_blueprint CABIN_BLUEPRINTS[] = { { CABIN_RECT_SMALL, @@ -1411,11 +1413,14 @@ static const cabin_blueprint CABIN_BLUEPRINTS[] = { BLOCK_SPRUCE_STAIRS_E, BLOCK_SPRUCE_STAIRS_W, BLOCK_GLASS_PANE, + BLOCK_STONE, 0.04, 0.25, 0.45, - 0.35, - 0 + 0.08, + 0, + 0, + 2 }, { CABIN_RECT_LONG, @@ -1430,11 +1435,14 @@ static const cabin_blueprint CABIN_BLUEPRINTS[] = { BLOCK_SPRUCE_STAIRS_E, BLOCK_SPRUCE_STAIRS_W, BLOCK_GLASS_PANE, + BLOCK_STONE, 0.05, 0.3, 0.4, - 0.4, - 0 + 0.1, + 0, + 0, + 3 }, { CABIN_RECT_TWO_STORY, @@ -1449,30 +1457,14 @@ static const cabin_blueprint CABIN_BLUEPRINTS[] = { BLOCK_SPRUCE_STAIRS_E, BLOCK_SPRUCE_STAIRS_W, BLOCK_GLASS_PANE, + BLOCK_STONE, 0.04, 0.22, 0.5, - 0.3, - 0 - }, - { - CABIN_RECT_L_SHAPE, - sizeof(CABIN_RECT_L_SHAPE) / sizeof(CABIN_RECT_L_SHAPE[0]), - 3, + 0.08, + 0, 1, - BLOCK_OAK_PLANKS, - BLOCK_OAK_PLANKS, - BLOCK_OAK_LOG_X, - BLOCK_OAK_LOG_Z, - BLOCK_OAK_LOG, - BLOCK_SPRUCE_STAIRS_E, - BLOCK_SPRUCE_STAIRS_W, - BLOCK_GLASS_PANE, - 0.04, - 0.28, - 0.45, - 0.4, - 0 + 2 } }; @@ -1491,6 +1483,31 @@ static void update_columns_for_rect(column_data columns[CHUNK_SIZE][CHUNK_SIZE], } } +static int rect_overlaps_mask(unsigned char occupancy[CHUNK_SIZE][CHUNK_SIZE], int chunk_origin_x, int chunk_origin_z, + int x0, int x1, int z0, int z1, int padding) { + for (int wz = z0 - padding; wz <= z1 + padding; ++wz) { + for (int wx = x0 - padding; wx <= x1 + padding; ++wx) { + int lx = wx - chunk_origin_x; + int lz = wz - chunk_origin_z; + if (lx < 0 || lx >= CHUNK_SIZE || lz < 0 || lz >= CHUNK_SIZE) continue; + if (occupancy[lx][lz]) return 1; + } + } + return 0; +} + +static void mark_rect_occupancy(unsigned char occupancy[CHUNK_SIZE][CHUNK_SIZE], int chunk_origin_x, int chunk_origin_z, + int x0, int x1, int z0, int z1, int padding) { + for (int wz = z0 - padding; wz <= z1 + padding; ++wz) { + for (int wx = x0 - padding; wx <= x1 + padding; ++wx) { + int lx = wx - chunk_origin_x; + int lz = wz - chunk_origin_z; + if (lx < 0 || lx >= CHUNK_SIZE || lz < 0 || lz >= CHUNK_SIZE) continue; + occupancy[lx][lz] = 1; + } + } +} + static void build_cabin_roof(const cabin_blueprint *bp, int chunk_x, int chunk_z, chunk_data *chunk, int rect_center_x, int rect_center_z, int half_w, int half_l, int roof_base_y, rng_state *rng) { @@ -1533,11 +1550,15 @@ static void build_cabin_roof(const cabin_blueprint *bp, int chunk_x, int chunk_z } static void place_wall_window(chunk_data *chunk, int chunk_origin_x, int chunk_origin_z, - int wx, int wz, int window_y, uint16_t window_block) { + int wx, int wz, int window_y, uint16_t window_block, int height) { int lx = wx - chunk_origin_x; int lz = wz - chunk_origin_z; if (lx < 0 || lx >= CHUNK_SIZE || lz < 0 || lz >= CHUNK_SIZE) return; - set_block_with_height(chunk, lx, lz, window_y, window_block); + for (int h = 0; h < height; ++h) { + int y = window_y + h; + if (y >= CHUNK_HEIGHT) break; + set_block_with_height(chunk, lx, lz, y, window_block); + } } static void build_cabin_rect(worldgen_ctx *ctx, const cabin_blueprint *bp, const cabin_rect *rect, @@ -1564,11 +1585,27 @@ static void build_cabin_rect(worldgen_ctx *ctx, const cabin_blueprint *bp, const } } + uint16_t foundation_block = bp->foundation_block ? bp->foundation_block : BLOCK_STONE; + for (int wz = z0; wz <= z1; ++wz) { + for (int wx = x0; wx <= x1; ++wx) { + int lx = wx - chunk_origin_x; + int lz = wz - chunk_origin_z; + if (lx < 0 || lx >= CHUNK_SIZE || lz < 0 || lz >= CHUNK_SIZE) continue; + int column_height = columns[lx][lz].height; + if (column_height < base_floor_y) { + for (int y = column_height + 1; y <= base_floor_y; ++y) { + set_block_with_height(chunk, lx, lz, y, foundation_block); + } + columns[lx][lz].height = base_floor_y; + } + } + } + for (int story = 0; story < bp->stories; ++story) { int story_floor = base_floor_y + story * bp->wall_height; if (story_floor >= CHUNK_HEIGHT - 4) break; - for (int wz = z0; wz <= z1; ++wz) { - for (int wx = x0; wx <= x1; ++wx) { + for (int wz = z0 + 1; wz <= z1 - 1; ++wz) { + for (int wx = x0 + 1; wx <= x1 - 1; ++wx) { int lx = wx - chunk_origin_x; int lz = wz - chunk_origin_z; if (lx < 0 || lx >= CHUNK_SIZE || lz < 0 || lz >= CHUNK_SIZE) continue; @@ -1616,24 +1653,37 @@ static void build_cabin_rect(worldgen_ctx *ctx, const cabin_blueprint *bp, const if (bp->window_block && bp->window_chance > 0.0) { int window_y = story_floor + 2; - for (int wx = x0 + 1; wx <= x1 - 1; wx += 2) { + int window_height = (bp->wall_height >= 3) ? 2 : 1; + int min_win_x = x0 + 2; + int max_win_x = x1 - 2; + if (min_win_x > max_win_x) { + min_win_x = x0 + 1; + max_win_x = x1 - 1; + } + int min_win_z = z0 + 2; + int max_win_z = z1 - 2; + if (min_win_z > max_win_z) { + min_win_z = z0 + 1; + max_win_z = z1 - 1; + } + for (int wx = min_win_x; wx <= max_win_x; wx += 2) { if (story_has_door && door_side == 0 && wx == door_x) continue; if (rng_next_f64(rng) < bp->window_chance) { - place_wall_window(chunk, chunk_origin_x, chunk_origin_z, wx, z0, window_y, bp->window_block); + place_wall_window(chunk, chunk_origin_x, chunk_origin_z, wx, z0, window_y, bp->window_block, window_height); } if (story_has_door && door_side == 1 && wx == door_x) continue; if (rng_next_f64(rng) < bp->window_chance) { - place_wall_window(chunk, chunk_origin_x, chunk_origin_z, wx, z1, window_y, bp->window_block); + place_wall_window(chunk, chunk_origin_x, chunk_origin_z, wx, z1, window_y, bp->window_block, window_height); } } - for (int wz = z0 + 1; wz <= z1 - 1; wz += 2) { + for (int wz = min_win_z; wz <= max_win_z; wz += 2) { if (story_has_door && door_side == 2 && wz == door_z) continue; if (rng_next_f64(rng) < bp->window_chance) { - place_wall_window(chunk, chunk_origin_x, chunk_origin_z, x0, wz, window_y, bp->window_block); + place_wall_window(chunk, chunk_origin_x, chunk_origin_z, x0, wz, window_y, bp->window_block, window_height); } if (story_has_door && door_side == 3 && wz == door_z) continue; if (rng_next_f64(rng) < bp->window_chance) { - place_wall_window(chunk, chunk_origin_x, chunk_origin_z, x1, wz, window_y, bp->window_block); + place_wall_window(chunk, chunk_origin_x, chunk_origin_z, x1, wz, window_y, bp->window_block, window_height); } } } @@ -1656,6 +1706,29 @@ static void build_cabin_rect(worldgen_ctx *ctx, const cabin_blueprint *bp, const } } } + + if (bp->has_ladder && story < bp->stories - 1) { + int ladder_x = rect_center_x; + int ladder_z = z0 + 1; + uint16_t ladder_block = BLOCK_LADDER_S; + switch ((story + door_side) % 4) { + case 0: ladder_x = rect_center_x; ladder_z = z0 + 1; ladder_block = BLOCK_LADDER_S; break; + case 1: ladder_x = rect_center_x; ladder_z = z1 - 1; ladder_block = BLOCK_LADDER_N; break; + case 2: ladder_x = x0 + 1; ladder_z = rect_center_z; ladder_block = BLOCK_LADDER_E; break; + case 3: ladder_x = x1 - 1; ladder_z = rect_center_z; ladder_block = BLOCK_LADDER_W; break; + } + int lx = ladder_x - chunk_origin_x; + int lz = ladder_z - chunk_origin_z; + if (lx >= 0 && lx < CHUNK_SIZE && lz >= 0 && lz < CHUNK_SIZE) { + for (int y = story_floor + 1; y <= story_floor + bp->wall_height; ++y) { + set_block_with_height(chunk, lx, lz, y, ladder_block); + } + int next_floor = story_floor + bp->wall_height; + if (next_floor < CHUNK_HEIGHT) { + set_block_with_height(chunk, lx, lz, next_floor, BLOCK_AIR); + } + } + } } int roof_base = base_floor_y + bp->wall_height * bp->stories; @@ -1677,6 +1750,7 @@ static void build_cabin_rect(worldgen_ctx *ctx, const cabin_blueprint *bp, const } static int try_place_cabin(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *chunk, column_data columns[CHUNK_SIZE][CHUNK_SIZE], + unsigned char occupancy[CHUNK_SIZE][CHUNK_SIZE], int center_x, int center_z, const cabin_blueprint *bp, rng_state *rng) { int chunk_origin_x = chunk_x * CHUNK_SIZE; int chunk_origin_z = chunk_z * CHUNK_SIZE; @@ -1705,6 +1779,9 @@ static int try_place_cabin(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_da rect_x1[i] = x1; rect_z0[i] = z0; rect_z1[i] = z1; + if (rect_overlaps_mask(occupancy, chunk_origin_x, chunk_origin_z, x0, x1, z0, z1, 3)) { + return 0; + } for (int wz = z0; wz <= z1; ++wz) { for (int wx = x0; wx <= x1; ++wx) { int lx = wx - chunk_origin_x; @@ -1734,19 +1811,35 @@ static int try_place_cabin(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_da door_z = rect_center_z[door_rect_index]; } int door_offset = rng_range_inclusive(rng, -1, 1); - if (door_side == 0 || door_side == 1) { - door_x = clamp_int(door_x + door_offset, rect_x0[door_rect_index] + 1, rect_x1[door_rect_index] - 1); - } else { - door_z = clamp_int(door_z + door_offset, rect_z0[door_rect_index] + 1, rect_z1[door_rect_index] - 1); - } + int door_margin = 2; + if (door_side == 0 || door_side == 1) { + int min_door_x = rect_x0[door_rect_index] + door_margin; + int max_door_x = rect_x1[door_rect_index] - door_margin; + if (min_door_x > max_door_x) { + min_door_x = rect_x0[door_rect_index] + 1; + max_door_x = rect_x1[door_rect_index] - 1; + } + door_x = clamp_int(door_x + door_offset, min_door_x, max_door_x); + } else { + int min_door_z = rect_z0[door_rect_index] + door_margin; + int max_door_z = rect_z1[door_rect_index] - door_margin; + if (min_door_z > max_door_z) { + min_door_z = rect_z0[door_rect_index] + 1; + max_door_z = rect_z1[door_rect_index] - 1; + } + door_z = clamp_int(door_z + door_offset, min_door_z, max_door_z); + } for (size_t i = 0; i < bp->rect_count; ++i) { int has_door = (int)i == door_rect_index; build_cabin_rect(ctx, bp, &bp->rects[i], chunk_x, chunk_z, chunk, columns, rect_center_x[i], rect_center_z[i], base_floor_y, door_x, door_z, door_side, has_door, rng); + mark_rect_occupancy(occupancy, chunk_origin_x, chunk_origin_z, rect_x0[i], rect_x1[i], rect_z0[i], rect_z1[i], 3); } + connect_cabin_to_trail(ctx, chunk_x, chunk_z, columns, chunk, door_x, door_z, door_side, bp->path_width); + return 1; } @@ -1758,6 +1851,8 @@ static void generate_chunk_cabins(worldgen_ctx *ctx, int chunk_x, int chunk_z, c double spawn_chance = 0.015 + noise * 0.02; if (rng_next_f64(&rng) > spawn_chance) return; size_t blueprint_count = sizeof(CABIN_BLUEPRINTS) / sizeof(CABIN_BLUEPRINTS[0]); + unsigned char occupancy[CHUNK_SIZE][CHUNK_SIZE]; + memset(occupancy, 0, sizeof(occupancy)); int attempts = 1 + (rng_next_f64(&rng) < 0.2 ? 1 : 0); while (attempts-- > 0) { const cabin_blueprint *bp = &CABIN_BLUEPRINTS[rng_range_inclusive(&rng, 0, (int)blueprint_count - 1)]; @@ -1781,12 +1876,56 @@ static void generate_chunk_cabins(worldgen_ctx *ctx, int chunk_x, int chunk_z, c int local_cz = rng_range_inclusive(&rng, min_local_z, max_local_z); int world_cx = chunk_x * CHUNK_SIZE + local_cx; int world_cz = chunk_z * CHUNK_SIZE + local_cz; - if (try_place_cabin(ctx, chunk_x, chunk_z, out, columns, world_cx, world_cz, bp, &rng)) { + if (try_place_cabin(ctx, chunk_x, chunk_z, out, columns, occupancy, world_cx, world_cz, bp, &rng)) { break; } } } +static int find_nearest_trail_block(column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *chunk, int chunk_x, int chunk_z, + int start_x, int start_z, int search_radius, int *out_x, int *out_z) { + int chunk_origin_x = chunk_x * CHUNK_SIZE; + int chunk_origin_z = chunk_z * CHUNK_SIZE; + int local_start_x = start_x - chunk_origin_x; + int local_start_z = start_z - chunk_origin_z; + if (local_start_x < 0 || local_start_x >= CHUNK_SIZE || local_start_z < 0 || local_start_z >= CHUNK_SIZE) return 0; + for (int radius = 2; radius <= search_radius; ++radius) { + for (int dz = -radius; dz <= radius; ++dz) { + for (int dx = -radius; dx <= radius; ++dx) { + if (abs(dx) != radius && abs(dz) != radius) continue; + int world_x = start_x + dx; + int world_z = start_z + dz; + int lx = world_x - chunk_origin_x; + int lz = world_z - chunk_origin_z; + if (lx < 0 || lx >= CHUNK_SIZE || lz < 0 || lz >= CHUNK_SIZE) continue; + int column_height = columns[lx][lz].height; + if (column_height < 0 || column_height >= CHUNK_HEIGHT) continue; + uint16_t block = chunk->blocks[column_height][lx][lz]; + if (block == BLOCK_GRAVEL) { + *out_x = world_x; + *out_z = world_z; + return 1; + } + } + } + } + return 0; +} + +static void connect_cabin_to_trail(worldgen_ctx *ctx, int chunk_x, int chunk_z, + column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *chunk, + int door_x, int door_z, int door_side, int path_width) { + int step_x = (door_side == 2) ? -1 : (door_side == 3) ? 1 : 0; + int step_z = (door_side == 0) ? -1 : (door_side == 1) ? 1 : 0; + int start_x = door_x + step_x; + int start_z = door_z + step_z; + int target_x = 0, target_z = 0; + if (!find_nearest_trail_block(columns, chunk, chunk_x, chunk_z, start_x, start_z, 24, &target_x, &target_z)) { + return; + } + carve_trail_span(ctx, chunk_x, chunk_z, chunk, columns, start_x, start_z, target_x, target_z, path_width > 0 ? path_width : 2); +} + static uint16_t generate_normal_ores(worldgen_ctx *ctx, int x, int y, int z, const column_data *col) { uint32_t seed = (uint32_t)ctx->world_seed; double cluster; @@ -1885,6 +2024,7 @@ static int column_has_manmade_surface(chunk_data *chunk, int chunk_x, int chunk_ block == BLOCK_OAK_LOG_X || block == BLOCK_OAK_LOG_Z || block == BLOCK_SPRUCE_LOG_X || block == BLOCK_SPRUCE_LOG_Z || block == BLOCK_GLASS_PANE || block == BLOCK_SPRUCE_STAIRS_E || block == BLOCK_SPRUCE_STAIRS_W || + block == BLOCK_LADDER_N || block == BLOCK_LADDER_S || block == BLOCK_LADDER_E || block == BLOCK_LADDER_W || block == BLOCK_SPRUCE_DOOR_N_LOWER || block == BLOCK_SPRUCE_DOOR_N_UPPER || block == BLOCK_SPRUCE_DOOR_S_LOWER || block == BLOCK_SPRUCE_DOOR_S_UPPER || block == BLOCK_SPRUCE_DOOR_E_LOWER || block == BLOCK_SPRUCE_DOOR_E_UPPER ||