UU看書

第七十章 修飾子命令 下 剩下的5個修飾子命令

天才一秒記住【UU看書】地址:www.uukanshu.co

(於2022715重寫)

在上一章,我們總結出了新『指令執行三要素』,並初步學習了修飾子命令中的『as、at和in』子命令,瞭解了execute的『流水線思維』(注:這個思維名稱是作者自己編的)。那麼接下來我們就應該快馬加鞭,看看剩下的五個修飾子命令:

facing——更改旋轉角度

rotated——更改旋轉角度

anchored——更改基準部位

positioned——更改執行位置中的座標

align——將執行位置中的座標轉化為方塊座標

我們先從前幾章在講tp指令就接觸過的facing子命令入手:

(?怎麼就接觸了?)

(因為兩者非常像,算接觸也可以啊)

execute的facing子命令,和tpteleport指令的facing引數十分類似,都是『改變朝向為面向指定的座標或某個實體』,只不過前者改變的是命令的執行朝向,後者改變的是傳送目標的朝向。

所以facing子命令的語法相比tp的facing語法,不能說是十分類似,至少也是一模一樣了:

facinglt座標gt

facingentitylt實體gtlt朝向部位gt

是不是?也就『朝向部位』這個引數從可選變成了必填而已。

既然功能都完全一樣,這裡也就不多介紹了,直接上例子:

executefacing5runtp

這條指令是什麼意思呢?它竟然有兩個區域性座標!

但這兩個區域性座標的朝向並不一致。第一個區域性座標的朝向和執行者的朝向一致,所以facing5在這的意思是『改變執行朝向為面向執行者左邊5格』,第二個區域性座標的朝向和facing子命令指定的朝向一樣,所以最終你將會看向你原本左邊5格的位置。

executefacingentityedistance1,sortnearest,limit1feetruntp

這條指令將會使得執行者看向最近實體的眼睛。至於為什麼是眼睛,我們已經在第六十四章討論過了。

如果我們要實現看向最近實體的腳該怎麼辦?

想一想,當你看向一個人的腳時,你是用什麼看的?

眼睛啊!

所以說,我們得把區域性座標的基準點從預設的腳部改到眼睛的位置,也就是更改執行朝向的基準部位。這時候,我們就需要用到anchored(ˈæŋkər)子命令。

anchored子命令的用法十分簡單:

anchoredlt實體錨點gt

其中,『實體錨點』引數也就是『基準部位』引數,前者是官方的叫法,後者是本書的叫法。它僅僅可以填寫兩個東西:eyes和feet。執行指令時預設是使用feet,這裡我們嘗試填寫為eyes:

讓我們試一試:

executeanchoredeyesruntpsfacingentityedistance1,sortnearest,limit1feet

這條指令可以使得執行者看向最近實體的腳部(從執行者的眼睛看向最近實體的腳部)。

更改執行指令的基準部位後,就會有一些有趣的效果。比如:

executeanchoredeyesruntps

這將會將你傳送到你眼睛的位置,更確切地說是將你的腳傳送到你眼睛的位置。

facing可以更改旋轉角度,但rotated子命令也能,那它倆有什麼區別呢?

rotated子命令並不是將執行朝向改為朝向某個地方,而是直接更改旋轉角度為指定的旋轉角度,或某個實體的旋轉角度。其語法如下:

rotatedlt水平旋轉角度gtlt垂直旋轉角度gt

rotatedaslt實體gt

這有點類似於tp指令的部分功能,execute相當於把這部分功能獨立了出來(tp:怎麼又是我)。

舉個例子:

executerotated2700

executerotated900

這兩條指令都可以將執行朝向改為水平朝向正東方,只不過前者是採用我們在第九章教的『真南方位角』,後者是採用Minecraft中標準的方位角。

executerotatedasesortnearest,limit1

這將會使執行朝向與距離執行地點最近的實體一致。

十分簡單,是不是?但請注意,和as、at子命令一樣,當facingentity和rotatedas選擇到多個實體時,指令都會在每一種情況下分別執行一遍。

現在,at、facing、rotated、anchored這四個與旋轉角度有關的子命令已經全部講完了,剩下的兩個子命令positioned和align僅僅和執行位置中的座標有關係。讓我們繼續學習一下。

positioned子命令乍一看和at子命令很像,都是改變執行位置,但其實兩者的區別很大。

positioned——僅僅只能修改執行位置中的座標

at——不僅僅能修改執行位置中的座標,還可以修改維度位置和旋轉角度。

記住兩者的區別之後,讓我們來看看positioned子命令的使用方式:

positionedlt座標gt

修改執行位置中的座標為指定座標

positionedaslt實體gt

修改執行位置中的座標為指定實體的座標,如果有多個實體,則分別以每個實體的座標作為執行位置的座標,多次執行指令

