LoParkour/TODO.md
loki 46f7b794c6 Refactor admin command cooldown handling and update localization
- Updated cooldown handling in AdminCommandHandler to use localized messages.
- Added new method in Locales class to retrieve strings based on CommandSender type.
- Introduced cooldown messages in English and Russian localization files.
- Removed outdated DuelMode section from TODO.md and updated the last modified date.
2026-04-01 16:25:41 +02:00

77 lines
3.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-04-01.
## Легенда
- 🔴 Критично — баг/краш/безопасность
- 🟡 Важно — заявлено, но не работает / серьёзные проблемы
- 🟢 Планово — улучшение / техдолг
- ✅ Готово
---
## Главный план (стабилизация)
Консолидировано после обхода: меню/util, `LoParkour`, `LoParkourCommand`, join/teleport, `SessionStateManager`, `Island.build()`, Locales, LoLib 3.x.
### P0 — блокер загрузки или геймплей
| # | Задача | Статус |
|---|--------|--------|
| 1 | LoLib 3.x в classpath | ✅ `build.gradle.kts` → `libs/lolib-3.0.0.jar` |
| 2 | `GeneratorCleanup` — хвост только **сзади** по индексу в `history` | ✅ |
| 3 | Потокобезопасность `history` | ✅ `synchronizedList`, снимок при полном `reset()` |
### P1 — важно
| # | Задача | Статус |
|---|--------|--------|
| 4 | Хотбар: клик по предмету | ✅ `isSimilar` в restriction listener |
| 5 | SQL `readPlayer` на корректном потоке | ✅ |
### P2 — проверить после P0–P1
| # | Задача | Статус |
|---|--------|--------|
| 6 | `LifecycleTickManager` / cleanup / time UI | ✅ |
| 7 | Scoring в воздухе | ✅ документировано (стояние на блоке) |
### Контекст (не в «критичном» списке)
- Порядок `generateFirst` / телепорт из `Island.build()` — ок при неизменённом порядке вызовов.
- `history.contains(Block)` — Bukkit сравнивает по миру и координатам.
- `InventoryType.CHEST` в GUI — при странных кейсах проверить тип инвентаря.
### Порядок работ (регрессия)
1. `./gradlew build`, старт без `LinkageError`.
2. Ручной прогон паркура: счёт, меню, scoreboard, режимы.
---
## Follow-up (сделано в коде)
- **Leaderboard**: sync-таймер; итерация/снимки без гонок с `synchronizedMap`.
- **AdminCommandHandler**: cooldown 2.5 с на `forcejoin`, `forceleave`, `reset`, `recoverinventory`; при блокировке — сообщение.
- **SQLConnectionManager**: HikariCP + `mysql-connector-j` в shadow.
- **SQL password**: если задана непустая **`LOPARKOUR_SQL_PASSWORD`**, она перекрывает `config.yml` → `sql.password`.
- **World**: валидация имени; папка через `getWorldContainer()`; безопасное удаление; кик только если мир не null.
- **LoParkourCommand**: `MultiMode` для join к другу; tab-complete; leaderboard без хака; «too many args».
- **PlayerCommandHandler**: `/parkour leaderboard` без второго аргумента открывает меню лидербордов.
- **RandomStyle** / **ElytraGenerator**: защита от пустых списков.
- **InventoryData**: новые сохранения в **YAML**; legacy binary читается один раз при миграции.
---
## Чек-лист перед релизом
- [ ] `./gradlew build`
- [ ] Старт сервера, `/parkour`, меню, один полный забег
- [ ] SQL: при проде выставить `LOPARKOUR_SQL_PASSWORD` на хосте
- [ ] Проверить миграцию старых `.dat` инвентарей при первом заходе игрока
---