命令行
基本信息
| 属性 | 值 |
|---|---|
| 类 | 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)契约要求返回已本地化文本。
相关条目
- Charge Buffer - 命令可注入的 5 个改装之一
- Tainted Core - 命令可注入但无功能
- Contact Discharge - 命令可注入但无功能;正常途径被深红研究门控
- 研究树 - 命令绕过本树的全部研究门槛