還是很簡單,讓我們來試一試:

executepositioned111runtps

這將會把你tp到15,1,15的位置。至於為什麼不會tp到1,1,1處,我們在前幾章已經講過了。

executepositionedasetypevillagerrunsetblock1minecraftdiamondblock

這條指令將會在每名村民的腳下放置一個鑽石塊。

但還是請注意,positioned僅僅只會修改執行位置中的座標。

為什麼我要多次強調這個東西?

舉個最簡單的例子,假設你在下界,主世界有一個村民位於1,23,1的位置,此時你在下界執行一遍上面的指令,你就會發現:

在下界的1,22,1處,放置了一個鑽石塊,但理想情況下應該是在主世界放置。

這是怎麼回事?答案很簡單:因為positioned只會修改座標,不會修改維度。如果你真的要使得在下界也能夠讓主世界的村民腳下生鑽,有兩種方法:

①executeasetypevillagerrunsetblock1minecraftdiamondblock將positionedas替換為as

②executepositionedasetypevillagerinminecraftoverworldrunsetblock1minecraftdiamondblock加上in子命令,指定維度位置是主世界

最後,我們只剩下了一個修飾子命令:align

align這個子命令比較特殊,它並不是說修改維度位置為某個實體所處的維度,也不是說修改旋轉角度為某個方塊的朝向,而是對執行位置中的座標小修小補:對小數向下取整,對整數保留不變,將座標改為方塊座標。其語法如下:

alignlt座標組合gt

其中,『座標組合』引數可以填寫任意的xyz。注意啊,這裡不是填寫具體的數字,而是就填寫xyz這三個字母的任意組合,甚至缺個x缺個y之類的都可以,只是不能重複而已。

比如:

executealignxyzruntps

假設你原本的座標是105315,5750609,25875,使用上述指令後你會傳送到106,58,26,也就是將你的xyz三個座標分別向下取整再傳送。

上面這條指令你也可以寫成:

executealignyzxruntps

executealignzxyruntps

都可以,就是不能這麼寫:

executealign111runtps

executealignxxyyzzruntps

這樣子是不行的。

如果你只想對x座標和z座標進行向下取整,只需要去掉一個y就可以了:

executealignxz

現在,8條修飾子命令都已經學完了,讓我們來將它們一齊運用一下:

executeinminecraftthenetherpositionedassruntps

這將會把你傳送到地獄,並使得座標不會變化。假設你原本在主世界是1,1,1,使用這條指令你只會跑到下界的1,1,1,x和z軸並不會除以8。

為何?讓我們來使用『流水線思維』分析一下:

AtFirst——你自己、1,1,1、主世界、你自己的旋轉角度、feet

in——你自己、0125,10,125、地獄、你自己的旋轉角度、feet

in修改了維度位置到地獄,並且由於是從主世界到地獄,x和z軸就被分別除以8

positioned——你自己、1,1,1、地獄、你自己的旋轉角度、feet

positioned將座標重新改成了你自己的座標

所以,你才會傳送到地獄的1,1,1處,而不是0125,1,0125。

再來看看第二條:

executeaselimit13,sortnearestatsrotated36045anchoredeyesfacingentityelimit1,sortnearest,distance01feetalignyzxinminecrafttheendpositioned12410ifpredicatesnowking03runtps

這條execute用到了10個子命令:as、at、rotated、anchored、facing、align、in、positioned、if和run,其中if子命令是我們接下來的內容,但早點接觸也沒事。

看起來很複雜的樣子,但我們只需要使用『流水線思維』,拆開來逐個分析即可。

假設我們使用一個位於主世界1,25,1處的命令方塊執行此指令(聊天框裝不下這麼長的指令):

AtFirst

→無、1,25,1、主世界、0°,0°、feet

aselimit13,sortnearest

→距離命令方塊最近的實體、1,25,1、主世界、0°,0°、feet

→距離命令方塊第二近的實體、1,25,1、主世界、0°,0°、feet

→距離命令方塊第三近的實體、1,25,1、主世界、0°,0°、feet

→距離命令方塊第13近的實體、1,25,1、主世界、0°,0°、feet

ats

→距離命令方塊最近的實體、距離命令方塊最近的實體的位置、主世界、距離命令方塊最近的實體的旋轉角度、feet

rotated36045

→距離命令方塊最近的實體、距離命令方塊最近的實體的位置、主世界、0°,45°、feet

注:大多數情況下,當水平旋轉角度為360°的倍數時,遊戲會將其轉化為0°。

anchoredeyes

→距離命令方塊最近的實體、距離命令方塊最近的實體的位置、主世界、0°,45°、eyes

facingentityelimit1,sortnearest,distance01feet

