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