minecraft吧 关注:2,543,996贴子:31,811,849

关于离线模式下皮肤是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
    回复

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


      IP属地:广东3楼2020-02-25 16:23
      收起回复
        然后怎么重新编译


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


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


            IP属地:广东6楼2020-02-25 16:30
            回复
              赶上直播


              IP属地:上海7楼2020-02-25 16:31
              回复
                辣摸问题来了,虽然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
                    回复
                      抓回来更新


                      IP属地:安徽11楼2020-02-25 17:08
                      收起回复
                        手机上不好更新,解释一下什么是异位或
                        众所周知你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
                          回复
                            赶上直播


                            IP属地:吉林来自iPhone客户端14楼2020-02-25 20:21
                            回复
                              我不是正版,一直用goatwood做用户名,就因为这个妹子皮肤超好看,我最早取名是cookie,由于皮肤太丑只好换掉


                              IP属地:江苏15楼2020-02-25 20:24
                              回复