diff --git a/src/main/java/moe/sebiann/system/Classes/TpaRequest.java b/src/main/java/moe/sebiann/system/Classes/TpaRequest.java new file mode 100644 index 0000000..9732540 --- /dev/null +++ b/src/main/java/moe/sebiann/system/Classes/TpaRequest.java @@ -0,0 +1,51 @@ +package moe.sebiann.system.Classes; + +import moe.sebiann.system.Enums.TpaType; + +import java.util.UUID; + +public class TpaRequest { + + UUID requester; + UUID target; + TpaType type; + + // + /** + * Makes a new TPA-Request (TPA, Not TPA-HERE) + * @param requester The person who will be teleported + * @param target The person who will be teleported to + */ + public TpaRequest(UUID requester, UUID target) { + this.requester = requester; + this.target = target; + this.type = TpaType.TPA_THERE; + } + + /** + * Makes a new TPA-Request + * @param requester The person who will be teleported + * @param target The person who will be teleported to + * @param type The type of request it is TPA or TPA-here + */ + public TpaRequest(UUID requester, UUID target, TpaType type) { + this.requester = requester; + this.target = target; + this.type = type; + } + // + + // + public UUID getRequester() { + return requester; + } + + public UUID getTarget() { + return target; + } + + public TpaType getType() { + return type; + } + // +} diff --git a/src/main/java/moe/sebiann/system/Enums/TpaType.java b/src/main/java/moe/sebiann/system/Enums/TpaType.java new file mode 100644 index 0000000..f0ceba1 --- /dev/null +++ b/src/main/java/moe/sebiann/system/Enums/TpaType.java @@ -0,0 +1,6 @@ +package moe.sebiann.system.Enums; + +public enum TpaType { + TPA_THERE, + TPA_HERE +} diff --git a/src/main/java/moe/sebiann/system/SystemHomes.java b/src/main/java/moe/sebiann/system/SystemHomes.java index 4693937..19984cc 100644 --- a/src/main/java/moe/sebiann/system/SystemHomes.java +++ b/src/main/java/moe/sebiann/system/SystemHomes.java @@ -31,6 +31,7 @@ void registerCommands(){ manager.registerCommand(new HomeCommands()); manager.registerCommand(new WarpCommands()); manager.registerCommand(new SpawnCommand()); + manager.registerCommand(new TpaCommands()); } void commandCompletions(){ diff --git a/src/main/java/moe/sebiann/system/commands/TpaCommands.java b/src/main/java/moe/sebiann/system/commands/TpaCommands.java new file mode 100644 index 0000000..c44c307 --- /dev/null +++ b/src/main/java/moe/sebiann/system/commands/TpaCommands.java @@ -0,0 +1,234 @@ +package moe.sebiann.system.commands; + +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import moe.sebiann.system.Classes.TpaRequest; +import moe.sebiann.system.Enums.TpaType; +import moe.sebiann.system.SystemHomes; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class TpaCommands extends BaseCommand { + + List tpaRequests = new ArrayList<>(); + + @CommandAlias("tpa") + @CommandCompletion("@players") + public void tpa(CommandSender sender, String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage(Component.text("Only a player can run this command.").color(TextColor.fromHexString("#FF5555"))); + return; + } + if(args.length < 1) { + player.sendMessage(Component.text("Please mention a player you'd want to teleport to.").color(TextColor.fromHexString("#FF5555"))); + return; + } + + Player target = Bukkit.getPlayer(args[0]); + if(target == null) { + player.sendMessage(Component.text("You can not teleport to an offline player.").color(TextColor.fromHexString("#FF5555"))); + return; + } + if(target.getUniqueId().equals(player.getUniqueId())) { + player.sendMessage(Component.text("You can not teleport to yourself.").color(TextColor.fromHexString("#FF5555"))); + return; + } + + for(TpaRequest r : tpaRequests) { + if(r.getRequester().equals(player.getUniqueId())) { + player.sendMessage(Component.text("You already have an outgoing TPA request to this player").color(TextColor.fromHexString("#FF5555"))); + return; + } + } + + TpaRequest tpaRequest = new TpaRequest(player.getUniqueId(), target.getUniqueId()); + tpaRequests.add(tpaRequest); + + int timeoutTime = SystemHomes.plugin.getConfig().getInt("warp.request_timeout", 30); + deleteTpaAfterDelay(player, target, timeoutTime, tpaRequest); + + player.sendMessage(Component.text("Teleport request sent to ").color(TextColor.fromHexString("#55FF55")) + .append(Component.text(target.getName()).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(".\nRequest will time out in ").color(TextColor.fromHexString("#55FF55"))) + .append(Component.text(timeoutTime).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55")))); + + target.sendMessage(Component.text(player.getName()).color(TextColor.fromHexString("#00AA00")) + .append(Component.text(" has requested to teleport to you.").color(TextColor.fromHexString("#55FF55"))) + .append(Component.text("\nWrite /tpaccept to accept this request.").color(TextColor.fromHexString("#55FF55")) + .clickEvent(ClickEvent.runCommand("/tpaccept")) + .hoverEvent(HoverEvent.showText(Component.text("Accepts the TPA request").color(TextColor.fromHexString("#55FF55"))))) + .append(Component.text("\nWrite /tpdeny to deny this request.").color(TextColor.fromHexString("#FF5555")) + .clickEvent(ClickEvent.runCommand("/tpdeny")) + .hoverEvent(HoverEvent.showText(Component.text("Denies the TPA request").color(TextColor.fromHexString("#FF5555")))))); + } + + @CommandAlias("tpahere") + @CommandCompletion("@players") + @SuppressWarnings("DuplicatedCode") + public void tpahere(CommandSender sender, String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage(Component.text("Only a player can run this command.").color(TextColor.fromHexString("#FF5555"))); + return; + } + if(args.length < 1) { + player.sendMessage(Component.text("Please mention a player you'd want to teleport to.").color(TextColor.fromHexString("#FF5555"))); + return; + } + + Player target = Bukkit.getPlayer(args[0]); + if(target == null) { + player.sendMessage(Component.text("You can not teleport to an offline player.").color(TextColor.fromHexString("#FF5555"))); + return; + } + if(target.getUniqueId().equals(player.getUniqueId())) { + player.sendMessage(Component.text("You can not teleport to yourself.").color(TextColor.fromHexString("#FF5555"))); + return; + } + + TpaRequest tpaRequest = new TpaRequest(player.getUniqueId(), target.getUniqueId(), TpaType.TPA_HERE); + tpaRequests.add(tpaRequest); + + int timeoutTime = SystemHomes.plugin.getConfig().getInt("tpa.request_timeout", 30); + deleteTpaAfterDelay(player, target, timeoutTime, tpaRequest); + + player.sendMessage(Component.text("Teleport request sent to ").color(TextColor.fromHexString("#55FF55")) + .append(Component.text(target.getName()).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(".\nRequest will time out in ").color(TextColor.fromHexString("#55FF55"))) + .append(Component.text(timeoutTime).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55")))); + + target.sendMessage(Component.text(player.getName()).color(TextColor.fromHexString("#00AA00")) + .append(Component.text(" has requested you to teleport to them.").color(TextColor.fromHexString("#55FF55"))) + .append(Component.text("\nWrite /tpaccept to accept this request.").color(TextColor.fromHexString("#55FF55")) + .clickEvent(ClickEvent.runCommand("/tpaccept")) + .hoverEvent(HoverEvent.showText(Component.text("Accepts the TPA request").color(TextColor.fromHexString("#55FF55"))))) + .append(Component.text("\nWrite /tpdeny to deny this request.").color(TextColor.fromHexString("#FF5555")) + .clickEvent(ClickEvent.runCommand("/tpdeny")) + .hoverEvent(HoverEvent.showText(Component.text("Denies the TPA request").color(TextColor.fromHexString("#FF5555")))))); + } + + @CommandAlias("tpaccept|tpyes") + @SuppressWarnings("DuplicatedCode") + public void tpaccept(CommandSender sender) { + if (!(sender instanceof Player player)) { + sender.sendMessage(Component.text("Only a player can run this command.").color(TextColor.fromHexString("#FF5555"))); + return; + } + + TpaRequest tpaRequest = null; + for(TpaRequest r : tpaRequests) { + if(r.getTarget().equals(player.getUniqueId())) { + tpaRequest = r; + break; + } + } + if(tpaRequest == null){ + player.sendMessage(Component.text("You don't have any outgoing TPA requests.").color(TextColor.fromHexString("#FF5555"))); + return; + } + Player target = Bukkit.getPlayer(tpaRequest.getRequester()); + + if(target == null) { + player.sendMessage(Component.text("Player is no longer online.").color(TextColor.fromHexString("#FF5555"))); + tpaRequests.remove(tpaRequest); + return; + } + int tpTime = SystemHomes.plugin.getConfig().getInt("tpa.teleport_delay", 2); + tpaRequests.remove(tpaRequest); + + if (tpaRequest.getType() == TpaType.TPA_HERE) { + player.sendMessage(Component.text("TPA request to ").color(TextColor.fromHexString("#55FF55")) + .append(Component.text(target.getName()).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" has been accepted.\nYou will be teleported in ").color(TextColor.fromHexString("#55FF55"))) + .append(Component.text(tpTime).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55")))); + + target.sendMessage(Component.text("The TPA request from ").color(TextColor.fromHexString("#55FF55")) + .append(Component.text(player.getName()).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" has been accepted.\nThey will be teleported to you in ").color(TextColor.fromHexString("#55FF55"))) + .append(Component.text(tpTime).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55")))); + + Bukkit.getScheduler().runTaskLater(SystemHomes.plugin, () -> { + player.teleport(target); + }, tpTime * 20L); + + } else if (tpaRequest.getType() == TpaType.TPA_THERE) { + target.sendMessage(Component.text("TPA request to ").color(TextColor.fromHexString("#55FF55")) + .append(Component.text(player.getName()).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" has been accepted.\nYou will be teleported in ").color(TextColor.fromHexString("#55FF55"))) + .append(Component.text(tpTime).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55")))); + + player.sendMessage(Component.text("The TPA request from ").color(TextColor.fromHexString("#55FF55")) + .append(Component.text(target.getName()).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" has been accepted.\nThey will be teleported to you in ").color(TextColor.fromHexString("#55FF55"))) + .append(Component.text(tpTime).color(TextColor.fromHexString("#00AA00"))) + .append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55")))); + + Bukkit.getScheduler().runTaskLater(SystemHomes.plugin, () -> { + target.teleport(player); + }, tpTime * 20L); + } + } + + @CommandAlias("tpdeny|tpno") + @SuppressWarnings("DuplicatedCode") + public void tpdeny(CommandSender sender, String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage(Component.text("Only a player can run this command.").color(TextColor.fromHexString("#FF5555"))); + return; + } + + TpaRequest tpaRequest = null; + for(TpaRequest r : tpaRequests) { + if(r.getTarget().equals(player.getUniqueId())) { + tpaRequest = r; + break; + } + } + if(tpaRequest == null){ + player.sendMessage(Component.text("You don't have any outgoing TPA requests.").color(TextColor.fromHexString("#FF5555"))); + return; + } + Player target = Bukkit.getPlayer(tpaRequest.getRequester()); + OfflinePlayer targetOffline = Bukkit.getOfflinePlayer(tpaRequest.getRequester()); + + tpaRequests.remove(tpaRequest); + + player.sendMessage(Component.text("Declined ").color(TextColor.fromHexString("#FF5555")) + .append(Component.text(targetOffline.getName() == null ? "Unknown" : targetOffline.getName()).color(TextColor.fromHexString("#AA0000"))) + .append(Component.text("'s TPA request.").color(TextColor.fromHexString("#FF5555")))); + + if(target != null){ + target.sendMessage(Component.text(player.getName()).color(TextColor.fromHexString("#AA0000")) + .append(Component.text(" declined your TPA request.").color(TextColor.fromHexString("#FF5555")))); + } + } + + private void deleteTpaAfterDelay(Player player, Player target, int requestTimeout, TpaRequest tpaRequest) { + Bukkit.getScheduler().runTaskLater(SystemHomes.plugin, () -> { + if(tpaRequests.remove(tpaRequest)){ + player.sendMessage(Component.text("TPA Request to ").color(TextColor.fromHexString("#FF5555")) + .append(Component.text(target.getName()).color(TextColor.fromHexString("#AA0000"))) + .append(Component.text(" has timed out.").color(TextColor.fromHexString("#FF5555")))); + + target.sendMessage(Component.text("TPA Request from ").color(TextColor.fromHexString("#FF5555")) + .append(Component.text(player.getName()).color(TextColor.fromHexString("#AA0000"))) + .append(Component.text(" has timed out.").color(TextColor.fromHexString("#FF5555")))); + } + }, requestTimeout * 20L); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 34113d6..6c11e7c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -3,4 +3,5 @@ home: warp: teleport_delay: 2 tpa: - teleport_delay: 2 \ No newline at end of file + teleport_delay: 2 + request_timeout: 30 \ No newline at end of file