fix and migrate 70%
This commit is contained in:
parent
8705cad578
commit
d1dcf6ab57
138 changed files with 3736 additions and 4735 deletions
|
|
@ -1,74 +0,0 @@
|
|||
# Changelog - LoParkour
|
||||
|
||||
## Version 1.1.0 (Current)
|
||||
|
||||
### Added
|
||||
- **Jump Validation System**
|
||||
- Mathematical validation using Pythagorean theorem
|
||||
- Maximum jump distance: 4.5 blocks
|
||||
- Configurable safe ranges for X, Y, Z axes
|
||||
- `JumpValidator` class for precise jump checking
|
||||
|
||||
- **Jump Types System**
|
||||
- NEO_JUMP - jumps around fences/walls
|
||||
- HEAD_HITTER - jumps with blocks overhead
|
||||
- FENCE_JUMP - jumps onto fences
|
||||
- TRAPDOOR_JUMP - jumps onto trapdoors
|
||||
- LADDER_JUMP - jumps onto ladders
|
||||
- Each type has difficulty multiplier
|
||||
- Configurable in config.yml
|
||||
|
||||
- **Memory Optimization**
|
||||
- Changed history storage from ArrayList to LinkedList
|
||||
- Automatic block cleanup at 20+ blocks distance
|
||||
- Periodic cleanup task every 100 ticks
|
||||
- Configurable cleanup settings
|
||||
|
||||
- **New Game Modes**
|
||||
- Speedrun Mode - blocks disappear after 1.5 seconds
|
||||
- Gravity Shift Mode - random potion effects every 10 jumps
|
||||
- Hardcore Mode - full reset on fall with optional reward loss
|
||||
|
||||
- **Ghost Mode System**
|
||||
- Records top-3 player movements per mode
|
||||
- Compression (only movements > 0.1 blocks)
|
||||
- Playback using ArmorStand entities
|
||||
- Binary format for efficient storage
|
||||
- Configurable ghost settings
|
||||
|
||||
- **Roguelike Perk System**
|
||||
- Double Jump perk (1 use)
|
||||
- Magnet perk (10 jumps, 20% distance reduction)
|
||||
- Second Chance perk (1 use, teleport back 3 blocks)
|
||||
- Shield perk (5 jumps, fall protection)
|
||||
- Rarity system: Common (60%), Rare (30%), Epic (10%)
|
||||
- Bonus blocks every 20 jumps
|
||||
|
||||
- **New .lpschem Schematic Format**
|
||||
- JSON + GZIP compression
|
||||
- Palette encoding for optimization
|
||||
- BlockData support (not just Material)
|
||||
- Auto-detect LIME_WOOL (start) and RED_WOOL (end)
|
||||
- Support for BlockDisplay entities
|
||||
- Support for particle effects
|
||||
- Ghost path data storage
|
||||
- Converter from old vilib format
|
||||
- New commands: save, paste, list, reload, convert
|
||||
|
||||
### Changed
|
||||
- Migrated build system from Maven to Gradle
|
||||
- Package renamed to dev.loki.loparkour
|
||||
- Improved schematic command structure
|
||||
- Updated all mode registrations
|
||||
|
||||
### Technical
|
||||
- Java 17
|
||||
- Spigot API 1.20.4
|
||||
- Gradle 8.1.1
|
||||
- Added Gson dependency for JSON serialization
|
||||
|
||||
---
|
||||
|
||||
## Version 1.0.0 (Legacy)
|
||||
|
||||
Initial release with basic parkour functionality.
|
||||
|
|
@ -1,177 +0,0 @@
|
|||
# LPSchematic - Примеры использования
|
||||
|
||||
## Создание схематики из мира
|
||||
|
||||
```java
|
||||
// Выделить область в игре (WorldEdit style)
|
||||
Location pos1 = player.getLocation();
|
||||
Location pos2 = player.getLocation().add(10, 5, 10);
|
||||
|
||||
// Создать схематику
|
||||
LPSchematic schematic = new LPSchematicBuilder("easy-jump-1", "Loki", 0.25, 10, 5, 10)
|
||||
.fromWorld(world, pos1, pos2)
|
||||
.addTag("easy")
|
||||
.addTag("beginner")
|
||||
.build();
|
||||
|
||||
// Сохранить
|
||||
LPSchematicManager manager = new LPSchematicManager();
|
||||
manager.saveSchematic(schematic);
|
||||
```
|
||||
|
||||
## Создание схематики вручную
|
||||
|
||||
```java
|
||||
LPSchematic schematic = new LPSchematicBuilder("custom-jump", "Loki", 0.5, 5, 3, 5)
|
||||
.setBlock(0, 0, 0, Material.STONE)
|
||||
.setBlock(1, 0, 1, Material.STONE)
|
||||
.setBlock(2, 1, 2, Material.STONE)
|
||||
.setBlock(3, 0, 3, Material.STONE)
|
||||
.setBlock(4, 0, 4, Material.STONE)
|
||||
.setStart(0, 0, 0)
|
||||
.setEnd(4, 0, 4)
|
||||
.addTag("medium")
|
||||
.build();
|
||||
|
||||
manager.saveSchematic(schematic);
|
||||
```
|
||||
|
||||
## Загрузка и вставка
|
||||
|
||||
```java
|
||||
LPSchematicManager manager = new LPSchematicManager();
|
||||
manager.loadAll();
|
||||
|
||||
LPSchematic schematic = manager.getSchematic("easy-jump-1");
|
||||
if (schematic != null) {
|
||||
Location origin = player.getLocation();
|
||||
List<Block> blocks = schematic.paste(origin, world);
|
||||
|
||||
player.sendMessage("Pasted " + blocks.size() + " blocks");
|
||||
}
|
||||
```
|
||||
|
||||
## Добавление визуальных эффектов
|
||||
|
||||
```java
|
||||
LPSchematic schematic = manager.getSchematic("neon-city");
|
||||
|
||||
SchematicVisuals visuals = new SchematicVisuals();
|
||||
|
||||
// Добавить вращающийся золотой блок
|
||||
SchematicVisuals.BlockDisplay display = new SchematicVisuals.BlockDisplay(
|
||||
"minecraft:gold_block",
|
||||
new float[]{5.5f, 2.0f, 5.5f},
|
||||
new float[]{0.8f, 0.8f, 0.8f}
|
||||
);
|
||||
display.animation = new SchematicVisuals.Animation("rotate", "y", 1.5f);
|
||||
visuals.addDisplay(display);
|
||||
|
||||
// Добавить частицы
|
||||
SchematicVisuals.ParticleEffect particle = new SchematicVisuals.ParticleEffect(
|
||||
"end_rod",
|
||||
new float[]{5.0f, 3.0f, 5.0f},
|
||||
5,
|
||||
0.2f
|
||||
);
|
||||
visuals.addParticle(particle);
|
||||
|
||||
schematic.setVisuals(visuals);
|
||||
manager.saveSchematic(schematic);
|
||||
```
|
||||
|
||||
## Конвертация из старого формата
|
||||
|
||||
```java
|
||||
// TODO: Создать конвертер
|
||||
public class SchematicConverter {
|
||||
public static LPSchematic fromVilib(dev.efnilite.vilib.schematic.Schematic oldSchematic) {
|
||||
// Извлечь данные из старой схематики
|
||||
// Создать новую LPSchematic
|
||||
// Вернуть результат
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Команда для создания схематики
|
||||
|
||||
```java
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
|
||||
// /lpschem create <name> <difficulty>
|
||||
if (args[0].equals("create")) {
|
||||
String name = args[1];
|
||||
double difficulty = Double.parseDouble(args[2]);
|
||||
|
||||
// Получить выделенную область (из WorldEdit или своей системы)
|
||||
Location pos1 = getPos1(player);
|
||||
Location pos2 = getPos2(player);
|
||||
|
||||
int width = Math.abs(pos2.getBlockX() - pos1.getBlockX()) + 1;
|
||||
int height = Math.abs(pos2.getBlockY() - pos1.getBlockY()) + 1;
|
||||
int length = Math.abs(pos2.getBlockZ() - pos1.getBlockZ()) + 1;
|
||||
|
||||
LPSchematic schematic = new LPSchematicBuilder(name, player.getName(), difficulty, width, height, length)
|
||||
.fromWorld(player.getWorld(), pos1, pos2)
|
||||
.build();
|
||||
|
||||
try {
|
||||
manager.saveSchematic(schematic);
|
||||
player.sendMessage("§aSchematic saved: " + name);
|
||||
} catch (IOException e) {
|
||||
player.sendMessage("§cFailed to save schematic");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
```
|
||||
|
||||
## Формат файла (.lpschem)
|
||||
|
||||
Файл сжат GZIP и содержит JSON:
|
||||
|
||||
```json
|
||||
{
|
||||
"format_version": 2,
|
||||
"metadata": {
|
||||
"name": "easy-jump-1",
|
||||
"author": "Loki",
|
||||
"difficulty": 0.25,
|
||||
"tags": ["easy", "beginner"]
|
||||
},
|
||||
"dimensions": {
|
||||
"width": 5,
|
||||
"height": 3,
|
||||
"length": 5
|
||||
},
|
||||
"palette": [
|
||||
"minecraft:air",
|
||||
"minecraft:stone",
|
||||
"minecraft:oak_planks"
|
||||
],
|
||||
"blocks": [0, 1, 1, 2, 0, 1, ...],
|
||||
"markers": {
|
||||
"start": {"x": 0, "y": 0, "z": 0},
|
||||
"end": {"x": 4, "y": 0, "z": 4},
|
||||
"checkpoints": []
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Преимущества нового формата
|
||||
|
||||
1. **Человекочитаемый** - можно редактировать в текстовом редакторе
|
||||
2. **Компактный** - GZIP сжатие + palette encoding
|
||||
3. **Расширяемый** - легко добавить новые поля
|
||||
4. **Совместимый** - можно конвертировать в/из других форматов
|
||||
5. **Современный** - поддержка BlockDisplay и визуальных эффектов
|
||||
220
docs/sd.md
220
docs/sd.md
|
|
@ -1,220 +0,0 @@
|
|||
# Спецификация формата 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 г.*
|
||||
Loading…
Add table
Add a link
Reference in a new issue