指令
基本信息
| 属性 | 值 |
|---|---|
| 指令总数 | 5(4 条服务端 + 1 条客户端) |
| 权限基类 | com.github.lunatrius.schematica.command.CommandSchematicaBase |
| 权限等级 | 0(全部玩家可用,command/CommandSchematicaBase.java:9-12) |
| 名称常量 | Names.Command.*.NAME(reference/Names.java:93-155) |
注册点(三处,覆盖全部 5 条):
| 注册位置 | 指令 | 前置条件 |
|---|---|---|
proxy/CommonProxy.java:70-72 |
/schematicaSave、/schematicaList、/schematicaRemove |
ConfigurationHandler.serversideSchematicsEnabled |
proxy/ServerProxy.java:34 |
/schematicaDownload |
同上 |
proxy/ClientProxy.java:357 |
/sblock |
无(客户端命令,走 ClientCommandHandler) |
功能
/schematicaSave
| 项 | 值 |
|---|---|
| 用法 | /schematicaSave <startX> <startY> <startZ> <endX> <endY> <endZ> <name> |
| 用法来源 | Names.Command.Save.Message.USAGE;英文原文见 assets/schematica/lang/en_US.lang:160 |
| 参数数 | 至少 7,少于则抛 WrongUsageException(command/CommandSchematicaSave.java:30-32) |
| 发送者限制 | 必须为 EntityPlayer,否则抛 CommandException(PLAYERS_ONLY)(:34-36) |
| 配额检查 | 先调 Schematica.proxy.isPlayerQuotaExceeded(player),超限直接抛异常(:38-40) |
| 写入位置 | 玩家私有目录 getPlayerSchematicDirectory(player, true)(:58) |
| 文件名 | String.format("%s.schematic", name)(:52)——恒为 .schematic 后缀,不受 useSchematicplusFormat 影响 |
⚠️ 与 CommandSchematicaDownload 不同,/schematicaSave 的文件名不随 useSchematicplusFormat 变化,而下载侧会按该配置拼 .schemplus 或 .schematic(command/CommandSchematicaDownload.java:74-78)。开启 schemplus 格式后保存与下载的后缀不一致。
/schematicaList
| 项 | 值 |
|---|---|
| 用法 | /schematicaList [page](reference/Names.java:169) |
| 参数 | 可选页码,非数字抛 WrongUsageException(command/CommandSchematicaList.java:53-55) |
| 发送者限制 | 必须为 EntityPlayer(:41-43) |
| 分页 | 每页 9 行,硬编码 int pageSize = 9(:57) |
| 列表源 | 玩家私有目录下经 FileFilterSchematic 过滤的文件(:64、:78) |
输出格式为 序号 (可读字节数): 文件名 [Remove][Download],两个方括号是 可点击的聊天链接:Remove 红色、Download 绿色,点击分别执行 /schematicaRemove <name> 与 /schematicaDownload <name>(:89-105)。页尾输出 --- Showing schematics page %d of %d --- 样式的页码头(:122-124)。
字节数经 FileUtils.humanReadableByteCount 转可读格式(:87)。
/schematicaRemove
| 项 | 值 |
|---|---|
| 用法 | /schematicaRemove <name>(reference/Names.java:178) |
| 发送者限制 | 必须为 EntityPlayer,否则抛 PLAYERS_ONLY(command/CommandSchematicaRemove.java:44-46) |
| 文件名 | String.format("%s.schematic", name)(:70)——同样恒为 .schematic,不受 useSchematicplusFormat 影响 |
| 路径穿越防护 | FileUtils.contains(schematicDirectory, file)(:73) |
| 删除结果 | file.delete() 成功发 SCHEMATIC_REMOVED,失败抛 SCHEMATIC_NOT_FOUND(:80-85) |
二次确认机制是 MD5 挑战应答(:48-68):首次调用(参数数 ≤ 1)时不删除,改为计算 md5(name, UTF-8) 的 32 位十六进制串,回复一条带红色可点击 “Yes” 链接的确认消息,链接执行的命令是 /schematicaRemove <name> <md5>(:87-99)。第二次调用若末参数长度为 32 且与重算的 MD5 相等才真正删除(:53-66)。
⚠️ 该机制依赖客户端点击回填命令,服务端不校验删除者是否发起者;且 name 由 Strings.join(arguments, " ") 拼成(:49、:58),蓝图名可含空格。
/schematicaDownload
| 项 | 值 |
|---|---|
| 用法 | /schematicaDownload <name>(reference/Names.java:184) |
| 发送者限制 | 必须为 EntityPlayerMP(command/CommandSchematicaDownload.java:69-71) |
| 路径穿越防护 | FileUtils.contains(directory, filename) 校验,不通过则记 error 日志并抛 DOWNLOAD_FAILED(:81-84) |
| 补全 | 从玩家私有目录列出全部蓝图文件名(:42-61) |
| 传输 | 读入后放入 DownloadHandler.INSTANCE.transferMap,交由分块协议推送(:89) |
文件名后缀按 useSchematicplusFormat 决定:.schemplus 或 .schematic(:74-78)。
/sblock(客户端指令)
| 项 | 值 |
|---|---|
| 用法 | /sblock <primary|target> <block_name> [meta](command/CommandSchematicaSetBlock.java:31) |
| 权限等级 | 0,且 canCommandSenderUseCommand 无条件返回 true(:35-42) |
| 别名 | primary/p → 主方块;target/secondary/t/s → 目标方块(:52-55) |
| meta 缺省 | 0(:61) |
| 补全 | 第一个参数补 primary、target;第二个参数遍历 GameData.getBlockRegistry().getKeys() 补全全量方块名(:104-115) |
作用是把方块写入当前工具模式的 primaryBlock / secondaryBlock(:88-99),供 FILL 与 REPLACE_BLOCK 模式使用,详见 工具模式。
方块名查询失败时会自动补 minecraft: 前缀重试(:75-77),并对 minecraft:air 做二次判定(:73、:78)。
⚠️ /sblock 的聊天回执是硬编码英文 ChatComponentText(:90-99),不走语言文件,与本仓库其余 UI 的本地化方式不一致。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 指令总数 | 5 | 三处注册点合计 |
| 服务端指令数 | 4 | CommonProxy.java:70-72 + ServerProxy.java:34 |
| 客户端指令数 | 1 | ClientProxy.java:357 |
| 权限等级 | 0(全 5 条) | CommandSchematicaBase.java:11、CommandSchematicaSetBlock.java:36 |
| 列表分页大小 | 9 行/页 | CommandSchematicaList.java:57 |
| 客户端最低准入版本 | 1.11.0 |
Schematica.java:35 |
交互
/schematicaList 输出的 Remove / Download 链接是客户端点击即发的 RUN_COMMAND 事件(command/CommandSchematicaList.java:93、:102),因此实际交互路径是「先 list 再点链接」,与直接输入指令等价。
Schematica.java:41-47 的 @NetworkCheckHandler 会拒绝版本号低于 1.11.0 的客户端连服(minimumClientJoinVersion,:35),以保证配置项两侧一致。⚠️ 该判定用完整版本号字符串与 1.11.0 比较(:44),而 mcmod.info 的 version 字段是 ${modVersion} 构建期占位符(src/main/resources/mcmod.info:5),dev 构建(版本号形如 0.0.0)会被误判为过旧。