获取结构方块/give @p structure_bloc,结构方块id是minecraft:structure_block,数字id是255,不能直接从创造模式拿出,必须使用give指令。放置/破坏/开启它需要服务器权限。这个方块有4种模式,分别是Save Load Corner Data。模式会使用NBT中的mode字符串保存。同时也会用方块元数据0~3保存。//当不一致时会按照NBT修正方块元数据。//
其中data模式只在游戏自己自然生成建筑时能够发挥作用。我们不会详细介绍它。
save模式可以将结构保存成NBT文件。首先输入相对位置(在32到-32之间(含)的整数)(NBT中posX posY posZ int)和结构大小(比32小(含)的整数)(NBT中sizeX sizeY sizeZ int)(技巧:可以使用tab切换光标到下一个文本框)。相对位置以结构方块作为坐标原点。当在GUI中按下save按键时即可将选中的区域用结构名称(NBT中name 字符串)为名字保存成.nbt文件。如果该文件已存在则会覆盖已有的文件。保存在存档文件夹中structures文件夹。若使用红石激活将不会保存成文件,只能够临时使用。使用起来和真的生成了文件的情形别无二致,只是在游戏退出后即消失。显示隐形方块按钮可以在选中的所有的空气方块和结构方块上做出标记。保存时会略过结构虚空方块(因此结构虚空加载时不替换原有方块。结构中若真的有结构虚空方块也是会加载的)。若包括实体(NBT中ignoreEntities byte)开了,则会将碰撞箱和结构方块选择范围有公共部分的实体也保存进文件。
corner模式用于辅助save模式。为了避免仔细计算相对位置和结构大小,可以将两个同样结构名称(NBT中name 字符串)corner方块放在结构外包长方体相对定点。在同样名字的save模式方块中点击detect就能够自动设置相对位置和结构大小。如果只找到一个同名corner模式方块,save方块会把自己当作另外一个角。(技巧:虽然禁止空白名字结构保存,但是探测时可以。可以先将save和corner名字留空,探测好后填入save中的名字并保存。)
load模式可以将nbt文件加载入存档。它会寻找以结构名称(NBT中name 字符串)为名的结构文件用于加载。//在按下加载按钮时,为了防止意外的位置错误,如果发现结构方块的结构大小(NBT中sizeX sizeY sizeZ int)(在这里不显示)和结构文件中的不一致,则不会加载,它会关闭GUI,将结构大小改成文件中要求的,让你检查是否正确。//如果一致就会直接加载了。这个过程也可以用红石完成。红石加载不会进行这个检查,无论是否一致都会直接加载。加载时也可以选择是否将文件中可能存在的实体一同加载。当然加载时会无视实体的pos和UUID这些NBT(但是其他的自然不会无视,造成shulker仍然记住自己所在的方块的坐标,一旦加载会立刻瞬移过去……)。也可以选择绕y轴旋转90°的倍数或者前后反射或者左右反射。(NBT中rotation mirror 字符串)。可以隐藏白色边框(NBT中showboundingbox byte)。
加载时可以选择随机性部分加载。你可以在加载前填入结构完整性(0~1实数,含0、1)和种子(integrity f seed L)。结构完整性代表了里面每个方块被放置的概率。//可以认为每个方块的放置与否是独立的。//若种子填入0是一个特例,表明会随机选择种子。//方块防止与否和种子、结构完整性、和该方块在结构文件中的顺序(不是指它在结构中的坐标)(比如同样的种子和概率,加载一个游戏产生的5*1*5的结构和10*1*10的结构,前者在前两x方向的列的放置与否和后者在第一个x方向的列的放置与否是一致的)//。//在种子相同的情况下,如果某个方块在小的概率下放置,那么在较大种子下一定放置。(生成0至1随机数然后若小于等于结构完整性就放置?)//在游戏第一次被要求加载某个结构的时候,游戏会读取这个结构。之后再要求的时候,游戏不会再读取。
结构文件保存在存档中structures文件夹(游戏自带的在jar文件中assets/minecraft/structures)。是压缩的nbt格式。详见http://minecraft.gamepedia.com/Structure_block_file_format。可以看见里面有三个list,分别是blocks entities和palette。
palette中有顺序地存储了结构中出现的各种方块(和他们的不同方块状态的变种)。blocks有顺序地存放了每个方块在结构中的位置和他的种类在palette中的编号(还有NBT,如果有的话)上文说的“方块在结构文件中的顺序”就是指在block这个list中的顺序。entities中是结构中每个实体在结构中的位置,还有取整后的位置(作用不明)。
可见,文件中的方块和实体的位置完全可以超出结构大小,甚至超过32*32*32的范围(加载几个区块也是可以的,当然会引起一些卡顿)。可见结构大小只是一个让使用结构的人方便用的参考,他可以通过白色的外框知道放置的位置是否合适。当然结构大小如果有任意一个值超过32,就不能使用GUI加载了(这个值会被自动改回离他最近的符合要求的数,使得结构方块的结构大小和文件要求的不一致,其结果在上文已经写了)。但仍然能用红石加载。
save方块在载入文件的时候按照坐标的字典序将方块写入文件。加载时方块按照方块在结构文件中的顺序依次放置。比如用加载红石块的方法激活命令方块,命令方块会按照红石块的的放置顺序激活。如果有两个方块占据在同一个位置,后放置的会将前面的覆盖。所以如果在list里先有一个红石块,后有一个石块在同一个位置,被放置的位置本来是空气,结构完整性是0.5,那么加载后有二分之一的概率是石块,四分之一的概率是红石块,四分之一的概率是空气。
当结构被加载时,文件中每个方块都会引起方块更新。即使方块前后没有变化,或者随机放置时该方块没被随机到(人工更新某区域内方块(概率设为0))。如果方块前后没有变化,不会引起观察者响应//(除非该方快具有方块实体)//。如果方块结构中有两个方块占据在同一个位置,比如一开始是红石块,文件要求先换成石头再换成红石块,也会让观察者响应,虽然前后都是红石块。
结构方块有一个充能标志(powered byte)。若加载模式结构方块发现自己被充能(或者接触充能方块)并且充能标志为0,自然会加载并且把充能标志改成1。但是,被加载的或者clone的//或者fill的或者setblock的//或者手动放置到被充能位置的加载模式方块不会自己更新自己。也就是说放(不论什么方式)的时候就放在红石块边上的加载模式方块处于BUD态。当然,如果被加载的或clone的时候相邻位置有其他方块一同被加载(clone),那么就会更新到它让他加载(当然,必须周围有红石块之类的和他接触)(一同加载的方块产生更新条件见上)。
那么如何用cb在某地加载结构呢?可以想到先setblock结构方块然后setblock红石块。但如果直接把相邻的结构方块和红石块一同clone过去(或者想让加载的结构里的结构方块继续加载其他的结构使得不修改文件立即加载很大的建筑),结构方块已经是被激活的,clone过去的也是被激活的,这时就不会让结构方块激活。所以应当让使用blockdata指令修改clone前的结构方块的充能标志,再它被clone过去的时候结构方块周围的方块放置更新它让他加载。
结构方块有一个自我保护机制。具体保护机制触发条件并不清楚。似乎是为了保护自己不陷入死循环。他会将“肇事”的加载模式结构方块替换成屏障方块。