如何从 Minecraft 编辑 .mca 文件?

2024-01-04

介绍

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

奋斗

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

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

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

根据我所掌握的 NBT 文件信息,它们都以CompoundTag 开头,并且CompoundTag 以值为10 或x0A 的单个字节开头。 这是我获取格式信息的地方:https://minecraft.gamepedia.com/NBT_format https://minecraft.gamepedia.com/NBT_format

这是实际出现的屏幕截图:

注意:屏幕截图中的类描述不准确。我只是快速填写了足够的内容来读取字节,而不是充实 UI 功能。

我认为这些字节毫无意义地出现是文件被压缩的标志。我发现这是 gzip 问题的开始:http://gnuwin32.sourceforge.net/packages/gzip.htm http://gnuwin32.sourceforge.net/packages/gzip.htm

我想如果我能安装它,它会解压缩这个 .mca 文件,并且我可以按预期读取字节,但我不明白安装说明。它说使用“​​Shell 命令,'configure','make' 和 'make install'”。对我来说这听起来像 Unix,但我下载的文件是针对 Windows 的?没有任何exe文件,但有相当多的C文件。我没有 C 编译器。 。 。

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

后脚本

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

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

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

Update

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


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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Minecraft 编辑 .mca 文件? 的相关文章

  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