diff --git a/src/main/java/de/diddiz/LogBlock/Logging.java b/src/main/java/de/diddiz/LogBlock/Logging.java index 9fcc710..79e8e4a 100644 --- a/src/main/java/de/diddiz/LogBlock/Logging.java +++ b/src/main/java/de/diddiz/LogBlock/Logging.java @@ -45,7 +45,8 @@ public enum Logging { DRAGONEGGTELEPORT(true), DAYLIGHTDETECTORINTERACT, LECTERNBOOKCHANGE(true), - SCAFFOLDING(true); + SCAFFOLDING(true), + SHULKER_BOX_CONTENT; public static final int length = Logging.values().length; private final boolean defaultEnabled; diff --git a/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecShulkerBox.java b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecShulkerBox.java new file mode 100644 index 0000000..ac59c27 --- /dev/null +++ b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecShulkerBox.java @@ -0,0 +1,85 @@ +package de.diddiz.LogBlock.blockstate; + +import static de.diddiz.LogBlock.config.Config.getWorldConfig; + +import de.diddiz.LogBlock.Logging; +import de.diddiz.LogBlock.config.WorldConfig; +import de.diddiz.util.BukkitUtils; +import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.block.ShulkerBox; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; + +public class BlockStateCodecShulkerBox implements BlockStateCodec { + @Override + public Material[] getApplicableMaterials() { + return BukkitUtils.getShulkerBoxBlocks().toArray(new Material[BukkitUtils.getShulkerBoxBlocks().size()]); + } + + @Override + public YamlConfiguration serialize(BlockState state) { + WorldConfig wcfg = getWorldConfig(state.getWorld()); + if (wcfg == null || !wcfg.isLogging(Logging.SHULKER_BOX_CONTENT)) { + return null; + } + if (state instanceof ShulkerBox) { + ShulkerBox shulkerBox = (ShulkerBox) state; + ItemStack[] content = shulkerBox.getSnapshotInventory().getStorageContents(); + YamlConfiguration conf = new YamlConfiguration(); + boolean anySlot = false; + for (int i = 0; i < content.length; i++) { + ItemStack stack = content[i]; + if (stack != null && stack.getType() != Material.AIR) { + conf.set("slot" + i, stack); + anySlot = true; + } + } + if (anySlot) { + return conf; + } + } + return null; + } + + @Override + public void deserialize(BlockState state, YamlConfiguration conf) { + if (state instanceof ShulkerBox) { + ShulkerBox shulkerBox = (ShulkerBox) state; + if (conf != null) { + ItemStack[] content = shulkerBox.getSnapshotInventory().getStorageContents(); + for (int i = 0; i < content.length; i++) { + ItemStack stack = conf.getItemStack("slot" + i); + if (stack != null && stack.getType() != Material.AIR) { + content[i] = stack; + } + } + shulkerBox.getSnapshotInventory().setContents(content); + } + } + } + + @Override + public String toString(YamlConfiguration conf) { + if (conf != null) { + StringBuilder sb = new StringBuilder(); + sb.append("["); + boolean anySlot = false; + for (String key : conf.getKeys(false)) { + if (key.startsWith("slot")) { + ItemStack stack = conf.getItemStack(key); + if (stack != null && stack.getType() != Material.AIR) { + if (anySlot) { + sb.append(","); + } + anySlot = true; + sb.append(stack.getAmount()).append("x").append(stack.getType()); + } + } + } + sb.append("]"); + return anySlot ? sb.toString() : null; + } + return null; + } +} diff --git a/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecs.java b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecs.java index 403d8d1..b610fa3 100644 --- a/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecs.java +++ b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecs.java @@ -26,6 +26,7 @@ public class BlockStateCodecs { registerCodec(new BlockStateCodecBanner()); registerCodec(new BlockStateCodecSpawner()); registerCodec(new BlockStateCodecLectern()); + registerCodec(new BlockStateCodecShulkerBox()); } public static boolean hasCodec(Material material) { diff --git a/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java index 17d3c29..9f1d11c 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/BlockBreakLogging.java @@ -40,7 +40,7 @@ public class BlockBreakLogging extends LoggingListener { final Block origin = event.getBlock(); final Material type = origin.getType(); - if (wcfg.isLogging(Logging.CHESTACCESS) && BukkitUtils.getContainerBlocks().contains(type)) { + if (wcfg.isLogging(Logging.CHESTACCESS) && BukkitUtils.getContainerBlocks().contains(type) && !BukkitUtils.getShulkerBoxBlocks().contains(type)) { consumer.queueContainerBreak(actor, origin.getState()); } else if (type == Material.ICE) { // When in creative mode ice doesn't form water diff --git a/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java index af5e285..237c5d1 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/ExplosionLogging.java @@ -113,7 +113,7 @@ public class ExplosionLogging extends LoggingListener { } for (final Block block : event.blockList()) { final Material type = block.getType(); - if (wcfg.isLogging(Logging.CHESTACCESS) && (getContainerBlocks().contains(type))) { + if (wcfg.isLogging(Logging.CHESTACCESS) && getContainerBlocks().contains(type) && !BukkitUtils.getShulkerBoxBlocks().contains(type)) { consumer.queueContainerBreak(actor, block.getState()); } else { consumer.queueBlockBreak(actor, block.getState()); @@ -168,7 +168,7 @@ public class ExplosionLogging extends LoggingListener { } final Material type = block.getType(); - if (wcfg.isLogging(Logging.CHESTACCESS) && (getContainerBlocks().contains(type))) { + if (wcfg.isLogging(Logging.CHESTACCESS) && getContainerBlocks().contains(type) && !BukkitUtils.getShulkerBoxBlocks().contains(type)) { consumer.queueContainerBreak(actor, block.getState()); } else { consumer.queueBlockBreak(actor, block.getState()); diff --git a/src/main/java/de/diddiz/util/BukkitUtils.java b/src/main/java/de/diddiz/util/BukkitUtils.java index 7bb8b51..c69c2b4 100644 --- a/src/main/java/de/diddiz/util/BukkitUtils.java +++ b/src/main/java/de/diddiz/util/BukkitUtils.java @@ -55,6 +55,7 @@ public class BukkitUtils { private static final Set cropBlocks; private static final Set containerBlocks; + private static final Set shulkerBoxBlocks; private static final Set singleBlockPlants; private static final Set doublePlants; @@ -316,6 +317,26 @@ public class BukkitUtils { cropBlocks.add(Material.POTATO); cropBlocks.add(Material.BEETROOT); + // Shulker Boxes + shulkerBoxBlocks = EnumSet.noneOf(Material.class); + shulkerBoxBlocks.add(Material.SHULKER_BOX); + shulkerBoxBlocks.add(Material.BLACK_SHULKER_BOX); + shulkerBoxBlocks.add(Material.BLUE_SHULKER_BOX); + shulkerBoxBlocks.add(Material.LIGHT_GRAY_SHULKER_BOX); + shulkerBoxBlocks.add(Material.BROWN_SHULKER_BOX); + shulkerBoxBlocks.add(Material.CYAN_SHULKER_BOX); + shulkerBoxBlocks.add(Material.GRAY_SHULKER_BOX); + shulkerBoxBlocks.add(Material.GREEN_SHULKER_BOX); + shulkerBoxBlocks.add(Material.LIGHT_BLUE_SHULKER_BOX); + shulkerBoxBlocks.add(Material.MAGENTA_SHULKER_BOX); + shulkerBoxBlocks.add(Material.LIME_SHULKER_BOX); + shulkerBoxBlocks.add(Material.ORANGE_SHULKER_BOX); + shulkerBoxBlocks.add(Material.PINK_SHULKER_BOX); + shulkerBoxBlocks.add(Material.PURPLE_SHULKER_BOX); + shulkerBoxBlocks.add(Material.RED_SHULKER_BOX); + shulkerBoxBlocks.add(Material.WHITE_SHULKER_BOX); + shulkerBoxBlocks.add(Material.YELLOW_SHULKER_BOX); + // Container Blocks containerBlocks = EnumSet.noneOf(Material.class); containerBlocks.add(Material.CHEST); @@ -325,23 +346,7 @@ public class BukkitUtils { containerBlocks.add(Material.HOPPER); containerBlocks.add(Material.BREWING_STAND); containerBlocks.add(Material.FURNACE); - containerBlocks.add(Material.SHULKER_BOX); - containerBlocks.add(Material.BLACK_SHULKER_BOX); - containerBlocks.add(Material.BLUE_SHULKER_BOX); - containerBlocks.add(Material.LIGHT_GRAY_SHULKER_BOX); - containerBlocks.add(Material.BROWN_SHULKER_BOX); - containerBlocks.add(Material.CYAN_SHULKER_BOX); - containerBlocks.add(Material.GRAY_SHULKER_BOX); - containerBlocks.add(Material.GREEN_SHULKER_BOX); - containerBlocks.add(Material.LIGHT_BLUE_SHULKER_BOX); - containerBlocks.add(Material.MAGENTA_SHULKER_BOX); - containerBlocks.add(Material.LIME_SHULKER_BOX); - containerBlocks.add(Material.ORANGE_SHULKER_BOX); - containerBlocks.add(Material.PINK_SHULKER_BOX); - containerBlocks.add(Material.PURPLE_SHULKER_BOX); - containerBlocks.add(Material.RED_SHULKER_BOX); - containerBlocks.add(Material.WHITE_SHULKER_BOX); - containerBlocks.add(Material.YELLOW_SHULKER_BOX); + containerBlocks.addAll(shulkerBoxBlocks); containerBlocks.add(Material.BARREL); containerBlocks.add(Material.BLAST_FURNACE); containerBlocks.add(Material.SMOKER); @@ -586,6 +591,10 @@ public class BukkitUtils { return containerBlocks; } + public static Set getShulkerBoxBlocks() { + return shulkerBoxBlocks; + } + public static boolean isConcreteBlock(Material m) { return concreteBlocks.contains(m); }