[MD]
本文是[该文章](https://github.com/DreamHelium/experiences/blob/main/zh/minecraft/struct.md)的简化版本,可以阅读[该文章](https://github.com/DreamHelium/experiences/blob/main/zh/minecraft/struct-remake.md)以获取最新的修改。
也许你曾经好奇我们应该如何存储如此复杂的结构并且分享给他人,而现在我们有个暂时的方案,就是使用结构文件。据我所知,分别有三个模组使用三种不同的格式的结构文件,它们分别是:
- 原版NBT格式(原版结构方块和**机械动力蓝图**)
- 投影(`litematica`)格式(**投影模组**)
- SpongeSchematic(**创世神(WorldEdit)**)
那么接下来我们来介绍一下这些文件格式。
# 机制
其实这些格式都有一个共通的机制,就是先存储其中含有的方块种类和属性(文件中称其为`palette`(调色板)),然后再按一定的方式去存储方块。至于实体则是单独存储。
# 调色板
调色板其实就比较简单了,就是按一定顺序存储其中含有的方块种类。**原版NBT格式**和**投影**都使用一个集合(`Compound`
)去存储其名字和属性。
而**SpongeSchematic**比较生草,就是在键上将其信息全部列出,然后存成一个数字。具体的例子就像:
`xxx:xxx[xxx=xxx,xxx=xxx]`
# 存储方块的形式
**原版NBT格式**是一个方块一个集合(`Compound`),其中存储着方块的`state`(在调色板中的位置),`pos`(方块位置),如果是方块实体还会存储方块的
`nbt`实体信息。
因此该格式是可以乱序存储的,但是其占空间也是最大的。有个投机取巧的方式就是不存储空气方块,由实现自行留空。
**投影格式**使用由位存储的`BlockStates`
来存储各个位置上的方块在调色板中的位置,具体的可以阅读[细节?](https://github.com/maruohon/litematica/issues/53)。
**SpongeSchematic**使用`varint`
来存储方块在调色板上的位置,这个和投影很像,但是理论空间占用会更小。具体可以看[Specification](https://github.com/SpongePowered/Schematic-Specification)。
# 存储实体的形式
其实三种都差不多,不过由于`WorldEdit`不存储实体,导致我一直以为**SpongeSchematic**是不兼容实体的,这是错误的。在我能做出比较新的该格式的文件后我会做个测试。
# 谢谢阅读!
真的有人看吗?
[/MD]
- 内容版权许可
- CC BY-SA 署名-相同方式共享