如何解码Minecraft原理图(nbt)文件中的数据(即块状态)字节?

11

我正在解析一个具有以下结构原理图文件

.schematic文件格式是由社区创建的,用于存储Minecraft世界的部分以供第三方程序使用。原理图文件采用NBT格式

命名二进制标签(NBT)文件格式是一种极其简单的结构化二进制格式,Minecraft游戏用于各种事情

数据值定义了Minecraft中地形的部分。

我正在检索每个Minecraft块的块数据,并需要找出如何解码这些字节。这是Stairs Minecraft块的示例

例如,楼梯块数据包括:

enter image description here

我可以使用nbt-js解析整个原理图文件,这使我能够像这样访问块数据:

var b = schem.value.Data.value[index];

我使用以下代码解码楼梯方块数据的位数据:

var facing = b & 0x03;
var half = (b >> 2) & 0x01;
var shape = (b >> 3) & 0x03;

这些配置值是确定楼梯方块应如何呈现的关键。例如,我使用朝向值来旋转方块:

block.rotateX(facing);

然而,对于每个块类型,比特位的解释都不同,而且我找不到任何定义。


1
你能否更新你的问题,提供一个清晰可复现或易于理解的示例? - Fabrizio Bertoglio
1
我重构了你的问题,但是还是不太清楚:1)schem.value.Data.value[index];b变量和schem的值是多少等等...也许你想创建一个fiddle并存根值,以便我们可以快速重新创建你的场景。2)facing = data & 0x03;和其他代码的输出是什么。尝试创建某种类型的fiddle或清楚地解释代码。 - Fabrizio Bertoglio
2
@lancew 你是否已经查看了 https://www.npmjs.com/package/mc-schematic 这个构建在 https://www.npmjs.com/package/minecraft-data 基础上的工具?在我看来,它看起来非常有前途。 - Fitzi
Stackoverflow并不是为了让别人来解决你的问题,而是为了获得帮助并找到一个集体解决方案。 - Fabrizio Bertoglio
我肯定要求解码原始问题中的所有块的解决方案。虽然我对当前的编辑感到满意。我的希望是,有经验的人会分享他们的解决方案。 - lancew
显示剩余4条评论
1个回答

6

并不存在适用于所有区块的映射

你只能处理它

这就是为什么1.13和平整化完全删除元数据(metadata)并将所有块状态编码为字符串进行序列化(NBT是一个序列化数据格式,也是在到达Anvil格式之前几乎用于所有事情的格式)。在运行时,这些状态被解析并转换为真正的Object实例,避免了魔法值的需求。

因此,你无需解决facing = b & 0x03;,而可以得到{"facing":"east"}

不幸的是,如果你的版本低于1.13,你将不得不处理元数据魔法值,除非你可以访问游戏并调用getStateFromMeta()(1.10到1.12;我不确定1.8和1.9的情况,因为我从未为这些版本进行过mod修改)。


等等,那么对于从1.13保存的任何原理图,我不需要处理块状态位解码吗?标准原理图插件目前能够保存1.13的原理图吗? - lancew
1
我不知道1.13是否有任何原理图插件可用,或者原理图文件格式是否已更新以反映最新情况,但是如果有可用的插件,那么它必须支持新的BlockState格式(因为元数据已经完全消失)。 - Draco18s no longer trusts SE
谢谢。除非有人在时间限制内证明你错了,否则这个答案将获得赏金。 - lancew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接