minecraft吧 关注:2,553,700贴子:31,914,107

关于离线模式下皮肤是Alex还是Steve的研究

取消只看楼主收藏回复

最近吧里有人在聊这个呢。
众所周知,Minecraft自带两种默认皮肤,一种是女性皮肤Alex,另一种就是男性皮肤Steve。
然后有的因为种种原因没买正版的玩家起了个好听的名字却获得一个异性的皮肤,却又不想舍弃这个名字呢,那怎么办呢……
(待续)


IP属地:北京1楼2020-02-25 16:14回复
    首先直接用官方的反编译表反编译Minecraft。
    这里感谢GitHub上的hube12提供自动反编译工具DecompilerMC。

    因为皮肤只有俩,所以我们不是搜索Steve就是搜索Alex~
    于是楼主我凭借直觉打开搜索,设置区分大小写,输入表达式进行搜索:

    答案已经很接近了呢


    IP属地:北京2楼2020-02-25 16:19
    回复
      2025-06-26 10:27:17
      广告

      搜索到的三个结果都在同一个源文件里,而且都是在同一个字段 isAlexDefault里面呢。
      上面两个都是调用这个方法,而下面的这个结果就是isAlexDefault这个方法的实现啦~
      它的内容十分十分地简单,就是返回UUID的HashCode(哈希值)的第一位。
      解析到这里就结束了吗,当然不


      IP属地:北京3楼2020-02-25 16:23
      收起回复
        首先我们需要知道什么是哈希值。嗯……
        一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。 理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。!@#¥%(——百度百科)
        其实就是一个对象(几乎是)独有的数字值。因为字符串比较时要一个一个字符地比较就很拖时间,于是就通过特殊的方法把字符串变成(计算成)整数(在Java里用的是int32),整数在电脑里表达只需要4个字节(针对int32),比较的速度就会快很多啦


        IP属地:北京5楼2020-02-25 16:28
        回复
          听不懂也没关系,接下来我们讲的是UUID。
          为了不说出更多没用的东西,我就把它定义为“每个Minecraft玩家的身份证号码吧。”
          嗯嗯。
          Java里哈希值的计算方式是固定的算术方法(加减乘除),所以离线模式下皮肤的性别由玩家UUID决定。


          IP属地:北京6楼2020-02-25 16:30
          回复
            辣摸问题来了,虽然UUID是“每个Minecraft玩家(都有的)的身份证号码”,可是仅限正版玩家呐……
            不过没有UUID是不能进游戏的,所以你的第三方启动器通常都是会随机给你一个UUID(伪造证件),或者是直接给个固定的UUID,也就是说这玩意很邪门。


            IP属地:北京8楼2020-02-25 16:33
            收起回复
              邪门的事情先到这里。

              我们来看看哈希值的计算方式。
              “UUID的高64位与低64位异位或的结果的高32位与低32位再异位或”
              什么玩楞……

              首先是这样(蓝框框把黑字分开了,应该连起来读,黑框框其实二等分就够了)
              然后是这样

              (其实每次都是二等分,图比较难画)
              可以看到结果是越来越小的,最后的结果只剩32位了,刚好可以当作哈希值传回。


              IP属地:北京9楼2020-02-25 16:44
              收起回复
                没人看,摸会儿


                IP属地:北京10楼2020-02-25 16:58
                回复
                  2025-06-26 10:21:17
                  广告
                  手机上不好更新,解释一下什么是异位或
                  众所周知你CPU只认0101
                  异位或就是比较两个操作数的每个位,如果两个位相同就在结果的这个位的位置输出0,否则为1
                  比如 1 异位或 0,1和0是不同的,故输出1
                  而0 xor(异位或) 0和1 xor 1就都是输出0了


                  IP属地:北京来自Android客户端12楼2020-02-25 20:13
                  回复
                    然后UUID其实就是一个128位的数据(数字),高64位指它的64-127位,低64位表示它的0-63位。高64位和低64位进行运算…听起来可能会觉得很诡异…
                    在十进制下,对于数字123456
                    123是它的高3位,456是它的低三位
                    至于我的配图为什么低位在左边…,给个滑稽自己体会


                    IP属地:北京来自Android客户端13楼2020-02-25 20:17
                    回复
                      有人提到“所以isAlexDefault的值就是UUID第0 31 63 95位异或到一起?”,是哒!
                      由于异位或遵守交换律(吧),所以不用担心顺序问题……


                      IP属地:北京22楼2020-02-26 22:11
                      收起回复
                        辣摸我们随便拿一个UUID(随机生成的)来测试一下。
                        ed68c99c-2f96-4578-9071-db9c995bb737
                        …………
                        桥头麻袋,不是说UUID是一串数字吗,为森魔会有字母……
                        因为UUID通常用16进制表示,裆燃你用10进制也完全没关系……只不过大家都用16进制而已
                        16进制数有:0、1、2、3、4、5、6、7、8、9、a(10)、b(11)、c(12)、d(13)、e(14)、f(15)
                        那个杠是分隔用的,没有实际含义。
                        那么我们首先把它四等分……
                        ed68c99c 2f964578 9071db9c 995bb737
                        高位->低位
                        我们先从16进制的角度看问题,要进行操作的四个数是c、8、c、7
                        也就是十进制的12、8、12、7
                        取它们的二进制最低位,分别是0 0 0 1
                        0 xor 0 xor 0 xor 1 = 0 xor 0 xor 1 = 0 xor 1 = 1
                        即默认皮肤是Alex
                        辣摸是不是呢(在这里借助HMCL测试,懒得用自己写的启动器了)(没错我就是给自己启动器打广告的

                        去掉空格,输进玩家信息里

                        然后它()就是个女孩子了


                        IP属地:北京25楼2020-02-27 08:55
                        回复
                          然后我们再来看一个UUID:
                          464964d2 5f3c4cda b3e1c283 9f63a635
                          (直接四等分好了)
                          分别是2、a、3、5
                          二进制最低位为0、0、1 、1
                          0 xor 0 xor 1 xor 1 = 0 xor 1 xor 1 = 1 xor 1 = 0
                          是可爱的男孩子!

                          果然如此。


                          IP属地:北京26楼2020-02-27 08:59
                          回复
                            也就是说大家想换皮肤模型可以参考以下uuid哒
                            男:
                            00000000000000000000000000000000
                            女:
                            00000000000000000000000000000001
                            (大雾)
                            还是自己用生成器生成一个UUID再算一下数吧


                            IP属地:北京28楼2020-02-27 09:03
                            回复
                              2025-06-26 10:15:17
                              广告
                              由于最近GayHub炸了,所以我无法上传我写的性♀别计算小工具,于是乎各位手算吧!


                              IP属地:北京30楼2020-02-27 10:04
                              收起回复