介绍
我想将我的独立 Minecraft 世界合并成一个世界,一开始看起来很容易实现,但当我进行调查后发现需要制作一个自定义程序。
困难重重
首先,我试图将区域文件移动并合并到一个区域文件夹中,这似乎是显而易见的解决方案,而且几乎成功了。注意:我打开了文件并发现整个扇区都有其坐标存储,而不是实体,因此地形本身与区域文件名在空间上不匹配。
当我打开客户端时,这导致了相当多的卡顿,并且这些区域无法渲染。我阅读了有关 Anvil 文件格式的资料,并想象出了一种读取 NBT 文件的方案。我认为我可以手动读取字节并进行编辑,但是在继续研究时,我得到了关于区域文件是否为 gzip 压缩的矛盾答案。
我完成了足够的代码以读取一些原始字节,但是字节值并没有按照我预期的那样输出。
根据我对 NBT 文件的信息,它们都以 CompoundTag 开始,而 CompoundTag 以一个单字节值(即 x0A)开始。
这是我获取格式信息的地方:https://minecraft.gamepedia.com/NBT_format
下面是实际输出的屏幕截图:
注意:屏幕截图中的类描述不准确。我只是快速填写了足够的内容以读取字节,而没有完善 UI 函数。
我认为这些字节输出为无意义的结果表明该文件已经被压缩。我找到了以下网址来解决 gzip 问题:http://gnuwin32.sourceforge.net/packages/gzip.htm
如果我能安装它,那么它就可以解压 .mca 文件,然后我就可以按预期读取字节,但是我不理解安装说明。它说要使用“Shell Commands,configure,make 和 make install”。对我来说,这听起来像是 Unix 的命令,但我下载的文件是 Windows 版本的?里面没有 exe 文件,但有很多 C 文件。我没有 C 编译器...
注意:我仍然没有使 gzip 软件工作。
后记
我已经在这里看到了类似的问题,但它们要么太旧(大约在2016年),链接到曾经有效的软件已经失效,要么是最近的问题尚未得到回答。我发现有一个具体的副本问题是5个月前提出的,但我不得不注册才能评论。这是链接:如何读取Minecraft .mca文件,以便在Python中提取单个块?他的问题与Python实现有关。他说他找到了一个Python的NBT库,但它因为“非gzip”而拒绝了他的MCA文件。我通过查看NBTExplorer源代码获得了解决该问题的线索(请参见我发布的答案),但我还需要更新该情况的进展。至于修复我的世界,我认为现在我有一个可行的解决方案。
如果有人能指向一个完成的Java库,带有源代码,打开.MCA或与此主题相关的讨论板,那将很酷。我仍然对文件压缩的工作方式感兴趣,但这可能超出了这个问题的范围。我意识到这与错误或错误无关;
更新:我找到了别人的程序来完成这个任务并将其发布为答案,但我仍然想知道该文件是如何从字节转换为可用信息的。使用我发布的答案的手动编辑方法,我最多需要241,664个手动编辑,因此我仍然需要更好的解决方案。