命令/setblock & 方块状态 & 方块NBT - 指令教程7期

本系列所有教程仅面向最新Java版原版Minecraft,不涉及旧版本与插件、模组的命令、方块、实体和特性。
随时欢迎以评论区留言、加入粉丝群或B站私信等方式进行提问。

本期开始的指令教程会同步更新视频与专栏两个版本,内容完全相同,请依据自身喜好择一观看即可。


这是本期将要讲到的内容。我将循序渐进,为大家逐渐拆分讲解这条指令。

在学习新内容之前,首先复习一下 上一期的内容。

局部坐标:基于玩家的视角朝向,向左右、上下、前后进行偏移。不可与绝对坐标或相对坐标混用。在命令中通过^来使用局部坐标。
向前方传送2格
/tp ^ ^ ^2
在右后方2格生成Creeper
/summon creeper ^-2 ^ ^-2

Attributes:此NBT控制生物属性的基础值。

AttributeModifiers:为物品添加属性修饰符,修饰符会对属性基础值做出计算,从而改变生物属性的数值。

除此之外,需要特别注意攻击速度这个属性。我们知道剑的攻速是1.6,那如果生成一把attack_speed是1.6的剑,会怎么样?

你会发现她的攻击速度非常快,就像空手一样。为什么呢?

仔细观察 原版的剑 和 生成的剑 的属性,你会发现原版的描述是“1.6 攻击速度”,而生成的剑是“+1.6 攻击速度”。
也就是说,原版显示的是“修饰符”计算后的结果。玩家的攻速基础值是4.0,想做一把1.6攻速的剑,需要的修饰符是攻击速度-2.4。

如果还想还原原版的绿字描述,你还得用HideFlags隐藏掉实际的修饰符,再用display来模拟。
攻击力也有类似的情况:空手有1点攻击力,所以铁剑显示的6 攻击伤害,实际上是+5 攻击伤害。


知道了这些,再看上期的题目就很明显了,钠镓剑的2 攻击速度,是用display模拟的,她实际上是一个-2 攻击速度的修饰符。
另外,有经验的话你可能会记得,锋利魔咒提供的伤害加成会显示到绿字上,例如钻石剑的7 攻击伤害,附上锋利 II后显示为8.5。

所以钠镓剑的11.5伤害,减去锋利 X提供的5.5伤害,可以算出原本的攻击力是6.0。再减掉空手的1点攻击力,得到实际的修饰符是+5 攻击力。
知道了属性修饰符,剩下的Enchantments和display就好办了。另外,魔咒列表我也是用display模拟的,因为她实际显示的排序比较奇怪,所以我改成了display这个可控的显示。
这就是上期的题目了,还有问题可以在评论区留言。

那么接下来就是本期的内容了。原计划讲完三个建筑系的指令:放置/setblock、填充/fill和复制/clone。但发现篇幅太长,所以分两期来。这一期只讲一个/setblock,她是在1.7加入的指令,作用是放置1个方块,来看一条实例:
这个^ ^ ^1我们认识,是上一期讲到的局部坐标。她当然也可以是绝对坐标或相对坐标。chest是箱子的方块ID,所以这条指令是在自己的前方1格放置箱子。

那么我们就整理出了/setblock的基本格式:
方块ID一般和物品ID相同,有小部分例外,举两个例子:
红石的物品ID是redstone,红石线的方块ID是redstone_wire
橡木告示牌的物品ID是oak_sign,在墙上的橡木告示牌是oak_wall_sign
方块ID也可以在游戏内查到:把准星指向方块,在F3界面的右侧就是了。

这条指令只展示了/setblock的必填参数,我们来看一条更加完整的例子:
这里多了一个destroy是什么意思呢?她会先破坏掉原有的方块,然后才放置指定的方块空气。这条指令的实际效果是破坏掉了脚下的方块。

这个destroy叫做操作方式,除destroy以外,还有keep和replace。
keep:只替换空气。如果指定的坐标不是空气,就不会放置这个方块。
replace:默认模式,直接替换原有方块。
以上就是/setblock的完整格式了。

