diff --git a/src/main/java/com/viper/autosortchest/Main.java b/src/main/java/com/viper/autosortchest/Main.java index f57484b..4b181f5 100644 --- a/src/main/java/com/viper/autosortchest/Main.java +++ b/src/main/java/com/viper/autosortchest/Main.java @@ -1819,6 +1819,30 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor, org.b return attachedBlock.equals(chestBlock); } + /** + * Erzwingt: pro Container (Truhe/Fass, inkl. DoubleChest-Hälften) genau ein ASC-Schild. + * + * @param containerBlock Truhe/Fass-Block + * @param ignoreSignBlock optionales Schild, das ignoriert wird (z.B. gerade platziertes Schild) + */ + private boolean hasAscSignOnContainer(Block containerBlock, Block ignoreSignBlock) { + if (containerBlock == null || !isContainer(containerBlock)) return false; + + for (Block b : getContainerBlocks(containerBlock)) { + for (Block face : adjacentFaces(b)) { + if (ignoreSignBlock != null && face.equals(ignoreSignBlock)) continue; + if (!(face.getState() instanceof Sign otherSign)) continue; + if (!isSignAttachedToChest(face, b)) continue; + + String l0 = ChatColor.stripColor(otherSign.getLine(0) != null ? otherSign.getLine(0) : ""); + if (l0.equalsIgnoreCase("[asc]") || isAnyCleanSign(otherSign)) { + return true; + } + } + } + return false; + } + private void addInputChestLocation(UUID playerUUID, Location location) { String basePath = "players." + playerUUID + ".input-chests"; String id = UUID.randomUUID().toString(); @@ -3043,6 +3067,11 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor, org.b return true; } + if (hasAscSignOnContainer(targetBlock, null)) { + player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); + return true; + } + // ── 2. Typ normalisieren ───────────────────────────────────────────── String typRaw = args[1].toLowerCase(); switch (typRaw) { @@ -3379,20 +3408,10 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor, org.b if (isContainer(attachedBlock)) chestBlock = attachedBlock; } if (chestBlock == null) { player.sendMessage(getMessage("no-chest-near-sign")); return; } - // Prüfe, ob bereits ein ASC-Schild an der Truhe oder am Fass ist - java.util.List blocksToCheck = getContainerBlocks(chestBlock); - for (Block cb : blocksToCheck) { - for (org.bukkit.block.BlockFace face : org.bukkit.block.BlockFace.values()) { - Block relative = cb.getRelative(face); - if (relative.getState() instanceof org.bukkit.block.Sign otherSign) { - String l0 = org.bukkit.ChatColor.stripColor(otherSign.getLine(0) != null ? otherSign.getLine(0) : ""); - if (l0.equalsIgnoreCase("[asc]") || isAnyCleanSign(otherSign)) { - player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); - event.setCancelled(true); - return; - } - } - } + if (hasAscSignOnContainer(chestBlock, signBlock)) { + player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); + event.setCancelled(true); + return; } // Limit-Check: Kein Rang = keine Truhe if (chestLimitsEnabled && getChestLimitForPlayer(player, "input") == 0 @@ -3428,20 +3447,10 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor, org.b if (isContainer(attachedBlock)) chestBlock = attachedBlock; } if (chestBlock == null) { player.sendMessage(getMessage("no-chest-near-sign")); return; } - // Prüfe, ob bereits ein ASC-Schild an der Truhe oder am Fass ist - java.util.List blocksToCheck = getContainerBlocks(chestBlock); - for (Block cb : blocksToCheck) { - for (org.bukkit.block.BlockFace face : org.bukkit.block.BlockFace.values()) { - Block relative = cb.getRelative(face); - if (relative.getState() instanceof org.bukkit.block.Sign otherSign) { - String l0 = org.bukkit.ChatColor.stripColor(otherSign.getLine(0) != null ? otherSign.getLine(0) : ""); - if (l0.equalsIgnoreCase("[asc]") || isAnyCleanSign(otherSign)) { - player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); - event.setCancelled(true); - return; - } - } - } + if (hasAscSignOnContainer(chestBlock, signBlock)) { + player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); + event.setCancelled(true); + return; } // ── Limit-Pruefung: Rest-Truhe ───────────────────────────────────── if (chestLimitsEnabled) { @@ -3506,20 +3515,10 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor, org.b if (isContainer(attachedBlock)) chestBlock = attachedBlock; } if (chestBlock == null) { player.sendMessage(getMessage("no-chest-near-sign")); return; } - // Prüfe, ob bereits ein ASC-Schild an der Truhe oder am Fass ist - java.util.List blocksToCheck = getContainerBlocks(chestBlock); - for (Block cb : blocksToCheck) { - for (org.bukkit.block.BlockFace face : org.bukkit.block.BlockFace.values()) { - Block relative = cb.getRelative(face); - if (relative.getState() instanceof org.bukkit.block.Sign otherSign) { - String l0 = org.bukkit.ChatColor.stripColor(otherSign.getLine(0) != null ? otherSign.getLine(0) : ""); - if (l0.equalsIgnoreCase("[asc]") || isAnyCleanSign(otherSign)) { - player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); - event.setCancelled(true); - return; - } - } - } + if (hasAscSignOnContainer(chestBlock, signBlock)) { + player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); + event.setCancelled(true); + return; } if (chestLimitsEnabled) { int maxInput = getChestLimitForPlayer(player, "input"); @@ -3597,20 +3596,10 @@ public class Main extends JavaPlugin implements Listener, CommandExecutor, org.b if (isContainer(attachedBlock)) chestBlock = attachedBlock; } if (chestBlock == null) { player.sendMessage(getMessage("no-chest-near-sign")); return; } - // Prüfe, ob bereits ein ASC-Schild an der Truhe oder am Fass ist - java.util.List blocksToCheck = getContainerBlocks(chestBlock); - for (Block cb : blocksToCheck) { - for (org.bukkit.block.BlockFace face : org.bukkit.block.BlockFace.values()) { - Block relative = cb.getRelative(face); - if (relative.getState() instanceof org.bukkit.block.Sign otherSign) { - String l0 = org.bukkit.ChatColor.stripColor(otherSign.getLine(0) != null ? otherSign.getLine(0) : ""); - if (l0.equalsIgnoreCase("[asc]") || isAnyCleanSign(otherSign)) { - player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); - event.setCancelled(true); - return; - } - } - } + if (hasAscSignOnContainer(chestBlock, signBlock)) { + player.sendMessage("§cAn diesem Behälter ist bereits ein ASC-Schild!"); + event.setCancelled(true); + return; } event.setLine(0, getSignColor("target", "line1") + "[asc]"); event.setLine(1, getSignColor("target", "line2") + lines[1]); // "ziel" oder "target" beibehalten