minecraft吧 关注:2,528,979贴子:31,660,856
  • 11回复贴,共1

关于离线模式下默认皮肤是什么的研究

只看楼主收藏回复

上回:https://tieba.baidu.com/p/6511891440


IP属地:北京1楼2023-08-21 20:30回复
    新版本MC中添加了更多的新皮肤,因此决定默认皮肤的代码有所改变,本篇将带大家来重新学习MC中默认皮肤的决策。


    IP属地:北京2楼2023-08-21 20:30
    回复
      和之前的版本一样,MC对默认皮肤的决策相关代码依旧位于DefaultPlayerSkin类中,在net.minecraft.client.resources包下。


      IP属地:北京3楼2023-08-21 20:32
      收起回复

        该类有一个静态数组,储存了全部的默认皮肤的信息,接下来有几个静态方法,我们着重看这两个:getDefaultSkin()、getSkinType()。
        getDefaultSkin()有两个重载,一个是无参数的,默认返回第六号默认皮肤,也就是细手Steve;另一个是需要UUID作为参数的,也就是根据UUID决策我们的默认皮肤。经查看,总是返回默认皮肤的版本目前只用于:
        1. 玩家头颅
        2. SkinManager类中,给玩家皮肤提供个资源位置……?
        因此,我们可以断定新版本对离线模式默认皮肤的判定依旧是只与玩家UUID有关。


        IP属地:北京4楼2023-08-21 20:35
        收起回复
          我们看,getDefaultSkin(UUID)调用了getSkinType(UUID),后者返回默认皮肤大数组中的第“UUID的hashCode,对其取模‘默认皮肤数’”号皮肤,序号从0开始计。需要注意的是虽然MC中只有9个人物,但Mojang贴心地为他们设计了两种手臂模型(纤细或宽型),所以是从18个皮肤中选。
          取模约等于求余数,但是“余数”(模)总是大于等于0。
          UUID的hashCode的求法是:其高64位与低64位异或,取结果(64位)后,再让其高32位与低32位异或。(见上回)


          IP属地:北京5楼2023-08-21 20:39
          回复
            经过上述运算后就能得到离线模式下的皮肤啦。由于新版的运算变复杂了,所以没有简单判断皮肤的方法,只能全部计算。


            IP属地:北京6楼2023-08-21 20:42
            回复
              Visual Studio Code好评
              (关注点错误)


              IP属地:山东来自iPhone客户端7楼2023-08-21 21:03
              回复
                Official名差评


                IP属地:福建8楼2023-08-21 22:07
                收起回复