说了这么多,在哪里写方块的NBT呢?在讲这个之前,首先要知道2点:
第一,方块除了NBT以外,还有一个东西叫做方块状态。
方块状态记录了一些简单的数据,例如:
· 箱子的面朝方向
· 台阶的上下半
· 红石线的能量
方块的NBT记录了一些复杂的数据,例如:
· 熔炉已烧炼的配方(用于记录烧炼经验。经验熔炉原理)
· 容器内装着的物品。
第二,不是所有方块都有方块状态。例如石头和泥土没有任何值得记录的数据。有NBT的方块更少,例如楼梯只有方块状态而没有NBT。
大部分的方块状态和NBT还是某一类方块特有的,例如:
· power:只存在于红石线的方块状态,记录红石能量强度
· charges:只存在于重生锚的方块状态,记录剩余能量
· BurnTime:只存在于熔炉的NBT,记录剩余燃烧时间
· CookTime:只存在于熔炉的NBT,记录此配方已烧炼时间
基于这些原因,在教程内只能提及一些相对常见的内容。更多的、方块独有的、零零散散的内容,还得依靠大家自己查阅wiki。

首先介绍一个最常见的方块状态
facing:记录此方块的朝向。
Java版总共有约150个方块有方块状态,其中有近三分之一的方块都拥有facing这个状态。先展示一个实例。
这条指令是放置一个面朝东方的箱子。facing的可用值包括east、south、west和north。少部分方块还有up和down,例如按钮和拉杆。
告示牌没有facing,她使用rotation记录16个面朝方向
在墙上的告示牌仍使用facing
注意方块状态和NBT有两点不同:
一、方块状态使用等号而不是冒号
二、方块状态使用方括号而不是花括号
[ facing = west ]
这里的方括号不代表她是一个列表型数据,只是为了和NBT的花括号区分。多个方块状态仍用逗号分隔,例如:
这条指令是放置一个放在地上,面朝南方并且已经拉下的拉杆。

了解完了方块状态,接下来是NBT。这一期讲3个相对常见的方块NBT,分别是Lock、CustomName和Items。

Lock:存在于容器类方块。仅当玩家的手持物品名称与Lock完全相同时才能打开此容器。例:
只有手持名称为na的物品才能打开这个箱子。所有的容器方块都有Lock标签,包括熔炉和漏斗等等。通过这条指令我们也知道了如何给方块指定NBT,那要怎样同时指定方块状态呢?还是看实例,这是面朝西方且上锁的箱子
方块状态和NBT的顺序不能调换,且之间没有空格。

CustomName:存在于容器类方块。修改方块的名称。
她和生物的那个CustomName完全相同,不过方块没有CustomNameVisible。方块的名称会显示在容器的GUI界面上。
在不作弊的情况下,你也可以通过铁砧修改容器方块的物品名称,使其放置后带有CustomName。

Items:存在于容器类方块。记录容器内包含的所有物品。
很显然,一个容器可以装很多个物品,所以Items是一个列表,里面的每一项都是容器内的一个物品。
一个物品包含四组数据,分别是物品ID、数量、NBT和所在槽位,所以每一项都应该是一个集合。那么我们就整理出了Items的格式:
我们来分析一个实例:
id: "stick",代表这个物品是木棍
Count: 16,代表堆叠了16个
Slot: 0,是0号槽位,箱子的左上角
tag,代表这个物品的NBT
这一项代表箱子的左上角有16个名称为Ga的木棍。

在Items的格式中,Slot和tag是选填项。
Slot的默认值是0,若0号位已经有物品,则会覆盖掉原有物品
tag,不填就不填吧
另外,id、Count和tag这三个合起来叫做“物品通用标签”,所以Items的格式还能简写成这样:
最后是槽位的编号规则:左上角是0,然后从左到右,从上到下。
比较特殊的是熔炉,原料槽是0,燃料槽是1,输出槽是2。

好啦,这期的内容就是这些啦。来复习一下
命令 /setblock
操作方式包括destroy、keep和默认的replace
方块状态
facing:记录方块的朝向。
NBT
Lock:存在于容器类方块。仅当玩家的手持物品名称与Lock完全相同时才能打开此容器。
CustomName:存在于容器类方块。修改方块的名称。
Items:存在于容器类方块。记录容器内包含的所有物品。
虽然本期内容不多,但介绍的都是新概念,因此花费了较多的篇幅。

本期题目
放置一个熔炉,要求放置后的效果如图。


视频+专栏总点赞过500出下一期,介绍一个利用/clone实现的黑科技。
好,晚安~