Головы игроков по нику: как работает компонент профиля и почему головы становятся пустыми
Голова хранит снимок скина, а не живую ссылку. Здесь объясняется, как работает компонент профиля, почему старая голова показывает неправильный скин и как в этом задействован поиск по UUID.
Выдача Головы игрока, казалось бы, должна требовать всего один аргумент. Так и есть, но то, что сохраняется, отличается от ожиданий, и это объясняет большинство странностей, связанных с головами.
Команда
/give @p player_head[profile="Notch"]
Компонент profile заменил старый NBT SkullOwner. Фрагменты, использующие {SkullOwner:"Notch"}, относятся к версии до 1.20.5 и теперь не работают.
Что на самом деле сохраняется
Голова не хранит никнейм и не загружает скин позже. При создании головы сервер преобразует имя в UUID и снимок текстуры, а затем "запекает" это в предмет:
"profile": {
"name": "Notch",
"id": [I; …],
"properties": [{ "name": "textures", "value": "<base64>" }]
}
Два следствия:
- Голова, сделанная год назад, показывает скин того года. Смена скина Игроком не обновляет головы, уже находящиеся в мире. Это не баг, и обновления не происходит.
- Головы работают в офлайн-режиме. После "запекания" для их отображения не требуется вызов Mojang API, поэтому головы сохраняются на серверах в офлайн-режиме, в то время как
/give ... profile="Name"там не разрешается.
Почему голова пустая или показывает Стива
В порядке вероятности:
- Имя не было разрешено. Сервер в офлайн-режиме, или API был недоступен во время выполнения команды. Нечего "запекать", поэтому вы получаете стандартную голову.
- Имя не существует. Mojang ничего не возвращает для удаленных или никогда не зарегистрированных аккаунтов.
- Чанк не перезагружен. Голова разрешается асинхронно; иногда нужно отвернуться и снова посмотреть.
Ожидание редко помогает — если профиль не был "запечен" при создании, он остается пустым. Выдайте голову заново.
Пользовательские головы используют текстуру, а не имя
Декоративные головы — мебель, еда, головы мобов из каталогов — не имеют владельца. Они содержат только значение текстуры properties с base64-блобом, указывающим на URL текстуры. Именно поэтому их можно делиться одной длинной командой выдачи, и они никогда не ломаются, когда Игрок меняет имя.
Base64 декодируется в небольшой JSON, содержащий textures.SKIN.url на textures.minecraft.net. Ничто другое в нем не имеет значения для рендеринга.
Форматы UUID
Существуют две формы, и они не взаимозаменяемы во всех контекстах:
trimmed 069a79f444e94726a5befca90e38aaf5
dashed 069a79f4-44e9-4726-a5be-fca90e38aaf5
Команды и NBT обычно требуют форму с дефисами или целочисленный массив. Веб-API обычно возвращают усеченную форму. Преобразование между ними механическое — вставьте дефисы после 8, 12, 16 и 20 символов.
Выдайте голову по нику, просмотрите каталоги декоративных голов или преобразуйте форматы UUID в Инструментах для Голов Игроков и Никнеймов.