From c442c59416e14d7f6100c61fc2a414e471fd6901 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 21 Jun 2026 20:49:22 +0200 Subject: [PATCH 1/2] Fix vanish player collision --- .../vanish/VanishInvisibleService.java | 10 +++ .../vanish/VanishInvisibleServiceTest.java | 69 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishInvisibleService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishInvisibleService.java index d3dca3f49..4955de8c3 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishInvisibleService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/vanish/VanishInvisibleService.java @@ -7,6 +7,7 @@ import org.bukkit.plugin.Plugin; import java.util.Collections; +import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -16,6 +17,7 @@ class VanishInvisibleService { private final Set vanishedPlayers = ConcurrentHashMap.newKeySet(); private final Set vanishedPlayerNames = ConcurrentHashMap.newKeySet(); + private final Map previousCollidableStates = new ConcurrentHashMap<>(); private final Plugin plugin; private final Server server; @@ -27,6 +29,9 @@ class VanishInvisibleService { } void hidePlayer(Player player) { + this.previousCollidableStates.putIfAbsent(player.getUniqueId(), player.isCollidable()); + player.setCollidable(false); + for (Player online : this.server.getOnlinePlayers()) { if (online.hasPermission(VanishPermissionConstant.VANISH_SEE_PERMISSION)) { continue; @@ -48,6 +53,11 @@ void showPlayer(Player player) { } this.vanishedPlayers.remove(player.getUniqueId()); this.vanishedPlayerNames.remove(player.getName()); + + Boolean previousCollidableState = this.previousCollidableStates.remove(player.getUniqueId()); + if (previousCollidableState != null) { + player.setCollidable(previousCollidableState); + } } void hideVanishedPlayersFrom(Player player) { diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java b/eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java new file mode 100644 index 000000000..e705f12f7 --- /dev/null +++ b/eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java @@ -0,0 +1,69 @@ +package com.eternalcode.core.feature.vanish; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; +import org.bukkit.Server; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.junit.jupiter.api.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class VanishInvisibleServiceTest { + + @Test + void shouldDisableCollisionWhenPlayerIsHidden() { + Player vanishedPlayer = player("Vanished", true); + VanishInvisibleService vanishInvisibleService = newVanishInvisibleService(List.of(vanishedPlayer)); + + vanishInvisibleService.hidePlayer(vanishedPlayer); + + verify(vanishedPlayer).setCollidable(false); + } + + @Test + void shouldRestorePreviousCollisionStateWhenPlayerIsShown() { + Player vanishedPlayer = player("Vanished", true); + VanishInvisibleService vanishInvisibleService = newVanishInvisibleService(List.of(vanishedPlayer)); + + vanishInvisibleService.hidePlayer(vanishedPlayer); + vanishInvisibleService.showPlayer(vanishedPlayer); + + verify(vanishedPlayer).setCollidable(true); + } + + @Test + void shouldKeepCollisionDisabledWhenItWasDisabledBeforeVanish() { + Player vanishedPlayer = player("Vanished", false); + VanishInvisibleService vanishInvisibleService = newVanishInvisibleService(List.of(vanishedPlayer)); + + vanishInvisibleService.hidePlayer(vanishedPlayer); + vanishInvisibleService.showPlayer(vanishedPlayer); + + verify(vanishedPlayer, never()).setCollidable(true); + } + + private static VanishInvisibleService newVanishInvisibleService(List onlinePlayers) { + Server server = mock(Server.class); + doReturn((Collection) onlinePlayers).when(server).getOnlinePlayers(); + + Plugin plugin = mock(Plugin.class); + when(plugin.getServer()).thenReturn(server); + + return new VanishInvisibleService(plugin); + } + + private static Player player(String name, boolean collidable) { + Player player = mock(Player.class); + when(player.getName()).thenReturn(name); + when(player.getUniqueId()).thenReturn(UUID.randomUUID()); + when(player.isCollidable()).thenReturn(collidable); + + return player; + } +} From 560667bf55cb430a3b828118e04bebcd4b55012a Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 21 Jun 2026 21:51:13 +0200 Subject: [PATCH 2/2] Delete eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java --- .../vanish/VanishInvisibleServiceTest.java | 69 ------------------- 1 file changed, 69 deletions(-) delete mode 100644 eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java b/eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java deleted file mode 100644 index e705f12f7..000000000 --- a/eternalcore-core/src/test/java/com/eternalcode/core/feature/vanish/VanishInvisibleServiceTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.eternalcode.core.feature.vanish; - -import java.util.Collection; -import java.util.List; -import java.util.UUID; -import org.bukkit.Server; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.junit.jupiter.api.Test; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class VanishInvisibleServiceTest { - - @Test - void shouldDisableCollisionWhenPlayerIsHidden() { - Player vanishedPlayer = player("Vanished", true); - VanishInvisibleService vanishInvisibleService = newVanishInvisibleService(List.of(vanishedPlayer)); - - vanishInvisibleService.hidePlayer(vanishedPlayer); - - verify(vanishedPlayer).setCollidable(false); - } - - @Test - void shouldRestorePreviousCollisionStateWhenPlayerIsShown() { - Player vanishedPlayer = player("Vanished", true); - VanishInvisibleService vanishInvisibleService = newVanishInvisibleService(List.of(vanishedPlayer)); - - vanishInvisibleService.hidePlayer(vanishedPlayer); - vanishInvisibleService.showPlayer(vanishedPlayer); - - verify(vanishedPlayer).setCollidable(true); - } - - @Test - void shouldKeepCollisionDisabledWhenItWasDisabledBeforeVanish() { - Player vanishedPlayer = player("Vanished", false); - VanishInvisibleService vanishInvisibleService = newVanishInvisibleService(List.of(vanishedPlayer)); - - vanishInvisibleService.hidePlayer(vanishedPlayer); - vanishInvisibleService.showPlayer(vanishedPlayer); - - verify(vanishedPlayer, never()).setCollidable(true); - } - - private static VanishInvisibleService newVanishInvisibleService(List onlinePlayers) { - Server server = mock(Server.class); - doReturn((Collection) onlinePlayers).when(server).getOnlinePlayers(); - - Plugin plugin = mock(Plugin.class); - when(plugin.getServer()).thenReturn(server); - - return new VanishInvisibleService(plugin); - } - - private static Player player(String name, boolean collidable) { - Player player = mock(Player.class); - when(player.getName()).thenReturn(name); - when(player.getUniqueId()).thenReturn(UUID.randomUUID()); - when(player.isCollidable()).thenReturn(collidable); - - return player; - } -}