16 KiB
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поверх LoLibInventoryGUI - Мигрировать по приоритету:
- 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
📅 ПЛАН НА СЕГОДНЯ
- [5 мин] Фикс
instance = this→ собрать → убедиться что стартует - [1–2 ч] Починить меню (MainMenu + PlayMenu как минимум)
- [1 ч] Починить схематики
- [30 мин] Аудит ghost blocks — убедиться что чистятся при любом выходе
- [1 ч] ElytraGenerator — кольца, хотя бы Precision подрежим
- [30 мин] Рефакторинг
enable()— разбить на методы