- 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.
77 lines
3.7 KiB
Markdown
77 lines
3.7 KiB
Markdown
# 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` инвентарей при первом заходе игрока
|
||
|
||
---
|
||
|
||
|