如何编辑minecraft的.mca文件?

new9mtju  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(2324)

导言

我想把我独立的雷工世界合并成一个单一的世界,这看起来是一个相对容易的壮举,但随着我的研究,它逐渐演变成需要制作一个定制程序。

斗争

我开始移动区域文件,并将它们合并到一个区域文件夹中,这似乎是一个明显的解决方案,几乎奏效。注意:我打开了文件,似乎整个扇区都存储了坐标,而不是实体,因此地形本身在空间上与区域文件名不匹配。
当我打开客户端时,这导致了相当多的延迟,并且区域未能呈现。我阅读了anvil文件格式,并设想了一个读取nbt文件的方案。我想我可以手动读取字节并编辑它们,但在我的继续研究中,我得到了关于是否gzip区域文件的相互矛盾的答案。
我完成了足够的代码来读取一些原始字节,但是字节值并没有像我期望的那样出来。
根据我在nbt文件上的信息,它们都以compoundtag开始,compoundtag以一个值为10的字节开始,或者x0a。这是我获得格式信息的地方:https://minecraft.gamepedia.com/nbt_format
下面是一个实际出来的截图:

注意:截图中的类描述不准确。我只是很快地填写了足够的字节来读取,而不是充实ui函数。
我假设这些字节以无意义的形式出现是文件被压缩的标志。我发现这是gzip问题的一个开始:http://gnuwin32.sourceforge.net/packages/gzip.htm
我想如果我能安装它,它会解压这个.mca文件,我可以按预期读取字节,但我不明白安装说明。它说使用“shell命令,‘configure’、‘make’和‘makeinstall’”。对我来说这听起来像unix,但我下载的文件是windows的?没有任何exe,但有相当多的c文件。我没有c编译器。
注意:我还没有得到gzip软件工作。

后记

我在这里看到过类似的问题,但它们要么都是旧的(2016ish),与以前工作的软件有死链接,要么都是新的,没有答案。我在5个月前发现了这个问题的一个具体副本,但我不得不做一个解释来评论。以下是链接:如何读取minecraft.mca文件,以便在python中提取单个块?他的问题是关于python实现的。他说他找到了一个用于python的nbt库,但它拒绝了他的mca文件,因为它没有gzip。
我已经有了理解这个问题的线索,因为我有nbtexplorer的源代码(参见我发布的答案),但是我必须更新它的结果。至于把我的世界修好,我想我现在有一个可行的解决办法。
如果有人能给我指出一个完整的java库和源代码,它会打开.mca或一个与此主题相关的讨论板,那就太酷了。我仍然对文件压缩的工作原理感兴趣,但这可能超出了这个问题的范围。我意识到这与bug或错误没有直接关系;更重要的是,我不知道要做一个代码来完成这项任务还需要做些什么。

更新

我找到其他人的程序来做这个,并把它作为一个答案,但我仍然想知道如何将文件从字节转换成可用的信息。使用我发布的答案的手工编辑方法,我最多需要241664个手工编辑,所以我仍然需要一个更好的解决方案。

hzbexzde

hzbexzde1#

我找到一个编辑!

现在我可以编辑了,但我不知道怎么编辑。我什么都没学到,但我终于找到了别人的编辑。不完全是我想要的,因为我想知道如何自己做到这一点。
更新:要使用这个软件修复一个区域,我必须手动编辑2个字段,最多32x32块,我有118个区域需要修复**这是241664个潜在的手工编辑!这个解决方案在合理的时间范围内是不可行的,但它是我迄今为止最好的:
我找到了这个页面:https://fileinfo.com/extension/mca
链接到此页的:https://fileinfo.com/software/nbtexplorer/nbtexplorer
链接到此页的:https://github.com/jaquadro/nbtexplorer/releases
我安装了软件,它自动链接到.minecraft文件夹,下面是gui的屏幕截图:

好的一面是,应用程序下载页面也有一个源代码的下载链接,所以我打算读一下!到目前为止,我已经打开了两个文件进行浏览,但它们根本没有被评论。它们也是用c语言编写的,我以前从未见过,但我听说它和java非常相似,所以也许我也会学习这种语言。

xzv2uavs

xzv2uavs2#

这个java库非常适合编辑.mca,在自述文件中有一些这样做的示例
https://github.com/querz/nbt
至于压缩是如何工作的,块可以通过gzip或zlib单独压缩,但实际上通常都是zlib压缩的,这是通过inflater和deflater在java中实现的。块数据格式的一个恼人之处是,它只以压缩缓冲区的大小作为前缀,而没有关于未压缩缓冲区大小的信息(因此必须估计未压缩缓冲区足够大,或者可以使用多个缓冲区来填充,直到压缩缓冲区完全“膨胀”)。

dw1jzc5e

dw1jzc5e3#

第一:据我所知,没有更多关于“块在哪里”的信息存储在区域文件中。一个区域文件中存储了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.html 以及https://tools.ietf.org/html/rfc1951 关于zlib(rfc1950)的文章写得很难理解(至少对我来说是这样)。但有一点我自己正在挣扎,这就是为什么我遇到这个问题。

相关问题