LoParkour/TODO.md
2026-03-10 12:39:21 +01:00

177 lines
9.7 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.

# LoParkour — TODO
> Обновлено: 2026-03-07
## Легенда
- 🔴 Критично — баг/краш/не компилируется
- 🟡 Важно — фича заявлена но не работает
- 🟢 Планово — улучшение
- ✅ Готово
---
## 🔴 Критично — из code review
| # | Баг | Файл | Что сделать |
|---|-----|------|-------------|
| 1 | ~~Ghost файлы по имени игрока~~ | `GhostManager.java`, `GhostData.java` | ✅ Используется UUID вместо имени |
| 2 | ~~`GhostRecorder.stopRecording()` не передаёт UUID~~ | `GhostRecorder.java`, `GeneratorLifecycle.java` | ✅ Добавлен параметр UUID |
| 3 | ~~`new Random()` в горячих методах~~ | `BlockPlacer.java` | ✅ Заменено на `ThreadLocalRandom.current()` |
| 4 | ~~`ConcurrentModificationException` в `reset()`~~ | `ParkourGenerator.java` | ✅ Синхронизация через копирование списка |
| 5 | ~~Сохраняется только DEFAULT лидерборд~~ | `LoParkour.java` disable() | ✅ Сохраняются все режимы (Speedrun, Race, Coop, Elytra) |
| 6 | ~~`cleanupDistantBlocks()` вызывается дважды~~ | `GeneratorLifecycle.java` | ✅ Убран дублирующий вызов |
| 7 | ~~`System.err.println` в JumpOffsetGenerator~~ | `JumpOffsetGenerator.java` | ✅ Используется Logger |
| 8 | ~~`disable()` глотает все исключения~~ | `LoParkour.java` | ✅ Логируются ошибки |
| 9 | ~~Первый блок может быть специальным~~ | `BlockPlacer.java` | ✅ Всегда полный блок из конфига |
---
## 🟡 Важно — улучшения безопасности
| # | Проблема | Файл | Что сделать |
|---|----------|------|-------------|
| 9 | ~~Отсутствует rate limiting~~ | `PlayerCommandHandler.java` | ✅ Cooldown уже реализован (2.5 сек на join/leave) |
| 10 | ~~Нет валидации конфигурации~~ | `Config.java` | ✅ Добавлена валидация критичных значений |
| 11 | ~~`loadIslandSchematic()` возвращает null~~ | `ParkourGenerator.java` | ✅ Fallback на дефолтный схематик "island" |
| 12 | ~~Hardcoded строки вместо локализации~~ | `MainMenu.java`, `CoopMode.java`, `RaceMode.java`, `ElytraMode.java` | ✅ Используется `Locales.getString()` |
---
## 🟢 Планово — оптимизация
| # | Улучшение | Файл | Что сделать |
|---|-----------|------|-------------|
| 13 | ~~`getPlayers()` создаёт новый список каждый раз~~ | `ParkourPlayer.java` | ✅ Оптимизирован `getPlayer()` без создания списка |
| 14 | ~~Магические числа~~ | `BlockPlacer.java`, `GeneratorLifecycle.java` | ✅ Вынесены в константы (MAX_RETRIES, FALL_DISTANCE, etc) |
| 15 | ~~`selectJumpType()` хардкод шансов~~ | `BlockPlacer.java` | ✅ Вынесено в generation.yml |
| 16 | ~~SQL Injection в writeScores/writePlayer~~ | `StorageSQL.java` | ✅ Переписано на PreparedStatement с параметрами |
---
## 🎉 Итоги рефакторинга
### Исправлено критичных багов: 8/8 ✅
- Ghost UUID параметр
- ThreadLocalRandom вместо new Random()
- ConcurrentModificationException
- Сохранение всех лидербордов
- Двойной вызов cleanup
- System.err → Logger
- Логирование ошибок в disable()
- **SQL Injection полностью устранён**
### Улучшения безопасности: 4/4 ✅
- Rate limiting (уже был)
- Валидация конфигурации
- Fallback для схематиков
- Локализация всех строк
### Оптимизация: 4/4 ✅
- Оптимизация getPlayer()
- Константы вместо магических чисел
- Конфигурируемые шансы jump types
- PreparedStatement для SQL
---
## 🟢 Планово — дуэли
### DuelMode
- [ ] `DuelMode implements Mode` — режим дуэли
- [ ] `DuelSession extends Session` — два игрока, отдельные острова
- [ ] `/lp duel <игрок>` — вызов на дуэль, запрос истекает через 30 сек
- [ ] Форматы: **Race** (кто первый до N очков), **Survival** (3 жизни), **Time Attack** (60 сек кто больше)
- [ ] Scoreboard показывает счёт обоих в реальном времени
- [ ] ActionBar: `Opponent: 34 pts` во время игры
- [ ] При падении противника — уведомление
- [ ] Победитель получает награды через систему `Rewards`
- [ ] Лидерборд дуэлей (W/L)
- [ ] Кнопка реванша после окончания
---
## ✅ Уже исправлено
- ✅ BOM в `ParkourGenerator.java` ломает компиляцию
- ✅ `generator.score` → `generator.state.score`
- ✅ `ParkourUser.joinCount` удалён
- ✅ `PlayerSettingsManager.OptionContainer` не public
- ✅ `Option.PARTICLE_DATA.data()` не существует
- ✅ `ParticleUtil.circle()` неправильные параметры
- ✅ `PotionEffectType.JUMP` и `SLOW` удалены в Paper 1.20.5+
- ✅ `ElytraMode` создаёт обычный `ParkourGenerator`
- ✅ `SpeedrunMode`: таймеры `runLater` продолжают тикать после `reset()`
- ✅ `HardcoreMode`: `collectedRewards` не очищается при падении
- ✅ `JumpValidator` создан но нигде не вызывается
- ✅ `JumpType` enum создан но не интегрирован в генератор
- ✅ `ConfigUpdater` закомментирован
- ✅ `GravityShiftMode`: нет визуала при смене эффекта
- ✅ Ghost система не интегрирована
- ✅ Удалить мёртвые stub-файлы
- ✅ ElytraMode: кольца из партиклов + детекция пролёта
- ✅ ElytraMode: cooldown на фейерверки
- ✅ RaceMode
- ✅ CoopMode
- ✅ Реорганизация `generator/` по подпакетам
- ✅ SQL Injection исправлен (PreparedStatement)
- ✅ PreparedStatement leak исправлен (try-with-resources)
- ✅ Scheduler Task Leak в SpeedrunMode исправлен
- ✅ Удалены GravityShiftMode и HardcoreMode (запутанные режимы)
- ✅ Предметы в хотбаре вместо инвентаря
- ✅ Схематики отключены из генерации
- ✅ Сложность генерации сбалансирована
- ✅ Ограничения после специальных блоков (слэбы, заборы, панели)
- ✅ Clamp значений height/distance для безопасности
- ✅ Fallback в JumpOffsetGenerator
- ✅ Локали для race и coop режимов
- ✅ Конфиг для race и coop режимов
- ✅ Fallback для first-block-material в Island.java
- ✅ Ghost файлы по UUID вместо имени (частично - нужно обновить вызовы)
---
## 🎮 Чек-лист перед релизом
- [x] `./gradlew build` без ошибок
- [x] Все критичные баги исправлены (пункты 1-8)
- [x] Все улучшения безопасности (пункты 9-12)
- [x] Все оптимизации (пункты 13-16)
- [x] SQL Injection полностью устранён
- [x] Версия обновлена до 1.3.1
- [x] CHANGELOG.md создан
- [x] README.md обновлён
- [x] RELEASE_NOTES.md создан
- [x] Юнит-тесты добавлены (JumpValidator, GhostData)
- [x] Баги найденные тестами исправлены
- [x] Все тесты проходят успешно
- [ ] Запуск сервера без ошибок в консоли
- [ ] Паркур: прыжки, счёт, рекорд работают
- [ ] Scoreboard обновляется
- [ ] Все меню открываются
- [ ] SQL: данные сохраняются и читаются
- [ ] Партиклы и звук в каждом режиме
- [ ] Все режимы запускаются без ошибок (Default, Speedrun, Elytra, Race, Coop)
- [ ] Ghost система работает (запись и воспроизведение)
- [ ] Нет невозможных прыжков после специальных блоков
- [ ] Предметы в хотбаре (слоты 1,3,4,5,7)
---
## 📊 Оценка из code review
**Общая оценка: 7.5/10**
**Сильные стороны:**
- Отличная структура пакетов
- Есть API для разработчиков
- Хорошая модульность (режимы, генератор, хранилище)
- Много систем (leaderboard, ghost, generator, schematics, menus, rewards)
**Что нужно исправить:**
- Критичные баги из таблицы выше
- Безопасность (rate limiting, валидация)
- Оптимизация (кеширование, константы)
**Потенциал:**
Проект уровня реального Spigot ресурса (15-25k строк кода). При исправлении критичных багов можно выпускать в production.