minecraftpe吧 关注:638,702贴子:15,084,554

pe里chunks.dat的数据结构详解

只看楼主收藏回复

翻译自wiki,大神轻喷


来自Android客户端1楼2014-03-16 01:57回复
    chunks.dat存储16x16(256)个区块数组,包含所有在一个默认的地图中的256x256x128(8388608)个方块。每个扇区的长度是4096个字节(或者4kb),一个默认的地图中总共有5377个扇区。这个文件最多有32x32(1024)个区块和512x512x128(33554432)个方块,但是在一个游戏默认生成的地图中,这个地图是标准大小。除了一小部分数据之外,这个文件中字节的类型大多数是32位小尾数。


    来自Android客户端4楼2014-03-16 02:01
    收起回复
      chunks.dat的第一个扇区是一个数据位置表,里面写着哪个区块是有效的,以及这些区块都在哪儿。(ps:在chunks.dat中的具体位置)位置表里每128个字节代表地图中的一行区块,但是通常只有64个字节的数据,因为一行只有16个区块。(ps:不要在意这里的前后矛盾,因为这种这种数据存放格式本来是设计给pc用的,现在pe照搬过来,而pe地图又比较小)


      来自Android客户端5楼2014-03-16 02:02
      收起回复
        位置表里每个区块的格式就像这样子: 15 XX ZZ 00
        15(十进制21)代表这个区块里有多少扇区(这里是21个扇区)
        第二个数字是区块左上角的X坐标(16进制)
        第三个数字是Z坐标(16进制),代表区块在哪一行
        最后一个数字现在没用到,除非pe以后更新到地图大小可以增加(ps:估计090就用到了吧,lol)


        来自Android客户端6楼2014-03-16 02:02
        回复
          为了找到区块在表中的偏移,我们要用到一条公式: 4096+(x*21*4096)+(z*21*16*4096)
          因为第一个区块是位置表,所以我们从4096开始(加上4096)。
          每86016个字节(21*4096个字节)是一个区块,所以乘上x。
          Z坐标一样,每16个区块是一行,所以乘上16。


          来自Android客户端8楼2014-03-16 02:02
          回复
            下面来个例子:
            15 4d 02 00
            第一个数字告诉我们区块里有多少个扇区,这里是21个(10进制)。
            第二个数字4d(16进制)是“x坐标”。
            第三个数字02(16进制)是“z坐标”。
            第四个数字是给更大的地图用的(以后的更新,估计是090)。
            77*21*4096加4096(跳过位置表),得到6627328。
            2*21*4096*16得到9379840,这就是区块的10进制位移了。


            来自Android客户端9楼2014-03-16 02:03
            收起回复
              第一个区块的第一个8个扇区(原文:the first 8 sectors),在1000(16进制)或者4096(10进制)偏移,是文件的第一个,方块的数组(ps:断一下句以免误会,原句是:the first array of blocks in the file)。第一个四个字节(原文:the first 4 bytes)在1000(16进制)或者4096(10进制)偏移,是一个区块数据头,确定一个区块的开始。区块数据头总是 04 41 01 00 (16进制),在区块数据头之后,每128个方块是一列。每16列是一行。行用短整型数组储存。


              来自Android客户端10楼2014-03-16 02:04
              回复
                这8个扇区之后的4个扇区,采用长尾数存储着方块的信息(ps:这才是真正核心的数据啊有木有QAQ,前面都是铺垫)。因为这部分只有4个扇区长,所以每个字节都代表2个方块。


                来自Android客户端13楼2014-03-16 02:04
                回复
                  这部分数据(这4个扇区)的一个使用例子:
                  你放了一些蓝色羊毛,然后再放一些红色羊毛在一列(ps:注意放羊毛的顺序),在区块里的[4,76,14]。
                  为了分离羊毛在区块里的X,Y,Z坐标,你要把坐标除2,得到[2,38,7]。
                  现在,你得到了新的坐标[2,38,7],你可以用这个公式:(x*64)+y+(z*64*16),算出数据在扇区中的偏移量,然后再找到数据。通过偏移量找到的数据,例如:EB(16进制),因为扇区是用长尾数格式存储的,所以你要读成BE(16进制)(ps:也就是前后调转)。
                  B是蓝色羊毛的数据,E是红色羊毛的数据,你不得不把字节拆开然后再得到每个方块的独立数据。


                  来自Android客户端14楼2014-03-16 02:06
                  回复
                    这4个扇区之后的4个扇区,是天空光照的数据。(ps:看到这里是不是很兴奋呢嘿嘿)
                    这里的数据格式和上面完全一样。
                    光照数据的值的意思:F代表最暗,0代表最亮。
                    因为游戏会动态生成光照,当你在你的程序中生成一个世界时,这部分的数据并不重要。(ps:不重要并不代表不要了,你可以F或者0之类把它填满)


                    来自Android客户端15楼2014-03-16 02:06
                    回复
                      最后4个扇区是方块光照数据。
                      数据格式和上面一样。
                      数值的意思也和上面一样。
                      这些数据一样会被游戏动态生成。


                      来自Android客户端16楼2014-03-16 02:07
                      回复
                        --------------------------完毕-------------------------


                        来自Android客户端17楼2014-03-16 02:08
                        收起回复
                          虽然不知道是什么,但是看起来好像好厉害的样子


                          18楼2014-03-16 02:08
                          收起回复
                            前排


                            IP属地:新加坡来自Android客户端20楼2014-03-16 02:13
                            回复