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