命令行
基本信息
| 属性 |
值 |
| 类 |
TMCommand(实现 ICommand) |
| 命令名 |
thaumicmachina |
| 别名 |
thaumicmachina(与主名重复)、tm |
| 权限等级 |
2(OP,getRequiredPermissionLevel() 返回常量 2,非可配置) |
| 注册 |
FMLServerStartingEvent → event.registerServerCommand(new TMCommand())(ThaumicMachina.java:48-51) |
| 子命令 |
help、wandaugmentation |
| 操作 |
add、remove、reset |
用法
/thaumicmachina help
/thaumicmachina wandaugmentation add <augmentation>
/thaumicmachina wandaugmentation remove <augmentation>
/thaumicmachina wandaugmentation reset
/tm 是 /thaumicmachina 的别名(lang tm.command.thaumicmachina.hint_alias 会提示)。
行为
wandaugmentation 三个操作直接读写手持法杖的 NBT(CommandBase.getCommandSenderAsPlayer 强制要求命令发送者是玩家):
| 操作 |
行为 |
前置校验 |
add <id> |
WandHelper.addAugmentationsTo(stack, {augment}, false) —— 追加 NBT 字符串到 Augmentations 列表 |
必须是玩家、手持 ItemWandCasting、augmentationMap.get(args[2]) 非 null、该改装尚未存在 |
remove <id> |
WandHelper.removeAugmentationsFrom(...) |
同上,但该改装必须已存在 |
reset |
NBTHelper.getCompoundFor(stack).removeTag("Augmentations") —— 清空全部 |
必须是玩家且手持法杖;args.length 必须恰好 2 |
可用 <id> 来自 WandHelper.augmentationMap 的 5 个主键 + 5 个别名(charge_buffer / Charge Buffer / …)。命令不做研究完成校验,因此可绕过整个研究树直接注入改装。
数值
| 数值 |
值 |
| 命令名 |
thaumicmachina |
| 别名数 |
2(thaumicmachina、tm) |
| 权限等级 |
2(硬编码) |
| 子命令数 |
2(help、wandaugmentation) |
| 操作数 |
3(add / remove / reset) |
| 可操作改装数 |
5(主键)/ 10(含别名) |
reset 要求的参数个数 |
恰好 2 |
add / remove 要求的参数个数 |
恰好 3 |
| 读取的手持槽位 |
getCurrentEquippedItem()(主手) |
| NBT 键 |
Augmentations(TAG_List) |
交互
| 触发 |
行为 |
/tm(无参) |
抛 WrongUsageException,显示 tm.command.thaumicmachina.usage |
/tm help |
3 条聊天消息:别名提示、命令列表、深绿高亮的 wandaugmentation 用法 |
/tm wandaugmentation(缺参数) |
WrongUsageException |
/tm <未知子命令> |
WrongUsageException |
控制台执行 wandaugmentation |
getCommandSenderAsPlayer 抛异常(要求玩家) |
| 非手持法杖 |
CommandException:tm.command.thaumicmachina.error.no_wand_held |
| 改装名不存在 |
CommandException:tm.command.thaumicmachina.error.unknown_augment |
add 已存在的改装 |
CommandException:...error.is_present |
remove 不存在的改装 |
CommandException:...error.is_absent |
源码缺陷
- 别名包含自身:
ALIASES = ["thaumicmachina", "tm"](command/TMCommand.java:26)。getCommandName() 已返回 thaumicmachina,别名表里重复登记一次。1.7.10 的 CommandHandler 会同时注册两者,行为上无害但属冗余。
- Tab 补全不校验权限:
addTabCompletionOptions 直接返回 SUBCOMMANDS / OPERATIONS / 改装 ID 列表(:114+),非 OP 玩家在客户端仍可看到完整候选,属信息泄露(低危)。
reset 的参数校验反直觉:if (args.length != 2) throw —— 即 /tm wandaugmentation reset 恰好 2 个参数时通过,多打一个 token 就报错。逻辑正确但风格与 add/remove 的「恰好 3」不统一。
- 主键与别名等价,但 NBT 只存主键:
WandHelper.registerAugmentation 把主键和别名都放进 augmentationMap(wand/WandHelper.java:26,30),因此 add Charge Buffer 与 add charge_buffer 都能工作(getAugmentations 按 map 反解为同一 INSTANCE)。但 addAugmentationsTo 写入的永远是 augmentation.getID()(:93),即 NBT 里只会出现 snake_case 主键,别名仅作读取兼容。
addAugmentationsTo(stack, ..., false) 不复制栈:直接改写玩家手持法杖,无 markDirty / 同步包。服务端在 tick 结束时通常会同步背包,但在同 tick 内继续执行其他逻辑可能读到半更新状态。
getCommandUsage 返回 i18n key 而非已翻译文本:return "tm.command.thaumicmachina.usage";(:42)。WrongUsageException 会把该字符串直接输出给玩家,因此玩家看到的是原始 key而不是翻译后的用法。getCommandUsage(ICommandSender) 契约要求返回已本地化文本。
相关条目