From df3acfe7b56152513b7a1a09b8bb1be302ebe88f Mon Sep 17 00:00:00 2001 From: AngrySoundTech Date: Mon, 23 Jan 2023 16:25:10 -0500 Subject: [PATCH] Revert "Revert "Do not allow to close trapdoors/doors if the player is not in the group"" --- .../mc/citadel/listener/RedstoneListener.java | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/paper/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/paper/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 29a4f080..a8782660 100644 --- a/paper/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/paper/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -16,6 +16,7 @@ import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Openable; +import org.bukkit.block.data.Powerable; import org.bukkit.block.data.type.Door; import org.bukkit.block.data.type.Switch; import org.bukkit.entity.Entity; @@ -101,18 +102,18 @@ public void pressButton(PlayerInteractEvent e) { // needs special handling because buttons attached to ceiling and ground can be // turned in which case the facing direction indicates this direction switch (button.getAttachedFace()) { - case CEILING: - attachedBlock = e.getClickedBlock().getRelative(BlockFace.UP); - break; - case FLOOR: - attachedBlock = e.getClickedBlock().getRelative(BlockFace.DOWN); - break; - case WALL: - attachedBlock = e.getClickedBlock().getRelative(button.getFacing().getOppositeFace()); - break; - default: - Citadel.getInstance().getLogger().warning("Could not handle button face " + button.getAttachedFace()); - return; + case CEILING: + attachedBlock = e.getClickedBlock().getRelative(BlockFace.UP); + break; + case FLOOR: + attachedBlock = e.getClickedBlock().getRelative(BlockFace.DOWN); + break; + case WALL: + attachedBlock = e.getClickedBlock().getRelative(button.getFacing().getOppositeFace()); + break; + default: + Citadel.getInstance().getLogger().warning("Could not handle button face " + button.getAttachedFace()); + return; } // prepare all sides of button itself setupAdjacentDoors(e.getPlayer(), buttonBlock, button.getFacing().getOppositeFace()); @@ -122,19 +123,25 @@ public void pressButton(PlayerInteractEvent e) { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void redstonePower(BlockRedstoneEvent bre) { - // prevent doors from being opened by redstone - if (bre.getNewCurrent() <= 0 || bre.getOldCurrent() > 0) { - return; - } + // prevent doors from being opened or closed by redstone Block block = bre.getBlock(); BlockData blockData = block.getBlockData(); - if (!(blockData instanceof Openable)) { + if (!(blockData instanceof Openable openable)) { return; } - Openable openable = (Openable) blockData; - if (openable.isOpen()) { + + if (openable.isOpen() && bre.getOldCurrent() <= 0 + || !openable.isOpen() && bre.getOldCurrent() > 0 + ) { return; } + + if (!hasDoorAccess(block, blockData, openable.isOpen())) { + bre.setNewCurrent(bre.getOldCurrent()); + } + } + + private boolean hasDoorAccess(Block block, BlockData blockData, boolean isInsecure) { if (blockData instanceof Door) { // we always store the activation for the lower half of a door Door door = (Door) blockData; @@ -144,28 +151,22 @@ public void redstonePower(BlockRedstoneEvent bre) { } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); if (rein == null) { - return; + return true; } - if (rein.isInsecure()) { - boolean playerNearby = isAuthorizedPlayerNear(rein, maxRedstoneDistance); - if (!playerNearby) { - bre.setNewCurrent(bre.getOldCurrent()); - } - return; + if (isInsecure || rein.isInsecure()) { + return isAuthorizedPlayerNear(rein, maxRedstoneDistance); } List playersActivating = authorizations.get(block.getLocation()); if (playersActivating == null) { - bre.setNewCurrent(bre.getOldCurrent()); - return; + return false; } for (UUID uuid : playersActivating) { if (rein.hasPermission(uuid, CitadelPermissionHandler.getDoors())) { // single valid perm is enough to open - return; + return true; } } - // noone valid found nearby, so deny - bre.setNewCurrent(bre.getOldCurrent()); + return false; } private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { @@ -212,7 +213,7 @@ public void playerStepPressurePlate(PlayerInteractEvent e) { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void entityStepPressurePlate(EntityInteractEvent e) { - if (!(e.getEntity() instanceof Vehicle)){ + if (!(e.getEntity() instanceof Vehicle)) { return; } Material mat = e.getBlock().getType(); @@ -226,5 +227,4 @@ public void entityStepPressurePlate(EntityInteractEvent e) { } } } - }