Набор скинов Bedrock состоит из четырех файлов, и две его ошибки проявляются незаметно
Два UUID, которые должны отличаться, обязательный языковой файл и ключи скинов, которые игнорируют пунктуацию — так «Мой скин!» и «Мой скин?» становятся одним скином без ошибок.
.mcpack — это zip-архив с другим расширением, а набор скинов внутри него требует ровно четыре типа файлов:
manifest.json a header and a skin_pack module, each with its own UUID
skins.json one entry per skin: texture, geometry, and a KEY
texts/en_US.lang the display names — skins.json holds only keys
*.png the textures themselves
Три из четырех легко сделать правильно. Все интересные ошибки возникают из-за взаимосвязи между ними.
Два UUID должны отличаться
manifest.json содержит UUID в своем header и еще один в своем модуле skin_pack:
{
"format_version": 1,
"header": { "name": "…", "uuid": "…", "version": [1, 0, 0] },
"modules": [ { "type": "skin_pack", "uuid": "…", "version": [1, 0, 0] } ]
}
Это две отдельные сущности — сам пакет и то, что внутри пакета — и повторное использование одного значения для обоих является настоящей ошибкой, хотя при сборке ничего не сообщается.
Есть второе, более тонкое следствие: повторный импорт с теми же UUID рассматривается как тот же пакет, и Minecraft молча сохраняет уже имеющуюся копию. Редактирование пакета, его пересборка с теми же идентификаторами и повторный импорт выглядит так, будто ничего не произошло. Каждая сборка с этой страницы получает новые UUID именно по этой причине, поэтому для повторного импорта отредактированного пакета требуется новая загрузка, а не повторная архивация старого.
Языковой файл не является необязательным
skins.json никогда не содержит отображаемого имени. Он содержит ключ, а texts/en_US.lang сопоставляет этот ключ с текстом:
skinpack.<PackKey>=My Pack
skin.<PackKey>.<SkinKey>=My First Skin
Если отправить пакет без языкового файла, ошибок не будет — каждый скин просто появится в игре под своим исходным ключом. Это самая распространенная причина, по которой собранный вручную пакет выглядит сломанным, хотя при проверке все в порядке.
Ключи игнорируют пунктуацию, а дубликаты схлопываются
Ключ должен быть буквенно-цифровым. Все остальное удаляется:
| ваше имя | ключ |
|---|---|
My Skin! | MySkin |
My Skin? | MySkin |
Skin #2 | Skin2 |
!!! | Skin1 (запасной, по позиции) |
Первые две строки — это ловушка. Два скина, названные человеком по-разному, становятся одним ключом, и дубликат ключа не вызывает ошибки — он молча схлопывается в один скин в игре. Вы загружаете двенадцать скинов, получаете одиннадцать, и ничто не сообщает вам, какой из них пропал.
Здесь сборщик защищается от этого, добавляя счетчик к любому уже использованному ключу, так что второй MySkin становится MySkin1. Стоит знать, если вы собираете пакет вручную: проверка, которая вам нужна, проводится по очищенным именам, а не по тем, которые вы ввели.
Имя, состоящее полностью из пунктуации, не оставляет ничего, поэтому оно возвращается к Skin плюс его позиция в списке.
Для тонких скинов нужна правильная строка геометрии
Каждая запись называет модель, и их две:
geometry.humanoid.custom— классический, 4-пиксельные рукиgeometry.humanoid.customSlim— тонкий, 3-пиксельные руки
Ошибка здесь является обычной причиной того, что скин с пропорциями Алекс появляется с блочными руками Стива. Текстура в порядке; модель запрашивается именно та. Сборщик пакетов определяет это, анализируя четвертую колонку руки, но написанный вручную skins.json должен явно указать это, и две строки отличаются на четыре символа в конце.
Записи также содержат "type": "free", а плащ — это необязательный дополнительный PNG, на который ссылается та же запись — плащ перемещается внутри пакета скинов, а не как отдельная загрузка.