目录

新人手册

记分板分数(score)

分数上下限, 溢出

每个变量的分数范围是-2,147,483,648 至 2,147,483,647,不支援小数

比如我的分数是2147483646,一个朋友的分数是1,当我对所有变量的分数加3,我的分数会"增加"至-2147483647,如果分数超出了上下限的范围,负数就会跳到最大值去继续减、而正数就会跳到最小值去继续加,而对其他人的操作会正常的进行

没有分数 VS 0分

我们为所有实体的分数+0分(/scoreboard players add @e scb 0)之后, 所有对象的分数都是0, 那么是不是代表没有分数等于0分呢?

答案是错误的。没有分数不等于0分

没有分数的对象, 变量里并没有储存它们的那个分数, 因此没法检测它们的分数。
至于0分的对象, 变量里的确是有储存它们的那个分数, 因此能检查出0分。

至于为什么没有分数+0分就是0分呢?这个你们得问Mojang...

显示分数/对象

命令

/scoreboard players list [对象]

对象: 不填写则列出所有有分数的对象名字/uuid。填写则列出该对象所有的分数。'*'则列出所有对象的所有分数。

Stats

不指定对象:

指定对象:

修改分数

设定分数

命令

/scoreboard players set <对象> <变量名称> <分数> [数据标签(NBT)]

对象: 针对的对象。可以使用'*'代表所有被记分板记录分数的对象(包括不在线的玩家)。
变量名称: 修改的变量。
分数: 设定为的分数
数据标签: 可以不填。如果指定数据标签,则只会修改符合指定NBT的对象的分数。

例子

/scoreboard players set @p first_obj 1

就会把最近的玩家的first_obj分数设定为1

Stats

当你设定的数值不在-2147483648 至 2147483647之间,命令不能执行(会出错)

增加分数

命令

/scoreboard players add <对象> <变量名称> <分数> [数据标签(NBT)]

对象: 针对的对象。可以使用'*'代表所有被记分板记录分数的对象(包括不在线的玩家)。
变量名称: 修改的变量。
分数: 增加的分数
数据标签: 可以不填。如果指定数据标签,则只会修改符合指定NBT的对象的分数。

例子

/scoreboard players add @p first_obj 1

就会把最近的玩家的first_obj分数增加1分
比如原本为0分,现在则会增加为1分

特殊用法
/scoreboard players add @p obj 0
增加0分。如果对象原本没有分数, 则会变成0分; 如果对象原本有分数, 该分数则不变。

Stats

当你设定的数值不在-2147483648 至 2147483647之间,命令不能执行(会出错)
分数可能溢出, 请小心

减少分数

命令

/scoreboard players remove <对象> <变量名称> <分数> [数据标签(NBT)]

对象: 针对的对象。可以使用'*'代表所有被记分板记录分数的对象(包括不在线的玩家)。
变量名称: 修改的变量。
分数: 减少的分数
数据标签: 可以不填。如果指定数据标签,则只会修改符合指定NBT的对象的分数。

例子

/scoreboard players remove @p first_obj 1

就会把最近的玩家的first_obj分数减少1分
比如原本为0分,现在则会减少为-1分

Stats

当你设定的数值不在-2147483648 至 2147483647之间,命令不能执行(会出错)
分数可能溢出, 请小心

分数重置

命令

/scoreboard players reset <对象> [变量名称]

对象: 针对的对象。可以使用'*'代表所有被记分板记录分数的对象(包括不在线的玩家)。
变量名称: 需要重置的变量。重置后该变量将失去指定对象的分数记录(没有分数)。不填则默认所有变量。

例子

/scoreboard players reset a

重置名为a的对象的所有变量分数。

Stats

分数相互运算

当记分板需要用到一些比较复杂/需要在两个分数之间运算的计算,我们可以用记分板的operation功能

命令

/scoreboard players operation <运算对象> <运算对象的变量> <运算> <副对象> <副对象的变量>

运算对象和副对象任意一个可使用'*'代表所有被记分板记录分数的对象的(但不能两个都使用'*')。
而且两者不能同时选择多个对象, 也不应该这么做。比如说不能两个都是@a。

运算子 用途 计算方法
+= 加法 运算对象的变量分数 = 运算对象的变量原先的分数 + 副对象的变量的分数
-= 减法 运算对象的变量分数 = 运算对象的变量原先的分数 - 副对象的变量的分数
*= 乘法 运算对象的变量分数 = 运算对象的变量原先的分数 * 副对象的变量的分数
/= 除法(向下取整) 运算对象的变量分数 = (运算对象的变量原先的分数 / 副对象的变量的分数)向下取整
%= 除法(取余数) 运算对象的变量分数 = (运算对象的变量原先的分数 / 副对象的变量的分数)的余数
简单来说,就是 (运算对象的变量原先的分数 mod 副对象的变量的分数)
= 赋值 运算对象的变量分数 = 副对象的变量的分数
< 比较(小于) 如果副对象变量里的分数 < 运算对象的分数
那么运算对象的变量分数 = 副对象的变量的分数
(注意,无论什么情况,这个命令的输出都是成功,即使他并没有更改任何分数)
> 比较(大于) 如果副对象变量里的分数 > 运算对象的分数
那么运算对象的变量分数 = 副对象的变量的分数
(注意,无论什么情况,这个命令的输出都是成功,即使他并没有更改任何分数)
>< 互换 运算对象的分数 = 原先副对象的分数;副对象的分数 = 原先运算对象的分数

