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

7.7 KiB
Raw Blame History

Спецификация формата 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)

  1. Создать класс LPSchematic с поддержкой GSON
  2. Написать PaletteManager для автоматической сборки уникальных блоков
  3. Реализовать вставку блоков через EditSession или Bukkit API
  4. Добавить поддержку BlockDisplay через пакеты (1.19.4+)
  5. Написать конвертер из старого .dat / Java Serialization формата

Документация подготовлена для проекта LoParkour. 2026 г.