Minecraft 1.13 Execute 指令,12 項設計優良的參數提供彈性、強大的指令設計
Minecraft 在 1.13 更新時將 execute 指令進行更新,不得不說這次的更新讓 execute 有更多功能可以使用,而且在下指令時不論是直覺性、實用性都獲得了全面性的提升,以前多行的指令現在可以簡化成單行甚至兩行,在搭配 function 使用可以增加整個指令執行時的效能。
Execute 指令的基本形式如下:
/execute 子指令
Execute 的子指令
Execute 一共有 12 個子指令,其中有 8 個是用於修改、修飾指令的作用範圍,而剩下的 4 個子指令可分為:條件型、儲存型、執行型。
1. align
align 在數學上的意義與高斯符號相同,「形式為 [x] ,表示不大於(等於或小於)數 x 的最大整數」。常搭配 positioned 一起使用,如:
/execute positioned -2.11 10.51 3.14 align x run tp ~ ~ ~
在 align 後方指定了 x ,所以他會對 x 座標取高斯,所以執行這行指令會將自己傳送至 x=-3、y=10.51、z=3.14 的位置。align 後方除了可以指定 x 之外,也可以指定 y軸、z軸。align 的基本寫法就是:
align <座標軸>
座標軸可以是:x、y、z、xy、xz、yz、xyz、xzy、yxz、yzx、zxy、zyx,等等的排列組合,只要有寫上去就會對該座標軸取高斯。
2. anchored
anchored 是用於指定指令執行於實體時該以眼部還是腳的位置來當作基準點,所以 anchored 的寫法很簡單:
anchored eyes|feet
預設是腳的位置,這也是為什麼可以指定當玩家執行指令時,一般的基準點都是在下半身那格而非上半身那格,以後可以用 anchored eyes 指定在玩家的眼部位置也就是上半身的地方當作基準點。
3. as
as 是用來改變指令執行者,as 後方加上玩家名稱、UUID或目標選擇器,形式如下:
as <實體>
例如:開發一個技能可以在技能發動期間使敵方玩家距離我 5 格的範圍內受到凋零的效果,我可以這樣寫:
/execute as @a[技能已發動] run effect give @a[team=!自己隊伍,distance=..5] minecraft:wither 1 1 true
4. at
at 與 as 很像,是改變指令的執行地點,at 後方加上玩家名稱、UUID或目標選擇器,形式如下:
at <實體>
譬如我要在所有盔甲架上執行位於盔甲架範圍 5 格以內的玩家發光,我可以這樣寫:
/execute at @e[type=armor_stand] run effect give @a[distance..5] minecraft:glowing 1 5 true
5. facing
facing 用於改變指令執行者該朝向何處,facing 指定方向時只支援使用座標以及實體指定,基本格式如下:
facing <座標>
facing entity <實體> eyes|feet
特別提醒實體後方的 eyes 或 feet 是可省略的,這裡的 eyes 與 feet 同樣是指定實體的眼部或是腿部來座位基準點,預設一樣是 feet。
6. in
in 可以用於指定只作用於哪個世界,in 後方需加上世界名稱,基本格式如下:
in <世界的 Namespace>
預設 Minecraft 裡的三個世界:主世界、地獄、終界,三者的 Namespace 分別為:minecraft:overworld、minecraft:the_nether、minecraft:the_end,如果有其他模組的世界也是如此。
7. positioned
positioned 是位於...執行的意思,positioned 用於改變指令的執行位置,基本格式如下:
positioned <座標>
positioned as <實體>
座標可以是絕對座標、相對座標、局部座標,實體可以是玩家名稱、UUID、目標選擇器。
8. rotated
rotated 是用於改變指令執行時面對的方向,與剛剛的 facing 不同之處在於 rotated 是以角度做指定,可以同時指定以其他實體的面對方向作為值。基本格式如下:
rotated <座標>
rotated as <實體>
9. if 與 unless
if 跟 unless 的功能都是用於條件判斷,只有當條件滿足了才會繼續執行後方的指令,而 unless 的條件判斷完成後會再加上否定,所以 unless 是判斷不符合條件的情況才會繼續執行後方的指令。假設位置(0, 0, 0)是空氣(air):
if block 0 0 0 air
unless block 0 0 0 air
上方的第二行因為條件成立,所以會繼續執行下去,而第三行因為條件不成立,所以後方的其他子指令會被中斷。
if 與 unless 後方可以接許多條件判斷,基本格式如下:為求方便,下方指令中 if 皆可以替換為 unless。
if block <座標> <方塊>
這個適用於單一方塊檢測。
if blocks <起點座標> <終點座標> <區域基準點> all|masked
此於區域性方塊檢測,起點座標與終點座標決定一體積,而區域基準點的指定方式需位於欲檢測之區域三軸值最小的點,因為用起點、終點座標決定的體積長寬高都是正數,與 clone 指令有異曲同工之妙。
all 或 masked 則為選擇性的參數,all 為區域內方塊必須完全相同,而 masked 則為忽略由起點、終點座標決定之體積內的空氣後,其他方塊必須完全相同。
if data block <座標> <NBT>
if data entity <實體> <NBT>
這兩行功能相似,都是檢測該座標的方塊或該實體是否包含指定的 NBT 標籤。
if entity <實體>
偵測是否含有一個以上的該實體,請特別注意有可能包含已死亡的玩家。
if score <實體> <記分板名稱> <運算子> <對照的實體> <對照之記分板名稱>
if score <實體> <記分板名稱> matches <範圍>
這兩行是對記分板分數的判定,因為是記分板,所以實體可以是虛構的,只要是記分板裡有紀錄的「實體」皆可以採用。第一行的運算子可以是:<、<=、=、>=、>。
10. store
store 可說是最強的功能之一,例:可以自動將實體的血量紀錄下來,並即時顯示至 BOSS 血條。
store result|success score <實體> <記分板名稱>
store result|success block <NBT 標籤 key> <資料型態> <倍率>
store result|success entity <NBT 標籤 key> <資料型態> <倍率>
store result|success bossbar <id> value|max
store 的 result 指的是子指令執行結果,success 指的是子指令執行次數,可以將執行成功次數儲存在計分板裡。第二行的 score 就是可以將子指令執行的結果存入記分板內,可以搭配 data block 或 data entity 取值。第三行是可以把子指令的執行結果存入方塊的 NBT 標籤內,而 NBT 標籤 key 是指:例如將資料存入盔甲座的自訂名稱中,那麼 NBT 標籤 key 應該填入 CustomName。第四行與第三行相似,可以將資料存入實體的 NBT 標籤中。第五行則是可以將值存入 BOSS 血條內,value 是設定血條的值,而 max 則是設定其血條值的最大值。
資料型態有六種:byte、short、int、long、float、double。
11. run
run 很簡單,在 run 的後方加上完整的指令即可執行該指令。
總結
execute 提供的子指令很多,這些指令都可以穿插在各個位置中,可是請注意子指令的執行先後順序,放在前面的指令會先執行。在此提供一個可以即時更新 BOSS 血量的指令:只要重複執行就可以自動更新血量條。
/execute if entity @e[tag=boss] store result bossbar BOSSBAR_ID value run data get entity @e[tag=boss,limit=1] Health