第七十章 修飾子命令 下 剩下的5個(gè)修飾子命令
?。ㄓ?022/7/15重寫)
在上一章,我們總結(jié)出了新『指令執(zhí)行三要素』,并初步學(xué)習(xí)了修飾子命令中的『as、at和in』子命令,了解了execute的『流水線思維』(注:這個(gè)思維名稱是作者自己編的)。那么接下來我們就應(yīng)該快馬加鞭,看看剩下的五個(gè)修飾子命令:
facing ——更改旋轉(zhuǎn)角度
rotated——更改旋轉(zhuǎn)角度
anchored——更改基準(zhǔn)部位
positioned ——更改執(zhí)行位置中的坐標(biāo)
align——將執(zhí)行位置中的坐標(biāo)轉(zhuǎn)化為方塊坐標(biāo)
我們先從前幾章在講tp指令就接觸過的facing子命令入手:
?。ǎ吭趺淳徒佑|了?)
?。ㄒ?yàn)閮烧叻浅O瘢憬佑|也可以?。?p> execute的facing子命令,和tp/teleport指令的facing參數(shù)十分類似,都是『改變朝向?yàn)槊嫦蛑付ǖ淖鴺?biāo)或某個(gè)實(shí)體』,只不過前者改變的是命令的執(zhí)行朝向,后者改變的是傳送目標(biāo)的朝向。
所以facing子命令的語法相比tp的facing語法,不能說是十分類似,至少也是一模一樣了:
... facing <坐標(biāo)>...
... facing entity <實(shí)體><朝向部位>...
是不是?也就『朝向部位』這個(gè)參數(shù)從可選變成了必填而已。
既然功能都完全一樣,這里也就不多介紹了,直接上例子:
/execute facing ^5 ^^ run tp ^^^
這條指令是什么意思呢?它竟然有兩個(gè)局部坐標(biāo)!
但這兩個(gè)局部坐標(biāo)的朝向并不一致。第一個(gè)局部坐標(biāo)的朝向和執(zhí)行者的朝向一致,所以facing ^5 ^^在這的意思是『改變執(zhí)行朝向?yàn)槊嫦驁?zhí)行者左邊5格』,第二個(gè)局部坐標(biāo)的朝向和facing子命令指定的朝向一樣,所以最終你將會(huì)看向你原本左邊5格的位置。
/execute facing entity @e[distance=1..,sort=nearest,limit=1] feet run tp ^^^
這條指令將會(huì)使得執(zhí)行者看向最近實(shí)體的眼睛。至于為什么是眼睛,我們已經(jīng)在第六十四章討論過了。
如果我們要實(shí)現(xiàn)看向最近實(shí)體的腳該怎么辦?
想一想,當(dāng)你看向一個(gè)人的腳時(shí),你是用什么看的?
眼睛啊!
所以說,我們得把局部坐標(biāo)的基準(zhǔn)點(diǎn)從默認(rèn)的腳部改到眼睛的位置,也就是更改執(zhí)行朝向的基準(zhǔn)部位。這時(shí)候,我們就需要用到anchored(/???k?r/)子命令。
anchored子命令的用法十分簡單:
... anchored <實(shí)體錨點(diǎn)>...
其中,『實(shí)體錨點(diǎn)』參數(shù)也就是『基準(zhǔn)部位』參數(shù),前者是官方的叫法,后者是本書的叫法。它僅僅可以填寫兩個(gè)東西:eyes和feet。執(zhí)行指令時(shí)默認(rèn)是使用feet,這里我們嘗試填寫為eyes:
讓我們?cè)囈辉嚕?p> /execute anchored eyes run tp @s ~~~ facing entity @e[distance=1..,sort=nearest,limit=1] feet
這條指令可以使得執(zhí)行者看向最近實(shí)體的腳部(從執(zhí)行者的眼睛看向最近實(shí)體的腳部)。
更改執(zhí)行指令的基準(zhǔn)部位后,就會(huì)有一些有趣的效果。比如:
/execute anchored eyes run tp @s ^^^
這將會(huì)將你傳送到你眼睛的位置,更確切地說是將你的腳傳送到你眼睛的位置。
facing可以更改旋轉(zhuǎn)角度,但rotated子命令也能,那它倆有什么區(qū)別呢?
rotated子命令并不是將執(zhí)行朝向改為朝向某個(gè)地方,而是直接更改旋轉(zhuǎn)角度為指定的旋轉(zhuǎn)角度,或某個(gè)實(shí)體的旋轉(zhuǎn)角度。其語法如下:
... rotated <水平旋轉(zhuǎn)角度><垂直旋轉(zhuǎn)角度>...
... rotated as <實(shí)體>...
這有點(diǎn)類似于tp指令的部分功能,execute相當(dāng)于把這部分功能獨(dú)立了出來(tp:怎么又是我)。
舉個(gè)例子:
/execute rotated 270 0 ...
/execute rotated -90 0 ...
這兩條指令都可以將執(zhí)行朝向改為水平朝向正東方,只不過前者是采用我們?cè)诘诰耪陆痰摹赫婺戏轿唤恰唬笳呤遣捎肕inecraft中標(biāo)準(zhǔn)的方位角。
/execute rotated as @e[sort=nearest,limit=1]...
這將會(huì)使執(zhí)行朝向與距離執(zhí)行地點(diǎn)最近的實(shí)體一致。
十分簡單,是不是?但請(qǐng)注意,和as、at子命令一樣,當(dāng)facing entity和rotated as選擇到多個(gè)實(shí)體時(shí),指令都會(huì)在每一種情況下分別運(yùn)行一遍。
現(xiàn)在,at、facing、rotated、anchored這四個(gè)與旋轉(zhuǎn)角度有關(guān)的子命令已經(jīng)全部講完了,剩下的兩個(gè)子命令positioned和align僅僅和執(zhí)行位置中的坐標(biāo)有關(guān)系。讓我們繼續(xù)學(xué)習(xí)一下。
positioned子命令乍一看和at子命令很像,都是改變執(zhí)行位置,但其實(shí)兩者的區(qū)別很大。
positioned ——僅僅只能修改執(zhí)行位置中的坐標(biāo)
at ——不僅僅能修改執(zhí)行位置中的坐標(biāo),還可以修改維度位置和旋轉(zhuǎn)角度。
記住兩者的區(qū)別之后,讓我們來看看positioned子命令的使用方式:
... positioned <坐標(biāo)>...
\\修改執(zhí)行位置中的坐標(biāo)為指定坐標(biāo)\\
... positioned as <實(shí)體>...
\\修改執(zhí)行位置中的坐標(biāo)為指定實(shí)體的坐標(biāo),如果有多個(gè)實(shí)體,則分別以每個(gè)實(shí)體的坐標(biāo)作為執(zhí)行位置的坐標(biāo),多次運(yùn)行指令\\
還是很簡單,讓我們來試一試:
/execute positioned 1 1 1 run tp @s ~~~
這將會(huì)把你tp到(1.5,1,1.5)的位置。至于為什么不會(huì)tp到(1,1,1)處,我們?cè)谇皫渍乱呀?jīng)講過了。
/execute positioned as @e[type=villager] run setblock ~~-1 ~ minecraft:diamond_block
這條指令將會(huì)在每名村民的腳下放置一個(gè)鉆石塊。
但還是請(qǐng)注意,positioned僅僅只會(huì)修改執(zhí)行位置中的坐標(biāo)。
為什么我要多次強(qiáng)調(diào)這個(gè)東西?
舉個(gè)最簡單的例子,假設(shè)你在下界,主世界有一個(gè)村民位于(1,23,1)的位置,此時(shí)你在下界運(yùn)行一遍上面的指令,你就會(huì)發(fā)現(xiàn):
在下界的(1,22,1)處,放置了一個(gè)鉆石塊,但理想情況下應(yīng)該是在主世界放置。
這是怎么回事?答案很簡單:因?yàn)閜ositioned只會(huì)修改坐標(biāo),不會(huì)修改維度。如果你真的要使得在下界也能夠讓主世界的村民腳下生鉆,有兩種方法:
?、?execute as @e[type=villager] run setblock ~~-1 ~ minecraft:diamond_block \\將positioned as替換為as\\
?、?execute positioned as @e[type=villager] in minecraft:overworld run setblock ~~-1 ~ minecraft:diamond_block \\加上in子命令,指定維度位置是主世界\\
最后,我們只剩下了一個(gè)修飾子命令:align
align這個(gè)子命令比較特殊,它并不是說修改維度位置為某個(gè)實(shí)體所處的維度,也不是說修改旋轉(zhuǎn)角度為某個(gè)方塊的朝向,而是對(duì)執(zhí)行位置中的坐標(biāo)小修小補(bǔ):對(duì)小數(shù)向下取整,對(duì)整數(shù)保留不變,將坐標(biāo)改為方塊坐標(biāo)。其語法如下:
... align <坐標(biāo)組合>...
其中,『坐標(biāo)組合』參數(shù)可以填寫任意的xyz。注意啊,這里不是填寫具體的數(shù)字,而是就填寫xyz這三個(gè)字母的任意組合,甚至缺個(gè)x缺個(gè)y之類的都可以,只是不能重復(fù)而已。
比如:
/execute align xyz run tp @s ~~~
假設(shè)你原本的坐標(biāo)是(-105.315,-57.50609,-25.875),使用上述指令后你會(huì)傳送到(-106,-58,-26),也就是將你的xyz三個(gè)坐標(biāo)分別向下取整再傳送。
上面這條指令你也可以寫成:
/execute align yzx run tp @s ~~~
/execute align zxy run tp @s ~~~
都可以,就是不能這么寫:
/execute align 1 1 1 run tp @s ~~~
/execute align xxyyzz run tp @s ~~~
這樣子是不行的。
如果你只想對(duì)x坐標(biāo)和z坐標(biāo)進(jìn)行向下取整,只需要去掉一個(gè)y就可以了:
/execute align xz ...
現(xiàn)在,8條修飾子命令都已經(jīng)學(xué)完了,讓我們來將它們一齊運(yùn)用一下:
/execute in minecraft:the_nether positioned as @s run tp @s ~~~
這將會(huì)把你傳送到地獄,并使得坐標(biāo)不會(huì)變化。假設(shè)你原本在主世界是(1,1,1),使用這條指令你只會(huì)跑到下界的(1,1,1),x和z軸并不會(huì)除以8。
為何?讓我們來使用『流水線思維』分析一下:
At First——你自己、(1,1,1)、主世界、你自己的旋轉(zhuǎn)角度、feet
in——你自己、(0.125,1.0,125)、地獄、你自己的旋轉(zhuǎn)角度、feet
\\in修改了維度位置到地獄,并且由于是從主世界到地獄,x和z軸就被分別除以8\\
positioned——你自己、(1,1,1)、地獄、你自己的旋轉(zhuǎn)角度、feet
\\positioned將坐標(biāo)重新改成了你自己的坐標(biāo)\\
所以,你才會(huì)傳送到地獄的(1,1,1)處,而不是(0.125,1,0.125)。
再來看看第二條:
/execute as @e[limit=13,sort=nearest] at @s rotated 360 -45 anchored eyes facing entity @e[limit=1,sort=nearest,distance=0.1..] feet align yzx in minecraft:the_end positioned 1 24 1.0 if predicate snow_king:0.3 run tp @s ^^^
這條execute用到了10個(gè)子命令:as、at、rotated、anchored、facing、align、in、positioned、if和run,其中if子命令是我們接下來的內(nèi)容,但早點(diǎn)接觸也沒事。
看起來很復(fù)雜的樣子,但我們只需要使用『流水線思維』,拆開來逐個(gè)分析即可。
假設(shè)我們使用一個(gè)位于主世界(1,25,1)處的命令方塊運(yùn)行此指令(聊天框裝不下這么長的指令):
At First
→無、(1,25,1)、主世界、(0°,0°)、feet
as @e[limit=13,sort=nearest]
→距離命令方塊最近的實(shí)體、(1,25,1)、主世界、(0°,0°)、feet
→距離命令方塊第二近的實(shí)體、(1,25,1)、主世界、(0°,0°)、feet
→距離命令方塊第三近的實(shí)體、(1,25,1)、主世界、(0°,0°)、feet
......
→距離命令方塊第13近的實(shí)體、(1,25,1)、主世界、(0°,0°)、feet
at @s
→距離命令方塊最近的實(shí)體、距離命令方塊最近的實(shí)體的位置、主世界、距離命令方塊最近的實(shí)體的旋轉(zhuǎn)角度、feet
......
rotated 360 -45
→距離命令方塊最近的實(shí)體、距離命令方塊最近的實(shí)體的位置、主世界、(0°,-45°)、feet
......
注:大多數(shù)情況下,當(dāng)水平旋轉(zhuǎn)角度為360°的倍數(shù)時(shí),游戲會(huì)將其轉(zhuǎn)化為0°。
anchored eyes
→距離命令方塊最近的實(shí)體、距離命令方塊最近的實(shí)體的位置、主世界、(0°,-45°)、eyes
......
facing entity @e[limit=1,sort=nearest,distance=0.1..] feet
→距離命令方塊最近的實(shí)體、距離命令方塊最近的實(shí)體的位置、主世界、距離命令方塊最近的實(shí)體用眼睛看向距離它最近實(shí)體的腳的朝向、eyes
......
align yzx
→距離命令方塊最近的實(shí)體、距離命令方塊最近的實(shí)體的xyz軸向下取整的值(整數(shù)會(huì)保留)、主世界、距離命令方塊最近的實(shí)體用眼睛看向距離它最近實(shí)體的腳的朝向、eyes
......
in minecraft:the_end
→距離命令方塊最近的實(shí)體、距離命令方塊最近的實(shí)體的xyz軸向下取整的值(整數(shù)會(huì)保留)、末地、距離命令方塊最近的實(shí)體用眼睛看向距離它最近實(shí)體的腳的朝向、eyes
......
positioned 1 24 1.0
→距離命令方塊最近的實(shí)體、(1.5,24.0,1.0)、末地、距離命令方塊最近的實(shí)體用眼睛看向距離它最近實(shí)體的腳的朝向、eyes
......
if predicate snow_king:0.3
解釋如下:如果謂詞條件『snow_king:0.3』通過,即運(yùn)行指令
其中,謂詞條件『snow_king:0.3』是數(shù)據(jù)包雪王(Snow King)中的一個(gè)謂詞條件(沒錯(cuò),就是那個(gè)『蜜雪冰城甜蜜蜜』的那個(gè)數(shù)據(jù)包),這個(gè)條件會(huì)隨機(jī)一個(gè)0到1的浮點(diǎn)數(shù)(類似于小數(shù)),如果隨機(jī)的數(shù)小于0.3就算條件通過,即運(yùn)行這條指令有30%的概率。
什么是謂詞條件呢?在我們講數(shù)據(jù)包之前(也有可能永遠(yuǎn)不會(huì)講到),你可以將這東西當(dāng)作是一個(gè)打包好的『判斷函數(shù)』,在這個(gè)『判斷函數(shù)』里面寫了一些東西,可以判斷當(dāng)前游戲的情況是否符合指定的條件,如果符合則通過判斷,如果不符合則不通過判斷。比如里面寫了一個(gè)『當(dāng)前游戲正在下雨』的條件,當(dāng)這個(gè)條件被調(diào)用時(shí)就會(huì)看看現(xiàn)在游戲是否在下雨,如果下雨就會(huì)通過判斷,你的指令也就能夠運(yùn)行,反之就不會(huì)運(yùn)行。
當(dāng)然,你只需要在目標(biāo)選擇器或execute指令中通過這個(gè)謂詞的命名空間ID來調(diào)用即可使用這個(gè)謂詞了。只不過可惜的是,原版并沒有任何的謂詞條件,這謂詞是專門給數(shù)據(jù)包用的東西。
run tp @s ^^^
最多運(yùn)行13次指令,分別以距離命令方塊最近的實(shí)體、距離命令方塊第二近的實(shí)體、第三近的實(shí)體......為執(zhí)行者,(1.5,24.0,1.0)為執(zhí)行坐標(biāo),末地為執(zhí)行維度,執(zhí)行者用眼睛看向距離它最近實(shí)體的腳的朝向作為執(zhí)行朝向,eyes作為朝向基準(zhǔn)部位。將執(zhí)行者傳送至(1.5,24.0,1.0),并將其旋轉(zhuǎn)角度更改為執(zhí)行朝向的旋轉(zhuǎn)角度。
這樣分析下來,是不是就清楚了許多?所以說不要慌張,這種東西僅僅只是紙老虎而已。
如果你已經(jīng)是一個(gè)對(duì)NBT和方塊狀態(tài)較為了解的人,或許你還可以看看第三條:
?。▽?shí)際上這有兩條指令)
/execute as @e[type=arrow,nbt={inGround:1b},tag=!used] at @s align xyz run summon falling_block ~~6 ~{Time:1,BlockState:{Name:“redstone_block“},Passengers:[{id:“falling_block“,Time:1,BlockState:{Name:“activator_rail“},Passengers:[{id:“command_block_minecart“,Command:“/setblock ~~1 ~ command_block[facing=east]{Command:\“/execute positioned ~~-2 ~ at @e[type=item,distance=..5] run setblock ~~-1 ~ diamond_block\“,auto:1}“,Passengers:[{id:“command_block_minecart“,Command:“/setblock ~1 ~1 ~ chain_command_block[facing=east]{Command:\“/execute positioned ~-1 ~-2 ~ as @e[type=item,distance=..5] run kill @s\“,auto:1}“,Passengers:[{id:“command_block_minecart“,Command:“/setblock ~2 ~1 ~ chain_command_block[facing=east]{Command:\“/execute positioned ~-2 ~-2 ~ as @e[type=arrow,distance=..5] run kill @s\“,auto:1}“,Passengers:[{id:“command_block_minecart“,Command:“/setblock ~3 ~1 ~ chain_command_block[facing=east]{Command:\“/execute positioned ~-3 ~-1 ~ run kill @e[type=command_block_minecart,distance=..2]\“,auto:1}“,Passengers:[{id:“command_block_minecart“,Command:“/setblock ~4 ~1 ~ chain_command_block[facing=east]{Command:\“/fill ~-4 ~~~-4 ~-2 ~ minecraft:air\“,auto:1}“,Passengers:[{id:“command_block_minecart“,Command:“/setblock ~5 ~1 ~ chain_command_block[facing=east]{Command:\“/fill ~~~~-5 ~~ minecraft:air\“,auto:1}“}]}]}]}]}]}]}]}
/tag @e[type=arrow,nbt={inGround:1b},tag=!used] add used
這是一個(gè)作者自己寫的十分典型的OOC指令,關(guān)于什么是OOC我們已經(jīng)在第六十二章講命令方塊礦車時(shí)遇到過了,即『僅有一條指令』。雖然我們?cè)谀且徽乱呀?jīng)講過了OOC的原理,但這是我們第一次在本書中遇到真正的OOC指令。很長是不是?但其實(shí)它是由多個(gè)指令,通過實(shí)體NBT的形式套娃而成的,其中用到了大量的execute指令。
如果你對(duì)此感興趣,可以嘗試拆分一下這一大串指令,猜一猜這是干什么的。我們會(huì)在之后具體講到OOC時(shí)講解這一大串指令。
那么本章就到此結(jié)束了。