Skip to content

ScoreBoard — 计分板

分数的身份是「假玩家名」——和原版 /scoreboard players 用的是同一套命名空间,所以这里做的一切管理员在游戏里看得见、也能手动改。

rust
use levilamina::prelude::*;

let sb = Scoreboard::get();
sb.add_objective("kills", "§c击杀数")?;
sb.set_display(DisplaySlot::Sidebar, "kills")?;
sb.add_score("kills", "Steve", 1)?;

计分项

API说明
sb.add_objective(name, display_name)新建
sb.remove_objective(name)删除
sb.objectives() -> Vec<Objective>列出全部
rust
pub struct Objective { pub name: String, pub display_name: String }

分数

API返回说明
sb.score(objective, who)Option<i64>读;None = 没有记录
sb.set_score(objective, who, value)Result<i64>设为某值,返回设置后的值
sb.add_score(objective, who, delta)Result<i64>
sb.reduce_score(objective, who, delta)Result<i64>
sb.reset_score(objective, who)Result<()>清掉这条记录

score() 返回 None 和返回 Some(0) 不一样

None 是"这个人在这个计分项里没有记录",Some(0) 是"有记录,值是 0"。侧边栏只显示有记录的行,所以这个区别是看得见的。

显示槽

rust
sb.set_display(DisplaySlot::Sidebar, "kills")?;
sb.clear_display(DisplaySlot::Sidebar)?;

DisplaySlotSidebar(右侧边栏)、List(暂停菜单玩家列表)、BelowName(头顶名字下方)。

who 传什么

传玩家名就是给玩家计分。传任意其他字符串就是一个"假玩家"——这是原版计分板做全局变量的标准手法:

rust
sb.set_score("config", "#pvp_enabled", 1)?;

# 开头是社区惯例,这样的名字不会和真实玩家冲突,侧边栏里也一眼能认出来。