/scoreboardinfo

基本信息

属性 值
指令名 /scoreboardinfo
实现类 CommandScoreboardInfo extends CommandBase
源码 com/enderio/core/common/command/CommandScoreboardInfo.java
权限等级 0(getRequiredPermissionLevel,:29-31)
权限检查 return true;(:34-36)——无任何限制
注册位置 EnderCore.java:146,FMLServerStartingEvent 阶段
Tab 补全 有(记分板名 + 在线玩家名)
@EventHandler
public void onServerStarting(FMLServerStartingEvent event) {
    event.registerServerCommand(new CommandScoreboardInfo());
    PermanentCache.saveCaches();
}

(EnderCore.java:144-148)

[!NOTE] 指令在服务端启动时注册,因此这是纯服务端指令,客户端不可用。它是 EnderCore 唯一通过 FMLServerStartingEvent 注册的指令(另一条 /reloadServerConfigs 走 ClientCommandHandler + CommandHandler,见 EnderCore.java:125-128)。

功能

查询指定记分板上某个玩家的实际分数。用法(getCommandUsage,:24-26):

/scoreboardinfo <board> <name>

processCommand(:40-65):

步骤 行为 源码
1 参数少于 2 个 → 抛 WrongUsageException("This command requires 2 args: <board> <name>") :41-43
2 读取 player.getEntityWorld().getScoreboard() :45
3 按名字取 ScoreObjective;为 null 时输出 No such board <name> :47-51
4 遍历 board.func_96534_i(obj) 的 Score 集合,匹配 getPlayerName() :53-60
5 命中 → 输出 <name>'s score on board "<board>": <分数> 并 return :57-59
6 未命中 → 输出 No score for <name> on board "<board>" :64

三种输出均为硬编码英文字符串,未经 Lang.localize 本地化(:50、:57-58、:64),因此任何语言下都不翻译。

交互

Tab 补全

addTabCompletionOptions(:69-90)按参数位置分派:

args.length 补全内容 源码
1 世界记分板上全部 ScoreObjective 的名字 :70-76
2 世界内全部 EntityPlayer 的命令名 :78-85
其它 返回 null :88

补全不做前缀过滤以外的筛选,直接把整个列表交给 getListOfStringsFromIterableMatchingLastWord,由原版命令框架处理匹配。

源码缺陷

  • 记分板不存在时未提前返回(:47-51):obj == null 时只 addChatMessage 提示,没有 return,代码继续执行到 :53 的 board.func_96534_i(obj),把 null 作为参数传入。 缺失 return 本身可由源码直接确认。其具体后果无法核实——Scoreboard.func_96534_i 属 Minecraft 原版方法,/Users/evlos/a/mirror/ 下无 Minecraft 本体源码可查(已 find 确认仅有各 mod 仓库)。若原版实现解引用入参则抛 NPE,否则返回空集合。可复现命令:/scoreboardinfo NoSuchBoard Steve。
  • 输出字符串未本地化:三处消息均硬编码英文(:50、:57-58、:64),与本 mod 其余部分统一走 EnderCore.lang.localize 的做法不一致。
  • 权限等级 0 且 canCommandSenderUseCommand 恒 true(:29-36):任何玩家可查询任意记分板上任意玩家的分数。在含敏感计分板(领地、工会、竞速)的服务器中属于信息泄露面。

相关条目