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.List;

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

@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.GREEN + “Игрок " + playerName + " приглашен в клан.”);
return true;
} else {
player.sendMessage(ChatColor.RED + “Игрок " + 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 hasInvite(String playerName) {
// Проверяем, есть ли у игрока приглашение в клан
// …
}

private String getPlayerClanInvites(String playerName) {
// Получаем список приглашений для игрока
// …
}

private void addPlayerToClan(String playerName, String clanName) {
// Добавляем игрока в клан
// …
}

private void removePlayerFromClan(String playerName) {
// Удаляем игрока из клана
// …
}

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

private boolean isClanLeader(String playerName) {
// Проверяем, является ли игрок лидером клана
// …
}

private String getPlayerClan(String playerName) {
// Получаем клан, в котором состоит игрок
// …
}

private void disbandClan(String clanName) {
// Убираем клан из списка кланов и удаляем его из конфигурационного файла
// …
}

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;
}
}
}


Обратите внимание, что приведенный код демонстрирует основную структуру плагина и реализацию команд. Вам нужно будет добавить соответствующую логику в соответствующие методы, чтобы обеспечить полноценное функционирование плагина.

Учтите также, что я не реализовал все методы (например, получение списка приглашений для игрока) и их реализацию нужно будет завершить в соответствии с вашими потребностями.

Надеюсь, это поможет вам начать создание вашего плагина на кланы Minecraft Spigot 1.12.2 с использованием Java. Удачи!
добавь все проверки
package com.example.clanplugin;

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.List;

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

@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 (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + “Только игроки могут использовать эту команду.”);
return true;
}

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

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

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

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

player.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;
}

String clanName = getPlayerClan(player.getName());
if (clanName.isEmpty()) {
player.sendMessage(ChatColor.RED + “Вы не состоите в клане.”);
return true;
}

Clan clan = getClan(clanName);
// Проверяем, является ли игрок уже участником клана
if (clan.getMembers().contains(playerName)) {
player.sendMessage(ChatColor.RED + “Игрок " + playerName + " уже состоит в клане.”);
return true;
}

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

// Отправляем приглашение и добавляем игрока в список приглашений клана
Player invitedPlayer = getPlayer(playerName);
invitedPlayer.sendMessage(ChatColor.YELLOW + "Вас пригласили в клан " + clanName + “. Используйте /clan accept для присоединения.”);
clan.addInvite(playerName);

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())) {
player.sendMessage(ChatColor.RED + “У вас нет приглашений в клан.”);
return true;
}

String clanName = getPlayerClanInvites(player.getName());
if (clanName.isEmpty()) {
player.sendMessage(ChatColor.RED + “Вы не получили приглашений.”);
return true;
}

// Добавляем игрока в клан
addPlayerToClan(player.getName(), clanName);
player.sendMessage(ChatColor.GREEN + “Вы присоединились к клану.”);
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];
// Проверяем, существует ли игрок в клане
String clanName = getPlayerClan(player.getName());
if (clanName.isEmpty()) {
player.sendMessage(ChatColor.RED + “Вы не состоите в клане.”);
return true;
}

Clan clan = getClan(clanName);
if (!clan.getMembers().contains(playerName)) {
player.sendMessage(ChatColor.RED + “Игрок " + playerName + " не найден в клане.”);
return true;
}

// Проверяем, является ли игрок лидером клана
if (!isClanLeader(player.getName(), clanName)) {
player.sendMessage(ChatColor.RED + “Вы не являетесь лидером клана.”);
return true;
}

// Удаляем игрока из клана
clan.removeMember(playerName);
player.sendMessage(ChatColor.GREEN + “Игрок " + playerName + " исключен из клана.”);
return true;
} else if (subCommand.equalsIgnoreCase(“disband”)) {
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + “Только игроки могут использовать эту команду.”);
return true;
}

Player player = (Player) sender;
// Проверяем, является ли игрок лидером клана
String clanName = getPlayerClan(player.getName());
if (clanName.isEmpty()) {
player.sendMessage(ChatColor.RED + “Вы не состоите в клане.”);
return true;
}

Clan clan = getClan(clanName);
if (!isClanLeader(player.getName(), clanName)) {
player.sendMessage(ChatColor.RED + “Вы не являетесь лидером клана.”);
return true;
}

// Расформировываем клан
disbandClan(clanName);
player.sendMessage(ChatColor.GREEN + “Клан расформирован.”);
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 hasInvite(String playerName) {
for (Clan clan : clans) {
if (clan.hasInvite(playerName)) {
return true;
}
}
return false;
}

private String getPlayerClanInvites(String playerName) {
for (Clan clan : clans) {
if (clan.hasInvite(playerName)) {
return clan.getName();
}
}
return “”;
}

private void addPlayerToClan(String playerName, String clanName) {
for (Clan clan : clans) {
if (clan.getName().equalsIgnoreCase(clanName)) {
clan.addMember(playerName);
break;
}
}
}

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

private boolean playerExistsInClan(String playerName, String clanName) допиши код