Guides / Commands & Data

カスタムヘッドは画像ではなく、base64 JSONでラップされたURLを保存する

プロファイルコンポーネントには{textures:{SKIN:{url:…}}}のbase64が格納されています。そのため、ヘッドの見た目は作成時に固定され、データベースには何万ものエントリが存在し得ます。

カスタムプレイヤーの頭は画像を含んでいません。アイテムのプロファイルコンポーネント内に、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>"}]}]

「このヘッドはあの画像のように見える」と言うために4つのレイヤーがあります。プロパティは常にtexturesと名付けられ、値は常にそのJSON形式のbase64です。

そこから直接2つのことが導き出されます。

ヘッドはスナップショットであり、人物へのリンクではありません。 URLはアカウントではなく、不変のテクスチャファイルを指しています。ヘッドが作成されたときにそのハッシュが解決したものが、常に表示されます。

データはごくわずかです。 ヘッドのエントリは、名前、ハッシュ、いくつかのタグであり、画像バイトは一切含まれていません。そのため、カタログは何万ものヘッドを単なる静的なJSONとして保持し、それでも素早く読み込むことができます。

カタログがカテゴリごとに読み込まれる理由

ここでのデータベースはTheSilentProのCC0ヘッドコレクションであり、一度にすべてではなく、一度に1つのカテゴリずつフェッチされます。インデックスにはカテゴリとその数がリストされており、1つを選択するとそのファイルのみがフェッチされます。

これは手抜きなエンジニアリングではなく、このサイズで機能する唯一の形式です。コレクション全体を単一のJSONとしてダウンロードすると、1つのカテゴリから3つのヘッドを欲しがっている人にとっては大きなダウンロードになってしまいます。

300アイテムのレンダリング上限はDOMの制限であり、検索の制限ではない

結果は一度に最大300個まで描画されます。検索は読み込まれたカテゴリ内のすべてに対して実行されます。上限は、いくつのアイテムがDOMノードに変換されるかに適用され、いくつのアイテムが考慮されるかには適用されません。

この区別は、検索が最初の300件を表示していると表示される場合に重要です。不足しているエントリは発見されており、ページから保留されているのであって、クエリから除外されているわけではありません。検索を絞り込むことで、より厳密に検索するのではなく、それらが範囲内に入ってきます。

何万もの要素を一度に描画することを防ぐために上限が存在し、それは防御的な丸い数字ではなく、実際の制限です。そのように大きなグリッドは、レンダリングできなくなるずっと前にスクロールできなくなります。

ここでは何もアップロードされない

ヘッドデータは同一オリジンの静的JSONです。唯一のサードパーティリクエストは、mc-heads.netからの<img>プレビューであり、ハッシュを表示用の画像に解決します。/giveコマンドはハッシュからローカルで組み立てられるため、そのプレビューが読み込まれたかどうかにかかわらずコマンドは機能します。

プレイヤーヘッドデータベース →

More guides

Browse all →

ほかのマインクラフトツールをお探しですか?

ブラウザだけで動くジェネレーター・ビューア・変換ツールの数々。すべて無料です。