This commit is contained in:
loki 2026-03-01 22:43:37 +01:00
parent 547fe6d9bb
commit 8705cad578
118 changed files with 2714 additions and 4761 deletions

309
TODO.md Normal file
View file

@ -0,0 +1,309 @@
# 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()` — разбить на методы