UU看書

第六十九章 修飾子命令 上 三要素與修飾子命令

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

(於2022714重寫)

在第七章,我們總結出了指令執行的三要素:執行者、執行位置和引數。

但在經過了六十幾章的學習後,我們會發現,這三要素似乎有點不對啊?

哪裡不對呢?

執行者肯定會有,就算沒有也會有預設值;執行位置肯定也會有,並且它照樣也有預設值。

但引數呢?

雖然有些引數也有預設值,但有些指令它根本就沒有引數啊!比如seed指令,根本就不需要引數。

所以在這,我們必須糾正一個已經持續了幾十個章節的錯誤,那就是:

引數並不是指令必須要有的東西,它不算是指令執行的要素。

那照這樣子說,我們的三要素是不是就要變為二要素了?

NONONONO。三要素還是三要素,雖然引數不是了,但有一個一直以來都在被我們忽略的東西能夠被當作是指令執行的三要素。

什麼呢?難不成是目標選擇器的基準點?

答案是:執行朝向。

執行朝向是一個神奇的東西。我們第一次遇見它在第九章,花了較長的篇幅講解了水平旋轉角度和垂直旋轉角度;第二次遇見它在第二十六章,又講了一遍水平旋轉角度;第三次遇見在第六十四章,花了較長的篇幅講解了相對旋轉角度和基準部位;接下來,我們可能還要再次遇見它,講解它和區域性座標的關係。

不難發現,相對於執行位置、執行者,我們卻很少遇見執行朝向。但每次執行朝向一出現,我們就得花大量的筆墨去講解它。所以說,執行朝向是指令執行三要素中最難理解的部分,它不僅僅只是一個朝向那麼簡單,它還關係到許許多多的東西。

現在,我們總結出了新的指令執行三要素:執行者、執行位置和執行朝向。其中,執行位置還包括維度和座標;執行朝向包括旋轉角度和基準部位。而這些東西,我們都可以透過新版execute的8條修飾子命令來自定義:

as——更改執行者

at——更改執行位置(包括維度和座標)和旋轉角度為指定實體的位置和旋轉角度

facing——更改旋轉角度

rotated——更改旋轉角度

anchored——更改基準部位

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

in——更改維度位置

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

這一章,我們就先講幾個簡單的:as、at和in。

as子命令可以更改執行者,類似於舊版的『執行者』引數,但其僅僅只會更改執行者,而舊版的『執行者』引數還會更改旋轉角度。

as子命令的使用十分簡單,如下:

aslt執行者:目標選擇器gt

舉個例子:

executeasarun一條指令

(run子命令雖然我們沒有講過,但其實你應該也懂了,『run命令』就可以執行指令)

這將會將指令執行者更改為所有玩家自身,指令在執行時會分別將每個玩家作為執行者執行一遍。唉,什麼叫『指令在執行時會分別將每個玩家作為執行者執行一遍』呢?,之前講舊版的execute時可從未提到過啊?

舉個小小的例子,你就知道了:

executeasetypevillagerrunscoreboardplayersaddvillagercountanobjective1

假設villagercount這個假玩家在計分項anobjective上的分數原先為0。請你猜一猜,執行這條指令過後,分數將會變為多少?一定會變為1嗎?

上面這條指令的意思是:將所有村民作為執行者,給villagercount在計分項anobjective上的分數加上1。而指令在執行過程中,會將每位村民都作為執行者執行一遍指令,因此最終指令將會執行『村民總數量』遍,我們也成功地將村民的總數量作為分數記到了計分板上。假設現在有兩名村民,最終得到的分數將會是2,因為這兩個村民都分別執行了一遍『scoreboardplayersaddvillagercountanobjective1』。

為什麼指令在執行過程中,會將每位村民都作為執行者執行一遍指令,而不是直接將所有村民作為執行者,僅僅執行一遍指令?

原因很簡單:每條指令執行過程中,執行者、執行位置、執行朝向分別都只能有一個。

請你一定要記住這個知識點,因為接下來我們將會需要運用這個知識點來解決一些問題。

對了,既然新版本的execute有這個特性,那舊版本呢?

也是有的。

所以你能想到這有什麼用處嗎?

testfor指令雖然可以用來探測指定實體是否存在,但想要將數量儲存到計分板中還需要一個stats指令,十分麻煩且容易出錯。而execute如果這樣用,直接吊打testfor啊!而且,這是可以用於基岩版的,做玩家人數檢測或實體數量檢測!

比如在基岩版,你可以這麼幹:

executear10,x15,y94,z20,tag遊戲參與者scoreboardplayersaddplayercountcount1

這將會計算出以15,94,20為中心,半徑10米內帶有『遊戲參與者』標籤的玩家數量,非常適合用於小遊戲的人數判定。

回到正題啊,接下來我們來看看at子命令。

at子命令,可以更改執行位置中的維度位置、座標以及執行朝向中的旋轉角度為指定實體的維度位置、座標和旋轉角度。其格式也是十分滴簡單:

atlt實體:目標選擇器gt

舉個例子:

executeatetypeminecraftarrowrunsummonvillager

這將會在每支箭的位置,分別執行一遍『summonvillager』來召喚一隻村民。

可以發現,雖然我們沒有更改執行者,但相對座標的基準點卻被更改了,這說明相對座標預設不是將執行者的位置作為基準點的,而是將指令執行位置作為基準點。其實這個我們在第五章就已經提到了,這裡只不過再提一下而已。

另外,你有沒有注意到『分別』兩個字?也就是說,at子命令照樣會使得指令在每個位置分別執行一遍。不要小看這一點,待會你就會知道小看這一點會導致什麼嚴重的災難。

