import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ClanPlugin extends JavaPlugin {
    private FileConfiguration config;
    private List<Clan> clans = new ArrayList<>();
    private Map<String, String> invites = new HashMap<>();

    @Override
    public void onEnable() {
        // Загрузка конфигурации
        config = getConfig();

        // Устанавливаем базовые значения
        config.addDefault(“baseLevel”, 1);
        config.addDefault(“baseExp”, 0);

        // Сохраняем конфигурацию
        config.options().copyDefaults(true);
        saveConfig();
    }

    @Override
    public void onDisable() {
        // Сохраняем конфигурацию при выключении плагина
        saveConfig();
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase(“clan”)) {
            if (args.length == 0) {
                sender.sendMessage(ChatColor.RED + “Используйте /clan create, /clan invite, /clan accept, /clan kick или /clan disband.”);
                return true;
            }

            String subCommand = args[0];
            if (subCommand.equalsIgnoreCase(“create”)) {
                if (args.length < 2) {
                    sender.sendMessage(ChatColor.RED + “Используйте /clan create <название клана>”);
                    return true;
                }

                String clanName = args[1];
                if (clanName.length() > 16) {
                    sender.sendMessage(ChatColor.RED + “Название клана не должно превышать 16 символов.”);
                    return true;
                }

                // Проверяем на уникальность название клана
                if (clanExists(clanName)) {
                    sender.sendMessage(ChatColor.RED + “Клан с таким названием уже существует.”);
                    return true;
                }

                // Создаем новый клан и добавляем его в список кланов
                Clan newClan = new Clan(clanName);
                clans.add(newClan);

                sender.sendMessage(ChatColor.GREEN + “Клан " + clanName + " успешно создан.”);
                return true;
            } else if (subCommand.equalsIgnoreCase(“invite”)) {
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ChatColor.RED + “Только игроки могут использовать эту команду.”);
                    return true;
                }

                Player player = (Player) sender;
                if (args.length < 2) {
                    player.sendMessage(ChatColor.RED + “Используйте /clan invite <игрок>”);
                    return true;
                }

                String playerName = args[1];
                // Проверяем, существует ли игрок
                if (!playerExists(playerName)) {
                    player.sendMessage(ChatColor.RED + “Игрок " + playerName + " не существует.”);
                    return true;
                }

                // Проверяем, не находится ли игрок уже в клане
                if (isPlayerInClan(playerName)) {
                    player.sendMessage(ChatColor.RED + “Игрок " + playerName + " уже состоит в клане.”);
                    return true;
                }

                // Проверяем, не было ли уже отправлено приглашение этому игроку
                if (hasInvite(playerName)) {
                    player.sendMessage(ChatColor.RED + "Приглашение уже отправлено игроку " + playerName + “.”);
                    return true;
                }

                // Отправляем приглашение игроку
                sendInvite(playerName, getPlayerClan(player.getName()));
                player.sendMessage(ChatColor.GREEN + “Игрок " + playerName + " приглашен в клан.”);
                return true;
            } else if (subCommand.equalsIgnoreCase(“accept”)) {
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ChatColor.RED + “Только игроки могут использовать эту команду.”);
                    return true;
                }

                Player player = (Player) sender;
                // Проверяем, есть ли у игрока приглашение
                if (hasInvite(player.getName())) {
                    // Добавляем игрока в клан
                    addPlayerToClan(player.getName(), getPlayerClanInvites(player.getName()));
                    player.sendMessage(ChatColor.GREEN + “Вы присоединились к клану.”);
                    return true;
                } else {
                    player.sendMessage(ChatColor.RED + “У вас нет приглашений в клан.”);
                    return true;
                }
            } else if (subCommand.equalsIgnoreCase(“kick”)) {
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ChatColor.RED + “Только игроки могут использовать эту команду.”);
                    return true;
                }

                Player player = (Player) sender;
                if (args.length < 2) {
                    player.sendMessage(ChatColor.RED + “Используйте /clan kick <игрок>”);
                    return true;
                }

                String playerName = args[1];
                // Проверяем, существует ли игрок в клане
                if (playerExistsInClan(playerName, getPlayerClan(player.getName()))) {
                    removePlayerFromClan(playerName);
                    player.sendMessage(ChatColor.GREEN + “Игрок " + playerName + " исключен из клана.”);
                    return true;
                } else {
                    player.sendMessage(ChatColor.RED + “Игрок " + playerName + " не найден в клане.”);
                    return true;
                }
            } else if (subCommand.equalsIgnoreCase(“disband”)) {
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ChatColor.RED + “Только игроки могут использовать эту команду.”);
                    return true;
                }

                Player player = (Player) sender;
                // Проверяем, является ли игрок лидером клана
                if (isClanLeader(player.getName())) {
                    // Расформировываем клан
                    disbandClan(getPlayerClan(player.getName()));
                    player.sendMessage(ChatColor.GREEN + “Клан расформирован.”);
                    return true;
                } else {
                    player.sendMessage(ChatColor.RED + “Вы не являетесь лидером клана.”);
                    return true;
                }
            }
        }
        return false;
    }

    private boolean clanExists(String clanName) {
        for (Clan clan : clans) {
            if (clan.getName().equalsIgnoreCase(clanName)) {
                return true;
            }
        }
        return false;
    }

    private boolean playerExists(String playerName) {
        // Проверяем, существует ли игрок в игре
        // …
    }

    private boolean isPlayerInClan(String playerName) {
        for (Clan clan : clans) {
            if (clan.getMembers().contains(playerName)) {
                return true;
            }
        }
        return false;
    }

    private boolean hasInvite(String playerName) {
        return invites.containsKey(playerName);
    }

    private String getPlayerClanInvites(String playerName) {
        return invites.get(playerName);
    }

    private void sendInvite(String playerName, String clanName) {
        invites.put(playerName, clanName);
    }

    private void addPlayerToClan(String playerName, String clanName) {
        // Проверка на существование клана и игрока
        for (Clan clan : clans) {
            if (clan.getName().equalsIgnoreCase(clanName)) {
                clan.getMembers().add(playerName);
                break;
            }
        }
    }

    private void removePlayerFromClan(String playerName) {
        for (Clan clan : clans) {
            if (clan.getMembers().contains(playerName)) {
                clan.getMembers().remove(playerName);
                break;
            }
        }
    }

    private boolean playerExistsInClan(String playerName, String clanName) {
        for (Clan clan : clans) {
            if (clan.getName().equalsIgnoreCase(clanName) && clan.getMembers().contains(playerName)) {
                return true;
            }
        }
        return false;
    }

    private boolean isClanLeader(String playerName) {
        for (Clan clan : clans) {
            if (clan.getMembers().get(0).equalsIgnoreCase(playerName)) {
                return true;
            }
        }
        return false;
    }

    private String getPlayerClan(String playerName) {
        for (Clan clan : clans) {
            if (clan.getMembers().contains(playerName)) {
                return clan.getName();
            }
        }
        return null;
    }

    private void disbandClan(String clanName) {
        Clan clanToRemove = null;
        for (Clan clan : clans) {
            if (clan.getName().equalsIgnoreCase(clanName)) {
                clanToRemove = clan;
                break;
            }
        }

        if (clanToRemove != null) {
            clans.remove(clanToRemove);
        }
    }

    private class Clan {
        private String name;
        private List<String> members = new ArrayList<>();

        public Clan(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public List<String> getMembers() {
            return members;
        }
    }
}


Обновленный код содержит методы для работы со списком приглашений и удаления клана из списка. Однако, методы playerExists, sendInvite и disbandClan остались пустыми и требуют реализации вашей логикой игры. допиши код