hubmc_essentionals/TODO.md

453 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HubMC Essentials - План разработки
## Архитектура проекта
```
src/main/java/org/itqop/HubmcEssentials/
├── HubmcEssentials.java # Main mod class
├── Config.java # Configuration
├── api/
│ ├── HubGWClient.java # HTTP client singleton (async)
│ ├── dto/ # Data Transfer Objects
│ │ ├── cooldown/
│ │ │ ├── CooldownCheckRequest.java
│ │ │ ├── CooldownCheckResponse.java
│ │ │ ├── CooldownCreateRequest.java
│ │ │ └── CooldownCreateResponse.java
│ │ ├── home/
│ │ │ ├── HomeData.java
│ │ │ ├── HomeCreateRequest.java
│ │ │ ├── HomeGetRequest.java
│ │ │ └── HomeListResponse.java
│ │ ├── warp/
│ │ │ ├── WarpData.java
│ │ │ ├── WarpCreateRequest.java
│ │ │ ├── WarpGetRequest.java
│ │ │ └── WarpListResponse.java
│ │ ├── teleport/
│ │ │ ├── TeleportHistoryEntry.java
│ │ │ └── TeleportHistoryRequest.java
│ │ └── kit/
│ │ ├── KitClaimRequest.java
│ │ └── KitClaimResponse.java
│ └── service/
│ ├── CooldownService.java # Cooldown API calls
│ ├── HomeService.java # Home API calls
│ ├── WarpService.java # Warp API calls
│ ├── TeleportService.java # Teleport history API calls
│ └── KitService.java # Kit API calls
├── command/
│ ├── CommandRegistry.java # Register all commands
│ ├── general/
│ │ ├── SpecCommand.java
│ │ ├── SetHomeCommand.java
│ │ ├── HomeCommand.java
│ │ ├── FlyCommand.java
│ │ ├── VanishCommand.java
│ │ ├── InvseeCommand.java
│ │ ├── EnderchestCommand.java
│ │ ├── KitCommand.java
│ │ ├── ClearCommand.java
│ │ ├── EcCommand.java
│ │ └── HatCommand.java
│ ├── vip/
│ │ ├── HealCommand.java
│ │ ├── FeedCommand.java
│ │ ├── RepairCommand.java
│ │ ├── NearCommand.java
│ │ ├── BackCommand.java
│ │ └── RtpCommand.java
│ ├── premium/
│ │ ├── WarpCommand.java
│ │ ├── RepairAllCommand.java
│ │ └── WorkbenchCommand.java
│ ├── deluxe/
│ │ ├── TopCommand.java
│ │ ├── PotCommand.java
│ │ ├── TimeCommand.java
│ │ └── WeatherCommand.java
│ └── teleport/
│ └── CustomTpCommand.java # Override /tp command
├── permission/
│ ├── PermissionManager.java # LuckPerms integration
│ └── PermissionNodes.java # Constants for permission nodes
├── util/
│ ├── MessageUtil.java # User messages (Russian)
│ ├── LocationUtil.java # Location/teleport utilities
│ ├── PlayerUtil.java # Player utilities
│ └── RetryUtil.java # Retry logic for API calls
└── storage/
└── LocationStorage.java # Store last location for /back
```
---
## Этап 1: Базовая инфраструктура
### 1.1 Конфигурация
- [ ] Обновить `Config.java`:
- [ ] API base URL (String, default: "http://localhost:8000/api/v1")
- [ ] API key (String)
- [ ] Connection timeout (int, default: 2)
- [ ] Read timeout (int, default: 5)
- [ ] Max retries (int, default: 2)
- [ ] Enable debug logging (boolean, default: false)
### 1.2 Permission система
- [ ] Создать `PermissionNodes.java` с константами всех пермишенов
- [ ] Создать `PermissionManager.java`:
- [ ] Метод `hasPermission(ServerPlayer, String)` - проверка через LuckPerms
- [ ] Метод `hasTier(ServerPlayer, String)` - проверка tier (vip/premium/deluxe)
- [ ] Метод `getPlayerTier(ServerPlayer)` - получить высший tier игрока
### 1.3 Утилиты
- [ ] Создать `MessageUtil.java`:
- [ ] Метод `sendError(ServerPlayer, String)` - отправка сообщения об ошибке
- [ ] Метод `sendSuccess(ServerPlayer, String)` - отправка успешного сообщения
- [ ] Метод `sendInfo(ServerPlayer, String)` - информационное сообщение
- [ ] Константы сообщений на русском
- [ ] Создать `LocationUtil.java`:
- [ ] Метод `toJsonLocation(ServerPlayer)` - конвертация позиции в JSON
- [ ] Метод `teleportPlayer(ServerPlayer, world, x, y, z, yaw, pitch)` - телепорт
- [ ] Метод `getSafeYLocation(ServerLevel, x, z)` - получить безопасную Y координату
- [ ] Создать `PlayerUtil.java`:
- [ ] Метод `getPlayerByName(MinecraftServer, String)` - поиск игрока по нику
- [ ] Метод `isPlayerOnline(MinecraftServer, String)` - проверка онлайн
- [ ] Создать `RetryUtil.java`:
- [ ] Метод `retryAsync(Supplier<CompletableFuture<T>>, int maxRetries, Predicate<Throwable> shouldRetry)`
- [ ] Логика retry на 429/5xx ошибках
---
## Этап 2: API Client и сервисы
### 2.1 HTTP Client
- [ ] Создать `HubGWClient.java`:
- [ ] Singleton паттерн с `getInstance()`
- [ ] Инициализация `HttpClient` с timeouts из Config
- [ ] Circuit breaker для предотвращения спама логов
- [ ] Метод `refreshFromConfig()` для обновления настроек
- [ ] Базовый метод `makeRequest(method, path, body)` возвращающий `CompletableFuture<HttpResponse<String>>`
- [ ] Метод `baseBuilder(path)` для создания HttpRequest с headers (X-API-Key)
- [ ] Обработка ошибок с логированием
### 2.2 DTO классы
#### Cooldowns
- [ ] Создать `CooldownCheckRequest.java` (player_uuid, cooldown_type)
- [ ] Создать `CooldownCheckResponse.java` (is_active, expires_at, remaining_seconds)
- [ ] Создать `CooldownCreateRequest.java` (player_uuid, cooldown_type, cooldown_seconds OR expires_at)
- [ ] Создать `CooldownCreateResponse.java` (message)
#### Homes
- [ ] Создать `HomeData.java` (id, player_uuid, name, world, x, y, z, yaw, pitch, is_public, created_at, updated_at)
- [ ] Создать `HomeCreateRequest.java` (player_uuid, name, world, x, y, z, yaw, pitch, is_public)
- [ ] Создать `HomeGetRequest.java` (player_uuid, name)
- [ ] Создать `HomeListResponse.java` (homes[], total)
#### Warps
- [ ] Создать `WarpData.java` (id, name, world, x, y, z, yaw, pitch, is_public, description, created_at, updated_at)
- [ ] Создать `WarpCreateRequest.java` (name, world, x, y, z, yaw, pitch, is_public, description)
- [ ] Создать `WarpGetRequest.java` (name)
- [ ] Создать `WarpListResponse.java` (warps[], total, page, size, pages)
#### Teleport
- [ ] Создать `TeleportHistoryEntry.java` (id, player_uuid, from_world, from_x/y/z, to_world, to_x/y/z, tp_type, target_name, created_at)
- [ ] Создать `TeleportHistoryRequest.java` (player_uuid, from_world, from_x/y/z, to_world, to_x/y/z, tp_type, target_name)
#### Kits
- [ ] Создать `KitClaimRequest.java` (player_uuid, kit_name)
- [ ] Создать `KitClaimResponse.java` (success, message, cooldown_remaining)
### 2.3 Service классы
- [ ] Создать `CooldownService.java`:
- [ ] `checkCooldown(playerUuid, cooldownType)` → CompletableFuture<CooldownCheckResponse>
- [ ] `createCooldown(playerUuid, cooldownType, seconds)` → CompletableFuture<Boolean>
- [ ] Использует HubGWClient для API вызовов
- [ ] Создать `HomeService.java`:
- [ ] `createHome(request)` → CompletableFuture<HomeData>
- [ ] `getHome(playerUuid, name)` → CompletableFuture<HomeData>
- [ ] `listHomes(playerUuid)` → CompletableFuture<HomeListResponse>
- [ ] Создать `WarpService.java`:
- [ ] `createWarp(request)` → CompletableFuture<WarpData>
- [ ] `getWarp(name)` → CompletableFuture<WarpData>
- [ ] `listWarps()` → CompletableFuture<WarpListResponse>
- [ ] Создать `TeleportService.java`:
- [ ] `logTeleport(request)` → CompletableFuture<Boolean>
- [ ] `getHistory(playerUuid, limit)` → CompletableFuture<List<TeleportHistoryEntry>>
- [ ] Создать `KitService.java`:
- [ ] `claimKit(playerUuid, kitName)` → CompletableFuture<KitClaimResponse>
---
## Этап 3: Команды - General (базовые)
### 3.1 Локальные команды (без API)
- [ ] **SpecCommand** `/spec` `/spectator`:
- [ ] Проверка пермишена `hubmc.cmd.spec`
- [ ] Переключение gamemode на spectator/survival
- [ ] **FlyCommand** `/fly`:
- [ ] Проверка пермишена `hubmc.cmd.fly`
- [ ] Включение/выключение полета
- [ ] **VanishCommand** `/vanish`:
- [ ] Проверка пермишена `hubmc.cmd.vanish`
- [ ] Скрытие игрока от других (через NeoForge API)
- [ ] **InvseeCommand** `/invsee <nick>`:
- [ ] Проверка пермишена `hubmc.cmd.invsee`
- [ ] Проверка что игрок онлайн
- [ ] Открытие инвентаря целевого игрока
- [ ] **EnderchestCommand** `/enderchest <nick>`:
- [ ] Проверка пермишена `hubmc.cmd.enderchest`
- [ ] Проверка что игрок онлайн
- [ ] Открытие эндерчеста целевого игрока
### 3.2 API команды с cooldown
- [ ] **SetHomeCommand** `/sethome [name]`:
- [ ] Проверка пермишена `hubmc.cmd.sethome`
- [ ] Получение текущей позиции
- [ ] Вызов `HomeService.createHome()`
- [ ] Обработка ответа (успех/ошибка)
- [ ] **HomeCommand** `/home [name]`:
- [ ] Проверка пермишена `hubmc.cmd.home`
- [ ] Вызов `HomeService.getHome()`
- [ ] Телепортация на позицию дома
- [ ] Обработка 404 (дом не найден)
- [ ] **KitCommand** `/kit <name>`:
- [ ] Проверка пермишена `hubmc.cmd.kit`
- [ ] Проверка tier пермишена для конкретного кита
- [ ] Проверка cooldown через `CooldownService.checkCooldown(uuid, "kit|<name>")`
- [ ] Если cooldown активен - показать сообщение "Команда доступна через N сек."
- [ ] Вызов `KitService.claimKit()`
- [ ] Установка cooldown через `CooldownService.createCooldown()`
- [ ] Выдача предметов игроку (items из API response)
- [ ] **ClearCommand** `/clear`:
- [ ] Проверка пермишена `hubmc.cmd.clear`
- [ ] Проверка cooldown `"clear"`
- [ ] Очистка инвентаря
- [ ] Установка cooldown
- [ ] **EcCommand** `/ec`:
- [ ] Проверка пермишена `hubmc.cmd.ec`
- [ ] Проверка cooldown `"ec"`
- [ ] Открытие enderchest
- [ ] Установка cooldown
- [ ] **HatCommand** `/hat`:
- [ ] Проверка пермишена `hubmc.cmd.hat`
- [ ] Проверка cooldown `"hat"`
- [ ] Проверка что в руке предмет
- [ ] Замена головного слота на предмет из руки
- [ ] Установка cooldown
---
## Этап 4: VIP команды
- [ ] **HealCommand** `/heal`:
- [ ] Проверка `hubmc.cmd.heal`
- [ ] Проверка cooldown `"heal"`
- [ ] Восстановление здоровья и голода
- [ ] Установка cooldown
- [ ] **FeedCommand** `/feed`:
- [ ] Проверка `hubmc.cmd.feed`
- [ ] Проверка cooldown `"feed"`
- [ ] Восстановление голода и saturation
- [ ] Установка cooldown
- [ ] **RepairCommand** `/repair`:
- [ ] Проверка `hubmc.cmd.repair`
- [ ] Проверка cooldown `"repair"`
- [ ] Проверка что в руке инструмент/броня
- [ ] Ремонт предмета в руке
- [ ] Установка cooldown
- [ ] **NearCommand** `/near [radius]`:
- [ ] Проверка `hubmc.cmd.near`
- [ ] Проверка cooldown `"near"`
- [ ] Поиск игроков в радиусе
- [ ] Вывод списка с расстояниями
- [ ] Установка cooldown
- [ ] **BackCommand** `/back`:
- [ ] Проверка `hubmc.cmd.back`
- [ ] Проверка cooldown `"back"`
- [ ] Получение последней позиции из LocationStorage
- [ ] Телепортация
- [ ] Установка cooldown
- [ ] **RtpCommand** `/rtp`:
- [ ] Проверка `hubmc.cmd.rtp`
- [ ] Проверка cooldown `"rtp"`
- [ ] Генерация случайной позиции (безопасной)
- [ ] Телепортация
- [ ] Установка cooldown
---
## Этап 5: Premium команды
- [ ] **WarpCommand** `/warp <create|list|delete|teleport> [name]`:
- [ ] `/warp create <name>` - `hubmc.cmd.warp.create`, БЕЗ cooldown
- [ ] Вызов `WarpService.createWarp()`
- [ ] `/warp list` - вывод списка warp'ов
- [ ] Вызов `WarpService.listWarps()`
- [ ] `/warp delete <name>` - удаление warp'а (если есть права)
- [ ] `/warp <name>` - телепортация на warp
- [ ] **RepairAllCommand** `/repair all`:
- [ ] Проверка `hubmc.cmd.repair.all`
- [ ] Проверка cooldown `"repair_all"`
- [ ] Ремонт всего инвентаря + броня
- [ ] Установка cooldown
- [ ] **WorkbenchCommand** `/workbench`:
- [ ] Проверка `hubmc.cmd.workbench`
- [ ] БЕЗ cooldown
- [ ] Открытие crafting table GUI
---
## Этап 6: Deluxe команды
- [ ] **TopCommand** `/top`:
- [ ] Проверка `hubmc.cmd.top`
- [ ] Проверка cooldown `"top"`
- [ ] Поиск самого высокого блока по X/Z координатам игрока
- [ ] Телепортация на него
- [ ] Установка cooldown
- [ ] **PotCommand** `/pot <effect> [duration] [amplifier]`:
- [ ] Проверка `hubmc.cmd.pot`
- [ ] Проверка cooldown `"pot"`
- [ ] Применение эффекта
- [ ] Установка cooldown
- [ ] **TimeCommand** `/day` `/night` `/morning` `/evening`:
- [ ] Проверка `hubmc.cmd.time`
- [ ] Проверка cooldown `"time|day"` / `"time|night"` / `"time|morning"` / `"time|evening"`
- [ ] Установка времени суток в мире
- [ ] Установка cooldown
- [ ] **WeatherCommand** `/weather <clear|storm|thunder>`:
- [ ] Проверка `hubmc.cmd.weather`
- [ ] БЕЗ cooldown
- [ ] Установка погоды
---
## Этап 7: Custom /tp команда
- [ ] **CustomTpCommand** - переопределение `/tp`:
- [ ] Поддержка форматов:
- [ ] `/tp <player>` - проверка `hubmc.cmd.tp`, cooldown `"tp|<targetNick>"`
- [ ] `/tp <player1> <player2>` - проверка `hubmc.cmd.tp.others`, cooldown `"tp|<targetNick>"`
- [ ] `/tp <x> <y> <z>` - проверка `hubmc.cmd.tp.coords`, cooldown `"tp|coords"`
- [ ] Проверка cooldown через API
- [ ] Сохранение текущей позиции в LocationStorage для /back
- [ ] Выполнение телепортации
- [ ] **ОБЯЗАТЕЛЬНО**: Логирование в teleport history через `TeleportService.logTeleport()`
- [ ] Поля: player_uuid, from_world, from_x/y/z, to_world, to_x/y/z, tp_type, target_name
- [ ] Установка cooldown через API
---
## Этап 8: Интеграция и регистрация
- [ ] **LocationStorage** - хранение последней позиции для /back:
- [ ] Map<UUID, LastLocation> в памяти
- [ ] Метод `saveLocation(player)` - сохранить позицию
- [ ] Метод `getLastLocation(player)` - получить последнюю позицию
- [ ] Автоматическое сохранение при телепортации
- [ ] **CommandRegistry**:
- [ ] Регистрация всех команд в NeoForge
- [ ] Централизованное место для регистрации
- [ ] **HubmcEssentials.java**:
- [ ] В `commonSetup()`:
- [ ] Инициализация HubGWClient
- [ ] Инициализация всех сервисов
- [ ] Регистрация команд через CommandRegistry
- [ ] Логирование успешной инициализации
---
## Этап 9: Тестирование и отладка
- [ ] Тестирование каждой команды:
- [ ] Проверка пермишенов
- [ ] Проверка cooldown системы
- [ ] Проверка API интеграции
- [ ] Проверка обработки ошибок (API недоступен)
- [ ] Проверка сообщений пользователю
- [ ] Тестирование edge cases:
- [ ] Игрок не найден
- [ ] Игрок оффлайн
- [ ] HubGW API недоступен
- [ ] Неверные координаты
- [ ] Кит не существует
- [ ] Дом не найден
- [ ] Логирование:
- [ ] Проверить что все ошибки логируются
- [ ] Circuit breaker работает (не спамит логи)
---
## Этап 10: Финализация
- [ ] Обновить CLAUDE.md с актуальной информацией об архитектуре
- [ ] Проверить что все DTO классы properly serializable
- [ ] Проверить что все async операции правильно обрабатывают ошибки
- [ ] Финальный build и тест в игре
- [ ] Документация по конфигурации
---
## Приоритеты разработки
**P0 (критично):**
1. Базовая инфраструктура (Config, Permissions, Utils)
2. HTTP Client и Services
3. DTO классы
**P1 (высокий):**
4. General команды
5. VIP команды
6. Custom /tp с teleport history
**P2 (средний):**
7. Premium команды
8. Deluxe команды
**P3 (низкий):**
9. Тестирование
10. Финализация
---
## Технические требования
- Все API вызовы **АСИНХРОННЫЕ** через `CompletableFuture`
- Все cooldown проверки **ТОЛЬКО через HubGW API** - никакого локального кеша
- Retry логика: 2 ретрая на 429/5xx ошибках
- Timeouts: 2s connect / 5s read
- Circuit breaker для предотвращения спама логов
- Все сообщения пользователю **на русском языке**
- При ошибке API - **ОТКАЗАТЬ в выполнении команды**
- LuckPerms интеграция для всех проверок пермишенов