fix all migrate 80%
This commit is contained in:
parent
d1dcf6ab57
commit
574f9fc4b5
21 changed files with 1054 additions and 1154 deletions
266
TODO.md
266
TODO.md
|
|
@ -1,248 +1,70 @@
|
|||
# LoParkour — TODO & Roadmap
|
||||
# LoParkour — TODO
|
||||
|
||||
> **Принципы:** KISS · DRY · SOLID
|
||||
> **Версия:** 1.3.0 → 2.0.0
|
||||
> **Обновлено:** 2026-03-05
|
||||
|
||||
---
|
||||
|
||||
## 📊 Статус миграции vilib → LoLib 2.0
|
||||
|
||||
✅ **МИГРАЦИЯ ЗАВЕРШЕНА** (2026-03-01)
|
||||
- Файлов изменено: 120+
|
||||
- Строк кода: 3000+
|
||||
- Ошибок исправлено: 250+
|
||||
- Размер jar: 655 КБ
|
||||
- Все меню работают
|
||||
- Схематики работают
|
||||
|
||||
---
|
||||
> Обновлено: 2026-03-07
|
||||
|
||||
## Легенда
|
||||
- 🔴 **Критично** — баги/краши, нужно прямо сейчас
|
||||
- 🟡 **Важно** — неработающие фичи
|
||||
- 🟢 **Планово** — улучшения и новые фичи
|
||||
- ✅ **Готово**
|
||||
- 🔴 Критично — баг/краш/не компилируется
|
||||
- 🟡 Важно — фича заявлена но не работает
|
||||
- 🟢 Планово — улучшение
|
||||
- ✅ Готово
|
||||
|
||||
---
|
||||
|
||||
## 🔴 Критично
|
||||
|
||||
| # | Задача | Файл | Статус |
|
||||
|---|--------|------|--------|
|
||||
| 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` | ✅ |
|
||||
| # | Баг | Файл | Что сделать |
|
||||
|---|-----|------|-------------|
|
||||
| 1 | `PotionEffectType.JUMP` и `SLOW` удалены в Paper 1.20.5+ | `GravityShiftMode.java` | Заменить на `JUMP_BOOST` и `SLOWNESS` |
|
||||
| 2 | `ElytraMode` создаёт обычный `ParkourGenerator` → `getMode()` возвращает DEFAULT | `ElytraMode.java` | Создать `ElytraGenerator extends ParkourGenerator` |
|
||||
| 3 | `SpeedrunMode`: таймеры `runLater` продолжают тикать после `reset()` — гонка с генератором | `SpeedrunMode.java` | Хранить `ScheduledTask`, отменять в `reset()` |
|
||||
|
||||
---
|
||||
|
||||
## 🟡 Важно — неработающие фичи
|
||||
## 🟡 Важно — фичи есть в коде, но не работают
|
||||
|
||||
### Партиклы
|
||||
**Файл:** `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`
|
||||
| # | Фича | Файл | Что сделать |
|
||||
|---|------|------|-------------|
|
||||
| 4 | `HardcoreMode`: `collectedRewards` не очищается при падении | `HardcoreMode.java` | Добавить `player.collectedRewards.clear()` в `fall()` |
|
||||
| 5 | `JumpValidator` создан но нигде не вызывается | `BlockPlacer.java` | Добавить retry-loop в `selectNext()` (до 10 попыток) |
|
||||
| 6 | `JumpType` enum создан но не интегрирован в генератор | `BlockPlacer.java` | Добавить выбор JumpType по шансу из конфига |
|
||||
| 7 | `ConfigUpdater` закомментирован | `Config.java` | Раскомментировать, проверить `ignoredSections` |
|
||||
| 8 | `GravityShiftMode`: нет визуала при смене эффекта | `GravityShiftMode.java` | Добавить Title + Sound + партиклы `PORTAL` |
|
||||
|
||||
---
|
||||
|
||||
## 🟢 Планово — новые фичи
|
||||
## 🟢 Планово
|
||||
|
||||
### 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`
|
||||
| # | Фича | Файл | Что сделать |
|
||||
|---|------|------|-------------|
|
||||
| 9 | Ghost система не интегрирована | `ghost/` | Подключить `GhostRecorder` к `GeneratorLifecycle` |
|
||||
| 10 | Удалить мёртвые stub-файлы | `generator/`, корень | `Command.java`, `Events.java`, `BlockSelector.java`, `ScoreManager.java`, `GeneratorTick.java` |
|
||||
| 11 | ElytraMode: кольца из партиклов + детекция пролёта | `ElytraMode.java` | BoundingBox check в `tick()` |
|
||||
| 12 | ElytraMode: cooldown на фейерверки | `ElytraMode.java` | Счётчик + сообщение |
|
||||
| 13 | RaceMode | новый файл | Кто первый наберёт N очков |
|
||||
| 14 | CoopMode | новый файл | Общий счёт нескольких игроков |
|
||||
|
||||
---
|
||||
|
||||
## ✅ Архитектурный рефакторинг — завершён
|
||||
## ✅ Уже готово (архитектура)
|
||||
|
||||
| Что сделано | Результат |
|
||||
|-------------|-----------|
|
||||
| `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` |
|
||||
- Все критические баги из предыдущих сессий исправлены (UUID, SQL race, PreparedStatement, Leaderboard, Scoreboard, World NPE)
|
||||
- `ParkourGenerator` разбит: `GeneratorState` + `GeneratorLifecycle` + `BlockPlacer` + `EffectManager`
|
||||
- `Option` делегирует в `SqlOptions` / `ParticleOptions` / `GenerationOptions`
|
||||
- `Option.SQL_URL/PORT/DB/USERNAME/PASSWORD/PREFIX` — forwarding-поля добавлены
|
||||
- `GenerationOptions` — все новые пути защищены `isPath()` проверками
|
||||
- `LoParkourCommand` разбит на `PlayerCommandHandler` + `AdminCommandHandler` + `SchematicCommandHandler`
|
||||
- `Events` разбит на 3 listener'а
|
||||
- `StorageSQL` разбит на `SQLConnectionManager` + `SQLQueryExecutor` + `SQLMigrationManager`
|
||||
|
||||
---
|
||||
|
||||
## 🎮 Чек-лист перед релизом
|
||||
|
||||
- [ ] `./gradlew build` без ошибок и предупреждений
|
||||
- [ ] `./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
|
||||
public enum VisualTheme {
|
||||
NEON, // неоновые блоки + яркие партиклы
|
||||
NATURE, // трава, листья, цветы
|
||||
SPACE, // космос, звёзды
|
||||
UNDERWATER,// вода, кораллы
|
||||
HELL // нижний мир, лава
|
||||
}
|
||||
```
|
||||
|
||||
### Combo система
|
||||
- Множитель очков за последовательные прыжки (x2, x3... x10)
|
||||
- Визуальный индикатор combo
|
||||
- Combo break при падении
|
||||
- Бонусные очки за высокий combo
|
||||
|
||||
### Специальные прыжки
|
||||
- **Neo-jump** - 4 блока по диагонали (5% шанс)
|
||||
- **Head-hitter** - блок над головой (10% шанс)
|
||||
- **Ladder jump** - прыжок на лестницу (15% шанс)
|
||||
|
||||
### Replay система
|
||||
- Запись последнего прохождения
|
||||
- Просмотр replay с камерой
|
||||
- Экспорт/импорт replay файлов
|
||||
- Замедление/ускорение воспроизведения
|
||||
|
||||
---
|
||||
|
||||
## 📅 Временная шкала (6-7 недель)
|
||||
|
||||
| Фаза | Задачи | Время |
|
||||
|------|--------|-------|
|
||||
| 0 | Критические баги | 1-2 дня |
|
||||
| 1 | Рефакторинг файлов | 1 неделя |
|
||||
| 2 | Исправление фич | 1 неделя |
|
||||
| 3 | Новые режимы | 2 недели |
|
||||
| 4 | Визуал (темы, combo) | 1 неделя |
|
||||
| 5 | Ghost система | 3 дня |
|
||||
| 6 | Replay система | 1 неделя |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Критерии релиза 2.0.0
|
||||
|
||||
- ✅ Все файлы < 200 строк
|
||||
- ✅ 5+ режимов игры
|
||||
- ✅ Ghost система активна
|
||||
- ✅ Визуальные темы
|
||||
- ✅ Combo система
|
||||
- ✅ Replay система
|
||||
- ✅ Специальные прыжки
|
||||
- [ ] Паркур: прыжки, счёт, рекорд работают
|
||||
- [ ] Scoreboard обновляется
|
||||
- [ ] Все меню открываются
|
||||
- [ ] SQL: данные сохраняются и читаются
|
||||
- [ ] Партиклы и звук в каждом режиме
|
||||
- [ ] Все 5 режимов запускаются без ошибок
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue