第二十五章 更加精確的目標(biāo)選擇器 上
在Java1.13及以上版本或基巖版中,當(dāng)你在輸入目標(biāo)選擇器之后,指令提示往往會出現(xiàn)一個符號,這個符號就是『[』。
為什么呢?其實(shí),一個目標(biāo)選擇器實(shí)際上有兩個部分:
<變量>[篩選參數(shù)]
其中的變量即我們了解過的@a、@e之類的,而篩選參數(shù)則是通過各種特定的條件從已選擇的實(shí)體中細(xì)分出需要的實(shí)體。
那么到底有多少種篩選參數(shù)呢?答:到目前為止(2022-8-3),Java版有21個篩選參數(shù),基巖版有22個篩選參數(shù)。
這些參數(shù)如下:
--坐標(biāo)--
\\坐標(biāo)\\
x、y、z
\\距離(球形范圍)\\
distance(JE1.13及以上)
r、rm(BE和JE1.13以下)
\\立方體范圍\\
dx、dy、dz
--旋轉(zhuǎn)角度--
\\垂直旋轉(zhuǎn)角度\\
x_rotation(JE1.13及以上)
rx、rxm(BE和JE1.13以下)
\\水平旋轉(zhuǎn)角度\\
y_rotation(JE1.13及以上)
ry、rym(BE和JE1.13以下)
--記分板--
\\記分板分?jǐn)?shù)\\
scores(JE1.13及以上和BE)
score(JE1.13以下)
\\標(biāo)簽\\
tag
\\隊伍名\\(僅Java)
team
--其他--
\\數(shù)量\\
limit、sort(JE1.13及以上)
c(BE和JE1.13以下)
\\經(jīng)驗(yàn)等級\\
level(JE1.13及以上)
l、lm(BE和JE1.13以下)
\\游戲模式\\
gamemode(JE1.13及以上)
m(BE和JE1.13以下)
\\名稱\\
name
\\實(shí)體類型\\
type
\\實(shí)體家族\\(僅基巖版)
family
\\物品\\
hasitem
\\實(shí)體數(shù)據(jù)標(biāo)簽\\(僅Java版)
NBT
\\游戲進(jìn)度\\(僅Java版)
advancements
\\謂詞\\(僅Java版)
predicate
看起來好像很復(fù)雜的樣子?部分參數(shù)的確有點(diǎn)復(fù)雜,但大部分還是很簡單的。
我們先看看格式:
?。ㄗ⒁?,接下來的“[]”都不屬于格式的符號,屬于必填符號,“<>”符號仍是格式符號)
[<參數(shù)名>=<參數(shù)值>,<參數(shù)名>=<參數(shù)值>,…]
唉,你有沒有發(fā)現(xiàn),這和JSON的格式有點(diǎn)像啊。
沒錯,和JSON一樣,目標(biāo)選擇器的每個參數(shù)也是一個『鍵-值對』。只不過需要注意以下三點(diǎn):
①目標(biāo)選擇器參數(shù)部分的最外層必須要用中括號包起來
?、谀繕?biāo)選擇器的每個參數(shù),其參數(shù)名和參數(shù)值之間是用等于號分開,而不是用分號
?、燮脚_特性,大部分英文半角符號會被強(qiáng)制改為中文全角符號
現(xiàn)在詳細(xì)的講講各種參數(shù)的使用方式。
——坐標(biāo)——
這個很熟悉吧,就是坐標(biāo)而已?!皒”就是X坐標(biāo),“y”就是Y坐標(biāo),“z”就是Z坐標(biāo)。
那么舉個栗子:
@e[x=1,y=60,z=30]
這個意思是設(shè)定基準(zhǔn)點(diǎn)為(1,60,30)。什么是基準(zhǔn)點(diǎn)呢?我們在第七章中了解到指令具有三要素:指令執(zhí)行者、指令執(zhí)行的地點(diǎn)和參數(shù)。
其中,指令執(zhí)行的地點(diǎn)也可以叫做指令執(zhí)行的基準(zhǔn)點(diǎn),簡稱執(zhí)行點(diǎn)。
所以說?
你是不是以為這三個用于確定位置的參數(shù)就是用來確定這個『指令執(zhí)行的基準(zhǔn)點(diǎn)』?當(dāng)然不是確定這個基準(zhǔn)點(diǎn)啦。實(shí)際上,除了這個基準(zhǔn)點(diǎn)外,目標(biāo)選擇器中還有一個特殊的基準(zhǔn)點(diǎn)。這個基準(zhǔn)點(diǎn)只有一個用處:用于給目標(biāo)選擇器中的某些參數(shù)提供中心。而這個基準(zhǔn)點(diǎn),就是通過x、y、z三個參數(shù)確定的(如果沒有用這三個參數(shù)確定,那么默認(rèn)是采用指令執(zhí)行的地點(diǎn))。
那么到底是哪些參數(shù)需要用到這個基準(zhǔn)點(diǎn)呢?接下來你就知道了。
對了,在基巖版,x、y、z三個參數(shù)的值是可以使用相對坐標(biāo)的。比如:
@e[x=~1,y=~,z=~]
這將會設(shè)定基準(zhǔn)點(diǎn)在指令執(zhí)行位置往東一格的地方。
——距離——
使用圓規(guī)畫圓,首先需要找到一個圓心,然后確定圓的半徑,最后旋轉(zhuǎn)360°就畫出了一個圓。
在Minecraft中,使用距離參數(shù)確定選擇實(shí)體的范圍,本質(zhì)上就是在畫一個圓(實(shí)際上是個球)。這個圓的圓心就是上面那三個參數(shù)確定的基準(zhǔn)點(diǎn),圓的半徑則是需要使用r或是distance參數(shù)確定。
比如:
@a[x=23,y=65,z=-33,r=10]——Java1.13以下和基巖版
@a[x=23,y=65,z=-33,distance=..10]——Java1.13及以上
這個目標(biāo)選擇器的意思是:以坐標(biāo)(23,65,-33)為基準(zhǔn)點(diǎn),范圍10格內(nèi)的所有玩家
但如果我們要這范圍10格以外的玩家怎么辦?這樣做:
@a[x=23,y=65,z=-33,rm=10]——Java1.13以下和基巖版
@a[x=23,y=65,z=-33,distance=10..]——Java1.13及以上
這個目標(biāo)選擇器的意思是:以坐標(biāo)(23,65,-33)為基準(zhǔn)點(diǎn),范圍10格外的所有玩家
可惜起點(diǎn)并不能放圖,不然這用圖表示會更好。
我們可以總結(jié)出r和rm的作用:
r參數(shù)的作用是:選取所有距離基準(zhǔn)點(diǎn)小于R格的實(shí)體
rm參數(shù)的作用是:選取所有距離基準(zhǔn)點(diǎn)大于RM格的實(shí)體
更高級一點(diǎn),你還可以r和rm一起用,比如:
@a[x=23,y=65,z=-33,r=10,rm=5]——Java1.13以下和基巖版
@a[x=23,y=65,z=-33,distance=5..10]——Java1.13及以上
這樣子可以選取距離基準(zhǔn)點(diǎn)大于5格但小于10格的玩家(相當(dāng)于畫兩個圓組成一個圓環(huán),然后選取圓環(huán)內(nèi)部及邊緣的實(shí)體)。
你也可以:
@a[x=23,y=65,z=-33,r=10,rm=10]——Java1.13以下和基巖版
@a[x=23,y=65,z=-33,distance=10]——Java1.13及以上
這樣子可以選取距離基準(zhǔn)點(diǎn)10格的玩家(注意,只能是10格,多一點(diǎn)少一點(diǎn)都不行)。
需要注意的是,R必須大于等于RM,不然什么也選不中。
r和rm畢竟是基巖版和Java1.13以下版本用的,在Java版1.13及以上版本使用的distance,又是怎么用的呢?
其實(shí)上面講r和rm時,順帶列出來相同用法的distance,就已經(jīng)告訴你distance的四種用法了。
如果你還不清楚,我們就將R和RM兩個參數(shù)值代入到distance,來告訴你distance到底怎么用:
[distance =..R]——選取所有距離基準(zhǔn)點(diǎn)小于R格的實(shí)體
[distance =RM..]——選取所有距離基準(zhǔn)點(diǎn)大于RM格的實(shí)體。
[distance =RM..R]——選取所有距離基準(zhǔn)點(diǎn)大于RM格小于R格的實(shí)體。
[distance =R|RM]——選取所有距離基準(zhǔn)點(diǎn)RM(R)格的實(shí)體。
發(fā)現(xiàn)規(guī)律了沒有?那兩個點(diǎn)在數(shù)字左邊,就代表小于X格的實(shí)體;在右邊,即大于X格的實(shí)體;在兩個數(shù)值中間,就代表距離在這兩個值中間的實(shí)體;沒有那兩個點(diǎn),只有一個數(shù)值,那么就只代表距離X格的實(shí)體。
?。⒎襟w范圍)
使用/fill確定的立方體范圍很好理解,而目標(biāo)選擇器的立方體范圍......
因?yàn)樗⒉皇亲屇阏覂蓚€點(diǎn)......
而是,以基準(zhǔn)點(diǎn)分別向三個方向延伸多少格構(gòu)成的立方體!
?。∕ojang本來這么做是為了相對坐標(biāo),只不過這就導(dǎo)致使用絕對坐標(biāo)時很頭疼)
舉個最簡單的例子:
@a [x=0,y=0,z=0,dx=10,dy=10,dz=10]
這個目標(biāo)選擇器的意思是:
選取從(0,0,0)到(10,10,10)構(gòu)成的立方體內(nèi)的所有玩家。
更深一層的意思是:
以基準(zhǔn)點(diǎn)(0,0,0)向正X軸延伸10格,正Y軸延伸10格,正Z軸延伸10格所構(gòu)成的立方體內(nèi)的所有玩家。
但一般來說,基準(zhǔn)點(diǎn)可不會是這么簡單的三個數(shù)值。所以我們使用dx、dy、dz時,必須要掌握一個技術(shù):將/fill構(gòu)成立方體的兩點(diǎn)坐標(biāo)轉(zhuǎn)化為目標(biāo)選擇器的基準(zhǔn)點(diǎn)和延伸格數(shù)。
將/fill構(gòu)成立方體的兩個坐標(biāo)記為:
A?=(x?,y?,z?)
A?=(x?,y?,z?)
設(shè)定A?為基準(zhǔn)點(diǎn),即:
[x=x?,y=y?,z=z?]
A?-A?,得:
A?=(x?-x?,y?-y?,z?-z?)
這個結(jié)果就是dx、dy、dz的值了:
[x=x?,y=y?,z=z?,dx=x?-x?,dy=y?-y?,dz=z?-z?]
舉個例子:
A?=(287,65,122)
A?=(300,69,24)
就可以得出:
[x=287,y=65,z=122,dx=13,dy=4,dz=-98]
這樣子,以后我們就不用刻意去記到底要延伸多少格了(除了x、y、z并沒有指定的情況下,這時候就要以相對坐標(biāo)的思維去思考了)。
對了,在Java版,判定實(shí)體是否在范圍內(nèi)是按照碰撞箱是否有重疊判斷,在基巖版則是按照腳部坐標(biāo)判斷。
——記分板分?jǐn)?shù)——
——記分板標(biāo)簽——
——隊伍名稱——
上面幾格都是關(guān)于“記分板”(scoreboard)的,這個會在第四十九章中講到。
——數(shù)量——
這個很有意思。Java1.13及以上版本是limit和sort,基巖版和Java1.13以下版本是只有一個c。
由于limit和sort相比于c是大徑相庭,所以我們先從limit和sort開始。
使用@e,我們可以選擇所有實(shí)體,但我們該怎么選擇10只實(shí)體呢?
@e[limit=10]
就可以了。
但如果要選中最靠近目標(biāo)選擇器基準(zhǔn)點(diǎn)的實(shí)體該怎么辦?
這時候我們就需要使用sort,調(diào)整選取模式。
在Java1.13及以上版本中,@a和@e這兩個目標(biāo)選擇器變量的默認(rèn)選取模式是按照實(shí)體生成時間由長到短排列,即越老排越前面,對應(yīng)sort的選取模式即:arbitrary。
我們要選中最靠近基準(zhǔn)點(diǎn)的實(shí)體,只需要使用nearest模式即可:
@e[limit=1,sort=nearest]
這樣子就可以選取最靠近基準(zhǔn)點(diǎn)的實(shí)體。但請注意,在基巖版和Java1.13以下版本中,@a和@e這兩個目標(biāo)選擇器變量是按照實(shí)體與目標(biāo)選擇器基準(zhǔn)點(diǎn)的距離從小到大排列的,也就是nearest模式,并不是按照實(shí)體生成時間排列。
sort一共有四種模式:
nearest——由近到遠(yuǎn)
furthest——由遠(yuǎn)到近
random——隨機(jī)
arbitrary——按生成時間由老到新
其中,對于arbitrary模式來講,『c』這個參數(shù)基本上無法模仿。
那么c參數(shù)該如何使用呢?
先別著急,因?yàn)檫€有一個知識點(diǎn)沒講:
其實(shí),當(dāng)使用@p和@r變量時,limit或c默認(rèn)為1,更改limit或c會增加選擇最近(@p默認(rèn)排列模式為nearest)或隨機(jī)(@r默認(rèn)為random模式)目標(biāo)的數(shù)量。當(dāng)使用@a或@e變量時,此方式會限制目標(biāo)數(shù)量。如果是@s呢?那還用說嗎?你有10個嗎?Minecraft可沒有分身術(shù)。
注意一點(diǎn),limit不能寫負(fù)數(shù),但c可以。
c參數(shù)為正整數(shù)時,在除@r變量外會選取最靠近基準(zhǔn)點(diǎn)的C個目標(biāo);為負(fù)整數(shù)時,在除@r變量外會選取最遠(yuǎn)離基準(zhǔn)點(diǎn)的C個目標(biāo)。比如:
@a[c=5]
@a[c=-5]
前者會選取最近的5名玩家,后者會選取最遠(yuǎn)的5名玩家。
但如果要隨機(jī)排序呢?那么就得用@r(隨機(jī)排序)變量了。
c參數(shù)還有一個小知識,如果所有目標(biāo)都一樣遠(yuǎn)(你這不是鉆牛角尖嗎),在負(fù)整數(shù)的情況下將會選取生成時間越晚的實(shí)體,正整數(shù)情況下將會選取生成時間越早的實(shí)體。
——經(jīng)驗(yàn)等級——
這個用來選取經(jīng)驗(yàn)等級的參數(shù),兩個版本又不相同了。Java1.13及以上版本是level,基巖版和低于Java1.13的版本是l和lm。
等等,你有沒有發(fā)現(xiàn),這和那個rm、r、distance不超級像的嗎?
沒錯,基本上你怎么用距離的,選取經(jīng)驗(yàn)等級就怎么用。比如選取經(jīng)驗(yàn)等級小于等于5的玩家:
@a[l=5]——Java1.13以下和基巖版
@a[level=..5]——Java1.13及以上
又比如選取經(jīng)驗(yàn)等級大于等于5的玩家:
@a[lm=5]——Java1.13以下和基巖版
@a[level=5..]——Java1.13及以上
又比如選取經(jīng)驗(yàn)等級在5到10級之間(含5和10級)的玩家:
@a[l=10,lm=5]——Java1.13以下和基巖版
@a[level=5..10]——Java1.13及以上
又比如選取經(jīng)驗(yàn)等級正正好好為5級的玩家:
@a[l=5,lm=5]——Java1.13以下和基巖版
@a[level=5]——Java1.13及以上
懂了吧?不懂就對照r、rm、distance多看幾遍。
本章就到此結(jié)束。