记分板命令

本章将简略地介绍记分板的相关命令以及使用实例。注意,除了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上的分数。以下简称这两个分数为tarsel

对于+=-=*=/=,%=五个运算符来说,相关的操作为在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, yellowwhite。填写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

results matching ""

    No results matching ""