当前位置: 首页 > 知识库问答 >
问题:

如何编辑Minecraft中的。MCA文件?

彭畅
2023-03-14

我想把我独立的Minecraft世界组合成一个单一的世界,这似乎是一个相对容易的壮举,但随着我的研究,它演变成了制作一个定制程序的需求。

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

当我打开客户端时,这导致了相当多的滞后,区域无法呈现。我阅读了铁砧文件格式,并设想了一个读取NBT文件的方案。我想我可以手动读出字节并编辑它们,但在我持续的研究中,我得到了关于区域文件是否gziped的相互矛盾的答案。

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

根据我对NBT文件的信息,它们都以一个COMPUNDTAG开始,而COMPUNDTAG以一个值为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个月前这个问题的一个具体副本,但我必须做一个账户来评论。以下是链接:如何读取Minecraft.mca文件,以便在python中提取单个块?他的问题是关于Python实现。他说他为Python找到了一个NBT库,但它拒绝了他的MCA文件,因为没有gzipped。

因为我有NBTExplorer源代码(见我发布的答案),所以我已经了解了这个问题,但我必须更新如何解决这个问题。至于修复我的世界,我想我现在有一个可行的解决方案。

如果有人能告诉我一个完整的Java库,有源代码,打开。mca的,或者一个与这个主题相关的讨论板,那就太酷了。我仍然对文件压缩如何工作感兴趣,但这可能超出了这个问题的范围。我意识到这与bug或错误没有直接关系; <罢工> 它是 我不知道该采取什么进一步的步骤来编写完成此任务的代码。

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

共有1个答案

常自怡
2023-03-14

首先:据我所知,没有更多关于“块在哪里”的信息,存储在区域文件中。在一个区域文件中存储有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.html和https://tools.ietf.org/html/RFC1951的编写方式很难理解-至少对我来说是这样)。但这是我自己现在正在挣扎的一点,这就是我遇到这个问题的原因。

 类似资料:
  • 我正在使用报表工具编辑。Jasper文件。我正在更改参数的对齐方式左到中心,然后我保存该文件。它还生成“jrxml”文件。在我的Java代码中,我可以传递。jasper位置来打印一些项。但我的改变并不影响,旧的设计保持不变… 帮帮我,我怎么编辑和保存。贾斯珀??? public static JasperPrint CreateFundPrint(Ticket Ticket,HashMap map

  • 我正在处理flyway Db迁移,我下载了flyway zip文件夹,并将其放在本地计算机上。 sql文件夹中有两个文件,即V1\uu Create\u person\u表。sql和V2\uu添加\u人员。sql。 飞行路线信息 Boxfuse Flyway Community Edition 5.2.4 数据库:jdbc:h2:文件:/foobardb(H2 1.4) 架构版本: Flyway迁

  • 问题内容: 例如,我有一个名为的文件。其内容是: 所以在这里我想为每个人添加图片链接 如何编写脚本以将密钥添加到每个人并添加person.name.lowercase +“ .png”作为值? 在此过程结束时,将对people.json进行编辑并将其保存到硬件中,而不是内存中。 非常感谢你。 问题答案: 这是一个完整的程序,使用JavaScript(使用node.js),可以完成所需的工作: 作为

  • 我正在android studio中使用java开发和应用程序,希望在RecyclerView函数中编辑文本。我该怎么做?

  • 我有一个包含两个组件的UI--一个JEditorPane和一个JComboBox。我的目标是能够在JEditorPane中键入一些内容,选择文本的一部分,并且当它仍然被选中时,在可编辑的JComboBox中键入和/或选择一个值。 这是一个文本编辑器类型的程序,我想在其中只更改编辑器窗格中选定文本的字体大小。字体大小来自“可编辑”组合框。为了澄清一下,我不是在问如何对文本应用样式,我是在问如何在组合