From e785eb1e7fb0adc13fff597e617fd6816beb10f4 Mon Sep 17 00:00:00 2001 From: diskutabell <111653172+Diskutabell@users.noreply.github.com> Date: Mon, 21 Sep 2026 03:28:43 +0200 Subject: [PATCH 1/3] treat vanished players as offline --- src/main/java/lol/hub/hubtp/util/Players.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/lol/hub/hubtp/util/Players.java b/src/main/java/lol/hub/hubtp/util/Players.java index 3135182..5cfb229 100644 --- a/src/main/java/lol/hub/hubtp/util/Players.java +++ b/src/main/java/lol/hub/hubtp/util/Players.java @@ -11,7 +11,14 @@ public class Players { public static Player getOnlinePlayer(Server server, String name) { - return server.getOnlinePlayers().stream().filter(p -> p.getName().equals(name)).findAny().orElse(null); + return server.getOnlinePlayers().stream().filter(p -> p.getName().equals(name) && !isVanished(p)).findAny().orElse(null); + } + + // vanished players count as offline + private static boolean isVanished(Player player) { + return player.hasMetadata("vanished") + && !player.getMetadata("vanished").isEmpty() + && player.getMetadata("vanished").get(0).asBoolean(); } public static UUID getPlayerUUID(Server server, String name) { From 383a3a588bbaea3d7c597dd2e9fbebd1b4bc2939 Mon Sep 17 00:00:00 2001 From: diskutabell <111653172+Diskutabell@users.noreply.github.com> Date: Mon, 21 Sep 2026 03:59:35 +0200 Subject: [PATCH 2/3] accept tpa for unreachable players --- src/main/java/lol/hub/hubtp/Plugin.java | 7 +- src/main/java/lol/hub/hubtp/Request.java | 8 +- .../java/lol/hub/hubtp/RequestManager.java | 12 +++ .../java/lol/hub/hubtp/commands/AskCmd.java | 95 ++++++++++++++----- 4 files changed, 91 insertions(+), 31 deletions(-) diff --git a/src/main/java/lol/hub/hubtp/Plugin.java b/src/main/java/lol/hub/hubtp/Plugin.java index 66bf05c..b20ec20 100644 --- a/src/main/java/lol/hub/hubtp/Plugin.java +++ b/src/main/java/lol/hub/hubtp/Plugin.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; @@ -411,7 +412,11 @@ public void clearOldRequests() { * Checks if requests are blocked in the config for a specific player. */ public boolean isRequestBlock(Player player) { - return this.getConfig().getBoolean("requests-blocked-" + player.getUniqueId()); + return isRequestBlock(player.getUniqueId()); + } + + public boolean isRequestBlock(UUID uuid) { + return this.getConfig().getBoolean("requests-blocked-" + uuid); } /** diff --git a/src/main/java/lol/hub/hubtp/Request.java b/src/main/java/lol/hub/hubtp/Request.java index cc68d38..691a2be 100644 --- a/src/main/java/lol/hub/hubtp/Request.java +++ b/src/main/java/lol/hub/hubtp/Request.java @@ -3,11 +3,11 @@ import org.bukkit.entity.Player; public record Request(PlayerData target, PlayerData requester) { - static Request of(Player target, Player requester) { - return new Request(PlayerData.of(target), PlayerData.of(requester)); + static Request of(PlayerData target, Player requester) { + return new Request(target, PlayerData.of(requester)); } - boolean isSamePlayers(Player target, Player requester) { - return this.target.uuid().equals(target.getUniqueId()) && this.requester.uuid().equals(requester.getUniqueId()); + boolean isSamePlayers(PlayerData target, Player requester) { + return this.target.uuid().equals(target.uuid()) && this.requester.uuid().equals(requester.getUniqueId()); } } diff --git a/src/main/java/lol/hub/hubtp/RequestManager.java b/src/main/java/lol/hub/hubtp/RequestManager.java index 6a5d009..fc01666 100644 --- a/src/main/java/lol/hub/hubtp/RequestManager.java +++ b/src/main/java/lol/hub/hubtp/RequestManager.java @@ -39,11 +39,19 @@ static void clearOldRequests(int timeoutValue) { } public static void addRequest(Player target, Player requester) { + addRequest(PlayerData.of(target), requester); + } + + public static void addRequest(PlayerData target, Player requester) { removeRequests(target, requester); pendingRequests.put(Request.of(target, requester), System.currentTimeMillis()); } public static void removeRequests(Player target, Player requester) { + removeRequests(PlayerData.of(target), requester); + } + + public static void removeRequests(PlayerData target, Player requester) { for (Request request : pendingRequests.keySet()) { if (request.isSamePlayers(target, requester)) { pendingRequests.remove(request); @@ -73,6 +81,10 @@ public static List cancelRequestsByRequester(Player requester, String t } public static boolean isRequestActive(Player target, Player requester) { + return isRequestActive(PlayerData.of(target), requester); + } + + public static boolean isRequestActive(PlayerData target, Player requester) { for (Request request : pendingRequests.keySet()) { if (request.isSamePlayers(target, requester)) { return true; diff --git a/src/main/java/lol/hub/hubtp/commands/AskCmd.java b/src/main/java/lol/hub/hubtp/commands/AskCmd.java index 6ceaeb7..a71de38 100644 --- a/src/main/java/lol/hub/hubtp/commands/AskCmd.java +++ b/src/main/java/lol/hub/hubtp/commands/AskCmd.java @@ -16,13 +16,80 @@ public AskCmd(Plugin plugin, PluginCommand pluginCommand) { @Override public void run(Player commandSender, String targetName) { + if (Config.spawnTpDeny() && Players.isAtSpawn(commandSender)) { + Log.debug("Denying teleport request while in spawn area from " + commandSender.getName() + " to " + targetName + "."); + + commandSender.sendMessage( + Component.text("You are not allowed to teleport while in the spawn area!", NamedTextColor.RED) + ); + return; + } + + if (plugin.isRequestBlock(commandSender)) { + commandSender.sendMessage( + Component.text("Unable to send teleport requests while ignoring incoming requests!", NamedTextColor.RED) + ); + return; + } + + if (!Config.allowMultiTargetRequest() && RequestManager.isRequestActiveByRequester(commandSender)) { + commandSender.sendMessage( + Component.text("Please wait for your existing request to be accepted or denied.", + NamedTextColor.RED) + ); + return; + } + var target = Players.getOnlinePlayer(plugin.getServer(), targetName); + // an unreachable target still gets a request nobody delivers, so offline and vanished look alike if (target == null) { + var targetUuid = Players.getPlayerUUID(plugin.getServer(), targetName); + + if (targetUuid != null) { + if (Ignores.get(targetUuid, commandSender.getUniqueId())) { + commandSender.sendMessage( + Component.text(targetName, NamedTextColor.RED) + .append(Component.text(" is ignoring your tpa requests!")) + ); + return; + } + + if (Ignores.get(commandSender.getUniqueId(), targetUuid)) { + commandSender.sendMessage( + Component.text("You are ignoring ", NamedTextColor.RED) + .append(Component.text(targetName)) + .append(Component.text(". Cannot send teleport requests.")) + ); + return; + } + + if (plugin.isRequestBlock(targetUuid)) { + commandSender.sendMessage( + Component.text(targetName, NamedTextColor.RED) + .append(Component.text(" is currently not accepting any teleport requests!")) + ); + return; + } + + var targetData = new PlayerData(targetName, targetUuid); + + if (RequestManager.isRequestActive(targetData, commandSender)) { + commandSender.sendMessage( + Component.text("Please wait for ", NamedTextColor.RED) + .append(Component.text(targetName)) + .append(Component.text(" to accept or deny your request.")) + ); + return; + } + + RequestManager.addRequest(targetData, commandSender); + } + commandSender.sendMessage( - Component.text("Player ", NamedTextColor.RED) + Component.text("Request sent to ", NamedTextColor.GOLD) .append(Component.text(targetName)) - .append(Component.text(" is not online.")) + .append(Component.text(".")) ); return; } @@ -44,15 +111,6 @@ public void run(Player commandSender, String targetName) { return; } - if (Config.spawnTpDeny() && Players.isAtSpawn(commandSender)) { - Log.debug("Denying teleport request while in spawn area from " + commandSender.getName() + " to " + target.getName() + "."); - - commandSender.sendMessage( - Component.text("You are not allowed to teleport while in the spawn area!", NamedTextColor.RED) - ); - return; - } - if (plugin.isRequestBlock(target)) { commandSender.sendMessage( Component.text(target.getName(), NamedTextColor.RED) @@ -61,13 +119,6 @@ public void run(Player commandSender, String targetName) { return; } - if (plugin.isRequestBlock(commandSender)) { - commandSender.sendMessage( - Component.text("Unable to send teleport requests while ignoring incoming requests!", NamedTextColor.RED) - ); - return; - } - if (Config.distanceLimit() && Players.getOverworldXzVector(commandSender).distance(Players.getOverworldXzVector(target)) > Config.distanceLimitRadius()) { Log.debug("Denying teleport request while out of range from " + commandSender.getName() + " to " + target.getName() + "."); @@ -89,14 +140,6 @@ public void run(Player commandSender, String targetName) { return; } - if (!Config.allowMultiTargetRequest() && RequestManager.isRequestActiveByRequester(commandSender)) { - commandSender.sendMessage( - Component.text("Please wait for your existing request to be accepted or denied.", - NamedTextColor.RED) - ); - return; - } - commandSender.sendMessage( Component.text("Request sent to ", NamedTextColor.GOLD) .append(Component.text(target.getName())) From 57dfda2104dfbedde9c19da2e1e97272eff1681f Mon Sep 17 00:00:00 2001 From: diskutabell <111653172+Diskutabell@users.noreply.github.com> Date: Mon, 21 Sep 2026 03:59:39 +0200 Subject: [PATCH 3/3] bump ver --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f9b7782..70019f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Plugin version -pluginVersion=4.0.5 +pluginVersion=4.0.6 # Java version javaVersion=21