Загрузка данных
Напиши легкий, современный и оптимизированный плагин для сервера Minecraft на базе Paper API (версия 1.21.4, Java 21). Плагин должен отвечать за сохранение и регенерацию (ресет) определенных областей (арен) по команде, со встроенной системой защиты, отсчёта и телепортации игроков.
### ТЕХНИЧЕСКИЕ ТРЕБОВАНИЯ:
1. Зависимости и среда:
- Только Paper API 1.21.4, без внешних зависимостей вроде WorldEdit или WorldGuard.
- Использовать современные методы Java 21.
2. Инструмент выделения (Wand):
- Команда `/arena wand` выдает игроку деревянный топорик с кастомным названием (например, "§bАрена-Топорик") и уникальной скрытой меткой в PersistentDataContainer (PDC) с ключом "arena:wand".
- Левый клик по блоку этим топориком устанавливает Точку 1 (pos1).
- Правый клик по блоку устанавливает Точку 2 (pos2).
- Клики должны отменять стандартное поведение (setCancelled(true)).
3. Настройки и Конфиг (config.yml):
- Создай конфиг по умолчанию со следующими параметрами:
- `teleport-command`: "spawn %player%" (Команда, выполняемая от имени консоли для выдворения игроков с арены перед ресетом. Поддерживает плейсхолдер %player%).
- `countdown-seconds`: 5 (Длительность отсчёта в секундах перед началом регенерации).
- `countdown-message`: "§eРегенерация арены §a%arena% §eначнется через §c%time% §eсек. Вы будете телепортированы!" (Сообщение отсчета в чат игрокам, находящимся на арене).
- `kick-message`: "§cЭта арена сейчас регенерируется! Доступ временно закрыт." (Сообщение, если игрок пытается зайти на арену во время ресета).
4. Полная блокировка входа на арену (Защита от обхода):
Арена во время ресета помечается статусом "регенерируется". Должны быть перекрыты ВСЕ пути попадания на арену:
- **Обычное движение:** Слушать `PlayerMoveEvent`. Если игрок пересекает границу заблокированной арены, отменять событие (`setCancelled(true)`) или откидывать его назад.
- **Защита от телепортации (Варпы, TP, клики по NPC в FancyNpcs/zNPCs):** Обязательно слушай `PlayerTeleportEvent`. Если целевая локация телепорта (`event.getTo()`) находится внутри кубоида заблокированной арены, плагин должен отменить телепортацию (`event.setCancelled(true)`) и отправить игроку `kick-message`. Это намертво заблокирует проход через любые сторонние плагины на NPC, порталы и команды.
5. Логика процесса ресета (`/arena reset [название]`):
- **Шаг 1 (Блокировка):** Арена получает статус блокировки.
- **Шаг 2 (Обратный отсчёт):** Запускается таймер (`countdown-seconds`). Каждую секунду игрокам внутри этой арены пишется сообщение `countdown-message`.
- **Шаг 3 (Телепортация игроков):** На 0 секунде для всех игроков внутри арены консоль выполняет команду `teleport-command` (например, `/spawn [Ник]`).
- **Шаг 4 (Регенерация блоков и очистка):**
- Все блоки заменяются на сохраненные в шаблоне (плавно частями через BukkitRunnable, чтобы сервер не зависал).
- Удаляются все лежащие на земле предметы (дроп) и стрелы в этой зоне.
- **Шаг 5 (Разблокировка):** Снятие блокировки, игроки снова могут заходить и телепортироваться на арену.
6. Команды администратора (доступ только для OP или права `arena.admin`):
- `/arena wand` — получить топорик.
- `/arena save [название]` — сохранить выделенный кубоид (включая BlockData и TileState сундуков) в `plugins/ArenaReset/arenas/[название].yml`.
- `/arena reset [название]` — запуск процесса регенерации.
- `/arena reload` — перезагрузить config.yml.
Предоставь чистую структуру проекта на Java 21: Главный класс, менеджер арен (ArenaManager), обработчик команд, слушатель событий (EventListener, включающий отслеживание перемещения и телепортации игроков) и файл plugin.yml. Добавь комментарии на русском языке.