package com.example.auraplugin;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class AuraPlugin extends JavaPlugin {

    // Набор игроков, у которых включена аура
    private final Set<Player> auraPlayers = ConcurrentHashMap.newKeySet();

    // Карта для хранения аур игроков и их изумрудов
    private final Map<UUID, PlayerAura> playerAuras = new ConcurrentHashMap<>();

    // Количество изумрудов в ауре
    private final int emeraldCount = 10;

    @Override
    public void onEnable() {
        getLogger().info("AuraPlugin включен!");
        // Регистрация команды
        Objects.requireNonNull(getCommand("aura")).setExecutor(this);
        // Запуск задачи для обновления аур
        startAuraUpdateTask();
    }

    @Override
    public void onDisable() {
        getLogger().info("AuraPlugin выключен.");
        // Удаление всех аур при выключении плагина
        for (PlayerAura aura : playerAuras.values()) {
            aura.removeAura();
        }
        playerAuras.clear();
        auraPlayers.clear();
    }

    // Обработка команды /aura [on|off] <игрок>
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("aura")) {
            if (!sender.hasPermission("aura.use")) {
                sender.sendMessage(ChatColor.RED + "У вас нет прав использовать эту команду.");
                return true;
            }

            if (args.length != 2) {
                sender.sendMessage(ChatColor.RED + "Использование: /aura <on|off> <игрок>");
                return true;
            }

            String action = args[0];
            String playerName = args[1];
            Player target = Bukkit.getPlayerExact(playerName);

            if (target == null) {
                sender.sendMessage(ChatColor.RED + "Игрок не найден.");
                return true;
            }

            if (action.equalsIgnoreCase("on")) {
                if (auraPlayers.contains(target)) {
                    sender.sendMessage(ChatColor.YELLOW + "Аура уже включена для " + target.getName() + ".");
                } else {
                    auraPlayers.add(target);
                    PlayerAura aura = new PlayerAura(target);
                    playerAuras.put(target.getUniqueId(), aura);
                    sender.sendMessage(ChatColor.GREEN + "Аура включена для " + target.getName() + ".");
                }
            } else if (action.equalsIgnoreCase("off")) {
                if (!auraPlayers.contains(target)) {
                    sender.sendMessage(ChatColor.YELLOW + "У этого игрока не была включена аура.");
                } else {
                    auraPlayers.remove(target);
                    PlayerAura aura = playerAuras.remove(target.getUniqueId());
                    if (aura != null) {
                        aura.removeAura();
                    }
                    sender.sendMessage(ChatColor.GREEN + "Аура отключена для " + target.getName() + ".");
                }
            } else {
                sender.sendMessage(ChatColor.RED + "Неизвестное действие. Используйте on или off.");
            }
            return true;
        }
        return false;
    }

    // Класс для управления аурой игрока
    private static class PlayerAura {
        private final Player player;
        private final List<Item> emeralds = new ArrayList<>();
        private double angleOffset; // Начальный угол для различия аур разных игроков
        private final double radius = 1.0; // Радиус ауры
        private final double speed; // Скорость вращения
        private final Random random = new Random();

        PlayerAura(Player player) {
            this.player = player;
            this.angleOffset = random.nextDouble() * 360; // Случайный начальный угол
            // Установка случайной скорости вращения для разнообразия
            this.speed = 0.02 + (random.nextDouble() * 0.02); // От 0.02 до 0.04 радиан за тик
            spawnEmeralds();
        }

        // Спавн изумрудов вокруг игрока
        private void spawnEmeralds() {
            Location baseLocation = player.getLocation().clone().add(0, 1.5, 0); // Положение над головой

            for (int i = 0; i < 10; i++) { // 10 изумрудов
                double angleDegree = (360 / 10.0) * i + angleOffset;
                double angle = Math.toRadians(angleDegree);
                double x = radius * Math.cos(angle);
                double z = radius * Math.sin(angle);
                Location spawnLocation = baseLocation.clone().add(x, 0, z);

                // Создание изумруда
                Item emerald = player.getWorld().dropItemNaturally(spawnLocation, new ItemStack(Material.EMERALD));
                emerald.setVelocity(new Vector(0, 0, 0)); // Остановка движения
                emerald.setPickupDelay(Integer.MAX_VALUE); // Запрет на подбор
                emerald.setGravity(false); // Отключение гравитации для плавного кружения

                emeralds.add(emerald);
            }
        }

        // Обновление позиции изумрудов (кружение и падение)
        public void updateAura() {
            Location baseLocation = player.getLocation().clone().add(0, 1.5, 0); // Положение над головой
            angleOffset += speed;
            if (angleOffset >= 360) {
                angleOffset -= 360;
            }

            for (int i = 0; i < emeralds.size(); i++) {
                Item emerald = emeralds.get(i);
                if (emerald.isDead() || !emerald.isValid()) {
                    emeralds.remove(emerald);
                    i--;
                    continue;
                }

                double angleDegree = (360 / (double) emeralds.size()) * i + angleOffset;
                double angle = Math.toRadians(angleDegree);
                double x = radius * Math.cos(angle);
                double z = radius * Math.sin(angle);

                // Плавное колебание вверх-вниз для эффекта дождя
                double y = 1.5 + Math.sin(System.currentTimeMillis() / 500.0 + i) * 0.3;

                Location newLocation = baseLocation.clone().add(x, y, z);
                emerald.teleport(newLocation);

                // Добавление эффекта легкого ускорения вниз
                Vector velocity = emerald.getVelocity();
                velocity.setY(velocity.getY() - 0.005); // Легкое ускорение вниз
                emerald.setVelocity(velocity);
            }
        }

        // Удаление всех изумрудов ауры
        public void removeAura() {
            for (Item emerald : emeralds) {
                emerald.remove();
            }
            emeralds.clear();
        }
    }

    // Запуск периодической задачи для обновления аур
    private void startAuraUpdateTask() {
        new BukkitRunnable() {
            @Override
            public void run() {
                for (PlayerAura aura : new ArrayList<>(playerAuras.values())) {
                    if (!aura.player.isOnline()) {
                        removeAura(aura.player);
                        continue;
                    }
                    aura.updateAura();
                }
            }
        }.runTaskTimer(this, 0L, 2L); // Запуск каждые 2 тика (~0.1 сек)
    }

    // Метод для удаления ауры у игрока
    private void removeAura(Player player) {
        auraPlayers.remove(player);
        PlayerAura aura = playerAuras.remove(player.getUniqueId());
        if (aura != null) {
            aura.removeAura();
        }
    }
}
name: AuraPlugin
main: com.example.auraplugin.AuraPlugin
version: 1.0
api-version: 1.20
description: Плагин добавляет ауру изумрудов вокруг выбранных игроков.
commands:
  aura:
    description: Включить или отключить ауру для игрока.
    usage: /aura <on|off> <игрок>
    permission: aura.use
permissions:
  aura.use:
    description: Позволяет использовать команду /aura
    default: op

Уже лучше, но надо, чтобы изумруда падали вниз, и под игроком исчезали, напиши сразу полный код