如何读取块数据(minecraft)中的“数据”部分?

问题描述 投票:0回答:1

问题

我有一个关于 Minecraft 的技术问题,
因此,我正在构建一个 Minecraft 服务器包装器,并希望添加一个在服务器离线时编辑世界的选项。这意味着会弄乱保存文件。我已经成功地使其适用于 1.8,因为块被保存为 ID 列表,但在 1.19 中,块保存在

palette
(我理解)和
data
数组中,我理解它存储的数据(指向调色板的索引),但我不明白如何提取(我能够做到这一点,但只能通过复制粘贴)并修改其中的数据。我真的很想了解它背后的机制,这样我就可以自己做,我知道还有其他库可以做到这一点,但我想学习如何自己做。 我尝试过不同的方法,我尝试过的最官方的方法是这篇维基文章,但它似乎不起作用。


信息

  • 语言:
    Python
  • Python版本:
    3.9.8
  • 所需的 Minecraft 版本:
    1.19
    (也是 1.15,但有点不同)
  • 使用NBTExplorer查看世界数据
  • 操作系统:Windows 10

其他尝试

  1. 尝试取出 long 的每 4 位,并将它们向左或向右移动 8 和 4 位(所有梳子都不起作用)
  2. 尝试将每个 long 的 4 位放入半字节函数中:
def nibble(byte_array, index):
    value = byte_array[index // 2]
    if index % 2:
        return (value >> 4) &0x0F
    else:
        return value & 0x0F
  1. 尝试获取位的十六进制值并以某种方式将其转换为数字。

上述方法均无效...如果您需要 WIKI 上的代码,请告诉我,我找不到,但如果您需要,我会再写一次。


TLDR

请向我解释块NBT数据下每个

data
的NBT中
section
标签背后的机制和逻辑,以便我可以使用Python为Minecraft版本1.15提取和修改其中的索引(
data
标签) -1.20


查看数据

要亲自查看我正在谈论的数据,您可以安装NBTExplorer,然后打开一个世界保存文件(

%appdata%/.minecraft/saves/[world name]/region/[any region file]
),其中每个区域文件都是32x32块,将其拖放到NBTExplorer中,选择一个块,然后转到部分,然后选择一个部分,转到 block_states,在那里您将能够看到
data
标签。这就是我试图解码、理解和修改的数据。


来源

这些是我尝试从中获取信息的来源,还有更多,但没有用。


请详细回答,并耐心等待。非常感谢!
当然,您可能需要帮助我的任何其他信息,请随时询问!
注意:请不要告诉我有库可以做到这一点,我想了解逻辑,而不仅仅是复制代码,源代码也是如此,如果您在网上找到可能对我有帮助的资源或代码,我想要一个解释所以可以理解(如果您不知道它是如何工作的,但知道它可以工作,请向我指出确切的代码,以便我可以尝试理解自己)

python encoding minecraft chunks region
1个回答
0
投票

块数据使用压缩,它很复杂https://github.com/PREMIEREHELL/Amulet-Plugins/blob/main/force_blending.py我制作的插件具有处理原始块数据的所有原始访问函数。计算就在那里。这段代码将基岩添加到 Y 零,我认为如果它将第一个字节更改为 x08(即 1.17-1.18+ 是 x09),它仍然会将其恢复到旧版本。它适用于混合,但会在现有块下形成熔岩湖。希望这可以帮助您弄清楚这是一个复杂的问题,但当您看到发生的事情时,它很简单,我还使用按位运算符制作了一个版本,但它比 numpy 慢。

© www.soinside.com 2019 - 2024. All rights reserved.