→距離命令方塊最近的實體、距離命令方塊最近的實體的位置、主世界、距離命令方塊最近的實體用眼睛看向距離它最近實體的腳的朝向、eyes

alignyzx

→距離命令方塊最近的實體、距離命令方塊最近的實體的xyz軸向下取整的值(整數會保留)、主世界、距離命令方塊最近的實體用眼睛看向距離它最近實體的腳的朝向、eyes

inminecrafttheend

→距離命令方塊最近的實體、距離命令方塊最近的實體的xyz軸向下取整的值(整數會保留)、末地、距離命令方塊最近的實體用眼睛看向距離它最近實體的腳的朝向、eyes

positioned12410

→距離命令方塊最近的實體、15,240,10、末地、距離命令方塊最近的實體用眼睛看向距離它最近實體的腳的朝向、eyes

ifpredicatesnowking03

解釋如下:如果謂詞條件『snowking03』透過,即執行指令

其中,謂詞條件『snowking03』是資料包雪王(SnowKing)中的一個謂詞條件(沒錯,就是那個『蜜雪冰城甜蜜蜜』的那個資料包),這個條件會隨機一個0到1的浮點數(類似於小數),如果隨機的數小於03就算條件透過,即執行這條指令有30的機率。

什麼是謂詞條件呢?在我們講資料包之前(也有可能永遠不會講到),你可以將這東西當作是一個打包好的『判斷函式』,在這個『判斷函式』裡面寫了一些東西,可以判斷當前遊戲的情況是否符合指定的條件,如果符合則透過判斷,如果不符合則不透過判斷。比如裡面寫了一個『當前遊戲正在下雨』的條件,當這個條件被呼叫時就會看看現在遊戲是否在下雨,如果下雨就會透過判斷,你的指令也就能夠執行,反之就不會執行。

當然,你只需要在目標選擇器或execute指令中透過這個謂詞的名稱空間ID來呼叫即可使用這個謂詞了。只不過可惜的是,原版並沒有任何的謂詞條件,這謂詞是專門給資料包用的東西。

runtps

最多執行13次指令,分別以距離命令方塊最近的實體、距離命令方塊第二近的實體、第三近的實體為執行者,15,240,10為執行座標,末地為執行維度,執行者用眼睛看向距離它最近實體的腳的朝向作為執行朝向,eyes作為朝向基準部位。將執行者傳送至15,240,10,並將其旋轉角度更改為執行朝向的旋轉角度。

這樣分析下來,是不是就清楚了許多?所以說不要慌張,這種東西僅僅只是紙老虎而已。

如果你已經是一個對NBT和方塊狀態較為了解的人,或許你還可以看看第三條:

(實際上這有兩條指令)

executeasetypearrow,nbtinGround1b,tagusedatsalignxyzrunsummonfallingblock6Time1,BlockStateName“redstoneblock“,Passengersid“fallingblock“,Time1,BlockStateName“activatorrail“,Passengersid“commandblockminecart“,Command“setblock1commandblockfacingeastCommand“executepositioned2atetypeitem,distance5runsetblock1diamondblock“,auto1“,Passengersid“commandblockminecart“,Command“setblock11chaincommandblockfacingeastCommand“executepositioned12asetypeitem,distance5runkills“,auto1“,Passengersid“commandblockminecart“,Command“setblock21chaincommandblockfacingeastCommand“executepositioned22asetypearrow,distance5runkills“,auto1“,Passengersid“commandblockminecart“,Command“setblock31chaincommandblockfacingeastCommand“executepositioned31runkilletypecommandblockminecart,distance2“,auto1“,Passengersid“commandblockminecart“,Command“setblock41chaincommandblockfacingeastCommand“fill442minecraftair“,auto1“,Passengersid“commandblockminecart“,Command“setblock51chaincommandblockfacingeastCommand“fill5minecraftair“,auto1“

tagetypearrow,nbtinGround1b,tagusedaddused

這是一個作者自己寫的十分典型的OOC指令,關於什麼是OOC我們已經在第六十二章講命令方塊礦車時遇到過了,即『僅有一條指令』。雖然我們在那一章已經講過了OOC的原理,但這是我們第一次在本書中遇到真正的OOC指令。很長是不是?但其實它是由多個指令,透過實體NBT的形式套娃而成的,其中用到了大量的execute指令。

如果你對此感興趣,可以嘗試拆分一下這一大串指令,猜一猜這是幹什麼的。我們會在之後具體講到OOC時講解這一大串指令。

那麼本章就到此結束了。

如遇章節錯誤,請點選報錯(無需登陸)

新書推薦

全民網遊:絕世神兵 高達世紀 星界使徒 我真不是籃壇惡霸啊 籃球神話 NBA開局隊史第一人 我玩的可能是一個假遊戲