记分板分数(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
不指定对象:
- AffectedBlocks: 0
- AffectedEntities: 1
- AffectedItems: 0
- SuccessCount: 1
- QueryResult: 记分板中有分数的对象数(每个对象只会计算一次)
指定对象:
- AffectedBlocks: 0
- AffectedEntities:对象数
- AffectedItems: 0
- SuccessCount: 1
- QueryResult: 最多分数(不是最大分数)的对象的分数数量(比如一共有5个变量。选择到的玩家A有3个分数, B有2个分数, C有4个分数, QueryResult则为4)
修改分数
设定分数
命令
/scoreboard players set <对象> <变量名称> <分数> [数据标签(NBT)]
对象: 针对的对象。可以使用'*'代表所有被记分板记录分数的对象(包括不在线的玩家)。
变量名称: 修改的变量。
分数: 设定为的分数
数据标签: 可以不填。如果指定数据标签,则只会修改符合指定NBT的对象的分数。
例子
/scoreboard players set @p first_obj 1
就会把最近的玩家的first_obj分数设定为1
Stats
- AffectedBlocks: 0
- AffectedEntities: 对象数
- AffectedItems: 0
- SuccessCount: 对象数
- QueryResult: 0
当你设定的数值不在-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
- AffectedBlocks: 0
- AffectedEntities: 对象数
- AffectedItems: 0
- SuccessCount: 对象数
- QueryResult: 0
当你设定的数值不在-2147483648 至 2147483647之间,命令不能执行(会出错)
分数可能溢出, 请小心
减少分数
命令
/scoreboard players remove <对象> <变量名称> <分数> [数据标签(NBT)]
对象: 针对的对象。可以使用'*'代表所有被记分板记录分数的对象(包括不在线的玩家)。
变量名称: 修改的变量。
分数: 减少的分数
数据标签: 可以不填。如果指定数据标签,则只会修改符合指定NBT的对象的分数。
例子
/scoreboard players remove @p first_obj 1
就会把最近的玩家的first_obj分数减少1分
比如原本为0分,现在则会减少为-1分
Stats
- AffectedBlocks: 0
- AffectedEntities: 对象数
- AffectedItems: 0
- SuccessCount: 对象数
- QueryResult: 0
当你设定的数值不在-2147483648 至 2147483647之间,命令不能执行(会出错)
分数可能溢出, 请小心
分数重置
命令
/scoreboard players reset <对象> [变量名称]
对象: 针对的对象。可以使用'*'代表所有被记分板记录分数的对象(包括不在线的玩家)。
变量名称: 需要重置的变量。重置后该变量将失去指定对象的分数记录(没有分数)。不填则默认所有变量。
例子
/scoreboard players reset a
重置名为a的对象的所有变量分数。
Stats
- AffectedBlocks: 0
- AffectedEntities: 对象数
- AffectedItems: 0
- SuccessCount: 对象数
- QueryResult: 0
分数相互运算
当记分板需要用到一些比较复杂/需要在两个分数之间运算的计算,我们可以用记分板的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
- data
- PlayerScore
- entry(一个计分板储存单元,每个单元储存一个 "变量-对象-分数值" 关系)
- Locked(0时能够使用/trigger命令修改, 1时不能修改, 只对trigger判据的有效)
启动触发器(enable)
命令
/scoreboard players enable <对象> <变量名称>
对象: 启动触发器的对象。'*'代表所有有分数的对象。
对象部分其实只能是玩家...除非你指望一只僵尸之类的玩意去/trigger... 23333
注: trigger变量不需要是disable(Locked:1)的时候才能执行此命令。因此能高频执行此命令以确保玩家永远有权限修改分数。
Stats
- AffectedBlocks: 0
- AffectedEntities: 对象数
- AffectedItems: 0
- SuccessCount: 对象数
- QueryResult: 0
使用触发器(trigger)
命令
/trigger <变量名称> <add|set> <分数>
变量名称: 需要修改的变量名称。只能是Locked:0b的trigger变量
add|set: add模式: 为变量增加分数; set模式: 设置分数
此命令只能对自己生效, 而且不需要OP权限。
一般会放在tellraw的clickEvent里, 检查玩家按了什么。由于它只会对执行者更改分数,所以在一些需要分辨执行者的情况是非常有用的
比如牌子的点击事件(clickEvent),牌子是由玩家执行命令的,然而那个执行坐标还是牌子那里,所以如果那个命令是用@p的话,可能会误判,那么用trigger就可以精确的对点击的玩家执行命令
Stats
如果该变量已被enable则成功, 否则则会失败
- AffectedBlocks: 0
- AffectedEntities: 1
- AffectedItems: 0
- SuccessCount: 1
- QueryResult: 0
分数检测
实体分数检测(Selector)
这个我们可以使用选择器参数。
score_变量: 该变量(objective)的分数范围(小于等于)
score_变量_min: 该变量(objective)的分数范围(大于等于)
需要检查相等的话只需要两个的分数相同就可以
任意对象的分数检测(test)
命令
scoreboard players test <对象> <变量> <最低分> [最高分]
对象: 可以是不存在的玩家。'*'则代表所有有分数的对象
变量: 需要检查的变量
最低分: '*'代表-2,147,483,648。对象的分数必须大于等于最低分, 本命令才会成功。
最高分: 不填或是'*'则代表2,147,483,647。对象的分数必须小于等于最高分, 本命令才会成功。
因此当命令成功时, 最低分≤对象分数≤最高分
只检测 对象分数≤最高分: 在最低分处填'*'。
只检测 最低分≤对象分数: 忽略最高分不填。
Stats
- AffectedBlocks: 0
- AffectedEntities: 符合要求的对象数
- AffectedItems: 0
- SuccessCount: 符合要求的对象数
- QueryResult: 0
命令执行统计(Stats)
命令执行统计概述
命令执行统计, 分别有:
- AffectedBlocks (影响方块)
- AffectedEntities (影响实体)
- AffectedItems (影响物品)
- QueryResult (查询结果)
- SuccessCount (成功次数)
(其意思详见 命令执行简介)
这些数据会储存在CommandStats里, 实体及命令方块也有这个NBT, 其结构如下:
- CommandStats
- SuccessCountObjective
- SuccessCountName
- AffectedBlocksObjective
- AffectedBlocksName
- AffectedEntitiesObjective
- AffectedEntitiesName
- AffectedItemsObjective
- AffectedItemsName
- QueryResultObjective
- QueryResultName
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里储存的则是选择器, 也就是说那被赋值实体或许会改变。
记分板对象: 被赋值实体的记分板目标
统计: 命令执行统计, 数值如下:
- AffectedBlocks (影响方块)
- AffectedEntities (影响实体)
- AffectedItems (影响物品)
- QueryResult (查询结果)
- SuccessCount (成功次数)
注意: 被赋值实体的分数需要先初始化
例子
//假设原先有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
注意事项
- 如果发现没能成功赋值, 请检查有没有初始化被赋值实体分数, 以及有没有选择到正确的被赋值实体(可以试试指定type)。
- Stats有时候是较难以预测的, 请先测试一下其stats分数是不是符合你预测的模式
- 对于一些命令如execute嵌套, 需要明白的一点是stats是覆盖而不会相加的(或许现在听起来一头雾水, 需要使用的时候就会明白了)
- 如果要处理被绑定了的分数, 可以使用
/scoreboard players operation @e[指定实体] 对象 = @e[指定实体] 被绑定了的对象
来把分数转移到另外一个对象处理(如果有多个实体, 则可以在前方加上/execute @e[指定实体] ~ ~ ~, 后方那些@e[指定实体]则改为@e[c=1]) - 常见绑定到指定实体自身的方法:
/stats entity @e[指定实体] set @e[c=1,type=自己的type] 记分板对象