首頁 游戲

Minecraft指令手冊

第二十五章 更加精確的目標(biāo)選擇器 上

Minecraft指令手冊 你好MC 2250 2020-01-09 19:28:33

  在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é)束。

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進(jìn)入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設(shè)置
設(shè)置
書架
加入書架
書頁
返回書頁
指南