# 目標選擇器
## 用途
命令很多時候是需要針對實體去執行的,比如`tp`命令。如果你使用玩家名來指定傳送的玩家,比如**tp pca006132 0 5 0**,你就需要針對每個玩家寫一個命令。
這方法在很多情況下是不可能使用的,因為我們不一定會知道被傳送的玩家是誰,而且就算知道所有玩家,我們也需要舉出所有的可能(窮舉),不然就有些玩家無法傳送,這樣做需要的命令數就會非常多。除此之外,如果我們這樣做,我們就無法傳送玩家以外的實體了,所以窮舉玩家名的方法是接近不可能的。
所以,在針對實體執行命令的情況下,我們通常會使用目標選擇器。
選擇器的用途,就是根據某些條件(用選擇器參數指定)來選擇實體,所以選擇到的數量可以是沒有/一個/多個。
## 格式
```
@選擇器名稱
@選擇器名稱[參數1=值,參數2=值]
```
|參數名稱|描述|
|----|----|
|選擇器名稱|決定選擇器行為|
|參數|額外選擇條件。不一定要存在,但如果存在一個或多個參數則必須用方括號括住,并且以逗號分隔開不同的參數(所有符號都是英文符號,如,和[])|
|值|參數所對應的數值,用來確定參數所對應的數據,與參數結合使用來選擇實體。|
> 注: 每個參數只能出現一次
> 選擇器內不能出現空格
### 選擇器名稱
|名稱|描述|
|---|---|
|p| 最近的玩家(type參數在此無效)|
|a| 全部玩家(包括死去的玩家, type參數在此無效)|
|r| 隨機實體(默認為玩家)|
|e| 所有實體(包括玩家)|
|s| 執行者(實體,當執行者不符合要求時則不選擇任何實體)|
### 參數
格式: 參數名=數值
文字類的數值前加上!則代表選擇所有非該數值的目標
數值不能出現小數。
|名稱|描述|
|---|---|
|x,y,z|以該坐標作為**判定的起始點**(默認為執行坐標)<br> 比如你填寫x=1,y=1,而你執行命令的坐標是x=5,y=5,z=5,那么那個判定的起始點就是x=1,y=1,z=5<br> 如果**只是填寫其中一個/兩個參數**,**剩下的就會默認為執行坐標**(比如x=5,而執行坐標是100 5 200,那么那個判定的起始點就是 5 5 200)|
|r,rm|離判定的起始點(參見上方x, y, z參數)的**距離** (r就是判定區域的**半徑**,rm就是**不包括在**判定區域內的圓形半徑)<br> 比如r=5就是選擇所有在5格范圍內的實體,rm=5就是選擇所有5格范圍外的實體<br> 比如@p[r=10,rm=3]就是離判定的起始點的距離小于等于10米,大于3米的最近玩家|
|m|玩家的游戲模式<br> 0=生存,1=創造,2=冒險,3=旁觀|
|c|數量<br> 這個是根據選擇順序來選擇的<br> 正數的話就是選擇最先選擇到的n個實體,負數就是選擇最后選擇到的n個實體<br> 所以請參見下方的選擇優先規則<br> 比如@e[c=5]就是最近的5個實體,@e[c=-5]就是最遠的5個實體<br><br>**重要**:當c=1、選擇器名稱不為`r`并且命令執行者的類型符合選擇器選擇到的實體類型,選擇器將會選擇執行者|
|l,lm|經驗等級,l是小于等于,lm是大于等于|
|score_變量|該變量(objective)的**分數范圍**(小于**等于**)|
|score_變量_min|該變量(objective)的**分數范圍**(大于**等于**)|
|team|隊伍名稱(可以使用!表示不等于, 如team=!blue就是選擇不在blue隊伍里的)<br> team= 就是代表沒有隊伍的實體(比如@e[team=])<br> team=!就是代表有隊伍的實體|
|name|實體的名稱(可以使用!表示不等于, 如name=!pca就是選擇名稱不是pca的實體)|
|dx,dy,dz|長方體的范圍<br> 由起始點(參見上方x, y, z參數)延伸出去(dx就是沿著x軸延伸的格數,如此類推。正數就向正的方向,負數就向負的方向,范圍必定是完整的格子,沒有任何偏移,即使執行位置不是整數)的范圍內的實體<br> *注意: 只要實體的碰撞箱接觸到這范圍就會被選中,而不是看其坐標<br> |
|rx,rxm|實體垂直朝向(看的方向)<br> 0:水平;-90:向上;90:向下<br> rx:最大的角度;rxm:最小的角度<br>只會視乎角度的整數部分, 比如實體的實際方向是1.1, rx=1,rxm=0和rx=2,rxm=1都會選擇到那個實體<br>當rx>rxm的時候, 選擇到的角度范圍就是rx-rxm;<br> 當rx<rxm的時候, 范圍就會斷開, 也就是上一個情況的相反, 詳見下方例子|
|ry,rym|實體水平朝向(看的方向)<br> 0:+Z方向;90:-X方向;180(-180):-Z方向;-90:+X方向<br> (可以使用大于180的度數)<br> ry:最大的角度;rym:最小的角度(如ry=50, rym=0就是50度的范圍;ry=0, rym=50就是310度的范圍)<br>當ry>rym, 選擇到的角度范圍=ry-rym;<br> 當rym>ry, **選擇到不到**的角度范圍就是ry-rym, 也就是上一個情況的相反, 詳見下放例子<br> |
|type|實體種類(所有summon的實體種類+player。可以使用!表示不等于,如type=!player就是所有不是玩家的實體)<br> type=!lightning_bolt則代表所有類型的實體(對@r相當有用)|
|tag|選擇擁有此標簽的實體,<br> 在數值前添加"!"將只選擇不擁有此標簽的實體,<br> 提供空的標簽名將選擇所有沒有標簽的實體,<br> 只填寫“!”將選擇任何擁有標簽的實體。<br> 注意: 只能檢查一個tag|
## 空間限制
如果選擇器里有任何關于坐標的參數(比如r/rm/dx),那個參數的作用范圍就是執行的世界(其他世界的不會被選擇到)
如果那個選擇器里同時有dx/dy/dz和r/rm,那么選擇到的范圍就是dx/dy/dz和r/rm重疊的范圍
如果那個選擇器里有dx/dy/dz任何一個/兩個,那么剩余的會默認為0
> 關于死去的玩家:
> 死去的玩家能夠被`@a`選擇器選擇到,然而當我們加入了任何空間限制后就無法選擇
> ~~故此我們認為死去的玩家是存在于第四維的【嚴肅臉】~~
## 選擇順序
選擇器會優先選擇在執行的世界的實體/玩家(先選擇最近的實體,當那些實體的距離一樣時,它就會優先選擇存在最久的),然后就是別的世界距離你現在坐標最近的實體
## 常見錯誤
+ 重復的選擇器參數,比如兩個type
+ 以為score_變量名稱=數值代表選擇分數=數值的實體,然而事實是選擇分數小于等于數值的實體
+ 大小寫/全型半型錯誤。實際上那些參數的名稱都是小寫,而那些數值也是大小寫敏感的
+ 把實體NBT當作選擇器參數一樣寫,然而選擇器參數就那幾個,NBT并不是選擇器參數,選擇器參數也不是NBT
+ 以為物品名稱就是它扔出來之后的名稱,然而并不是(原因:物品名稱的NBT是 **{Item:{tag:{display:{Name:名稱}}}}**,而實體名稱的NBT是 **{CustomName:名稱}**)
+ 邏輯相關錯誤,比如在執行這個指令的時候分數不可能在指定范圍內
+ @a寫成@e[type=player],或者是@p寫成@a[c=1]。嚴格來說并不是錯誤,然而這個是不好的習慣
因為這樣子你的命令可讀性就會減低,而且那個命令長度會增加,不好寫
+ 開括號之后需要關括號,比如 **@e[type=armor_stand.r=3** 就會判斷為@e,相差會很遠
## 特殊情況
+ c=1時,MC會有特別的選擇實體方法。比如牌子點擊的話就會選擇點擊者(盡管點擊者未必與執行坐標,也就是牌子的位置最近),或者UUID碰撞/因特殊原因無法選擇時能選擇到該實體。然而注意,要使用此功能的話請不要填寫其他參數,否則可能會導致MC不采取此方法選擇實體
## 例子
選擇一個距離執行點5格以外,最近的實體
```
@e[rm=5,c=1]
```
---
選擇所有變量(objective) X分數大于50、小于100,變量Y分數大于等于-200,小于等于0,目標Z分數等于200的實體
```
@e[score_X_min=51,score_X=99,score_Y_min=-200,score_Y=0,score_Z_min=200,score_Z=200]
```
---
選擇隨機5個實體
```
@r[c=5,type=!lightning_bolt]
```
---
選擇ry=0至ry=90的實體(0≤ry≤90)

```
@e[ry=90,rym=0]
```
---
選擇ry=90至ry=0的實體(0≤ry≤90)

```
@e[ry=0,rym=90]
```
---
選擇rx=20至rx=-20的實體(-20≤rx≤20)

```
@e[rx=20,rxm=-20]
```
---
選擇rx>=20和rx<=-20的實體(rx≤-20 or rx≥20)

```
@e[rxm=20,rx=-20]
```