# 命令
> 本文只讨论原版(无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有不同
>
> 使用执行统计前请多测试,避免实际结果与猜测的不同