LoParkour/docs/sd.md
loki 8aeb547897 v1.2.4: Remove roguelike perks, update bStats to 3.2.1, add new game modes and lpschem system
- Removed roguelike perk system (double jump, magnet, shield, second chance)
- Updated bStats dependency to 3.2.1 with proper relocation
- Changed bStats plugin ID to 29754
- Added new game modes: Speedrun, Gravity Shift, Hardcore
- Implemented .lpschem format with GZIP + JSON compression
- Added JumpValidator for physics-based jump validation
- Added JumpType system (neo-jump, head-hitter, fence, trapdoor, ladder)
- Implemented Ghost system for recording/playback top players
- Added loparkour-vilib as local dependency
- Updated config with new mode settings and removed roguelike section
- Cleaned up TODO.md roadmap
2026-02-25 00:55:24 +01:00

220 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Спецификация формата LoParkour Schematic (.lpschem)
## 1. Общее описание
**LoParkour Schematic** — это легковесный, расширяемый формат на базе JSON, предназначенный для хранения паркур-уровней в Minecraft. Формат оптимизирован для быстрой загрузки, сетевой передачи (для онлайн-редакторов) и поддержки современных визуальных элементов (Block Displays).
### Основные характеристики
- **Расширение:** `.lpschem`
- **Кодировка:** UTF-8
- **Сжатие:** GZIP (стандарт Java `GZIPOutputStream`)
- **Версия формата:** 2.0
---
## 2. Структура файла
### 2.1. Основные секции
```json
{
"format_version": 2,
"metadata": { ... },
"dimensions": { ... },
"palette": [ ... ],
"blocks": [ ... ],
"markers": { ... },
"visuals": { ... },
"logic": { ... }
}
```
### 2.2. Пример полного файла
```json
{
"format_version": 2,
"metadata": {
"name": "Neon City Rush",
"author": "Loki",
"difficulty": 0.65,
"tags": ["urban", "hard", "neon"]
},
"dimensions": {
"width": 10,
"height": 8,
"length": 10
},
"palette": [
"minecraft:air",
"minecraft:black_concrete",
"minecraft:cyan_stained_glass",
"minecraft:oak_stairs[facing=north,half=bottom]"
],
"blocks": [0, 1, 1, 2, 0, 3],
"markers": {
"start": {"x": 1, "y": 1, "z": 1},
"end": {"x": 9, "y": 7, "z": 9},
"checkpoints": [{"x": 5, "y": 4, "z": 5}]
},
"visuals": {
"displays": [
{
"type": "block",
"block": "minecraft:gold_block",
"pos": [5.5, 2.0, 5.5],
"scale": [0.8, 0.8, 0.8],
"animation": {"type": "rotate", "axis": "y", "speed": 1.5}
}
],
"particles": [
{"type": "end_rod", "pos": [5.0, 3.0, 5.0], "amount": 5, "spread": 0.2}
]
},
"logic": {
"ghost_path": [[1,1,1], [2,1,3], [4,2,5]]
}
}
```
---
## 3. Детальное описание полей
### 3.1. metadata (обязательное)
Метаданные схематики.
| Поле | Тип | Описание |
|------|-----|----------|
| `name` | string | Название уровня |
| `author` | string | Автор |
| `difficulty` | float | Сложность (0.0 - 1.0) |
| `tags` | string[] | Метки для поиска |
### 3.2. dimensions (обязательное)
Размеры уровня.
| Поле | Тип | Описание |
|------|-----|----------|
| `width` | int | Ширина по оси X |
| `height` | int | Высота по оси Y |
| `length` | int | Длина по оси Z |
### 3.3. palette (обязательное)
Уникальный список используемых блоков. Индекс `0` всегда зарезервирован за `minecraft:air`.
### 3.4. blocks (обязательное)
Одномерный массив индексов блоков. Размер: `width × height × length`.
Формула индекса:
`index = x + (z × width) + (y × width × length)`
### 3.5. markers (обязательное)
Ключевые точки уровня.
| Поле | Тип | Описание |
|------|-----|----------|
| `start` | object | Координаты старта |
| `end` | object | Координаты финиша |
| `checkpoints` | object[] | Массив чекпоинтов |
Каждая точка содержит поля `x`, `y`, `z`.
### 3.6. visuals (опциональное)
Визуальные эффекты.
#### 3.6.1. displays (BlockDisplay)
Сущности для декораций в воздухе.
| Поле | Тип | Описание |
|------|-----|----------|
| `type` | string | Тип дисплея (`block`) |
| `block` | string | Блок для отображения |
| `pos` | float[3] | Позиция (x, y, z) |
| `scale` | float[3] | Масштаб (x, y, z) |
| `animation` | object | Анимация (опционально) |
Анимация:
| Поле | Тип | Описание |
|------|-----|----------|
| `type` | string | Тип (`rotate`) |
| `axis` | string | Ось вращения (`x`, `y`, `z`) |
| `speed` | float | Скорость вращения |
#### 3.6.2. particles (опциональное)
Точки спавна частиц.
| Поле | Тип | Описание |
|------|-----|----------|
| `type` | string | Тип частиц |
| `pos` | float[3] | Позиция |
| `amount` | int | Количество частиц |
| `spread` | float | Рассеивание |
### 3.7. logic (опциональное)
Логические данные уровня.
| Поле | Тип | Описание |
|------|-----|----------|
| `ghost_path` | int[][] | Путь призрака (массив координат) |
---
## 4. Алгоритмы и оптимизация
### 4.1. Palette Encoding
Вместо хранения полных строк `BlockData` для каждого блока используется уникальный список в `palette`. В `blocks` хранятся только числовые индексы.
**Результат:** Сокращение размера файла в 5-10 раз для повторяющихся структур.
### 4.2. 1D Array Flattening
Одномерный массив обеспечивает быстрый доступ к блокам без вложенных объектов.
### 4.3. Sparse Storage
Индекс `0` всегда зарезервирован за `minecraft:air`. При загрузке блоки воздуха можно игнорировать, что ускоряет вставку.
---
## 5. Визуальные эффекты (Killer Features)
### 5.1. Block Displays
- Висят в воздухе (не по сетке блоков)
- Любого размера (scale)
- Плавное вращение/движение без модов
### 5.2. Частицы
Один асинхронный поток для обработки всех эффектов активных уровней.
---
## 6. Онлайн-редактор (Web Concept)
### Технологии
- **Frontend:** Three.js или React-Three-Fiber
- **Asset Loading:** Текстуры блоков из Minecraft Assets
- **Интерфейс:** Рисование блоков, расстановка чекпоинтов, предпросмотр анимаций
---
## 7. Техника безопасности
| Проблема | Решение |
|----------|---------|
| Несовместимость версий | Проверять `format_version`, уведомлять об обновлении |
| Missing Blocks | Заменять на `MAGENTA_GLAZED_TERRACOTTA` |
| Entity Leak | Хранить UUID дисплеев, удалять при выгрузке |
| Lag Spikes | Лимитировать `visuals` (макс. 50 дисплеев на уровень) |
---
## 8. План реализации (Roadmap)
1. [ ] Создать класс `LPSchematic` с поддержкой `GSON`
2. [ ] Написать `PaletteManager` для автоматической сборки уникальных блоков
3. [ ] Реализовать вставку блоков через `EditSession` или Bukkit API
4. [ ] Добавить поддержку `BlockDisplay` через пакеты (1.19.4+)
5. [ ] Написать конвертер из старого `.dat` / Java Serialization формата
---
*Документация подготовлена для проекта LoParkour. 2026 г.*