Untitled
unknown
plain_text
a year ago
9.8 kB
3
Indexable
package net.thebridgemc.customtpa; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.TextComponent; public class Main extends JavaPlugin implements CommandExecutor, TabCompleter, Listener { private final HashMap<UUID, UUID> teleportRequests = new HashMap<>(); private final HashMap<UUID, BukkitRunnable> teleportTasks = new HashMap<>(); private final HashMap<UUID, Boolean> pendingTeleports = new HashMap<>(); @Override public void onEnable() { getCommand("tpa").setExecutor(this); getCommand("tpa").setTabCompleter(this); getCommand("tpaccept").setExecutor(this); getCommand("tpdeny").setExecutor(this); getServer().getPluginManager().registerEvents(this, this); } @EventHandler public void onPlayerMove(PlayerMoveEvent event) { UUID playerID = event.getPlayer().getUniqueId(); if (pendingTeleports.containsKey(playerID) && pendingTeleports.get(playerID)) { Location from = event.getFrom(); Location to = event.getTo(); if (from.getBlockX() != to.getBlockX() || from.getBlockY() != to.getBlockY() || from.getBlockZ() != to.getBlockZ()) { cancelTeleport(playerID, "Teleport cancelled due to movement."); } } } @EventHandler public void onPlayerDamage(EntityDamageEvent event) { if (event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); UUID playerID = player.getUniqueId(); if (pendingTeleports.containsKey(playerID) && pendingTeleports.get(playerID)) { cancelTeleport(playerID, "Teleport cancelled due to taking damage."); } } } private void cancelTeleport(UUID playerID, String message) { if (teleportTasks.containsKey(playerID)) { teleportTasks.get(playerID).cancel(); teleportTasks.remove(playerID); if (teleportRequests.containsKey(playerID)) { UUID targetID = teleportRequests.remove(playerID); teleportRequests.remove(targetID); // Invalidate reverse mapping if exists pendingTeleports.remove(playerID); } Player player = Bukkit.getPlayer(playerID); if (player != null) { sendActionBar(player, "&e&lTPA &8>> &f" + message); } } } private void sendActionBar(Player player, String message) { player.spigot().sendMessage(net.md_5.bungee.api.ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', message))); } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (!(sender instanceof Player)) { sender.sendMessage("Only players can use this command."); return true; } Player player = (Player) sender; switch (command.getName().toLowerCase()) { case "tpa": if (args.length != 1) { sendActionBar(player, "&e&lTPA &8>> &fUsage: /tpa <player>"); return true; } Player target = Bukkit.getPlayer(args[0]); if (target == null) { sendActionBar(player, "&e&lTPA &8>> &fPlayer not found."); return true; } // Cancel any existing request from the player if (teleportRequests.containsKey(player.getUniqueId())) { cancelTeleport(player.getUniqueId(), "Previous teleport request cancelled."); } teleportRequests.put(player.getUniqueId(), target.getUniqueId()); sendActionBar(player, "&e&lTPA &8>> &fTeleport request sent to " + target.getName()); sendActionBar(target, "&e&lTPA &8>> &f" + player.getName() + " has requested to teleport to you."); // Schedule a task to cancel the request if not responded within 45 seconds BukkitRunnable cancelTask = new BukkitRunnable() { @Override public void run() { if (teleportRequests.containsKey(player.getUniqueId())) { cancelTeleport(player.getUniqueId(), "Teleport request timed out."); } } }; cancelTask.runTaskLater(this, 900); // 900 ticks = 45 seconds teleportTasks.put(player.getUniqueId(), cancelTask); return true; case "tpaccept": UUID requesterUUID = teleportRequests.entrySet().stream() .filter(e -> e.getValue().equals(player.getUniqueId())) .map(Map.Entry::getKey) .findFirst().orElse(null); if (requesterUUID == null) { sendActionBar(player, "&e&lTPA &8>> &fYou have no pending teleport requests."); return true; } Player requester = Bukkit.getPlayer(requesterUUID); if (requester == null) { sendActionBar(player, "&e&lTPA &8>> &fThe player who requested to teleport is no longer online."); teleportRequests.remove(requesterUUID); return true; } // Cancel the timeout task BukkitRunnable timeoutTask = teleportTasks.remove(requesterUUID); if (timeoutTask != null) { timeoutTask.cancel(); } pendingTeleports.put(requesterUUID, true); // Mark the requester as in the process of teleporting BukkitRunnable task = new BukkitRunnable() { int counter = 5; // 5 seconds countdown @Override public void run() { if (counter > 0) { sendActionBar(requester, "&e&lTPA &8>> &fTeleport in " + counter + " seconds"); sendActionBar(player, "&e&lTPA &8>> &f" + requester.getName() + " is teleporting to you in " + counter + " seconds"); counter--; } else { if (pendingTeleports.containsKey(requesterUUID)) { requester.teleport(player); sendActionBar(requester, "&e&lTPA &8>> &fTeleport successful."); sendActionBar(player, "&e&lTPA &8>> &fTeleport request accepted."); pendingTeleports.remove(requesterUUID); // Remove from pending teleports teleportTasks.remove(requesterUUID); teleportRequests.remove(requesterUUID); cancel(); // Stop the countdown } } } }; task.runTaskTimer(this, 0, 20); // Schedule to run every second (20 ticks) teleportTasks.put(requesterUUID, task); return true; case "tpdeny": UUID requesterUUIDDeny = teleportRequests.entrySet().stream() .filter(e -> e.getValue().equals(player.getUniqueId())) .map(Map.Entry::getKey) .findFirst().orElse(null); if (requesterUUIDDeny == null) { sendActionBar(player, "&e&lTPA &8>> &fYou have no pending teleport requests."); return true; } teleportRequests.remove(requesterUUIDDeny); sendActionBar(player, "&e&lTPA &8>> &fTeleport request denied."); Player requesterDeny = Bukkit.getPlayer(requesterUUIDDeny); if (requesterDeny != null) { sendActionBar(requesterDeny, "&e&lTPA &8>> &fYour teleport request was denied."); } return true; default: return false; } } @Override public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) { if (command.getName().equalsIgnoreCase("tpa") && args.length == 1) { List<String> playerNames = new ArrayList<>(); String partialName = args[0].toLowerCase(); for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { if (onlinePlayer.getName().toLowerCase().startsWith(partialName)) { playerNames.add(onlinePlayer.getName()); } } return playerNames; } return new ArrayList<>(); } }
Editor is loading...
Leave a Comment