首頁(yè) 游戲

Minecraft指令手冊(cè)

第七十一章 條件子命令

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

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

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

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

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

  而且,score可比scoreboard players operation要簡(jiǎn)單多了,因?yàn)槟悴⒉恍枰紤]A新A舊,以及有多個(gè)比較目標(biāo)的情況,其中的目標(biāo)選擇器都只能選取一個(gè)目標(biāo)(看來(lái)Mojang還是很人性化的對(duì)不對(duì)?)。

  讓我們來(lái)仔細(xì)看看上面的格式,可以發(fā)現(xiàn)相比scoreboard players test,新的score不僅僅可以用來(lái)測(cè)試單個(gè)分?jǐn)?shù),還可以比較兩個(gè)分?jǐn)?shù)。

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

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

  >——如果分?jǐn)?shù)x大于分?jǐn)?shù)y,則為真

  >=——如果分?jǐn)?shù)x大于等于分?jǐn)?shù)y,則為真

  =——如果分?jǐn)?shù)x等于分?jǐn)?shù)y,則為真

  <=——如果分?jǐn)?shù)x小于等于分?jǐn)?shù)y,則為真

  <——如果分?jǐn)?shù)x小于分?jǐn)?shù)y,則為真

  舉個(gè)例子:

  /scoreboard objectives add death deathCount “死亡榜“

  /scoreboard objectives add duibi dummy “分?jǐn)?shù)對(duì)比專用“

  /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指令,將會(huì)讓所有玩家分別作為執(zhí)行者,如果其死亡次數(shù)(death計(jì)分項(xiàng)中的分?jǐn)?shù))大于等于50(也就是many_dead_times這個(gè)假玩家在duibi計(jì)分項(xiàng)中的值),玩家自己就會(huì)收到一條消息:

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

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

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

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

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

  這是上面例子的簡(jiǎn)化版,功能還是一樣的。

  值得注意的是,在基巖版中,『兩點(diǎn)法』可以使用!來(lái)反選。比如:

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

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

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

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

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

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

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

  我們可以通過(guò)如下命令來(lái)調(diào)用這個(gè)謂詞條件:

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

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

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

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

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

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

  第一題:請(qǐng)寫出下列execute指令成功運(yùn)行的條件

 ?、?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

  第二題:請(qǐng)寫出下列execute指令最大的成功運(yùn)行次數(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!

  所以這就是我們本章的全部?jī)?nèi)容,下一章我們將會(huì)來(lái)初步了解一下存儲(chǔ)子命令。

  ......

  ......

  ......

  ......

  ......

  ......

  參考答案

  第一題:

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

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

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

  第二題:

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

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

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

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