From da6e2205c50cb737a0bb8b6ebc46dbcbe6cd3c77 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 21 Jun 2026 21:00:18 +0200 Subject: [PATCH 1/3] Add minimum Y check for TPA accept --- .../TeleportRequestConfig.java | 3 + .../TeleportRequestSettings.java | 2 + .../teleportrequest/TpaAcceptCommand.java | 25 +++++ .../messages/ENTeleportRequestMessages.java | 4 + .../messages/PLTeleportRequestMessages.java | 4 + .../messages/TeleportRequestMessages.java | 1 + .../teleportrequest/TpaAcceptCommandTest.java | 96 +++++++++++++++++++ 7 files changed, 135 insertions(+) create mode 100644 eternalcore-core/src/test/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommandTest.java diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java index 2c2c27684..a4ff9159d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java @@ -14,4 +14,7 @@ public class TeleportRequestConfig extends OkaeriConfig implements TeleportReque @Comment("# Time of teleportation time in /tpa commands") public Duration tpaTimer = Duration.ofSeconds(10); + + @Comment("# Minimum Y level required for accepting /tpa requests") + public int minimumTpaAcceptY = -30; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestSettings.java index 153d929cb..da3472f17 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestSettings.java @@ -8,4 +8,6 @@ public interface TeleportRequestSettings { Duration tpaTimer(); + int minimumTpaAcceptY(); + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommand.java index e098111ba..e6909872c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommand.java @@ -37,6 +37,12 @@ class TpaAcceptCommand { @Execute @DescriptionDocs(description = "Accept teleport request", arguments = "") void executeTarget(@Sender Player player, @Arg(RequesterArgument.KEY) Player target) { + if (!this.canAcceptTeleportRequest(player)) { + this.sendTooLowMessage(player); + + return; + } + this.teleportTaskService.createTeleport( target.getUniqueId(), PositionAdapter.convert(target.getLocation()), @@ -64,6 +70,12 @@ void executeTarget(@Sender Player player, @Arg(RequesterArgument.KEY) Player tar @Execute(name = "-all", aliases = "*") @DescriptionDocs(description = "Accept all teleport requests") void executeAll(@Sender Player player) { + if (!this.canAcceptTeleportRequest(player)) { + this.sendTooLowMessage(player); + + return; + } + List requests = this.requestService.findRequests(player.getUniqueId()); if (requests.isEmpty()) { @@ -97,4 +109,17 @@ void executeAll(@Sender Player player) { this.noticeService.player(player.getUniqueId(), translation -> translation.tpa().tpaAcceptAllAccepted()); } + + private boolean canAcceptTeleportRequest(Player player) { + return player.getLocation().getY() >= this.settings.minimumTpaAcceptY(); + } + + private void sendTooLowMessage(Player player) { + this.noticeService + .create() + .player(player.getUniqueId()) + .notice(translation -> translation.tpa().tpaAcceptTooLowMessage()) + .placeholder("{Y}", String.valueOf(this.settings.minimumTpaAcceptY())) + .send(); + } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/ENTeleportRequestMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/ENTeleportRequestMessages.java index 8175b4a91..643332803 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/ENTeleportRequestMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/ENTeleportRequestMessages.java @@ -60,6 +60,10 @@ public class ENTeleportRequestMessages extends OkaeriConfig implements TeleportR Notice tpaAcceptMessage = Notice.chat( "You have accepted the teleportation from the player: {PLAYER}!"); + @Comment({ " ", "# {Y} - Minimum Y level required to accept /tpa requests" }) + Notice tpaAcceptTooLowMessage = Notice.chat( + "You must be at least at Y level {Y} to accept this teleport request!"); + @Comment(" ") Notice tpaAcceptNoRequestMessage = Notice.chat("This player has not sent you a teleport request!"); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/PLTeleportRequestMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/PLTeleportRequestMessages.java index 7e27f80f0..9b8284d35 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/PLTeleportRequestMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/PLTeleportRequestMessages.java @@ -61,6 +61,10 @@ public class PLTeleportRequestMessages extends OkaeriConfig implements TeleportR Notice tpaAcceptMessage = Notice.chat( "Zaakceptowałeś prośbę o teleportację od gracza: {PLAYER}!"); + @Comment({ " ", "# {Y} - Minimalny poziom Y wymagany do zaakceptowania prośby /tpa" }) + Notice tpaAcceptTooLowMessage = Notice.chat( + "Musisz być co najmniej na poziomie Y {Y}, aby zaakceptować tę prośbę o teleportację!"); + @Comment(" ") Notice tpaAcceptNoRequestMessage = Notice .chat("Ten gracz nie wysłał do ciebie prośby o teleportację!"); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/TeleportRequestMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/TeleportRequestMessages.java index 3932ee493..05f7e61e9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/TeleportRequestMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/messages/TeleportRequestMessages.java @@ -19,6 +19,7 @@ public interface TeleportRequestMessages { Notice tpaDenyAllDenied(); Notice tpaAcceptMessage(); + Notice tpaAcceptTooLowMessage(); Notice tpaAcceptNoRequestMessage(); Notice tpaAcceptReceivedMessage(); Notice tpaAcceptAllAccepted(); diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommandTest.java b/eternalcore-core/src/test/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommandTest.java new file mode 100644 index 000000000..831ae7afd --- /dev/null +++ b/eternalcore-core/src/test/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommandTest.java @@ -0,0 +1,96 @@ +package com.eternalcode.core.feature.teleportrequest; + +import com.eternalcode.core.feature.teleport.TeleportTaskService; +import com.eternalcode.core.notice.EternalCoreBroadcast; +import com.eternalcode.core.notice.NoticeService; +import java.time.Duration; +import java.util.UUID; +import org.bukkit.Location; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.junit.jupiter.api.Test; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.RETURNS_SELF; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class TpaAcceptCommandTest { + + private static final int MINIMUM_ACCEPT_Y = -30; + + @Test + void shouldNotAcceptTeleportRequestBelowMinimumYLevel() { + Player acceptingPlayer = player("AcceptingPlayer", -31.0); + Player requestingPlayer = player("RequestingPlayer", 70.0); + TeleportRequestService requestService = mock(TeleportRequestService.class); + TeleportTaskService teleportTaskService = mock(TeleportTaskService.class); + TpaAcceptCommand command = newCommand(requestService, teleportTaskService); + + command.executeTarget(acceptingPlayer, requestingPlayer); + + verify(teleportTaskService, never()).createTeleport(any(), any(), any(), any()); + verify(requestService, never()).removeRequest(requestingPlayer.getUniqueId()); + } + + @Test + void shouldAcceptTeleportRequestAtMinimumYLevel() { + Player acceptingPlayer = player("AcceptingPlayer", -30.0); + Player requestingPlayer = player("RequestingPlayer", 70.0); + TeleportRequestService requestService = mock(TeleportRequestService.class); + TeleportTaskService teleportTaskService = mock(TeleportTaskService.class); + TpaAcceptCommand command = newCommand(requestService, teleportTaskService); + + command.executeTarget(acceptingPlayer, requestingPlayer); + + verify(teleportTaskService).createTeleport(eq(requestingPlayer.getUniqueId()), any(), any(), eq(Duration.ofSeconds(10))); + verify(requestService).removeRequest(requestingPlayer.getUniqueId()); + } + + @Test + void shouldNotAcceptAllTeleportRequestsBelowMinimumYLevel() { + Player acceptingPlayer = player("AcceptingPlayer", -31.0); + TeleportRequestService requestService = mock(TeleportRequestService.class); + TeleportTaskService teleportTaskService = mock(TeleportTaskService.class); + TpaAcceptCommand command = newCommand(requestService, teleportTaskService); + + command.executeAll(acceptingPlayer); + + verify(requestService, never()).findRequests(acceptingPlayer.getUniqueId()); + verify(teleportTaskService, never()).createTeleport(any(), any(), any(), any()); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static TpaAcceptCommand newCommand( + TeleportRequestService requestService, + TeleportTaskService teleportTaskService + ) { + TeleportRequestSettings settings = mock(TeleportRequestSettings.class); + when(settings.tpaTimer()).thenReturn(Duration.ofSeconds(10)); + when(settings.minimumTpaAcceptY()).thenReturn(MINIMUM_ACCEPT_Y); + + NoticeService noticeService = mock(NoticeService.class); + when(noticeService.create()).thenReturn(mock(EternalCoreBroadcast.class, RETURNS_SELF)); + + return new TpaAcceptCommand( + requestService, + teleportTaskService, + noticeService, + settings, + mock(Server.class) + ); + } + + private static Player player(String name, double y) { + Player player = mock(Player.class); + when(player.getUniqueId()).thenReturn(UUID.randomUUID()); + when(player.getName()).thenReturn(name); + when(player.getLocation()).thenReturn(new Location(mock(World.class), 0.0, y, 0.0)); + + return player; + } +} From 0c70b73ea799a67dac44125d5c2f06762c00a004 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 21 Jun 2026 21:48:43 +0200 Subject: [PATCH 2/3] fix --- .../teleportrequest/TpaAcceptCommandTest.java | 96 ------------------- 1 file changed, 96 deletions(-) delete mode 100644 eternalcore-core/src/test/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommandTest.java diff --git a/eternalcore-core/src/test/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommandTest.java b/eternalcore-core/src/test/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommandTest.java deleted file mode 100644 index 831ae7afd..000000000 --- a/eternalcore-core/src/test/java/com/eternalcode/core/feature/teleportrequest/TpaAcceptCommandTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.eternalcode.core.feature.teleportrequest; - -import com.eternalcode.core.feature.teleport.TeleportTaskService; -import com.eternalcode.core.notice.EternalCoreBroadcast; -import com.eternalcode.core.notice.NoticeService; -import java.time.Duration; -import java.util.UUID; -import org.bukkit.Location; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.junit.jupiter.api.Test; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.RETURNS_SELF; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class TpaAcceptCommandTest { - - private static final int MINIMUM_ACCEPT_Y = -30; - - @Test - void shouldNotAcceptTeleportRequestBelowMinimumYLevel() { - Player acceptingPlayer = player("AcceptingPlayer", -31.0); - Player requestingPlayer = player("RequestingPlayer", 70.0); - TeleportRequestService requestService = mock(TeleportRequestService.class); - TeleportTaskService teleportTaskService = mock(TeleportTaskService.class); - TpaAcceptCommand command = newCommand(requestService, teleportTaskService); - - command.executeTarget(acceptingPlayer, requestingPlayer); - - verify(teleportTaskService, never()).createTeleport(any(), any(), any(), any()); - verify(requestService, never()).removeRequest(requestingPlayer.getUniqueId()); - } - - @Test - void shouldAcceptTeleportRequestAtMinimumYLevel() { - Player acceptingPlayer = player("AcceptingPlayer", -30.0); - Player requestingPlayer = player("RequestingPlayer", 70.0); - TeleportRequestService requestService = mock(TeleportRequestService.class); - TeleportTaskService teleportTaskService = mock(TeleportTaskService.class); - TpaAcceptCommand command = newCommand(requestService, teleportTaskService); - - command.executeTarget(acceptingPlayer, requestingPlayer); - - verify(teleportTaskService).createTeleport(eq(requestingPlayer.getUniqueId()), any(), any(), eq(Duration.ofSeconds(10))); - verify(requestService).removeRequest(requestingPlayer.getUniqueId()); - } - - @Test - void shouldNotAcceptAllTeleportRequestsBelowMinimumYLevel() { - Player acceptingPlayer = player("AcceptingPlayer", -31.0); - TeleportRequestService requestService = mock(TeleportRequestService.class); - TeleportTaskService teleportTaskService = mock(TeleportTaskService.class); - TpaAcceptCommand command = newCommand(requestService, teleportTaskService); - - command.executeAll(acceptingPlayer); - - verify(requestService, never()).findRequests(acceptingPlayer.getUniqueId()); - verify(teleportTaskService, never()).createTeleport(any(), any(), any(), any()); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - private static TpaAcceptCommand newCommand( - TeleportRequestService requestService, - TeleportTaskService teleportTaskService - ) { - TeleportRequestSettings settings = mock(TeleportRequestSettings.class); - when(settings.tpaTimer()).thenReturn(Duration.ofSeconds(10)); - when(settings.minimumTpaAcceptY()).thenReturn(MINIMUM_ACCEPT_Y); - - NoticeService noticeService = mock(NoticeService.class); - when(noticeService.create()).thenReturn(mock(EternalCoreBroadcast.class, RETURNS_SELF)); - - return new TpaAcceptCommand( - requestService, - teleportTaskService, - noticeService, - settings, - mock(Server.class) - ); - } - - private static Player player(String name, double y) { - Player player = mock(Player.class); - when(player.getUniqueId()).thenReturn(UUID.randomUUID()); - when(player.getName()).thenReturn(name); - when(player.getLocation()).thenReturn(new Location(mock(World.class), 0.0, y, 0.0)); - - return player; - } -} From 6941825549d51a932d5c67b4d889a07ab0a916d5 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 21 Jun 2026 21:58:51 +0200 Subject: [PATCH 3/3] Adjust minimum TPA accept Y level to -1. --- .../core/feature/teleportrequest/TeleportRequestConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java index a4ff9159d..823f69a14 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java @@ -16,5 +16,5 @@ public class TeleportRequestConfig extends OkaeriConfig implements TeleportReque public Duration tpaTimer = Duration.ofSeconds(10); @Comment("# Minimum Y level required for accepting /tpa requests") - public int minimumTpaAcceptY = -30; + public int minimumTpaAcceptY = -1; }