指令
本 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 没有的东西。