如何编辑Minecraft中的.mca文件?

7

介绍

我想将我的独立 Minecraft 世界合并成一个世界,一开始看起来很容易实现,但当我进行调查后发现需要制作一个自定义程序。

困难重重

首先,我试图将区域文件移动并合并到一个区域文件夹中,这似乎是显而易见的解决方案,而且几乎成功了。注意:我打开了文件并发现整个扇区都有其坐标存储,而不是实体,因此地形本身与区域文件名在空间上不匹配。

当我打开客户端时,这导致了相当多的卡顿,并且这些区域无法渲染。我阅读了有关 Anvil 文件格式的资料,并想象出了一种读取 NBT 文件的方案。我认为我可以手动读取字节并进行编辑,但是在继续研究时,我得到了关于区域文件是否为 gzip 压缩的矛盾答案。

我完成了足够的代码以读取一些原始字节,但是字节值并没有按照我预期的那样输出。

根据我对 NBT 文件的信息,它们都以 CompoundTag 开始,而 CompoundTag 以一个单字节值(即 x0A)开始。

这是我获取格式信息的地方:https://minecraft.gamepedia.com/NBT_format

下面是实际输出的屏幕截图:

Byte-reading code in Java and Output

注意:屏幕截图中的类描述不准确。我只是快速填写了足够的内容以读取字节,而没有完善 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个手动编辑,因此我仍然需要更好的解决方案。

这个问题很令人困惑,我尝试编辑一下,以便新读者更容易理解。通常情况下,我们不需要用划掉的方式来显示旧版本的问题。整个编辑历史记录对于想要查看的人是可见的,因此如果您已经通过研究得到了进一步的信息(只要编辑不会使现有答案无效),重新编写问题通常是更好的选择。附后更新是可以的,但最好放在末尾,以保持正确的时间顺序。 - halfer
请求软件(如数据编辑器)或库(用于读取数据)的问题属于禁止讨论范围。这类请求可能导致问题被暂停,因此最好避免,即使它们是相关的。 - halfer
最后,答案必须实际上是答案,而不是寻求更多帮助的更新。下面的答案有些特殊情况,但我已经编辑过以强调答案的质量。 - halfer
3个回答

2
首先,据我所知,在区域文件中没有更多关于“块的位置”的信息。每个区域文件存储了32(x方向)* 32(z方向)= 1024个块,并且每个块都有其在文件中的数据位置。因此,块只是在文件内部编号,前8192个字节仅涉及特定块是否有数据、其在文件中的位置以及上次更新时间。完整区域(这1024个块)在世界中的位置可以通过文件名计算,其中区域本身按x和z方向编号。
因此,在您的情况下,您应该能够以一种方式重命名您的区域文件,使它们保持与原始世界中的位置相同,并将它们合并在一起。
其次,当您想要解码数据时,NBT格式不是首要考虑的事情。首先,区域文件有其自己的结构:https://minecraft.gamepedia.com/Region_file_format,当您使用Zlib(RFC1950)获取实际数据时,它变得复杂...
无论如何,如果您想要进一步了解如何解码,我可以提供一些信息(因为文件https://www.rfc-editor.org/rfc/rfc1950.htmlhttps://www.rfc-editor.org/rfc/rfc1951关于Zlib(RFC1950)写得很难懂-至少对我来说是这样)。但是,我现在自己遇到了一些困难,这就是我遇到这个问题的原因。

1

我找到了一款编辑器!

现在我可以进行编辑,但我不知道编辑是如何工作的。我还没有学习过任何内容,但我终于找到了别人的编辑器。这并不是我想要的,因为我想知道如何自己做这件事。

更新:使用此软件修复一个区域需要手动编辑2个字段,最多可达32x32块,并且我需要修复118个区域。这可能需要进行241,664次手动编辑!这个解决方案在合理的时间范围内不可行,但这是我目前找到的最好的解决方案:

我找到了这个页面:https://fileinfo.com/extension/mca

它链接到了这个页面:https://fileinfo.com/software/nbtexplorer/nbtexplorer

这个链接指向这个页面: https://github.com/jaquadro/NBTExplorer/releases

我安装了这个软件,它自动链接到了.minecraft文件夹,这是GUI的截图:

enter image description here

从好的方面来看,应用程序下载页面还提供了源代码的下载链接,所以我打算阅读一下!到目前为止,我已经打开了两个文件,但它们没有任何注释。它们也是用C#编写的,这是我以前从未见过的语言,但我听说它非常类似于Java,所以也许我会学习这种语言。


1
这个Java库非常适合编辑.mca文件,并在自述文件中提供了一些相关示例。

https://github.com/Querz/NBT

关于压缩的工作原理,每个块都可以通过gzip或zlib进行单独压缩,但实际上通常都是使用zlib压缩的,在Java中通过InflaterDeflater实现。关于块数据格式的一个令人讨厌的事情是,它只有压缩缓冲区的大小前缀,没有未压缩缓冲区的大小信息(因此必须估计未压缩缓冲区足够大或使用多个缓冲区填充,直到压缩缓冲区完全“膨胀”)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接