# 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 ` - [ ] Документация прямо в `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_%` — лучший результат в режиме - [ ] `%loparkour_rank_%` — позиция в лидерборде - [ ] `%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()` — разбить на методы