【问题标题】:How do I edit .mca files from Minecraft?如何从 Minecraft 编辑 .mca 文件?
【发布时间】:2020-01-24 23:32:51
【问题描述】:

简介

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

斗争

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

当我打开客户端并且区域无法呈现时,这导致了相当多的延迟。我阅读了 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' 和 '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 文件,因为他的 MCA 文件没有被压缩

由于我有 NBTExplorer 源代码(请参阅我发布的答案),因此我在理解问题方面取得了领先,但我必须更新它的结果。就修复我的世界而言,我认为我现在有一个可行的解决方案。

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

更新

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

【问题讨论】:

  • 这个问题相当混乱,我试图对其进行编辑,以便对新读者更有意义。一般来说,我们不需要删除部分问题来显示旧版本。想要查看的人可以看到整个编辑历史记录,因此如果您的研究进一步深入(并且只要编辑不会使现有答案无效),通常最好重写问题。后记更新很好,但最好放在最后,以保持正确的时间顺序。
  • 对软件(例如数据编辑器)或库(读取数据)的请求是题外话。这类请求可能会导致问题被搁置,因此最好避免它们,即使它们是相切的。
  • 最后,答案必须是真正的答案,而不是需要更多帮助的更新。下面的答案有点极端,但我对其进行了编辑以强调答案质量。

标签: java compression minecraft file-format


【解决方案1】:

首先:据我所知,没有更多关于“块在哪里”的信息,存储在区域文件中。在一个区域文件中存储了 32(x 方向)*32(z 方向)= 1024 个块,每个块都有其在文件中的数据位置。所以这些块只是在文件本身内编号,前 8192 个字节只是关于是否有关于该特定块的任何数据,它在文件中的位置以及最后一次更新的时间。整个区域(这 1024 个块)在世界中的位置可以在文件名中计算出来,其中区域本身在 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 以难以理解的方式编写 - 至少对我来说)。但是有一点我自己现在正在苦苦挣扎,这就是我遇到这个问题的原因。

【讨论】:

    【解决方案2】:

    我找到了一个编辑器!

    现在我可以编辑,但我不知道如何编辑工作。我没有学到任何东西,但我终于找到了别人的编辑器。不完全是我想要的,因为我想知道如何自己做。

    更新:要使用此软件修复区域,我必须手动编辑 2 个字段,最多 32x32 块,并且我有 118 个区域需要修复. **这是 241,664 次潜在的手动编辑!这个解决方案在合理的时间范围内是不可行的,但它是我迄今为止最好的:

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

    链接到这个页面的:​​https://fileinfo.com/software/nbtexplorer/nbtexplorer

    链接到这个页面的:​​https://github.com/jaquadro/NBTExplorer/releases

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

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

    【讨论】:

      【解决方案3】:

      这个 Java 库非常适合编辑 .mca,并且在 README 中有一些这样做的示例

      https://github.com/Querz/NBT

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

      【讨论】:

        猜你喜欢
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        相关资源
        最近更新 更多