LoParkour/TODO.md
2026-03-01 22:43:37 +01:00

309 lines
16 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 — Мастер-план задач
> Версия: 1.3.0 → 2.0.0
> Обновлено: 2026-03-01
>
> Цель: сделать лучше Infinite Parkour, Infinite Parkour Plus и Infinite Elytra Parkour —
> взять всё хорошее, устранить все их минусы, добавить то что их пользователи просили.
---
## 🔥 КРИТИЧНО — Краш при старте
**Причина:** `instance` в `LoParkour.java` объявлен но никогда не присваивается.
`Config` enum при статической инициализации зовёт `LoParkour.getInFolder()` → NPE → краш.
**Фикс:**
```java
@Override
public void onEnable() {
instance = this; // ← этого нет
super.onEnable(); // вызывает enable()
}
```
- [ ] Добавить `instance = this` перед `super.onEnable()`
- [ ] Пересобрать: `./gradlew shadowJar`
- [ ] Проверить что сервер стартует без ошибок
---
## 🚧 ВЫСОКИЙ ПРИОРИТЕТ — Сломано
### 1. Меню система (16 файлов отключены)
Все `open()` закомментированы. Игроки видят "Меню недоступно".
- [ ] Изучить LoLib InventoryGUI API (`api_docs/guides/gui.md`)
- [ ] Базовый `BaseMenu` поверх LoLib `InventoryGUI`
- [ ] Мигрировать по приоритету:
- [ ] MainMenu
- [ ] PlayMenu / SingleMenu
- [ ] SettingsMenu / ParkourSettingsMenu
- [ ] LangMenu
- [ ] LeaderboardsMenu / SingleLeaderboardMenu
- [ ] LobbyMenu / PlayerManagementMenu
- [ ] CommunityMenu / SpectatorMenu
### 2. Схематики (генерация паркура сломана)
`schematic.paste()` закомментирован — схематичные прыжки не генерируются.
- [ ] Починить `Schematics.getSchematic()` вызовы
- [ ] Починить `schematic.paste()` / `rotatedPaste()` в `ParkourGenerator`
- [ ] Протестировать генерацию в игре
---
## 🛠 РЕФАКТОРИНГ
### 3. Config enum — антипаттерн
Конструктор обращается к синглтону при статической инициализации.
- [ ] Убрать `LoParkour.getInFolder()` из конструктора
- [ ] Добавить lazy `getPath()` или явный `Config.init()` вызов
### 4. `enable()` — разбить на методы (SRP)
```java
public void enable() {
instance = this;
loadConfigs();
loadSchematics();
registerModes();
registerHooks();
setupWorld();
registerListeners();
setupMetrics();
}
```
- [ ] Каждый private метод — одна задача, макс 20 строк
### 5. Инкапсуляция
`session.generator`, `pp.session`, `pp.player` — публичные поля.
- [ ] Добавить геттеры, сделать поля private/protected
### 6. Логирование
`logger.severe("msg - " + ex.getMessage())` теряет стек вызовов.
- [ ] Заменить на `loLogger().error("msg", ex)` везде
---
## 🐛 БАГИ КОНКУРЕНТОВ — Устранить у нас лучше
Эти проблемы убили Infinite Parkour в глазах сообщества. У нас их быть не должно.
### Ghost blocks — блоки остаются висеть после сессии
У IP это главная жалоба — после дисконнекта или краша блоки паркура остаются в мире.
- [ ] Аудит `ParkourGenerator.disable()` и `World.delete()` — всё ли чистится
- [ ] Список всех размещённых блоков писать в сессию, чистить при любом выходе
- [ ] Обработать `PlayerQuitEvent`, `PlayerKickEvent`, `ServerShutdownEvent`
- [ ] Тест: войти → выйти через Alt+F4 → зайти снова → блоков нет
### World generation баг — генерируется лишний overworld
У IP при определённых условиях создавался новый мир и жрал память.
- [ ] Убедиться что `World.create()` не создаёт новый мир если уже есть
- [ ] Проверить что мир регистрируется в `worlds` конфиге и не пересоздаётся
- [ ] Логировать создание/удаление мира
### Scoreboard баг
У IP scoreboard ломался и фиксился только отключением.
- [ ] Использовать LoLib Sidebar API вместо ручного scoreboard
- [ ] Обернуть в try/catch, при ошибке — пересоздать sidebar, не ронять плагин
### Лидерборды из коробки без плагинов
У IP нужен HolographicDisplays, документация невнятная, люди не разбирались.
- [ ] Лидерборды через встроенный LoLib holograms (пакеты, без зависимостей)
- [ ] `HoloHook` только как опциональное улучшение
- [ ] Авто-создание голограммы командой `/lp leaderboard create <mode> <location>`
- [ ] Документация прямо в `config.yml` комментариями
### Inventory recovery
У IP терялся инвентарь при краше. Было, но работало криво.
- [ ] Команда `/lp recoverinventory` — восстановить инвентарь из сохранённого снапшота
- [ ] Снапшот сохранять async на диск при входе в паркур
- [ ] Восстанавливать автоматически при старте если игрок был в паркуре
---
## 🎮 РЕЖИМЫ — Доработка существующих
### ElytraMode → полноценный Elytra Parkour
Сейчас: выдаётся элитра + ракеты, летишь над обычными блоками. Это не режим.
Нужно: 3 подрежима по аналогии с Infinite Elytra Parkour (6 режимов).
**Подрежим 1 — Classic (бесконечный маршрут)**
- [ ] `ElytraGenerator` — генерирует широкие платформы и коридоры для полёта
- [ ] Firefly буст при подборе ракеты в мире
- [ ] Счёт за дистанцию
**Подрежим 2 — Precision (точность через кольца)**
- [ ] Кольца из стекла/стеклопанелей — процедурная генерация
- [ ] Кольца разного диаметра (большие → маленькие с прогрессом)
- [ ] Счёт за точность: пролетел по центру → 3 очка, по краю → 1 очко, пропустил → 0
- [ ] Хитбокс кольца через регионы LoLib (Cuboid/Cylinder)
**Подрежим 3 — Obstacle (уклонение)**
- [ ] Стены с дырами, колонны, горизонтальные балки
- [ ] Нарастающая скорость через эффект скорости
- [ ] Жизни (3 касания = конец)
**Ветровые зоны (просили пользователи Elytra плагина)**
- [ ] Зоны ускорения (tailwind) — зелёные частицы, +скорость
- [ ] Зоны замедления (headwind) — красные частицы, -скорость
- [ ] Боковой ветер — толчок в сторону
**Общее для ElytraMode:**
- [ ] Конфиг: стартовые ракеты, размер колец, скорость нарастания
- [ ] Scoreboard: текущий подрежим, очки, ракеты
- [ ] Нет стандартного `ParkourGenerator` — только свой `ElytraGenerator`
### SpeedrunMode
- [ ] Текущий рекорд в scoreboard в реальном времени
- [ ] Сплиты: +δ время на 10/25/50/100 прыжках (зелёный если быстрее рекорда, красный если медленнее)
- [ ] Ghost replay при побитии рекорда
### HardcoreMode
- [ ] Настройка количества жизней (1–5) в конфиге
- [ ] Индикация жизней в scoreboard (сердца)
- [ ] Опция: потеря наград при потере жизни vs только при нуле жизней
### GravityShiftMode
- [ ] Предупреждение за 3 прыжка до смены (title на экране)
- [ ] Визуальный эффект смены (частицы + звук)
- [ ] Scoreboard показывает следующий эффект
---
## 🆕 НОВЫЕ РЕЖИМЫ
### LavaRush (просили пользователи IP)
Паркур с поднимающейся лавой снизу.
- [ ] `LavaRushMode extends DefaultMode`
- [ ] Лава-блок (или FakeBlock) поднимается каждые N тиков
- [ ] Скорость подъёма нарастает с прогрессом
- [ ] Счёт = высота от начального уровня
- [ ] Конфиг: начальная скорость, нарастание, визуальный тип (настоящая лава / красные частицы)
- [ ] Совет: FakeBlock через пакеты (LoLib packets) — не грузит сервер
### LobbyParkour (Infinite Parkour Plus фича)
Фоновый паркур в зоне ожидания сервера. Игрок просто прыгает пока ждёт.
- [ ] Отдельный режим без очков и лидерборда
- [ ] Не сохраняет статистику
- [ ] Настройка зоны в конфиге (мир + координаты)
- [ ] Авто-старт при входе в зону
### SessionLobby — меню активных сессий (IP Plus фича)
Меню где видно кто сейчас играет, можно присоединиться или зайти зрителем.
- [ ] `SessionMenu extends BaseMenu` — список всех активных сессий
- [ ] Каждая сессия: режим, игроки, счёт, кнопки "Присоединиться" / "Смотреть"
- [ ] Обновление в реальном времени (каждые 2 секунды)
- [ ] Команда `/lp sessions`
### NatureParkour (Infiniti Parkus стиль)
Расслабленный паркур по природной местности. Без таймера.
- [ ] `NatureGenerator`:
- Блоки: трава, земля, дерево, листья, цветы, камень, мох
- Широкие платформы (2–4 блока), мостики из дерева, арки из листьев
- Биомные темы: лес / горы / пляж / снег (переключаются в настройках)
- [ ] Нет таймера — счёт за пройденные блоки
- [ ] Коллаборативный: 2–4 игрока вместе на одном паркуре
### ZigZagMode
- [ ] Строго зигзаг (лево/право/лево/право) с нарастающей скоростью
- [ ] Только одиночные блоки, без схематик
- [ ] Тренировочный режим для стрейфов
### DuelsMode (мультиплеер)
- [ ] 2 игрока, параллельные трассы, 60 секунд
- [ ] Кто больше прыжков — победил
- [ ] Саботаж каждые 20 прыжков: выбрать дебафф противнику (замедление / слепота / левитация)
- [ ] Очередь матчей
---
## 📊 УЛУЧШЕНИЯ КАЧЕСТВА ЖИЗНИ
### Настройки прямо в GUI во время игры (из IP)
- [ ] Кнопка в инвентаре "⚙ Настройки" открывает мини-меню
- [ ] Можно менять: стиль блоков, сложность схематик, звуки, частицы
- [ ] Без выхода из паркура
### Прыжки — 6 типов как в IP (часть уже есть)
Текущие: обычные, схематики. Нужно добавить:
- [ ] Ледяные блоки (ice) — скользкие приземления
- [ ] Слябы (slab) — уменьшенная площадь
- [ ] Заборы (fence) — узкие столбики
- [ ] Стеклопанели (glass pane) — тонкие вертикальные
### PAPI плейсхолдеры — расширить
Сейчас есть базовые. Добавить:
- [ ] `%loparkour_mode%` — текущий режим
- [ ] `%loparkour_score%` — текущий счёт
- [ ] `%loparkour_best_<mode>%` — лучший результат в режиме
- [ ] `%loparkour_rank_<mode>%` — позиция в лидерборде
- [ ] `%loparkour_elytra_score%` — счёт в Elytra
- [ ] `%loparkour_elytra_rank%` — ранг в Elytra
---
## ⚡ ПРОИЗВОДИТЕЛЬНОСТЬ
- [ ] `GhostManager` — лимит записей (не хранить всё бесконечно)
- [ ] Блочная история в `ParkourGenerator` — убедиться что cleanup работает каждые 100 тиков
- [ ] Все Scheduler-задачи: сохранять ссылку, отменять в `disable()`
- [ ] Async загрузка данных игрока при входе (сейчас синхронно?)
- [ ] ElytraGenerator — хитбоксы колец через регионы, не поблочная проверка
---
## 🧪 ТЕСТИРОВАНИЕ
- [ ] Старт сервера без ошибок
- [ ] Вход/выход — инвентарь восстанавливается
- [ ] Ghost blocks: выйти через Alt+F4 → зайти → блоков нет
- [ ] Все режимы: Default, Speedrun, Hardcore, GravityShift, Elytra
- [ ] Меню: открывается, кнопки работают
- [ ] Схематики: генерируются правильно
- [ ] Лидерборды: обновляются, голограмма создаётся командой
- [ ] `/lp recoverinventory` — работает после краша
---
## 📦 ВЕРСИОНИРОВАНИЕ
| Версия | Что входит |
|--------|------------|
| 1.3.1 | Фикс краша (instance), меню работают, схематики работают, ghost blocks чистятся |
| 1.4.0 | ElytraMode полноценный (3 подрежима + ветер), inventory recovery, лидерборды без зависимостей |
| 1.5.0 | LavaRush, ZigZagMode, NatureParkour, SessionLobby меню |
| 1.6.0 | DuelsMode, LobbyParkour, настройки в GUI во время игры |
| 2.0.0 | Все 6 типов прыжков, все подрежимы Elytra, полный рефакторинг |
---
## 💡 ИДЕИ НА БУДУЩЕЕ
- Сезонные события — тематика блоков (снег зимой, цветы летом)
- Пользовательские схематики — игроки создают и загружают свои
- Еженедельные челленджи с особыми наградами
- Discord webhook при побитии рекорда
- Анти-чит через Physics из LoLib (проверка скорости прыжков)
- Replay для зрителей через Ghost API
---
## 📅 ПЛАН НА СЕГОДНЯ
1. **[5 мин]** Фикс `instance = this` → собрать → убедиться что стартует
2. **[1–2 ч]** Починить меню (MainMenu + PlayMenu как минимум)
3. **[1 ч]** Починить схематики
4. **[30 мин]** Аудит ghost blocks — убедиться что чистятся при любом выходе
5. **[1 ч]** ElytraGenerator — кольца, хотя бы Precision подрежим
6. **[30 мин]** Рефакторинг `enable()` — разбить на методы