首頁 游戲

Minecraft指令手冊(cè)

第七十章 修飾子命令 下 剩下的5個(gè)修飾子命令

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

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

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