VoxelEngine/doc/ru/content-packs.md
2025-11-09 21:24:21 +03:00

130 lines
7.9 KiB
Markdown
Raw Permalink 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.

# Контент-паки
Для создания контент-пака сначала нужно придумать ему название (id) соответствующее следующим требованиям:
- название может состоять только из букв латиницы, цифр и символа подчёркивания '\_'
- название не может начинаться с цифры
- длина названия должна находиться в пределах от 2 до 24 включительно
Далее в *res/content* создаётся папка с выбранным названием контент-пака.
В созданной папке создаётся файл **package.json** с следующим содержимым:
```json
{
"id": "выбранное_имя_пака",
"title": "имя контент-пака для отображения в меню контента",
"version": "версия контент-пака в формате major.minor",
"creator": "создатель контент-пака",
"description": "краткое описание",
"dependencies": [
"зависимости",
"пакета"
]
}
```
Вместо `creator` можно указать массив `creators`
Уровни зависимостей указываются с помощью префиксов в имени:
- '!' - обязательная зависимость
- '?' - опциональная зависимость
- '~' - слабая зависимость
Отсутствие префикса интерпретируется как '!'.
Пример: '~randutil' - слабая зависимость 'randutil'.
Версии зависимостей указываются после '@' и имеют операторы для ограничения допустимых версий.
Отсутствие версии зависимости интерпретируется как '\*', т.е. любая версия.
Пример: 'randutil@>=1.0' - зависимость 'randutil' версии 1.0 и старше.
Пример:
```json
{
"id": "doors",
"title": "DOORS",
"creator": "MihailRis",
"version": "1.0",
"description": "doors test"
}
```
Изображение контент-пака добавляется в виде файла *icon.png* в папку пака (не в textures). Рекомендованный размер изображения: 128x128
# Файловая система
Каждый загруженный пак монтируется к внутренней файловой системе как новая точка входа, имя которой совпадает с id пака.
Это значит, что для доступа к файлам пака не требуется использование дополнительных функций:
```lua
print(file.read("пак:package.json")) -- выведет содержимое package.json пака
```
Также это является одной из причин того, что некоторые id зарезервированы от использования.
Точки входа монтируются как read-only. Для получения доступа к записи существует функция pack.request_writeable.
Подробнее про библиотеку [file](scripting/builtins/libfile.md).
# Структура контент-пака
Пусть вас не пугает следующий текст, ведь минимальный пак содержит только package.json.
- Контент:
- `block_materials/` - определения материалов блоков
- `blocks/` - определения блоков
- `items/` - определения предметов
- `generators/` - генераторы мира
- `entities/` - определения сущностей
- `skeletons/` - определения скелетов сущностей
- `presets/` - пресеты (может использоваться и паками в своих целях)
- `text3d/` - 3D текст
- `weather/` - погода
- Код:
- `modules/` - скриптовые модули
- `scripts/` - скрипты контента, мира
- `components/` - компоненты сущностей
- Ассеты (ресурсы клиентской стороны):
- `fonts/` - шрифты
- `models/` - 3D модели
- `textures/` - текстуры
- `shaders/` - шейдеры
- `effects/` - эффекты пост-обработки
- `sounds/` - звуки и музыка
- `texts/` - файлы локализации
- GUI:
- `layouts/` - макеты UI
- `pages/` - макеты страниц меню (элемент pagebox)
- Конфигурация:
- `config/` - файлы конфигурации
- `defaults.toml` - переопределения стандартных привязок к контенту, такие как сущность игрока, генератор по-умолчанию и т.д.
- `bindings.toml` - привязки к клавишам / мыши
- `user-props.toml` - пользовательские свойства определений контента
- `devtools/` - вспомогательные файлы внутренних инструментов отладки
- `content.json` - генерируемые автоматически списки контента, используемое для проверки корректности индексов в мире и конвертации при несовпадении
- `icon.png` - иконка пака
- `package.json` - файл опеределения пака
- `preload.json` - списки предзагрузки ассетов, которые не загружаются автоматически, не следует указывать ассеты без надобности
- `resources.json` - списки определений [ресурсов](resources.md) (не путать с ассетами)
- `resource-aliases.json` - файлы объявления псевдонимов для [ресурсов](resources.md)
> [!WARNING]
> Ручное редактирование `content.json` противопоказано и скорее всего приведёт к необратимой поломке миров.
# Источники контента
Поиск контент-паков производится среди **источников контента**, являющихся путями в файловой системе движка.
Приоритет источника определяет порядок сканирования: если один и тот же пак найден в нескольких источниках,
будет выбран тот, что принадлежит источнику с наивысшим приоритетом.
Источники контента в порядке убывания приоритета:
- `world:content` - контент папке с миром (`мир/content/`)
- `user:content` - контент в папке пользователя (`$HOME/.voxeng/content/`)
- `project:content` - контент в папке с проектом (`проект/content/`)
- `res:content` - встроенный контент, поставляемый вместе с ядром движка (`res/content/`)
Т.е. если в `world:content` и в `user:content` есть один и тот же пак, будет выбрана версия из `world:content`.
Версия пака, при этом, на данный момент, не учитывается.