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

时间:2019-04-23 17:46:25

标签: javascript minecraft decoding

我正在用following structure解析schematic file

  

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

中      

Named Binary Tag (NBT) file format是Minecraft游戏用于各种事物的极其简单的结构化二进制格式

Data Values块定义了Minecraft中的地形部分。

我检索每个Minecraft块的the block data,并且需要弄清楚如何解码这些字节。这是an example for the Stairs Minecraft Block

例如the stairs block data包括:

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);

但是,对于每种块类型,位的解释都不同,这在我能找到的任何地方都没有定义。

2 个答案:

答案 0 :(得分:4)

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

您只需要处理它

这是为什么 1.13和The Flattening会完全删除元数据,导致序列化时所有块状态均编码为字符串(NBT是一种序列化数据格式,在到达之前几乎用于所有内容铁砧格式)。在运行时,将解析这些状态并将其转换为真实的Object实例,从而无需使用魔术值。

因此您不必弄清楚facing = b & 0x03;会得到{"facing":"east"}

不幸的是,如果您在1.13以下工作,则必须处理元数据魔术值,并且除非您具有对游戏的运行时访问权限并可以调用getStateFromMeta()(1.10到1.12,否则无法解决);坐着1.8和1.9,因为我从未修改过这些版本。)

答案 1 :(得分:0)

我不知道任何现有的jslib都可以进行这种“完全解析”。

如果要检索所有块的blockState,则需要创建自己的逻辑(就像使用楼梯一样),根据要支持的每个块的blockId解析blockState。

也许您想为每个blockState创建一个类并解析原始值,并返回正确的块对象。 Minecraft,Minecraft Server,Bukkit / Spigot就是这样。

您可以将该页面用作所有blockState的引用:https://minecraft.gamepedia.com/Block_states