From 6572946b3d444785a2a1d3d1d7c642d963fead5d Mon Sep 17 00:00:00 2001 From: Intelli Date: Wed, 1 Oct 2025 19:06:00 -0600 Subject: [PATCH] Added support for copper chests --- .../net/coreprotect/bukkit/BukkitAdapter.java | 14 +++++++ .../coreprotect/bukkit/BukkitInterface.java | 5 +++ .../net/coreprotect/bukkit/Bukkit_v1_21.java | 38 +++++++++++++++++++ .../database/rollback/RollbackProcessor.java | 2 +- .../player/PlayerInteractListener.java | 2 +- .../net/coreprotect/utility/BlockUtils.java | 1 + 6 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index f498ef3..a7a2284 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -1,7 +1,10 @@ package net.coreprotect.bukkit; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.bukkit.Color; import org.bukkit.DyeColor; @@ -85,6 +88,7 @@ public class BukkitAdapter implements BukkitInterface { } // -------------------- Basic data conversion methods -------------------- + public static Set EMPTY_SET = new HashSet<>(Arrays.asList()); @Override public String parseLegacyName(String name) { @@ -350,4 +354,14 @@ public class BukkitAdapter implements BukkitInterface { public Object getRegistryValue(String key, Object tClass) { return null; } + + @Override + public boolean isCopperChest(Material material) { + return false; + } + + @Override + public Set copperChestMaterials() { + return EMPTY_SET; + } } diff --git a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java index a648b26..9614eff 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java @@ -2,6 +2,7 @@ package net.coreprotect.bukkit; import java.util.List; import java.util.Map; +import java.util.Set; import org.bukkit.Material; import org.bukkit.World; @@ -432,4 +433,8 @@ public interface BukkitInterface { * @return The parsed name */ String parseLegacyName(String name); + + boolean isCopperChest(Material material); + + Set copperChestMaterials(); } diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java index 6cea78e..64220ff 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java @@ -1,5 +1,7 @@ package net.coreprotect.bukkit; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -22,6 +24,8 @@ import net.coreprotect.model.BlockGroup; */ public class Bukkit_v1_21 extends Bukkit_v1_20 implements BukkitInterface { + public static Set COPPER_CHESTS = new HashSet<>(Arrays.asList()); + /** * Initializes the Bukkit_v1_21 adapter with 1.21-specific block groups and mappings. * Sets up collections of blocks with similar behavior for efficient handling. @@ -29,6 +33,9 @@ public class Bukkit_v1_21 extends Bukkit_v1_20 implements BukkitInterface { public Bukkit_v1_21() { initializeBlockGroups(); initializeTrapdoorBlocks(); + BlockGroup.INTERACT_BLOCKS.addAll(copperChestMaterials()); + BlockGroup.CONTAINERS.addAll(copperChestMaterials()); + BlockGroup.UPDATE_STATE.addAll(copperChestMaterials()); } /** @@ -154,4 +161,35 @@ public class Bukkit_v1_21 extends Bukkit_v1_20 implements BukkitInterface { wolf.setVariant(variant); } + + @Override + public boolean isCopperChest(Material material) { + if (COPPER_CHESTS.contains(material) && material != Material.CHEST) { + return true; + } + + return false; + } + + @Override + public Set copperChestMaterials() { + if (COPPER_CHESTS.isEmpty()) { + Material copperChest = Material.getMaterial("COPPER_CHEST"); + if (copperChest == null) { + COPPER_CHESTS.add(Material.CHEST); + } + else { + COPPER_CHESTS.add(Material.getMaterial("COPPER_CHEST")); + COPPER_CHESTS.add(Material.getMaterial("EXPOSED_COPPER_CHEST")); + COPPER_CHESTS.add(Material.getMaterial("WEATHERED_COPPER_CHEST")); + COPPER_CHESTS.add(Material.getMaterial("OXIDIZED_COPPER_CHEST")); + COPPER_CHESTS.add(Material.getMaterial("WAXED_COPPER_CHEST")); + COPPER_CHESTS.add(Material.getMaterial("WAXED_EXPOSED_COPPER_CHEST")); + COPPER_CHESTS.add(Material.getMaterial("WAXED_WEATHERED_COPPER_CHEST")); + COPPER_CHESTS.add(Material.getMaterial("WAXED_OXIDIZED_COPPER_CHEST")); + } + } + + return COPPER_CHESTS; + } } diff --git a/src/main/java/net/coreprotect/database/rollback/RollbackProcessor.java b/src/main/java/net/coreprotect/database/rollback/RollbackProcessor.java index d566fa4..21788c8 100644 --- a/src/main/java/net/coreprotect/database/rollback/RollbackProcessor.java +++ b/src/main/java/net/coreprotect/database/rollback/RollbackProcessor.java @@ -209,7 +209,7 @@ public class RollbackProcessor { BlockData checkData = rowType == Material.AIR ? blockData : rawBlockData; if (checkData != null) { if (checkData.getAsString().equals(pendingChangeData.getAsString()) || checkData instanceof org.bukkit.block.data.MultipleFacing || checkData instanceof org.bukkit.block.data.type.Stairs || checkData instanceof org.bukkit.block.data.type.RedstoneWire) { - if (rowType != Material.CHEST && rowType != Material.TRAPPED_CHEST) { // always update double chests + if (rowType != Material.CHEST && rowType != Material.TRAPPED_CHEST && !BukkitAdapter.ADAPTER.isCopperChest(rowType)) { // always update double chests changeBlock = false; } } diff --git a/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java b/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java index 35c997f..680aa61 100755 --- a/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java +++ b/src/main/java/net/coreprotect/listener/player/PlayerInteractListener.java @@ -145,7 +145,7 @@ public final class PlayerInteractListener extends Queue implements Listener { } else if (isContainerBlock && Config.getConfig(world).ITEM_TRANSACTIONS) { Location location = null; - if (type.equals(Material.CHEST) || type.equals(Material.TRAPPED_CHEST)) { + if (type.equals(Material.CHEST) || type.equals(Material.TRAPPED_CHEST) || BukkitAdapter.ADAPTER.isCopperChest(type)) { Chest chest = (Chest) clickedBlock.getState(); InventoryHolder inventoryHolder = chest.getInventory().getHolder(); diff --git a/src/main/java/net/coreprotect/utility/BlockUtils.java b/src/main/java/net/coreprotect/utility/BlockUtils.java index b8eb786..0cb09cf 100644 --- a/src/main/java/net/coreprotect/utility/BlockUtils.java +++ b/src/main/java/net/coreprotect/utility/BlockUtils.java @@ -208,6 +208,7 @@ public class BlockUtils { if (blockState instanceof BlockInventoryHolder) { if (singleBlock) { List chests = java.util.Arrays.asList(Material.CHEST, Material.TRAPPED_CHEST); + chests.addAll(BukkitAdapter.ADAPTER.copperChestMaterials()); Material type = blockState.getType(); if (chests.contains(type)) { inventory = ((org.bukkit.block.Chest) blockState).getBlockInventory();