• 欢迎加入MineBBS QQ讨论群:点击查看所有的官方讨论群
  • 我们将于近期对服务器进行迁移,服务可能中断至多2日。请各位安排好自己的访问计划,造成不便敬请谅解!
  • MineBBS入站考试已经上线!想要成为【正式会员】解锁更多功能吗?快来参与吧!【点我去看】

游戏日常 结构文件探索

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

在线会员

  • DJRsiri
  • Mian_Xing
  • Al2SO43-硫酸铝
后退
顶部 底部