记分板命令
本章将简略地介绍记分板的相关命令以及使用实例。注意,除了operation相关的命令有特殊情况,其它命令中关于玩家的参数,都可以使用*
代指记分板上的所有玩家。
变量相关命令
scoreboard objectives add <name> <criteria> [display name...]
创建一个新的变量,name为变量名,criteria为判据,display name为显示名称。
实例:加入一个名为a,判据为dummy,显示名称为scb的变量:
scoreboard objectives add a dummy scb
scoreboard objectives list
列出当前的变量及其类型。
实例:直接输入该命令即可。效果如下:
scoreboard objectives remove <name>
移除一个变量。name为变量名。
实例:移除一个名为a的变量:
scoreboard objectives remove a
scoreboard objectives setdisplay <slot> [objective]
设置变量显示位置。slot为位置,objective为变量名。
实例:设置变量a显示在侧边栏(sidebar):
scoreboard objectives setdisplay sidebar a
显示效果及可用位置见4.1 记分板变量部分。
变量对象相关命令
scoreboard players list [对象名称]
列出记分板上的对象。对象名称填写则显示对象名称在具体变量上的分数。
实例1:不填写参数,直接输入时:
实例2:输入:
scoreboard players list KakagouLT
显示:
可以看到显示的格式为-显示名称:分数(名称)。
scoreboard players set <对象> <变量> <分数> [NBT]
设置对象在变量上的分数。NBT用于指定符合条件的实体。(Base tag为entity)注意,在set分数之前,玩家是不存在分数的。
实例:给玩家A在b上的分数设置为10:
scoreboard players set A b 10
scoreboard players add <对象> <变量> <数值> [NBT]
scoreboard players remove <对象> <变量> <数值> [NBT]
给对象的指定变量加/减分,<数值>
为修改量。NBT用于指定符合条件的实体。(Base tag为entity)
实例1:给玩家B在b上的分数加5(原来必须存在分数,否则功能与set相同):
scoreboard players add B b 5
实例2:给玩家B在b上的分数减5(原来必须存在分数,否则功能与set相同且设置的分数为负分):
scoreboard players remove B b 5
特例1:给玩家初始化在变量A上的分数。如果原先没有分数则设置为0,否则则不改变分数:
scoreboard players add @a A 0
应当指出,加分减分以及分数设置命令不适用于判据为只读型的变量。
scoreboard players reset <对象> [变量]
将对象从记分板上移除。这项操作不是把分数设为0,而是不再追踪对象。如果填写了变量,则只将对象从这个指定的变量中移除。这个命令也可以让只读型变量不再追踪真实玩家。
实例:将玩家A从变量b中移除:
scoreboard players reset A b
scoreboard players enable <对象> <trigger变量>
这是一个与触发器相关的命令,可以给予玩家修改某个判据为trigger的变量的权限。我们将在下文trigger部分详细介绍这个命令的用法。
scoreboard players test <对象> <变量> <min> [max]
检测玩家在变量上的分数是否在min(最小值,大于等于)和max(最大值,小于等于)之间。如果不填max,则默认max为2,147,483,647。如果min为*
,则视为min是-2,147,483,648。
当检测成立,效果和testfor命令检测成立时相同。
实例1:检测玩家A在b上的分数是否处于200到300之间:
scoreboard players test A b 200 300
实例2:检测玩家E在b上的分数是否大于等于100,即在100到2147483647的范围内:
scoreboard players test E b 100
scoreboard players operation <targetName> <targetObjective> <operation> <selector> <objective>
进行分数的数学运算。运算方式为operation。将被运算的分数分别是:targetName在targetObjective的分数,和selector在objective上的分数。以下简称这两个分数为tar和sel。
对于+=
,-=
,*=
,/=
,%=
五个运算符来说,相关的操作为在tar的基础上加/减/乘/除/求余sel。
另外,除法结果若有小数则丢弃小数位的数据。除/求余0的操作不会改变分数。负数的处理方式与数学运算方式相同。
=
的作用是将tar设为sel。
对于<
,>
两个运算符来说,相关的操作为:如果不满足tar小于/大于sel,则将tar设为sel。
><
的作用是交换两个数的值。
实例:下面的表格展示了各个操作的对应结果:
原分数tar(左) | 原分数sel(右) | 运算符 | 结果分数tar(左) | 结果分数sel(右) | 注释 |
---|---|---|---|---|---|
3 | 2 | += | 5 | 2 | - |
3 | 2 | -= | 1 | 2 | - |
3 | 2 | *= | 6 | 2 | - |
3 | 2 | /= | 1 | 2 | 丢弃小数位的数据 |
4 | 2 | /= | 2 | 2 | - |
3 | 0 | /= | 3 | 0 | 除0不会报错而是不会运作 |
-3 | 2 | /= | -1 | 2 | 按照数学方法处理负号 |
8 | 3 | %= | 2 | 3 | - |
8 | -3 | %= | 2 | -3 | tar符号不变 |
-8 | 3 | %= | -2 | 3 | tar符号不变 |
-8 | -3 | %= | -2 | 3 | tar符号不变 |
3 | 0 | %= | 3 | 0 | 除0不会报错而是不会运作 |
3 | 2 | = | 2 | 2 | - |
3 | 2 | > | 3 | 2 | - |
2 | 3 | > | 3 | 3 | - |
3 | 2 | < | 2 | 2 | - |
2 | 3 | < | 2 | 3 | - |
5 | 6 | >< | 6 | 5 | 唯一一个会修改右边分数的运算 |
标签相关命令
scoreboard players tag <实体> add <标签> [NBT]
scoreboard players tag <实体> remove <标签> [NBT]
scoreboard players tag <实体> list
第一条命令就是,当指定实体符合NBT要求(如无NBT则不用符合)则加上标签。(无法重复加上标签)
第二条命令就是,当指定实体符合NBT要求(如无NBT则不用符合)则移除指定标签。
第三条命令就是,列出指定实体的标签。
标签无法运用于假名。
实例:
# 给所有玩家加上online标签
scoreboard players tag @a add online
# 从移除了AI的实体身上删掉标签smart
scoreboard players tag @e remove smart {NoAI:1b}
# 列出所有实体的标签
scoreboard players tag @e list
list命令效果如下:
队伍相关命令
scoreboard teams list [teamname]
列出存在的队伍。指定teamname时显示队伍内的实体。
实例1:不填写参数,直接输入:
显示格式为-名称:'显示名称'有*个玩家
实例2:填写参数,输入:
scoreboard teams list teamA
显示:
scoreboard teams add <name> [display name...]
创建一个新的队伍。队伍名称为name,显示名称为display name。
实例:创建一个名称为teamB,显示名称为tB的队伍:
scoreboard teams add teamB tB
scoreboard teams remove <name>
移除一个队伍。name为队伍名称。
实例:移除队伍teamA:
scoreboard teams remove teamA
scoreboard teams empty <name>
清空一个队伍里的成员。
实例:清空队伍teamB的成员:
scoreboard teams empty teamB
scoreboard teams join <team> [实体...]
让实体加入队伍team。
实例:让玩家A、B、C加入队伍teamA:
scoreboard teams join teamA A B C
scoreboard teams leave [players...]
将玩家players从队伍中移除。因为每个玩家只能加入一个队伍,所以不必指定队伍名称。
实例:将A、B、C移出队伍:
scoreboard teams leave A B C
scoreboard teams option <team> color <value>
scoreboard teams option <team> friendlyfire <true|false>
scoreboard teams option <team> seeFriendlyInvisibles <true|false>
scoreboard teams option <team> nametagVisibility <never|hideForOtherTeams|hideForOwnTeam|always>
scoreboard teams option <team> deathMessageVisibility <never|hideForOtherTeams|hideForOwnTeam|always>
scoreboard teams option <team> collisionRule <always|never|pushOwnTeam|pushOtherTeams>
设置队伍相关的属性。team是队伍名称。
color
指定队伍颜色,可用的颜色为black
,dark_blue
,dark_green
,dark_aqua
,dark_red
,dark_purple
,gold
,gray
,dark_gray
,blue
,green
,aqua
,red
,light_purple
,yellow
和white
。填写reset
则清空颜色friendlyfire
决定是否开启友军伤害。true为开启,false为关闭。seeFriendlyInvisibles
决定是否开启队友隐身可见。参数相关意义同上。nametagVisibility
决定名称牌是否可见。never为所有人(包括队伍系统外的玩家)不可见,hideForOtherTeams为其他队伍玩家不可见,hideForOwnTeam为本队玩家不可见,always为所有人可见。deathMessageVisibility
决定死亡信息是否可见。参数相关意义同上。collisionRule
决定碰撞规则。always为队员对所有人(因为碰撞规则而无法推动的除外)都可相互推动,never为队员可以穿过任何实体而不发生推动,pushOwnTeam为只保留队员之间的推动,pushOtherTeams为取消队员之间的推动。
有关详情请参见队伍
trigger相关命令
在前面的介绍中我们提到了scoreboard players enable <player> <trigger>
。这个章节将介绍触发器(trigger)相关的命令和使用方法。
触发器,就是判据为trigger的变量。创建一个名称为trig的触发器:
scoreboard objectives add trig trigger
如果要让玩家修改触发器的数值,需要先给玩家设置修改权限,即使用enable命令:
scoreboard players enable @p trig
这里的@p也能修改成具体玩家的名称,或者能指定玩家的目标选择器。
当玩家获得权限后,就可以使用以下的trigger命令:
trigger <objective> <add|set> <value>
objective是触发器名称,add为增加分数,set为设置分数,value为一个分数值。
例如:
trigger trig add 3
可以使trig的分数+3(原先没有分数则设置为3)
trigger trig set 5
直接将trig的分数设置为5。
当玩家使用过trigger命令后,他就失去了继续对同一触发器使用trigger
的权限。所以每次使用后都需要重新使用enable命令才能让玩家再次能使用trigger。
stats命令
Stats其实就是把命令执行统计(参见 命令执行统计 )绑定到一个对象的变量分数,从而获得命令执行统计并进行计算。
我们一般会用stats来:
- 检查(指定)方块数量(使用AffectedBlocks)
- 检查(指定)物品数量(使用AffectedItems)
- 获得某些数据,如当前时间(使用QueryResult及某些特殊查询类命令)
- 命令执行成功与否(使用SuccessCount)
如果是影响实体数(AffectedEntities),我们一般都能够直接使用execute
命令逐个地为实体加分,故此我们大部分时间也不需要使用这项stats。而且这项统计对于大部分命令也是1(无论目标实体数量是多少),故此获得实体数量没太大意义。
绑定stats的流程:
- 初始化对象的变量分数:一般为0。如果一开始已经有分数则不必初始化。
- 执行
stats
命令,其格式将会在下方仔细描述。
其中初始化是十分重要的,没初始化导致错误是新手经常发生的错误。
命令格式
Stats命令格式(实体)
stats entity <目标实体> clear <命令执行统计>
stats entity <目标实体> set <命令执行统计> <对象> <变量>
前一条命令是用作解除绑定,后者为绑定。
目标实体为我们需要获得命令执行统计的实体。
命令执行统计就是我们需要绑定的统计,参见 命令执行 里的命令执行统计。
对象就是我们绑定到的对象,变量就是储存分数的变量。
简单来说就是,把目标实体的命令执行统计储存在对象的变量分数里。
至于方块(只是对命令方块有效),就是把entity <目标实体>
替换为block <x> <y> <z>
,而xyz就是目标命令方块的坐标。
注意
stats的对象可能会改变,因为是直接储存选择器(如果是使用选择器),所以可能会赋值给未知的实体(因为每次赋值前都会找实体),需要小心
我们可以使用@s
来代表目标实体自身,这样就避免了可能选择到错误实体的情况了。(大部分情况下也是赋值给自身)其次,命令执行统计的结果会覆盖而不会累加,只取最后一次统计的结果。命令对所有实体执行完毕后才开始统计结果。(详细将会在之后
execute
命令部分详细说明)最后,如果需要同时对一堆实体设置相同的stats给他们自己的变量,并不需要使用execute,因为stats是直接把对象写进该实体的NBT里的。直接把对象设置为
@s
就好,详情看下方例子。
实例——检查物品栏物品数量
通过NBT的Inventory我们也能检测物品数量,然而有以下限制:
- 不能检测超过1组物品(同一种物品被分别放在不同格子),因为NBT的list不能检测重复
- 需要穷举,比如64个物品就得穷举64次...
所以我们一般是使用clear
命令的,格式:
clear [玩家] [物品id] [伤害值] [数量] [NBT]
- 玩家为需要删除/检测物品的玩家,不选择玩家则默认自己。
- 物品id为需要删除/检测的物品的id。
- 伤害值为需要删除/检测的物品的伤害值,-1或不填写为不检测伤害值。
- 数量为最多删除的物品数量,0则不删除。
- NBT为删除/检测的物品所需要符合的NBT,base tag 为 tag。
这命令的AffectedItems为删除物品数量,然而如果数量为0(即不删除),则返回符合条件的物品数量。
比如我们要检测玩家背包里的石头数量,我们可以如此检测:
# 假设有一个记分板变量叫stats
stats entity @a set AffectedItems @s stats
# 让每个玩家自己分别检测自己的石头数
# 这样每个玩家都是命令执行者,执行着 检测自己的石头数 的命令
execute @a ~ ~ ~ clear @s minecraft:stone -1 0