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 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())) 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) {