diff --git a/changelog.md b/changelog.md index 5858826..1f5961f 100644 --- a/changelog.md +++ b/changelog.md @@ -20,6 +20,7 @@ These changes will (most likely) be included in the next version. - The `shuffle-positions` ability now correctly shuffles the position of the boss as well if `monster-teleport` is set to `false`. - The `obsidian-bomb` ability no longer breaks boss waves. - Text on Arena Signs is no longer explicitly truncated. This fixes an issue where color codes would count towards the character limit, causing the text that would otherwise fit on the sign to be cut off. +- Arena Signs can once again be destroyed, but it is necessary to break them while sneaking. ## [0.108] - 2024-01-01 ### Added diff --git a/src/main/java/com/garbagemule/MobArena/signs/HandlesSignClicks.java b/src/main/java/com/garbagemule/MobArena/signs/HandlesSignClicks.java index 6469950..5bfbbe1 100644 --- a/src/main/java/com/garbagemule/MobArena/signs/HandlesSignClicks.java +++ b/src/main/java/com/garbagemule/MobArena/signs/HandlesSignClicks.java @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import java.util.HashMap; @@ -38,6 +39,9 @@ class HandlesSignClicks implements Listener { if (!(block.getState() instanceof Sign)) { return; } + if (event.getPlayer().isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) { + return; + } ArenaSign sign = signStore.findByLocation(block.getLocation()); if (sign != null) { diff --git a/src/test/java/com/garbagemule/MobArena/signs/HandlesSignClicksTest.java b/src/test/java/com/garbagemule/MobArena/signs/HandlesSignClicksTest.java index 9d97a7c..683b736 100644 --- a/src/test/java/com/garbagemule/MobArena/signs/HandlesSignClicksTest.java +++ b/src/test/java/com/garbagemule/MobArena/signs/HandlesSignClicksTest.java @@ -5,6 +5,7 @@ import org.bukkit.block.Block; import org.bukkit.block.Chest; import org.bukkit.block.Sign; import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.junit.Before; import org.junit.Test; @@ -50,12 +51,27 @@ public class HandlesSignClicksTest { verifyNoInteractions(signStore, invokesSignAction); } + @Test + public void sneakingPlayerNoFun() { + Block block = mock(Block.class); + when(block.getState()).thenReturn(mock(Sign.class)); + Player player = mock(Player.class); + when(player.isSneaking()).thenReturn(true); + PlayerInteractEvent event = event(player, block); + + subject.on(event); + + verifyNoInteractions(signStore, invokesSignAction); + } + @Test public void nonArenaSignNoFun() { Block block = mock(Block.class); when(block.getState()).thenReturn(mock(Sign.class)); + Player player = mock(Player.class); + when(player.isSneaking()).thenReturn(false); when(signStore.findByLocation(any())).thenReturn(null); - PlayerInteractEvent event = event(null, block); + PlayerInteractEvent event = event(player, block); subject.on(event); @@ -68,9 +84,10 @@ public class HandlesSignClicksTest { Block block = mock(Block.class); when(block.getLocation()).thenReturn(location); when(block.getState()).thenReturn(mock(Sign.class)); + Player player = mock(Player.class); + when(player.isSneaking()).thenReturn(false); ArenaSign sign = new ArenaSign(location, "", "", ""); when(signStore.findByLocation(location)).thenReturn(sign); - Player player = mock(Player.class); PlayerInteractEvent event = event(player, block); subject.on(event); @@ -79,7 +96,8 @@ public class HandlesSignClicksTest { } private PlayerInteractEvent event(Player player, Block block) { - return new PlayerInteractEvent(player, null, null, block, null); + Action action = Action.LEFT_CLICK_BLOCK; + return new PlayerInteractEvent(player, action, null, block, null); } }