命令行

基本信息

属性 值
类 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) 契约要求返回已本地化文本。

相关条目