Minecraft 用户名是 1–16 个字符,且只由三种东西组成;而 UUID 有两种写法
字母、数字、下划线。没有连字符,没有点,没有空格。而 UUID 带不带连字符都能被接受——这就是为什么同一次查询,一次失败,一次却成功,UUID 由 32 个十六进制字符组成,按 8-4-4-4-12 分组,大小写都能识别。
查询皮肤,就是把某个人输入的文本变成 Mojang 能识别的东西,而它只可能是两种东西之一。两者都有精确的规则,而 UUID 那一条还有个小小的坑,导致大量“提示找不到”的反馈。
用户名的规则
^[A-Za-z0-9_]{1,16}$
只有三种字符类别,别无其他:字母、数字、下划线。长度为 1 到 16。
真正有用的是它排除了什么:
- 不能有连字符——这是人们最常尝试的一种
- 不能有点,不能有空格,不能有
@ - 不能超过 16 个字符,也不能为空
所以服务器上的显示名、Discord 用户名或电子邮箱都查不出来,哪怕它们看起来很像名字。如果一次查询失败,而文本里含有连字符,那几乎总是原因所在——而连字符恰恰是让人转而去用另一种格式的字符。
UUID 的规则,以及它为什么有两种写法
^[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}$
注意每一个 -?:每个连字符都是可选的。下面这两个是同一个账号,两个都会被接受:
069a79f4-44e9-4726-a5be-fca90e38aaf5 dashed
069a79f444e94726a5befca90e38aaf5 undashed
32 个十六进制数字,按 8-4-4-4-12 分组。大小写同样无所谓——A-F 和 a-f 都能匹配。
这一点很重要,因为这两种形式来自不同的地方。usercache.json、插件的配置文件和 Mojang 自己的 API 在输出哪一种上并不一致——而玩家身上的 /data get 输出的两者都不是,而是一个由四个整数组成的数组([I; …])——所以两种你都会遇到,而一个只接受其中一种的工具,有一半时间看起来就是坏的。
-? 是逐个分隔符判断的,而不是全有或全无,所以一个只带部分连字符的字符串也能通过。这比严格正确要宽松,而且是刻意为之:因为某人少打了一个连字符就拒绝一次粘贴,对谁都没好处。
为什么用户名和 UUID 不能互换
用户名可以更改,也可以被重新使用;UUID 不能。所以用户名查询回答的是“现在谁在用这个名字”,而 UUID 查询回答的是“这个特定的账号,无论它今天叫什么”。
对于任何你要存储的东西——白名单、计分板、数据包、头颅——UUID 才是始终正确的那一个。用户名则是那个打起来方便的那一个。
四种动画,它们是随时间变化的姿势
查看器提供 idle、walk、run 和 fly。这些是动画而不是静态姿势,这在判断一个皮肤时很重要:一个静止站着时看起来不错的材质,一旦手臂摆动起来就可能显得不对,因为手臂的侧面——那些你在平面预览里永远看不到的面——会进入视野。
这就是要在运动中预览皮肤、而不是只渲染正面和背面的理由。