例子

比如最近的玩家的first_scb分数是5分,score_3(玩家名)的second_scb分数是3分

/scoreboard players operation @p first_scb +=  score_3 second_scb

执行完这条命令之后,最近的玩家的first_scb分数会从5变成8

还有,比如我们要把所有玩家的first_scb分数 = 其 second_scb的分数,我们可以用execute配合operation来做到

/execute @a ~ ~ ~ scoreboard players operation @p first_scb = @p second_scb

Stats

不确定(特别在运算对象和副对象都是多个对象时)

当副对象没有分数时则会失败(如果还有其他有分数的副对象的话则会继续运行)

触发器(Trigger)

trigger就是一种判据,是唯一一种非管理员玩家能够通过命令(/trigger)来修改自己分数的判据

玩家默认没有权限使用/trigger命令修改自己的分数。
需要透过命令(/scoreboard players enable)来给予玩家权限。
当玩家修改了分数之后, 则会失去该权限, 需要再次给予权限才能再次修改分数。

进阶
scoreboard.dat

启动触发器(enable)

命令

/scoreboard players enable <对象> <变量名称>

对象: 启动触发器的对象。'*'代表所有有分数的对象。
对象部分其实只能是玩家...除非你指望一只僵尸之类的玩意去/trigger... 23333

注: trigger变量不需要是disable(Locked:1)的时候才能执行此命令。因此能高频执行此命令以确保玩家永远有权限修改分数。

Stats

使用触发器(trigger)

命令

/trigger <变量名称> <add|set> <分数>

变量名称: 需要修改的变量名称。只能是Locked:0b的trigger变量
add|set: add模式: 为变量增加分数; set模式: 设置分数

此命令只能对自己生效, 而且不需要OP权限。
一般会放在tellraw的clickEvent里, 检查玩家按了什么。

由于它只会对执行者更改分数,所以在一些需要分辨执行者的情况是非常有用的
比如牌子的点击事件(clickEvent),牌子是由玩家执行命令的,然而那个执行坐标还是牌子那里,所以如果那个命令是用@p的话,可能会误判,那么用trigger就可以精确的对点击的玩家执行命令

Stats

如果该变量已被enable则成功, 否则则会失败

分数检测

实体分数检测(Selector)

这个我们可以使用选择器参数。

score_变量: 该变量(objective)的分数范围(小于等于
score_变量_min: 该变量(objective)的分数范围(大于等于

需要检查相等的话只需要两个的分数相同就可以

任意对象的分数检测(test)

命令

scoreboard players test <对象> <变量> <最低分> [最高分]

对象: 可以是不存在的玩家。'*'则代表所有有分数的对象
变量: 需要检查的变量
最低分: '*'代表-2,147,483,648。对象的分数必须大于等于最低分, 本命令才会成功。
最高分: 不填或是'*'则代表2,147,483,647。对象的分数必须小于等于最高分, 本命令才会成功。

因此当命令成功时, 最低分≤对象分数≤最高分
只检测 对象分数≤最高分: 在最低分处填'*'。
只检测 最低分≤对象分数: 忽略最高分不填。

Stats

命令执行统计(Stats)

命令执行统计概述

命令执行统计, 分别有:

(其意思详见 命令执行简介)

这些数据会储存在CommandStats里, 实体及命令方块也有这个NBT, 其结构如下:

Name就是把那分数赋值到哪个实体/假名的记分板对象上(可以是选择器, 以该实体/命令方块目前位置为执行坐标, 然而很bug, 建议加上type以免选择到玩家)
Objective就是赋值到实体/假名的哪个记分板对象上

我们要得到那些分数就需要使用stats命令了

Stats命令格式

有两个模式, 分别对实体(包括假名)和对方块(命令方块)
每个模式也有两个模式, 分别是clear(stats不会再绑定到实体分数上)及set(设置赋值到谁的记分板对象)

实体(包括假名)模式:

stats entity <目标实体> clear <统计>
stats entity <目标实体> set <统计> <被赋值实体> <记分板对象>

方块模式:

stats block <x> <y> <z> clear <统计>
stats block <x> <y> <z> set <统计> <被赋值实体> <记分板对象>

目标实体: 执行命令的实体
x, y, z: 目标方块的坐标(执行命令的CB的坐标, 和目标实体类似)
被赋值实体: 记分板分数需要变为目标实体stats的实体。注意: 如果填写选择器, NBT里储存的则是选择器, 也就是说那被赋值实体或许会改变
记分板对象: 被赋值实体的记分板目标
统计: 命令执行统计, 数值如下:

注意: 被赋值实体的分数需要先初始化

例子

//假设原先有2个实体, a和b, 类型为area_effect_cloud

//假设原先有一个记分板对象名为scb, 类型为dummy


/scoreboard players set @e[name=a,type=area_effect_cloud] scb 0
/stats entity @e[name=b,type=area_effect_cloud] set SuccessCount @e[name=a,type=area_effect_cloud] scb
/execute @e[name=b,type=area_effect_cloud] ~ ~ ~ say hi

//这样a的scb分数就会变为1

注意事项