记分板变量
本文采用以下译名:
- Objective->变量
- Criteria->判据
在本文中,对象指的是玩家名称(真实玩家及假名)与UUID。
同时,本文前部以概念介绍为主,具体的命令与应用在后部介绍。
变量 是记分板系统的基本组成部分。记分板系统上可以同时存在多个变量。
一个变量包含以下内容:
- 名称(Name)。名称是一个变量在系统内部使用的名称。不同变量之间的名称不能重复,且名称区分大小写。也就是说,名称为"name"的变量和名称为"NAME"的变量是不同的。名称最长可为16个字符。为了便于他人阅读命令,我们建议用
CamelCase原则
命名,即单词第一个字母大写。(当然,这不是游戏的必须要求) - 显示名称(Display name)。显示名称是一个变量用于展示的名称。与名称相反,不同变量之间的显示名称可以重复。
- 判据(Criterion)。判据是一个变量的分数改变方式。不同变量之间的判据可以重复。
- 追踪的对象与其分数(Target and Score)。变量可以同时追踪多个对象,并记录对象的相应分数。
下面让我们具体了解变量的各个组成部分。
判据
判据作为变量分数的改变方式,一般是针对于玩家而言的。当玩家以外的实体等对象与变量关联起来时,判据效果都与dummy
等同,即只能通过命令修改。
判据分为简单判据和复合判据。简单判据只有一个单词,复合判据则是在基础判据之上加入次级判据。下面先介绍简单判据。
在简单判据中,有一种判据称为只读型判据。它们是根据一些系统内部的数值来确定相关分数的,因而不可修改。同时只读型判据与玩家信息相关,因此玩家之外的对象不适用只读型判据。在只读型判据外,其它类型的判据只是在条件满足时增加分数,不对应内部数值,所以都能通过命令修改分数。复合判据没有只读型,即只读型判据都是简单判据。
在下文中,粗体的判据就是只读型判据。
以下是简单判据略表:
- dummy: 虚拟型,只能由命令修改
- trigger: 触发型,配合/trigger命令使用
- deathCount: 统计死亡次数
- playerKillCount: 统计你的击杀次数
- totalKillCount: 统计你的杀怪次数
- health: 对应你的生命值
- xp: 对应你的经验值
- level: 对应你的等级
- food: 对应你的饱食度
- air: 对应你潜水时的空气值
- armor: 对应你的盔甲值
相比于简单判据,复合判据(Compound criteria)能够更精细地检测玩家行为。复合判据的结构为:基础判据.次级判据,例如stat.craftItem.minecraft.stone
。不同部分之间以.
分隔。所有的复合判据都可以通过命令进行分数的修改。
以下是复合判据可用的基础判据略表:
- stat: 当玩家完成指定的统计项目时,加上对应的分数。不会从内部的统计中拉取数据
- stat.craftItem: 玩家合成指定的物品时分数+1
- stat.useItem: 玩家使用指定物品时分数+1
- stat.breakItem: 玩家因耐久度耗尽而破坏指定物品时分数+1
- stat.mineBlock: 玩家挖掘指定方块时分数+1
- stat.killEntity: 玩家杀死指定生物时分数+1
- stat.entityKilledBy: 玩家被指定生物杀死时分数+1
- stat.drop: 玩家丢出指定物品时分数+1
- stat.pickup: 玩家拾取指定物品时分数+1
- teamkill: 玩家杀死指定队伍的成员时分数+1
- killedByTeam: 玩家被指定队伍的成员杀死时分数+1
全部的次级准则请参见Wiki的Criteria部分。
使用复合判据时应当注意:
- 在基础准则后加ID名时,需要添加.minecraft前缀。例如:stat.craftItem.minecraft.stone。而
- 使用物品有着很详细的规则。一般来说,与生物的互动都不属于使用,例如驯服、喂养、繁殖、挤奶、剪羊毛等。
显示位置
记分板的分数是可以在游戏画面中显示出来的。显示位置共有三处:名称下方,侧边栏,在线玩家菜单。在显示变量名称时,使用的是显示名称(若添加变量时未填写显示名称,则默认使用名称)。一个显示位置只能显示一个目标,但一个目标可以显示在多个位置上。不同的显示位置,分数的显示方式是不同的。各个显示位置的具体介绍如下:
- list: 分数显示于在线玩家菜单中玩家名称的后面,颜色为黄色。这个显示位置不显示变量名。
- sidebar: 在侧边栏显示变量名、对象名称(UUID/玩家名),及对象对应的分数。
- sidebar.team.队伍颜色: 在指定队伍成员的侧边栏显示分数,形式如上。
- belowName: 在玩家名称牌的下方显示变量名与分数。分数在变量名之前。
在下面这张图片中,list
、belowname
、sidebar
在这里是玩家的名称,同时也对应显示位置的名称;0
、3
是不带变量名的分数;1
是分数值;Morts
、Score
是变量名。
对象、分数与检测
前面已经说到,对象指的是玩家名称或UUID。UUID是记录实体的,而玩家名就是记录玩家的。玩家不需要在线,甚至不需要存在,也可以在记分板上有分数。如果使用了不存在的玩家名,我们就把这种玩家名称为 假名(Fake name)。
一般我们会使用假名来显示分数。如果是记录分数作探测之用,一般我们会使用实体marker,因为我们能够以选择器选择实体marker,但不能选择假名。
使用假名时,只需要按照一般的方法在命令中输入假名即可,不需要进行声明操作。例如,设置分数的命令为:
scoreboard players set <玩家名> <变量的名称> <分数值> [数据标签]
现在有一个虚拟型变量obj
,给一个叫Faker
的假名设置分数为10
,则命令为:
scoreboard players set Faker obj 10
如果不希望假名出现在侧边栏,则可以在假名前添加#
前缀:
scoreboard players set #Faker obj 10
不过玩家名的长度也是有限制的,不能长于40个字符。
在填写玩家名的参数中,可以用*
代表所有对象(所有被记分板系统追踪的对象)。不过此写法只适用于记分板命令。
如果实体有分数,那么可以通过目标选择器,利用相关参数进行检测。具体的参数有两个,分别是score_name
和score_name_min
。其中name
是变量名称。前者代表大于等于,后者代表小于等于。例如,设变量deaths
的判据为deathCount
,则如果要选出至少死亡一次,至多死亡5次的玩家,则目标选择器的写法为@p[score_deaths=5,score_deaths_min=1]
。
除了分数,我们也能使用记分板的 标签(tag) 对实体进行标记,这会在之后的章节讲解。
记分板分数有限制的,范围为-2147483648到2147483647。
如果分数在加减的过程中超出范围则会溢出,这方面请自行搜寻,不建议使用这个特性。
记分板中分数为0和没有分数是两个概念:前者能被检测分数,而后者不能被检测分数,即不在记分板系统上。(然而分数+0 -0也能自动把没有分数变为0分。)
我们可以使用score_obj_min=-2147483648
或者score_obj=2147483647
检查有没有分数。由于分数范围的限制,没有分数则必然不会被此参数选中。