第七十一章 條件子命令
?。ㄓ?022/7/15重寫)
還記得那些被execute替代的指令嗎?其中,/testfor、/testforblock、/testforblocks和/scoreboard players test的功能被合并到了條件子命令中,也就是if和unless子命令。
if和unless這兩個子命令雖說是子命令,但它們畢竟是多條指令融合而成的,自然而然也就有『子命令』的『子命令』,所以說我們是否可以把子命令的子命令稱之為execute的『孫子命令』呢?
?。ɑ?p> 雖然if和unless這兩個子命令有完全相同的格式,但它們倆的效果是完全相反的:
if——如果給出的條件為真(true),也就是條件成立,即通過檢測,運行指令
unless——如果給出的條件為假(false),也就是條件不成立,即通過檢測,運行指令
如果你看不懂上面的描述,沒關(guān)系,待會我們會舉些例子,畢竟上面的描述比較偏向于編程思維。
條件子命令的子命令,截止Minecraft Java1.19版本,一共有六個:
block ——探測指定位置是否為某種方塊
blocks ——將指定區(qū)域與另外一個指定區(qū)域進行對比
entity ——探測指定實體是否存在。
score ——探測指定玩家在指定計分項上的分數(shù)是否與另一個玩家在指定計分項上的分數(shù)符合指定的關(guān)系
data ——探測指定方塊、實體和存儲NBT是否擁有指定的NBT標(biāo)簽
predicate ——檢查指定謂詞是否通過
其中,data子命令我們放到以后講NBT時再來(這玩意兒作為一個孫子命令,竟然還有三個子命令,也就是說execute有曾孫子了),predicate子命令我們在上一章已經(jīng)遇到過了,所以我們這邊就先來看看這剩下的四個子命令:
block、blocks、entity和score
其中,前三者實際上根本就不用講。為何呢?讓我們看一下它們的用法:
... if|unless block <方塊位置><方塊ID或標(biāo)簽>...
... if|unless blocks <源區(qū)域起始坐標(biāo)><源區(qū)域終止坐標(biāo)><比較區(qū)域下西北角坐標(biāo)><對比模式:masked|all>...
... if|unless entity <檢測目標(biāo):目標(biāo)選擇器>...
是不是有些熟悉?這難不成就是:
Java1.13之前
/testfor <指定目標(biāo):目標(biāo)選擇器>[探測NBT是否符合]
/testforblock <探測位置:坐標(biāo)><方塊ID:字符串>[數(shù)據(jù)值:整數(shù)]
/testforblock <探測位置:坐標(biāo)><方塊ID:字符串>[方塊狀態(tài)]
/testforblocks <源區(qū)域起始坐標(biāo)><源區(qū)域終止坐標(biāo)><比較區(qū)域下西北角坐標(biāo)>[<模式: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,其效果是:
將所有在線且活著的玩家分別作為執(zhí)行者,他們的位置作為執(zhí)行位置,他們的旋轉(zhuǎn)角度作為執(zhí)行朝向,如果執(zhí)行者周圍1米有一個叫做『回城雪球』的雪球掉落物,就給執(zhí)行者自己添加上標(biāo)簽hub。
其中,我們重點看一下if子命令這一段:
if entity @e[distance=..1,nbt=物品是叫做『回城雪球』的雪球,type=item,limit=1,sort=nearest]
這個if子命令用到了entity,也就是相當(dāng)于1.13之前的testfor指令,用于探測指定實體是否存在。在這邊,entity的參數(shù)就不講了,涉及到nbt,你大概知道是探測一個叫做『回城雪球』的掉落物就行。
讓我們試一試將上面這一段if子命令轉(zhuǎn)化為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時引用的例子,其作用是『檢測執(zhí)行者腳下3×3的區(qū)域是否和頭頂3×3的區(qū)域完全一樣』,現(xiàn)在我們嘗試將這一串指令轉(zhuǎn)化為1.13+的版本:
/execute if blocks ~-1 ~-1 ~-1 ~1 ~-1 ~1 ~-1 ~2 ~-1 all
這個1.13+版本的指令和上面的testforblocks例子的效果是完全一樣的,唯一需要注意的是比較模式參數(shù)從可選變成了必選,并且由于testforblocks默認就是all比較模式,所以轉(zhuǎn)化后要在最后加上個『all』。
你可能會疑惑:run呢?run子命令呢?我那么大一個run呢?
其實,當(dāng)一個execute指令中含有條件子命令時,就不一定要含有run子命令了。因為條件子命令也可以看做是一個具有功能的,能夠返回東西的指令(畢竟原來就是由幾條單獨指令結(jié)合在一起的嘛)。
例子三:
/execute as @a at @s if block ~~-1 ~ redstone_block run camerashake add @s
這條指令并不適用于Java版,而是適用于基巖版。
沒錯,這個例子是使用目前基巖版還在測試中的新版execute指令寫成的,不難發(fā)現(xiàn)基巖版的新版execute和Java版的幾乎沒差別。
這條指令的作用是:
將所有玩家分別作為執(zhí)行者,將執(zhí)行者的位置作為執(zhí)行位置,將執(zhí)行者的旋轉(zhuǎn)角度作為執(zhí)行朝向,如果執(zhí)行位置下方一格方塊(玩家腳底下的方塊)是紅石塊,就搖晃玩家的鏡頭(站久就變鬼畜了)。
其中,指令camerashake是基巖版目前較為冷門的一個指令,因為是新添加的所以還有許多人不太了解。其實基巖版在1.16版本時添加了許多有用的指令,以后可能會專門抽出來幾章講一講。
既然說到了基巖版的新版execute,那就不妨來看看基巖版的條件子命令格式和Java版有何不同:
... if|unless block <坐標(biāo)><方塊ID>[方塊數(shù)據(jù)值|方塊狀態(tài)]...
看看,基巖版做得多么人性化,不一定要填寫的參數(shù)就不一定要填寫,一定要填寫的參數(shù)就一定要填寫,在這一方面Java版的if blocks就做得不好,為什么一定要填寫『比較模式』呢?
現(xiàn)在,block、blocks和entity三條子命令我們都會用了,接下來我們來看看score:
... if|unless score <A目標(biāo)>