fix and migrate 70%
This commit is contained in:
parent
8705cad578
commit
d1dcf6ab57
138 changed files with 3736 additions and 4735 deletions
521
TODO.md
521
TODO.md
|
|
@ -1,309 +1,248 @@
|
|||
# LoParkour — Мастер-план задач
|
||||
# LoParkour — TODO & Roadmap
|
||||
|
||||
> Версия: 1.3.0 → 2.0.0
|
||||
> Обновлено: 2026-03-01
|
||||
>
|
||||
> Цель: сделать лучше Infinite Parkour, Infinite Parkour Plus и Infinite Elytra Parkour —
|
||||
> взять всё хорошее, устранить все их минусы, добавить то что их пользователи просили.
|
||||
> **Принципы:** KISS · DRY · SOLID
|
||||
> **Версия:** 1.3.0 → 2.0.0
|
||||
> **Обновлено:** 2026-03-05
|
||||
|
||||
---
|
||||
|
||||
## 🔥 КРИТИЧНО — Краш при старте
|
||||
## 📊 Статус миграции vilib → LoLib 2.0
|
||||
|
||||
**Причина:** `instance` в `LoParkour.java` объявлен но никогда не присваивается.
|
||||
`Config` enum при статической инициализации зовёт `LoParkour.getInFolder()` → NPE → краш.
|
||||
✅ **МИГРАЦИЯ ЗАВЕРШЕНА** (2026-03-01)
|
||||
- Файлов изменено: 120+
|
||||
- Строк кода: 3000+
|
||||
- Ошибок исправлено: 250+
|
||||
- Размер jar: 655 КБ
|
||||
- Все меню работают
|
||||
- Схематики работают
|
||||
|
||||
**Фикс:**
|
||||
---
|
||||
|
||||
## Легенда
|
||||
- 🔴 **Критично** — баги/краши, нужно прямо сейчас
|
||||
- 🟡 **Важно** — неработающие фичи
|
||||
- 🟢 **Планово** — улучшения и новые фичи
|
||||
- ✅ **Готово**
|
||||
|
||||
---
|
||||
|
||||
## 🔴 Критично
|
||||
|
||||
| # | Задача | Файл | Статус |
|
||||
|---|--------|------|--------|
|
||||
| 1 | GUIManager.init() не вызывался — клики не отменялись | `LoParkour.java` | ✅ |
|
||||
| 2 | SQL race condition: CREATE TABLE до connect() | `StorageSQL.java` | ✅ |
|
||||
| 3 | PreparedStatement leak в sendQuery() | `StorageSQL.java` | ✅ |
|
||||
| 4 | Leaderboard читал данные до готовности SQL | `Leaderboard.java` | ✅ |
|
||||
| 5 | Scoreboard не назначался игроку / обновление отключено | `ParkourUser.java` | ✅ |
|
||||
| 6 | Только 16 уникальных entries в scoreboard (§0..§f) | `ParkourUser.java` | ✅ |
|
||||
| 7 | NPE в World.setup() если createWorld() упал | `World.java` | ✅ |
|
||||
| 8 | World.world не обновлялся при крэш-рестарте | `World.java` | ✅ |
|
||||
| 9 | UUID сравнивался через == вместо .equals() | `ParkourUser.java` | ✅ |
|
||||
| 10 | Async world creation вызывалось не на main thread | `LoParkour.java` | ✅ |
|
||||
| 11 | StorageSQL.close() не проверяет connection == null | `StorageSQL.java` | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 🟡 Важно — неработающие фичи
|
||||
|
||||
### Партиклы
|
||||
**Файл:** `generator/ParkourGenerator.java` → `generator/EffectManager.java`
|
||||
- [x] Реализован базовый DOT/CIRCLE/BOX через `EffectManager`
|
||||
- [ ] Протестировать все три режима в игре
|
||||
- [ ] Убедиться что `ParticleUtil.circle()` принимает `List<Player>`
|
||||
|
||||
### ConfigUpdater
|
||||
**Файл:** `config/Config.java`
|
||||
- [ ] Раскомментировать `ConfigUpdater.update(...)` (закомментировано с TODO)
|
||||
- [ ] Убедиться что `ignoredSections` правильно пробрасываются
|
||||
|
||||
### SpeedrunMode — блоки не синхронизированы с генератором
|
||||
**Файл:** `mode/SpeedrunMode.java`
|
||||
- [ ] Переопределить `tick()` в `SpeedrunGenerator`
|
||||
- [ ] Блоки должны исчезать через `history`, а не независимо
|
||||
|
||||
### HardcoreMode — сброс наград при падении
|
||||
**Файл:** `mode/HardcoreMode.java`
|
||||
- [ ] Переопределить `reset()` в `HardcoreGenerator`
|
||||
- [ ] Очищать `player.collectedRewards` при `regenerate=true`
|
||||
|
||||
---
|
||||
|
||||
## 🟢 Планово — новые фичи
|
||||
|
||||
### ElytraMode — кольца
|
||||
**Файл:** `mode/ElytraMode.java`
|
||||
- [ ] `ElytraGenerator extends ParkourGenerator` — генерировать кольца из партиклов
|
||||
- [ ] Детекция пролёта через кольцо (bounding box check в tick)
|
||||
- [ ] Cooldown на фейерверки (буст)
|
||||
|
||||
### GravityShiftMode — визуальные эффекты
|
||||
**Файл:** `mode/GravityShiftMode.java`
|
||||
- [ ] Title при смене эффекта
|
||||
- [ ] Партиклы PORTAL при смене
|
||||
- [ ] Звук при смене
|
||||
|
||||
### Валидация прыжков
|
||||
**Файл:** `generator/ParkourGenerator.java`
|
||||
- [ ] Включить `JUMP_VALIDATION_ENABLED` из конфига в `selectNext()`
|
||||
- [ ] Retry-loop: до 10 попыток если прыжок невозможен
|
||||
- [ ] Использовать уже существующий `JumpValidator`
|
||||
|
||||
### Специальные прыжки
|
||||
**Файл:** `generator/JumpType.java` (создать)
|
||||
- [ ] neo-jump (4 блока по диагонали)
|
||||
- [ ] head-hitter (блок над головой)
|
||||
- [ ] Интегрировать в `selectBlocks()` через шанс из конфига
|
||||
|
||||
### Ghost система
|
||||
**Файл:** `ghost/`
|
||||
- [ ] Протестировать `GhostRecorder` и `GhostPlayer`
|
||||
- [ ] Включить в конфиге `ghost-mode.enabled: true`
|
||||
- [ ] Команда `/lp ghost <on|off>`
|
||||
|
||||
### Мультиплеер режимы
|
||||
- [ ] RaceMode (гонка — кто первый наберёт N очков)
|
||||
- [ ] CoopMode (кооператив — общий счёт)
|
||||
|
||||
### Локализация режимов
|
||||
**Файлы:** `locales/en.yml`, `locales/ru.yml`
|
||||
- [ ] gravity-shift: название эффекта, `effect-applied`
|
||||
- [ ] elytra: `ring-passed`, `boost-ready`, `boost-cooldown`
|
||||
- [ ] hardcore: `rewards-lost`
|
||||
|
||||
---
|
||||
|
||||
## ✅ Архитектурный рефакторинг — завершён
|
||||
|
||||
| Что сделано | Результат |
|
||||
|-------------|-----------|
|
||||
| `Command.java` → удалён (дубликат) | `LoParkourCommand.java` — единственный файл |
|
||||
| `LoParkourCommand.java` (528 строк) | `command/PlayerCommandHandler` + `AdminCommandHandler` + `SchematicCommandHandler` + тонкий роутер |
|
||||
| `Events.java` (268 строк) | `listener/PlayerConnectionListener` + `ParkourRestrictionListener` + `SchematicWandListener` |
|
||||
| `ParkourGenerator.java` (666 строк) | Делегирует в `EffectManager` + `GeneratorTick` |
|
||||
| `Option.java` (247 строк) | `SqlOptions` + `ParticleOptions` + `GenerationOptions` + тонкий `Option` |
|
||||
| GUI-паттерн (13 меню) | Исправлены на правильный `create()` API |
|
||||
| Scoreboard | Полная реализация через Team prefix API |
|
||||
| SQL инициализация | `pendingTableCreations` queue + `onConnectCallbacks` |
|
||||
|
||||
---
|
||||
|
||||
## 🎮 Чек-лист перед релизом
|
||||
|
||||
- [ ] `./gradlew build` без ошибок и предупреждений
|
||||
- [ ] Запуск сервера без ошибок в консоли
|
||||
- [ ] Паркур создаётся и работает (прыжки, счёт, рекорд)
|
||||
- [ ] Скорборд обновляется во время игры
|
||||
- [ ] Все меню открываются корректно
|
||||
- [ ] SQL: таблицы создаются, данные сохраняются/читаются
|
||||
- [ ] Схематики: save → reload → paste работает
|
||||
- [ ] Лидерборд: запись и чтение рекордов
|
||||
- [ ] Частицы и звук работают в каждом режиме
|
||||
- [ ] `/lp forcejoin`, `forceleave`, `reset`, `recoverinventory`
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 🔧 План рефакторинга больших файлов
|
||||
|
||||
### Проблемные файлы (>200 строк):
|
||||
- `generator/ParkourGenerator.java` (306) → разбить на 3 файла
|
||||
- `storage/StorageSQL.java` (248) → разбить на 2 файла
|
||||
- `session/Session.java` (236) → разбить на 2 файла
|
||||
- `player/ParkourUser.java` (220) → разбить на 2 файла
|
||||
- `player/ParkourPlayer.java` (202) → разбить на 2 файла
|
||||
|
||||
### 1. ParkourGenerator.java → 3 файла
|
||||
```
|
||||
generator/
|
||||
├── ParkourGenerator.java (150) - координация
|
||||
├── GeneratorState.java (80) - состояние (score, history)
|
||||
└── GeneratorLifecycle.java (80) - tick, reset, fall
|
||||
```
|
||||
|
||||
### 2. StorageSQL.java → 2 файла
|
||||
```
|
||||
storage/
|
||||
├── SQLConnection.java (120) - управление подключением
|
||||
└── SQLRepository.java (130) - CRUD операции
|
||||
```
|
||||
|
||||
### 3. Session.java → 2 файла
|
||||
```
|
||||
session/
|
||||
├── Session.java (120) - основная логика
|
||||
└── SessionMembers.java (120) - управление участниками
|
||||
```
|
||||
|
||||
### 4. ParkourUser.java → 2 файла
|
||||
```
|
||||
player/
|
||||
├── ParkourUser.java (120) - базовый user
|
||||
└── UserScoreboard.java (100) - scoreboard логика
|
||||
```
|
||||
|
||||
### 5. ParkourPlayer.java → 2 файла
|
||||
```
|
||||
player/
|
||||
├── ParkourPlayer.java (120) - gameplay
|
||||
└── PlayerSettings.java (80) - настройки
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Новые фичи (Фаза 3-6)
|
||||
|
||||
### Визуальные темы
|
||||
```java
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this; // ← этого нет
|
||||
super.onEnable(); // вызывает enable()
|
||||
public enum VisualTheme {
|
||||
NEON, // неоновые блоки + яркие партиклы
|
||||
NATURE, // трава, листья, цветы
|
||||
SPACE, // космос, звёзды
|
||||
UNDERWATER,// вода, кораллы
|
||||
HELL // нижний мир, лава
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] Добавить `instance = this` перед `super.onEnable()`
|
||||
- [ ] Пересобрать: `./gradlew shadowJar`
|
||||
- [ ] Проверить что сервер стартует без ошибок
|
||||
### Combo система
|
||||
- Множитель очков за последовательные прыжки (x2, x3... x10)
|
||||
- Визуальный индикатор combo
|
||||
- Combo break при падении
|
||||
- Бонусные очки за высокий combo
|
||||
|
||||
### Специальные прыжки
|
||||
- **Neo-jump** - 4 блока по диагонали (5% шанс)
|
||||
- **Head-hitter** - блок над головой (10% шанс)
|
||||
- **Ladder jump** - прыжок на лестницу (15% шанс)
|
||||
|
||||
### Replay система
|
||||
- Запись последнего прохождения
|
||||
- Просмотр replay с камерой
|
||||
- Экспорт/импорт replay файлов
|
||||
- Замедление/ускорение воспроизведения
|
||||
|
||||
---
|
||||
|
||||
## 🚧 ВЫСОКИЙ ПРИОРИТЕТ — Сломано
|
||||
## 📅 Временная шкала (6-7 недель)
|
||||
|
||||
### 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`
|
||||
- [ ] Протестировать генерацию в игре
|
||||
| Фаза | Задачи | Время |
|
||||
|------|--------|-------|
|
||||
| 0 | Критические баги | 1-2 дня |
|
||||
| 1 | Рефакторинг файлов | 1 неделя |
|
||||
| 2 | Исправление фич | 1 неделя |
|
||||
| 3 | Новые режимы | 2 недели |
|
||||
| 4 | Визуал (темы, combo) | 1 неделя |
|
||||
| 5 | Ghost система | 3 дня |
|
||||
| 6 | Replay система | 1 неделя |
|
||||
|
||||
---
|
||||
|
||||
## 🛠 РЕФАКТОРИНГ
|
||||
## 🎯 Критерии релиза 2.0.0
|
||||
|
||||
### 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()` — разбить на методы
|
||||
- ✅ Все файлы < 200 строк
|
||||
- ✅ 5+ режимов игры
|
||||
- ✅ Ghost система активна
|
||||
- ✅ Визуальные темы
|
||||
- ✅ Combo система
|
||||
- ✅ Replay система
|
||||
- ✅ Специальные прыжки
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue