首頁 游戲

Minecraft指令手冊

第七十一章 條件子命令

Minecraft指令手冊 你好MC 546 2020-02-09 15:31:00

 ?。ㄓ?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)>

  ... if|unless score <A目標(biāo)>

  雖然score是用來替代scoreboard players test的,但這個格式第一眼給人的感覺卻像是另外一個東西:scoreboard players operation

  但這兩個東西有很大的區(qū)別——前者(score)僅僅是對比分數(shù),并不會修改兩個分數(shù);后者(scoreboard players operation)雖然也可以對比,但更多的作用是修改分數(shù)。

  而且,score可比scoreboard players operation要簡單多了,因為你并不需要考慮A新A舊,以及有多個比較目標(biāo)的情況,其中的目標(biāo)選擇器都只能選取一個目標(biāo)(看來Mojang還是很人性化的對不對?)。

  讓我們來仔細看看上面的格式,可以發(fā)現(xiàn)相比scoreboard players test,新的score不僅僅可以用來測試單個分數(shù),還可以比較兩個分數(shù)。

  其中,前面部分的『A目標(biāo)』『a計分項』兩個參數(shù),以及后面的『B目標(biāo)』『b計分項』兩個參數(shù),就不需要我多說了吧?前者是用于指定『式子』的左側(cè)分數(shù)x,后者是用于指定『式子』的右側(cè)分數(shù)y。

  中間部分的『比較模式』參數(shù),也就是填寫在數(shù)學(xué)上大名鼎鼎的五個符號:

  >——如果分數(shù)x大于分數(shù)y,則為真

  >=——如果分數(shù)x大于等于分數(shù)y,則為真

  =——如果分數(shù)x等于分數(shù)y,則為真

  <=——如果分數(shù)x小于等于分數(shù)y,則為真

  <——如果分數(shù)x小于分數(shù)y,則為真

  舉個例子:

  /scoreboard objectives add death deathCount “死亡榜“

  /scoreboard objectives add duibi dummy “分數(shù)對比專用“

  /scoreboard players set many_dead_times duibi 50

  /execute as @a if score @s death >= many_dead_times duibi run tellraw @s [{“text“:“兄弟,你已經(jīng)死了“},{“score“:{“name“:“@s“,“objective“:“death“},“color“:“red“},{“text“:“次了!“,“color“:“reset“}]

  前面的三條指令就不多講了,你應(yīng)該知道是干什么的。最后一條execute指令,將會讓所有玩家分別作為執(zhí)行者,如果其死亡次數(shù)(death計分項中的分數(shù))大于等于50(也就是many_dead_times這個假玩家在duibi計分項中的值),玩家自己就會收到一條消息:

  兄弟,你已經(jīng)死了x次了!

  其中,x指的是這名玩家在計分板death上的分數(shù),也就是他死亡的次數(shù)。

  除去這個tellraw內(nèi)的JSON文本有一部分我們沒學(xué)過以外,其他部分還是很容易理解的。

  至于matches模式的比較就更簡單了,這就是原本players test子命令的功能。其中的『范圍』也就是采用和目標(biāo)選擇器一樣的『兩點法』。舉個例子:

  /execute as @a if score @s death matches 50.. run 同上

  這是上面例子的簡化版,功能還是一樣的。

  值得注意的是,在基巖版中,『兩點法』可以使用!來反選。比如:

  /execute if score @s death matches !10..15

  這將會測試執(zhí)行者自己在death計分板上的分數(shù),如果分數(shù)不在10~15(含)的范圍內(nèi)就會測試通過。同樣的,基巖版在其他能用到這種『兩點法』的地方基本上也能夠用『!』來反選,比如目標(biāo)選擇器。

  最后,我們來看看前一章節(jié)就已經(jīng)碰到過的predicate子命令:

  ... if|unless predicate <謂詞條件ID>...

  什么是謂詞?我在上一章已經(jīng)解釋過了:

  『在我們講數(shù)據(jù)包之前(也有可能永遠不會講到),你可以將這東西當(dāng)作是一個打包好的『判斷函數(shù)』,在這個『判斷函數(shù)』里面寫了一些東西,可以判斷當(dāng)前游戲的情況是否符合指定的條件,如果符合則通過判斷,如果不符合則不通過判斷。比如里面寫了一個『當(dāng)前游戲正在下雨』的條件,當(dāng)這個條件被調(diào)用時就會看看現(xiàn)在游戲是否在下雨,如果下雨就會通過判斷,你的指令也就能夠運行,反之就不會運行。』

  舉個簡單的例子,假設(shè)有一位大佬做了一個數(shù)據(jù)包,其命名空間為『the_dark_forest』,里面有一個叫做『isRaining.json』的謂詞條件。這個條件會判斷當(dāng)前世界是否在下雨,如果下的是普通的雨,就隨機50%的幾率使條件成立,如果下的是暴雨,這個幾率會提升到80%。

  我們可以通過如下命令來調(diào)用這個謂詞條件:

  /execute ... if predicate the_dark_forest:isRaining ...

  如果你調(diào)用這個謂詞條件時,游戲里正在下普通的雨,那么你的指令就有50%的幾率能夠運行。如果下的是雷暴雨,那么就有80%的幾率會運行。如果是晴天,那么不可能會運行。

  當(dāng)然,你也可以將if改為unless來反轉(zhuǎn)條件:

  /execute ... unless predicate the_dark_forest:isRaining ...

  這條指令和上面指令的運行條件完全是反著來的:如果是晴天,那么必定會運行;如果是普通的雨天,有50%的幾率會運行;如果是雷暴雨,只剩下20%的幾率會運行。

  現(xiàn)在你懂了吧?讓我們來做幾道題目,鞏固一下知識。

  第一題:請寫出下列execute指令成功運行的條件

 ?、?execute as @e[type=item] at @s if block ~~-1 ~ minecraft:grass_block run kill @s

 ?、?execute positioned 1.0 1.0 1.0 if block ~~~ minecraft:air if entity @e[distance=..2,limit=1,sort=nearest]

 ?、?execute unless blocks ~1 ~1 ~1 ~-1 ~1 ~-1 0 0 0 all

  第二題:請寫出下列execute指令最大的成功運行次數(shù)

 ?、?execute as @e[limit=10] rotated as @a[limit=10] run tp 1 1 1

 ?、?execute if predicate the_dark_forest:isRaining

 ?、?execute if score @e = score @e run say hello!

  所以這就是我們本章的全部內(nèi)容,下一章我們將會來初步了解一下存儲子命令。

  ......

  ......

  ......

  ......

  ......

  ......

  參考答案

  第一題:

 ?、偎芯S度的已加載區(qū)塊內(nèi)必須要有掉落物類型的實體,且至少有一個掉落物的下方方塊是草方塊

 ?、谧鴺?biāo)(1.0,1.0,1.0)處的方塊必須是一個空氣方塊,且范圍2米內(nèi)必須要有一個實體存在。

 ?、蹐?zhí)行地點上方3×3的范圍與范圍(0,0,0)-(3,0,3)完全一致,且執(zhí)行地點上方3×3的范圍沒有超出世界邊界

  第二題:

 ?、?00(as的參數(shù)指定了10個實體,rotated的參數(shù)也指定了10個實體)

 ?、?(跟if子命令沒關(guān)系)

 ?、?(在Java版中,score子命令的兩個目標(biāo)選擇器參數(shù)都不能指定多個實體)或1(在基巖版中,只要@e實際只選擇到了1個實體就行)

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設(shè)置
設(shè)置
書架
加入書架
書頁
返回書頁
指南