package dev.loki.command; import dev.loki.mdbd; import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.List; public class DBDAdminCommand implements TabExecutor { private final mdbd plugin; public DBDAdminCommand(mdbd plugin) { this.plugin = plugin; } @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { var messages = plugin.getConfigManager().getMessages(); if (!sender.hasPermission("mdbd.admin")) { sender.sendMessage(messages.get("cmd.no-permission")); return true; } if (!(sender instanceof Player player)) { sender.sendMessage(messages.get("cmd.players-only")); return true; } if (args.length == 0) { sendUsage(sender); return true; } return switch (args[0].toLowerCase()) { case "list" -> handleList(player, args); case "world" -> handleWorld(player, args); case "repairgens" -> handleRepairGens(player); default -> { sendUsage(sender); yield true; } }; } private boolean handleList(Player player, String[] args) { var locations = plugin.getConfigManager().getLocations(); // Если указан конкретный тип if (args.length >= 2) { return switch (args[1].toLowerCase()) { case "generator" -> listType(player, "Генераторы", locations.getGenerators()); case "computer" -> listType(player, "Компьютеры", plugin.getComputerData().getComputers()); case "hook" -> listType(player, "Крюки", locations.getHooks()); case "chest" -> listType(player, "Сундуки", locations.getChests()); case "killer-spawn", "killerspawn" -> listType(player, "Спавн киллера", locations.getKillerSpawns()); case "survivor-spawn", "survivorspawn" -> listType(player, "Спавн выживших", locations.getSurvivorSpawns()); default -> { player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin.unknown-type", args[1])); yield true; } }; } // Показать всё player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.header")); listType(player, "Генераторы", locations.getGenerators()); listType(player, "Компьютеры", plugin.getComputerData().getComputers()); listType(player, "Крюки", locations.getHooks()); listType(player, "Сундуки", locations.getChests()); listType(player, "Спавн киллера", locations.getKillerSpawns()); listType(player, "Спавн выживших", locations.getSurvivorSpawns()); return true; } private boolean listType(Player player, String label, List locations) { var messages = plugin.getConfigManager().getMessages(); if (locations.isEmpty()) { player.sendMessage(messages.get("dbdadmin-list.none", label)); return true; } player.sendMessage(messages.get("dbdadmin-list.count", label, locations.size())); for (int i = 0; i < locations.size(); i++) { Location loc = locations.get(i); player.sendMessage(messages.get("dbdadmin-list.entry", i + 1, loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ() )); } return true; } private boolean handleWorld(Player player, String[] args) { if (args.length < 2) { player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.world-usage")); return true; } String worldArg = args[1].toLowerCase(); org.bukkit.World target; if (worldArg.equals("game")) { target = plugin.getLobbyManager().getGameWorld(); if (target == null) { player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.world-not-found")); return true; } } else { target = org.bukkit.Bukkit.getWorld(args[1]); if (target == null) { player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.world-not-exist", args[1])); return true; } } player.teleport(target.getSpawnLocation()); player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.world-teleport", target.getName())); return true; } private boolean handleRepairGens(Player player) { var gameManager = plugin.getGameManager(); var session = gameManager.getCurrentSession(); if (session == null) { player.sendMessage("§cНет активной игры."); return true; } var genManager = session.getGeneratorManager(); if (genManager == null) { player.sendMessage("§cGeneratorManager не найден."); return true; } int count = 0; for (var gen : genManager.getIncompleteGenerators()) { gen.setProgress(100.0); genManager.onGeneratorCompleted(gen); count++; } player.sendMessage("§aПочинено генераторов: §e" + count); if (count > 0 && genManager.areAllRequiredCompleted()) { player.sendMessage("§a✔ Все необходимые генераторы починены — ворота открываются!"); } return true; } private void sendUsage(CommandSender sender) { var messages = plugin.getConfigManager().getMessages(); sender.sendMessage(messages.get("usage.admin-list-header")); sender.sendMessage(messages.get("usage.admin-list-list")); sender.sendMessage(messages.get("usage.admin-list-type")); sender.sendMessage(messages.get("usage.admin-world")); sender.sendMessage("§7/dbdadmin repairgens §8— §fПочинить все генераторы"); } @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!sender.hasPermission("mdbd.admin")) return List.of(); if (args.length == 1) { return Arrays.asList("list", "world", "repairgens").stream() .filter(s -> s.startsWith(args[0].toLowerCase())) .toList(); } if (args.length == 2 && args[0].equalsIgnoreCase("list")) { return Arrays.asList("generator", "computer", "hook", "chest", "killer-spawn", "survivor-spawn").stream() .filter(s -> s.startsWith(args[1].toLowerCase())) .toList(); } if (args.length == 2 && args[0].equalsIgnoreCase("world")) { return Arrays.asList("game").stream() .filter(s -> s.startsWith(args[1].toLowerCase())) .toList(); } return List.of(); } }