From 69fa95190743b99692fdc894e8a8d198d8addbde Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 4 Dec 2022 20:36:41 -0800 Subject: [PATCH] Handles null player world better on joining server In theory, this should not be required, but it seems that a player's world might be null in some edge cases. Alternatively, the Util.getWorld function can return a null if the player was in a nether or end but that does not have a corresponding overworld. Addresses #2057 --- .../bentobox/listeners/JoinLeaveListener.java | 7 ++-- .../listeners/JoinLeaveListenerTest.java | 42 ++++++++++++++++++- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/listeners/JoinLeaveListener.java b/src/main/java/world/bentobox/bentobox/listeners/JoinLeaveListener.java index 870eb5d71..ecf0a3499 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/JoinLeaveListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/JoinLeaveListener.java @@ -16,6 +16,7 @@ import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; @@ -142,7 +143,7 @@ public class JoinLeaveListener implements Listener { } /** - * This event will clean players inventor + * This event will clean players inventory * @param event SwitchWorld event. */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -161,8 +162,8 @@ public class JoinLeaveListener implements Listener { * @param world World where cleaning must occur. * @param user Targeted user. */ - private void clearPlayersInventory(World world, @NonNull User user) { - if (user.getUniqueId() == null) return; + private void clearPlayersInventory(@Nullable World world, @NonNull User user) { + if (user.getUniqueId() == null || world == null) return; // Clear inventory if required Players playerData = players.getPlayer(user.getUniqueId()); diff --git a/src/test/java/world/bentobox/bentobox/listeners/JoinLeaveListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/JoinLeaveListenerTest.java index 48d83f9c1..aec0869b9 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/JoinLeaveListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/JoinLeaveListenerTest.java @@ -1,6 +1,7 @@ package world.bentobox.bentobox.listeners; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -235,6 +236,29 @@ public class JoinLeaveListenerTest { verify(player, never()).sendMessage(anyString()); // Verify resets verify(pm).setResets(eq(world), any(), eq(0)); + // Verify inventory clear because of kick + // Check inventory cleared + verify(chest).clear(); + verify(inv).clear(); + assertTrue(set.isEmpty()); + verify(pm, times(2)).save(any()); + } + + /** + * Test method for {@link world.bentobox.bentobox.listeners.JoinLeaveListener#onPlayerJoin(org.bukkit.event.player.PlayerJoinEvent)}. + */ + @Test + public void testOnPlayerJoinNullWorld() { + when(player.getWorld()).thenReturn(null); // Null + when(Util.getWorld(any())).thenReturn(null); // Make null + PlayerJoinEvent event = new PlayerJoinEvent(player, ""); + jll.onPlayerJoin(event); + // Verify inventory clear because of kick + // Check inventory cleared + verify(chest, never()).clear(); + verify(inv, never()).clear(); + assertFalse(set.isEmpty()); + verify(pm).save(any()); } /** @@ -334,13 +358,29 @@ public class JoinLeaveListenerTest { public void testOnPlayerSwitchWorld() { PlayerChangedWorldEvent event = new PlayerChangedWorldEvent(player, world); jll.onPlayerSwitchWorld(event); - // Player was kicked so check + // Check inventory cleared verify(chest).clear(); verify(inv).clear(); assertTrue(set.isEmpty()); verify(pm).save(any()); } + /** + * Test method for {@link world.bentobox.bentobox.listeners.JoinLeaveListener#onPlayerSwitchWorld(org.bukkit.event.player.PlayerChangedWorldEvent)}. + */ + @Test + public void testOnPlayerSwitchWorldNullWorld() { + when(Util.getWorld(any())).thenReturn(null); + PlayerChangedWorldEvent event = new PlayerChangedWorldEvent(player, world); + jll.onPlayerSwitchWorld(event); + // These should not happen + verify(chest, never()).clear(); + verify(inv, never()).clear(); + assertFalse(set.isEmpty()); + verify(pm, never()).save(any()); + } + + /** * Test method for {@link world.bentobox.bentobox.listeners.JoinLeaveListener#onPlayerQuit(org.bukkit.event.player.PlayerQuitEvent)}. */