// PVOCommand.java
package com.yourname.rocketplugin;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.Arrays;

/**
 * Класс обработки команды /pvo.
 */
public class PVOCommand implements CommandExecutor {
    private final RocketManager rocketManager;
    private final RocketPlugin plugin;

    /**
     * Конструктор PVOCommand.
     *
     * @param rocketManager Менеджер ракет и ПВО.
     * @param plugin        Главный плагин.
     */
    public PVOCommand(RocketManager rocketManager, RocketPlugin plugin) {
        this.rocketManager = rocketManager;
        this.plugin = plugin;
    }

    /**
     * Обработка команды /pvo.
     *
     * @param sender  Отправитель команды.
     * @param command Команда.
     * @param label   Ярлык команды.
     * @param args    Аргументы команды.
     * @return Результат выполнения команды.
     */
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        // Проверяем наличие разрешения на использование команды
        if (!sender.hasPermission("pvo.use")) {
            sender.sendMessage(ChatColor.RED + "§cУ вас нет разрешения использовать эту команду.");
            return true;
        }

        // Проверяем, что команда выполняется игроком
        if (!(sender instanceof Player)) {
            sender.sendMessage(ChatColor.RED + "§cТолько игроки могут использовать эту команду.");
            return true;
        }

        Player player = (Player) sender;

        // Проверяем наличие подкоманды
        if (args.length == 0) {
            player.sendMessage(ChatColor.RED + "§cИспользование: /pvo <give|exclude|remove>");
            player.sendMessage(ChatColor.YELLOW + "§eДоступные типы ПВО: BASIC, ADVANCED, ELITE, PREMIUM, ULTIMATE");
            return true;
        }

        String subcommand = args[0].toLowerCase();

        switch (subcommand) {
            case "give":
                handleGive(player, args);
                break;
            case "exclude":
                handleExclude(player, args);
                break;
            case "remove":
                handleRemove(player, args);
                break;
            default:
                player.sendMessage(ChatColor.RED + "§cНеизвестная подкоманда. Используйте /pvo <give|exclude|remove>");
        }

        return true;
    }

    /**
     * Обработка подкоманды give.
     *
     * @param player Игрок, использующий команду.
     * @param args   Аргументы команды.
     */
    private void handleGive(Player player, String[] args) {
        // Проверяем наличие разрешения на выдачу ПВО блоков
        if (!player.hasPermission("pvo.give")) {
            player.sendMessage(ChatColor.RED + "§cУ вас нет разрешения выдавать ПВО блоки.");
            return;
        }

        // Проверяем наличие аргумента типа
        if (args.length < 2) {
            player.sendMessage(ChatColor.RED + "§cИспользование: /pvo give <type>");
            player.sendMessage(ChatColor.YELLOW + "§eДоступные типы ПВО: BASIC, ADVANCED, ELITE, PREMIUM, ULTIMATE");
            return;
        }

        String typeStr = args[1].toUpperCase();
        PVOBlock.PVOTypes type;
        try {
            type = PVOBlock.PVOTypes.valueOf(typeStr);
        } catch (IllegalArgumentException e) {
            player.sendMessage(ChatColor.RED + "§cНеверный тип ПВО. Доступные типы: BASIC, ADVANCED, ELITE, PREMIUM, ULTIMATE");
            return;
        }

        // Определяем материал в зависимости от типа ПВО
        Material material = type.getMaterial();

        // Создаём ItemStack соответствующего типа ПВО
        ItemStack pvoItem = new ItemStack(material, 1);
        ItemMeta meta = pvoItem.getItemMeta();
        if (meta != null) {
            meta.setDisplayName(ChatColor.GOLD + "§lПВО Блок (" + type.name() + ")");
            meta.setLore(Arrays.asList("§7Тип ПВО: " + type.name()));
            pvoItem.setItemMeta(meta);
        }

        // Добавляем предмет в инвентарь игрока
        player.getInventory().addItem(pvoItem);
        player.sendMessage(ChatColor.GREEN + "§aВы получили ПВО блок (" + type.name() + "). Установите его в мире P_Drilla.");
    }

    /**
     * Обработка подкоманды exclude.
     *
     * @param player Игрок, использующий команду.
     * @param args   Аргументы команды.
     */
    private void handleExclude(Player player, String[] args) {
        if (args.length < 3) {
            player.sendMessage(ChatColor.RED + "§cИспользование: /pvo exclude <add|remove> <player>");
            return;
        }

        String action = args[1].toLowerCase();
        String targetName = args[2];
        Player targetPlayer = plugin.getServer().getPlayerExact(targetName);

        if (targetPlayer == null) {
            player.sendMessage(ChatColor.RED + "§cИгрок не найден или не онлайн.");
            return;
        }

        switch (action) {
            case "add":
                rocketManager.getPvoManager().addExcludedPlayer(player, targetPlayer);
                break;
            case "remove":
                rocketManager.getPvoManager().removeExcludedPlayer(player, targetPlayer);
                break;
            default:
                player.sendMessage(ChatColor.RED + "§cНеизвестное действие. Используйте add или remove.");
        }
    }

    /**
     * Обработка подкоманды remove.
     *
     * @param player Игрок, использующий команду.
     * @param args   Аргументы команды.
     */
    private void handleRemove(Player player, String[] args) {
        // Эта команда не используется напрямую, так как remove покрыто в handleExclude
        player.sendMessage(ChatColor.RED + "§cИспользуйте /pvo exclude <add|remove> <player> для управления исключениями.");
    }
}
// PVOListener.java
package com.yourname.rocketplugin;

