命令执行
命令简介
命令是一个特殊的功能,透过输入一些字串,玩家能够做到不同的东西,比如瞬移等。
从1.7开始,由于命令的功能更加强大,更多玩家开始使用命令方块(俗称"CB")以做出一些特别的功能,比如RPG类地图及原版模组。
命令的使用方法(单人,并且你要有使用该命令的权限):
- 在聊天栏里输入"/命令",比如/help
- 在命令方块里输入命令, 之后激活该命令方块(除了红石信号以外还有别的激活方法, 详见命令方块部分)
命令类型
命令有6种类型,分别是
- 影响玩家的命令(不影响别的实体)
- 影响实体的命令(可以包括玩家)
- 影响方块的命令
- 影响世界设定的命令(可能会间接影响到玩家/实体)
- 探测类命令(记分板、stats等亦包括其中)
- 多人游戏的命令(在本教程内不会提及)
需要注意的是, 某些命令可能是复合类型的, 比如/replaceitem, 分别能够影响玩家及方块。
命令执行对象、作用对象
任何命令都有其执行者与作用对象。
比如玩家执行一条命令, 执行者就是玩家。命令方块执行一条命令, 执行者就是命令方块。/execute一个实体执行命令,执行者就是那个实体。
所以命令的执行者可以是: 服务器(这玩意比较少提及,也不清楚执行坐标在哪(没人测试))、命令方块、玩家(未必是实体,比如死了的玩家也可以执行命令的)、实体。
命令也有作用对象, 和执行者类似, 作用对象也未必是玩家、实体, 可以是方块, 甚至存档的设定。
为什么要分开两者呢?
有些命令默认会作用在执行者身上, 如/clear命令默认会清空执行玩家的背包。然而执行对象未必是作用对象, 比如/setblock命令作用是在某个坐标放置方块, 那么难道是作用在执行玩家身上么?
那么执行者是否没用、可以忽略呢?也不是。有些命令需要视乎坐标(其实很多命令都需要, 尤其是使用目标选择器的时候), 那个时候就很在乎执行坐标了。而执行坐标一般视乎执行者。这时候执行者就有很重要的影响了。
命令执行坐标
默认情况下, 命令执行坐标是执行者的坐标。
命令执行坐标对相对坐标有非常重要的影响(相对坐标是以执行坐标为原点计算的), 以及目标选择器选择条件、顺序也和执行坐标有关系。
然而执行坐标由两种情况下不是执行者坐标:
- execute实体, 而且有指定执行坐标。那时候后面的命令的执行坐标就和执行者坐标不同了。
- 牌子clickEvent。那情况下执行者是点击的玩家, 然而执行坐标是牌子的坐标。
命令执行
大部分命令的执行可以分拆成多次执行, 主要是一些牵涉到目标选择器的命令。
举个例子, /give @a command_block
这命令, 先假设@a选择到的玩家是a、b和c
就可以分别拆成:
- /give a command_block
- /give b command_block
- /give c command_block
大部分这类型针对实体的命令都能分拆成多个小命令多次执行, 不过也有些是例外的, 比如/spreadplayers。
这样子思考的话, 就能够解决很多牵涉到多个实体的命令执行情况了。比如是/execute嵌套。
命令执行统计
命令执行的时候会统计影响到的东西数量、成功执行次数与执行结果。
所有统计都是整数, 储存在NBT里, 需要时可以直接用nbt查询或以/stats命令绑定到指定玩家名/实体的记分板分数。
成功执行次数
成功执行次数(SuccessCount)就是命令成功执行的次数。
上面的命令执行部分可以看到, 部分命令是可以分拆成多次执行的, 而实际上MC也是那么执行。
因此, 那类型的命令的执行次数就是选择器选择到的实体数。
而成功执行次数就是那些执行次数里成功执行的次数。
其他命令的成功执行次数就全部是1。
execute的成功执行次数之后execute的章节会详细讲解。
影响实体数
影响实体数(AffectedEntities)就是命令在一次执行里影响到的实体数量。
注意: 几乎全部命令(即使是setblock), 即使执行失败, AffectedEntities也是1...别问我为什么, 去问Mojang吧
影响方块数
影响方块数(AffectedBlocks)就是命令在一次执行里影响到的方块数量, 不影响方块的命令则为0
大部分影响方块的命令都只会影响一个方块, 因此大部分的影响方块数=1。
然而, 部分命令, 如/fill、/clone、/testforblocks会影响多个方块, 它们的影响方块数就比较特别, 讲解它们的时候会详细说明。
影响物品数
影响物品数(AffectedItems)顾名思义就是影响了多少个物品...
只对/give、/clear、/replaceitem等影响物品的命令有用, 其他命令为0。
查询结果
查询结果(QueryResult)是比较特别的一种统计, 会储存查询结果的数值。
只对/gamerule(查询模式)、/time query等查询命令有效。其他命令均为0。