9.7 KiB
9.7 KiB
LoParkour — TODO
Обновлено: 2026-03-07
Легенда
- 🔴 Критично — баг/краш/не компилируется
- 🟡 Важно — фича заявлена но не работает
- 🟢 Планово — улучшение
- ✅ Готово
🔴 Критично — из code review
| # | Баг | Файл | Что сделать |
|---|---|---|---|
| 1 | 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 | 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 | PlayerCommandHandler.java |
✅ Cooldown уже реализован (2.5 сек на join/leave) | |
| 10 | Config.java |
✅ Добавлена валидация критичных значений | |
| 11 | loadIslandSchematic() возвращает null |
ParkourGenerator.java |
✅ Fallback на дефолтный схематик "island" |
| 12 | 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 | 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создан но нигде не вызывается - ✅
JumpTypeenum создан но не интегрирован в генератор - ✅
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 вместо имени (частично - нужно обновить вызовы)
🎮 Чек-лист перед релизом
./gradlew buildбез ошибок- Все критичные баги исправлены (пункты 1-8)
- Все улучшения безопасности (пункты 9-12)
- Все оптимизации (пункты 13-16)
- SQL Injection полностью устранён
- Версия обновлена до 1.3.1
- CHANGELOG.md создан
- README.md обновлён
- RELEASE_NOTES.md создан
- Юнит-тесты добавлены (JumpValidator, GhostData)
- Баги найденные тестами исправлены
- Все тесты проходят успешно
- Запуск сервера без ошибок в консоли
- Паркур: прыжки, счёт, рекорд работают
- 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.