import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.ChatColor;
import org.bukkit.event.inventory.InventoryClickEvent;

import java.util.UUID;
import java.util.List;

/**
 * Класс слушателя событий, связанных с ПВО.
 */
public class PVOListener implements Listener {
    private final RocketManager rocketManager;
    private final RocketPlugin plugin;

    /**
     * Конструктор PVOListener.
     *
     * @param rocketManager Менеджер ракет и ПВО.
     * @param plugin        Главный плагин.
     */
    public PVOListener(RocketManager rocketManager, RocketPlugin plugin) {
        this.rocketManager = rocketManager;
        this.plugin = plugin;
    }

    /**
     * Событие размещения блока.
     *
     * @param event Событие.
     */
    @EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
        Player player = event.getPlayer();
        Location loc = event.getBlock().getLocation();

        // Проверяем, является ли размещённый блок типом ПВО
        for (PVOBlock.PVOTypes type : PVOBlock.PVOTypes.values()) {
            Material requiredMaterial = type.getMaterial();

            if (event.getBlock().getType().equals(requiredMaterial)) {
                boolean added = rocketManager.getPvoManager().addPVOBlock(player, loc, type);
                if (!added) {
                    event.setCancelled(true);
                }
                // Удаляем сообщение о размещении блока
                return; // Выход после обнаружения нужного типа
            }
        }
    }

    /**
     * Событие разрушения блока.
     *
     * @param event Событие.
     */
    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {
        Player player = event.getPlayer();
        Location loc = event.getBlock().getLocation();

        // Проверяем, является ли разрушённый блок ПВО блоком
        if (rocketManager.getPvoManager().removePVOBlock(player, loc)) {
            // Удаляем сообщение о разрушении блока
        }
    }

    /**
     * Событие взаимодействия игрока с блоком (для открытия GUI).
     *
     * @param event Событие.
     */
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        Player player = event.getPlayer();
        Location loc = event.getClickedBlock() != null ? event.getClickedBlock().getLocation() : null;

        if (loc == null) return;

        if (rocketManager.getPvoManager().isPVOBlock(loc)) {
            if (event.getAction().toString().contains("RIGHT_CLICK")) {
                event.setCancelled(true);
                openPVOExclusionMenu(player, loc);
            }
        }
    }

    /**
     * Открывает меню для управления исключениями ПВО.
     *
     * @param player Игрок.
     * @param loc    Локация ПВО блока.
     */
    private void openPVOExclusionMenu(Player player, Location loc) {
        PVOBlock pvoBlock = rocketManager.getPvoManager().getPVOBlock(loc);
        if (pvoBlock == null) return;

        Inventory inv = plugin.getServer().createInventory(null, 9, ChatColor.GOLD + "Управление ПВО");

        // Отображаем список исключенных игроков
        int index = 0;
        for (UUID uuid : pvoBlock.getExcludedPlayers()) {
            Player excluded = plugin.getServer().getPlayer(uuid);
            String name = excluded != null ? excluded.getName() : "Неизвестно";
            ItemStack skull = new ItemStack(Material.PLAYER_HEAD, 1);
            SkullMeta meta = (SkullMeta) skull.getItemMeta();
            if (meta != null) {
                meta.setDisplayName(ChatColor.RED + name + " §c(Исключен)");
                if (excluded != null) {
                    meta.setOwningPlayer(excluded);
                }
                skull.setItemMeta(meta);
            }
            inv.setItem(index++, skull);
        }

        // Добавляем кнопку добавления исключения
        ItemStack addButton = new ItemStack(Material.LIME_STAINED_GLASS_PANE);
        ItemMeta addMeta = addButton.getItemMeta();
        if (addMeta != null) {
            addMeta.setDisplayName(ChatColor.GREEN + "Добавить игрока");
            addButton.setItemMeta(addMeta);
        }
        inv.setItem(8, addButton);

        player.openInventory(inv);
    }

    /**
     * Обработка кликов внутри GUI управления ПВО.
     *
     * @param event Событие клика.
     */
    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (!(event.getWhoClicked() instanceof Player player)) return;
        if (!event.getView().getTitle().equals(ChatColor.GOLD + "Управление ПВО")) return;

        event.setCancelled(true);
        int slot = event.getSlot();

        if (slot == 8) { // Кнопка добавления игрока
            player.sendMessage(ChatColor.YELLOW + "Введите имя игрока, которого хотите исключить из ПВО:");
            // Назначить слушатель чата или использовать какой-либо другой механизм для получения ввода
            // Это требует более сложной реализации и может быть добавлено позже
            // Например, использовать AsyncPlayerChatEvent с специальным флагом
        }
    }
}
Cannot resolve method 'getMaterial' in 'PVOTypes'
Cannot resolve method 'getMaterial' in 'PVOTypes'

1) ИСправь баг и напиши полный код