From 5e5f790638821ede8bf09cfc242ba7c77255444d Mon Sep 17 00:00:00 2001 From: Christopher Bohn Date: Wed, 28 Jan 2026 22:18:15 -0800 Subject: [PATCH 1/4] Fix forceowner not working with persist mode --- src/main/java/com/griefcraft/modules/admin/AdminForceOwner.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/griefcraft/modules/admin/AdminForceOwner.java b/src/main/java/com/griefcraft/modules/admin/AdminForceOwner.java index 3d99f25..c5fba61 100644 --- a/src/main/java/com/griefcraft/modules/admin/AdminForceOwner.java +++ b/src/main/java/com/griefcraft/modules/admin/AdminForceOwner.java @@ -166,6 +166,7 @@ public void onCommand(LWCCommandEvent event) { action.setData(newOwner); } + player.removeAllActions(); player.addAction(action); lwc.sendLocale(sender, "protection.admin.forceowner.finalize", "player", newOwner); From 2f49c59b482362630e632033ac7ef766c8b2ecc7 Mon Sep 17 00:00:00 2001 From: Christopher Bohn Date: Wed, 28 Jan 2026 22:59:34 -0800 Subject: [PATCH 2/4] Update VersionUtil to prepare for new Minecraft version scheme --- .../java/com/griefcraft/util/VersionUtil.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/griefcraft/util/VersionUtil.java b/src/main/java/com/griefcraft/util/VersionUtil.java index d0def2d..4a298fd 100644 --- a/src/main/java/com/griefcraft/util/VersionUtil.java +++ b/src/main/java/com/griefcraft/util/VersionUtil.java @@ -5,11 +5,30 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +@SuppressWarnings("unused") public class VersionUtil { + private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)(\\.\\d+)?"); + + public static int getMajorVersion() { + return Integer.parseInt(getVersionParts(Bukkit.getVersion())[0]); + } public static int getMinorVersion() { - Matcher versionCheck = Pattern.compile("\\d[.]\\d+").matcher(Bukkit.getVersion()); - return versionCheck.find() ? Integer.parseInt(versionCheck.group().substring(2)) : -1; + return Integer.parseInt(getVersionParts(Bukkit.getVersion())[1]); } + public static int getPatchVersion() { + return Integer.parseInt(getVersionParts(Bukkit.getVersion())[2]); + } + + private static String[] getVersionParts(final String input) { + final Matcher versionMatcher = VERSION_PATTERN.matcher(input); + final String[] version = new String[]{"-1", "-1", "-1"}; + if (!versionMatcher.find()) { + return version; + } + final String[] versionParts = versionMatcher.group().split("\\."); + System.arraycopy(versionParts, 0, version, 0, versionParts.length); + return version; + } } From 2ebc392a52be21812309e65f752902963a48e229 Mon Sep 17 00:00:00 2001 From: Christopher Bohn Date: Thu, 29 Jan 2026 00:22:15 -0800 Subject: [PATCH 3/4] Do full semver compare --- .../java/com/griefcraft/lwc/LWCPlugin.java | 2 +- .../griefcraft/modules/limits/LimitsV2.java | 2 +- .../java/com/griefcraft/util/VersionUtil.java | 18 +++++++++++++ .../griefcraft/util/matchers/DoorMatcher.java | 25 ++++++++++--------- .../util/matchers/GravityMatcher.java | 11 ++++---- .../util/matchers/HangingMatcher.java | 5 ++-- .../griefcraft/util/matchers/WallMatcher.java | 11 ++++---- 7 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/griefcraft/lwc/LWCPlugin.java b/src/main/java/com/griefcraft/lwc/LWCPlugin.java index 9e6fc53..9cf7f68 100644 --- a/src/main/java/com/griefcraft/lwc/LWCPlugin.java +++ b/src/main/java/com/griefcraft/lwc/LWCPlugin.java @@ -517,7 +517,7 @@ private void registerEvents() { pluginManager.registerEvents(new LWCEntityListener(this), this); pluginManager.registerEvents(new LWCBlockListener(this), this); pluginManager.registerEvents(new LWCServerListener(this), this); - if (VersionUtil.getMinorVersion() > 13) { + if (VersionUtil.isAtLeast(1, 14)) { pluginManager.registerEvents(new LWC114Listener(), this); } if (Bukkit.getPluginManager().getPlugin("Towny") != null) { diff --git a/src/main/java/com/griefcraft/modules/limits/LimitsV2.java b/src/main/java/com/griefcraft/modules/limits/LimitsV2.java index 52fd52d..d2e90d0 100644 --- a/src/main/java/com/griefcraft/modules/limits/LimitsV2.java +++ b/src/main/java/com/griefcraft/modules/limits/LimitsV2.java @@ -113,7 +113,7 @@ public class LimitsV2 extends JavaModule { Material.PURPLE_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.PINK_SHULKER_BOX); static { - if (VersionUtil.getMinorVersion() > 13) { + if (VersionUtil.isAtLeast(1, 14)) { SIGNS = EnumSet.of(Material.OAK_WALL_SIGN, Material.BIRCH_WALL_SIGN, Material.SPRUCE_WALL_SIGN, Material.JUNGLE_WALL_SIGN, Material.ACACIA_WALL_SIGN, Material.DARK_OAK_WALL_SIGN, Material.OAK_SIGN, Material.BIRCH_SIGN, Material.SPRUCE_SIGN, diff --git a/src/main/java/com/griefcraft/util/VersionUtil.java b/src/main/java/com/griefcraft/util/VersionUtil.java index 4a298fd..eb08b46 100644 --- a/src/main/java/com/griefcraft/util/VersionUtil.java +++ b/src/main/java/com/griefcraft/util/VersionUtil.java @@ -9,6 +9,24 @@ public class VersionUtil { private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)(\\.\\d+)?"); + public static boolean isAtLeast(final int major, final int minor, final int patch) { + final String[] versionParts = getVersionParts(Bukkit.getVersion()); + final int majorPart = Integer.parseInt(versionParts[0]); + if (majorPart > major) { + return true; + } + final int minorPart = Integer.parseInt(versionParts[1]); + if (majorPart == major && minorPart > minor) { + return true; + } + final int patchPart = Integer.parseInt(versionParts[2]); + return majorPart == major && minorPart == minor && patchPart >= patch; + } + + public static boolean isAtLeast(final int major, final int minor) { + return isAtLeast(major, minor, -1); + } + public static int getMajorVersion() { return Integer.parseInt(getVersionParts(Bukkit.getVersion())[0]); } diff --git a/src/main/java/com/griefcraft/util/matchers/DoorMatcher.java b/src/main/java/com/griefcraft/util/matchers/DoorMatcher.java index 06d54c2..d132139 100644 --- a/src/main/java/com/griefcraft/util/matchers/DoorMatcher.java +++ b/src/main/java/com/griefcraft/util/matchers/DoorMatcher.java @@ -86,7 +86,7 @@ public class DoorMatcher implements ProtectionFinder.Matcher { Material.SPRUCE_PRESSURE_PLATE, Material.BIRCH_PRESSURE_PLATE, Material.JUNGLE_PRESSURE_PLATE, Material.ACACIA_PRESSURE_PLATE, Material.DARK_OAK_PRESSURE_PLATE, Material.STONE_PRESSURE_PLATE, Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Material.HEAVY_WEIGHTED_PRESSURE_PLATE); - if (VersionUtil.getMinorVersion() > 15) { + if (VersionUtil.isAtLeast(1, 16)) { PROTECTABLES_DOORS.addAll(EnumSet.of(Material.CRIMSON_DOOR, Material.WARPED_DOOR)); WOODEN_DOORS.addAll(EnumSet.of(Material.CRIMSON_DOOR, Material.WARPED_DOOR)); FENCE_GATES.addAll(EnumSet.of(Material.CRIMSON_FENCE_GATE, Material.WARPED_FENCE_GATE)); @@ -96,7 +96,7 @@ public class DoorMatcher implements ProtectionFinder.Matcher { PRESSURE_PLATES.addAll(EnumSet.of(Material.CRIMSON_PRESSURE_PLATE, Material.WARPED_PRESSURE_PLATE, Material.POLISHED_BLACKSTONE_PRESSURE_PLATE)); } - if (VersionUtil.getMinorVersion() > 18) { + if (VersionUtil.isAtLeast(1, 19)) { PROTECTABLES_DOORS.add(Material.MANGROVE_DOOR); WOODEN_DOORS.add(Material.MANGROVE_DOOR); FENCE_GATES.add(Material.MANGROVE_FENCE_GATE); @@ -105,7 +105,7 @@ public class DoorMatcher implements ProtectionFinder.Matcher { WOODEN_TRAP_DOORS.add(Material.MANGROVE_TRAPDOOR); PRESSURE_PLATES.add(Material.MANGROVE_PRESSURE_PLATE); } - if (VersionUtil.getMinorVersion() > 19) { + if (VersionUtil.isAtLeast(1, 20)) { PROTECTABLES_DOORS.addAll(EnumSet.of(Material.BAMBOO_DOOR, Material.CHERRY_DOOR)); WOODEN_DOORS.addAll(EnumSet.of(Material.BAMBOO_DOOR, Material.CHERRY_DOOR)); FENCE_GATES.addAll(EnumSet.of(Material.BAMBOO_FENCE_GATE, Material.CHERRY_FENCE_GATE)); @@ -114,7 +114,7 @@ public class DoorMatcher implements ProtectionFinder.Matcher { WOODEN_TRAP_DOORS.addAll(EnumSet.of(Material.BAMBOO_TRAPDOOR, Material.CHERRY_TRAPDOOR)); PRESSURE_PLATES.addAll(EnumSet.of(Material.BAMBOO_PRESSURE_PLATE, Material.CHERRY_PRESSURE_PLATE)); } - if (VersionUtil.getMinorVersion() > 20) { + if (VersionUtil.isAtLeast(1, 21)) { PROTECTABLES_DOORS.addAll(EnumSet.of(Material.COPPER_DOOR, Material.EXPOSED_COPPER_DOOR, Material.OXIDIZED_COPPER_DOOR, Material.WAXED_COPPER_DOOR, Material.WEATHERED_COPPER_DOOR, Material.WAXED_EXPOSED_COPPER_DOOR, Material.WAXED_OXIDIZED_COPPER_DOOR, @@ -131,14 +131,15 @@ public class DoorMatcher implements ProtectionFinder.Matcher { Material.OXIDIZED_COPPER_TRAPDOOR, Material.WAXED_COPPER_TRAPDOOR, Material.WEATHERED_COPPER_TRAPDOOR, Material.WAXED_EXPOSED_COPPER_TRAPDOOR, Material.WAXED_OXIDIZED_COPPER_TRAPDOOR, Material.WAXED_WEATHERED_COPPER_TRAPDOOR)); - // Added in 1.21.4 - Optional.ofNullable(Material.getMaterial("PALE_OAK_DOOR")).ifPresent(PROTECTABLES_DOORS::add); - Optional.ofNullable(Material.getMaterial("PALE_OAK_DOOR")).ifPresent(WOODEN_DOORS::add); - Optional.ofNullable(Material.getMaterial("PALE_OAK_FENCE_GATE")).ifPresent(FENCE_GATES::add); - Optional.ofNullable(Material.getMaterial("PALE_OAK_FENCE_GATE")).ifPresent(WOODEN_FENCE_GATES::add); - Optional.ofNullable(Material.getMaterial("PALE_OAK_TRAPDOOR")).ifPresent(TRAP_DOORS::add); - Optional.ofNullable(Material.getMaterial("PALE_OAK_TRAPDOOR")).ifPresent(WOODEN_TRAP_DOORS::add); - Optional.ofNullable(Material.getMaterial("PALE_OAK_PRESSURE_PLATE")).ifPresent(PRESSURE_PLATES::add); + if (VersionUtil.isAtLeast(1, 21, 4)) { + Optional.ofNullable(Material.getMaterial("PALE_OAK_DOOR")).ifPresent(PROTECTABLES_DOORS::add); + Optional.ofNullable(Material.getMaterial("PALE_OAK_DOOR")).ifPresent(WOODEN_DOORS::add); + Optional.ofNullable(Material.getMaterial("PALE_OAK_FENCE_GATE")).ifPresent(FENCE_GATES::add); + Optional.ofNullable(Material.getMaterial("PALE_OAK_FENCE_GATE")).ifPresent(WOODEN_FENCE_GATES::add); + Optional.ofNullable(Material.getMaterial("PALE_OAK_TRAPDOOR")).ifPresent(TRAP_DOORS::add); + Optional.ofNullable(Material.getMaterial("PALE_OAK_TRAPDOOR")).ifPresent(WOODEN_TRAP_DOORS::add); + Optional.ofNullable(Material.getMaterial("PALE_OAK_PRESSURE_PLATE")).ifPresent(PRESSURE_PLATES::add); + } } } diff --git a/src/main/java/com/griefcraft/util/matchers/GravityMatcher.java b/src/main/java/com/griefcraft/util/matchers/GravityMatcher.java index a3de81d..ab2f81f 100644 --- a/src/main/java/com/griefcraft/util/matchers/GravityMatcher.java +++ b/src/main/java/com/griefcraft/util/matchers/GravityMatcher.java @@ -57,28 +57,27 @@ public class GravityMatcher implements ProtectionFinder.Matcher { Material.LIME_BANNER, Material.PINK_BANNER, Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER, Material.PURPLE_BANNER, Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER, Material.RED_BANNER, Material.BLACK_BANNER, Material.ARMOR_STAND); - if (VersionUtil.getMinorVersion() > 13) { + if (VersionUtil.isAtLeast(1, 14)) { PROTECTABLES_POSTS.addAll(EnumSet.of(Material.OAK_SIGN, Material.BIRCH_SIGN, Material.SPRUCE_SIGN, Material.JUNGLE_SIGN, Material.ACACIA_SIGN, Material.DARK_OAK_SIGN)); } else { PROTECTABLES_POSTS.add(Material.getMaterial("SIGN")); } - if (VersionUtil.getMinorVersion() > 15) { + if (VersionUtil.isAtLeast(1, 16)) { PROTECTABLES_POSTS.addAll(EnumSet.of(Material.CRIMSON_BUTTON, Material.WARPED_BUTTON, Material.POLISHED_BLACKSTONE_BUTTON, Material.CRIMSON_PRESSURE_PLATE, Material.WARPED_PRESSURE_PLATE, Material.POLISHED_BLACKSTONE_PRESSURE_PLATE, Material.CRIMSON_SIGN, Material.WARPED_SIGN)); } - if (VersionUtil.getMinorVersion() > 18) { + if (VersionUtil.isAtLeast(1, 19)) { PROTECTABLES_POSTS.addAll(EnumSet.of(Material.MANGROVE_BUTTON, Material.MANGROVE_PRESSURE_PLATE, Material.MANGROVE_SIGN)); } - if (VersionUtil.getMinorVersion() > 19) { + if (VersionUtil.isAtLeast(1, 20)) { PROTECTABLES_POSTS.addAll(EnumSet.of(Material.BAMBOO_BUTTON, Material.BAMBOO_PRESSURE_PLATE, Material.BAMBOO_SIGN, Material.CHERRY_BUTTON, Material.CHERRY_PRESSURE_PLATE, Material.CHERRY_SIGN)); } - if (VersionUtil.getMinorVersion() > 20) { - // Added in 1.21.4 + if (VersionUtil.isAtLeast(1, 21, 4)) { Optional.ofNullable(Material.getMaterial("PALE_OAK_BUTTON")).ifPresent(PROTECTABLES_POSTS::add); Optional.ofNullable(Material.getMaterial("PALE_OAK_PRESSURE_PLATE")).ifPresent(PROTECTABLES_POSTS::add); Optional.ofNullable(Material.getMaterial("PALE_OAK_SIGN")).ifPresent(PROTECTABLES_POSTS::add); diff --git a/src/main/java/com/griefcraft/util/matchers/HangingMatcher.java b/src/main/java/com/griefcraft/util/matchers/HangingMatcher.java index f78478e..205bfe1 100644 --- a/src/main/java/com/griefcraft/util/matchers/HangingMatcher.java +++ b/src/main/java/com/griefcraft/util/matchers/HangingMatcher.java @@ -17,14 +17,13 @@ public class HangingMatcher implements ProtectionFinder.Matcher { public static final Set PROTECTABLES_HANGING = EnumSet.noneOf(Material.class); static { - if (VersionUtil.getMinorVersion() > 19) { + if (VersionUtil.isAtLeast(1, 20)) { PROTECTABLES_HANGING.addAll(EnumSet.of(Material.OAK_HANGING_SIGN, Material.BIRCH_HANGING_SIGN, Material.SPRUCE_HANGING_SIGN, Material.JUNGLE_HANGING_SIGN, Material.ACACIA_HANGING_SIGN, Material.DARK_OAK_HANGING_SIGN, Material.CRIMSON_HANGING_SIGN, Material.WARPED_HANGING_SIGN, Material.MANGROVE_HANGING_SIGN, Material.BAMBOO_HANGING_SIGN, Material.CHERRY_HANGING_SIGN)); } - if (VersionUtil.getMinorVersion() > 20) { - // Added in 1.21.4 + if (VersionUtil.isAtLeast(1, 21, 4)) { Optional.ofNullable(Material.getMaterial("PALE_OAK_HANGING_SIGN")).ifPresent(PROTECTABLES_HANGING::add); } } diff --git a/src/main/java/com/griefcraft/util/matchers/WallMatcher.java b/src/main/java/com/griefcraft/util/matchers/WallMatcher.java index fd52473..7cf2ae6 100644 --- a/src/main/java/com/griefcraft/util/matchers/WallMatcher.java +++ b/src/main/java/com/griefcraft/util/matchers/WallMatcher.java @@ -58,24 +58,23 @@ public class WallMatcher implements ProtectionFinder.Matcher { Material.LIGHT_GRAY_WALL_BANNER, Material.CYAN_WALL_BANNER, Material.PURPLE_WALL_BANNER, Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.GREEN_WALL_BANNER, Material.RED_WALL_BANNER, Material.BLACK_WALL_BANNER); - if (VersionUtil.getMinorVersion() > 13) { + if (VersionUtil.isAtLeast(1, 14)) { PROTECTABLES_WALL.addAll(EnumSet.of(Material.OAK_WALL_SIGN, Material.BIRCH_WALL_SIGN, Material.SPRUCE_WALL_SIGN, Material.JUNGLE_WALL_SIGN, Material.ACACIA_WALL_SIGN, Material.DARK_OAK_WALL_SIGN)); } else { PROTECTABLES_WALL.add(Material.getMaterial("WALL_SIGN")); } - if (VersionUtil.getMinorVersion() > 15) { + if (VersionUtil.isAtLeast(1, 16)) { PROTECTABLES_WALL.addAll(EnumSet.of(Material.CRIMSON_WALL_SIGN, Material.WARPED_WALL_SIGN)); } - if (VersionUtil.getMinorVersion() > 18) { + if (VersionUtil.isAtLeast(1, 19)) { PROTECTABLES_WALL.add(Material.MANGROVE_WALL_SIGN); } - if (VersionUtil.getMinorVersion() > 19) { + if (VersionUtil.isAtLeast(1, 20)) { PROTECTABLES_WALL.addAll(EnumSet.of(Material.BAMBOO_WALL_SIGN, Material.CHERRY_WALL_SIGN)); } - if (VersionUtil.getMinorVersion() > 20) { - // Added in 1.21.4 + if (VersionUtil.isAtLeast(1, 21, 4)) { Optional.ofNullable(Material.getMaterial("PALE_OAK_SIGN")).ifPresent(PROTECTABLES_WALL::add); } } From c152ce94a78fabad83409f5ed60006c290b0a299 Mon Sep 17 00:00:00 2001 From: Christopher Bohn Date: Thu, 29 Jan 2026 01:11:36 -0800 Subject: [PATCH 4/4] Update matchers and default config for missing blocks --- .../util/matchers/DoubleChestMatcher.java | 15 +++++ src/main/resources/config/core.yml | 66 +++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/src/main/java/com/griefcraft/util/matchers/DoubleChestMatcher.java b/src/main/java/com/griefcraft/util/matchers/DoubleChestMatcher.java index 9ded481..7667b08 100644 --- a/src/main/java/com/griefcraft/util/matchers/DoubleChestMatcher.java +++ b/src/main/java/com/griefcraft/util/matchers/DoubleChestMatcher.java @@ -29,6 +29,7 @@ package com.griefcraft.util.matchers; import com.griefcraft.util.ProtectionFinder; +import com.griefcraft.util.VersionUtil; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -36,6 +37,7 @@ import org.bukkit.block.data.type.Chest; import java.util.EnumSet; +import java.util.Optional; import java.util.Set; /** @@ -48,6 +50,19 @@ public class DoubleChestMatcher implements ProtectionFinder.Matcher { */ public static final Set PROTECTABLES_CHESTS = EnumSet.of(Material.CHEST, Material.TRAPPED_CHEST); + static { + if (VersionUtil.isAtLeast(1, 21, 9)) { + Optional.ofNullable(Material.getMaterial("COPPER_CHEST")).ifPresent(PROTECTABLES_CHESTS::add); + Optional.ofNullable(Material.getMaterial("EXPOSED_COPPER_CHEST")).ifPresent(PROTECTABLES_CHESTS::add); + Optional.ofNullable(Material.getMaterial("OXIDIZED_COPPER_CHEST")).ifPresent(PROTECTABLES_CHESTS::add); + Optional.ofNullable(Material.getMaterial("WAXED_COPPER_CHEST")).ifPresent(PROTECTABLES_CHESTS::add); + Optional.ofNullable(Material.getMaterial("WAXED_EXPOSED_COPPER_CHEST")).ifPresent(PROTECTABLES_CHESTS::add); + Optional.ofNullable(Material.getMaterial("WAXED_OXIDIZED_COPPER_CHEST")).ifPresent(PROTECTABLES_CHESTS::add); + Optional.ofNullable(Material.getMaterial("WAXED_WEATHERED_COPPER_CHEST")).ifPresent(PROTECTABLES_CHESTS::add); + Optional.ofNullable(Material.getMaterial("WEATHERED_COPPER_CHEST")).ifPresent(PROTECTABLES_CHESTS::add); + } + } + /** * Possible faces around the base block that protections could be at */ diff --git a/src/main/resources/config/core.yml b/src/main/resources/config/core.yml index 90508ee..6b8ba5c 100644 --- a/src/main/resources/config/core.yml +++ b/src/main/resources/config/core.yml @@ -187,6 +187,30 @@ protections: trapped_chest: enabled: true autoRegister: private + copper_chest: + enabled: true + autoRegister: private + exposed_copper_chest: + enabled: true + autoRegister: private + oxidized_copper_chest: + enabled: true + autoRegister: private + waxed_copper_chest: + enabled: true + autoRegister: private + waxed_exposed_copper_chest: + enabled: true + autoRegister: private + waxed_oxidized_copper_chest: + enabled: true + autoRegister: private + waxed_weathered_copper_chest: + enabled: true + autoRegister: private + weathered_copper_chest: + enabled: true + autoRegister: private furnace: enabled: true autoRegister: private @@ -211,6 +235,48 @@ protections: lectern: enabled: true autoRegister: private + decorated_pot: + enabled: true + autoRegister: private + crafter: + enabled: true + autoRegister: private + acacia_shelf: + enabled: true + autoRegister: private + bamboo_shelf: + enabled: true + autoRegister: private + birch_shelf: + enabled: true + autoRegister: private + cherry_shelf: + enabled: true + autoRegister: private + crimson_shelf: + enabled: true + autoRegister: private + dark_oak_shelf: + enabled: true + autoRegister: private + jungle_shelf: + enabled: true + autoRegister: private + mangrove_shelf: + enabled: true + autoRegister: private + oak_shelf: + enabled: true + autoRegister: private + pale_oak_shelf: + enabled: true + autoRegister: private + spruce_shelf: + enabled: true + autoRegister: private + warped_shelf: + enabled: true + autoRegister: private shulker_box: enabled: true autoRegister: private