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

Javascript 如何解码Minecraft原理图(nbt)文件中的数据(即块状态)字节?,javascript,minecraft,decoding,Javascript,Minecraft,Decoding,我正在用 社区创建了.schematic文件格式,用于存储Minecraft world的各个部分,供第三方程序使用。示意图在 是一种非常简单的结构化二进制格式,由Minecraft游戏用于多种用途 块定义了雷管中的部分地形 我正在检索每一个Minecraft块,需要弄清楚如何解码这些字节。这是 例如: 我可以使用解析整个原理图文件,这使我能够访问块数据,如下所示: var b = schem.value.Data.value[index]; 我用以下代码解码楼梯块数据位数据 var fac

我正在用

社区创建了.schematic文件格式,用于存储Minecraft world的各个部分,供第三方程序使用。示意图在

是一种非常简单的结构化二进制格式,由Minecraft游戏用于多种用途

块定义了雷管中的部分地形

我正在检索每一个Minecraft块,需要弄清楚如何解码这些字节。这是

例如:

我可以使用解析整个原理图文件,这使我能够访问块数据,如下所示:

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.13和扁平化会完全删除元数据,从而导致所有块状态在序列化时编码为字符串(NBT是一种序列化数据格式,在达到Anvil格式之前几乎用于所有内容)。在运行时,这些状态被解析并转化为true
Object
实例,从而避免了对神奇值的需要

因此,您不必计算出
faceting=b&0x03
您将得到
{“facing”:“east”}


不幸的是,如果你在1.13以下工作,你将不得不处理元数据魔法值,除非你有游戏的运行时访问权限,并且可以调用
getStateFromMeta()
(1.10到1.12;不确定1.8和1.9的位置,因为我从未为这些版本修改过).

你能用一个清晰的、可重复的或易于理解的例子更新你的问题吗?完成,请参见编辑2。我重构了你的问题,但仍然不清楚:1)
schem.value.Data.value[index]
变量
b
的值是多少,schem的值是多少等等。。。也许您想创建一个存根并保存这些值,以便我们可以快速重新创建您的场景。2)
face=data&0x03;的输出是什么和其余的代码。试着编一些小把戏或清楚地解释代码。@lancew您已经检查了哪些构建在哪些基础上了吗?对我来说,这看起来很有前途,@FabrizioBertoglio谢谢你,我可以看出现在读起来容易多了。我进一步编辑以保留原始目的。等等,对于从1.13保存的任何示意图,我不必处理块状态位解码?标准原理图插件当前是否能够保存1.13版的原理图?我不知道1.13版是否有原理图插件,或者原理图文件格式是否已更新以反映,但如果有,则必须支持新的BlockState格式(因为元数据已100%消失)。谢谢。除非有人在期限内证明你错了,否则这个答案会得到赏金。