第189章 ,/.

(于2022/7/15重写)

还记得那些被execute替代的指令吗?其中,/testfor、/testforblock、/testforblocks和/scoreboard players test的功能被合并到了条件子命令中,也就是if和unless子命令。

if和unless这两个子命令虽说是子命令,但它们毕竟是多条指令融合而成的,自然而然也就有『子命令』的『子命令』,所以说我们是否可以把子命令的子命令称之为execute的『孙子命令』呢?

(滑稽)

虽然if和unless这两个子命令有完全相同的格式,但它们俩的效果是完全相反的:

if——如果给出的条件为真(true),也就是条件成立,即通过检测,运行指令

unless——如果给出的条件为假(false),也就是条件不成立,即通过检测,运行指令

如果你看不懂上面的描述,没关系,待会我们会举些例子,毕竟上面的描述比较偏向于编程思维。

条件子命令的子命令,截止Minecraft Java1.19版本,一共有六个:

block ——探测指定位置是否为某种方块

blocks ——将指定区域与另外一个指定区域进行对比

entity ——探测指定实体是否存在。

score ——探测指定玩家在指定计分项上的分数是否与另一个玩家在指定计分项上的分数符合指定的关系

data ——探测指定方块、实体和存储NBT是否拥有指定的NBT标签

predicate ——检查指定谓词是否通过

其中,data子命令我们放到以后讲NBT时再来(这玩意儿作为一个孙子命令,竟然还有三个子命令,也就是说execute有曾孙子了),predicate子命令我们在上一章已经遇到过了,所以我们这边就先来看看这剩下的四个子命令:

block、blocks、entity和score

其中,前三者实际上根本就不用讲。为何呢?让我们看一下它们的用法:

... if|unless block <方块位置><方块ID或标签>...

... if|unless blocks <源区域起始坐标><源区域终止坐标><比较区域下西北角坐标><对比模式:masked|all>...

... if|unless entity <检测目标:目标选择器>...

是不是有些熟悉?这难不成就是:

Java1.13之前

/testfor <指定目标:目标选择器>[探测NBT是否符合]

/testforblock <探测位置:坐标><方块ID:字符串>[数据值:整数]

/testforblock <探测位置:坐标><方块ID:字符串>[方块状态]

/testforblocks <源区域起始坐标><源区域终止坐标><比较区域下西北角坐标>[<模式:masked|all>]

Mojang这是直接移植过来的啊,模式名都不带改一下的。

既然这些子命令和被删除的那些指令用法几乎完全一样,我们这边也就不多讲了,直接上例子。

例子一:

/execute as @e[type=player] at @s if entity @e[distance=..1,nbt={Item:{id:“minecraft:snowball“,tag:{display:{Name:'{“text“:“回城雪球“}'}}}},type=item,limit=1,sort=nearest] run tag @s add hub

这条execute有四个子命令:as、at、if和run,其效果是:

将所有在线且活着的玩家分别作为执行者,他们的位置作为执行位置,他们的旋转角度作为执行朝向,如果执行者周围1米有一个叫做『回城雪球』的雪球掉落物,就给执行者自己添加上标签hub。

其中,我们重点看一下if子命令这一段:

if entity @e[distance=..1,nbt=物品是叫做『回城雪球』的雪球,type=item,limit=1,sort=nearest]

这个if子命令用到了entity,也就是相当于1.13之前的testfor指令,用于探测指定实体是否存在。在这边,entity的参数就不讲了,涉及到nbt,你大概知道是探测一个叫做『回城雪球』的掉落物就行。

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

让我们试一试将上面这一段if子命令转化为testfor指令:

/testfor @e[r=1,name=回城雪球,type=item,c=1]

是不是立马就理解了?所以,在使用if子命令的block、entity和blocks子命令时,不妨可以回忆回忆以前的指令是怎么个用法。

例子二:

/testforblocks ~-1 ~-1 ~-1 ~1 ~-1 ~1 ~-1 ~2 ~-1

这是我们在第三十七章讲/testforblocks时引用的例子,其作用是『检测执行者脚下3×3的区域是否和头顶3×3的区域完全一样』,现在我们尝试将这一串指令转化为1.13+的版本: