- 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
7.7 KiB
Спецификация формата LoParkour Schematic (.lpschem)
1. Общее описание
LoParkour Schematic — это легковесный, расширяемый формат на базе JSON, предназначенный для хранения паркур-уровней в Minecraft. Формат оптимизирован для быстрой загрузки, сетевой передачи (для онлайн-редакторов) и поддержки современных визуальных элементов (Block Displays).
Основные характеристики
- Расширение:
.lpschem - Кодировка: UTF-8
- Сжатие: GZIP (стандарт Java
GZIPOutputStream) - Версия формата: 2.0
2. Структура файла
2.1. Основные секции
{
"format_version": 2,
"metadata": { ... },
"dimensions": { ... },
"palette": [ ... ],
"blocks": [ ... ],
"markers": { ... },
"visuals": { ... },
"logic": { ... }
}
2.2. Пример полного файла
{
"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)
- Создать класс
LPSchematicс поддержкойGSON - Написать
PaletteManagerдля автоматической сборки уникальных блоков - Реализовать вставку блоков через
EditSessionили Bukkit API - Добавить поддержку
BlockDisplayчерез пакеты (1.19.4+) - Написать конвертер из старого
.dat/ Java Serialization формата
Документация подготовлена для проекта LoParkour. 2026 г.