第189章 ,/.

背包具有很多个物品栏,每个物品栏具有多个栏位,栏位储存着物品。因此,每个放在背包中的物品都具有栏位标签。物品有很多个种类,因此,物品还具有id标签。大部分类型的物品可以堆叠,因此,物品还具有数量标签。在Java1.13以下版本和基岩版中,同id的物品也可能不同,因此,物品在这些版本中还具有数据值标签。

本小章还未完,请点击下一页继续阅读后面精彩内容!

hasitem参数可以用来选取具有指定物品的实体。更准确一点来说,hasitem参数可以通过检测已选实体的背包中指定条件下的物品,来筛选实体。

hasitem参数的值比较特别,它的值可以是单个条件,也可以是由多个条件组成的条件列表。让我们来看看hasitem参数的一个条件项目到底可以指定哪些东西。

一个条件项目可以检测单个类型的物品,具体来说可以指定以下的参数:

item——物品id

data——物品的数据值[可选]

quantity——限制所选范围内物品的总数量[可选]

location——需要检测的物品栏[可选]

slot——需要检测的槽位[可选,必须配合location参数使用]

比如:

{item=bed,data=1}

这个条件可以筛选背包内具有橙色床的实体。不难发现,单个条件可以具有多个不同的筛选参数,并且外面要使用花括号({})包裹起来。

需要注意的是,data参数目前有个BUG,就是不能适用于方块类物品。如果你对一个方块类物品使用了data参数,那么不管你怎么改data的值,游戏总会认为该参数的值为0。怎么判断一个物品是不是方块类的呢?看物品的图标。如果图标是直接给出了方块的3D图像(也就是渲染图),比如羊毛,那就是方块类物品。像是床这种图标是专门画的就不是方块类物品,所以能够正常使用data参数。

quantity参数得好好讲一讲,它并不是说检测单个栏位内物品的数量,而是检测整个范围内的指定类型物品数量总和。比如:

{item=dirt,quantity=100..}

这个条件可以选择到那些背包内泥土数量达到甚至超过100块的实体。也就是说,假设这里有一个张三,背包内有两组泥土,那么这个条件就可以选择到它。

不难发现,quantity的值简直是基岩版的一股清流,竟然向Java1.13及以上的版本学习,采用了Java版先进的『两点法』,不错不错,值得表扬。而且,这参数还在Java版的基础上改造了一下,变成了还可以使用不等号进行反选:

{item=dirt,quantity=!100..}

这将会选取拥有泥土数量<100的实体。

对了,如果你指定了这个参数为0,那就可以选择『没有指定物品的实体』:

{item=dirt,quantity=0}

这将会选取背包内没有泥土的实体。

location参数可以缩小检测的范围到指定的物品栏。具体可以使用哪些物品栏以及这里的物品栏是个啥东西.....这就需要你前往第三十八章了解/replaceitem指令。

这里就先假装你已经搞懂了这些内容。举个例子:

{item=dirt,quantity=0,location=slot.enderchest}

这将会选取所有在其末影箱内没有泥土的实体。需要注意,对于玩家来说,默认是不会检测到末影箱的。也就是说,如果你在末影箱内放了一块泥土,那么{item=dirt,quantity=0}这个条件还是会选择到你,但{item=dirt,quantity=0,location=slot.enderchest}这个条件则不会。另外,即使是对于没有末影箱的非玩家实体,游戏仍然会假装其具有末影箱,然后又因为游戏假装出来的末影箱内没有泥土,导致上述条件也会选择到非玩家实体。

在使用location参数时,还可以更进一步使用slot参数来缩小检测范围到指定的栏位。比如:

{item=dirt,quantity=1..,location=slot.enderchest,slot=0}

这将会选取到所有在其末影箱左上角第一格内放有泥土的玩家。和quantity一样,这参数同样也支持升级后的『两点法』:

{item=dirt,quantity=1..,location=slot.enderchest,slot=1..}

\\选取到所有在其末影箱内除了左上角第一格外其他位置放有泥土的玩家\\

{item=dirt,quantity=1..,location=slot.enderchest,slot=!0}

\\同上\\

上面这些都是一个条件内可以弄的参数,hasitem参数的值也确实可以直接放入单个条件:

/testfor @a[hasitem={item=dirt,quantity=1..,location=slot.enderchest,slot=!0}]

本小章还未完,请点击下一页继续阅读后面精彩内容!

但是如果要多个条件呢?这时候就需要用到列表:

@a[hasitem=[{item=dirt},{item=apple}]]

这将会选择到背包内同时具有泥土和苹果的玩家。

不难发现,在多个条件组成的列表中,每个条件也是使用逗号分开,列表最外侧被中括号([])包起来。

这就是hasitem参数的具体使用方法,其中部分内容超纲了一些,但总体上还是易于理解的。

——NBT——

——进度——

——谓词——

上面这三个均为Java版独有,且我们还未接触到,暂时先留个坑,以后再填。

附录:目标选择器发展历史

Java

1.4.2——加入目标选择器,最初只有@a、@r、@p三个变量

1.8——加入了@e变量和dx、dy、dz参数

1.9——m参数现在接受游戏模式全称和缩写,在此版本之前只支持数字ID。并加入了tag参数。

1.11——移除了隐含目标选择器(如@a[26,65,-28],代表@a[x=26,y=65,z=-28]),并且错误的目标选择器不再略过,而是会报错。

1.12——加入了@s变量

1.13——加入了NBT和进度advancements参数,并对原本的参数进行大改

1.15——加入了谓词predicate

基岩版

1.16.100——加入了family参数

1.17.10——加入@initiator变量用于NPC

1.18.30——加入了hasitem参数

(注:网易版我的世界截止目前[2022.8.3]仅仅更新到1.18.10版本,因此没有hasitem参数)