游戏日常 结构文件探索

[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 署名-相同方式共享

在线会员

  • kevin2025
  • CHL_chun
  • Allen13n
  • yatokong
  • PixelUtopia-像素乌托邦
  • AnBirthd
  • 86505087
  • KURE
  • Drbiaodi
  • 星雲Nebulae
  • 波旬W
  • 七六
  • Sing_
  • mrchen
  • wldxxs
  • mc_xiaoQAQ_
  • 秋瑾瑾
后退
顶部 底部