指令

本 mod 注册 1 条根指令 /jeca,下挂 4 个子命令。全部为纯客户端指令, 注册在 ClientCommandHandler 上,权限等级为 0(任何玩家都能用)。

基本信息

属性 值
根指令 /jeca(JecaCommand.getCommandName())
根类 me.towdium.jecalculation.command.JecaCommand extends CommandBase
子命令数 4(help / state / math / craft)
注册位置 ClientProxy.postInit() → ClientCommandHandler.instance.registerCommand(new JecaCommand())
权限等级 getRequiredPermissionLevel() 返回 0
补全 addTabCompletionOptions 补全子命令名
默认行为 无参数或首参为 help → 执行帮助

因为是 ClientCommandHandler 客户端指令,它不经过服务端权限校验, 也不需要 OP。多人游戏里它只影响发起指令的那个客户端。 CommonProxy 里五个服务器生命周期回调(serverStarting / serverStarted / serverStopping / serverStopped / serverAboutToStart)全部是空转发, 没有任何服务端指令注册。

根指令 /jeca

方法 返回 / 行为
getCommandName() "jeca"
getCommandUsage(sender) "/jeca [options]"
getRequiredPermissionLevel() 0
processCommand(sender, args) 见下方分派
addTabCompletionOptions(sender, args) args.length == 0 → 空列表;args.length == 1 → 补全 Commands.commands.keySet();否则交给对应子命令的 getTabCompletions

分派逻辑:

if (args.length == 0 || args[0].equalsIgnoreCase("help")):
    执行 help(注意 cut(args) 会切掉首参)
else:
    cmd = Commands.commands.get(args[0].toLowerCase())      // ← 查表前先转小写
    if cmd != null: cmd.execute(sender, cut(args))
    else:          发 "command.common.not_found"(带 args[0])

cut(String[] args) 把首参数切掉,把剩余部分传给子命令:

String[] ret = new String[args.length - 1];
System.arraycopy(args, 1, ret, 0, args.length - 1);

⚠️ 未知子命令走的是 command.common.not_found——注意这不是 jecalculation. 前缀的键, 说明它依赖其他模组提供的本地化条目,本 mod 自己的 lang 文件里并没有这个键。

4 个子命令全表

子命令 用法字符串 参数 行为
help /jeca [help] 无 发 jecalculation.command.help.list,再按名字字母序列出所有子命令的用法
state /jeca state 无 恒定发本地化键 inactive(字面量,非 jecalculation.*)
math /jeca math 无 JecaGui.openGuiMath(true) —— 打开数学计算器
craft /jeca craft 无 JecaGui.openGuiCraft(true) —— 打开合成计算器

四个都实现 ISubCommand,且都不覆写 getTabCompletions(用接口默认的 Collections.emptyList()),所以子命令层面没有参数补全。

help

sender.addChatMessage(new ChatComponentTranslation(getKey("list")));
Commands.commands.values().stream()
    .sorted(Comparator.comparing(ISubCommand::getName))
    .forEachOrdered(c -> sender.addChatMessage(new ChatComponentText(c.getUsage(sender))));

getKey 由接口默认实现拼前缀:"jecalculation.command." + getName() + '.' + key。 所以 help 的键是 jecalculation.command.help.list(中英文 lang 都有)。

排序是 Comparator.comparing(ISubCommand::getName),输出顺序恒为 craft → help → math → state。

state — 一个「已失效」的子命令

public void execute(ICommandSender sender, String[] args) {
    sender.addChatMessage(new ChatComponentTranslation("inactive"));
}

源码没有任何条件判断,永远输出 inactive。这是上游「服务端模式」功能的残留: 上游会根据服务端是否安装了本 mod 的服务器组件来输出 active / inactive。

lang 文件里两个键都存在:

键 英文 中文
jecalculation.command.state.active Server active. 服务端在线
jecalculation.command.state.inactive Server inactive. 服务端离线

但 active 没有任何代码引用——它是孤立的本地化条目。inactive 也是以 裸键("inactive" 而非 "jecalculation.command.state.inactive")传给 ChatComponentTranslation 的,所以原版客户端不会本地化它,会直接显示字面量 inactive。这是一个可观察的 bug。

math / craft — 打开界面的无绑定入口

子命令 调用 scheduled 参数
math JecaGui.openGuiMath(true) true
craft JecaGui.openGuiCraft(true) true

对比两个热键走的 openGuiCraft(false) / openGuiMath(false):

参数 指令传值 热键传值 效果
updateParent true true 相同
acceptsTransfer true true 相同
scheduled true false 指令路径带一次调度延迟,热键路径立即

见 打开合成计算器 与 打开数学计算器。

由于 打开合成计算器 与 打开数学计算器 两个热键默认都未绑定 (KEY_NONE),/jeca craft 与 /jeca math 实际上是本 mod 最直接可用的入口。

聊天提示消息枚举

指令之外的另一类用户反馈是 Utilities.ChatMessage。它定义在 me.towdium.jecalculation.utils.Utilities 里。本 mod 用到的成员:

枚举值 触发位置
MAX_LOOP 代价列表算法 迭代超过 1000 步
RECIPE_TRANSFER_ERROR 配方适配器 转换配方时抛异常

另有 jecalculation.chat.server_mode(zh_CN/en_US 都有, 含义是「没有计算器物品所以不能开界面」),但 没有任何代码引用它—— 这是本 mod 移除计算器物品后遗留的孤立本地化条目。见 本 mod 没有的东西。

相关条目