# LoParkour — TODO > Обновлено: 2026-04-09. ## Легенда - 🔴 Критично — баг/краш/безопасность - 🟡 Важно — заявлено, но не работает / серьёзные проблемы - 🟢 Планово — улучшение / техдолг - ✅ Готово --- ## Текущие задачи (2026-04-09) ### 🔴 P0 — Критичные баги | # | Задача | Статус | |---|--------|--------| | 1 | Баг с локалью `'true'` в БД/конфиге | ✅ Исправлено (санитизация на всех уровнях) | | 2 | Первый блок паркура генерится на платформе | ✅ Исправлено (6 блоков вперёд + 1 вверх) | | 3 | ElytraMode полностью не работает | 🔴 **КРИТИЧНО** - отсутствуют классы | ### 🟡 P1 — Важные недоработки | # | Задача | Статус | |---|--------|--------| | 4 | GravityShiftMode не реализован | ✅ Реализовано (случайные эффекты зелий) | | 5 | HardcoreMode не реализован | ✅ Реализовано (сброс наград при падении) | ### 🟢 P2 — Проверка после исправлений | # | Задача | Статус | |---|--------|--------| | 6 | DefaultMode после изменений Island.java | 🟢 Требует проверки | | 7 | SpeedrunMode таймеры блоков | 🟢 Требует проверки | | 8 | RaceMode прогресс-бар и финиш | 🟢 Требует проверки | | 9 | CoopMode мультиплеер | 🟢 Требует проверки | --- ## Детальный план исправления режимов ### ElytraMode (4-6 часов) **Проблема:** Отсутствуют классы, на которые ссылается `ElytraGenerator`: - `ElytraConfig` - загрузка настроек из config.yml - `ElytraRing` - модель кольца (центр, радиус, направление) - `ElytraRingGenerator` - генерация колец по траектории - `ElytraPhysics` - проверка пролёта, падения, буста - `ElytraRenderer` - отрисовка частицами **План:** 1. Создать `mode/elytra/ElytraConfig.java` 2. Создать `mode/elytra/ElytraRing.java` 3. Создать `mode/elytra/ElytraRingGenerator.java` 4. Создать `mode/elytra/ElytraPhysics.java` 5. Создать `mode/elytra/ElytraRenderer.java` 6. Исправить `generateFirst()` в `ElytraGenerator` 7. Добавить выдачу элитры и фейерверков ### ✅ GravityShiftMode (реализовано 2026-04-09) **Реализация:** 1. ✅ Создан `mode/GravityShiftMode.java` с внутренним `GravityShiftGenerator` 2. ✅ Счётчик прыжков на игрока, каждые N прыжков - случайный эффект 3. ✅ Эффекты: jump-boost, speed, slowness, levitation (настраиваемые) 4. ✅ Зарегистрирован в `Modes.java` и `LoParkour.java` 5. ✅ Добавлены локали (en.yml, ru.yml) **Коммиты:** - `159a4fd` - feat: implement GravityShiftMode with random potion effects - `cf84789` - fix: correct GravityShiftMode getMode() and documentation ### ✅ HardcoreMode (реализовано 2026-04-09) **Реализация:** 1. ✅ Создан `mode/HardcoreMode.java` с внутренним `HardcoreGenerator` 2. ✅ Переопределён `fall()` - очистка `collectedRewards` для всех игроков 3. ✅ Зарегистрирован в `Modes.java` и `LoParkour.java` 4. ✅ Добавлены локали (en.yml, ru.yml) **Коммиты:** - `64badce` - feat: implement HardcoreMode with reward reset on fall - `191c1b9` - feat: register HardcoreMode in Modes registry - `3690915` - fix: register GravityShift and Hardcore modes in plugin --- ## Исправления от 2026-04-09 ### ✅ Баг с локалью - `ConfigAccessor.getString()` - форсирует String через `String.valueOf()` - `Option.java:267-272` - санитизация при загрузке дефолтов из конфига - `PlayerSettingsManager.java:37-44` - санитизация при загрузке настроек - `SQLDataMapper.java:87-95` - санитизация при загрузке из SQL - `StorageDisk.java:90-106` - санитизация при загрузке из JSON - `SQLMigrationManager.java:51-53` - SQL миграция для исправления БД ### ✅ Первый блок паркура - `Island.java:75-90` - первый блок на 6 блоков вперёд + 1 вверх от центра - `GeneratorCleanup.java:110-127` - после падения тоже 6 вперёд + 1 вверх ### ✅ Spawn location в конфиге - Добавлены `spawn-location` и `spawn-axes` в начало config.yml --- ## Главный план (стабилизация) ### 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 в воздухе | ✅ документировано (стояние на блоке) | --- ## 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` инвентарей при первом заходе игрока - [ ] Протестировать все режимы: default, speedrun, race, coop, elytra, gravity-shift, hardcore