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

16 KiB
Raw Blame History

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 → краш.

Фикс:

@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)

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() — разбить на методы