in可以更改指令執行的維度位置,因此我們可以透過in指令來快速前往其他維度。其語法如下:

inlt維度IDgt

舉個例子:

executeinminecraftthenetherruntps

這將會把你傳送到地獄。需要注意的是,你的x和z座標可能會被除以8。比如你原先的座標是16,80,16,傳送到下界後估計就會變成2,80,2。

為什麼呢?如果你有一點MC常識的話,你就會知道,在大多數Minecraft版本中,下界中的1米相當於主世界的8米,所以自然而然,你從主世界傳送到下界,x和z軸就會除以8(可以透過新增其他子命令來避免這種情況)。

但在Java稍微舊一些的版本中,執行上述指令並不會改變你的座標,也就是說不會除以8,還是會保留你原先的16,80,16。這是作者在1144版本中發現的,但在最新的119版本中不會出現這種情況,因此應該是在1144119間的某個版本修復了這個BUG。作者猜測可能是116更新,只不過懶得去測試了。

另外還需要注意,在118及更高版本中,雖然主世界的Y座標向下延伸到了64,但其他維度並未變化,因此如果你從Y座標小於0的地方直接傳到地獄或其他維度,極有可能會掉進虛空!

現在我們來嘗試一下結合上面的三個子命令run子命令,看看當多條子命令結合起來時會有什麼效果。

我們來試著將所有實體往上抬1米:

executeaseateruntps1

執行之後,你會驚喜的發現,所有實體都往上抬了1米,但也都傳到了同一個地方,甚至有些實體還被擠死了。

這是怎麼回事?

這就是為什麼我在前面一直提醒著你說at和as都會在每一個實體和每個位置執行一遍指令。

讓我們來逐步分析一下上面的指令出了什麼bug,也就是模擬一下游戲執行這條指令的過程。

假設現在整個世界僅僅只有3個實體:一名玩家(最早生成),一位村民和一隻羊(最晚生成)。

當這名玩家敲下回車鍵將指令傳送給遊戲時,遊戲開始對這條指令進行解析並執行:

as子命令讓遊戲知道,接下來要改變執行者。而目標選擇器e選擇了這三個實體,並使得它們按照生成時間的早晚排序,因此遊戲根據ase,先選擇了這名玩家作為執行者,然後再選擇村民,最後選擇羊。

接下來遊戲看到了ate,由於之前已經選擇好了執行者,所以遊戲根據上文還有這裡,得知這名玩家將會依次在玩家的位置、村民的位置和羊的位置分別執行一遍指令,村民和羊同理。

最後遊戲看到了run以及後面的指令,它已經完全明白接下來要幹什麼事情了:

①將玩家傳送至玩家上方1米的位置(玩家此時抬高了1米)

②將玩家傳送至村民上方1米的位置(玩家此時位於村民上方1米)

③將玩家傳送至羊上方1米的位置(玩家此時位於羊上方1米)

④將村民傳送至玩家上方1米的位置(村民此時位於玩家原本位置上方1米,玩家此時位於羊上方1米)

⑤將村民傳送至村民上方1米的位置(村民此時位於村民原本位置上方1米,玩家此時位於羊上方1米)

⑥將村民傳送至羊上方1米的位置(村民和玩家此時位於羊上方1米)

⑦將羊傳送至玩家上方1米的位置(村民和玩家此時位於羊原本位置上方1米,羊位於玩家原本位置上方1米)

⑧將羊傳送至村民上方1米的位置(村民和玩家此時位於羊原本位置上方1米,羊位於村民原本位置上方1米)

⑨將羊傳送至羊上方1米的位置(村民、玩家和羊此時都位於羊原本位置上方1米)

最終,三者都跑到了羊原先位置上面1米處,指令執行了3×39遍。

太離譜了是不是?但既然寫兩個e會造成混亂的話,那麼該怎樣寫呢?

因為第一個as子命令已經更改了執行者,後面的子命令都會按照更改後的來,所以我們只需要:

executeaseatsruntps1

將at的e改為s即可。

或者說把at放前面,曲線救國一下:

executeateaselimit1,sortnearestruntps1

這也是可以的。

所以在execute中,各個子命令的順序十分重要,每個子命令都會影響到後面的子命令。希望你能記住這一點,不然可能會犯一些就像上面這樣的嚴重錯誤。

我們再來試試結合in和at兩個子命令,看看當兩個子命令所影響的範圍有重合時會發生什麼:

executeatsinminecraftthenetherruntps

executeinminecraftthenetheratsruntps

你可以猜一猜,當你執行這兩條指令時,效果分別是怎樣的?

首先,第一條指令的效果和之前『executeinminecraftthenetherruntps』的效果不能說十分相似,只能說是完全一樣。at子命令將執行位置和朝向設定為了你的位置和朝向,但由於本來就是這樣所以可以去掉。in雖然僅僅會影響到維度,但如果像是地獄這種特殊的維度,在影響到維度位置的同時,in也會對當前的座標進行設定。所以說是完全一樣,並不會說你這樣設定可以將你傳到地獄而不改變座標的。

而第二條指令就更不用說了,in剛剛把維度改過去,at又改了回來,所以第二條子命令相當於『tps』,把自己傳送到自己的位置,實際上沒有任何效果。

所以說,execute就像是個流水線,指令的三要素從指令開頭出發,依次經過各個修飾子命令的洗禮,最終在run子命令『出廠』。採用這種『流水線思維』,我們才能更好地理解更加複雜的execute命令。

本章到此結束。

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

新書推薦

不靠譜劍仙 全民:散人垃圾?我精通全職業! 企鵝系玩家 無限:我是誰都看不起的道士 我在民俗遊戲祭神 全線戰爭 你這門派不對勁