new version 1.3.3

This commit is contained in:
loki 2026-03-10 12:39:21 +01:00
parent 2d5c5eea48
commit d9eb747c1b
37 changed files with 1021 additions and 471 deletions

203
TODO.md
View file

@ -10,31 +10,67 @@
---
## 🔴 Критично
## 🔴 Критично — из code review
| # | Баг | Файл | Что сделать |
|---|-----|------|-------------|
| ✅ | ~~BOM в `ParkourGenerator.java` ломает компиляцию~~ | `ParkourGenerator.java` | ✅ Удалён через Python |
| ✅ | ~~`generator.score` → `generator.state.score`~~ | `PAPIHook.java`, `ParkourSettingsMenu.java` | ✅ Исправлено |
| ✅ | ~~`ParkourUser.joinCount` удалён~~ | `LoParkour.java` | ✅ Использован `UserRegistry.getJoinCount()` |
| ✅ | ~~`PlayerSettingsManager.OptionContainer` не public~~ | `PlayerSettingsManager.java` | ✅ Сделан public |
| ✅ | ~~`Option.PARTICLE_DATA.data()` не существует~~ | `EffectManager.java` | ✅ Убран `.data()` |
| ✅ | ~~`ParticleUtil.circle()` неправильные параметры~~ | `EffectManager.java` | ✅ Исправлено на (Location, Particle, int, int) |
| ✅ | ~~`PotionEffectType.JUMP` и `SLOW` удалены в Paper 1.20.5+~~ | `GravityShiftMode.java` | ✅ Оставлены старые названия для 1.20.4 (JUMP, SLOW) |
| ✅ | ~~`ElytraMode` создаёт обычный `ParkourGenerator`~~ | `ElytraMode.java` | ✅ Создан `ElytraGenerator extends ParkourGenerator` |
| ✅ | ~~`SpeedrunMode`: таймеры `runLater` продолжают тикать после `reset()`~~ | `SpeedrunMode.java` | ✅ Хранятся `ScheduledTask`, отменяются в `reset()` |
| 1 | ~~Ghost файлы по имени игрока~~ | `GhostManager.java`, `GhostData.java` | ✅ Используется UUID вместо имени |
| 2 | ~~`GhostRecorder.stopRecording()` не передаёт UUID~~ | `GhostRecorder.java`, `GeneratorLifecycle.java` | ✅ Добавлен параметр UUID |
| 3 | ~~`new Random()` в горячих методах~~ | `BlockPlacer.java` | ✅ Заменено на `ThreadLocalRandom.current()` |
| 4 | ~~`ConcurrentModificationException` в `reset()`~~ | `ParkourGenerator.java` | ✅ Синхронизация через копирование списка |
| 5 | ~~Сохраняется только DEFAULT лидерборд~~ | `LoParkour.java` disable() | ✅ Сохраняются все режимы (Speedrun, Race, Coop, Elytra) |
| 6 | ~~`cleanupDistantBlocks()` вызывается дважды~~ | `GeneratorLifecycle.java` | ✅ Убран дублирующий вызов |
| 7 | ~~`System.err.println` в JumpOffsetGenerator~~ | `JumpOffsetGenerator.java` | ✅ Используется Logger |
| 8 | ~~`disable()` глотает все исключения~~ | `LoParkour.java` | ✅ Логируются ошибки |
| 9 | ~~Первый блок может быть специальным~~ | `BlockPlacer.java` | ✅ Всегда полный блок из конфига |
---
## 🟡 Важно — фичи есть в коде, но не работают
## 🟡 Важно — улучшения безопасности
| # | Фича | Файл | Что сделать |
|---|------|------|-------------|
| ✅ | ~~`HardcoreMode`: `collectedRewards` не очищается при падении~~ | `HardcoreMode.java` | ✅ Добавлен `player.collectedRewards.clear()` в `fall()` |
| ✅ | ~~`JumpValidator` создан но нигде не вызывается~~ | `BlockPlacer.java` | ✅ Добавлен retry-loop в `selectNext()` (до 10 попыток) |
| ✅ | ~~`JumpType` enum создан но не интегрирован в генератор~~ | `BlockPlacer.java` | ✅ Добавлен выбор JumpType по шансу (70% normal, 30% special) |
| 7 | ~~`ConfigUpdater` закомментирован~~ | `Config.java` | ✅ Написан `ConfigUpdater.java`, подключён в `Config.update()` |
| ✅ | ~~`GravityShiftMode`: нет визуала при смене эффекта~~ | `GravityShiftMode.java` | ✅ Добавлены Title + Sound + партиклы `PORTAL` |
| # | Проблема | Файл | Что сделать |
|---|----------|------|-------------|
| 9 | ~~Отсутствует rate limiting~~ | `PlayerCommandHandler.java` | ✅ Cooldown уже реализован (2.5 сек на join/leave) |
| 10 | ~~Нет валидации конфигурации~~ | `Config.java` | ✅ Добавлена валидация критичных значений |
| 11 | ~~`loadIslandSchematic()` возвращает null~~ | `ParkourGenerator.java` | ✅ Fallback на дефолтный схематик "island" |
| 12 | ~~Hardcoded строки вместо локализации~~ | `MainMenu.java`, `CoopMode.java`, `RaceMode.java`, `ElytraMode.java` | ✅ Используется `Locales.getString()` |
---
## 🟢 Планово — оптимизация
| # | Улучшение | Файл | Что сделать |
|---|-----------|------|-------------|
| 13 | ~~`getPlayers()` создаёт новый список каждый раз~~ | `ParkourPlayer.java` | ✅ Оптимизирован `getPlayer()` без создания списка |
| 14 | ~~Магические числа~~ | `BlockPlacer.java`, `GeneratorLifecycle.java` | ✅ Вынесены в константы (MAX_RETRIES, FALL_DISTANCE, etc) |
| 15 | ~~`selectJumpType()` хардкод шансов~~ | `BlockPlacer.java` | ✅ Вынесено в generation.yml |
| 16 | ~~SQL Injection в writeScores/writePlayer~~ | `StorageSQL.java` | ✅ Переписано на PreparedStatement с параметрами |
---
## 🎉 Итоги рефакторинга
### Исправлено критичных багов: 8/8 ✅
- Ghost UUID параметр
- ThreadLocalRandom вместо new Random()
- ConcurrentModificationException
- Сохранение всех лидербордов
- Двойной вызов cleanup
- System.err → Logger
- Логирование ошибок в disable()
- **SQL Injection полностью устранён**
### Улучшения безопасности: 4/4 ✅
- Rate limiting (уже был)
- Валидация конфигурации
- Fallback для схематиков
- Локализация всех строк
### Оптимизация: 4/4 ✅
- Оптимизация getPlayer()
- Константы вместо магических чисел
- Конфигурируемые шансы jump types
- PreparedStatement для SQL
---
@ -54,75 +90,88 @@
---
## 🟢 Планово
## ✅ Уже исправлено
| # | Фича | Файл | Что сделать |
|---|------|------|-------------|
| ✅ | ~~Ghost система не интегрирована~~ | `ghost/` | ✅ Подключен `GhostRecorder` к `GeneratorLifecycle` |
| ✅ | ~~Удалить мёртвые stub-файлы~~ | `generator/`, корень | ✅ Удалены: `Command.java`, `Events.java`, `BlockSelector.java`, `ScoreManager.java`, `GeneratorTick.java` |
| ✅ | ~~ElytraMode: кольца из партиклов + детекция пролёта~~ | `ElytraMode.java` | ✅ BoundingBox check в `tick()`, +2 очка за пролёт |
| ✅ | ~~ElytraMode: cooldown на фейерверки~~ | `ElytraMode.java` | ✅ Счётчик + ActionBar сообщение |
| ✅ | ~~RaceMode~~ | `RaceMode.java` | ✅ Кто первый наберёт N очков, time-based leaderboard |
| ✅ | ~~CoopMode~~ | `CoopMode.java` | ✅ Общий счёт нескольких игроков, трекинг вклада |
| ✅ | ~~Реорганизация `generator/` по подпакетам~~ | `generator/` | ✅ Создана структура: `jump/`, `lifecycle/`, `effect/` |
---
## 🏗️ ✅ Реорганизация generator/ — ГОТОВО
Новая структура по логическим группам:
```
generator/
├── ParkourGenerator.java ← главный класс (183 строки)
├── GeneratorState.java ← данные генератора
├── GeneratorOption.java ← enum опций
├── Profile.java ← профиль настроек
├── Island.java ← остров спавна
│
├── jump/ ← всё про прыжки и размещение блоков
│ ├── BlockPlacer.java (166 строк)
│ ├── JumpDirector.java
│ ├── JumpOffsetGenerator.java
│ ├── JumpValidator.java
│ └── JumpType.java
│
├── lifecycle/ ← жизненный цикл: тик, падение, очистка
│ └── GeneratorLifecycle.java
│
└── effect/ ← визуальные эффекты
└── EffectManager.java
```
**Результат:**
- ✅ Все файлы перемещены через `smartRelocate` (импорты обновлены автоматически)
- ✅ Удалены мёртвые stub-файлы
- ✅ Проект компилируется без ошибок
- ✅ Структура стала логичнее и понятнее
---
## ✅ Уже готово (архитектура)
- Все критические баги из предыдущих сессий исправлены (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`
- ✅ **Проект компилируется без ошибок** (исправлены все баги после рефакторинга)
- ✅ BOM в `ParkourGenerator.java` ломает компиляцию
- ✅ `generator.score` → `generator.state.score`
- ✅ `ParkourUser.joinCount` удалён
- ✅ `PlayerSettingsManager.OptionContainer` не public
- ✅ `Option.PARTICLE_DATA.data()` не существует
- ✅ `ParticleUtil.circle()` неправильные параметры
- ✅ `PotionEffectType.JUMP` и `SLOW` удалены в Paper 1.20.5+
- ✅ `ElytraMode` создаёт обычный `ParkourGenerator`
- ✅ `SpeedrunMode`: таймеры `runLater` продолжают тикать после `reset()`
- ✅ `HardcoreMode`: `collectedRewards` не очищается при падении
- ✅ `JumpValidator` создан но нигде не вызывается
- ✅ `JumpType` enum создан но не интегрирован в генератор
- ✅ `ConfigUpdater` закомментирован
- ✅ `GravityShiftMode`: нет визуала при смене эффекта
- ✅ Ghost система не интегрирована
- ✅ Удалить мёртвые stub-файлы
- ✅ ElytraMode: кольца из партиклов + детекция пролёта
- ✅ ElytraMode: cooldown на фейерверки
- ✅ RaceMode
- ✅ CoopMode
- ✅ Реорганизация `generator/` по подпакетам
- ✅ SQL Injection исправлен (PreparedStatement)
- ✅ PreparedStatement leak исправлен (try-with-resources)
- ✅ Scheduler Task Leak в SpeedrunMode исправлен
- ✅ Удалены GravityShiftMode и HardcoreMode (запутанные режимы)
- ✅ Предметы в хотбаре вместо инвентаря
- ✅ Схематики отключены из генерации
- ✅ Сложность генерации сбалансирована
- ✅ Ограничения после специальных блоков (слэбы, заборы, панели)
- ✅ Clamp значений height/distance для безопасности
- ✅ Fallback в JumpOffsetGenerator
- ✅ Локали для race и coop режимов
- ✅ Конфиг для race и coop режимов
- ✅ Fallback для first-block-material в Island.java
- ✅ Ghost файлы по UUID вместо имени (частично - нужно обновить вызовы)
---
## 🎮 Чек-лист перед релизом
- [x] `./gradlew build` без ошибок
- [x] Все критичные баги исправлены (пункты 1-8)
- [x] Все улучшения безопасности (пункты 9-12)
- [x] Все оптимизации (пункты 13-16)
- [x] SQL Injection полностью устранён
- [x] Версия обновлена до 1.3.1
- [x] CHANGELOG.md создан
- [x] README.md обновлён
- [x] RELEASE_NOTES.md создан
- [x] Юнит-тесты добавлены (JumpValidator, GhostData)
- [x] Баги найденные тестами исправлены
- [x] Все тесты проходят успешно
- [ ] Запуск сервера без ошибок в консоли
- [ ] Паркур: прыжки, счёт, рекорд работают
- [ ] Scoreboard обновляется
- [ ] Все меню открываются
- [ ] SQL: данные сохраняются и читаются
- [ ] Партиклы и звук в каждом режиме
- [ ] Все 5 режимов запускаются без ошибок
- [ ] Все режимы запускаются без ошибок (Default, Speedrun, Elytra, Race, Coop)
- [ ] Ghost система работает (запись и воспроизведение)
- [ ] Нет невозможных прыжков после специальных блоков
- [ ] Предметы в хотбаре (слоты 1,3,4,5,7)
---
## 📊 Оценка из code review
**Общая оценка: 7.5/10**
**Сильные стороны:**
- Отличная структура пакетов
- Есть API для разработчиков
- Хорошая модульность (режимы, генератор, хранилище)
- Много систем (leaderboard, ghost, generator, schematics, menus, rewards)
**Что нужно исправить:**
- Критичные баги из таблицы выше
- Безопасность (rate limiting, валидация)
- Оптимизация (кеширование, константы)
**Потенциал:**
Проект уровня реального Spigot ресурса (15-25k строк кода). При исправлении критичных багов можно выпускать в production.