Guides / Commands & Data

Пользовательская голова хранит URL, обёрнутый в base64 JSON, а не изображение

Компонент профиля содержит base64 от {textures:{SKIN:{url:…}}}. Вот почему внешний вид головы фиксируется в момент её создания, и почему база данных может содержать десятки тысяч записей.

Пользовательская Голова Игрока не содержит изображения. Она содержит хеш текстуры, обёрнутый в JSON, который, в свою очередь, обёрнут в base64 и находится внутри компонента профиля предмета.

Слои

Начиная с хеша, команда строится следующим образом:

1. hash        e3b0c44298fc1c149afbf4c8996fb924…
2. JSON        {"textures":{"SKIN":{"url":"http://textures.minecraft.net/texture/<hash>"}}}
3. base64      eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6…
4. component   /give @p player_head[profile={properties:[{name:"textures",value:"<base64>"}]}]

Четыре слоя, чтобы сказать: "эта голова выглядит как то изображение". Свойство всегда называется textures, а значение всегда является base64 этой JSON-структуры.

Отсюда следуют две вещи:

Голова — это снимок, а не ссылка на человека. URL указывает на неизменяемый файл текстуры, а не на учётную запись. То, во что этот хеш разрешился при создании головы, будет отображаться всегда.

Данные очень малы. Запись головы — это имя, хеш и несколько тегов — никаких байтов изображения вообще. Вот почему каталог может хранить десятки тысяч голов в виде простого статического JSON и при этом быстро загружаться.

Почему каталог загружается по категориям

База данных здесь — это коллекция голов CC0 от TheSilentPro, и она загружается по одной категории за раз, а не вся сразу. Индекс перечисляет категории и их количество; выбор одной загружает только этот файл.

Это не ленивая инженерия, это единственная форма, которая работает при таком размере. Вся коллекция в виде одного JSON была бы большой загрузкой для того, кто хотел бы три головы из одной категории.

Ограничение рендеринга в 300 элементов — это лимит DOM, а не лимит поиска

Результаты отображаются максимум по 300 за раз. Поиск по-прежнему выполняется по всему содержимому загруженной категории — ограничение применяется к тому, сколько элементов превращаются в узлы DOM, а не к тому, сколько элементов рассматривается.

Это различие важно, когда поиск говорит, что он показывает первые 300: отсутствующие записи были найдены и скрыты со страницы, а не исключены из запроса. Сужение поиска приводит их в диапазон, а не усиливает поиск.

Отображение десятков тысяч элементов одновременно — это то, что предотвращает ограничение, и это реальный лимит, а не защитное круглое число — такая большая сетка перестаёт быть прокручиваемой задолго до того, как перестаёт быть отображаемой.

Здесь ничего не загружается

Данные головы — это статический JSON того же происхождения. Единственный сторонний запрос — это предварительный просмотр <img> с mc-heads.net, который преобразует хеш в изображение для отображения. Команда /give собирается локально из хеша, поэтому команда работает независимо от того, загрузился ли предварительный просмотр.

База голов игроков →

More guides

Browse all →

Нужны другие инструменты для Minecraft?

Набор генераторов, просмотрщиков и конвертеров прямо в браузере — всё бесплатно.