From e640ed9e8e4555c76ba672c5de6701dd4bcbc445 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 16 Aug 2026 12:04:17 -0700 Subject: [PATCH] fix: guard BossBarListener against null playerUUID from NPC/minion breaks Fixes #557 Co-Authored-By: Claude Opus 4.6 (1M context) Claude-Session: https://claude.ai/code/session_01WzNBkKFaxTn74woxZirskh --- .../aoneblock/listeners/BossBarListener.java | 3 +++ .../aoneblock/listeners/BossBarListenerTest.java | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/world/bentobox/aoneblock/listeners/BossBarListener.java b/src/main/java/world/bentobox/aoneblock/listeners/BossBarListener.java index e804ccf..196176f 100644 --- a/src/main/java/world/bentobox/aoneblock/listeners/BossBarListener.java +++ b/src/main/java/world/bentobox/aoneblock/listeners/BossBarListener.java @@ -47,6 +47,9 @@ public BossBarListener(AOneBlock addon) { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onBreakBlockEvent(MagicBlockEvent e) { + if (e.getPlayerUUID() == null) { + return; + } // Update boss bar tryToShowBossBar(e.getPlayerUUID(), e.getIsland()); tryToShowActionBar(e.getPlayerUUID(), e.getIsland()); diff --git a/src/test/java/world/bentobox/aoneblock/listeners/BossBarListenerTest.java b/src/test/java/world/bentobox/aoneblock/listeners/BossBarListenerTest.java index 599fec6..69872f4 100644 --- a/src/test/java/world/bentobox/aoneblock/listeners/BossBarListenerTest.java +++ b/src/test/java/world/bentobox/aoneblock/listeners/BossBarListenerTest.java @@ -211,4 +211,17 @@ void testBukkitToAdventureParsesHex() { void testBukkitToAdventureNullIsEmpty() { assertEquals(Component.empty(), BossBarListener.bukkitToAdventure(null)); } + + /** + * Test for https://github.com/BentoBoxWorld/AOneBlock/issues/557 - NPC/minion breaks + * fire MagicBlockEvent with a null playerUUID; the listener must not throw. + */ + @Test + void testNullPlayerUUIDDoesNotThrow() { + when(island.isAllowed(addon.ONEBLOCK_BOSSBAR)).thenReturn(true); + when(island.isAllowed(addon.ONEBLOCK_ACTIONBAR)).thenReturn(true); + bbl.onBreakBlockEvent(new MagicBlockEvent(island, null, null, block, Material.STONE)); + verify(mockPlayer, never()).sendActionBar(any(Component.class)); + verify(bossBar, never()).addPlayer(any()); + } }