# 命令
> 本文只討論原版(無Mod無插件)、單人模式可以執行、權限等級為2的命令
命令就是一條文字,通過讓游戲運行這條文字來執行不同的功能、操作。命令有不同參數,也就是可以改變的地方,決定了命令執行的結果,如把東西傳送到什么地方、在玩家聊天欄顯示什么文字等等。
根據命令的功能,我們可以大致分為幾類:
+ 只影響玩家的
+ 影響實體的(無論能不能影響玩家)
+ 影響方塊的
+ 顯示的(只有玩家能看見、聽見,不影響游戲內任何東西的)
+ 記分板及檢測類
+ 其他(其他的幾乎都自成一體系)
> 部分命令同時屬于幾類,如`replaceitem`能影響實體及方塊實體(block-entity)
> 本文將**不會說明所有命令的用法**,只會在例子中對使用的命令作出**簡單介紹**,詳細說明請見 https://minecraft.gamepedia.com/Commands (英文版,有能力者建議閱讀英文版)或 https://minecraft-zh.gamepedia.com/%E5%91%BD%E4%BB%A4 (中文版,部分內容較過時)
## 執行者
執行者就是執行那段命令的物件,分別有幾種情況:
+ 管理員執行命令(于聊天欄執行或聊天欄、書本的clickEvent),執行者為管理員自己(玩家)
+ 服主于后臺執行命令,即服務器執行命令,執行者為服務器(非方塊非實體,坐標為(0, 0, 0),權限等級為4,即能執行所有命令)
+ 玩家點擊牌子執行命令,執行者為玩家,權限為2(不論點擊者權限為多少)
+ 命令方塊執行命令,執行者為命令方塊(方塊)
+ `execute`讓實體執行后方的命令,后方的命令的執行者為被選擇到的實體
+ `function`執行`xxx.mcfunction`文件內命令,`xxx.mcfunction`內所有命令的執行者為`function`的執行者
+ 游戲規則(gamerule)中`gameLoopFunction`執行的`xxx.mcfunction`文件內命令的執行者為一個虛擬執行者,權限為2,坐標為(0, 0, 0)
> 這里需要的`execute`命令的**不完全語法**: `execute <實體> ~ ~ ~ <命令>`,即讓實體執行指定命令
> 這里需要的目標選擇器**不完全語法**: `@e[name=xxx]`,即選擇名稱為xxx的實體
例子: 讓管理員(名稱為admin)執行以下命令
```
execute @e[name=a] ~ ~ ~ execute @e[name=b] ~ ~ ~ say hi
```
整條命令的執行者為玩家admin
`execute @e[name=b]... hi`這命令的執行者為實體a
`say hi`這命令的執行者為實體b
## 執行點
默認情況下, 命令執行點就是執行者的坐標。
命令執行點對相對坐標有非常重要的影響(相對坐標大多是以執行坐標為原點計算的), 以及目標選擇器選擇條件、順序也和執行坐標有關系。
有兩種情況會導致執行點與執行者坐標不同:
+ `execute`命令,而且有指定后方的執行坐標(不是(~, ~, ~))。那時候后面的命令的執行坐標就和執行者坐標不同了。
+ 牌子clickEvent。那情況下執行者是點擊的玩家,然而執行坐標是牌子的坐標。
## 執行統計
命令執行的時候會統計影響到的東西數量、成功執行次數與執行結果。
所有統計都是整數,儲存在NBT里,需要時可以直接用nbt查詢或以`stats`命令綁定到 指定玩家名/實體 的記分板分數。
注意: 之后的執行結果會覆蓋之前的數值。
執行統計包括:
+ 成功執行次數(SuccessCount)
+ 影響實體數(AffectedEntities)
+ 影響方塊數(AffectedBlocks)
+ 影響物品數(AffectedItems)
+ 查詢結果(QueryResult),部分查詢類的命令會把結果寫進這統計里,如`time query gametime`、`worldborder get`等
> 部分影響實體的命令會使用循環的方式執行,也就是逐個目標實體執行命令,類似編程中的`foreach`
> 故此,那些命令的影響實體數總是1,只是SuccessCount有不同
>
> 使用執行統計前請多測試,避免實際結果與猜測的不同