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