Minecraftのユーザー名は「ちょうど3種類の文字」で1~16文字、UUIDには2通りの書き方がある
英字、数字、アンダースコア。ハイフンもドットもスペースもなし。そしてUUIDはダッシュあり・なしのどちらでも受け付けられる——だから同じものを調べても片方は失敗し、片方は成功する。UUIDは32桁の16進数で、ハイフン込みで36文字です。
スキンを検索するというのは、誰かが入力した文字列をMojangが認識できるものに変換する作業だ。そしてそれは2種類しかない。どちらにも厳密なルールがあり、UUIDのほうには「見つかりません」という報告を大量に生む落とし穴がある。
ユーザー名のルール
^[A-Za-z0-9_]{1,16}$
文字種は3つだけで、それ以外はない。英字、数字、アンダースコア。長さは1~16。
除外されるもののほうが役に立つ:
- ハイフンは使えない — 最もよく試される文字
- ドットもスペースも
@も使えない - 16文字を超えるものは不可、空文字も不可
つまり、サーバーの表示名やDiscordのハンドル、メールアドレスは、名前のように見えても解決できない。検索が失敗し、そのテキストにハイフンが含まれているなら、ほぼ間違いなくそれが原因だ。そしてハイフンこそが、人をもう一方の形式へと向かわせる文字なのである。
UUIDのルール、そしてなぜ2通りの書き方があるのか
^[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$
すべての-?に注目してほしい。それぞれのダッシュは省略可能なのだ。次の2つは同じアカウントであり、どちらも受け付けられる:
069a79f4-44e9-4726-a5be-fca90e38aaf5 dashed
069a79f444e94726a5befca90e38aaf5 undashed
32桁の16進数で、8-4-4-4-12の区切りでグループ化される。大文字・小文字も関係なく、A-Fとa-fはどちらも一致する。
これが重要なのは、2つの形式が別々の場所から来るからだ。usercache.json、プラグインの設定、Mojang自身のAPIは、どちらを出力するかで一致していない。そしてプレイヤー上の/data getはどちらも出力せず、4つの整数の配列([I; …])を出力する。だから両方に出会うことになり、片方しか受け付けないツールは半分の確率で壊れているように見える。
-?は「全部かゼロか」ではなく区切りごとの判定なので、ダッシュが一部だけ残った文字列も通る。これは厳密に正しいというより寛容すぎる挙動だが、意図的なものだ。誰かがダッシュを1つ落としただけで貼り付けを拒否しても、誰の得にもならない。
なぜ名前とUUIDは互換できないのか
ユーザー名は変更でき、再利用もできる。UUIDはできない。したがってユーザー名の検索は「今この瞬間この名前を持っているのは誰か」に答え、UUIDの検索は「この特定のアカウント、今日何と呼ばれていようと」に答える。
保存しておくもの——ホワイトリスト、スコアボード、データパック、頭——には、UUIDのほうが正しさを保つ。ユーザー名のほうが入力は楽だ。
4つのアニメーション、それは時間に沿ったポーズ
ビューアーはidle、walk、run、flyを用意している。これらは静的なポーズではなくアニメーションであり、それがスキンを判断する上で重要になる。静止した状態でよく見えるテクスチャも、腕が振られるとおかしく見えることがある。腕の側面——平面プレビューでは決して見えない面——が視界に入ってくるからだ。
だからこそ、表と裏をレンダリングするだけでなく、動いている状態でスキンをプレビューすることに意味があるのだ。