java - 如何从 Minecraft 编辑 .mca 文件?

标签 java compression minecraft file-format

简介

我想将我的各个 Minecraft 世界合并成一个世界,这似乎是一个相对容易的壮举,但随着我的研究,它演变成需要制作一个自定义程序。

斗争

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

当我打开客户端并且区域无法渲染时,这导致了相当多的延迟。我阅读了 Anvil 文件格式并想象了一种读取 NBT 文件的方案。我想我可以手动读出字节并编辑它们,但在我继续研究中,我得到了关于区域文件是否被 gzip 压缩的相互矛盾的答案。

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

根据我掌握的NBT文件信息,它们都以CompoundTag开头,并且CompoundTag以值为10或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 命令,'configure','make' 和 'make install'”。对我来说这听起来像 Unix,但我下载的文件是针对 Windows 的?没有任何exe文件,但有相当多的C文件。我没有 C 编译器。 。 .

注意:我仍然没有让 gzip 软件运行。

后脚本

我在这里看到过类似的问题,但所有这些问题要么都是旧的(2016 年左右),并且指向曾经可用的软件的死链接,要么是最近的且未得到答复。我发现了 5 个月前提出的这个问题的一个具体副本,但我必须注册一个帐户才能发表评论。链接如下:How can read Minecraft .mca files so that in python I can extract individual blocks?他的问题是关于 Python 实现的。他说他找到了一个 Python 的 NBT 库,但它拒绝了他的 MCA 文件,因为未压缩

我已经了解了这个问题,因为我有 NBTExplorer 源代码(请参阅我发布的答案),但我必须更新它的结果。就修复我的世界而言,我想我现在有了一个可行的解决方案。

如果有人可以向我指出一个已完成的 Java 库(带有源代码),可以打开 .mca 或与该主题相关的讨论板,那就太酷了。我仍然对文件压缩的​​工作原理感兴趣,但这可能超出了这个问题的范围。我意识到这与错误或错误没有直接关系; 更重要的是,我不知道需要采取哪些进一步的步骤来编写完成此任务的代码。

更新

我找到了其他人的程序来执行此操作并将其作为答案发布,但我仍然想知道文件如何从字节转换为可用信息。使用我发布的答案的手动编辑方法,我最多需要241,664次手动编辑,所以我仍然需要更好的解决方案。

最佳答案

首先:据我所知,没有更多关于存储在区域文件中的“ block 在哪里”的信息。一个区域文件内存储有 32(x 方向)*32(z 方向)= 1024 个 block ,每个 block 都有其在文件中的数据位置。因此,这些 block 只是在文件本身内进行编号,前 8192 字节只是关于是否存在有关该特定 block 的任何数据、它在文件中的位置以及上次更新的时间。完整区域(那 1024 个 block )在世界中的位置可以在文件名中计算出来,其中区域本身在 x 和 z 方向上编号。

因此,在您的情况下,您应该能够以它们在原始世界中一样的方式重命名区域文件,并且您应该能够将它们合并在一起。

第二:当您想要解码数据时,NBT 格式并不是首先要考虑的。第一个区域文件有自己的结构:https://minecraft.gamepedia.com/Region_file_format当您使用 Zlib (RFC1950) 获取实际数据时,它会变得复杂......

无论如何,如果您想了解有关如何解码的更多信息,我可以为您提供一些信息(因为关于 Zlib (RFC1950) 的文件 https://www.rfc-editor.org/rfc/rfc1950.htmlhttps://www.rfc-editor.org/rfc/rfc1951 的编写方式很难理解 - 至少对我来说是这样)。但我自己现在正在挣扎,这就是为什么我遇到这个问题。

关于java - 如何从 Minecraft 编辑 .mca 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59904969/

相关文章:

java - 收集并排序所有玩家的积分

java - Minecraft 1.12,服务器未启动。 "Linux external server"

Java 乘法

java - 如何使我的默认 JDK FX 启用?

java - 可直接访问的数据结构 Java

c++ - 读取顺序文件 - 压缩文件与未压缩文件

c++ - 如何使用 zlib.h 解压缩 m MYSQL_RES 中的 COMPRESSED BLOB,而不在 mysql 查询中使用 UNCOMPRESS

compression - Hadoop:在 HDFS 中压缩文件?

java - 检查 Web 元素值的 boolean 方法

java - 多个领域