(我不求被选为最佳答案,只是无聊顺路分析一下)
Minecraft原版加载皮肤的机制(1.7.6及以后)
1.启动Minecraft
正版登陆:
首先,启动器根据你输入的账号和密码,链接mojang服务器,获得uuid(用户标识符)和token(用户凭据)。
文档:
http://wiki.vg/Authentication
然后,再通过启动参数提交进Minecraft。
- --uuid ${auth_uuid} --accessToken ${auth_access_token}
复制代码 使用离线模式登陆(盗版原理):
上文的uuid变成启动器随机根据计算机信息生成的uuid(正版启动器会使用最后记录的uuid),token为空(或0)。
此时,Minecraft可以正常接收到用户的uuid,但没有token可以与Mojang服务器通信获取更深的资料。
2.加入服务器
(本地游戏本质上是关闭离线模式且不对创建者进行身份验证的服务器[例如a是盗版用户进了本地游戏,同是盗版用户的b不能加入a的本地游戏])
playername/uuid与token都会提交给服务器。
非离线模式服务器
服务器与Mojang通信进行验证身份,并同时获得由Mojang提供的GameProfile。
离线模式服务器
服务器接收这一消息,不进行任何验证,生成本地创建的GameProfile。
3.获得GameProfile
GameProfile包含了用户的一切信息,且会在加入服务器时从服务器获取。
1)GameProfile获取的内容
其中包括了材质信息。
2)离线模式服务器
这样的服务器不会与Mojang进行任何通信,所以,即使是正版,传递到客户端的GameProfile也不包含任何有关正版的内容(例如材质)。
4.使用GameProfile获得皮肤
GameProfile已经包含了皮肤的URL,
Minecraft需要做的只是在渲染时加载皮肤。
皮肤插件基本原理
在用户加入服务器时,修改传输给用户的GameProfile。
为什么皮肤插件(SkinsRestorer SkinsChanger Citizens)都只能使用正版的皮肤文件?
客户端在GameProfile中获取仅包含材质的Map时,authlib会对URL进行验证,只允许url的域名部分以".minecraft.net"或".mojang.com"结尾/
皮肤补丁基本原理
在客户端渲染,准备使用GameProfile获取皮肤URL后,重新修改带有URL的Map。
为什么不直接修改GameProfile?
原因同上。