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()); + } }